@react-x11/components 0.9.0 → 0.11.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 (579) hide show
  1. package/README.md +10 -4
  2. package/dist/charts/node.d.ts +11 -1
  3. package/dist/charts/node.d.ts.map +1 -1
  4. package/dist/charts/node.js +44 -14
  5. package/dist/charts/node.js.map +1 -1
  6. package/dist/charts/render.d.ts +12 -3
  7. package/dist/charts/render.d.ts.map +1 -1
  8. package/dist/charts/render.js +94 -25
  9. package/dist/charts/render.js.map +1 -1
  10. package/dist/code/index.d.ts.map +1 -1
  11. package/dist/code/index.js +27 -24
  12. package/dist/code/index.js.map +1 -1
  13. package/dist/code-editor/completion.d.ts.map +1 -1
  14. package/dist/code-editor/completion.js +3 -2
  15. package/dist/code-editor/completion.js.map +1 -1
  16. package/dist/code-editor/index.d.ts.map +1 -1
  17. package/dist/code-editor/index.js +19 -0
  18. package/dist/code-editor/index.js.map +1 -1
  19. package/dist/code-editor/node.d.ts +177 -7
  20. package/dist/code-editor/node.d.ts.map +1 -1
  21. package/dist/code-editor/node.js +1329 -164
  22. package/dist/code-editor/node.js.map +1 -1
  23. package/dist/code-language/index.d.ts +1 -1
  24. package/dist/code-language/index.d.ts.map +1 -1
  25. package/dist/code-language/index.js +1 -1
  26. package/dist/code-language/index.js.map +1 -1
  27. package/dist/code-language/languages/glsl.d.ts.map +1 -1
  28. package/dist/code-language/languages/glsl.js +10 -2
  29. package/dist/code-language/languages/glsl.js.map +1 -1
  30. package/dist/code-language/languages/javascript.d.ts.map +1 -1
  31. package/dist/code-language/languages/javascript.js +18 -3
  32. package/dist/code-language/languages/javascript.js.map +1 -1
  33. package/dist/code-language/languages/json.d.ts.map +1 -1
  34. package/dist/code-language/languages/json.js +10 -2
  35. package/dist/code-language/languages/json.js.map +1 -1
  36. package/dist/code-language/languages/shell.d.ts.map +1 -1
  37. package/dist/code-language/languages/shell.js +10 -2
  38. package/dist/code-language/languages/shell.js.map +1 -1
  39. package/dist/code-language/languages/sql.d.ts.map +1 -1
  40. package/dist/code-language/languages/sql.js +20 -2
  41. package/dist/code-language/languages/sql.js.map +1 -1
  42. package/dist/code-language/runs.d.ts +31 -0
  43. package/dist/code-language/runs.d.ts.map +1 -1
  44. package/dist/code-language/runs.js +105 -0
  45. package/dist/code-language/runs.js.map +1 -1
  46. package/dist/code-language/stream.d.ts +22 -0
  47. package/dist/code-language/stream.d.ts.map +1 -1
  48. package/dist/code-language/stream.js +259 -9
  49. package/dist/code-language/stream.js.map +1 -1
  50. package/dist/code-language/types.d.ts +5 -4
  51. package/dist/code-language/types.d.ts.map +1 -1
  52. package/dist/codeblock/index.d.ts +26 -2
  53. package/dist/codeblock/index.d.ts.map +1 -1
  54. package/dist/codeblock/index.js +57 -4
  55. package/dist/codeblock/index.js.map +1 -1
  56. package/dist/flow/draw.d.ts +50 -0
  57. package/dist/flow/draw.d.ts.map +1 -1
  58. package/dist/flow/draw.js +132 -33
  59. package/dist/flow/draw.js.map +1 -1
  60. package/dist/flow/gl/color.d.ts +13 -0
  61. package/dist/flow/gl/color.d.ts.map +1 -0
  62. package/dist/flow/gl/color.js +82 -0
  63. package/dist/flow/gl/color.js.map +1 -0
  64. package/dist/flow/gl/index.d.ts +60 -0
  65. package/dist/flow/gl/index.d.ts.map +1 -0
  66. package/dist/flow/gl/index.js +283 -0
  67. package/dist/flow/gl/index.js.map +1 -0
  68. package/dist/flow/gl/pack.d.ts +133 -0
  69. package/dist/flow/gl/pack.d.ts.map +1 -0
  70. package/dist/flow/gl/pack.js +408 -0
  71. package/dist/flow/gl/pack.js.map +1 -0
  72. package/dist/flow/gl/renderer.d.ts +95 -0
  73. package/dist/flow/gl/renderer.d.ts.map +1 -0
  74. package/dist/flow/gl/renderer.js +459 -0
  75. package/dist/flow/gl/renderer.js.map +1 -0
  76. package/dist/flow/gl/shaders.d.ts +79 -0
  77. package/dist/flow/gl/shaders.d.ts.map +1 -0
  78. package/dist/flow/gl/shaders.js +346 -0
  79. package/dist/flow/gl/shaders.js.map +1 -0
  80. package/dist/flow/gl/text.d.ts +318 -0
  81. package/dist/flow/gl/text.d.ts.map +1 -0
  82. package/dist/flow/gl/text.js +1103 -0
  83. package/dist/flow/gl/text.js.map +1 -0
  84. package/dist/flow/index.d.ts +1 -1
  85. package/dist/flow/index.d.ts.map +1 -1
  86. package/dist/flow/index.js +619 -64
  87. package/dist/flow/index.js.map +1 -1
  88. package/dist/flow/node.d.ts +621 -72
  89. package/dist/flow/node.d.ts.map +1 -1
  90. package/dist/flow/node.js +2253 -1018
  91. package/dist/flow/node.js.map +1 -1
  92. package/dist/flow/paint.d.ts +35 -0
  93. package/dist/flow/paint.d.ts.map +1 -0
  94. package/dist/flow/paint.js +393 -0
  95. package/dist/flow/paint.js.map +1 -0
  96. package/dist/flow/paths.d.ts +14 -0
  97. package/dist/flow/paths.d.ts.map +1 -1
  98. package/dist/flow/paths.js +45 -19
  99. package/dist/flow/paths.js.map +1 -1
  100. package/dist/flow/scene.d.ts +584 -0
  101. package/dist/flow/scene.d.ts.map +1 -0
  102. package/dist/flow/scene.js +1453 -0
  103. package/dist/flow/scene.js.map +1 -0
  104. package/dist/flow/types.d.ts +111 -1
  105. package/dist/flow/types.d.ts.map +1 -1
  106. package/dist/html/controls.d.ts +28 -0
  107. package/dist/html/controls.d.ts.map +1 -1
  108. package/dist/html/controls.js +52 -2
  109. package/dist/html/controls.js.map +1 -1
  110. package/dist/html/css/calc.d.ts +14 -0
  111. package/dist/html/css/calc.d.ts.map +1 -0
  112. package/dist/html/css/calc.js +344 -0
  113. package/dist/html/css/calc.js.map +1 -0
  114. package/dist/html/css/cascade.d.ts +262 -6
  115. package/dist/html/css/cascade.d.ts.map +1 -1
  116. package/dist/html/css/cascade.js +1373 -67
  117. package/dist/html/css/cascade.js.map +1 -1
  118. package/dist/html/css/color.d.ts +23 -0
  119. package/dist/html/css/color.d.ts.map +1 -0
  120. package/dist/html/css/color.js +740 -0
  121. package/dist/html/css/color.js.map +1 -0
  122. package/dist/html/css/content.d.ts +92 -0
  123. package/dist/html/css/content.d.ts.map +1 -0
  124. package/dist/html/css/content.js +388 -0
  125. package/dist/html/css/content.js.map +1 -0
  126. package/dist/html/css/counter-styles.d.ts +76 -0
  127. package/dist/html/css/counter-styles.d.ts.map +1 -0
  128. package/dist/html/css/counter-styles.js +893 -0
  129. package/dist/html/css/counter-styles.js.map +1 -0
  130. package/dist/html/css/decode.d.ts +12 -0
  131. package/dist/html/css/decode.d.ts.map +1 -0
  132. package/dist/html/css/decode.js +116 -0
  133. package/dist/html/css/decode.js.map +1 -0
  134. package/dist/html/css/parse.d.ts +110 -10
  135. package/dist/html/css/parse.d.ts.map +1 -1
  136. package/dist/html/css/parse.js +1473 -180
  137. package/dist/html/css/parse.js.map +1 -1
  138. package/dist/html/css/style.d.ts +501 -15
  139. package/dist/html/css/style.d.ts.map +1 -1
  140. package/dist/html/css/style.js +3729 -206
  141. package/dist/html/css/style.js.map +1 -1
  142. package/dist/html/css/ua.d.ts.map +1 -1
  143. package/dist/html/css/ua.js +65 -16
  144. package/dist/html/css/ua.js.map +1 -1
  145. package/dist/html/css/values.d.ts +37 -3
  146. package/dist/html/css/values.d.ts.map +1 -1
  147. package/dist/html/css/values.js +122 -48
  148. package/dist/html/css/values.js.map +1 -1
  149. package/dist/html/css/vars.d.ts +52 -0
  150. package/dist/html/css/vars.d.ts.map +1 -0
  151. package/dist/html/css/vars.js +358 -0
  152. package/dist/html/css/vars.js.map +1 -0
  153. package/dist/html/dom.d.ts +30 -4
  154. package/dist/html/dom.d.ts.map +1 -1
  155. package/dist/html/dom.js +278 -17
  156. package/dist/html/dom.js.map +1 -1
  157. package/dist/html/fonts.d.ts +106 -0
  158. package/dist/html/fonts.d.ts.map +1 -0
  159. package/dist/html/fonts.js +565 -0
  160. package/dist/html/fonts.js.map +1 -0
  161. package/dist/html/gif.d.ts +15 -0
  162. package/dist/html/gif.d.ts.map +1 -0
  163. package/dist/html/gif.js +229 -0
  164. package/dist/html/gif.js.map +1 -0
  165. package/dist/html/index.d.ts +50 -11
  166. package/dist/html/index.d.ts.map +1 -1
  167. package/dist/html/index.js +115 -9
  168. package/dist/html/index.js.map +1 -1
  169. package/dist/html/layout/block.d.ts +226 -3
  170. package/dist/html/layout/block.d.ts.map +1 -1
  171. package/dist/html/layout/block.js +3077 -219
  172. package/dist/html/layout/block.js.map +1 -1
  173. package/dist/html/layout/boxes.d.ts +367 -17
  174. package/dist/html/layout/boxes.d.ts.map +1 -1
  175. package/dist/html/layout/boxes.js +1742 -182
  176. package/dist/html/layout/boxes.js.map +1 -1
  177. package/dist/html/layout/cache.d.ts +58 -0
  178. package/dist/html/layout/cache.d.ts.map +1 -0
  179. package/dist/html/layout/cache.js +224 -0
  180. package/dist/html/layout/cache.js.map +1 -0
  181. package/dist/html/layout/collapse.d.ts +45 -0
  182. package/dist/html/layout/collapse.d.ts.map +1 -0
  183. package/dist/html/layout/collapse.js +246 -0
  184. package/dist/html/layout/collapse.js.map +1 -0
  185. package/dist/html/layout/css-grid.d.ts +7 -0
  186. package/dist/html/layout/css-grid.d.ts.map +1 -0
  187. package/dist/html/layout/css-grid.js +900 -0
  188. package/dist/html/layout/css-grid.js.map +1 -0
  189. package/dist/html/layout/flex.d.ts.map +1 -1
  190. package/dist/html/layout/flex.js +1025 -89
  191. package/dist/html/layout/flex.js.map +1 -1
  192. package/dist/html/layout/floats.d.ts +45 -6
  193. package/dist/html/layout/floats.d.ts.map +1 -1
  194. package/dist/html/layout/floats.js +113 -14
  195. package/dist/html/layout/floats.js.map +1 -1
  196. package/dist/html/layout/grid-lines.d.ts +39 -0
  197. package/dist/html/layout/grid-lines.d.ts.map +1 -0
  198. package/dist/html/layout/grid-lines.js +119 -0
  199. package/dist/html/layout/grid-lines.js.map +1 -0
  200. package/dist/html/layout/grid.d.ts +53 -0
  201. package/dist/html/layout/grid.d.ts.map +1 -0
  202. package/dist/html/layout/grid.js +153 -0
  203. package/dist/html/layout/grid.js.map +1 -0
  204. package/dist/html/layout/inline.d.ts +154 -1
  205. package/dist/html/layout/inline.d.ts.map +1 -1
  206. package/dist/html/layout/inline.js +3598 -175
  207. package/dist/html/layout/inline.js.map +1 -1
  208. package/dist/html/layout/shaping.d.ts +6 -0
  209. package/dist/html/layout/shaping.d.ts.map +1 -0
  210. package/dist/html/layout/shaping.js +100 -0
  211. package/dist/html/layout/shaping.js.map +1 -0
  212. package/dist/html/layout/table.d.ts +3 -0
  213. package/dist/html/layout/table.d.ts.map +1 -1
  214. package/dist/html/layout/table.js +681 -175
  215. package/dist/html/layout/table.js.map +1 -1
  216. package/dist/html/layout/tracks.d.ts +44 -0
  217. package/dist/html/layout/tracks.d.ts.map +1 -0
  218. package/dist/html/layout/tracks.js +349 -0
  219. package/dist/html/layout/tracks.js.map +1 -0
  220. package/dist/html/node.d.ts +169 -4
  221. package/dist/html/node.d.ts.map +1 -1
  222. package/dist/html/node.js +1429 -137
  223. package/dist/html/node.js.map +1 -1
  224. package/dist/html/paint.d.ts +92 -3
  225. package/dist/html/paint.d.ts.map +1 -1
  226. package/dist/html/paint.js +3635 -107
  227. package/dist/html/paint.js.map +1 -1
  228. package/dist/html/resources.d.ts +60 -14
  229. package/dist/html/resources.d.ts.map +1 -1
  230. package/dist/html/resources.js +122 -36
  231. package/dist/html/resources.js.map +1 -1
  232. package/dist/html/surfaces.d.ts +23 -0
  233. package/dist/html/surfaces.d.ts.map +1 -0
  234. package/dist/html/surfaces.js +68 -0
  235. package/dist/html/surfaces.js.map +1 -0
  236. package/dist/html/svg.d.ts +80 -0
  237. package/dist/html/svg.d.ts.map +1 -0
  238. package/dist/html/svg.js +442 -0
  239. package/dist/html/svg.js.map +1 -0
  240. package/dist/html/url.d.ts +23 -0
  241. package/dist/html/url.d.ts.map +1 -0
  242. package/dist/html/url.js +80 -0
  243. package/dist/html/url.js.map +1 -0
  244. package/dist/index.d.ts +1 -1
  245. package/dist/index.d.ts.map +1 -1
  246. package/dist/index.js.map +1 -1
  247. package/dist/internal/codelines.d.ts +42 -0
  248. package/dist/internal/codelines.d.ts.map +1 -0
  249. package/dist/internal/codelines.js +170 -0
  250. package/dist/internal/codelines.js.map +1 -0
  251. package/dist/internal/collate.d.ts +3 -0
  252. package/dist/internal/collate.d.ts.map +1 -0
  253. package/dist/internal/collate.js +11 -0
  254. package/dist/internal/collate.js.map +1 -0
  255. package/dist/internal/markdown/ast.d.ts +11 -0
  256. package/dist/internal/markdown/ast.d.ts.map +1 -1
  257. package/dist/internal/markdown/parse.d.ts.map +1 -1
  258. package/dist/internal/markdown/parse.js +109 -8
  259. package/dist/internal/markdown/parse.js.map +1 -1
  260. package/dist/internal/prewarm.d.ts +18 -0
  261. package/dist/internal/prewarm.d.ts.map +1 -0
  262. package/dist/internal/prewarm.js +42 -0
  263. package/dist/internal/prewarm.js.map +1 -0
  264. package/dist/internal/sdf.d.ts +20 -0
  265. package/dist/internal/sdf.d.ts.map +1 -0
  266. package/dist/internal/sdf.js +216 -0
  267. package/dist/internal/sdf.js.map +1 -0
  268. package/dist/internal/splice.d.ts +12 -0
  269. package/dist/internal/splice.d.ts.map +1 -0
  270. package/dist/internal/splice.js +23 -0
  271. package/dist/internal/splice.js.map +1 -0
  272. package/dist/internal/window.d.ts +12 -0
  273. package/dist/internal/window.d.ts.map +1 -1
  274. package/dist/internal/window.js +23 -6
  275. package/dist/internal/window.js.map +1 -1
  276. package/dist/maps/anchors.d.ts +6 -1
  277. package/dist/maps/anchors.d.ts.map +1 -1
  278. package/dist/maps/anchors.js +260 -1
  279. package/dist/maps/anchors.js.map +1 -1
  280. package/dist/maps/controller.d.ts +57 -0
  281. package/dist/maps/controller.d.ts.map +1 -1
  282. package/dist/maps/controller.js +97 -18
  283. package/dist/maps/controller.js.map +1 -1
  284. package/dist/maps/gl/buckets.d.ts +5 -1
  285. package/dist/maps/gl/buckets.d.ts.map +1 -1
  286. package/dist/maps/gl/buckets.js +5 -2
  287. package/dist/maps/gl/buckets.js.map +1 -1
  288. package/dist/maps/gl/build-worker.d.ts +2 -0
  289. package/dist/maps/gl/build-worker.d.ts.map +1 -1
  290. package/dist/maps/gl/build-worker.js +1 -1
  291. package/dist/maps/gl/build-worker.js.map +1 -1
  292. package/dist/maps/gl/cover.d.ts +23 -4
  293. package/dist/maps/gl/cover.d.ts.map +1 -1
  294. package/dist/maps/gl/cover.js +61 -48
  295. package/dist/maps/gl/cover.js.map +1 -1
  296. package/dist/maps/gl/placement.d.ts +21 -8
  297. package/dist/maps/gl/placement.d.ts.map +1 -1
  298. package/dist/maps/gl/placement.js +133 -58
  299. package/dist/maps/gl/placement.js.map +1 -1
  300. package/dist/maps/gl/renderer.d.ts +36 -4
  301. package/dist/maps/gl/renderer.d.ts.map +1 -1
  302. package/dist/maps/gl/renderer.js +81 -24
  303. package/dist/maps/gl/renderer.js.map +1 -1
  304. package/dist/maps/gl/shaders.d.ts +18 -17
  305. package/dist/maps/gl/shaders.d.ts.map +1 -1
  306. package/dist/maps/gl/shaders.js +34 -32
  307. package/dist/maps/gl/shaders.js.map +1 -1
  308. package/dist/maps/gl/store.d.ts +10 -0
  309. package/dist/maps/gl/store.d.ts.map +1 -1
  310. package/dist/maps/gl/store.js +47 -4
  311. package/dist/maps/gl/store.js.map +1 -1
  312. package/dist/maps/gl/text.d.ts +153 -24
  313. package/dist/maps/gl/text.d.ts.map +1 -1
  314. package/dist/maps/gl/text.js +379 -63
  315. package/dist/maps/gl/text.js.map +1 -1
  316. package/dist/maps/gl/view.d.ts +293 -2
  317. package/dist/maps/gl/view.d.ts.map +1 -1
  318. package/dist/maps/gl/view.js +317 -82
  319. package/dist/maps/gl/view.js.map +1 -1
  320. package/dist/maps/icons.d.ts +32 -0
  321. package/dist/maps/icons.d.ts.map +1 -0
  322. package/dist/maps/icons.js +151 -0
  323. package/dist/maps/icons.js.map +1 -0
  324. package/dist/maps/index.d.ts +2 -0
  325. package/dist/maps/index.d.ts.map +1 -1
  326. package/dist/maps/index.js +2 -0
  327. package/dist/maps/index.js.map +1 -1
  328. package/dist/maps/labels.d.ts +56 -4
  329. package/dist/maps/labels.d.ts.map +1 -1
  330. package/dist/maps/labels.js +213 -46
  331. package/dist/maps/labels.js.map +1 -1
  332. package/dist/maps/node.d.ts +17 -0
  333. package/dist/maps/node.d.ts.map +1 -1
  334. package/dist/maps/node.js +64 -30
  335. package/dist/maps/node.js.map +1 -1
  336. package/dist/maps/proj.d.ts +48 -0
  337. package/dist/maps/proj.d.ts.map +1 -1
  338. package/dist/maps/proj.js +73 -0
  339. package/dist/maps/proj.js.map +1 -1
  340. package/dist/maps/sources.d.ts +5 -3
  341. package/dist/maps/sources.d.ts.map +1 -1
  342. package/dist/maps/sources.js +5 -3
  343. package/dist/maps/sources.js.map +1 -1
  344. package/dist/maps/style.d.ts +35 -0
  345. package/dist/maps/style.d.ts.map +1 -1
  346. package/dist/maps/style.js.map +1 -1
  347. package/dist/maps/styles.d.ts +12 -0
  348. package/dist/maps/styles.d.ts.map +1 -1
  349. package/dist/maps/styles.js +120 -6
  350. package/dist/maps/styles.js.map +1 -1
  351. package/dist/maps/tiles.d.ts +31 -11
  352. package/dist/maps/tiles.d.ts.map +1 -1
  353. package/dist/maps/tiles.js +61 -27
  354. package/dist/maps/tiles.js.map +1 -1
  355. package/dist/maps/types.d.ts +28 -4
  356. package/dist/maps/types.d.ts.map +1 -1
  357. package/dist/markdown/index.d.ts.map +1 -1
  358. package/dist/markdown/index.js +209 -68
  359. package/dist/markdown/index.js.map +1 -1
  360. package/dist/markdown/spans.d.ts.map +1 -1
  361. package/dist/markdown/spans.js +6 -0
  362. package/dist/markdown/spans.js.map +1 -1
  363. package/dist/qml/containers.d.ts.map +1 -1
  364. package/dist/qml/containers.js +6 -1
  365. package/dist/qml/containers.js.map +1 -1
  366. package/dist/qml/interaction.d.ts.map +1 -1
  367. package/dist/qml/interaction.js +38 -5
  368. package/dist/qml/interaction.js.map +1 -1
  369. package/dist/qml/layouts.d.ts.map +1 -1
  370. package/dist/qml/layouts.js +21 -6
  371. package/dist/qml/layouts.js.map +1 -1
  372. package/dist/qml/qtquick.d.ts.map +1 -1
  373. package/dist/qml/qtquick.js +9 -2
  374. package/dist/qml/qtquick.js.map +1 -1
  375. package/dist/qml/react.d.ts.map +1 -1
  376. package/dist/qml/react.js +9 -7
  377. package/dist/qml/react.js.map +1 -1
  378. package/dist/reorder/clock.d.ts +7 -0
  379. package/dist/reorder/clock.d.ts.map +1 -0
  380. package/dist/reorder/clock.js +26 -0
  381. package/dist/reorder/clock.js.map +1 -0
  382. package/dist/reorder/index.d.ts +25 -3
  383. package/dist/reorder/index.d.ts.map +1 -1
  384. package/dist/reorder/index.js +64 -19
  385. package/dist/reorder/index.js.map +1 -1
  386. package/dist/rich-text-editor/index.d.ts +0 -11
  387. package/dist/rich-text-editor/index.d.ts.map +1 -1
  388. package/dist/rich-text-editor/index.js +38 -9
  389. package/dist/rich-text-editor/index.js.map +1 -1
  390. package/dist/rich-text-editor/keymap.d.ts.map +1 -1
  391. package/dist/rich-text-editor/keymap.js +2 -1
  392. package/dist/rich-text-editor/keymap.js.map +1 -1
  393. package/dist/rich-text-editor/keys.d.ts +17 -6
  394. package/dist/rich-text-editor/keys.d.ts.map +1 -1
  395. package/dist/rich-text-editor/keys.js +135 -26
  396. package/dist/rich-text-editor/keys.js.map +1 -1
  397. package/dist/rich-text-editor/markdown.d.ts.map +1 -1
  398. package/dist/rich-text-editor/markdown.js +30 -1
  399. package/dist/rich-text-editor/markdown.js.map +1 -1
  400. package/dist/rich-text-editor/marks.d.ts +9 -0
  401. package/dist/rich-text-editor/marks.d.ts.map +1 -0
  402. package/dist/rich-text-editor/marks.js +83 -0
  403. package/dist/rich-text-editor/marks.js.map +1 -0
  404. package/dist/rich-text-editor/render.d.ts.map +1 -1
  405. package/dist/rich-text-editor/render.js +28 -10
  406. package/dist/rich-text-editor/render.js.map +1 -1
  407. package/dist/rich-text-editor/replace.d.ts +13 -0
  408. package/dist/rich-text-editor/replace.d.ts.map +1 -0
  409. package/dist/rich-text-editor/replace.js +64 -0
  410. package/dist/rich-text-editor/replace.js.map +1 -0
  411. package/dist/rich-text-editor/toolbar.d.ts.map +1 -1
  412. package/dist/rich-text-editor/toolbar.js +1 -1
  413. package/dist/rich-text-editor/toolbar.js.map +1 -1
  414. package/dist/rich-text-editor/virtual.d.ts.map +1 -1
  415. package/dist/rich-text-editor/virtual.js +17 -0
  416. package/dist/rich-text-editor/virtual.js.map +1 -1
  417. package/dist/richtext/node.d.ts +46 -2
  418. package/dist/richtext/node.d.ts.map +1 -1
  419. package/dist/richtext/node.js +187 -4
  420. package/dist/richtext/node.js.map +1 -1
  421. package/dist/richtext/runs.d.ts +13 -8
  422. package/dist/richtext/runs.d.ts.map +1 -1
  423. package/dist/richtext/runs.js +18 -8
  424. package/dist/richtext/runs.js.map +1 -1
  425. package/dist/table/index.d.ts.map +1 -1
  426. package/dist/table/index.js +23 -0
  427. package/dist/table/index.js.map +1 -1
  428. package/dist/table/rows.d.ts +3 -2
  429. package/dist/table/rows.d.ts.map +1 -1
  430. package/dist/table/rows.js +20 -6
  431. package/dist/table/rows.js.map +1 -1
  432. package/dist/terminal/index.d.ts.map +1 -1
  433. package/dist/terminal/index.js +4 -0
  434. package/dist/terminal/index.js.map +1 -1
  435. package/dist/terminal/vt/pty.d.ts +13 -2
  436. package/dist/terminal/vt/pty.d.ts.map +1 -1
  437. package/dist/terminal/vt/pty.js +18 -3
  438. package/dist/terminal/vt/pty.js.map +1 -1
  439. package/dist/terminal-output/index.d.ts.map +1 -1
  440. package/dist/terminal-output/index.js +103 -23
  441. package/dist/terminal-output/index.js.map +1 -1
  442. package/dist/terminal-output/runs.d.ts +4 -1
  443. package/dist/terminal-output/runs.d.ts.map +1 -1
  444. package/dist/terminal-output/runs.js +5 -1
  445. package/dist/terminal-output/runs.js.map +1 -1
  446. package/dist/three/canvas.d.ts.map +1 -1
  447. package/dist/three/canvas.js +85 -7
  448. package/dist/three/canvas.js.map +1 -1
  449. package/dist/three/events.d.ts +22 -4
  450. package/dist/three/events.d.ts.map +1 -1
  451. package/dist/three/events.js +34 -4
  452. package/dist/three/events.js.map +1 -1
  453. package/dist/tree/index.d.ts.map +1 -1
  454. package/dist/tree/index.js +17 -0
  455. package/dist/tree/index.js.map +1 -1
  456. package/package.json +42 -33
  457. package/src/charts/node.ts +62 -26
  458. package/src/charts/render.ts +120 -30
  459. package/src/code/index.ts +36 -32
  460. package/src/code-editor/completion.ts +3 -2
  461. package/src/code-editor/index.ts +19 -0
  462. package/src/code-editor/node.ts +1574 -184
  463. package/src/code-language/index.ts +1 -1
  464. package/src/code-language/languages/glsl.ts +12 -2
  465. package/src/code-language/languages/javascript.ts +21 -4
  466. package/src/code-language/languages/json.ts +12 -2
  467. package/src/code-language/languages/shell.ts +12 -2
  468. package/src/code-language/languages/sql.ts +22 -2
  469. package/src/code-language/runs.ts +111 -1
  470. package/src/code-language/stream.ts +257 -17
  471. package/src/code-language/types.ts +5 -4
  472. package/src/codeblock/index.ts +68 -4
  473. package/src/flow/draw.ts +167 -41
  474. package/src/flow/gl/color.ts +85 -0
  475. package/src/flow/gl/index.ts +342 -0
  476. package/src/flow/gl/pack.ts +585 -0
  477. package/src/flow/gl/renderer.ts +679 -0
  478. package/src/flow/gl/shaders.ts +371 -0
  479. package/src/flow/gl/text.ts +1295 -0
  480. package/src/flow/index.ts +794 -67
  481. package/src/flow/node.ts +2496 -1256
  482. package/src/flow/paint.ts +511 -0
  483. package/src/flow/paths.ts +80 -15
  484. package/src/flow/scene.ts +2199 -0
  485. package/src/flow/types.ts +113 -1
  486. package/src/html/controls.ts +73 -2
  487. package/src/html/css/calc.ts +385 -0
  488. package/src/html/css/cascade.ts +1481 -62
  489. package/src/html/css/color.ts +755 -0
  490. package/src/html/css/content.ts +417 -0
  491. package/src/html/css/counter-styles.ts +973 -0
  492. package/src/html/css/decode.ts +130 -0
  493. package/src/html/css/parse.ts +1514 -160
  494. package/src/html/css/style.ts +4131 -223
  495. package/src/html/css/ua.ts +66 -17
  496. package/src/html/css/values.ts +150 -50
  497. package/src/html/css/vars.ts +348 -0
  498. package/src/html/dom.ts +284 -17
  499. package/src/html/fonts.ts +641 -0
  500. package/src/html/gif.ts +233 -0
  501. package/src/html/index.ts +180 -20
  502. package/src/html/layout/block.ts +3560 -208
  503. package/src/html/layout/boxes.ts +2141 -190
  504. package/src/html/layout/cache.ts +289 -0
  505. package/src/html/layout/collapse.ts +317 -0
  506. package/src/html/layout/css-grid.ts +1063 -0
  507. package/src/html/layout/flex.ts +1115 -106
  508. package/src/html/layout/floats.ts +128 -14
  509. package/src/html/layout/grid-lines.ts +141 -0
  510. package/src/html/layout/grid.ts +181 -0
  511. package/src/html/layout/inline.ts +4187 -192
  512. package/src/html/layout/shaping.ts +140 -0
  513. package/src/html/layout/table.ts +696 -186
  514. package/src/html/layout/tracks.ts +437 -0
  515. package/src/html/node.ts +1585 -156
  516. package/src/html/paint.ts +4582 -267
  517. package/src/html/resources.ts +161 -50
  518. package/src/html/surfaces.ts +81 -0
  519. package/src/html/svg.ts +504 -0
  520. package/src/html/url.ts +86 -0
  521. package/src/index.ts +2 -0
  522. package/src/internal/codelines.ts +200 -0
  523. package/src/internal/collate.ts +12 -0
  524. package/src/internal/markdown/ast.ts +11 -0
  525. package/src/internal/markdown/parse.ts +154 -11
  526. package/src/internal/prewarm.ts +45 -0
  527. package/src/internal/sdf.ts +227 -0
  528. package/src/internal/splice.ts +25 -0
  529. package/src/internal/window.ts +36 -5
  530. package/src/maps/anchors.ts +307 -1
  531. package/src/maps/controller.ts +116 -31
  532. package/src/maps/gl/buckets.ts +5 -1
  533. package/src/maps/gl/build-worker.ts +13 -2
  534. package/src/maps/gl/cover.ts +79 -44
  535. package/src/maps/gl/placement.ts +221 -69
  536. package/src/maps/gl/renderer.ts +104 -20
  537. package/src/maps/gl/shaders.ts +35 -32
  538. package/src/maps/gl/store.ts +66 -17
  539. package/src/maps/gl/text.ts +444 -71
  540. package/src/maps/gl/view.ts +361 -96
  541. package/src/maps/icons.ts +183 -0
  542. package/src/maps/index.ts +4 -0
  543. package/src/maps/labels.ts +269 -49
  544. package/src/maps/node.ts +82 -49
  545. package/src/maps/proj.ts +87 -0
  546. package/src/maps/sources.ts +5 -3
  547. package/src/maps/style.ts +32 -0
  548. package/src/maps/styles.ts +215 -4
  549. package/src/maps/tiles.ts +64 -31
  550. package/src/maps/types.ts +28 -4
  551. package/src/markdown/index.ts +293 -92
  552. package/src/markdown/spans.ts +5 -0
  553. package/src/qml/containers.tsx +6 -1
  554. package/src/qml/interaction.tsx +42 -5
  555. package/src/qml/layouts.tsx +21 -6
  556. package/src/qml/qtquick.tsx +9 -2
  557. package/src/qml/react.tsx +7 -5
  558. package/src/reorder/clock.ts +27 -0
  559. package/src/reorder/index.ts +100 -27
  560. package/src/rich-text-editor/index.ts +37 -12
  561. package/src/rich-text-editor/keymap.ts +1 -1
  562. package/src/rich-text-editor/keys.ts +135 -26
  563. package/src/rich-text-editor/markdown.ts +36 -1
  564. package/src/rich-text-editor/marks.ts +101 -0
  565. package/src/rich-text-editor/render.ts +49 -12
  566. package/src/rich-text-editor/replace.ts +85 -0
  567. package/src/rich-text-editor/toolbar.ts +1 -1
  568. package/src/rich-text-editor/virtual.ts +25 -0
  569. package/src/richtext/node.ts +235 -14
  570. package/src/richtext/runs.ts +23 -12
  571. package/src/table/index.ts +29 -0
  572. package/src/table/rows.ts +18 -8
  573. package/src/terminal/index.ts +4 -0
  574. package/src/terminal/vt/pty.ts +16 -2
  575. package/src/terminal-output/index.ts +129 -31
  576. package/src/terminal-output/runs.ts +16 -2
  577. package/src/three/canvas.ts +102 -8
  578. package/src/three/events.ts +49 -9
  579. package/src/tree/index.ts +19 -0
