@react-x11/components 0.8.0 → 0.10.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 (721) hide show
  1. package/README.md +105 -38
  2. package/dist/charts/node.d.ts +12 -2
  3. package/dist/charts/node.d.ts.map +1 -1
  4. package/dist/charts/node.js +50 -16
  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 +3 -1
  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/languages/glsl.d.ts.map +1 -1
  24. package/dist/code-language/languages/glsl.js +10 -2
  25. package/dist/code-language/languages/glsl.js.map +1 -1
  26. package/dist/code-language/languages/javascript.d.ts.map +1 -1
  27. package/dist/code-language/languages/javascript.js +18 -3
  28. package/dist/code-language/languages/javascript.js.map +1 -1
  29. package/dist/code-language/languages/json.d.ts.map +1 -1
  30. package/dist/code-language/languages/json.js +10 -2
  31. package/dist/code-language/languages/json.js.map +1 -1
  32. package/dist/code-language/languages/shell.d.ts.map +1 -1
  33. package/dist/code-language/languages/shell.js +10 -2
  34. package/dist/code-language/languages/shell.js.map +1 -1
  35. package/dist/code-language/languages/sql.d.ts.map +1 -1
  36. package/dist/code-language/languages/sql.js +20 -2
  37. package/dist/code-language/languages/sql.js.map +1 -1
  38. package/dist/code-language/stream.d.ts +22 -0
  39. package/dist/code-language/stream.d.ts.map +1 -1
  40. package/dist/code-language/stream.js +259 -9
  41. package/dist/code-language/stream.js.map +1 -1
  42. package/dist/code-language/types.d.ts +5 -4
  43. package/dist/code-language/types.d.ts.map +1 -1
  44. package/dist/codeblock/index.d.ts +13 -2
  45. package/dist/codeblock/index.d.ts.map +1 -1
  46. package/dist/codeblock/index.js +20 -3
  47. package/dist/codeblock/index.js.map +1 -1
  48. package/dist/embed/client.d.ts +48 -3
  49. package/dist/embed/client.d.ts.map +1 -1
  50. package/dist/embed/client.js +79 -5
  51. package/dist/embed/client.js.map +1 -1
  52. package/dist/embed/index.d.ts +1 -1
  53. package/dist/embed/index.d.ts.map +1 -1
  54. package/dist/embed/index.js +1 -1
  55. package/dist/embed/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 +240 -6
  115. package/dist/html/css/cascade.d.ts.map +1 -1
  116. package/dist/html/css/cascade.js +1327 -66
  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 +498 -15
  139. package/dist/html/css/style.d.ts.map +1 -1
  140. package/dist/html/css/style.js +3698 -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 +57 -11
  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 +2937 -197
  172. package/dist/html/layout/block.js.map +1 -1
  173. package/dist/html/layout/boxes.d.ts +340 -17
  174. package/dist/html/layout/boxes.d.ts.map +1 -1
  175. package/dist/html/layout/boxes.js +1714 -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 +151 -1
  205. package/dist/html/layout/inline.d.ts.map +1 -1
  206. package/dist/html/layout/inline.js +3375 -174
  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 +172 -5
  221. package/dist/html/node.d.ts.map +1 -1
  222. package/dist/html/node.js +1336 -103
  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 +3503 -141
  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 +435 -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 +2 -2
  245. package/dist/index.d.ts.map +1 -1
  246. package/dist/index.js +1 -1
  247. package/dist/index.js.map +1 -1
  248. package/dist/internal/collate.d.ts +3 -0
  249. package/dist/internal/collate.d.ts.map +1 -0
  250. package/dist/internal/collate.js +11 -0
  251. package/dist/internal/collate.js.map +1 -0
  252. package/dist/{markdown → internal/markdown}/ast.d.ts +23 -0
  253. package/dist/internal/markdown/ast.d.ts.map +1 -0
  254. package/dist/internal/markdown/ast.js +22 -0
  255. package/dist/internal/markdown/ast.js.map +1 -0
  256. package/dist/internal/markdown/parse.d.ts.map +1 -0
  257. package/dist/{markdown → internal/markdown}/parse.js +221 -30
  258. package/dist/internal/markdown/parse.js.map +1 -0
  259. package/dist/internal/markdown/stringify.d.ts +4 -0
  260. package/dist/internal/markdown/stringify.d.ts.map +1 -0
  261. package/dist/internal/markdown/stringify.js +684 -0
  262. package/dist/internal/markdown/stringify.js.map +1 -0
  263. package/dist/internal/markdown/tags.d.ts.map +1 -0
  264. package/dist/internal/markdown/tags.js.map +1 -0
  265. package/dist/internal/prewarm.d.ts +18 -0
  266. package/dist/internal/prewarm.d.ts.map +1 -0
  267. package/dist/internal/prewarm.js +42 -0
  268. package/dist/internal/prewarm.js.map +1 -0
  269. package/dist/internal/scroll.d.ts +3 -2
  270. package/dist/internal/scroll.d.ts.map +1 -1
  271. package/dist/internal/scroll.js +1 -0
  272. package/dist/internal/scroll.js.map +1 -1
  273. package/dist/internal/sdf.d.ts +20 -0
  274. package/dist/internal/sdf.d.ts.map +1 -0
  275. package/dist/internal/sdf.js +216 -0
  276. package/dist/internal/sdf.js.map +1 -0
  277. package/dist/internal/splice.d.ts +12 -0
  278. package/dist/internal/splice.d.ts.map +1 -0
  279. package/dist/internal/splice.js +23 -0
  280. package/dist/internal/splice.js.map +1 -0
  281. package/dist/internal/window.d.ts +12 -0
  282. package/dist/internal/window.d.ts.map +1 -1
  283. package/dist/internal/window.js +23 -6
  284. package/dist/internal/window.js.map +1 -1
  285. package/dist/maps/anchors.d.ts +103 -0
  286. package/dist/maps/anchors.d.ts.map +1 -0
  287. package/dist/maps/anchors.js +790 -0
  288. package/dist/maps/anchors.js.map +1 -0
  289. package/dist/maps/controller.d.ts +340 -0
  290. package/dist/maps/controller.d.ts.map +1 -0
  291. package/dist/maps/controller.js +822 -0
  292. package/dist/maps/controller.js.map +1 -0
  293. package/dist/maps/gl/buckets.d.ts +99 -0
  294. package/dist/maps/gl/buckets.d.ts.map +1 -0
  295. package/dist/maps/gl/buckets.js +365 -0
  296. package/dist/maps/gl/buckets.js.map +1 -0
  297. package/dist/maps/gl/build-worker.d.ts +15 -0
  298. package/dist/maps/gl/build-worker.d.ts.map +1 -0
  299. package/dist/maps/gl/build-worker.js +44 -0
  300. package/dist/maps/gl/build-worker.js.map +1 -0
  301. package/dist/maps/gl/color.d.ts +8 -0
  302. package/dist/maps/gl/color.d.ts.map +1 -0
  303. package/dist/maps/gl/color.js +57 -0
  304. package/dist/maps/gl/color.js.map +1 -0
  305. package/dist/maps/gl/cover.d.ts +70 -0
  306. package/dist/maps/gl/cover.d.ts.map +1 -0
  307. package/dist/maps/gl/cover.js +137 -0
  308. package/dist/maps/gl/cover.js.map +1 -0
  309. package/dist/maps/gl/index.d.ts +3 -0
  310. package/dist/maps/gl/index.d.ts.map +1 -0
  311. package/dist/maps/gl/index.js +20 -0
  312. package/dist/maps/gl/index.js.map +1 -0
  313. package/dist/maps/gl/markers.d.ts +28 -0
  314. package/dist/maps/gl/markers.d.ts.map +1 -0
  315. package/dist/maps/gl/markers.js +60 -0
  316. package/dist/maps/gl/markers.js.map +1 -0
  317. package/dist/maps/gl/overlays.d.ts +68 -0
  318. package/dist/maps/gl/overlays.d.ts.map +1 -0
  319. package/dist/maps/gl/overlays.js +300 -0
  320. package/dist/maps/gl/overlays.js.map +1 -0
  321. package/dist/maps/gl/pane.d.ts +12 -0
  322. package/dist/maps/gl/pane.d.ts.map +1 -0
  323. package/dist/maps/gl/pane.js +37 -0
  324. package/dist/maps/gl/pane.js.map +1 -0
  325. package/dist/maps/gl/placement.d.ts +124 -0
  326. package/dist/maps/gl/placement.d.ts.map +1 -0
  327. package/dist/maps/gl/placement.js +642 -0
  328. package/dist/maps/gl/placement.js.map +1 -0
  329. package/dist/maps/gl/renderer.d.ts +384 -0
  330. package/dist/maps/gl/renderer.d.ts.map +1 -0
  331. package/dist/maps/gl/renderer.js +1184 -0
  332. package/dist/maps/gl/renderer.js.map +1 -0
  333. package/dist/maps/gl/shaders.d.ts +121 -0
  334. package/dist/maps/gl/shaders.d.ts.map +1 -0
  335. package/dist/maps/gl/shaders.js +453 -0
  336. package/dist/maps/gl/shaders.js.map +1 -0
  337. package/dist/maps/gl/store.d.ts +125 -0
  338. package/dist/maps/gl/store.d.ts.map +1 -0
  339. package/dist/maps/gl/store.js +512 -0
  340. package/dist/maps/gl/store.js.map +1 -0
  341. package/dist/maps/gl/text.d.ts +283 -0
  342. package/dist/maps/gl/text.d.ts.map +1 -0
  343. package/dist/maps/gl/text.js +698 -0
  344. package/dist/maps/gl/text.js.map +1 -0
  345. package/dist/maps/gl/view.d.ts +345 -0
  346. package/dist/maps/gl/view.d.ts.map +1 -0
  347. package/dist/maps/gl/view.js +1209 -0
  348. package/dist/maps/gl/view.js.map +1 -0
  349. package/dist/maps/icons.d.ts +32 -0
  350. package/dist/maps/icons.d.ts.map +1 -0
  351. package/dist/maps/icons.js +151 -0
  352. package/dist/maps/icons.js.map +1 -0
  353. package/dist/maps/index.d.ts +3 -1
  354. package/dist/maps/index.d.ts.map +1 -1
  355. package/dist/maps/index.js +218 -52
  356. package/dist/maps/index.js.map +1 -1
  357. package/dist/maps/labels.d.ts +91 -18
  358. package/dist/maps/labels.d.ts.map +1 -1
  359. package/dist/maps/labels.js +376 -140
  360. package/dist/maps/labels.js.map +1 -1
  361. package/dist/maps/node.d.ts +179 -56
  362. package/dist/maps/node.d.ts.map +1 -1
  363. package/dist/maps/node.js +663 -537
  364. package/dist/maps/node.js.map +1 -1
  365. package/dist/maps/overlay.d.ts +72 -9
  366. package/dist/maps/overlay.d.ts.map +1 -1
  367. package/dist/maps/overlay.js +108 -28
  368. package/dist/maps/overlay.js.map +1 -1
  369. package/dist/maps/paint.d.ts +3 -0
  370. package/dist/maps/paint.d.ts.map +1 -1
  371. package/dist/maps/paint.js.map +1 -1
  372. package/dist/maps/proj.d.ts +62 -0
  373. package/dist/maps/proj.d.ts.map +1 -1
  374. package/dist/maps/proj.js +101 -0
  375. package/dist/maps/proj.js.map +1 -1
  376. package/dist/maps/renderer.d.ts +69 -0
  377. package/dist/maps/renderer.d.ts.map +1 -0
  378. package/dist/maps/renderer.js +66 -0
  379. package/dist/maps/renderer.js.map +1 -0
  380. package/dist/maps/sources.d.ts +30 -6
  381. package/dist/maps/sources.d.ts.map +1 -1
  382. package/dist/maps/sources.js +22 -3
  383. package/dist/maps/sources.js.map +1 -1
  384. package/dist/maps/style.d.ts +35 -0
  385. package/dist/maps/style.d.ts.map +1 -1
  386. package/dist/maps/style.js.map +1 -1
  387. package/dist/maps/styles.d.ts +12 -0
  388. package/dist/maps/styles.d.ts.map +1 -1
  389. package/dist/maps/styles.js +120 -6
  390. package/dist/maps/styles.js.map +1 -1
  391. package/dist/maps/theme.d.ts +19 -0
  392. package/dist/maps/theme.d.ts.map +1 -0
  393. package/dist/maps/theme.js +44 -0
  394. package/dist/maps/theme.js.map +1 -0
  395. package/dist/maps/tiles.d.ts +147 -27
  396. package/dist/maps/tiles.d.ts.map +1 -1
  397. package/dist/maps/tiles.js +221 -54
  398. package/dist/maps/tiles.js.map +1 -1
  399. package/dist/maps/types.d.ts +213 -21
  400. package/dist/maps/types.d.ts.map +1 -1
  401. package/dist/markdown/expressions.d.ts +1 -1
  402. package/dist/markdown/expressions.d.ts.map +1 -1
  403. package/dist/markdown/expressions.js.map +1 -1
  404. package/dist/markdown/index.d.ts +7 -6
  405. package/dist/markdown/index.d.ts.map +1 -1
  406. package/dist/markdown/index.js +121 -50
  407. package/dist/markdown/index.js.map +1 -1
  408. package/dist/markdown/spans.d.ts +1 -1
  409. package/dist/markdown/spans.d.ts.map +1 -1
  410. package/dist/markdown/spans.js +6 -0
  411. package/dist/markdown/spans.js.map +1 -1
  412. package/dist/media-player/index.d.ts +11 -3
  413. package/dist/media-player/index.d.ts.map +1 -1
  414. package/dist/media-player/index.js +13 -2
  415. package/dist/media-player/index.js.map +1 -1
  416. package/dist/qml/containers.d.ts.map +1 -1
  417. package/dist/qml/containers.js +6 -1
  418. package/dist/qml/containers.js.map +1 -1
  419. package/dist/qml/interaction.d.ts.map +1 -1
  420. package/dist/qml/interaction.js +38 -5
  421. package/dist/qml/interaction.js.map +1 -1
  422. package/dist/qml/layouts.d.ts.map +1 -1
  423. package/dist/qml/layouts.js +21 -6
  424. package/dist/qml/layouts.js.map +1 -1
  425. package/dist/qml/qtquick.d.ts.map +1 -1
  426. package/dist/qml/qtquick.js +9 -2
  427. package/dist/qml/qtquick.js.map +1 -1
  428. package/dist/qml/react.d.ts.map +1 -1
  429. package/dist/qml/react.js +9 -7
  430. package/dist/qml/react.js.map +1 -1
  431. package/dist/reorder/clock.d.ts +7 -0
  432. package/dist/reorder/clock.d.ts.map +1 -0
  433. package/dist/reorder/clock.js +26 -0
  434. package/dist/reorder/clock.js.map +1 -0
  435. package/dist/reorder/index.d.ts +25 -3
  436. package/dist/reorder/index.d.ts.map +1 -1
  437. package/dist/reorder/index.js +64 -19
  438. package/dist/reorder/index.js.map +1 -1
  439. package/dist/rich-text-editor/clipboard.d.ts +23 -0
  440. package/dist/rich-text-editor/clipboard.d.ts.map +1 -0
  441. package/dist/rich-text-editor/clipboard.js +307 -0
  442. package/dist/rich-text-editor/clipboard.js.map +1 -0
  443. package/dist/rich-text-editor/collab.d.ts +32 -0
  444. package/dist/rich-text-editor/collab.d.ts.map +1 -0
  445. package/dist/rich-text-editor/collab.js +55 -0
  446. package/dist/rich-text-editor/collab.js.map +1 -0
  447. package/dist/rich-text-editor/commands.d.ts +50 -0
  448. package/dist/rich-text-editor/commands.d.ts.map +1 -0
  449. package/dist/rich-text-editor/commands.js +376 -0
  450. package/dist/rich-text-editor/commands.js.map +1 -0
  451. package/dist/rich-text-editor/drag.d.ts +68 -0
  452. package/dist/rich-text-editor/drag.d.ts.map +1 -0
  453. package/dist/rich-text-editor/drag.js +148 -0
  454. package/dist/rich-text-editor/drag.js.map +1 -0
  455. package/dist/rich-text-editor/html.d.ts +145 -0
  456. package/dist/rich-text-editor/html.d.ts.map +1 -0
  457. package/dist/rich-text-editor/html.js +516 -0
  458. package/dist/rich-text-editor/html.js.map +1 -0
  459. package/dist/rich-text-editor/index.d.ts +252 -0
  460. package/dist/rich-text-editor/index.d.ts.map +1 -0
  461. package/dist/rich-text-editor/index.js +856 -0
  462. package/dist/rich-text-editor/index.js.map +1 -0
  463. package/dist/rich-text-editor/inline.d.ts +94 -0
  464. package/dist/rich-text-editor/inline.d.ts.map +1 -0
  465. package/dist/rich-text-editor/inline.js +252 -0
  466. package/dist/rich-text-editor/inline.js.map +1 -0
  467. package/dist/rich-text-editor/keymap.d.ts +71 -0
  468. package/dist/rich-text-editor/keymap.d.ts.map +1 -0
  469. package/dist/rich-text-editor/keymap.js +394 -0
  470. package/dist/rich-text-editor/keymap.js.map +1 -0
  471. package/dist/rich-text-editor/keys.d.ts +40 -0
  472. package/dist/rich-text-editor/keys.d.ts.map +1 -0
  473. package/dist/rich-text-editor/keys.js +202 -0
  474. package/dist/rich-text-editor/keys.js.map +1 -0
  475. package/dist/rich-text-editor/look.d.ts +71 -0
  476. package/dist/rich-text-editor/look.d.ts.map +1 -0
  477. package/dist/rich-text-editor/look.js +342 -0
  478. package/dist/rich-text-editor/look.js.map +1 -0
  479. package/dist/rich-text-editor/markdown.d.ts +18 -0
  480. package/dist/rich-text-editor/markdown.d.ts.map +1 -0
  481. package/dist/rich-text-editor/markdown.js +496 -0
  482. package/dist/rich-text-editor/markdown.js.map +1 -0
  483. package/dist/rich-text-editor/marks.d.ts +9 -0
  484. package/dist/rich-text-editor/marks.d.ts.map +1 -0
  485. package/dist/rich-text-editor/marks.js +83 -0
  486. package/dist/rich-text-editor/marks.js.map +1 -0
  487. package/dist/rich-text-editor/nodes.d.ts +135 -0
  488. package/dist/rich-text-editor/nodes.d.ts.map +1 -0
  489. package/dist/rich-text-editor/nodes.js +397 -0
  490. package/dist/rich-text-editor/nodes.js.map +1 -0
  491. package/dist/rich-text-editor/render.d.ts +68 -0
  492. package/dist/rich-text-editor/render.d.ts.map +1 -0
  493. package/dist/rich-text-editor/render.js +518 -0
  494. package/dist/rich-text-editor/render.js.map +1 -0
  495. package/dist/rich-text-editor/schema.d.ts +16 -0
  496. package/dist/rich-text-editor/schema.d.ts.map +1 -0
  497. package/dist/rich-text-editor/schema.js +386 -0
  498. package/dist/rich-text-editor/schema.js.map +1 -0
  499. package/dist/rich-text-editor/store.d.ts +11 -0
  500. package/dist/rich-text-editor/store.d.ts.map +1 -0
  501. package/dist/rich-text-editor/store.js +43 -0
  502. package/dist/rich-text-editor/store.js.map +1 -0
  503. package/dist/rich-text-editor/suggest.d.ts +127 -0
  504. package/dist/rich-text-editor/suggest.d.ts.map +1 -0
  505. package/dist/rich-text-editor/suggest.js +0 -0
  506. package/dist/rich-text-editor/suggest.js.map +1 -0
  507. package/dist/rich-text-editor/tables.d.ts +41 -0
  508. package/dist/rich-text-editor/tables.d.ts.map +1 -0
  509. package/dist/rich-text-editor/tables.js +204 -0
  510. package/dist/rich-text-editor/tables.js.map +1 -0
  511. package/dist/rich-text-editor/toolbar.d.ts +58 -0
  512. package/dist/rich-text-editor/toolbar.d.ts.map +1 -0
  513. package/dist/rich-text-editor/toolbar.js +548 -0
  514. package/dist/rich-text-editor/toolbar.js.map +1 -0
  515. package/dist/rich-text-editor/view.d.ts +368 -0
  516. package/dist/rich-text-editor/view.d.ts.map +1 -0
  517. package/dist/rich-text-editor/view.js +1968 -0
  518. package/dist/rich-text-editor/view.js.map +1 -0
  519. package/dist/rich-text-editor/virtual.d.ts +54 -0
  520. package/dist/rich-text-editor/virtual.d.ts.map +1 -0
  521. package/dist/rich-text-editor/virtual.js +279 -0
  522. package/dist/rich-text-editor/virtual.js.map +1 -0
  523. package/dist/richtext/node.d.ts +71 -4
  524. package/dist/richtext/node.d.ts.map +1 -1
  525. package/dist/richtext/node.js +233 -28
  526. package/dist/richtext/node.js.map +1 -1
  527. package/dist/richtext/runs.d.ts +13 -8
  528. package/dist/richtext/runs.d.ts.map +1 -1
  529. package/dist/richtext/runs.js +18 -8
  530. package/dist/richtext/runs.js.map +1 -1
  531. package/dist/table/index.d.ts.map +1 -1
  532. package/dist/table/index.js +23 -0
  533. package/dist/table/index.js.map +1 -1
  534. package/dist/table/rows.d.ts +3 -2
  535. package/dist/table/rows.d.ts.map +1 -1
  536. package/dist/table/rows.js +20 -6
  537. package/dist/table/rows.js.map +1 -1
  538. package/dist/terminal/backends.d.ts +4 -1
  539. package/dist/terminal/backends.d.ts.map +1 -1
  540. package/dist/terminal/backends.js.map +1 -1
  541. package/dist/terminal/index.d.ts +18 -7
  542. package/dist/terminal/index.d.ts.map +1 -1
  543. package/dist/terminal/index.js +32 -11
  544. package/dist/terminal/index.js.map +1 -1
  545. package/dist/terminal/vt/pty.d.ts +13 -2
  546. package/dist/terminal/vt/pty.d.ts.map +1 -1
  547. package/dist/terminal/vt/pty.js +18 -3
  548. package/dist/terminal/vt/pty.js.map +1 -1
  549. package/dist/terminal-output/index.d.ts.map +1 -1
  550. package/dist/terminal-output/index.js +6 -1
  551. package/dist/terminal-output/index.js.map +1 -1
  552. package/dist/three/canvas.d.ts.map +1 -1
  553. package/dist/three/canvas.js +85 -7
  554. package/dist/three/canvas.js.map +1 -1
  555. package/dist/three/events.d.ts +22 -4
  556. package/dist/three/events.d.ts.map +1 -1
  557. package/dist/three/events.js +34 -4
  558. package/dist/three/events.js.map +1 -1
  559. package/dist/tree/index.d.ts.map +1 -1
  560. package/dist/tree/index.js +17 -0
  561. package/dist/tree/index.js.map +1 -1
  562. package/package.json +59 -31
  563. package/src/charts/node.ts +68 -28
  564. package/src/charts/render.ts +120 -30
  565. package/src/code/index.ts +3 -1
  566. package/src/code-editor/completion.ts +3 -2
  567. package/src/code-editor/index.ts +19 -0
  568. package/src/code-editor/node.ts +1574 -184
  569. package/src/code-language/languages/glsl.ts +12 -2
  570. package/src/code-language/languages/javascript.ts +21 -4
  571. package/src/code-language/languages/json.ts +12 -2
  572. package/src/code-language/languages/shell.ts +12 -2
  573. package/src/code-language/languages/sql.ts +22 -2
  574. package/src/code-language/stream.ts +257 -17
  575. package/src/code-language/types.ts +5 -4
  576. package/src/codeblock/index.ts +20 -3
  577. package/src/embed/client.ts +102 -8
  578. package/src/embed/index.ts +2 -0
  579. package/src/flow/draw.ts +167 -41
  580. package/src/flow/gl/color.ts +85 -0
  581. package/src/flow/gl/index.ts +342 -0
  582. package/src/flow/gl/pack.ts +585 -0
  583. package/src/flow/gl/renderer.ts +679 -0
  584. package/src/flow/gl/shaders.ts +371 -0
  585. package/src/flow/gl/text.ts +1295 -0
  586. package/src/flow/index.ts +794 -67
  587. package/src/flow/node.ts +2496 -1256
  588. package/src/flow/paint.ts +511 -0
  589. package/src/flow/paths.ts +80 -15
  590. package/src/flow/scene.ts +2199 -0
  591. package/src/flow/types.ts +113 -1
  592. package/src/html/controls.ts +73 -2
  593. package/src/html/css/calc.ts +385 -0
  594. package/src/html/css/cascade.ts +1403 -62
  595. package/src/html/css/color.ts +755 -0
  596. package/src/html/css/content.ts +417 -0
  597. package/src/html/css/counter-styles.ts +973 -0
  598. package/src/html/css/decode.ts +130 -0
  599. package/src/html/css/parse.ts +1514 -160
  600. package/src/html/css/style.ts +4102 -222
  601. package/src/html/css/ua.ts +58 -12
  602. package/src/html/css/values.ts +150 -50
  603. package/src/html/css/vars.ts +348 -0
  604. package/src/html/dom.ts +284 -17
  605. package/src/html/fonts.ts +641 -0
  606. package/src/html/gif.ts +233 -0
  607. package/src/html/index.ts +180 -20
  608. package/src/html/layout/block.ts +3456 -230
  609. package/src/html/layout/boxes.ts +2100 -190
  610. package/src/html/layout/cache.ts +289 -0
  611. package/src/html/layout/collapse.ts +317 -0
  612. package/src/html/layout/css-grid.ts +1063 -0
  613. package/src/html/layout/flex.ts +1115 -106
  614. package/src/html/layout/floats.ts +128 -14
  615. package/src/html/layout/grid-lines.ts +141 -0
  616. package/src/html/layout/grid.ts +181 -0
  617. package/src/html/layout/inline.ts +3943 -192
  618. package/src/html/layout/shaping.ts +140 -0
  619. package/src/html/layout/table.ts +696 -186
  620. package/src/html/layout/tracks.ts +437 -0
  621. package/src/html/node.ts +1486 -121
  622. package/src/html/paint.ts +4293 -169
  623. package/src/html/resources.ts +161 -50
  624. package/src/html/surfaces.ts +81 -0
  625. package/src/html/svg.ts +493 -0
  626. package/src/html/url.ts +86 -0
  627. package/src/index.ts +4 -0
  628. package/src/internal/collate.ts +12 -0
  629. package/src/{markdown → internal/markdown}/ast.ts +35 -7
  630. package/src/{markdown → internal/markdown}/parse.ts +288 -35
  631. package/src/internal/markdown/stringify.ts +772 -0
  632. package/src/internal/prewarm.ts +45 -0
  633. package/src/internal/scroll.ts +5 -3
  634. package/src/internal/sdf.ts +227 -0
  635. package/src/internal/splice.ts +25 -0
  636. package/src/internal/window.ts +36 -5
  637. package/src/maps/anchors.ts +913 -0
  638. package/src/maps/controller.ts +1084 -0
  639. package/src/maps/gl/buckets.ts +461 -0
  640. package/src/maps/gl/build-worker.ts +66 -0
  641. package/src/maps/gl/color.ts +62 -0
  642. package/src/maps/gl/cover.ts +205 -0
  643. package/src/maps/gl/index.ts +23 -0
  644. package/src/maps/gl/markers.ts +83 -0
  645. package/src/maps/gl/overlays.ts +379 -0
  646. package/src/maps/gl/pane.ts +42 -0
  647. package/src/maps/gl/placement.ts +968 -0
  648. package/src/maps/gl/renderer.ts +1660 -0
  649. package/src/maps/gl/shaders.ts +489 -0
  650. package/src/maps/gl/store.ts +615 -0
  651. package/src/maps/gl/text.ts +868 -0
  652. package/src/maps/gl/view.ts +1489 -0
  653. package/src/maps/icons.ts +183 -0
  654. package/src/maps/index.ts +274 -81
  655. package/src/maps/labels.ts +457 -144
  656. package/src/maps/node.ts +832 -665
  657. package/src/maps/overlay.ts +148 -43
  658. package/src/maps/paint.ts +3 -0
  659. package/src/maps/proj.ts +118 -0
  660. package/src/maps/renderer.ts +155 -0
  661. package/src/maps/sources.ts +43 -6
  662. package/src/maps/style.ts +32 -0
  663. package/src/maps/styles.ts +215 -4
  664. package/src/maps/theme.ts +51 -0
  665. package/src/maps/tiles.ts +253 -62
  666. package/src/maps/types.ts +213 -21
  667. package/src/markdown/expressions.ts +5 -1
  668. package/src/markdown/index.ts +163 -78
  669. package/src/markdown/spans.ts +6 -1
  670. package/src/media-player/index.ts +18 -4
  671. package/src/qml/containers.tsx +6 -1
  672. package/src/qml/interaction.tsx +42 -5
  673. package/src/qml/layouts.tsx +21 -6
  674. package/src/qml/qtquick.tsx +9 -2
  675. package/src/qml/react.tsx +7 -5
  676. package/src/reorder/clock.ts +27 -0
  677. package/src/reorder/index.ts +100 -27
  678. package/src/rich-text-editor/clipboard.ts +439 -0
  679. package/src/rich-text-editor/collab.ts +91 -0
  680. package/src/rich-text-editor/commands.ts +448 -0
  681. package/src/rich-text-editor/dom-globals.d.ts +23 -0
  682. package/src/rich-text-editor/drag.ts +211 -0
  683. package/src/rich-text-editor/html.ts +619 -0
  684. package/src/rich-text-editor/index.ts +1364 -0
  685. package/src/rich-text-editor/inline.ts +345 -0
  686. package/src/rich-text-editor/keymap.ts +510 -0
  687. package/src/rich-text-editor/keys.ts +228 -0
  688. package/src/rich-text-editor/look.ts +427 -0
  689. package/src/rich-text-editor/markdown.ts +653 -0
  690. package/src/rich-text-editor/marks.ts +101 -0
  691. package/src/rich-text-editor/nodes.ts +497 -0
  692. package/src/rich-text-editor/render.ts +837 -0
  693. package/src/rich-text-editor/schema.ts +431 -0
  694. package/src/rich-text-editor/store.ts +39 -0
  695. package/src/rich-text-editor/suggest.ts +597 -0
  696. package/src/rich-text-editor/tables.ts +272 -0
  697. package/src/rich-text-editor/toolbar.ts +724 -0
  698. package/src/rich-text-editor/view.ts +2287 -0
  699. package/src/rich-text-editor/virtual.ts +372 -0
  700. package/src/richtext/node.ts +294 -44
  701. package/src/richtext/runs.ts +23 -12
  702. package/src/table/index.ts +29 -0
  703. package/src/table/rows.ts +18 -8
  704. package/src/terminal/backends.ts +4 -1
  705. package/src/terminal/index.ts +47 -15
  706. package/src/terminal/vt/pty.ts +16 -2
  707. package/src/terminal-output/index.ts +6 -1
  708. package/src/three/canvas.ts +102 -8
  709. package/src/three/events.ts +49 -9
  710. package/src/tree/index.ts +19 -0
  711. package/dist/markdown/ast.d.ts.map +0 -1
  712. package/dist/markdown/ast.js +0 -17
  713. package/dist/markdown/ast.js.map +0 -1
  714. package/dist/markdown/parse.d.ts.map +0 -1
  715. package/dist/markdown/parse.js.map +0 -1
  716. package/dist/markdown/tags.d.ts.map +0 -1
  717. package/dist/markdown/tags.js.map +0 -1
  718. /package/dist/{markdown → internal/markdown}/parse.d.ts +0 -0
  719. /package/dist/{markdown → internal/markdown}/tags.d.ts +0 -0
  720. /package/dist/{markdown → internal/markdown}/tags.js +0 -0
  721. /package/src/{markdown → internal/markdown}/tags.ts +0 -0
