@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
@@ -0,0 +1,641 @@
1
+ // `@font-face`: the families a document brings with it.
2
+ //
3
+ // A face is a resource like an image — asked for through `onResource`, as
4
+ // `{ kind: 'font' }`, and handed back as the file's bytes — and nothing loads
5
+ // without the host, as nothing else does. What is particular to fonts is
6
+ // where one goes once it has loaded: into the connection's font manager,
7
+ // where the text engine finds a family by name. That manager is the whole
8
+ // application's, so three rules keep a document's fonts the document's.
9
+ //
10
+ // **A face is registered under a name nothing else has.** A page that
11
+ // declares `font-family: Inter` must not change what `Inter` means to the
12
+ // window around it, to the next tab, or to a page that ships another file
13
+ // under the same name — an icon font called `Icons` on two sites is two sets
14
+ // of glyphs. So each group of faces is registered as `html webfont <letters>`
15
+ // and the cascade's `font-family` lists are rewritten to it (`map`). The name
16
+ // is keyed by the family, the unicode range and every face's URLs, weight and
17
+ // slant: two documents that declare a family the same way share one
18
+ // registration, and a document that declares it differently gets its own.
19
+ // (Letters only, because the name also reaches fontconfig, where `-12` would
20
+ // read as a size.)
21
+ //
22
+ // **A face loads when the page uses it, as a browser loads one.** A Google
23
+ // Fonts sheet declares a family seven times over, once per script, and a
24
+ // self-hosted family often declares every weight it has. The cascade reports
25
+ // each computed style (`note`), and after the boxes are built a face is asked
26
+ // for only if some style wants its family at its weight and slant and some
27
+ // character of the document falls in its `unicode-range` (`request`). The
28
+ // matching is CSS Fonts 4's (5.2): the slant first, then the nearest weight
29
+ // in the direction the spec prefers, and a face that fails to load is passed
30
+ // over for the next.
31
+ //
32
+ // **Until a face has loaded, its family is not in the list.** The text is set
33
+ // in the next family the author named, as `font-display: swap` has it, and
34
+ // the list changes when the face arrives — which is what tells every cache
35
+ // keyed by a family list, the text layouts', the metrics', ntk's, that the
36
+ // text has to be set again.
37
+ //
38
+ // A family split by `unicode-range` is registered a name per range, since the
39
+ // font manager picks among one name's faces by weight and slant alone, and
40
+ // the range that holds the most of the document's characters goes first: the
41
+ // first family is the one a run is set in, and the others are reached through
42
+ // the fallback for the characters it lacks.
43
+ //
44
+ // What stays the application's: registering a face adds it to ntk's
45
+ // fallback chain, where it can supply a glyph no other face has to text
46
+ // anywhere in the app (react-x11's `loadFont` says so), and nothing is ever
47
+ // unregistered — the font manager has no way to. A session that visits many
48
+ // sites keeps their faces, one registration per distinct declaration.
49
+ import { loadFont } from 'react-x11';
50
+ import type { Element } from 'domhandler';
51
+
52
+ import type { FontFaceRule } from './css/parse.js';
53
+ import type { ComputedStyle } from './css/style.js';
54
+ import type { ResourceRequest, ResourceResult } from './resources.js';
55
+
56
+ /** What the cascade asks of the document's families (`Cascade`). */
57
+ export interface FontFamilies {
58
+ /** A computed `font-family` list, as the text engine should see it. */
59
+ map(list: string): string;
60
+ /** A style was computed: its family, weight and slant are wanted. */
61
+ note(style: ComputedStyle): void;
62
+ }
63
+
64
+ /** A `@font-face` rule, and the element whose sheet declared it — the one a
65
+ * request names. */
66
+ export interface DeclaredFace {
67
+ rule: FontFaceRule;
68
+ element: Element;
69
+ }
70
+
71
+ type Ask = (
72
+ request: ResourceRequest,
73
+ ) => Promise<ResourceResult | null> | ResourceResult | null;
74
+
75
+ /** The formats a font manager reads. A source hinted as anything else — an
76
+ * `embedded-opentype` for old Internet Explorer, an `svg` font — is not
77
+ * asked for; one with no hint is. */
78
+ const READABLE = new Set([
79
+ 'woff2',
80
+ 'woff',
81
+ 'truetype',
82
+ 'opentype',
83
+ 'ttf',
84
+ 'otf',
85
+ 'collection',
86
+ 'woff2-variations',
87
+ 'woff-variations',
88
+ 'truetype-variations',
89
+ 'opentype-variations',
90
+ ]);
91
+
92
+ interface Face {
93
+ rule: FontFaceRule;
94
+ element: Element;
95
+ group: Group;
96
+ family: Family;
97
+ /** Where loading got to. `idle` has not been asked for. */
98
+ state: 'idle' | 'loading' | 'ready' | 'failed';
99
+ }
100
+
101
+ /** A family's faces for one unicode range: one registered name, among whose
102
+ * faces the font manager picks by weight and slant. */
103
+ interface Group {
104
+ name: string;
105
+ ranges: [number, number][] | null;
106
+ faces: Face[];
107
+ /** How many of the document's distinct code points the range holds. */
108
+ coverage: number;
109
+ order: number;
110
+ }
111
+
112
+ interface Family {
113
+ groups: Group[];
114
+ /** `weight|italic`s the styles asked for, and the ones already asked. */
115
+ wants: Set<string>;
116
+ asked: Set<string>;
117
+ }
118
+
119
+ /** What one connection has registered, shared by every document on it. */
120
+ interface Registry {
121
+ next: number;
122
+ /** A group's signature → the name it is registered under. */
123
+ names: Map<string, string>;
124
+ /** Faces registered, by `faceKey`. */
125
+ ready: Set<string>;
126
+ /** Faces being loaded, by `faceKey`, so a second document waits for the
127
+ * first document's request rather than making its own. */
128
+ pending: Map<string, Promise<boolean>>;
129
+ }
130
+
131
+ const REGISTRIES = new WeakMap<object, Registry>();
132
+
133
+ function registryOf(app: object): Registry {
134
+ let registry = REGISTRIES.get(app);
135
+ if (!registry) {
136
+ registry = {
137
+ next: 0,
138
+ names: new Map(),
139
+ ready: new Set(),
140
+ pending: new Map(),
141
+ };
142
+ REGISTRIES.set(app, registry);
143
+ }
144
+ return registry;
145
+ }
146
+
147
+ /** `0 → a`, `25 → z`, `26 → ba`: a counter as letters. */
148
+ function letters(n: number): string {
149
+ let out = '';
150
+ do {
151
+ out = String.fromCharCode(97 + (n % 26)) + out;
152
+ n = Math.floor(n / 26);
153
+ } while (n > 0);
154
+ return out;
155
+ }
156
+
157
+ export class WebFonts implements FontFamilies {
158
+ private _app: object | null;
159
+ private _ask: Ask;
160
+ private _changed: () => void;
161
+ private _fallback: string;
162
+ private _families = new Map<string, Family>();
163
+ /** Every face, in the order the sheets declared them. */
164
+ private _faces: Face[] = [];
165
+ /** What `setFaces` was last handed, to tell a restyle that changed no
166
+ * face from one that did. */
167
+ private _declared = '';
168
+ /** Lists as the author wrote them → as the engine should see them. */
169
+ private _memo = new Map<string, string>();
170
+ /** Lists as the engine sees them → the declared families they came from,
171
+ * for `note`, which is handed a computed style and so the second. Two
172
+ * lists that come to one string share an entry, which can ask for a face
173
+ * a little early; never for one nothing wants. */
174
+ private _sources = new Map<string, Family[]>();
175
+ /** The document's characters, as the last `request` saw them. */
176
+ private _text: string | null = null;
177
+ private _seen = new Set<number>();
178
+ private _points: Uint32Array = new Uint32Array(0);
179
+ private _destroyed = false;
180
+
181
+ constructor(app: unknown, ask: Ask, changed: () => void, fallback: string) {
182
+ this._app = app !== null && typeof app === 'object' ? app : null;
183
+ this._ask = ask;
184
+ this._changed = changed;
185
+ this._fallback = fallback;
186
+ }
187
+
188
+ /** The family a list comes to when every name in it was the document's
189
+ * own and none has loaded — the document's default. */
190
+ setFallback(family: string): void {
191
+ if (family === this._fallback) return;
192
+ this._fallback = family;
193
+ this._forget();
194
+ }
195
+
196
+ /**
197
+ * The faces the document's sheets declare, after a restyle — in sheet
198
+ * order, the ones whose `@media` holds. A face declared as it was keeps
199
+ * what it had loaded, and so does one another document on the connection
200
+ * declared the same way.
201
+ */
202
+ setFaces(declared: DeclaredFace[]): void {
203
+ const signature = declared
204
+ .map(
205
+ (d) => `${d.rule.family.toLowerCase()}\u0001${faceSignature(d.rule)}`,
206
+ )
207
+ .join('\u0002');
208
+ if (signature === this._declared) {
209
+ // the same faces, in elements a re-parse made again
210
+ this._faces.forEach((face, i) => (face.element = declared[i].element));
211
+ return;
212
+ }
213
+ this._declared = signature;
214
+
215
+ // a family's faces, by range, in the order they were declared
216
+ const byFamily = new Map<string, Map<string, DeclaredFace[]>>();
217
+ for (const face of declared) {
218
+ const key = face.rule.family.toLowerCase();
219
+ let ranges = byFamily.get(key);
220
+ if (!ranges) byFamily.set(key, (ranges = new Map()));
221
+ const range = rangeKey(face.rule.unicodeRange);
222
+ let list = ranges.get(range);
223
+ if (!list) ranges.set(range, (list = []));
224
+ list.push(face);
225
+ }
226
+ const registry = this._app ? registryOf(this._app) : null;
227
+ const previous = this._families;
228
+ const families = new Map<string, Family>();
229
+ const made = new Map<DeclaredFace, Face>();
230
+ let order = 0;
231
+ for (const [key, ranges] of byFamily) {
232
+ const before = previous.get(key);
233
+ const family: Family = {
234
+ groups: [],
235
+ // what the styles wanted is still wanted, and asked for again: under
236
+ // another name it is another registration
237
+ wants: before ? before.wants : new Set(),
238
+ asked: new Set(),
239
+ };
240
+ for (const [range, members] of ranges) {
241
+ const groupSignature = `${key}\u0001${range}\u0001${members
242
+ .map((m) => faceSignature(m.rule))
243
+ .join('\u0002')}`;
244
+ let name = registry?.names.get(groupSignature);
245
+ if (!name) {
246
+ name = `html webfont ${letters(registry ? registry.next++ : order)}`;
247
+ registry?.names.set(groupSignature, name);
248
+ }
249
+ const group: Group = {
250
+ name,
251
+ ranges: members[0].rule.unicodeRange,
252
+ faces: [],
253
+ coverage: members[0].rule.unicodeRange ? 0 : Infinity,
254
+ order: order++,
255
+ };
256
+ for (const m of members) {
257
+ const ready = registry?.ready.has(faceKey(name, m.rule)) ?? false;
258
+ const face: Face = {
259
+ rule: m.rule,
260
+ element: m.element,
261
+ group,
262
+ family,
263
+ state: ready ? 'ready' : 'idle',
264
+ };
265
+ group.faces.push(face);
266
+ made.set(m, face);
267
+ }
268
+ family.groups.push(group);
269
+ }
270
+ families.set(key, family);
271
+ }
272
+ this._families = families;
273
+ this._faces = declared.map((d) => made.get(d)!);
274
+ // the ranges are new, and so is what they cover
275
+ if (this._text !== null) this._measure(this._text, true);
276
+ this._forget();
277
+ }
278
+
279
+ map(list: string): string {
280
+ if (!this._families.size) return list;
281
+ const known = this._memo.get(list);
282
+ if (known !== undefined) return known;
283
+ const out: string[] = [];
284
+ const used: Family[] = [];
285
+ for (const raw of list.split(',')) {
286
+ const name = raw.trim();
287
+ if (!name) continue;
288
+ const family = this._families.get(name.toLowerCase());
289
+ if (!family) {
290
+ out.push(name);
291
+ continue;
292
+ }
293
+ used.push(family);
294
+ for (const group of orderedGroups(family)) {
295
+ if (group.faces.some((f) => f.state === 'ready')) out.push(group.name);
296
+ }
297
+ }
298
+ let mapped = out.length ? out.join(', ') : this._fallback;
299
+ // The generic `monospace` as the whole of a list is set smaller than any
300
+ // other list (the cascade's `FIXED_SIZE`), and the author's list, with a
301
+ // family of the document's in it, is not that list. Left as `monospace`
302
+ // while its family loads, `"Courier Prime", monospace` was set at 13/16
303
+ // and jumped to its size when the face arrived; `monospace, monospace`
304
+ // is the same face at the size the author's list has — normalize.css's
305
+ // spelling of it.
306
+ if (used.length && /^monospace$/i.test(mapped)) {
307
+ mapped = 'monospace, monospace';
308
+ }
309
+ this._memo.set(list, mapped);
310
+ if (used.length) {
311
+ const sources = this._sources.get(mapped);
312
+ if (!sources) this._sources.set(mapped, used);
313
+ else for (const f of used) if (!sources.includes(f)) sources.push(f);
314
+ }
315
+ return mapped;
316
+ }
317
+
318
+ note(style: ComputedStyle): void {
319
+ const families = this._sources.get(style.fontFamily);
320
+ if (!families) return;
321
+ const want = `${style.fontWeight}|${style.fontStyle !== 'normal' ? 1 : 0}`;
322
+ for (const family of families) family.wants.add(want);
323
+ }
324
+
325
+ /**
326
+ * Ask for the faces the styles noted since the last call want, for the
327
+ * characters `text` holds — the document's own. True when the lists the
328
+ * boxes were styled with are out of date already: a host that answers at
329
+ * once registered a face before this returned, or the document's text
330
+ * changed which range of a family should lead. The caller builds its boxes
331
+ * again.
332
+ */
333
+ request(text: string): boolean {
334
+ if (!this._families.size || this._destroyed) return false;
335
+ let stale = text !== this._text && this._measure(text, false);
336
+ for (const family of this._families.values()) {
337
+ for (const want of family.wants) {
338
+ if (family.asked.has(want)) continue;
339
+ family.asked.add(want);
340
+ const [weight, italic] = want.split('|');
341
+ for (const group of family.groups) {
342
+ if (group.coverage <= 0) continue;
343
+ if (this._pick(group, Number(weight), italic === '1')) stale = true;
344
+ }
345
+ }
346
+ }
347
+ if (stale) this._forget();
348
+ return stale;
349
+ }
350
+
351
+ destroy(): void {
352
+ this._destroyed = true;
353
+ this._families.clear();
354
+ this._forget();
355
+ }
356
+
357
+ /** Every list mapped before this is stale: a face arrived, or the faces
358
+ * changed. */
359
+ private _forget(): void {
360
+ this._memo.clear();
361
+ this._sources.clear();
362
+ }
363
+
364
+ /**
365
+ * Load the face in a group that best matches a weight and slant, passing
366
+ * over the ones that failed. True when one registered before this
367
+ * returned.
368
+ */
369
+ private _pick(group: Group, weight: number, italic: boolean): boolean {
370
+ for (;;) {
371
+ const face = bestFace(
372
+ group.faces.filter((f) => f.state !== 'failed'),
373
+ weight,
374
+ italic,
375
+ );
376
+ if (!face || face.state !== 'idle') return false;
377
+ const outcome = this._load(face);
378
+ if (outcome !== 'failed') return outcome === 'ready';
379
+ }
380
+ }
381
+
382
+ /**
383
+ * Count what of the document each group's range holds, for a new text.
384
+ * An append — a stream — only reads what it appended. True when a family's
385
+ * loaded ranges come in another order than they did.
386
+ */
387
+ private _measure(text: string, rescan: boolean): boolean {
388
+ const before = rescan ? '' : this._readyOrder();
389
+ const from =
390
+ !rescan && this._text !== null && text.startsWith(this._text)
391
+ ? this._text.length
392
+ : 0;
393
+ if (from === 0) this._seen.clear();
394
+ const seen = this._seen;
395
+ const size = seen.size;
396
+ for (let i = from; i < text.length; i += 1) {
397
+ const code = text.charCodeAt(i);
398
+ if (code >= 0xd800 && code <= 0xdbff && i + 1 < text.length) {
399
+ const low = text.charCodeAt(i + 1);
400
+ if (low >= 0xdc00 && low <= 0xdfff) {
401
+ seen.add(((code - 0xd800) << 10) + (low - 0xdc00) + 0x10000);
402
+ i += 1;
403
+ continue;
404
+ }
405
+ }
406
+ seen.add(code);
407
+ }
408
+ this._text = text;
409
+ if (seen.size !== size || from === 0) {
410
+ this._points = Uint32Array.from(seen).sort();
411
+ for (const family of this._families.values()) {
412
+ for (const group of family.groups) {
413
+ if (!group.ranges) continue;
414
+ let count = 0;
415
+ for (const [lo, hi] of group.ranges) {
416
+ count += countBetween(this._points, lo, hi);
417
+ }
418
+ // a range the text has reached only now — the Cyrillic further
419
+ // down a streamed page — is asked for with the weights the
420
+ // family was asked at before it was reached
421
+ if (group.coverage <= 0 && count > 0) family.asked.clear();
422
+ group.coverage = count;
423
+ }
424
+ }
425
+ }
426
+ return !rescan && this._readyOrder() !== before;
427
+ }
428
+
429
+ /** The loaded groups' names, family by family, in the order `map` puts
430
+ * them. */
431
+ private _readyOrder(): string {
432
+ let out = '';
433
+ for (const family of this._families.values()) {
434
+ for (const group of orderedGroups(family)) {
435
+ if (group.faces.some((f) => f.state === 'ready'))
436
+ out += `${group.name},`;
437
+ }
438
+ out += ';';
439
+ }
440
+ return out;
441
+ }
442
+
443
+ /** Load a face, trying its sources in order: registered before this
444
+ * returned, waiting on the host, or failed with nothing left to try. */
445
+ private _load(face: Face): 'ready' | 'loading' | 'failed' {
446
+ const app = this._app;
447
+ if (!app) {
448
+ face.state = 'failed';
449
+ return 'failed';
450
+ }
451
+ const registry = registryOf(app);
452
+ const key = faceKey(face.group.name, face.rule);
453
+ if (registry.ready.has(key)) {
454
+ face.state = 'ready';
455
+ return 'ready';
456
+ }
457
+ face.state = 'loading';
458
+ const waiting = registry.pending.get(key);
459
+ if (waiting) {
460
+ void waiting.then((ok) => this._settled(face, ok));
461
+ return 'loading';
462
+ }
463
+ let settle!: (ok: boolean) => void;
464
+ registry.pending.set(
465
+ key,
466
+ new Promise<boolean>((resolve) => (settle = resolve)),
467
+ );
468
+ const finish = (ok: boolean): void => {
469
+ registry.pending.delete(key);
470
+ if (ok) registry.ready.add(key);
471
+ settle(ok);
472
+ };
473
+
474
+ const sources = face.rule.sources.filter(
475
+ (s) => s.format === null || READABLE.has(s.format),
476
+ );
477
+ let i = 0;
478
+ let sync = true;
479
+ /** Ask for the next source. `'ready'` registered it, `'waiting'` is
480
+ * waiting on the host, `'none'` has no source left. */
481
+ const next = (): 'ready' | 'waiting' | 'none' => {
482
+ while (i < sources.length) {
483
+ const source = sources[i++];
484
+ let answer: ReturnType<Ask>;
485
+ try {
486
+ answer = this._ask({
487
+ url: source.url,
488
+ kind: 'font',
489
+ element: face.element,
490
+ });
491
+ } catch {
492
+ continue;
493
+ }
494
+ if (isPromise(answer)) {
495
+ answer.then(
496
+ (result) => after(this._register(face, result)),
497
+ () => after(false),
498
+ );
499
+ return 'waiting';
500
+ }
501
+ if (this._register(face, answer)) {
502
+ finish(true);
503
+ if (sync) face.state = 'ready';
504
+ else this._settled(face, true);
505
+ return 'ready';
506
+ }
507
+ }
508
+ return 'none';
509
+ };
510
+ const after = (registered: boolean): void => {
511
+ if (registered) {
512
+ finish(true);
513
+ this._settled(face, true);
514
+ } else if (next() === 'none') {
515
+ finish(false);
516
+ this._settled(face, false);
517
+ }
518
+ };
519
+ const outcome = next();
520
+ sync = false;
521
+ if (outcome === 'none') {
522
+ finish(false);
523
+ face.state = 'failed';
524
+ return 'failed';
525
+ }
526
+ return outcome === 'ready' ? 'ready' : 'loading';
527
+ }
528
+
529
+ /** Register a face's bytes under its group's name. False when the host
530
+ * declined, or the font manager could not read them — a `.woff2` on
531
+ * macOS, whose CoreText reads no such container, or a file that is not a
532
+ * font — and the next source is tried. */
533
+ private _register(face: Face, result: ResourceResult | null): boolean {
534
+ if (this._destroyed || !this._app || result?.kind !== 'font') return false;
535
+ const { weight, style } = face.rule;
536
+ try {
537
+ loadFont(this._app as Parameters<typeof loadFont>[0], result.bytes, {
538
+ family: face.group.name,
539
+ // a range is registered at the weight nearest regular in it: the
540
+ // font manager picks among a group's faces by distance from one
541
+ // weight, and a variable face is then set at the weight asked for
542
+ weight: Math.max(weight[0], Math.min(400, weight[1])),
543
+ style,
544
+ });
545
+ return true;
546
+ } catch {
547
+ return false;
548
+ }
549
+ }
550
+
551
+ /** A face arrived, or will not. Either way the boxes are built again: an
552
+ * arrival changes the lists, and a failure has the next face asked for,
553
+ * by a family that has to be asked again to ask it. */
554
+ private _settled(face: Face, ok: boolean): void {
555
+ if (this._destroyed) return;
556
+ face.state = ok ? 'ready' : 'failed';
557
+ if (!ok) face.family.asked.clear();
558
+ this._forget();
559
+ this._changed();
560
+ }
561
+ }
562
+
563
+ /** A face's identity within a registered name. */
564
+ function faceKey(name: string, rule: FontFaceRule): string {
565
+ return `${name}\u0000${faceSignature(rule)}`;
566
+ }
567
+
568
+ function faceSignature(rule: FontFaceRule): string {
569
+ const range = rangeKey(rule.unicodeRange);
570
+ return `${rule.sources.map((s) => s.url).join(' ')}@${rule.weight.join(
571
+ '-',
572
+ )}${rule.style}#${range}`;
573
+ }
574
+
575
+ function rangeKey(ranges: [number, number][] | null): string {
576
+ return ranges ? ranges.map(([a, b]) => `${a}-${b}`).join(',') : '*';
577
+ }
578
+
579
+ /** A family's groups, the one holding the most of the document first. */
580
+ function orderedGroups(family: Family): Group[] {
581
+ if (family.groups.length < 2) return family.groups;
582
+ return [...family.groups].sort(
583
+ (a, b) => b.coverage - a.coverage || a.order - b.order,
584
+ );
585
+ }
586
+
587
+ /**
588
+ * The face CSS Fonts 4 (5.2) matches a weight and slant with: the slant
589
+ * first, then a weight inside the face's range, then the nearest outside it
590
+ * in the direction the spec prefers — lighter below 400, heavier above 500,
591
+ * and between them up to 500 before down.
592
+ */
593
+ export function bestFace<T extends { rule: FontFaceRule }>(
594
+ faces: T[],
595
+ weight: number,
596
+ italic: boolean,
597
+ ): T | null {
598
+ let best: T | null = null;
599
+ let bestScore = Infinity;
600
+ for (const face of faces) {
601
+ const score =
602
+ weightDistance(weight, face.rule.weight) +
603
+ ((face.rule.style === 'italic') === italic ? 0 : 10000);
604
+ if (score < bestScore) {
605
+ best = face;
606
+ bestScore = score;
607
+ }
608
+ }
609
+ return best;
610
+ }
611
+
612
+ function weightDistance(want: number, [lo, hi]: [number, number]): number {
613
+ if (want >= lo && want <= hi) return 0;
614
+ if (want >= 400 && want <= 500) {
615
+ if (lo > want && lo <= 500) return lo - want;
616
+ if (hi < want) return 1000 + (want - hi);
617
+ return 2000 + (lo - want);
618
+ }
619
+ if (want < 400) return hi < want ? want - hi : 1000 + (lo - want);
620
+ return lo > want ? lo - want : 1000 + (want - hi);
621
+ }
622
+
623
+ /** How many of the sorted `points` lie in `[lo, hi]`. */
624
+ function countBetween(points: Uint32Array, lo: number, hi: number): number {
625
+ return lowerBound(points, hi + 1) - lowerBound(points, lo);
626
+ }
627
+
628
+ function lowerBound(points: Uint32Array, value: number): number {
629
+ let a = 0;
630
+ let b = points.length;
631
+ while (a < b) {
632
+ const mid = (a + b) >> 1;
633
+ if (points[mid] < value) a = mid + 1;
634
+ else b = mid;
635
+ }
636
+ return a;
637
+ }
638
+
639
+ function isPromise<T>(value: unknown): value is Promise<T> {
640
+ return typeof (value as Promise<T> | null)?.then === 'function';
641
+ }