@@ -23,14 +23,32 @@
23
23
  // the leaf shape costs is stretch — a stretched item's box grows but its
24
24
  // contents are not re-laid at the stretched height.
25
25
  import { Yoga, layoutLoaded } from 'react-x11/yoga';
26
- import { AUTO, isPct, resolveOrNull } from '../css/values.js';
27
- import { Box } from './boxes.js';
28
- import { moveTo, resolveEdges } from './block.js';
26
+ import { AUTO, gapOf, isPct, resolve, resolveOrNull } from '../css/values.js';
27
+ import { scrolls } from '../css/style.js';
28
+ import { Box, PAINT_ORDER, isBlank } from './boxes.js';
29
+ import { FLEXED_HEIGHT, MIN_CONTENT_PROBE, clampHeight, clampWidth, contentSizedWidth, exactMinContent, intrinsicWidth, measureIntrinsicWidth, moveTo, percentBaseInside, percentHeightsIn, positionOutOfFlow, replacedRatio, transferredHeight, transferredWidth, heightFromWidth, widthFromHeight, resolveEdges, } from './block.js';
30
+ import { layoutGrid } from './css-grid.js';
31
+ import { firstBaselineIn } from './inline.js';
29
32
  // `react-x11/yoga` re-exports yoga's own declarations, so the node shape and
