@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
@@ -25,10 +25,20 @@ export interface Band {
25
25
  right: number;
26
26
  }
27
27
 
28
+ /**
29
+ * How much narrower than a float its room may be and still hold it: the
30
+ * error of adding up widths, which are fractions of a pixel. Ten floats of
31
+ * `0.87em` in a box `8.7em` wide came to more than the box by 1e-14 px,
32
+ * and the tenth went under the other nine.
33
+ */
34
+ const FIT_SLACK = 1e-6;
35
+
28
36
  export class FloatContext {
29
37
  private _boxes: FloatBox[] = [];
30
38
  private _lowestLeft = -Infinity;
31
39
  private _lowestRight = -Infinity;
40
+ /** The top of the float placed last, which no later one goes above. */
41
+ private _lastTop = -Infinity;
32
42
  /** The BFC's own content edges, which is what a band is clipped to. */
33
43
  readonly left: number;
34
44
  readonly right: number;
@@ -42,27 +52,44 @@ export class FloatContext {
42
52
  return this._boxes.length === 0;
43
53
  }
44
54
 
55
+ /** How many floats are placed: a mark for `clearanceSince`. */
56
+ get count(): number {
57
+ return this._boxes.length;
58
+ }
59
+
45
60
  add(box: FloatBox): void {
46
61
  this._boxes.push(box);
62
+ if (box.top > this._lastTop) this._lastTop = box.top;
47
63
  if (box.side === 'left')
48
64
  this._lowestLeft = Math.max(this._lowestLeft, box.bottom);
49
65
  else this._lowestRight = Math.max(this._lowestRight, box.bottom);
50
66
  }
51
67
 
52
68
  /**
53
- * The band left for a line of `height` starting at `y`.
69
+ * The band left for a line of `height` starting at `y`, between `left`
70
+ * and `right` — the formatting context's own edges unless a narrower
71
+ * containing block is asking.
54
72
  *
55
73
  * A float intersects a line when their vertical ranges overlap at all —
56
74
  * not when the line's top is inside the float — which is why this takes a
57
75
  * height rather than just a position. Getting that wrong lets the last
58
76
  * line of a wrapped paragraph slide under a floated image by a pixel.
77
+ *
78
+ * `solid` leaves out a float of no width: a block with a formatting
79
+ * context of its own may not overlap a float's margin box (CSS 2.1 9.5),
80
+ * and one with no area has nothing to overlap, wherever it is.
59
81
  */
60
- bandAt(y: number, height: number): Band {
61
- let left = this.left;
62
- let right = this.right;
82
+ bandAt(
83
+ y: number,
84
+ height: number,
85
+ left = this.left,
86
+ right = this.right,
87
+ solid = false,
88
+ ): Band {
63
89
  const bottom = y + Math.max(1, height);
64
90
  for (const box of this._boxes) {
65
91
  if (box.bottom <= y || box.top >= bottom) continue;
92
+ if (solid && box.right <= box.left) continue;
66
93
  if (box.side === 'left') left = Math.max(left, box.right);
67
94
  else right = Math.min(right, box.left);
68
95
  }
@@ -78,6 +105,21 @@ export class FloatContext {
78
105
  return false;
79
106
  }
80
107
 
108
+ /**
109
+ * Where a line at `y`, `height` tall, next has more room: the nearest
110
+ * bottom edge of a float beside it. Null when no float is, so nothing
111
+ * below can widen the line.
112
+ */
113
+ nextEdgeBelow(y: number, height: number): number | null {
114
+ const bottom = y + Math.max(1, height);
115
+ let next: number | null = null;
116
+ for (const box of this._boxes) {
117
+ if (box.bottom <= y || box.top >= bottom) continue;
118
+ if (next === null || box.bottom < next) next = box.bottom;
119
+ }
120
+ return next;
121
+ }
122
+
81
123
  /**
82
124
  * The lowest `y` a box with this `clear` may start at. `-Infinity` when
83
125
  * nothing is in the way, so a caller takes `Math.max(y, clearance)`.
@@ -95,6 +137,22 @@ export class FloatContext {
95
137
  }
96
138
  }
97
139
 
140
+ /** `clearance`, of the floats placed since `mark` alone. */
141
+ clearanceSince(
142
+ clear: 'none' | 'left' | 'right' | 'both',
143
+ mark: number,
144
+ ): number {
145
+ if (clear === 'none') return -Infinity;
146
+ let lowest = -Infinity;
147
+ for (let i = mark; i < this._boxes.length; i += 1) {
148
+ const float = this._boxes[i];
149
+ if (clear === 'both' || clear === float.side) {
150
+ lowest = Math.max(lowest, float.bottom);
151
+ }
152
+ }
153
+ return lowest;
154
+ }
155
+
98
156
  /** How far down the floats reach — what a container that establishes a
99
157
  * BFC has to grow to, so it does not end above its own floats. */
100
158
  get bottom(): number {
@@ -102,24 +160,80 @@ export class FloatContext {
102
160
  }
103
161
 
104
162
  /**
105
- * The first `y` at or below `from` where a box `width` wide fits on `side`.
106
- * A float that does not fit beside the ones already placed goes under
107
- * them, which is the rule that makes two 60%-wide floats stack.
163
+ * The first `y` at or below `from` where a box `width` wide fits on `side`
164
+ * between `left` and `right`, its containing block's content edges. A
165
+ * float that does not fit beside the ones already placed goes under them,
166
+ * which is the rule that makes two 60%-wide floats stack; one wider than
167
+ * its containing block goes where nothing is beside it.
168
+ *
169
+ * No higher than the float placed before it, either (CSS 2.1 9.5.1, rule
170
+ * 5): a float that fits in a gap an earlier one went under does not go
171
+ * back up into it. That also makes every float already placed start at or
172
+ * above the one being placed, so the band only widens below its top and a
173
+ * band one pixel tall there is the band over its whole height. And it is
174
+ * what keeps a row of floats cheap: from the top of the one before, the
175
+ * floats of the rows above are no candidates at all, where a thousand
176
+ * floated thumbnails walked the bottoms of every row above theirs.
108
177
  */
109
- placeAt(from: number, width: number, side: 'left' | 'right'): number {
110
- let y = from;
111
- // Candidate positions are `from` and the bottom of every float below it;
112
- // there is no other height at which the band can get wider.
113
- const candidates = [from];
178
+ placeAt(
179
+ from: number,
180
+ width: number,
181
+ side: 'left' | 'right',
182
+ left = this.left,
183
+ right = this.right,
184
+ ): number {
185
+ if (from < this._lastTop) from = this._lastTop;
186
+ // where it fits at once, as most do, nothing below is looked at
187
+ if (this._fits(from, width, side, left, right)) return from;
188
+ // Candidate positions are the bottom of every float below `from`; there
189
+ // is no other height at which the band can get wider.
190
+ const candidates: number[] = [];
114
191
  for (const box of this._boxes) {
115
192
  if (box.bottom > from) candidates.push(box.bottom);
116
193
  }
117
194
  candidates.sort((a, b) => a - b);
195
+ let y = from;
118
196
  for (const candidate of candidates) {
119
- const band = this.bandAt(candidate, 1);
120
- if (band.right - band.left >= width) return candidate;
197
+ // a row of floats ends at one height, asked about once
198
+ if (candidate === y) continue;
199
+ if (this._fits(candidate, width, side, left, right)) return candidate;
121
200
  y = candidate;
122
201
  }
123
202
  return y;
124
203
  }
204
+
205
+ /**
206
+ * Whether a float `width` wide fits at `y` (CSS 2.1 9.5.1): past the
207
+ * floats on its own side, and short of every float on the other (rule
208
+ * 3), which lets it stand out of its containing block where no float of
209
+ * its own side is beside it, and within the containing block where one
210
+ * is (rule 7). Held to the containing block always, a float wider than
211
+ * its block went below every float beside it, where it fitted beside
212
+ * them in the formatting context.
213
+ */
214
+ private _fits(
215
+ y: number,
216
+ width: number,
217
+ side: 'left' | 'right',
218
+ left: number,
219
+ right: number,
220
+ ): boolean {
221
+ const start = side === 'left';
222
+ let near = start ? left : right;
223
+ let far = start ? Infinity : -Infinity;
224
+ let beside = false;
225
+ for (const box of this._boxes) {
226
+ if (box.bottom <= y || box.top >= y + 1) continue;
227
+ if (box.side === side) {
228
+ beside = true;
229
+ near = start ? Math.max(near, box.right) : Math.min(near, box.left);
230
+ } else {
231
+ far = start ? Math.min(far, box.left) : Math.max(far, box.right);
232
+ }
233
+ }
234
+ if (beside) far = start ? Math.min(far, right) : Math.max(far, left);
235
+ return start
236
+ ? near + width <= far + FIT_SLACK
237
+ : near - width >= far - FIT_SLACK;
238
+ }
125
239
  }
@@ -0,0 +1,141 @@
1
+ // A grid's lines by number and by name (CSS Grid 1, 8.3): what a grid
2
+ // item's placement properties come to as line indices. Shared by the
3
+ // placement of the grid's items (`css-grid.ts`) and by the grid area an
4
+ // absolutely positioned box takes for its containing block (`block.ts`),
5
+ // which must read a name as the placement does.
6
+ import type { GridAreas, GridLine } from '../css/style.js';
7
+
8
+ /** One axis of a grid: how many tracks its explicit grid has, and which of
9
+ * its lines — from 0, before the first track — carry each name. */
10
+ export interface GridLines {
11
+ tracks: number;
12
+ named: Map<string, number[]>;
13
+ }
14
+
15
+ /**
16
+ * An axis's lines from the names its track list gives them, and those
17
+ * `grid-template-areas` gives the edges of its areas: `a-start` and
18
+ * `a-end` (7.3.2). `names[i]` is the line before track `i`.
19
+ */
20
+ export function gridLines(
21
+ tracks: number,
22
+ names: readonly (readonly string[])[],
23
+ areas: GridAreas | null,
24
+ axis: 'rows' | 'columns',
25
+ ): GridLines {
26
+ const named = new Map<string, number[]>();
27
+ const add = (name: string, line: number) => {
28
+ const list = named.get(name);
29
+ if (!list) named.set(name, [line]);
30
+ else if (!list.includes(line)) list.push(line);
31
+ };
32
+ names.forEach((group, line) => {
33
+ for (const name of group) add(name, line);
34
+ });
35
+ if (areas) {
36
+ for (const [name, area] of areas.areas) {
37
+ add(`${name}-start`, area[axis][0]);
38
+ add(`${name}-end`, area[axis][1]);
39
+ }
40
+ }
41
+ for (const list of named.values()) list.sort((a, b) => a - b);
42
+ return { tracks, named };
43
+ }
44
+
45
+ /**
46
+ * The `n`th line named `name` from the start of the explicit grid, or from
47
+ * its end where `n` is negative: where there are not so many, the implicit
48
+ * lines past that end all count as having the name (8.3).
49
+ */
50
+ export function namedLine(lines: GridLines, name: string, n: number): number {
51
+ const list = lines.named.get(name) ?? [];
52
+ if (n > 0) {
53
+ return n <= list.length ? list[n - 1] : lines.tracks + (n - list.length);
54
+ }
55
+ const k = -n;
56
+ return k <= list.length ? list[list.length - k] : -(k - list.length);
57
+ }
58
+
59
+ /**
60
+ * The line a placement property names, or null for `auto` and a span. A
61
+ * name alone is the edge of the area of that name, the first line called
62
+ * `<name>-start` or `<name>-end`, and else the first line called `<name>`.
63
+ */
64
+ export function lineOf(
65
+ lines: GridLines,
66
+ line: GridLine,
67
+ side: 'start' | 'end',
68
+ ): number | null {
69
+ if (!line || 'span' in line) return null;
70
+ if ('line' in line) {
71
+ if (line.name !== undefined) return namedLine(lines, line.name, line.line);
72
+ return line.line > 0 ? line.line - 1 : lines.tracks + 1 + line.line;
73
+ }
74
+ const edge = lines.named.get(`${line.name}-${side}`);
75
+ if (edge?.length) return edge[0];
76
+ return namedLine(lines, line.name, 1);
77
+ }
78
+
79
+ /**
80
+ * Where a span of a name ends, counting `count` lines of that name on from
81
+ * `from` (forward) or back from it: the implicit lines past the grid's
82
+ * ends all count as having the name.
83
+ */
84
+ export function spanToName(
85
+ lines: GridLines,
86
+ name: string,
87
+ count: number,
88
+ from: number,
89
+ forward: boolean,
90
+ ): number {
91
+ const list = lines.named.get(name) ?? [];
92
+ if (forward) {
93
+ const after = list.filter((l) => l > from);
94
+ if (count <= after.length) return after[count - 1];
95
+ return Math.max(from, lines.tracks) + (count - after.length);
96
+ }
97
+ const before = list.filter((l) => l < from);
98
+ if (count <= before.length) return before[before.length - count];
99
+ return Math.min(from, 0) - (count - before.length);
100
+ }
101
+
102
+ /**
103
+ * An item's start line and how many tracks it spans on one axis (8.3.1):
104
+ * the start null where the auto placement is to find it. Two lines the
105
+ * wrong way round are swapped, and one line twice spans a track; a span of
106
+ * a name with nothing to count it from spans one.
107
+ */
108
+ export function placement(
109
+ start: GridLine,
110
+ end: GridLine,
111
+ lines: GridLines,
112
+ ): [number | null, number] {
113
+ let from = lineOf(lines, start, 'start');
114
+ let to = lineOf(lines, end, 'end');
115
+ const spanOf = (l: GridLine) => (l && 'span' in l ? l : null);
116
+ if (from !== null && to !== null) {
117
+ if (to < from) [from, to] = [to, from];
118
+ if (to === from) to = from + 1;
119
+ } else if (from !== null) {
120
+ const s = spanOf(end);
121
+ to =
122
+ s?.name !== undefined
123
+ ? spanToName(lines, s.name, s.span, from, true)
124
+ : from + (s?.span ?? 1);
125
+ } else if (to !== null) {
126
+ const s = spanOf(start);
127
+ from =
128
+ s?.name !== undefined
129
+ ? spanToName(lines, s.name, s.span, to, false)
130
+ : to - (s?.span ?? 1);
131
+ } else {
132
+ const s = spanOf(start) ?? spanOf(end);
133
+ return [null, s && s.name === undefined ? s.span : 1];
134
+ }
135
+ // the grid here has no tracks before its first line
136
+ if (from < 0) {
137
+ to = Math.max(1, to + -from);
138
+ from = 0;
139
+ }
140
+ return [from, Math.max(1, to - from)];
141
+ }
@@ -0,0 +1,181 @@
1
+ // A table's grid: which rows it has, and which slot of them each cell
2
+ // takes. Shared by the table layout, which sizes the columns, and the
3
+ // collapsing border model, which resolves the borders along every edge of
4
+ // the grid — the two have to agree on where a cell is.
5
+ import type { Box } from './boxes.js';
6
+
7
+ export interface Cell {
8
+ box: Box;
9
+ row: number;
10
+ column: number;
11
+ colSpan: number;
12
+ rowSpan: number;
13
+ }
14
+
15
+ /** A table's rows in order, with the row group each is in, and its
16
+ * captions. */
17
+ export interface TableRows {
18
+ rows: Box[];
19
+ /** Per row, the row group it is in, or null for a row of the table's
20
+ * own. */
21
+ groups: (Box | null)[];
22
+ captions: Box[];
23
+ }
24
+
25
+ /**
26
+ * A table's rows in the order they are drawn: a header group's first,
27
+ * wherever it stands, and a footer group's last (CSS 2.1 17.2) — HTML 4
28
+ * put `<tfoot>` before `<tbody>`, and a document that did would draw its
29
+ * totals mid-table. Only the first of each is set apart; any other is a
30
+ * body group.
31
+ */
32
+ export function rowsOf(table: Box): TableRows {
33
+ const rows: Box[] = [];
34
+ const groups: (Box | null)[] = [];
35
+ const captions: Box[] = [];
36
+ let header: Box | null = null;
37
+ let footer: Box | null = null;
38
+ for (const child of table.children) {
39
+ if (child.kind !== 'table-row-group') continue;
40
+ const display = child.style.display;
41
+ if (display === 'table-header-group') header ??= child;
42
+ else if (display === 'table-footer-group') footer ??= child;
43
+ }
44
+ const take = (group: Box): void => {
45
+ for (const row of group.children) {
46
+ if (row.kind !== 'table-row') continue;
47
+ rows.push(row);
48
+ groups.push(group);
49
+ }
50
+ };
51
+ if (header) take(header);
52
+ for (const child of table.children) {
53
+ if (child.kind === 'table-caption') captions.push(child);
54
+ else if (child.kind === 'table-row-group') {
55
+ if (child !== header && child !== footer) take(child);
56
+ } else if (child.kind === 'table-row') {
57
+ rows.push(child);
58
+ groups.push(null);
59
+ }
60
+ }
61
+ if (footer) take(footer);
62
+ return { rows, groups, captions };
63
+ }
64
+
65
+ /** A table's rows, as `rowsOf` gives them, and its grid. */
66
+ export interface TableGrid extends TableRows {
67
+ cells: Cell[];
68
+ columnCount: number;
69
+ /** Per column, the column box it is in, or null. */
70
+ columnBoxes: (Box | null)[];
71
+ /** Per column, the column group it is in, or null. */
72
+ columnGroups: (Box | null)[];
73
+ }
74
+
75
+ const GRIDS = new WeakMap<Box, TableGrid>();
76
+
77
+ /**
78
+ * A table's rows and grid, worked out once per box tree: they come from the
79
+ * markup alone — a restyle builds the boxes again — while the layout asks
80
+ * on every pass, at every width a resize goes through, and the collapsing
81
+ * border model asks too.
82
+ */
83
+ export function tableGrid(table: Box): TableGrid {
84
+ let grid = GRIDS.get(table);
85
+ if (!grid) {
86
+ const rows = rowsOf(table);
87
+ const cells = gridOf(rows.rows);
88
+ const { column, group } = columnsOf(table, cells.columnCount);
89
+ if (table.style.direction === 'rtl') {
90
+ // A table right to left has its first column at the right (CSS 2.1
91
+ // 17.2). The grid is turned round once, here, so the layout, the
92
+ // collapsing borders and the column backgrounds, which all read it
93
+ // from the left, agree about where a cell is.
94
+ const count = cells.columnCount;
95
+ for (const cell of cells.cells) {
96
+ cell.column = count - cell.column - cell.colSpan;
97
+ }
98
+ column.reverse();
99
+ group.reverse();
100
+ }
101
+ grid = {
102
+ ...rows,
103
+ ...cells,
104
+ columnBoxes: column,
105
+ columnGroups: group,
106
+ };
107
+ GRIDS.set(table, grid);
108
+ }
109
+ return grid;
110
+ }
111
+
112
+ /**
113
+ * Assign every cell a row and a column, honouring `colspan` and `rowspan`.
114
+ * The occupancy grid is what makes a `rowspan` in an earlier row push a
115
+ * later row's cells to the right, which is the bug every naive table
116
+ * renderer ships with.
117
+ */
118
+ export function gridOf(rows: Box[]): { cells: Cell[]; columnCount: number } {
119
+ const cells: Cell[] = [];
120
+ const occupied: boolean[][] = [];
121
+ let columnCount = 0;
122
+
123
+ const mark = (r: number, c: number): void => {
124
+ (occupied[r] ??= [])[c] = true;
125
+ };
126
+ const taken = (r: number, c: number): boolean => occupied[r]?.[c] === true;
127
+
128
+ for (let r = 0; r < rows.length; r += 1) {
129
+ let c = 0;
130
+ for (const box of rows[r].children) {
131
+ if (box.kind !== 'table-cell') continue;
132
+ while (taken(r, c)) c += 1;
133
+ const colSpan = Math.max(1, spanAttr(box, 'colspan'));
134
+ const rowSpan = Math.max(1, spanAttr(box, 'rowspan'));
135
+ cells.push({ box, row: r, column: c, colSpan, rowSpan });
136
+ for (let dr = 0; dr < rowSpan; dr += 1) {
137
+ for (let dc = 0; dc < colSpan; dc += 1) mark(r + dr, c + dc);
138
+ }
139
+ c += colSpan;
140
+ columnCount = Math.max(columnCount, c);
141
+ }
142
+ }
143
+ return { cells, columnCount };
144
+ }
145
+
146
+ export function spanAttr(box: Box, name: string): number {
147
+ const raw = box.el?.attribs?.[name];
148
+ if (!raw) return 1;
149
+ const n = parseInt(raw, 10);
150
+ return Number.isFinite(n) && n > 0 ? Math.min(n, 1000) : 1;
151
+ }
152
+
153
+ /** Which column box and column group each column of the grid is in. */
154
+ function columnsOf(
155
+ table: Box,
156
+ count: number,
157
+ ): { column: (Box | null)[]; group: (Box | null)[] } {
158
+ const column: (Box | null)[] = new Array<Box | null>(count).fill(null);
159
+ const group: (Box | null)[] = new Array<Box | null>(count).fill(null);
160
+ let at = 0;
161
+ const place = (box: Box | null, owner: Box | null, span: number): void => {
162
+ for (let i = 0; i < span && at < count; i += 1, at += 1) {
163
+ column[at] = box;
164
+ group[at] = owner;
165
+ }
166
+ };
167
+ for (const child of table.children) {
168
+ if (at >= count) break;
169
+ const display = child.style.display;
170
+ if (display === 'table-column') {
171
+ place(child, null, spanAttr(child, 'span'));
172
+ } else if (display === 'table-column-group') {
173
+ const columns = child.children.filter(
174
+ (c) => c.style.display === 'table-column',
175
+ );
176
+ if (!columns.length) place(null, child, spanAttr(child, 'span'));
177
+ for (const c of columns) place(c, child, spanAttr(c, 'span'));
178
+ }
179
+ }
180
+ return { column, group };
181
+ }