@@ -0,0 +1,1063 @@
1
+ // `display: grid`, the subset documents are written in (CSS Grid 1).
2
+ //
3
+ // Tailwind's `grid grid-cols-3 gap-4`, a card list of `repeat(auto-fill,
4
+ // minmax(16rem, 1fr))`, a sidebar and a column in `16rem 1fr`, a page of
5
+ // `auto 1fr auto` rows: tracks of lengths, percentages, `fr`s, `auto`,
6
+ // `minmax()` and `fit-content()`, with `repeat()` by a count or by what
7
+ // fits, sized by what is in them as the track sizing algorithm has it
8
+ // (`tracks.ts`); items placed by line, span, name or area, or in order into
9
+ // the first cell free along the rows or down the columns, `dense` or not
10
+ // (the lines and their names are `grid-lines.ts`'s); gaps; the tracks
11
+ // placed by `justify-content` and `align-content`; and each item stretched
12
+ // to its area or aligned in it. Not here: subgrids, and baseline
13
+ // alignment.
14
+ //
15
+ // A grid container is a flex container to the box tree (`display: grid`
16
+ // reads as `flex` and sets `ComputedStyle.grid`): its children are the
17
+ // same blockified items, it holds its floats, and `flex.ts` hands it here.
18
+ // Unlike flex, the algorithm is written out rather than handed to Yoga,
19
+ // which has none; what it needs of an item — its width at no limit and at
20
+ // the smallest, and its height at a width — is what tables already ask.
21
+ import { AUTO, gapOf, isPct, resolve, resolveOrNull } from '../css/values.js';
22
+ import type { Len } from '../css/values.js';
23
+ import type {
24
+ ComputedStyle,
25
+ ContentSize,
26
+ GridTemplate,
27
+ GridTrack,
28
+ } from '../css/style.js';
29
+ import { scrolls } from '../css/style.js';
30
+ import { Box, GRID_TRACKS, isBlank } from './boxes.js';
31
+ import {
32
+ FLEXED_HEIGHT,
33
+ MIN_CONTENT_PROBE,
34
+ clampHeight,
35
+ clampWidth,
36
+ exactMinContent,
37
+ heightThroughRatio,
38
+ measureIntrinsicWidth,
39
+ moveTo,
40
+ percentBaseInside,
41
+ percentHeightsIn,
42
+ positionOutOfFlow,
43
+ resolveEdges,
44
+ widthThroughRatio,
45
+ } from './block.js';
46
+ import type { LayoutContext } from './block.js';
47
+ import { gridLines, placement } from './grid-lines.js';
48
+ import type { GridLines } from './grid-lines.js';
49
+ import { sizeTracks } from './tracks.js';
50
+ import type { SizingTrack, TrackItem, TrackMax, TrackMin } from './tracks.js';
51
+
52
+ interface Item {
53
+ box: Box;
54
+ col: number;
55
+ cols: number;
56
+ row: number;
57
+ rows: number;
58
+ /** Min-content and max-content widths, margin box, taken when asked. */
59
+ min: number;
60
+ max: number;
61
+ }
62
+
63
+ /**
64
+ * Lay out a grid container's children. Returns the content height.
65
+ */
66
+ export function layoutGrid(
67
+ box: Box,
68
+ ctx: LayoutContext,
69
+ contentWidth: number,
70
+ ): number {
71
+ const style = box.style;
72
+ const boxes: Box[] = [];
73
+ for (const child of box.children) {
74
+ if (child.kind === 'text' && isBlank(child.text)) continue;
75
+ if (child.outOfFlow) {
76
+ // where it is as the grid's one item, in an area whose edges are the
77
+ // grid's padding edges (9.1)
78
+ positionOutOfFlow(child, box, ctx, false);
79
+ continue;
80
+ }
81
+ resolveEdges(child, Number.isFinite(contentWidth) ? contentWidth : 0);
82
+ boxes.push(child);
83
+ }
84
+ // the gaps: a percentage of the grid's content size along them, and of
85
+ // nothing where that is not known yet (CSS Box Alignment 3, 8.3)
86
+ const colGap = gapOf(style.columnGap, contentWidth);
87
+ let rowGap = gapOf(style.rowGap, percentBaseInside(box));
88
+
89
+ // the explicit grid: the templates' tracks, and as many more as the
90
+ // areas need, sized as the ones the placement makes past it are
91
+ const areas = style.gridAreas;
92
+ // a height of the grid's own, which the rows' `repeat()` counts against
93
+ const definite = percentBaseInside(box);
94
+ const template = trackList(style.gridColumns, contentWidth, colGap);
95
+ const rowList = trackList(style.gridRows, definite, rowGap);
96
+ const explicitCols = Math.max(template.tracks.length, areas?.columns ?? 0);
97
+ const explicitRows = Math.max(rowList.tracks.length, areas?.rows ?? 0);
98
+ const colLines = gridLines(explicitCols, template.names, areas, 'columns');
99
+ const rowLines = gridLines(explicitRows, rowList.names, areas, 'rows');
100
+ const items = place(boxes, colLines, rowLines, style.gridAutoFlow);
101
+ // every row the explicit grid has, whether or not an item is in it
102
+ const allRows = items.reduce(
103
+ (n, item) => Math.max(n, item.row + item.rows),
104
+ explicitRows,
105
+ );
106
+ const explicit = rowList.tracks;
107
+ const cols = template.tracks.slice();
108
+ // an item placed past the explicit grid makes tracks of its own
109
+ const widest = items.reduce(
110
+ (n, item) => Math.max(n, item.col + item.cols),
111
+ Math.max(1, explicitCols),
112
+ );
113
+ while (cols.length < widest) cols.push(style.gridAutoColumns);
114
+ // An `auto-fit` repetition no item is in collapses (7.2.3.2): it is out
115
+ // of the sizing and the distribution, and the gaps on either side of it
116
+ // are one. The items are placed in the tracks that stay, and the ones
117
+ // that go are put back as nothing where the lines are read.
118
+ const keepCols = keptTracks(cols.length, template.fit, items, true);
119
+ const keepRows = keptTracks(allRows, rowList.fit, items, false);
120
+ const rowDefs: GridTrack[] = [];
121
+ for (let r = 0; r < allRows; r += 1) {
122
+ if (keepRows?.[r] ?? true) rowDefs.push(explicit[r] ?? style.gridAutoRows);
123
+ }
124
+ if (keepCols) {
125
+ const kept = cols.filter((_, c) => keepCols[c]);
126
+ cols.length = 0;
127
+ cols.push(...kept);
128
+ }
129
+ if (keepCols || keepRows) {
130
+ const colAt = indexOfKept(keepCols);
131
+ const rowAt = indexOfKept(keepRows);
132
+ for (const item of items) {
133
+ if (colAt) item.col = colAt[item.col];
134
+ if (rowAt) item.row = rowAt[item.row];
135
+ }
136
+ }
137
+ const rowCount = rowDefs.length;
138
+ // While the columns are sized, a row whose greatest size is a length is
139
+ // that size, and any other has none (CSS Grid 1, 12.1): what an item's
140
+ // height is then, where it is one — which a ratio makes a width of
141
+ const fixedRows: (number | null)[] = [];
142
+ for (let r = 0; r < rowCount; r += 1) {
143
+ const { max } = sizing(rowDefs[r], definite);
144
+ fixedRows.push(typeof max === 'number' ? max : null);
145
+ }
146
+ const spanBefore = (item: Item): number => {
147
+ let span = rowGap * Math.max(0, item.rows - 1);
148
+ for (let r = item.row; r < item.row + item.rows; r += 1) {
149
+ const fixed = fixedRows[r];
150
+ if (fixed === null || fixed === undefined) return NaN;
151
+ span += fixed;
152
+ }
153
+ return span;
154
+ };
155
+ const heightBefore = (item: Item): number | null =>
156
+ heightBeforeRows(item.box, spanBefore(item));
157
+ // An item's percentage heights are of its area's, which the rows it
158
+ // spans are, rather than the grid's: of that where they are known now,
159
+ // and of nothing — `auto` — where they are not, until they are
160
+ for (const item of items) item.box.percentHeightBase = spanBefore(item);
161
+
162
+ const measure = (item: Item): void => {
163
+ if (item.max >= 0) return;
164
+ const box = item.box;
165
+ const margins = box.marginLeft + box.marginRight;
166
+ // Measured once in the box's life, as a table cell's are: measured for
167
+ // every layout of the grid, a grid in a grid in a grid laid out its
168
+ // innermost three times a level, and twelve levels took two thirds of
169
+ // a second.
170
+ const style = box.style;
171
+ let widest: number;
172
+ let narrowest: number;
173
+ if (typeof style.width === 'number') {
174
+ // a length for a width is its width at its narrowest and its widest
175
+ // — measured at no limit, it was its content's
176
+ const extra = style.boxSizing === 'border-box' ? 0 : box.horizontalExtra;
177
+ widest = narrowest = Math.max(style.width + extra, box.horizontalExtra);
178
+ } else {
179
+ const fresh = box.intrinsicMaxContent < 0;
180
+ widest = maxContentOf(box, ctx);
181
+ if (box.intrinsicMinContent < 0) {
182
+ // where its words say it exactly, read from the layout just made —
183
+ // which is the max-content one only if it was made just now
184
+ const exact =
185
+ fresh && ctx.fonts ? exactMinContent(box, ctx.fonts) : null;
186
+ box.intrinsicMinContent =
187
+ exact ?? measureIntrinsicWidth(box, ctx, MIN_CONTENT_PROBE);
188
+ }
189
+ narrowest = box.intrinsicMinContent;
190
+ }
191
+ // an item with a ratio and a height is as wide as that makes it, its
192
+ // content's sizes both (CSS Sizing 4, 5.1) — and one that is not
193
+ // replaced no narrower for it than its content at its narrowest, where
194
+ // it shows what overflows it (5.2). A scroll container's sizes are
195
+ // none of its content's, and take nothing from its ratio either.
196
+ if (
197
+ typeof style.width !== 'number' &&
198
+ (box.kind === 'replaced' || !scrolls(style))
199
+ ) {
200
+ const tall = heightBefore(item);
201
+ const wide = tall === null ? null : widthThroughRatio(box, tall);
202
+ if (wide !== null) {
203
+ widest = narrowest =
204
+ box.kind === 'replaced' || !showsOverflow(box)
205
+ ? wide
206
+ : Math.max(wide, narrowest);
207
+ }
208
+ }
209
+ // a width of its content's is that at its narrowest and its widest
210
+ if (style.widthKeyword === 'min-content') widest = narrowest;
211
+ else if (style.widthKeyword === 'max-content') narrowest = widest;
212
+ // within its own least and greatest widths
213
+ const [least, most] = ownWidths(box, narrowest, widest);
214
+ item.max = Math.min(most, Math.max(least, widest)) + margins;
215
+ item.min = Math.min(most, Math.max(least, narrowest)) + margins;
216
+ };
217
+ const colTracks = cols.map((track) => sizing(track, contentWidth));
218
+ const widths = sizeTracks(
219
+ colTracks,
220
+ items.map((item): TrackItem => ({
221
+ start: item.col,
222
+ span: item.cols,
223
+ minContent: () => (measure(item), item.min),
224
+ maxContent: () => (measure(item), item.max),
225
+ minimum: () => leastWidth(item, colTracks, colGap, measure),
226
+ })),
227
+ {
228
+ available: contentWidth,
229
+ least: 0,
230
+ gap: colGap,
231
+ stretch:
232
+ style.justifyContent === 'normal' || style.justifyContent === 'stretch',
233
+ },
234
+ );
235
+ const lefts = starts(widths, colGap, style.justifyContent, contentWidth);
236
+
237
+ // each item at its area's width, for its height
238
+ for (const item of items) {
239
+ layoutItem(
240
+ item,
241
+ extent(widths, lefts, item.col, item.cols),
242
+ ctx,
243
+ heightBefore(item),
244
+ );
245
+ }
246
+
247
+ // a height of the grid's own, or else the least it may be, which the
248
+ // `fr` rows and the `auto` ones fill
249
+ const own = Number.isFinite(definite);
250
+ const least = own ? 0 : leastHeight(box);
251
+ // the rows against a height: percentages of it, or `auto` without one
252
+ const sizeRows = (base: number, available: number, atLeast: number) => {
253
+ const rowTracks: SizingTrack[] = [];
254
+ for (let r = 0; r < rowCount; r += 1) {
255
+ rowTracks.push(sizing(rowDefs[r], base));
256
+ }
257
+ return sizeTracks(
258
+ rowTracks,
259
+ items.map((item) => rowItem(item, rowTracks, rowGap)),
260
+ {
261
+ available,
262
+ least: atLeast,
263
+ gap: rowGap,
264
+ stretch: style.alignContent === 'stretch',
265
+ },
266
+ );
267
+ };
268
+ let heights = sizeRows(definite, own ? definite : Infinity, least);
269
+ // with no height of its own, the grid is as tall as its rows come to with
270
+ // their percentages `auto`, and the percentages are of that (7.2.1)
271
+ if (!own && [...explicit, style.gridAutoRows].some(percentTrack)) {
272
+ let tall = rowGap * Math.max(0, heights.length - 1);
273
+ for (const h of heights) tall += h;
274
+ tall = Math.max(tall, least);
275
+ heights = sizeRows(tall, tall, 0);
276
+ }
277
+ let height = rowGap * Math.max(0, heights.length - 1);
278
+ for (const h of heights) height += h;
279
+ // with no height of its own, a percentage gap is of the height its rows
280
+ // come to without it, and the rows are placed with it where the grid is
281
+ // that tall
282
+ if (!own && isPct(style.rowGap)) {
283
+ rowGap = gapOf(style.rowGap, Math.max(height, least));
284
+ }
285
+ // the rows are placed in the grid's height — which one from its
286
+ // `aspect-ratio` grows to what it holds (CSS Sizing 4, 5.2) — or with no
287
+ // height of its own, in its least height or its rows'
288
+ const grows =
289
+ own &&
290
+ style.height === AUTO &&
291
+ style.aspectRatio !== null &&
292
+ style.minHeight === AUTO;
293
+ const room =
294
+ own && !grows ? definite : Math.max(own ? definite : least, height);
295
+ const tops = starts(heights, rowGap, style.alignContent, room);
296
+ // an item that takes a percentage of its area's height, which is known
297
+ // now, is laid out again with it
298
+ for (const item of items) {
299
+ const child = item.box;
300
+ const tall = extent(heights, tops, item.row, item.rows);
301
+ if (Object.is(child.percentHeightBase, tall) || !percentOwn(child))
302
+ continue;
303
+ child.percentHeightBase = tall;
304
+ layoutItem(
305
+ item,
306
+ extent(widths, lefts, item.col, item.cols),
307
+ ctx,
308
+ heightBeforeRows(child, tall),
309
+ );
310
+ }
311
+ GRID_TRACKS.set(box, {
312
+ cols: tracksOf(widths, lefts, keepCols),
313
+ rows: tracksOf(heights, tops, keepRows),
314
+ colLines,
315
+ rowLines,
316
+ });
317
+
318
+ for (const item of items) {
319
+ const child = item.box;
320
+ const area = extent(widths, lefts, item.col, item.cols);
321
+ const tall = extent(heights, tops, item.row, item.rows);
322
+ const justify =
323
+ child.style.justifySelf === 'auto'
324
+ ? style.justifyItems
325
+ : child.style.justifySelf;
326
+ const align =
327
+ child.style.alignSelf === AUTO ? style.alignItems : child.style.alignSelf;
328
+ const outerWidth = child.width + child.marginLeft + child.marginRight;
329
+ const outerHeight = child.height + child.marginTop + child.marginBottom;
330
+ // `auto` margins take the free space in the area first (CSS Grid 1,
331
+ // 10.2), and an item with them is not stretched
332
+ const [left, right] = autoMargins(child, 'x');
333
+ const [top, bottom] = autoMargins(child, 'y');
334
+ let dx = 0;
335
+ if (left || right) {
336
+ dx = (area - outerWidth) * (left && right ? 0.5 : left ? 1 : 0);
337
+ } else if (justify === 'center') dx = (area - outerWidth) / 2;
338
+ else if (justify === 'flex-end') dx = area - outerWidth;
339
+ let dy = 0;
340
+ if (top || bottom) {
341
+ dy = (tall - outerHeight) * (top && bottom ? 0.5 : top ? 1 : 0);
342
+ } else if (align === 'center') dy = (tall - outerHeight) / 2;
343
+ else if (align === 'flex-end') dy = tall - outerHeight;
344
+ else if (
345
+ (align === 'stretch' || align === 'baseline') &&
346
+ child.style.height === AUTO &&
347
+ !child.style.heightKeyword &&
348
+ (child.style.alignSelf === 'stretch' ||
349
+ (child.kind !== 'replaced' && !child.style.aspectRatio))
350
+ ) {
351
+ // a stretched item is its area's height, within its own least and
352
+ // greatest (10.3): taller than what it holds, or shorter where its
353
+ // tracks let it be, what it holds then running past it. An image, a
354
+ // control or a box with an `aspect-ratio` keeps its own height, as
355
+ // `normal` has one with a natural size or a ratio — which is what
356
+ // the grid's `stretch` may be, and the item's own may not.
357
+ const stretched = tall - child.marginTop - child.marginBottom;
358
+ const height = clampHeight(
359
+ child,
360
+ Math.max(stretched, child.verticalExtra),
361
+ );
362
+ // and one with a ratio that is not stretched across is as wide as
363
+ // that height makes it (CSS Sizing 4, 5.1)
364
+ const wide =
365
+ child.style.width === AUTO &&
366
+ !child.style.widthKeyword &&
367
+ !(justify === 'stretch' && !left && !right) &&
368
+ height !== child.height
369
+ ? widthThroughRatio(child, height)
370
+ : null;
371
+ const width =
372
+ wide === null ? child.width : clampWidth(child, wide, area, ctx);
373
+ // what is in it takes its percentages of that height, which a
374
+ // stretch makes definite, as it does a flex item's
375
+ if (
376
+ child.kind !== 'replaced' &&
377
+ (wide !== null || percentHeightsIn(child))
378
+ ) {
379
+ FLEXED_HEIGHT.set(child, Math.max(0, height - child.verticalExtra));
380
+ try {
381
+ ctx.layoutSubtree(child, width);
382
+ } finally {
383
+ FLEXED_HEIGHT.delete(child);
384
+ }
385
+ }
386
+ child.width = width;
387
+ child.height = height;
388
+ }
389
+ moveTo(
390
+ child,
391
+ box.contentX + lefts[item.col] + child.marginLeft + Math.max(0, dx),
392
+ box.contentY + tops[item.row] + child.marginTop + Math.max(0, dy),
393
+ );
394
+ }
395
+ return height;
396
+ }
397
+
398
+ /** An axis's explicit tracks and the names of their lines, a `repeat()`
399
+ * of what fits counted out against its size where it has one, and once
400
+ * where it has none (CSS Grid 1, 7.2.3.2). */
401
+ function trackList(
402
+ template: GridTemplate | null,
403
+ width: number,
404
+ gap: number,
405
+ ): {
406
+ tracks: GridTrack[];
407
+ names: string[][];
408
+ /** The tracks an `auto-fit` repeated, from and to. */
409
+ fit: [number, number] | null;
410
+ } {
411
+ if (!template) return { tracks: [], names: [[]], fit: null };
412
+ const { repeat } = template;
413
+ if (!repeat) {
414
+ return { tracks: template.tracks, names: template.names, fit: null };
415
+ }
416
+ const outer = template.tracks;
417
+ const unit = repeat.tracks;
418
+ // what one repetition takes: its tracks' maximums where those are
419
+ // lengths, and their minimums where not (7.2.3.2)
420
+ const base = Number.isFinite(width) ? width : 0;
421
+ const fixed = (track: GridTrack): number =>
422
+ lengthOf(track.max, base) ?? lengthOf(track.min, base) ?? 0;
423
+ const others = outer.reduce((sum, t) => sum + fixed(t), 0);
424
+ const each = unit.reduce((sum, t) => sum + fixed(t), 0);
425
+ let count = 1;
426
+ if (Number.isFinite(width) && each > 0) {
427
+ const room = width - others - gap * outer.length;
428
+ count = Math.max(1, Math.floor((room + gap) / (each + gap * unit.length)));
429
+ }
430
+ // the repetitions' lines where they meet carry the names of both sides
431
+ const tracks: GridTrack[] = [];
432
+ const names: string[][] = [];
433
+ for (let i = 0; i < repeat.at; i += 1) {
434
+ names.push(template.names[i]);
435
+ tracks.push(outer[i]);
436
+ }
437
+ let line = [...template.names[repeat.at]];
438
+ for (let k = 0; k < Math.min(count, 1000); k += 1) {
439
+ line.push(...repeat.names[0]);
440
+ for (let j = 0; j < unit.length; j += 1) {
441
+ names.push(line);
442
+ tracks.push(unit[j]);
443
+ line = [...repeat.names[j + 1]];
444
+ }
445
+ }
446
+ line.push(...repeat.after);
447
+ for (let i = repeat.at; i < outer.length; i += 1) {
448
+ names.push(line);
449
+ tracks.push(outer[i]);
450
+ line = [...template.names[i + 1]];
451
+ }
452
+ names.push(line);
453
+ const repeated = Math.min(count, 1000) * unit.length;
454
+ return {
455
+ tracks,
456
+ names,
457
+ fit: repeat.fit ? [repeat.at, repeat.at + repeated] : null,
458
+ };
459
+ }
460
+
461
+ /**
462
+ * Place the items (CSS Grid 1, 8.5): an item with both its lines where it
463
+ * says; one that names only the lines across the flow — its row, where the
464
+ * grid fills its rows — in the first place free along them, past the ones
465
+ * placed there before it; and the rest in order from a cursor that moves
466
+ * along the flow and on to the next line of it — to the next where an
467
+ * item's own line is before it — or, `dense`, from the start each time.
468
+ * `grid-auto-flow: column` is the same with the axes turned round.
469
+ */
470
+ function place(
471
+ boxes: Box[],
472
+ cols: GridLines,
473
+ rows: GridLines,
474
+ flow: ComputedStyle['gridAutoFlow'],
475
+ ): Item[] {
476
+ const byColumn = flow.startsWith('column');
477
+ const dense = flow.endsWith('dense');
478
+ // in the flow's terms: `a` along it, `b` across it
479
+ const taken: boolean[][] = [];
480
+ const free = (b: number, a: number, bs: number, as: number) => {
481
+ for (let r = b; r < b + bs; r += 1) {
482
+ for (let c = a; c < a + as; c += 1) if (taken[r]?.[c]) return false;
483
+ }
484
+ return true;
485
+ };
486
+ const take = (b: number, a: number, bs: number, as: number) => {
487
+ for (let r = b; r < b + bs; r += 1) {
488
+ const line = (taken[r] ??= []);
489
+ for (let c = a; c < a + as; c += 1) line[c] = true;
490
+ }
491
+ };
492
+ const placed = boxes.map((box) => {
493
+ const style = box.style;
494
+ const [col, colSpan] = placement(
495
+ style.gridColumnStart,
496
+ style.gridColumnEnd,
497
+ cols,
498
+ );
499
+ const [row, rowSpan] = placement(
500
+ style.gridRowStart,
501
+ style.gridRowEnd,
502
+ rows,
503
+ );
504
+ return byColumn
505
+ ? { box, a: row ?? -1, as: rowSpan, b: col ?? -1, bs: colSpan }
506
+ : { box, a: col ?? -1, as: colSpan, b: row ?? -1, bs: rowSpan };
507
+ });
508
+ // 1. what says both where it goes
509
+ for (const p of placed) if (p.a >= 0 && p.b >= 0) take(p.b, p.a, p.bs, p.as);
510
+ // 2. what says only which line of the flow
511
+ const past = new Map<number, number>();
512
+ for (const p of placed) {
513
+ if (p.b < 0 || p.a >= 0) continue;
514
+ let a = dense ? 0 : (past.get(p.b) ?? 0);
515
+ while (!free(p.b, a, p.bs, p.as) && a < 10_000) a += 1;
516
+ p.a = a;
517
+ take(p.b, a, p.bs, p.as);
518
+ past.set(p.b, a + p.as);
519
+ }
520
+ // 3. how long a line of the flow is: the explicit grid's, and as long as
521
+ // the items with a place along it and the longest span without one need
522
+ let length = byColumn ? rows.tracks : cols.tracks;
523
+ for (const p of placed)
524
+ length = Math.max(length, p.a >= 0 ? p.a + p.as : p.as);
525
+ // 4. the rest, in order, from the cursor
526
+ let cursorB = 0;
527
+ let cursorA = 0;
528
+ for (const p of placed) {
529
+ if (p.b >= 0) continue;
530
+ if (dense) {
531
+ cursorB = 0;
532
+ cursorA = 0;
533
+ }
534
+ if (p.a >= 0) {
535
+ let b = p.a < cursorA ? cursorB + 1 : cursorB;
536
+ while (!free(b, p.a, p.bs, p.as)) b += 1;
537
+ p.b = b;
538
+ } else {
539
+ let b = cursorB;
540
+ let a = cursorA;
541
+ for (;;) {
542
+ if (a + p.as > length) {
543
+ b += 1;
544
+ a = 0;
545
+ continue;
546
+ }
547
+ if (free(b, a, p.bs, p.as)) break;
548
+ a += 1;
549
+ }
550
+ p.b = b;
551
+ p.a = a;
552
+ }
553
+ take(p.b, p.a, p.bs, p.as);
554
+ cursorB = p.b;
555
+ cursorA = p.a + p.as;
556
+ }
557
+ return placed.map((p) =>
558
+ byColumn
559
+ ? {
560
+ box: p.box,
561
+ row: p.a,
562
+ rows: p.as,
563
+ col: p.b,
564
+ cols: p.bs,
565
+ min: -1,
566
+ max: -1,
567
+ }
568
+ : {
569
+ box: p.box,
570
+ row: p.b,
571
+ rows: p.bs,
572
+ col: p.a,
573
+ cols: p.as,
574
+ min: -1,
575
+ max: -1,
576
+ },
577
+ );
578
+ }
579
+
580
+ /** A track's minimum or maximum where it is a length or a percentage of
581
+ * `base`, never below zero; null where it is content or an `fr`. */
582
+ function lengthOf(
583
+ len: GridTrack['min'] | GridTrack['max'],
584
+ base: number,
585
+ ): number | null {
586
+ if (typeof len === 'number') return Math.max(0, len);
587
+ if (
588
+ typeof len === 'object' &&
589
+ len !== null &&
590
+ !('fr' in len) &&
591
+ !('fit' in len) &&
592
+ isPct(len)
593
+ ) {
594
+ return Math.max(0, resolve(len, base));
595
+ }
596
+ return null;
597
+ }
598
+
599
+ /** The size of the tracks from one to `count` after it, the gaps and the
600
+ * space distributed between them included. */
601
+ function extent(
602
+ sizes: number[],
603
+ at: number[],
604
+ from: number,
605
+ count: number,
606
+ ): number {
607
+ const last = Math.min(sizes.length, from + count) - 1;
608
+ return last < from ? 0 : at[last] + sizes[last] - at[from];
609
+ }
610
+
611
+ /** An item's max-content width, its border box's: measured once in the
612
+ * box's life, as a table cell's is (`Box.intrinsicMaxContent`). */
613
+ function maxContentOf(box: Box, ctx: LayoutContext): number {
614
+ if (box.intrinsicMaxContent < 0) {
615
+ box.intrinsicMaxContent = measureIntrinsicWidth(box, ctx, Infinity);
616
+ }
617
+ return box.intrinsicMaxContent;
618
+ }
619
+
620
+ /** Lay an item out in its area: stretched across it where its width is
621
+ * `auto` and it is stretched, or at its content's width, no wider than
622
+ * the area, where it is aligned instead. */
623
+ function layoutItem(
624
+ item: Item,
625
+ area: number,
626
+ ctx: LayoutContext,
627
+ /** Its border box's height before the rows are sized, where it has one. */
628
+ tall: number | null,
629
+ ): void {
630
+ const child = item.box;
631
+ const style = child.style;
632
+ const parent = child.parent?.style;
633
+ const justify =
634
+ style.justifySelf === 'auto'
635
+ ? (parent?.justifyItems ?? 'normal')
636
+ : style.justifySelf;
637
+ const margins = child.marginLeft + child.marginRight;
638
+ const room = Math.max(0, area - margins);
639
+ // its content's widths, border box: measured once in its life
640
+ const content = (): [number, number] => {
641
+ if (child.intrinsicMaxContent < 0) maxContentOf(child, ctx);
642
+ if (child.intrinsicMinContent < 0) {
643
+ child.intrinsicMinContent = measureIntrinsicWidth(
644
+ child,
645
+ ctx,
646
+ MIN_CONTENT_PROBE,
647
+ );
648
+ }
649
+ return [child.intrinsicMinContent, child.intrinsicMaxContent];
650
+ };
651
+ const keyword = style.widthKeyword;
652
+ // `stretch` fills its area, and so does `normal` but for a replaced
653
+ // element, which it sizes as a block's is: a box with a ratio is as wide
654
+ // as a block would be where it has no height yet (CSS Grid 1, 6.2)
655
+ const across =
656
+ (justify === 'stretch' ||
657
+ (justify === 'normal' && child.kind !== 'replaced')) &&
658
+ !autoMargins(child, 'x').some(Boolean);
659
+ // a height it has already, through a ratio: its width, whatever its
660
+ // content says, where `stretch` does not fill its area (CSS Sizing 4,
661
+ // 5.1)
662
+ const fills = justify === 'stretch' && !autoMargins(child, 'x').some(Boolean);
663
+ const through =
664
+ style.width === AUTO && !fills && tall !== null
665
+ ? widthThroughRatio(child, tall)
666
+ : null;
667
+ let width: number;
668
+ if (style.width !== AUTO) {
669
+ const extra = style.boxSizing === 'border-box' ? 0 : child.horizontalExtra;
670
+ width = resolve(style.width, area, room - extra) + extra;
671
+ } else if (through !== null) {
672
+ width = clampWidth(child, through, area, ctx);
673
+ // and no narrower than its content where it shows what overflows it
674
+ // (5.2), as a block with a ratio is
675
+ if (child.kind !== 'replaced' && showsOverflow(child) && !keyword) {
676
+ width = Math.max(width, content()[0]);
677
+ }
678
+ } else if (keyword) {
679
+ // a width of its content's is that, whatever aligns it
680
+ const [narrowest, widest] = content();
681
+ const fit =
682
+ typeof keyword === 'object'
683
+ ? resolve(keyword.fit, area, room) + child.horizontalExtra
684
+ : room;
685
+ width =
686
+ keyword === 'stretch'
687
+ ? room
688
+ : keyword === 'min-content'
689
+ ? narrowest
690
+ : keyword === 'max-content'
691
+ ? widest
692
+ : Math.min(widest, Math.max(narrowest, fit));
693
+ } else if (across) {
694
+ width = room;
695
+ } else {
696
+ // fit-content: no wider than its content at its widest, nor narrower
697
+ // than at its narrowest, which may run past its area
698
+ const [narrowest, widest] = content();
699
+ width = Math.min(widest, Math.max(narrowest, room));
700
+ }
701
+ if (child.kind !== 'replaced') {
702
+ ctx.layoutSubtree(child, width);
703
+ return;
704
+ }
705
+ // a replaced element sizes itself from its style: then it is given the
706
+ // width it was stretched to, or the one its height makes, and the height
707
+ // its ratio makes of that width where it has none of its own
708
+ ctx.layoutSubtree(child, area);
709
+ if (style.width !== AUTO || keyword) return;
710
+ if (through !== null) {
711
+ child.width = width;
712
+ child.height = tall!;
713
+ } else if (fills) {
714
+ child.width = clampWidth(child, width, area, ctx);
715
+ const down =
716
+ style.height === AUTO ? heightThroughRatio(child, child.width) : null;
717
+ if (down !== null) child.height = clampHeight(child, down);
718
+ }
719
+ }
720
+
721
+ /** Whether a box's content is its least size through a ratio, which it is
722
+ * where the box shows what overflows it and its least width is `auto`
723
+ * (CSS Sizing 4, 5.2). */
724
+ function showsOverflow(box: Box): boolean {
725
+ const style = box.style;
726
+ return (
727
+ style.minWidth === AUTO &&
728
+ !style.minWidthKeyword &&
729
+ (style.overflowX === 'visible' || style.overflowX === 'clip') &&
730
+ (style.overflowY === 'visible' || style.overflowY === 'clip')
731
+ );
732
+ }
733
+
734
+ /** Which tracks of an axis stay: all but those of an `auto-fit`
735
+ * repetition that no item is in, which collapse (CSS Grid 1, 7.2.3.2).
736
+ * Null where they all stay. */
737
+ function keptTracks(
738
+ count: number,
739
+ fit: [number, number] | null,
740
+ items: readonly Item[],
741
+ columns: boolean,
742
+ ): boolean[] | null {
743
+ if (!fit) return null;
744
+ const used = new Array<boolean>(count).fill(false);
745
+ for (const item of items) {
746
+ const from = columns ? item.col : item.row;
747
+ const span = columns ? item.cols : item.rows;
748
+ for (let t = from; t < Math.min(count, from + span); t += 1) used[t] = true;
749
+ }
750
+ let collapsed = false;
751
+ const keep = used.map((inUse, t) => {
752
+ const stays = inUse || t < fit[0] || t >= fit[1];
753
+ if (!stays) collapsed = true;
754
+ return stays;
755
+ });
756
+ return collapsed ? keep : null;
757
+ }
758
+
759
+ /** Where each track that stays is among those that do. */
760
+ function indexOfKept(keep: boolean[] | null): number[] | null {
761
+ if (!keep) return null;
762
+ const at: number[] = [];
763
+ let n = 0;
764
+ for (const stays of keep) {
765
+ at.push(n);
766
+ if (stays) n += 1;
767
+ }
768
+ return at;
769
+ }
770
+
771
+ /** Each track's start and end, the collapsed ones back among the others
772
+ * as nothing, at the end of the one before. */
773
+ function tracksOf(
774
+ sizes: number[],
775
+ at: number[],
776
+ keep: boolean[] | null,
777
+ ): [number, number][] {
778
+ if (!keep) return sizes.map((size, i) => [at[i], at[i] + size]);
779
+ const out: [number, number][] = [];
780
+ let edge = at.length ? at[0] : 0;
781
+ let k = 0;
782
+ for (const stays of keep) {
783
+ if (stays) {
784
+ out.push([at[k], at[k] + sizes[k]]);
785
+ edge = at[k] + sizes[k];
786
+ k += 1;
787
+ } else out.push([edge, edge]);
788
+ }
789
+ return out;
790
+ }
791
+
792
+ /** Whether a box's own height, least or greatest, is a percentage. */
793
+ function percentOwn(box: Box): boolean {
794
+ const style = box.style;
795
+ return (
796
+ isPct(style.height) ||
797
+ isPct(style.minHeight) ||
798
+ (style.maxHeight !== 'none' && isPct(style.maxHeight))
799
+ );
800
+ }
801
+
802
+ /**
803
+ * An item's border-box height before the rows are sized, where it has one
804
+ * then: a height of its own — a percentage of the rows it spans where they
805
+ * have a length for a size — or the rows' where it is stretched down them
806
+ * by its own `align-self`. Null where it has none, which is where its
807
+ * height is its content's.
808
+ */
809
+ function heightBeforeRows(box: Box, rows: number): number | null {
810
+ const style = box.style;
811
+ const own = resolveOrNull(style.height, rows);
812
+ if (own !== null && Number.isFinite(own)) {
813
+ return clampHeight(
814
+ box,
815
+ style.boxSizing === 'border-box'
816
+ ? Math.max(own, box.verticalExtra)
817
+ : own + box.verticalExtra,
818
+ );
819
+ }
820
+ if (
821
+ style.height === AUTO &&
822
+ !style.heightKeyword &&
823
+ style.alignSelf === 'stretch' &&
824
+ Number.isFinite(rows) &&
825
+ !autoMargins(box, 'y').some(Boolean)
826
+ ) {
827
+ const room = rows - box.marginTop - box.marginBottom;
828
+ return clampHeight(box, Math.max(room, box.verticalExtra));
829
+ }
830
+ return null;
831
+ }
832
+
833
+ /** A track's sizing functions, its lengths resolved against the size of the
834
+ * axis: a percentage of a size the tracks are still finding is `auto`
835
+ * (CSS Grid 1, 7.2.1), and `fit-content()` of one its content's widest. */
836
+ function sizing(track: GridTrack, base: number): SizingTrack {
837
+ const length = (len: Len): number | null =>
838
+ typeof len === 'number'
839
+ ? Math.max(0, len)
840
+ : len === AUTO || !Number.isFinite(base)
841
+ ? null
842
+ : Math.max(0, resolve(len, base));
843
+ const { min, max } = track;
844
+ const least: TrackMin =
845
+ min === 'min-content' || min === 'max-content'
846
+ ? min
847
+ : (length(min) ?? 'auto');
848
+ let most: TrackMax;
849
+ if (max === 'min-content' || max === 'max-content') most = max;
850
+ else if (typeof max === 'object' && max !== null && 'fr' in max) {
851
+ most = { fr: max.fr };
852
+ } else if (typeof max === 'object' && max !== null && 'fit' in max) {
853
+ const fit = length(max.fit);
854
+ most = fit === null ? 'max-content' : { fit };
855
+ } else most = length(max) ?? 'auto';
856
+ return { min: least, max: most };
857
+ }
858
+
859
+ /** An item's own least and greatest border-box widths, where they are
860
+ * lengths or its content's: a percentage of the area the tracks are still
861
+ * being sized for is none (CSS Sizing 3, 5.2.1). */
862
+ function ownWidths(
863
+ box: Box,
864
+ narrowest: number,
865
+ widest: number,
866
+ ): [number, number] {
867
+ const style = box.style;
868
+ const extra = style.boxSizing === 'border-box' ? 0 : box.horizontalExtra;
869
+ const keyword = (k: ContentSize | null): number | null =>
870
+ k === 'min-content' ? narrowest : k === 'max-content' ? widest : null;
871
+ const least =
872
+ keyword(style.minWidthKeyword) ??
873
+ (typeof style.minWidth === 'number' ? style.minWidth + extra : 0);
874
+ const most =
875
+ keyword(style.maxWidthKeyword) ??
876
+ (typeof style.maxWidth === 'number' ? style.maxWidth + extra : Infinity);
877
+ return [least, Math.max(least, most)];
878
+ }
879
+
880
+ /**
881
+ * The least an item makes the columns it is in (CSS Grid 1, 11.5, its
882
+ * "minimum contribution"): its narrowest where it has a width of its own,
883
+ * and its own least width where it has one of those.
884
+ */
885
+ function leastWidth(
886
+ item: Item,
887
+ tracks: SizingTrack[],
888
+ gap: number,
889
+ measure: (item: Item) => void,
890
+ ): number {
891
+ const box = item.box;
892
+ const style = box.style;
893
+ const margins = box.marginLeft + box.marginRight;
894
+ measure(item);
895
+ if ((style.width !== AUTO && !isPct(style.width)) || style.widthKeyword) {
896
+ return item.min;
897
+ }
898
+ if (style.minWidthKeyword || style.minWidth !== AUTO) {
899
+ const [least] = ownWidths(
900
+ box,
901
+ box.intrinsicMinContent,
902
+ box.intrinsicMaxContent,
903
+ );
904
+ return least + margins;
905
+ }
906
+ return (
907
+ automaticMinimum(
908
+ item.col,
909
+ item.cols,
910
+ tracks,
911
+ gap,
912
+ style.overflowX,
913
+ margins,
914
+ item.min - margins,
915
+ ) + margins
916
+ );
917
+ }
918
+
919
+ /**
920
+ * An item's automatic least size (CSS Grid 1, 6.6): its content's, where it
921
+ * shows what overflows it and is in an `auto` track — the only track, where
922
+ * one of them is an `fr` — and no larger than the tracks' lengths leave it
923
+ * room for where every one of them has a length for a maximum; else none.
924
+ */
925
+ function automaticMinimum(
926
+ start: number,
927
+ count: number,
928
+ tracks: SizingTrack[],
929
+ gap: number,
930
+ overflow: string,
931
+ margins: number,
932
+ content: number,
933
+ ): number {
934
+ // a scroll container has none; `clip` is not one (CSS Overflow 3, 3.1)
935
+ if (overflow !== 'visible' && overflow !== 'clip') return 0;
936
+ const end = Math.min(tracks.length, start + count);
937
+ let auto = false;
938
+ let flexible = false;
939
+ let fixed = true;
940
+ let room = gap * Math.max(0, end - start - 1) - margins;
941
+ for (let t = start; t < end; t += 1) {
942
+ const { min, max } = tracks[t];
943
+ if (min === 'auto') auto = true;
944
+ if (typeof max === 'object' && 'fr' in max) flexible = true;
945
+ if (typeof max === 'number') room += max;
946
+ else fixed = false;
947
+ }
948
+ if (!auto || (flexible && end - start > 1)) return 0;
949
+ return Math.max(0, fixed ? Math.min(content, room) : content);
950
+ }
951
+
952
+ /** What an item makes of the rows it is in: its height at its area's
953
+ * width, whichever the constraint, and the least it can be, as a
954
+ * column's. */
955
+ function rowItem(item: Item, tracks: SizingTrack[], gap: number): TrackItem {
956
+ const box = item.box;
957
+ const margins = box.marginTop + box.marginBottom;
958
+ const outer = () => box.height + margins;
959
+ return {
960
+ start: item.row,
961
+ span: item.rows,
962
+ minContent: outer,
963
+ maxContent: outer,
964
+ minimum: () => {
965
+ const style = box.style;
966
+ if (style.height !== AUTO && !isPct(style.height)) return outer();
967
+ if (style.minHeight !== AUTO) {
968
+ const extra = style.boxSizing === 'border-box' ? 0 : box.verticalExtra;
969
+ const least =
970
+ typeof style.minHeight === 'number' ? style.minHeight + extra : 0;
971
+ return least + margins;
972
+ }
973
+ return (
974
+ automaticMinimum(
975
+ item.row,
976
+ item.rows,
977
+ tracks,
978
+ gap,
979
+ style.overflowY,
980
+ margins,
981
+ box.height,
982
+ ) + margins
983
+ );
984
+ },
985
+ };
986
+ }
987
+
988
+ /** A grid's least content height where it has no height of its own: its
989
+ * `min-height`, a length or a percentage of a height. */
990
+ function leastHeight(box: Box): number {
991
+ const style = box.style;
992
+ if (style.minHeight === AUTO) return 0;
993
+ const px = resolveOrNull(style.minHeight, box.percentHeightBase);
994
+ if (px === null || !Number.isFinite(px)) return 0;
995
+ return Math.max(
996
+ 0,
997
+ style.boxSizing === 'border-box' ? px - box.verticalExtra : px,
998
+ );
999
+ }
1000
+
1001
+ /**
1002
+ * Where each track starts from the grid's content edge, with the space the
1003
+ * tracks leave placed as `justify-content` or `align-content` has it (CSS
1004
+ * Box Alignment 3, 5.1): before them, after them, between them or around
1005
+ * each — none where the axis has no size of its own. `center` and `end`
1006
+ * overflow the start as well, where the tracks are larger than the room;
1007
+ * the distributions fall back to the start.
1008
+ */
1009
+ function starts(
1010
+ sizes: number[],
1011
+ gap: number,
1012
+ distribution: string,
1013
+ room: number,
1014
+ ): number[] {
1015
+ let used = gap * Math.max(0, sizes.length - 1);
1016
+ for (const size of sizes) used += size;
1017
+ const free = Number.isFinite(room) ? room - used : 0;
1018
+ const n = sizes.length;
1019
+ let at = 0;
1020
+ let between = 0;
1021
+ if (n && free !== 0) {
1022
+ if (distribution === 'center') at = free / 2;
1023
+ else if (
1024
+ distribution === 'end' ||
1025
+ distribution === 'flex-end' ||
1026
+ distribution === 'right'
1027
+ ) {
1028
+ at = free;
1029
+ } else if (free > 0 && distribution === 'space-between') {
1030
+ between = n > 1 ? free / (n - 1) : 0;
1031
+ } else if (free > 0 && distribution === 'space-around') {
1032
+ between = free / n;
1033
+ at = between / 2;
1034
+ } else if (free > 0 && distribution === 'space-evenly') {
1035
+ between = free / (n + 1);
1036
+ at = between;
1037
+ }
1038
+ }
1039
+ const out: number[] = [];
1040
+ for (const size of sizes) {
1041
+ out.push(at);
1042
+ at += size + gap + between;
1043
+ }
1044
+ return out;
1045
+ }
1046
+
1047
+ /** Which of an item's margins on an axis are `auto`, start and end. */
1048
+ function autoMargins(box: Box, axis: 'x' | 'y'): [boolean, boolean] {
1049
+ const style = box.style;
1050
+ return axis === 'x'
1051
+ ? [style.marginLeft === AUTO, style.marginRight === AUTO]
1052
+ : [style.marginTop === AUTO, style.marginBottom === AUTO];
1053
+ }
1054
+
1055
+ /** Whether a track's least or greatest size is a percentage. */
1056
+ function percentTrack(track: GridTrack): boolean {
1057
+ const { min, max } = track;
1058
+ if (typeof min === 'object' && isPct(min)) return true;
1059
+ if (typeof max !== 'object' || max === null) return false;
1060
+ if ('fr' in max) return false;
1061
+ if ('fit' in max) return typeof max.fit === 'object' && isPct(max.fit);
1062
+ return isPct(max);
1063
+ }