30
33
  // the enum constants are typed rather than written out here and cast at every
31
34
  // call, which is what this had to do while the engine was reached through
32
35
  // `react-x11/ntk` (a deliberately loose record).
33
36
  const Y = Yoga;
37
+ /**
38
+ * The config this engine's flex trees are made in: off the pixel grid, as
39
+ * the rest of its layout is, since its paint snaps each box's edges. On
40
+ * the grid, Yoga rounds a measured item's size up and the next item's
41
+ * start to the nearest, and two items that met at a fraction overlapped
42
+ * by a pixel. Its own, not core's, whose grid its own layout keeps.
43
+ */
44
+ let config = null;
45
+ function flexConfig() {
46
+ if (config === null) {
47
+ config = Y.Config.create();
48
+ config.setPointScaleFactor(0);
49
+ }
50
+ return config;
51
+ }
34
52
  /**
35
53
  * Lay out a flex container's children. Returns the content height.
36
54
  *
@@ -44,163 +62,1054 @@ const Y = Yoga;
44
62
  * raised the very error it was written to avoid.
45
63
  */
46
64
  export function layoutFlex(box, ctx, contentWidth) {
65
+ // a grid container is one of these to the box tree, and laid out apart
66
+ if (box.style.grid)
67
+ return layoutGrid(box, ctx, contentWidth);
47
68
  if (!layoutLoaded())
48
69
  return layoutAsBlockFallback(box, ctx, contentWidth);
49
- const root = Y.Node.create();
70
+ // Each flex box in a flex item runs its Yoga pass inside the measure of
71
+ // the one around it, and Yoga's own stack runs out at about a hundred and
72
+ // fifty of them — a `RuntimeError` out of the layout. Past this many, one
73
+ // is laid out as blocks: the markup of a broken page, not of a design.
74
+ const depth = ctx.flexDepth ?? 0;
75
+ if (depth >= FLEX_DEPTH)
76
+ return layoutAsBlockFallback(box, ctx, contentWidth);
77
+ const root = Y.Node.create(flexConfig());
50
78
  applyContainer(root, box.style);
51
- root.setWidth(contentWidth);
52
- const height = resolveOrNull(box.style.height, NaN);
79
+ // the gaps, a percentage of the content box's size along them where it
80
+ // has one, and else of nothing (CSS Box Alignment 3, 8.3)
81
+ const rowGap = gapOf(box.style.rowGap, percentBaseInside(box));
82
+ const columnGap = gapOf(box.style.columnGap, contentWidth);
83
+ if (rowGap)
84
+ root.setGap(Y.GUTTER_ROW, rowGap);
85
+ if (columnGap)
86
+ root.setGap(Y.GUTTER_COLUMN, columnGap);
87
+ // Laid out at no width limit — a flex item's max-content measured, a
88
+ // table column's — the container is as wide as its content, which Yoga
89
+ // works out from an `auto` width. Handed an infinite one, it took it for
90
+ // a width, grew a `flex: 1` item to fill it, placed its text at 1.7e38,
91
+ // and the measure that asked came back vast: a row beside such an item
92
+ // was squeezed to wrap every word.
93
+ const bounded = Number.isFinite(contentWidth);
94
+ if (bounded)
95
+ root.setWidth(contentWidth);
96
+ // The content box's height, where it is definite: a length or a
97
+ // percentage that resolves, or what `aspect-ratio` makes of the width —
98
+ // less the padding and borders a `border-box` height holds, which put
99
+ // `h-16 py-2 items-center` eight pixels low. Where it is not, the limits
100
+ // on it, so a column `min-h-screen` gives its `flex-1` the rest.
101
+ const definite = percentBaseInside(box);
102
+ const height = Number.isFinite(definite) ? definite : null;
53
103
  if (height !== null)
54
104
  root.setHeight(height);
55
- else
105
+ else {
56
106
  root.setHeightAuto();
57
- const items = [];
107
+ const extra = box.verticalExtra;
108
+ const min = clampHeight(box, extra) - extra;
109
+ if (min > 0)
110
+ root.setMinHeight(min);
111
+ const max = clampHeight(box, Infinity) - extra;
112
+ if (Number.isFinite(max))
113
+ root.setMaxHeight(Math.max(0, max));
114
+ }
115
+ const flowing = [];
116
+ let reordered = false;
58
117
  for (const child of box.children) {
59
- if (child.kind === 'text' && !child.text.trim())
118
+ if (child.kind === 'text' && isBlank(child.text))
60
119
  continue;
61
120
  if (child.outOfFlow) {
62
- ctx.positioned.push({ box: child, containing: box });
121
+ positionOutOfFlow(child, box, ctx, true);
63
122
  continue;
64
123
  }
65
- const node = Y.Node.create();
124
+ if (child.style.order !== 0)
125
+ reordered = true;
126
+ flowing.push(child);
127
+ }
128
+ // in `order`, and where two have the same, in the document's (CSS
129
+ // Flexbox 5.4): Yoga places its children in the order they were given,
130
+ // and paint paints them in it
131
+ if (reordered) {
132
+ flowing.sort((a, b) => a.style.order - b.style.order);
133
+ PAINT_ORDER.set(box, [...box.children].sort((a, b) => orderOf(a) - orderOf(b)));
134
+ }
135
+ else
136
+ PAINT_ORDER.delete(box);
137
+ const items = [];
138
+ for (const child of flowing) {
139
+ const node = Y.Node.create(flexConfig());
66
140
  resolveEdges(child, contentWidth);
67
- applyItem(node, child, ctx, contentWidth);
141
+ const laid = { width: NaN, height: NaN, set: NaN, stretch: NaN };
142
+ applyItem(node, child, ctx, contentWidth, laid, height !== null);
68
143
  root.insertChild(node, items.length);
69
- items.push({ box: child, node });
144
+ items.push({ box: child, node, laid });
145
+ }
146
+ const direction = box.style.direction === 'rtl' ? Y.DIRECTION_RTL : Y.DIRECTION_LTR;
147
+ const row = box.style.flexDirection.startsWith('row');
148
+ const calculate = () => root.calculateLayout(bounded ? contentWidth : Number.NaN, height ?? Number.NaN, direction);
149
+ ctx.flexDepth = depth + 1;
150
+ try {
151
+ calculate();
152
+ // an item Yoga shrank under what its content comes to is kept to it,
153
+ // and the row is laid out again (`autoMinimums`) — which may shrink
154
+ // another under its own, a few times over at most
155
+ for (let pass = 0; pass < 4 && autoMinimums(items, row, ctx, contentWidth); pass += 1) {
156
+ calculate();
157
+ }
158
+ }
159
+ finally {
160
+ ctx.flexDepth = depth;
161
+ }
162
+ // Yoga aligns the lines of a box that wraps, or aligns by baselines, in
163
+ // one pass of its own, which drops a margin (`lineMarginFix`)
164
+ const baselines = box.style.alignItems === 'baseline' ||
165
+ items.some(({ box: child }) => child.style.alignSelf === 'baseline');
166
+ let bottom = placeItems(box, ctx, items, row, height, box.style.flexWrap === 'wrap' || baselines);
167
+ // Items aligned by their baselines, which Yoga cannot see, are aligned
168
+ // with their baselines known (`baselineLines`)
169
+ // by the flex layout again, set at their lines' starts with the margins
170
+ // that put their baselines together, which makes each line as tall as
171
+ // that does
172
+ const lines = row && baselines ? baselineLines(box.style, items) : null;
173
+ if (lines) {
174
+ // every one of them, and the box's own `baseline` too, which is what
175
+ // takes Yoga down that pass
176
+ const started = new Set();
177
+ for (const line of lines) {
178
+ line.forEach(({ box: child, node }, i) => {
179
+ node.setAlignSelf(Y.ALIGN_FLEX_START);
180
+ node.setMargin(Y.EDGE_TOP, line.margins[i]);
181
+ started.add(child);
182
+ });
183
+ }
184
+ if (box.style.alignItems === 'baseline') {
185
+ root.setAlignItems(Y.ALIGN_FLEX_START);
186
+ }
187
+ ctx.flexDepth = depth + 1;
188
+ try {
189
+ calculate();
190
+ }
191
+ finally {
192
+ ctx.flexDepth = depth;
193
+ }
194
+ bottom = placeItems(box, ctx, items, row, height, box.style.flexWrap === 'wrap', started);
70
195
  }
71
- root.calculateLayout(contentWidth, height ?? Number.NaN, box.style.direction === 'rtl' ? Y.DIRECTION_RTL : Y.DIRECTION_LTR);
196
+ // A replaced item with a ratio that is stretched across a line of a
197
+ // definite size takes its flex base size from the stretched one through
198
+ // the ratio (CSS Flexbox 9.2 and 9.8), where Yoga took its natural size —
199
+ // which Yoga's own `aspectRatio` would do for its border box, where a
200
+ // replaced element's ratio is its content box's. Laid out again with it.
201
+ // where the line's cross size is definite: one line, in a box of that
202
+ // size of its own (9.8)
203
+ const definiteCross = box.style.flexWrap === 'nowrap' && (row ? height !== null : bounded);
204
+ if (definiteCross && keepRatios(box, items, row)) {
205
+ ctx.flexDepth = depth + 1;
206
+ try {
207
+ calculate();
208
+ }
209
+ finally {
210
+ ctx.flexDepth = depth;
211
+ }
212
+ bottom = placeItems(box, ctx, items, row, height, box.style.flexWrap === 'wrap' || baselines);
213
+ }
214
+ const contentHeight = root.getComputedHeight();
215
+ root.freeRecursive();
216
+ return Math.max(contentHeight, bottom - box.contentY);
217
+ }
218
+ /** Give each replaced item with a ratio that its line stretched the flex
219
+ * base size the ratio makes of the stretched size; whether any changed. */
220
+ function keepRatios(container, items, row) {
221
+ let changed = false;
222
+ for (const { box, node } of items) {
223
+ if (box.kind !== 'replaced' || !stretches(box, container.style, row)) {
224
+ continue;
225
+ }
226
+ const style = box.style;
227
+ if ((row ? style.width : style.height) !== AUTO)
228
+ continue;
229
+ const ratio = replacedRatio(box);
230
+ if (!(ratio > 0))
231
+ continue;
232
+ const basis = row
233
+ ? Math.max(0, node.getComputedHeight() - box.verticalExtra) * ratio +
234
+ box.horizontalExtra
235
+ : Math.max(0, node.getComputedWidth() - box.horizontalExtra) / ratio +
236
+ box.verticalExtra;
237
+ const main = row ? node.getComputedWidth() : node.getComputedHeight();
238
+ if (Math.abs(basis - main) < 0.5)
239
+ continue;
240
+ node.setFlexBasis(basis);
241
+ changed = true;
242
+ }
243
+ return changed;
244
+ }
245
+ /**
246
+ * A replaced row item's automatic least width, its border box (CSS
247
+ * Flexbox 4.5): its natural width, or through its ratio what a height of
248
+ * its own makes of it, and no more than a width of its own, within its
249
+ * `max-width`. Null where it has neither a natural width nor a ratio to
250
+ * take one through.
251
+ */
252
+ function replacedMinimum(box, containingWidth) {
253
+ const style = box.style;
254
+ const own = box.intrinsic;
255
+ const ratio = replacedRatio(box);
256
+ const hx = style.boxSizing === 'border-box' ? box.horizontalExtra : 0;
257
+ const vx = style.boxSizing === 'border-box' ? box.verticalExtra : 0;
258
+ const base = box.percentHeightBase;
259
+ const height = resolveOrNull(style.height, base);
260
+ let content = height !== null && ratio > 0
261
+ ? Math.max(0, height - vx) * ratio
262
+ : own && !(own.missing & 1)
263
+ ? own.width
264
+ : null;
265
+ if (content === null)
266
+ return null;
267
+ // and through its ratio, within its least and greatest heights
268
+ if (ratio > 0) {
269
+ const least = style.minHeight === AUTO ? null : resolveOrNull(style.minHeight, base);
270
+ if (least !== null)
271
+ content = Math.max(content, Math.max(0, least - vx) * ratio);
272
+ const most = style.maxHeight === 'none' ? null : resolveOrNull(style.maxHeight, base);
273
+ if (most !== null)
274
+ content = Math.min(content, Math.max(0, most - vx) * ratio);
275
+ }
276
+ const width = resolveOrNull(style.width, containingWidth);
277
+ if (width !== null)
278
+ content = Math.min(content, Math.max(0, width - hx));
279
+ if (style.maxWidth !== 'none') {
280
+ const most = resolveOrNull(style.maxWidth, containingWidth);
281
+ if (most !== null)
282
+ content = Math.min(content, Math.max(0, most - hx));
283
+ }
284
+ return content + box.horizontalExtra;
285
+ }
286
+ /** A row item's `flex-basis: content`, its border box: its max-content
287
+ * width, or a replaced element's natural one. */
288
+ function contentBasis(box, ctx, containingWidth) {
289
+ if (box.kind === 'replaced') {
290
+ const own = box.intrinsic;
291
+ if (own && !(own.missing & 1))
292
+ return own.width + box.horizontalExtra;
293
+ }
294
+ // a ratio's is a definite height through it, whatever the width says
295
+ const fromRatio = ratioBasis(box);
296
+ if (fromRatio !== null)
297
+ return fromRatio;
298
+ const room = Math.max(0, containingWidth - box.marginLeft - box.marginRight);
299
+ return contentSizedWidth(box, ctx, 'max-content', room, containingWidth);
300
+ }
301
+ /**
302
+ * The border-box width a row item's ratio makes of a definite height: its
303
+ * own, a length or a percentage of a flex box of a definite height, or the
304
+ * one line of such a flex box that stretches it across (CSS Flexbox 9.2,
305
+ * 9.4). Null where it has no ratio or no such height.
306
+ */
307
+ function ratioBasis(box) {
308
+ const style = box.style;
309
+ const aspect = style.aspectRatio;
310
+ const flex = box.parent;
311
+ if (!aspect || box.kind === 'replaced' || !flex)
312
+ return null;
313
+ const room = percentBaseInside(flex);
314
+ let height = resolveOrNull(style.height, room);
315
+ let outer;
316
+ if (height !== null) {
317
+ outer =
318
+ style.boxSizing === 'border-box'
319
+ ? Math.max(height, box.verticalExtra)
320
+ : height + box.verticalExtra;
321
+ }
322
+ else {
323
+ const align = style.alignSelf === AUTO ? flex.style.alignItems : style.alignSelf;
324
+ if (align !== 'stretch' ||
325
+ flex.style.flexWrap !== 'nowrap' ||
326
+ !Number.isFinite(room) ||
327
+ style.marginTop === AUTO ||
328
+ style.marginBottom === AUTO) {
329
+ return null;
330
+ }
331
+ height = room - box.marginTop - box.marginBottom;
332
+ outer = Math.max(height, box.verticalExtra);
333
+ }
334
+ return widthFromHeight(box, clampHeight(box, outer));
335
+ }
336
+ /** A column item's flex base size where it has a ratio and a width of
337
+ * its own, its border box: the width, within its limits, through the
338
+ * ratio. */
339
+ function ratioHeightBasis(box, containingWidth) {
340
+ const style = box.style;
341
+ if (style.width === AUTO || style.widthKeyword || box.kind === 'replaced') {
342
+ return null;
343
+ }
344
+ const set = resolveOrNull(style.width, containingWidth);
345
+ if (set === null)
346
+ return null;
347
+ const outer = style.boxSizing === 'border-box'
348
+ ? Math.max(set, box.horizontalExtra)
349
+ : set + box.horizontalExtra;
350
+ return heightFromWidth(box, clampWidth(box, outer, containingWidth));
351
+ }
352
+ /** A child's `order`, which an absolutely positioned one takes as 0 when
353
+ * it is painted among the items. */
354
+ function orderOf(box) {
355
+ return box.outOfFlow || box.kind === 'text' ? 0 : box.style.order;
356
+ }
357
+ /** Lay each item out where the flex layout put it, at the size it gave it,
358
+ * and answer where the lowest ends. `started` are items set at their
359
+ * lines' starts whatever their own alignment says (`baselineLines`). */
360
+ function placeItems(box, ctx, items, row, height,
361
+ /** Whether Yoga aligned the lines in its pass that drops a margin. */
362
+ lined, started) {
72
363
  let bottom = 0;
73
- for (const { box: child, node } of items) {
74
- const left = box.contentX + node.getComputedLeft();
75
- const top = box.contentY + node.getComputedTop();
76
- const width = node.getComputedWidth();
364
+ for (const { box: child, node, laid } of items) {
365
+ const across = lined
366
+ ? lineMarginFix(box.style, child, node, row, started?.has(child))
367
+ : 0;
368
+ const left = box.contentX + node.getComputedLeft() + (row ? 0 : across);
369
+ const top = box.contentY + node.getComputedTop() + (row ? across : 0);
370
+ const width = meant(node.getComputedWidth(), laid.set, laid.stretch, laid.width);
77
371
  const itemHeight = node.getComputedHeight();
78
372
  // The item is laid out again at the width the flex pass settled on: the
79
373
  // measure function answered a question, and the answer is not a layout —
80
374
  // its line breaks were computed against a width that may have changed
81
- // when a sibling grew.
82
- layoutItemAt(child, ctx, left, top, width, itemHeight);
375
+ // when a sibling grew. Unless the last answer was at that width, which
376
+ // is a layout the item still has (Yoga's widths are float32s).
377
+ // Its height is definite where the flex layout made it so (CSS Flexbox
378
+ // 9.8): stretched across a row's line, or flexed in a column of a
379
+ // height of its own. What is in it takes its percentages of that —
380
+ // the `h-full` in a stretched sidebar — where they had nothing to be
381
+ // of, and the item is laid out again for them.
382
+ const definite = row
383
+ ? stretches(child, box.style)
384
+ ? itemHeight
385
+ : null
386
+ : height !== null
387
+ ? itemHeight
388
+ : null;
389
+ layoutItemAt(child, ctx, left, top, width, itemHeight, laid, definite, !row);
83
390
  bottom = Math.max(bottom, top + child.height);
84
391
  }
85
- const contentHeight = root.getComputedHeight();
86
- root.freeRecursive();
87
- return Math.max(contentHeight, bottom - box.contentY);
392
+ return bottom;
88
393
  }
89
- function layoutItemAt(box, ctx, x, y, width, height) {
90
- if (box.kind === 'text' || box.kind === 'break') {
394
+ function layoutItemAt(box, ctx, x, y, width, height, laid,
395
+ /** Its border box's height where the flex layout made it definite. */
396
+ definite,
397
+ /** Whether its height is the one the flex layout gave it, in a column,
398
+ * whatever its own says: flexed, it is shrunk as well as grown. */
399
+ column = false) {
400
+ // a replaced item is the size the flex layout made it — flexed,
401
+ // stretched — which its natural size was only the start of
402
+ if (box.kind === 'text' || box.kind === 'break' || box.kind === 'replaced') {
91
403
  box.x = x;
92
404
  box.y = y;
93
405
  box.width = width;
94
406
  box.height = height;
95
407
  return;
96
408
  }
409
+ const inner = definite === null || !percentHeightsIn(box)
410
+ ? null
411
+ : Math.max(0, definite - box.verticalExtra);
412
+ if (inner !== null && !Object.is(inner, percentBaseInside(box))) {
413
+ FLEXED_HEIGHT.set(box, inner);
414
+ try {
415
+ ctx.layoutSubtree(box, width);
416
+ }
417
+ finally {
418
+ FLEXED_HEIGHT.delete(box);
419
+ }
420
+ }
97
421
  // `measureBox` lays the box out at (0, 0); re-running it at the final width
98
422
  // and then moving it is one pass, not two, because the second call is the
99
- // one whose result is kept.
100
- ctx.layoutSubtree(box, width);
423
+ // one whose result is kept — or no pass, where the last measure was at
424
+ // this width. An item Yoga never measured has none, NaN, and is laid out.
425
+ else if (Math.abs(laid.width - width) <= 0.01)
426
+ box.height = laid.height;
427
+ else
428
+ ctx.layoutSubtree(box, width);
101
429
  // A stretched item is taller than its content, and the box has to say so
102
- // or its background stops short of the row.
103
- if (height > box.height)
430
+ // or its background stops short of the row — and it is no taller than its
431
+ // line where its content is, or than what its ratio makes of its width:
432
+ // its height is the line's (CSS Flexbox 9.4, step 11).
433
+ if (height > box.height || column || definite !== null)
104
434
  box.height = height;
105
435
  moveTo(box, x, y);
106
436
  }
437
+ // What a new Yoga node already is is not said again. A call into the
438
+ // engine costs more than the arithmetic it asks for, and a Tailwind page is
439
+ // a flex box in every list item: saying every default made the calls into
440
+ // Yoga two fifths of laying one out. A node's defaults are column, no wrap,
441
+ // start, stretch, start (for its lines), no growing, no shrinking, `auto`
442
+ // basis and size, and nothing on any edge.
107
443
  function applyContainer(node, style) {
108
- node.setFlexDirection(FLEX_DIRECTION[style.flexDirection] ?? Y.FLEX_DIRECTION_ROW);
109
- node.setFlexWrap(WRAP[style.flexWrap] ?? Y.WRAP_NO_WRAP);
110
- node.setJustifyContent(JUSTIFY[style.justifyContent] ?? Y.JUSTIFY_FLEX_START);
111
- node.setAlignItems(ALIGN[style.alignItems] ?? Y.ALIGN_STRETCH);
112
- node.setAlignContent(ALIGN[style.alignContent] ?? Y.ALIGN_STRETCH);
113
- if (style.rowGap)
114
- node.setGap(Y.GUTTER_ROW, style.rowGap);
115
- if (style.columnGap)
116
- node.setGap(Y.GUTTER_COLUMN, style.columnGap);
117
- }
118
- function applyItem(node, box, ctx, containingWidth) {
444
+ const direction = FLEX_DIRECTION[style.flexDirection] ?? Y.FLEX_DIRECTION_ROW;
445
+ if (direction !== Y.FLEX_DIRECTION_COLUMN)
446
+ node.setFlexDirection(direction);
447
+ const wrap = WRAP[style.flexWrap] ?? Y.WRAP_NO_WRAP;
448
+ if (wrap !== Y.WRAP_NO_WRAP)
449
+ node.setFlexWrap(wrap);
450
+ const justify = JUSTIFY[mainJustify(style)] ?? Y.JUSTIFY_FLEX_START;
451
+ if (justify !== Y.JUSTIFY_FLEX_START)
452
+ node.setJustifyContent(justify);
453
+ const items = ALIGN[style.alignItems] ?? Y.ALIGN_STRETCH;
454
+ if (items !== Y.ALIGN_STRETCH)
455
+ node.setAlignItems(items);
456
+ const lines = ALIGN[style.alignContent] ?? Y.ALIGN_STRETCH;
457
+ if (lines !== Y.ALIGN_FLEX_START)
458
+ node.setAlignContent(lines);
459
+ }
460
+ function applyItem(node, box, ctx, containingWidth, laid,
461
+ /** Whether the flex box has a height of its own. */
462
+ tall) {
119
463
  const style = box.style;
120
- node.setMargin(Y.EDGE_TOP, box.marginTop);
121
- node.setMargin(Y.EDGE_RIGHT, box.marginRight);
122
- node.setMargin(Y.EDGE_BOTTOM, box.marginBottom);
123
- node.setMargin(Y.EDGE_LEFT, box.marginLeft);
124
- node.setFlexGrow(style.flexGrow);
125
- node.setFlexShrink(style.flexShrink);
464
+ laid.stretch = containingWidth - box.marginLeft - box.marginRight;
465
+ // an `auto` margin takes the free space on its side, which is how
466
+ // `margin-left: auto` puts an item at the end of its row (CSS Flexbox
467
+ // 8.1); Yoga does that itself
468
+ const margin = (edge, len, px) => {
469
+ if (len === AUTO)
470
+ node.setMarginAuto(edge);
471
+ else if (px)
472
+ node.setMargin(edge, px);
473
+ };
474
+ margin(Y.EDGE_TOP, style.marginTop, box.marginTop);
475
+ margin(Y.EDGE_RIGHT, style.marginRight, box.marginRight);
476
+ margin(Y.EDGE_BOTTOM, style.marginBottom, box.marginBottom);
477
+ margin(Y.EDGE_LEFT, style.marginLeft, box.marginLeft);
478
+ if (style.flexGrow)
479
+ node.setFlexGrow(style.flexGrow);
480
+ if (style.flexShrink)
481
+ node.setFlexShrink(style.flexShrink);
126
482
  if (style.alignSelf !== AUTO)
127
483
  node.setAlignSelf(ALIGN[style.alignSelf] ?? Y.ALIGN_AUTO);
128
- setLength(style.width, containingWidth, node.setWidth.bind(node), node.setWidthPercent.bind(node), node.setWidthAuto.bind(node));
129
- setLength(style.height, NaN, node.setHeight.bind(node), node.setHeightPercent.bind(node), node.setHeightAuto.bind(node));
484
+ // Yoga's sizes are border boxes, as `box-sizing: border-box` has them;
485
+ // a `content-box` length is the content's, and the item's padding and
486
+ // border go on top of it
487
+ const across = style.boxSizing === 'border-box' ? 0 : box.horizontalExtra;
488
+ const down = style.boxSizing === 'border-box' ? 0 : box.verticalExtra;
489
+ if (style.width !== AUTO) {
490
+ laid.set = setLength(node, true, style.width, containingWidth, across);
491
+ }
492
+ if (style.height !== AUTO)
493
+ setLength(node, false, style.height, NaN, down);
130
494
  const minWidth = resolveOrNull(style.minWidth, containingWidth);
131
495
  if (minWidth !== null)
132
- node.setMinWidth(minWidth);
496
+ node.setMinWidth(minWidth + across);
133
497
  if (style.maxWidth !== 'none') {
134
498
  const maxWidth = resolveOrNull(style.maxWidth, containingWidth);
135
499
  if (maxWidth !== null)
136
- node.setMaxWidth(maxWidth);
500
+ node.setMaxWidth(maxWidth + across);
501
+ }
502
+ if (style.widthKeyword || style.minWidthKeyword || style.maxWidthKeyword) {
503
+ // an intrinsic size is the item's content's, measured here and handed
504
+ // over as a length: `w-fit` in a column is not stretched across it,
505
+ // and `min-w-max` in a row does not shrink below its content
506
+ const room = Math.max(0, containingWidth - box.marginLeft - box.marginRight);
507
+ const size = (keyword) => contentSizedWidth(box, ctx, keyword, room, containingWidth);
508
+ if (style.widthKeyword) {
509
+ laid.set = size(style.widthKeyword);
510
+ node.setWidth(laid.set);
511
+ }
512
+ if (style.minWidthKeyword)
513
+ node.setMinWidth(size(style.minWidthKeyword));
514
+ if (style.maxWidthKeyword)
515
+ node.setMaxWidth(size(style.maxWidthKeyword));
137
516
  }
138
517
  const minHeight = resolveOrNull(style.minHeight, NaN);
139
518
  if (minHeight !== null)
140
- node.setMinHeight(minHeight);
519
+ node.setMinHeight(minHeight + down);
141
520
  if (style.maxHeight !== 'none') {
142
521
  const maxHeight = resolveOrNull(style.maxHeight, NaN);
143
522
  if (maxHeight !== null)
144
- node.setMaxHeight(maxHeight);
145
- }
146
- if (style.flexBasis === 'content')
147
- node.setFlexBasisAuto();
148
- else if (style.flexBasis === AUTO)
149
- node.setFlexBasisAuto();
150
- else if (isPct(style.flexBasis))
151
- node.setFlexBasisPercent(style.flexBasis.pct);
523
+ node.setMaxHeight(maxHeight + down);
524
+ }
525
+ const row = box.parent?.style.flexDirection.startsWith('row') ?? true;
526
+ // Yoga takes a length for a basis only where the flex box's main size is
527
+ // definite, and else the item's own size along it: down a column of no
528
+ // height of its own it read `flex: 0 0 3rem` as the item's height, or
529
+ // its content's. There the basis is handed over as that height, which is
530
+ // what the item's own is to a basis anyway — no more than its start
531
+ const setBasis = (px) => {
532
+ if (row || tall)
533
+ node.setFlexBasis(px);
534
+ else
535
+ node.setHeight(px);
536
+ };
537
+ // down a column, an item with a ratio and a width is as tall as that
538
+ // makes it, for a basis of its content or of its own `auto` height (CSS
539
+ // Flexbox 9.2.3, B) — where Yoga measured it, and its block layout held
540
+ // it to its content (CSS Sizing 4, 5.2), which only its automatic
541
+ // minimum does here (`autoMinimums`)
542
+ const columnBasis = !row &&
543
+ (style.flexBasis === 'content' ||
544
+ (style.flexBasis === AUTO && style.height === AUTO))
545
+ ? ratioHeightBasis(box, containingWidth)
546
+ : null;
547
+ if (style.flexBasis === 'content' && row) {
548
+ // the content's size along a row, whatever the item's own width says
549
+ // (CSS Flexbox 7.2.3), which Yoga reads as `auto` and takes the width
550
+ // for; along a column, Yoga's measure is the content's
551
+ node.setFlexBasis(contentBasis(box, ctx, containingWidth));
552
+ }
553
+ else if (columnBasis !== null) {
554
+ // but a height of its own hides it from Yoga, and an item with a ratio
555
+ // and a width is as tall as that makes it
556
+ setBasis(columnBasis);
557
+ }
558
+ else if (style.flexBasis === 'content' || style.flexBasis === AUTO) {
559
+ // Yoga's own
560
+ }
561
+ else if (isPct(style.flexBasis)) {
562
+ // a percentage of the main size, which is known across a row
563
+ const basis = style.flexBasis;
564
+ if (!basis.px && !basis.of)
565
+ node.setFlexBasisPercent(basis.pct);
566
+ else if (row && Number.isFinite(containingWidth)) {
567
+ node.setFlexBasis(resolve(basis, containingWidth));
568
+ }
569
+ else if (basis.of)
570
+ node.setFlexBasisAuto();
571
+ else
572
+ node.setFlexBasisPercent(basis.pct);
573
+ }
152
574
  else
153
- node.setFlexBasis(style.flexBasis);
575
+ setBasis(style.flexBasis + (row ? across : down));
154
576
  // The item's padding and border belong to Yoga so it can size the item,
155
577
  // and to this engine so it can paint it. Both read the same numbers.
156
- node.setPadding(Y.EDGE_TOP, box.padTop);
157
- node.setPadding(Y.EDGE_RIGHT, box.padRight);
158
- node.setPadding(Y.EDGE_BOTTOM, box.padBottom);
159
- node.setPadding(Y.EDGE_LEFT, box.padLeft);
160
- node.setBorder(Y.EDGE_TOP, box.borderTop);
161
- node.setBorder(Y.EDGE_RIGHT, box.borderRight);
162
- node.setBorder(Y.EDGE_BOTTOM, box.borderBottom);
163
- node.setBorder(Y.EDGE_LEFT, box.borderLeft);
578
+ if (box.padTop)
579
+ node.setPadding(Y.EDGE_TOP, box.padTop);
580
+ if (box.padRight)
581
+ node.setPadding(Y.EDGE_RIGHT, box.padRight);
582
+ if (box.padBottom)
583
+ node.setPadding(Y.EDGE_BOTTOM, box.padBottom);
584
+ if (box.padLeft)
585
+ node.setPadding(Y.EDGE_LEFT, box.padLeft);
586
+ if (box.borderTop)
587
+ node.setBorder(Y.EDGE_TOP, box.borderTop);
588
+ if (box.borderRight)
589
+ node.setBorder(Y.EDGE_RIGHT, box.borderRight);
590
+ if (box.borderBottom)
591
+ node.setBorder(Y.EDGE_BOTTOM, box.borderBottom);
592
+ if (box.borderLeft)
593
+ node.setBorder(Y.EDGE_LEFT, box.borderLeft);
164
594
  // Yoga asks; this engine answers. That is the whole of the bridge, and it
165
595
  // is what lets a paragraph be a flex item without flex knowing what a
166
596
  // paragraph is.
597
+ // Its max-content width is the same at every width Yoga asks at, and at
598
+ // every layout the box has, so it is taken once in the box's life, as a
599
+ // table cell's is: taken per layout of the container, a flex box in a
600
+ // flex box in a flex box laid its innermost out three times a level,
601
+ // and twelve levels took two seconds.
602
+ const alongRow = box.parent?.style.flexDirection.startsWith('row') ?? true;
603
+ const content = () => {
604
+ // a replaced element's is the width it has with no limit — its
605
+ // natural one, or what its ratio makes of a height of its own — which
606
+ // its image, loading, may change, so it is not kept; taken as its
607
+ // content's, it was none, and Yoga measured an image as nothing wide
608
+ if (box.kind === 'replaced') {
609
+ ctx.layoutSubtree(box, Infinity);
610
+ return Math.max(0, box.width - box.horizontalExtra);
611
+ }
612
+ // an item with a ratio and a definite height is that height through
613
+ // its ratio wide: its flex base size along a row (CSS Flexbox 9.2.3)
614
+ const fromRatio = alongRow && style.width === AUTO && !style.widthKeyword
615
+ ? ratioBasis(box)
616
+ : null;
617
+ if (fromRatio !== null)
618
+ return Math.max(0, fromRatio - box.horizontalExtra);
619
+ let width = MAX_CONTENT.get(box);
620
+ if (width === undefined) {
621
+ width = measureIntrinsicWidth(box, ctx, Infinity) - box.horizontalExtra;
622
+ MAX_CONTENT.set(box, width);
623
+ }
624
+ // within what its least and greatest heights make of widths through
625
+ // its ratio: its size before it is flexed, and not after
626
+ const extra = box.horizontalExtra;
627
+ return Math.max(0, transferredWidth(box, width + extra) - extra);
628
+ };
629
+ // An item with a ratio is as wide, across a column, as the height it
630
+ // was given makes it through the ratio, where its width is its own to
631
+ // find (CSS Flexbox 9.4, its hypothetical cross size from its used main
632
+ // size); and a replaced one is as tall, along a row, as the width it was
633
+ // given makes it, where its height is — which a replaced element's
634
+ // layout, sized by its own style, does not know.
635
+ const ratio = box.kind === 'replaced' ? replacedRatio(box) : 0;
636
+ const widthThrough = !alongRow && style.width === AUTO && !style.widthKeyword
637
+ ? (height) => box.kind === 'replaced'
638
+ ? ratio > 0
639
+ ? height * ratio
640
+ : null
641
+ : (() => {
642
+ const width = widthFromHeight(box, height + box.verticalExtra);
643
+ return width === null
644
+ ? null
645
+ : Math.max(0, width - box.horizontalExtra);
646
+ })()
647
+ : null;
648
+ // and an answer Yoga asks for twice is the layout the item already has
649
+ const answers = new Map();
167
650
  node.setMeasureFunc((w, wm, h, hm) => {
168
- void h;
169
- void hm;
170
- const available = wm === Y.MEASURE_MODE_UNDEFINED || !Number.isFinite(w) ? Infinity : w;
171
- return measureBox(box, ctx, available);
651
+ // the width Yoga gave, as this engine meant it (`meant`)
652
+ const extra = box.horizontalExtra;
653
+ const width = meant(w, laid.set - extra, laid.stretch - extra);
654
+ const given = hm === Y.MEASURE_MODE_EXACTLY && Number.isFinite(h);
655
+ const exact = wm === Y.MEASURE_MODE_EXACTLY && Number.isFinite(width);
656
+ const through = widthThrough && given && !exact ? widthThrough(h) : null;
657
+ // along a row, a replaced element is its own width wherever there is
658
+ // room for less — its flex base size is not fitted to the room (9.2)
659
+ // — and across a column it is fitted, as any item is
660
+ const inner = through !== null
661
+ ? through
662
+ : box.kind === 'replaced' && alongRow && !exact
663
+ ? content()
664
+ : innerWidth(width, wm, content);
665
+ if (box.kind === 'replaced' &&
666
+ exact &&
667
+ ratio > 0 &&
668
+ style.height === AUTO) {
669
+ return { width: inner, height: inner / ratio };
670
+ }
671
+ let answer = answers.get(inner);
672
+ if (answer === undefined) {
673
+ answer = measureBox(box, ctx, inner);
674
+ answers.set(inner, answer);
675
+ laid.width = box.width;
676
+ laid.height = box.height;
677
+ }
678
+ return answer;
172
679
  });
173
680
  }
174
- function setLength(len, base, setPx, setPercent, setAuto) {
175
- if (len === AUTO) {
176
- setAuto();
177
- return;
681
+ /** How wide an item's content is as the box is laid out: its max-content
682
+ * width, measured the once (`applyItem`). Keyed by the box, whose lifetime
683
+ * is the cache's: any change to what is in it rebuilds it. */
684
+ const MAX_CONTENT = new WeakMap();
685
+ /**
686
+ * Whether two widths are the same to a float32's precision. Yoga keeps
687
+ * every length as a float32, a few of its own operations deep, and hands
688
+ * back a width this engine meant rounded — down as often as up.
689
+ */
690
+ function nearly(a, b) {
691
+ return Math.abs(a - b) <= Math.max(Math.abs(a), Math.abs(b)) * 2 ** -20;
692
+ }
693
+ /**
694
+ * Yoga's width for an item, as this engine meant it: the first of
695
+ * `intended` it is the float32 of, or its own where it is none of them. A
696
+ * box exactly as wide as its text — `width: fit-content` in a column, an
697
+ * item as wide as its content in a row, a flex box sized to what it holds —
698
+ * came back a hair narrower than the text, and laid out there its last word
699
+ * wrapped: meetup.com's "About us" and "Related topics" were two lines.
700
+ */
701
+ function meant(width, ...intended) {
702
+ for (const w of intended) {
703
+ if (Number.isFinite(w) && nearly(width, w))
704
+ return w;
178
705
  }
706
+ return width;
707
+ }
708
+ /** Set a length on the node; the points it set, or NaN where it set a
709
+ * percentage, which Yoga resolves, or nothing. */
710
+ function setLength(node, across, len, base,
711
+ /** Padding and border a `content-box` length goes without. */
712
+ extra) {
713
+ const px = (v) => {
714
+ if (across)
715
+ node.setWidth(v);
716
+ else
717
+ node.setHeight(v);
718
+ return v;
719
+ };
720
+ const percent = (v) => {
721
+ if (across)
722
+ node.setWidthPercent(v);
723
+ else
724
+ node.setHeightPercent(v);
725
+ return NaN;
726
+ };
727
+ if (len === AUTO)
728
+ return NaN;
179
729
  if (isPct(len)) {
180
- setPercent(len.pct);
181
- return;
730
+ // Yoga takes a percentage or points, not both: `calc(100% - 20px)`
731
+ // resolves here where its base is known, and so does a percentage with
732
+ // padding to add, and a percentage is kept alone where it is not
733
+ if (!len.px && !len.of && !extra)
734
+ return percent(len.pct);
735
+ if (Number.isFinite(base))
736
+ return px(resolve(len, base) + extra);
737
+ if (len.of)
738
+ return NaN;
739
+ return percent(len.pct);
182
740
  }
183
- void base;
184
- setPx(len);
741
+ return px(len + extra);
185
742
  }
186
743
  /**
187
- * Lay a box out at a width and report the size it came to — the measure
188
- * function's body, and also how a settled item is finally laid out. The two
189
- * are the same call on purpose: an element that reports one size and then
190
- * draws another is the bug this shape makes impossible.
744
+ * The size of an item's content, the measure function's answer. Yoga holds
745
+ * the item's padding and border and adds them itself, so this answers
746
+ * inside them: a border box here was an item its padding's height taller
747
+ * than a browser draws it. Asked for a width it may take up to, or none,
748
+ * an item is as wide as its content, its max-content width (CSS Flexbox
749
+ * 9.2, `flex-basis: auto`), rather than as wide as the row; asked for one
750
+ * exactly, it is that wide. Its height is its content's at that width.
191
751
  */
192
- function measureBox(box, ctx, available) {
193
- ctx.layoutSubtree(box, available);
194
- return { width: box.width, height: box.height };
752
+ function measureBox(box, ctx, inner) {
753
+ ctx.layoutSubtree(box, inner + box.horizontalExtra);
754
+ return {
755
+ width: inner,
756
+ height: Math.max(0, box.height - box.verticalExtra),
757
+ };
758
+ }
759
+ /** The width an item's content is measured at: the width Yoga gives it
760
+ * exactly, or its max-content width, no wider than any it may take up to
761
+ * (CSS Flexbox 9.2). */
762
+ function innerWidth(width, mode, maxContent) {
763
+ if (mode === Y.MEASURE_MODE_EXACTLY && Number.isFinite(width)) {
764
+ return Math.max(0, width);
765
+ }
766
+ const content = maxContent();
767
+ if (mode !== Y.MEASURE_MODE_AT_MOST || !Number.isFinite(width)) {
768
+ return content;
769
+ }
770
+ // a room exactly as wide as the content, as Yoga holds it, is room for it
771
+ return content <= width || nearly(content, width)
772
+ ? content
773
+ : Math.max(0, width);
195
774
  }
775
+ /**
776
+ * An item's automatic minimum (CSS Flexbox 4.5): with `min-width: auto` in
777
+ * a row, or `min-height: auto` in a column, an item its content sizes is no
778
+ * smaller along the row than its content comes to — its min-content width,
779
+ * or its content's height at its width.
780
+ * Yoga has no such minimum, and shrank an item under a long word or a
781
+ * column's content, which ran out over the next one; `min-w-0` is what
782
+ * lets an item shrink past it, and so `auto` is kept apart from 0.
783
+ *
784
+ * Asked of an item only where its content overflows it at the size Yoga
785
+ * gave it, laid out there as the final pass would lay it out and keeps
786
+ * (`Laid`), so a row with room pays for nothing. True where some item
787
+ * was given a minimum and the row has to be laid out again.
788
+ */
789
+ function autoMinimums(items, row, ctx, containingWidth) {
790
+ let changed = false;
791
+ for (const { box, node, laid } of items) {
792
+ if (box.kind === 'text' || box.kind === 'break')
793
+ continue;
794
+ const style = box.style;
795
+ // a box that scrolls or clips has none, but for one that asks for its
796
+ // content's height
797
+ const asked = !row && style.minHeightKeyword !== null;
798
+ if (!asked && scrolls(style)) {
799
+ continue;
800
+ }
801
+ const width = meant(node.getComputedWidth(), laid.set, laid.stretch, laid.width);
802
+ // a replaced item's content along a row is its natural width
803
+ if (row && box.kind === 'replaced') {
804
+ if (style.minWidth !== AUTO || style.minWidthKeyword)
805
+ continue;
806
+ const least = replacedMinimum(box, containingWidth);
807
+ if (least === null || width >= least - 0.01)
808
+ continue;
809
+ node.setMinWidth(least);
810
+ changed = true;
811
+ continue;
812
+ }
813
+ // An item with a ratio and a definite height is along a row as wide
814
+ // as that height makes it, or as its content at its narrowest where
815
+ // that is wider (4.5's content size suggestion, its min-content size
816
+ // through the ratio, and CSS Sizing 4, 5.2) — and no wider for it
817
+ // than a width of its own
818
+ if (row &&
819
+ box.kind !== 'replaced' &&
820
+ style.minWidth === AUTO &&
821
+ !style.minWidthKeyword) {
822
+ const through = ratioBasis(box);
823
+ if (through !== null) {
824
+ let least = Math.max(through, minContentOf(box, ctx, laid));
825
+ const own = resolveOrNull(style.width, containingWidth);
826
+ const extra = style.boxSizing === 'border-box' ? 0 : box.horizontalExtra;
827
+ if (own !== null)
828
+ least = Math.min(least, own + extra);
829
+ if (style.maxWidth !== 'none') {
830
+ const most = resolveOrNull(style.maxWidth, containingWidth);
831
+ if (most !== null)
832
+ least = Math.min(least, most + extra);
833
+ }
834
+ if (width >= least - 0.01)
835
+ continue;
836
+ node.setMinWidth(least);
837
+ changed = true;
838
+ continue;
839
+ }
840
+ }
841
+ if (row
842
+ ? style.minWidth !== AUTO || style.minWidthKeyword || style.widthKeyword
843
+ : style.minHeight !== AUTO && !asked) {
844
+ continue;
845
+ }
846
+ // One with a width of its own is no narrower along a row than the
847
+ // lesser of that width and its content at its narrowest (4.5's
848
+ // specified and content size suggestions): a `width: 250px` sidebar
849
+ // with `flex-basis: 0` is 250 wide beside the item that takes the
850
+ // rest, and one holding a longer word is still no wider than 250
851
+ if (row && style.width !== AUTO) {
852
+ const own = resolveOrNull(style.width, containingWidth);
853
+ if (own === null)
854
+ continue;
855
+ const extra = style.boxSizing === 'border-box' ? 0 : box.horizontalExtra;
856
+ let least = own + extra;
857
+ if (style.maxWidth !== 'none') {
858
+ const most = resolveOrNull(style.maxWidth, containingWidth);
859
+ if (most !== null)
860
+ least = Math.min(least, most + extra);
861
+ }
862
+ if (width >= least - 0.01)
863
+ continue;
864
+ least = Math.min(least, minContentOf(box, ctx, laid));
865
+ if (node.getComputedWidth() >= least - 0.01)
866
+ continue;
867
+ node.setMinWidth(least);
868
+ changed = true;
869
+ continue;
870
+ }
871
+ // no narrower than its content at its widest, where Yoga measured that
872
+ // — and than what a ratio makes of its least height, which a content
873
+ // no wider may still be held to
874
+ const widest = row ? MAX_CONTENT.get(box) : undefined;
875
+ if (widest !== undefined &&
876
+ transferredWidth(box, widest + box.horizontalExtra) <= width + 0.5) {
877
+ continue;
878
+ }
879
+ if (!(Math.abs(laid.width - width) <= 0.01)) {
880
+ ctx.layoutSubtree(box, width);
881
+ laid.width = box.width;
882
+ laid.height = box.height;
883
+ }
884
+ let least;
885
+ if (row) {
886
+ // or than what it drew at the width it has: nothing overflows it
887
+ const drawn = intrinsicWidth(box) + box.horizontalExtra;
888
+ if (transferredWidth(box, drawn) <= width + 0.5)
889
+ continue;
890
+ // within what a ratio makes of its least and greatest heights (4.5's
891
+ // content size suggestion)
892
+ least = transferredWidth(box, minContentOf(box, ctx, laid));
893
+ const extra = style.boxSizing === 'border-box' ? 0 : box.horizontalExtra;
894
+ if (style.maxWidth !== 'none') {
895
+ const most = resolveOrNull(style.maxWidth, containingWidth);
896
+ if (most !== null)
897
+ least = Math.min(least, most + extra);
898
+ }
899
+ if (node.getComputedWidth() >= least - 0.01)
900
+ continue;
901
+ node.setMinWidth(least);
902
+ }
903
+ else {
904
+ // its height, or where it has one of its own and its content comes to
905
+ // less, its content's: the lesser of the two (4.5)
906
+ let content;
907
+ if (box.kind === 'replaced')
908
+ content = laid.height;
909
+ else if (style.height !== AUTO && percentHeightsIn(box)) {
910
+ // what its content comes to where it has no height to take
911
+ // percentages of, as an intrinsic size is measured: laid out so
912
+ // apart, and the final pass lays it out again
913
+ FLEXED_HEIGHT.set(box, NaN);
914
+ try {
915
+ ctx.layoutSubtree(box, width);
916
+ }
917
+ finally {
918
+ FLEXED_HEIGHT.delete(box);
919
+ }
920
+ content = contentBottom(box) + box.verticalExtra;
921
+ laid.width = NaN;
922
+ }
923
+ else
924
+ content = contentBottom(box) + box.verticalExtra;
925
+ // and a ratio's content is at least its width through the ratio,
926
+ // height of its own or not (CSS Sizing 4, 5.1)
927
+ const aspect = style.aspectRatio;
928
+ if (aspect && box.kind !== 'replaced') {
929
+ content = Math.max(content, style.boxSizing === 'border-box'
930
+ ? box.width / aspect.ratio
931
+ : box.contentWidth / aspect.ratio + box.verticalExtra);
932
+ }
933
+ // within what the ratio makes of its least and greatest widths
934
+ if (box.kind !== 'replaced') {
935
+ content = transferredHeight(box, content, containingWidth);
936
+ }
937
+ least = Math.min(laid.height, content);
938
+ const extra = style.boxSizing === 'border-box' ? 0 : box.verticalExtra;
939
+ if (style.maxHeight !== 'none') {
940
+ const most = resolveOrNull(style.maxHeight, NaN);
941
+ if (most !== null)
942
+ least = Math.min(least, most + extra);
943
+ }
944
+ if (node.getComputedHeight() >= least - 0.01)
945
+ continue;
946
+ node.setMinHeight(least);
947
+ }
948
+ changed = true;
949
+ }
950
+ return changed;
951
+ }
952
+ /** An item's min-content width, its border box's, taken the once: its
953
+ * content's, whatever width it has of its own (`keywordWidth`'s too). */
954
+ function minContentOf(box, ctx, laid) {
955
+ if (box.intrinsicMinContent < 0) {
956
+ const exact = ctx.fonts ? exactMinContent(box, ctx.fonts) : null;
957
+ box.intrinsicMinContent =
958
+ exact ?? measureIntrinsicWidth(box, ctx, MIN_CONTENT_PROBE, true);
959
+ // a probe lays the box out where the kept layout was
960
+ if (exact === null)
961
+ laid.width = NaN;
962
+ }
963
+ return box.intrinsicMinContent;
964
+ }
965
+ /** How far down a laid-out box's content reaches inside its content box:
966
+ * its lines and its children, floats included, with their margins. */
967
+ function contentBottom(box) {
968
+ const top = box.contentY;
969
+ let bottom = 0;
970
+ for (const line of box.lines ?? []) {
971
+ bottom = Math.max(bottom, line.y + line.height - top);
972
+ }
973
+ for (const child of box.children) {
974
+ if (child.outOfFlow || child.kind === 'text' || child.kind === 'break') {
975
+ continue;
976
+ }
977
+ if (child.kind === 'inline')
978
+ continue;
979
+ bottom = Math.max(bottom, child.y + child.height + child.marginBottom - top);
980
+ }
981
+ return bottom;
982
+ }
983
+ /**
984
+ * A row's items aligned by their baselines (CSS Flexbox 8.3, 9.4 step 8),
985
+ * which Yoga cannot see: an item is a leaf there, and a leaf's baseline is
986
+ * its bottom edge, so it lined them up by their bottoms. With the items laid
987
+ * out, each line's, and for each the top margin that sets it at the line's
988
+ * start with its first baseline where the lowest-reaching one's is — or
989
+ * null where no line has two to align.
990
+ */
991
+ function baselineLines(style, items) {
992
+ // a line that grows from its end is aligned from there, and left to Yoga
993
+ if (style.flexWrap === 'wrap-reverse')
994
+ return null;
995
+ const wraps = style.flexWrap !== 'nowrap';
996
+ // along a line the items go the way the main axis does, and the next
997
+ // line starts where one does not
998
+ const back = (style.flexDirection === 'row-reverse') !== (style.direction === 'rtl');
999
+ const out = [];
1000
+ let line = [];
1001
+ let last = NaN;
1002
+ let several = false;
1003
+ const close = () => {
1004
+ if (!line.length)
1005
+ return;
1006
+ if (line.length > 1)
1007
+ several = true;
1008
+ let reach = -Infinity;
1009
+ const ascents = line.map(({ box }) => {
1010
+ const ascent = box.marginTop + itemBaseline(box);
1011
+ reach = Math.max(reach, ascent);
1012
+ return ascent;
1013
+ });
1014
+ const margins = line.map(({ box }, i) => box.marginTop + reach - ascents[i]);
1015
+ out.push(Object.assign(line, { margins }));
1016
+ };
1017
+ for (const item of items) {
1018
+ const box = item.box;
1019
+ if (wraps && line.length && (back ? box.x >= last : box.x <= last)) {
1020
+ close();
1021
+ line = [];
1022
+ }
1023
+ last = box.x;
1024
+ const own = box.style;
1025
+ const aligned = own.alignSelf === AUTO ? style.alignItems : own.alignSelf;
1026
+ // an `auto` margin across the line takes it over alignment
1027
+ if (aligned === 'baseline' &&
1028
+ own.marginTop !== AUTO &&
1029
+ own.marginBottom !== AUTO) {
1030
+ line.push(item);
1031
+ }
1032
+ }
1033
+ close();
1034
+ // one alone on its line is at its start already
1035
+ return several ? out : null;
1036
+ }
1037
+ /**
1038
+ * How far an item is from where it belongs across its line, where Yoga
1039
+ * (3.2.1) aligned the lines in the pass it takes for a box that wraps or
1040
+ * aligns by baselines: it sets an item aligned to its line's start there
1041
+ * as though it had no margin at that side, and one centred as though it had
1042
+ * none at either — `items-start` in a wrapping row put every card's top
1043
+ * margin under it. By the margin at the start of the line's cross axis, and
1044
+ * by half what it exceeds the one at the end by, as Yoga holds them: for an
1045
+ * item set at its line's start (`started`), its baseline's. A column's,
1046
+ * whose cross axis runs right to left, and a box that wraps in reverse are
1047
+ * left as Yoga has them.
1048
+ */
1049
+ function lineMarginFix(container, item, node, row, started = false) {
1050
+ if (container.flexWrap === 'wrap-reverse')
1051
+ return 0;
1052
+ if (!row && container.direction === 'rtl')
1053
+ return 0;
1054
+ const style = item.style;
1055
+ // a margin that is `auto` takes the item over its alignment
1056
+ const lead = row ? style.marginTop : style.marginLeft;
1057
+ const trail = row ? style.marginBottom : style.marginRight;
1058
+ if (lead === AUTO || trail === AUTO)
1059
+ return 0;
1060
+ const align = started
1061
+ ? 'flex-start'
1062
+ : style.alignSelf === AUTO
1063
+ ? container.alignItems
1064
+ : style.alignSelf;
1065
+ if (align !== 'flex-start' && align !== 'center')
1066
+ return 0;
1067
+ const leading = node.getComputedMargin(row ? Y.EDGE_TOP : Y.EDGE_LEFT);
1068
+ if (align === 'flex-start')
1069
+ return leading;
1070
+ const trailing = node.getComputedMargin(row ? Y.EDGE_BOTTOM : Y.EDGE_RIGHT);
1071
+ return (leading - trailing) / 2;
1072
+ }
1073
+ /** An item's first baseline, down from its border edge: its content's
1074
+ * first line's, or where it has none, or is replaced, one synthesized
1075
+ * from its border box — its bottom edge. */
1076
+ function itemBaseline(item) {
1077
+ if (item.kind !== 'replaced') {
1078
+ const found = firstBaselineIn(item);
1079
+ if (found !== null)
1080
+ return Math.min(found - item.y, item.height);
1081
+ }
1082
+ return item.height;
1083
+ }
1084
+ /** Whether an item is stretched across its line: `stretch`, its own or its
1085
+ * container's, with no height of its own and no `auto` margin across. */
1086
+ function stretches(box, container,
1087
+ /** Whether the line is a row's, across which the item's height is
1088
+ * stretched; a column's stretches its width. */
1089
+ row = true) {
1090
+ const style = box.style;
1091
+ const align = style.alignSelf === AUTO ? container.alignItems : style.alignSelf;
1092
+ if (align !== 'stretch')
1093
+ return false;
1094
+ return row
1095
+ ? style.height === AUTO &&
1096
+ style.marginTop !== AUTO &&
1097
+ style.marginBottom !== AUTO
1098
+ : style.width === AUTO &&
1099
+ style.marginLeft !== AUTO &&
1100
+ style.marginRight !== AUTO;
1101
+ }
1102
+ /** How deep flex boxes are laid out by Yoga, one inside another's measure
1103
+ * (`layoutFlex`). */
1104
+ const FLEX_DEPTH = 64;
196
1105
  /** No Yoga assembly: stack the items instead of dropping them. */
197
1106
  function layoutAsBlockFallback(box, ctx, contentWidth) {
198
1107
  let y = box.contentY;
199
1108
  for (const child of box.children) {
200
- if (child.kind === 'text' && !child.text.trim())
1109
+ if (child.kind === 'text' && isBlank(child.text))
201
1110
  continue;
202
1111
  if (child.outOfFlow) {
203
- ctx.positioned.push({ box: child, containing: box });
1112
+ positionOutOfFlow(child, box, ctx, true);
204
1113
  continue;
205
1114
  }
206
1115
  resolveEdges(child, contentWidth);
@@ -221,6 +1130,33 @@ const WRAP = {
221
1130
  wrap: Y?.WRAP_WRAP,
222
1131
  'wrap-reverse': Y?.WRAP_WRAP_REVERSE,
223
1132
  };
1133
+ /**
1134
+ * A `justify-content` as the main axis takes it (CSS Box Alignment 3,
1135
+ * 6.1): `start` and `end` are the writing mode's, the main axis's own ends
1136
+ * turned round in a reversed direction; `left` and `right` are the page's
1137
+ * along a row, and `start` along a column, which has neither.
1138
+ */
1139
+ function mainJustify(style) {
1140
+ const justify = style.justifyContent;
1141
+ if (justify !== 'start' &&
1142
+ justify !== 'end' &&
1143
+ justify !== 'left' &&
1144
+ justify !== 'right') {
1145
+ return justify;
1146
+ }
1147
+ const reverse = style.flexDirection.endsWith('-reverse');
1148
+ const row = style.flexDirection.startsWith('row');
1149
+ let start;
1150
+ if (justify === 'start')
1151
+ start = true;
1152
+ else if (justify === 'end')
1153
+ start = false;
1154
+ else if (!row)
1155
+ start = true;
1156
+ else
1157
+ start = (justify === 'left') === (style.direction !== 'rtl');
1158
+ return start !== reverse ? 'flex-start' : 'flex-end';
1159
+ }
224
1160
  const JUSTIFY = {
225
1161
  'flex-start': Y?.JUSTIFY_FLEX_START,
226
1162
  'flex-end': Y?.JUSTIFY_FLEX_END,