@react-x11/components 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (721) hide show
  1. package/README.md +105 -38
  2. package/dist/charts/node.d.ts +12 -2
  3. package/dist/charts/node.d.ts.map +1 -1
  4. package/dist/charts/node.js +50 -16
  5. package/dist/charts/node.js.map +1 -1
  6. package/dist/charts/render.d.ts +12 -3
  7. package/dist/charts/render.d.ts.map +1 -1
  8. package/dist/charts/render.js +94 -25
  9. package/dist/charts/render.js.map +1 -1
  10. package/dist/code/index.d.ts.map +1 -1
  11. package/dist/code/index.js +3 -1
  12. package/dist/code/index.js.map +1 -1
  13. package/dist/code-editor/completion.d.ts.map +1 -1
  14. package/dist/code-editor/completion.js +3 -2
  15. package/dist/code-editor/completion.js.map +1 -1
  16. package/dist/code-editor/index.d.ts.map +1 -1
  17. package/dist/code-editor/index.js +19 -0
  18. package/dist/code-editor/index.js.map +1 -1
  19. package/dist/code-editor/node.d.ts +177 -7
  20. package/dist/code-editor/node.d.ts.map +1 -1
  21. package/dist/code-editor/node.js +1329 -164
  22. package/dist/code-editor/node.js.map +1 -1
  23. package/dist/code-language/languages/glsl.d.ts.map +1 -1
  24. package/dist/code-language/languages/glsl.js +10 -2
  25. package/dist/code-language/languages/glsl.js.map +1 -1
  26. package/dist/code-language/languages/javascript.d.ts.map +1 -1
  27. package/dist/code-language/languages/javascript.js +18 -3
  28. package/dist/code-language/languages/javascript.js.map +1 -1
  29. package/dist/code-language/languages/json.d.ts.map +1 -1
  30. package/dist/code-language/languages/json.js +10 -2
  31. package/dist/code-language/languages/json.js.map +1 -1
  32. package/dist/code-language/languages/shell.d.ts.map +1 -1
  33. package/dist/code-language/languages/shell.js +10 -2
  34. package/dist/code-language/languages/shell.js.map +1 -1
  35. package/dist/code-language/languages/sql.d.ts.map +1 -1
  36. package/dist/code-language/languages/sql.js +20 -2
  37. package/dist/code-language/languages/sql.js.map +1 -1
  38. package/dist/code-language/stream.d.ts +22 -0
  39. package/dist/code-language/stream.d.ts.map +1 -1
  40. package/dist/code-language/stream.js +259 -9
  41. package/dist/code-language/stream.js.map +1 -1
  42. package/dist/code-language/types.d.ts +5 -4
  43. package/dist/code-language/types.d.ts.map +1 -1
  44. package/dist/codeblock/index.d.ts +13 -2
  45. package/dist/codeblock/index.d.ts.map +1 -1
  46. package/dist/codeblock/index.js +20 -3
  47. package/dist/codeblock/index.js.map +1 -1
  48. package/dist/embed/client.d.ts +48 -3
  49. package/dist/embed/client.d.ts.map +1 -1
  50. package/dist/embed/client.js +79 -5
  51. package/dist/embed/client.js.map +1 -1
  52. package/dist/embed/index.d.ts +1 -1
  53. package/dist/embed/index.d.ts.map +1 -1
  54. package/dist/embed/index.js +1 -1
  55. package/dist/embed/index.js.map +1 -1
  56. package/dist/flow/draw.d.ts +50 -0
  57. package/dist/flow/draw.d.ts.map +1 -1
  58. package/dist/flow/draw.js +132 -33
  59. package/dist/flow/draw.js.map +1 -1
  60. package/dist/flow/gl/color.d.ts +13 -0
  61. package/dist/flow/gl/color.d.ts.map +1 -0
  62. package/dist/flow/gl/color.js +82 -0
  63. package/dist/flow/gl/color.js.map +1 -0
  64. package/dist/flow/gl/index.d.ts +60 -0
  65. package/dist/flow/gl/index.d.ts.map +1 -0
  66. package/dist/flow/gl/index.js +283 -0
  67. package/dist/flow/gl/index.js.map +1 -0
  68. package/dist/flow/gl/pack.d.ts +133 -0
  69. package/dist/flow/gl/pack.d.ts.map +1 -0
  70. package/dist/flow/gl/pack.js +408 -0
  71. package/dist/flow/gl/pack.js.map +1 -0
  72. package/dist/flow/gl/renderer.d.ts +95 -0
  73. package/dist/flow/gl/renderer.d.ts.map +1 -0
  74. package/dist/flow/gl/renderer.js +459 -0
  75. package/dist/flow/gl/renderer.js.map +1 -0
  76. package/dist/flow/gl/shaders.d.ts +79 -0
  77. package/dist/flow/gl/shaders.d.ts.map +1 -0
  78. package/dist/flow/gl/shaders.js +346 -0
  79. package/dist/flow/gl/shaders.js.map +1 -0
  80. package/dist/flow/gl/text.d.ts +318 -0
  81. package/dist/flow/gl/text.d.ts.map +1 -0
  82. package/dist/flow/gl/text.js +1103 -0
  83. package/dist/flow/gl/text.js.map +1 -0
  84. package/dist/flow/index.d.ts +1 -1
  85. package/dist/flow/index.d.ts.map +1 -1
  86. package/dist/flow/index.js +619 -64
  87. package/dist/flow/index.js.map +1 -1
  88. package/dist/flow/node.d.ts +621 -72
  89. package/dist/flow/node.d.ts.map +1 -1
  90. package/dist/flow/node.js +2253 -1018
  91. package/dist/flow/node.js.map +1 -1
  92. package/dist/flow/paint.d.ts +35 -0
  93. package/dist/flow/paint.d.ts.map +1 -0
  94. package/dist/flow/paint.js +393 -0
  95. package/dist/flow/paint.js.map +1 -0
  96. package/dist/flow/paths.d.ts +14 -0
  97. package/dist/flow/paths.d.ts.map +1 -1
  98. package/dist/flow/paths.js +45 -19
  99. package/dist/flow/paths.js.map +1 -1
  100. package/dist/flow/scene.d.ts +584 -0
  101. package/dist/flow/scene.d.ts.map +1 -0
  102. package/dist/flow/scene.js +1453 -0
  103. package/dist/flow/scene.js.map +1 -0
  104. package/dist/flow/types.d.ts +111 -1
  105. package/dist/flow/types.d.ts.map +1 -1
  106. package/dist/html/controls.d.ts +28 -0
  107. package/dist/html/controls.d.ts.map +1 -1
  108. package/dist/html/controls.js +52 -2
  109. package/dist/html/controls.js.map +1 -1
  110. package/dist/html/css/calc.d.ts +14 -0
  111. package/dist/html/css/calc.d.ts.map +1 -0
  112. package/dist/html/css/calc.js +344 -0
  113. package/dist/html/css/calc.js.map +1 -0
  114. package/dist/html/css/cascade.d.ts +240 -6
  115. package/dist/html/css/cascade.d.ts.map +1 -1
  116. package/dist/html/css/cascade.js +1327 -66
  117. package/dist/html/css/cascade.js.map +1 -1
  118. package/dist/html/css/color.d.ts +23 -0
  119. package/dist/html/css/color.d.ts.map +1 -0
  120. package/dist/html/css/color.js +740 -0
  121. package/dist/html/css/color.js.map +1 -0
  122. package/dist/html/css/content.d.ts +92 -0
  123. package/dist/html/css/content.d.ts.map +1 -0
  124. package/dist/html/css/content.js +388 -0
  125. package/dist/html/css/content.js.map +1 -0
  126. package/dist/html/css/counter-styles.d.ts +76 -0
  127. package/dist/html/css/counter-styles.d.ts.map +1 -0
  128. package/dist/html/css/counter-styles.js +893 -0
  129. package/dist/html/css/counter-styles.js.map +1 -0
  130. package/dist/html/css/decode.d.ts +12 -0
  131. package/dist/html/css/decode.d.ts.map +1 -0
  132. package/dist/html/css/decode.js +116 -0
  133. package/dist/html/css/decode.js.map +1 -0
  134. package/dist/html/css/parse.d.ts +110 -10
  135. package/dist/html/css/parse.d.ts.map +1 -1
  136. package/dist/html/css/parse.js +1473 -180
  137. package/dist/html/css/parse.js.map +1 -1
  138. package/dist/html/css/style.d.ts +498 -15
  139. package/dist/html/css/style.d.ts.map +1 -1
  140. package/dist/html/css/style.js +3698 -206
  141. package/dist/html/css/style.js.map +1 -1
  142. package/dist/html/css/ua.d.ts.map +1 -1
  143. package/dist/html/css/ua.js +57 -11
  144. package/dist/html/css/ua.js.map +1 -1
  145. package/dist/html/css/values.d.ts +37 -3
  146. package/dist/html/css/values.d.ts.map +1 -1
  147. package/dist/html/css/values.js +122 -48
  148. package/dist/html/css/values.js.map +1 -1
  149. package/dist/html/css/vars.d.ts +52 -0
  150. package/dist/html/css/vars.d.ts.map +1 -0
  151. package/dist/html/css/vars.js +358 -0
  152. package/dist/html/css/vars.js.map +1 -0
  153. package/dist/html/dom.d.ts +30 -4
  154. package/dist/html/dom.d.ts.map +1 -1
  155. package/dist/html/dom.js +278 -17
  156. package/dist/html/dom.js.map +1 -1
  157. package/dist/html/fonts.d.ts +106 -0
  158. package/dist/html/fonts.d.ts.map +1 -0
  159. package/dist/html/fonts.js +565 -0
  160. package/dist/html/fonts.js.map +1 -0
  161. package/dist/html/gif.d.ts +15 -0
  162. package/dist/html/gif.d.ts.map +1 -0
  163. package/dist/html/gif.js +229 -0
  164. package/dist/html/gif.js.map +1 -0
  165. package/dist/html/index.d.ts +50 -11
  166. package/dist/html/index.d.ts.map +1 -1
  167. package/dist/html/index.js +115 -9
  168. package/dist/html/index.js.map +1 -1
  169. package/dist/html/layout/block.d.ts +226 -3
  170. package/dist/html/layout/block.d.ts.map +1 -1
  171. package/dist/html/layout/block.js +2937 -197
  172. package/dist/html/layout/block.js.map +1 -1
  173. package/dist/html/layout/boxes.d.ts +340 -17
  174. package/dist/html/layout/boxes.d.ts.map +1 -1
  175. package/dist/html/layout/boxes.js +1714 -182
  176. package/dist/html/layout/boxes.js.map +1 -1
  177. package/dist/html/layout/cache.d.ts +58 -0
  178. package/dist/html/layout/cache.d.ts.map +1 -0
  179. package/dist/html/layout/cache.js +224 -0
  180. package/dist/html/layout/cache.js.map +1 -0
  181. package/dist/html/layout/collapse.d.ts +45 -0
  182. package/dist/html/layout/collapse.d.ts.map +1 -0
  183. package/dist/html/layout/collapse.js +246 -0
  184. package/dist/html/layout/collapse.js.map +1 -0
  185. package/dist/html/layout/css-grid.d.ts +7 -0
  186. package/dist/html/layout/css-grid.d.ts.map +1 -0
  187. package/dist/html/layout/css-grid.js +900 -0
  188. package/dist/html/layout/css-grid.js.map +1 -0
  189. package/dist/html/layout/flex.d.ts.map +1 -1
  190. package/dist/html/layout/flex.js +1025 -89
  191. package/dist/html/layout/flex.js.map +1 -1
  192. package/dist/html/layout/floats.d.ts +45 -6
  193. package/dist/html/layout/floats.d.ts.map +1 -1
  194. package/dist/html/layout/floats.js +113 -14
  195. package/dist/html/layout/floats.js.map +1 -1
  196. package/dist/html/layout/grid-lines.d.ts +39 -0
  197. package/dist/html/layout/grid-lines.d.ts.map +1 -0
  198. package/dist/html/layout/grid-lines.js +119 -0
  199. package/dist/html/layout/grid-lines.js.map +1 -0
  200. package/dist/html/layout/grid.d.ts +53 -0
  201. package/dist/html/layout/grid.d.ts.map +1 -0
  202. package/dist/html/layout/grid.js +153 -0
  203. package/dist/html/layout/grid.js.map +1 -0
  204. package/dist/html/layout/inline.d.ts +151 -1
  205. package/dist/html/layout/inline.d.ts.map +1 -1
  206. package/dist/html/layout/inline.js +3375 -174
  207. package/dist/html/layout/inline.js.map +1 -1
  208. package/dist/html/layout/shaping.d.ts +6 -0
  209. package/dist/html/layout/shaping.d.ts.map +1 -0
  210. package/dist/html/layout/shaping.js +100 -0
  211. package/dist/html/layout/shaping.js.map +1 -0
  212. package/dist/html/layout/table.d.ts +3 -0
  213. package/dist/html/layout/table.d.ts.map +1 -1
  214. package/dist/html/layout/table.js +681 -175
  215. package/dist/html/layout/table.js.map +1 -1
  216. package/dist/html/layout/tracks.d.ts +44 -0
  217. package/dist/html/layout/tracks.d.ts.map +1 -0
  218. package/dist/html/layout/tracks.js +349 -0
  219. package/dist/html/layout/tracks.js.map +1 -0
  220. package/dist/html/node.d.ts +172 -5
  221. package/dist/html/node.d.ts.map +1 -1
  222. package/dist/html/node.js +1336 -103
  223. package/dist/html/node.js.map +1 -1
  224. package/dist/html/paint.d.ts +92 -3
  225. package/dist/html/paint.d.ts.map +1 -1
  226. package/dist/html/paint.js +3503 -141
  227. package/dist/html/paint.js.map +1 -1
  228. package/dist/html/resources.d.ts +60 -14
  229. package/dist/html/resources.d.ts.map +1 -1
  230. package/dist/html/resources.js +122 -36
  231. package/dist/html/resources.js.map +1 -1
  232. package/dist/html/surfaces.d.ts +23 -0
  233. package/dist/html/surfaces.d.ts.map +1 -0
  234. package/dist/html/surfaces.js +68 -0
  235. package/dist/html/surfaces.js.map +1 -0
  236. package/dist/html/svg.d.ts +80 -0
  237. package/dist/html/svg.d.ts.map +1 -0
  238. package/dist/html/svg.js +435 -0
  239. package/dist/html/svg.js.map +1 -0
  240. package/dist/html/url.d.ts +23 -0
  241. package/dist/html/url.d.ts.map +1 -0
  242. package/dist/html/url.js +80 -0
  243. package/dist/html/url.js.map +1 -0
  244. package/dist/index.d.ts +2 -2
  245. package/dist/index.d.ts.map +1 -1
  246. package/dist/index.js +1 -1
  247. package/dist/index.js.map +1 -1
  248. package/dist/internal/collate.d.ts +3 -0
  249. package/dist/internal/collate.d.ts.map +1 -0
  250. package/dist/internal/collate.js +11 -0
  251. package/dist/internal/collate.js.map +1 -0
  252. package/dist/{markdown → internal/markdown}/ast.d.ts +23 -0
  253. package/dist/internal/markdown/ast.d.ts.map +1 -0
  254. package/dist/internal/markdown/ast.js +22 -0
  255. package/dist/internal/markdown/ast.js.map +1 -0
  256. package/dist/internal/markdown/parse.d.ts.map +1 -0
  257. package/dist/{markdown → internal/markdown}/parse.js +221 -30
  258. package/dist/internal/markdown/parse.js.map +1 -0
  259. package/dist/internal/markdown/stringify.d.ts +4 -0
  260. package/dist/internal/markdown/stringify.d.ts.map +1 -0
  261. package/dist/internal/markdown/stringify.js +684 -0
  262. package/dist/internal/markdown/stringify.js.map +1 -0
  263. package/dist/internal/markdown/tags.d.ts.map +1 -0
  264. package/dist/internal/markdown/tags.js.map +1 -0
  265. package/dist/internal/prewarm.d.ts +18 -0
  266. package/dist/internal/prewarm.d.ts.map +1 -0
  267. package/dist/internal/prewarm.js +42 -0
  268. package/dist/internal/prewarm.js.map +1 -0
  269. package/dist/internal/scroll.d.ts +3 -2
  270. package/dist/internal/scroll.d.ts.map +1 -1
  271. package/dist/internal/scroll.js +1 -0
  272. package/dist/internal/scroll.js.map +1 -1
  273. package/dist/internal/sdf.d.ts +20 -0
  274. package/dist/internal/sdf.d.ts.map +1 -0
  275. package/dist/internal/sdf.js +216 -0
  276. package/dist/internal/sdf.js.map +1 -0
  277. package/dist/internal/splice.d.ts +12 -0
  278. package/dist/internal/splice.d.ts.map +1 -0
  279. package/dist/internal/splice.js +23 -0
  280. package/dist/internal/splice.js.map +1 -0
  281. package/dist/internal/window.d.ts +12 -0
  282. package/dist/internal/window.d.ts.map +1 -1
  283. package/dist/internal/window.js +23 -6
  284. package/dist/internal/window.js.map +1 -1
  285. package/dist/maps/anchors.d.ts +103 -0
  286. package/dist/maps/anchors.d.ts.map +1 -0
  287. package/dist/maps/anchors.js +790 -0
  288. package/dist/maps/anchors.js.map +1 -0
  289. package/dist/maps/controller.d.ts +340 -0
  290. package/dist/maps/controller.d.ts.map +1 -0
  291. package/dist/maps/controller.js +822 -0
  292. package/dist/maps/controller.js.map +1 -0
  293. package/dist/maps/gl/buckets.d.ts +99 -0
  294. package/dist/maps/gl/buckets.d.ts.map +1 -0
  295. package/dist/maps/gl/buckets.js +365 -0
  296. package/dist/maps/gl/buckets.js.map +1 -0
  297. package/dist/maps/gl/build-worker.d.ts +15 -0
  298. package/dist/maps/gl/build-worker.d.ts.map +1 -0
  299. package/dist/maps/gl/build-worker.js +44 -0
  300. package/dist/maps/gl/build-worker.js.map +1 -0
  301. package/dist/maps/gl/color.d.ts +8 -0
  302. package/dist/maps/gl/color.d.ts.map +1 -0
  303. package/dist/maps/gl/color.js +57 -0
  304. package/dist/maps/gl/color.js.map +1 -0
  305. package/dist/maps/gl/cover.d.ts +70 -0
  306. package/dist/maps/gl/cover.d.ts.map +1 -0
  307. package/dist/maps/gl/cover.js +137 -0
  308. package/dist/maps/gl/cover.js.map +1 -0
  309. package/dist/maps/gl/index.d.ts +3 -0
  310. package/dist/maps/gl/index.d.ts.map +1 -0
  311. package/dist/maps/gl/index.js +20 -0
  312. package/dist/maps/gl/index.js.map +1 -0
  313. package/dist/maps/gl/markers.d.ts +28 -0
  314. package/dist/maps/gl/markers.d.ts.map +1 -0
  315. package/dist/maps/gl/markers.js +60 -0
  316. package/dist/maps/gl/markers.js.map +1 -0
  317. package/dist/maps/gl/overlays.d.ts +68 -0
  318. package/dist/maps/gl/overlays.d.ts.map +1 -0
  319. package/dist/maps/gl/overlays.js +300 -0
  320. package/dist/maps/gl/overlays.js.map +1 -0
  321. package/dist/maps/gl/pane.d.ts +12 -0
  322. package/dist/maps/gl/pane.d.ts.map +1 -0
  323. package/dist/maps/gl/pane.js +37 -0
  324. package/dist/maps/gl/pane.js.map +1 -0
  325. package/dist/maps/gl/placement.d.ts +124 -0
  326. package/dist/maps/gl/placement.d.ts.map +1 -0
  327. package/dist/maps/gl/placement.js +642 -0
  328. package/dist/maps/gl/placement.js.map +1 -0
  329. package/dist/maps/gl/renderer.d.ts +384 -0
  330. package/dist/maps/gl/renderer.d.ts.map +1 -0
  331. package/dist/maps/gl/renderer.js +1184 -0
  332. package/dist/maps/gl/renderer.js.map +1 -0
  333. package/dist/maps/gl/shaders.d.ts +121 -0
  334. package/dist/maps/gl/shaders.d.ts.map +1 -0
  335. package/dist/maps/gl/shaders.js +453 -0
  336. package/dist/maps/gl/shaders.js.map +1 -0
  337. package/dist/maps/gl/store.d.ts +125 -0
  338. package/dist/maps/gl/store.d.ts.map +1 -0
  339. package/dist/maps/gl/store.js +512 -0
  340. package/dist/maps/gl/store.js.map +1 -0
  341. package/dist/maps/gl/text.d.ts +283 -0
  342. package/dist/maps/gl/text.d.ts.map +1 -0
  343. package/dist/maps/gl/text.js +698 -0
  344. package/dist/maps/gl/text.js.map +1 -0
  345. package/dist/maps/gl/view.d.ts +345 -0
  346. package/dist/maps/gl/view.d.ts.map +1 -0
  347. package/dist/maps/gl/view.js +1209 -0
  348. package/dist/maps/gl/view.js.map +1 -0
  349. package/dist/maps/icons.d.ts +32 -0
  350. package/dist/maps/icons.d.ts.map +1 -0
  351. package/dist/maps/icons.js +151 -0
  352. package/dist/maps/icons.js.map +1 -0
  353. package/dist/maps/index.d.ts +3 -1
  354. package/dist/maps/index.d.ts.map +1 -1
  355. package/dist/maps/index.js +218 -52
  356. package/dist/maps/index.js.map +1 -1
  357. package/dist/maps/labels.d.ts +91 -18
  358. package/dist/maps/labels.d.ts.map +1 -1
  359. package/dist/maps/labels.js +376 -140
  360. package/dist/maps/labels.js.map +1 -1
  361. package/dist/maps/node.d.ts +179 -56
  362. package/dist/maps/node.d.ts.map +1 -1
  363. package/dist/maps/node.js +663 -537
  364. package/dist/maps/node.js.map +1 -1
  365. package/dist/maps/overlay.d.ts +72 -9
  366. package/dist/maps/overlay.d.ts.map +1 -1
  367. package/dist/maps/overlay.js +108 -28
  368. package/dist/maps/overlay.js.map +1 -1
  369. package/dist/maps/paint.d.ts +3 -0
  370. package/dist/maps/paint.d.ts.map +1 -1
  371. package/dist/maps/paint.js.map +1 -1
  372. package/dist/maps/proj.d.ts +62 -0
  373. package/dist/maps/proj.d.ts.map +1 -1
  374. package/dist/maps/proj.js +101 -0
  375. package/dist/maps/proj.js.map +1 -1
  376. package/dist/maps/renderer.d.ts +69 -0
  377. package/dist/maps/renderer.d.ts.map +1 -0
  378. package/dist/maps/renderer.js +66 -0
  379. package/dist/maps/renderer.js.map +1 -0
  380. package/dist/maps/sources.d.ts +30 -6
  381. package/dist/maps/sources.d.ts.map +1 -1
  382. package/dist/maps/sources.js +22 -3
  383. package/dist/maps/sources.js.map +1 -1
  384. package/dist/maps/style.d.ts +35 -0
  385. package/dist/maps/style.d.ts.map +1 -1
  386. package/dist/maps/style.js.map +1 -1
  387. package/dist/maps/styles.d.ts +12 -0
  388. package/dist/maps/styles.d.ts.map +1 -1
  389. package/dist/maps/styles.js +120 -6
  390. package/dist/maps/styles.js.map +1 -1
  391. package/dist/maps/theme.d.ts +19 -0
  392. package/dist/maps/theme.d.ts.map +1 -0
  393. package/dist/maps/theme.js +44 -0
  394. package/dist/maps/theme.js.map +1 -0
  395. package/dist/maps/tiles.d.ts +147 -27
  396. package/dist/maps/tiles.d.ts.map +1 -1
  397. package/dist/maps/tiles.js +221 -54
  398. package/dist/maps/tiles.js.map +1 -1
  399. package/dist/maps/types.d.ts +213 -21
  400. package/dist/maps/types.d.ts.map +1 -1
  401. package/dist/markdown/expressions.d.ts +1 -1
  402. package/dist/markdown/expressions.d.ts.map +1 -1
  403. package/dist/markdown/expressions.js.map +1 -1
  404. package/dist/markdown/index.d.ts +7 -6
  405. package/dist/markdown/index.d.ts.map +1 -1
  406. package/dist/markdown/index.js +121 -50
  407. package/dist/markdown/index.js.map +1 -1
  408. package/dist/markdown/spans.d.ts +1 -1
  409. package/dist/markdown/spans.d.ts.map +1 -1
  410. package/dist/markdown/spans.js +6 -0
  411. package/dist/markdown/spans.js.map +1 -1
  412. package/dist/media-player/index.d.ts +11 -3
  413. package/dist/media-player/index.d.ts.map +1 -1
  414. package/dist/media-player/index.js +13 -2
  415. package/dist/media-player/index.js.map +1 -1
  416. package/dist/qml/containers.d.ts.map +1 -1
  417. package/dist/qml/containers.js +6 -1
  418. package/dist/qml/containers.js.map +1 -1
  419. package/dist/qml/interaction.d.ts.map +1 -1
  420. package/dist/qml/interaction.js +38 -5
  421. package/dist/qml/interaction.js.map +1 -1
  422. package/dist/qml/layouts.d.ts.map +1 -1
  423. package/dist/qml/layouts.js +21 -6
  424. package/dist/qml/layouts.js.map +1 -1
  425. package/dist/qml/qtquick.d.ts.map +1 -1
  426. package/dist/qml/qtquick.js +9 -2
  427. package/dist/qml/qtquick.js.map +1 -1
  428. package/dist/qml/react.d.ts.map +1 -1
  429. package/dist/qml/react.js +9 -7
  430. package/dist/qml/react.js.map +1 -1
  431. package/dist/reorder/clock.d.ts +7 -0
  432. package/dist/reorder/clock.d.ts.map +1 -0
  433. package/dist/reorder/clock.js +26 -0
  434. package/dist/reorder/clock.js.map +1 -0
  435. package/dist/reorder/index.d.ts +25 -3
  436. package/dist/reorder/index.d.ts.map +1 -1
  437. package/dist/reorder/index.js +64 -19
  438. package/dist/reorder/index.js.map +1 -1
  439. package/dist/rich-text-editor/clipboard.d.ts +23 -0
  440. package/dist/rich-text-editor/clipboard.d.ts.map +1 -0
  441. package/dist/rich-text-editor/clipboard.js +307 -0
  442. package/dist/rich-text-editor/clipboard.js.map +1 -0
  443. package/dist/rich-text-editor/collab.d.ts +32 -0
  444. package/dist/rich-text-editor/collab.d.ts.map +1 -0
  445. package/dist/rich-text-editor/collab.js +55 -0
  446. package/dist/rich-text-editor/collab.js.map +1 -0
  447. package/dist/rich-text-editor/commands.d.ts +50 -0
  448. package/dist/rich-text-editor/commands.d.ts.map +1 -0
  449. package/dist/rich-text-editor/commands.js +376 -0
  450. package/dist/rich-text-editor/commands.js.map +1 -0
  451. package/dist/rich-text-editor/drag.d.ts +68 -0
  452. package/dist/rich-text-editor/drag.d.ts.map +1 -0
  453. package/dist/rich-text-editor/drag.js +148 -0
  454. package/dist/rich-text-editor/drag.js.map +1 -0
  455. package/dist/rich-text-editor/html.d.ts +145 -0
  456. package/dist/rich-text-editor/html.d.ts.map +1 -0
  457. package/dist/rich-text-editor/html.js +516 -0
  458. package/dist/rich-text-editor/html.js.map +1 -0
  459. package/dist/rich-text-editor/index.d.ts +252 -0
  460. package/dist/rich-text-editor/index.d.ts.map +1 -0
  461. package/dist/rich-text-editor/index.js +856 -0
  462. package/dist/rich-text-editor/index.js.map +1 -0
  463. package/dist/rich-text-editor/inline.d.ts +94 -0
  464. package/dist/rich-text-editor/inline.d.ts.map +1 -0
  465. package/dist/rich-text-editor/inline.js +252 -0
  466. package/dist/rich-text-editor/inline.js.map +1 -0
  467. package/dist/rich-text-editor/keymap.d.ts +71 -0
  468. package/dist/rich-text-editor/keymap.d.ts.map +1 -0
  469. package/dist/rich-text-editor/keymap.js +394 -0
  470. package/dist/rich-text-editor/keymap.js.map +1 -0
  471. package/dist/rich-text-editor/keys.d.ts +40 -0
  472. package/dist/rich-text-editor/keys.d.ts.map +1 -0
  473. package/dist/rich-text-editor/keys.js +202 -0
  474. package/dist/rich-text-editor/keys.js.map +1 -0
  475. package/dist/rich-text-editor/look.d.ts +71 -0
  476. package/dist/rich-text-editor/look.d.ts.map +1 -0
  477. package/dist/rich-text-editor/look.js +342 -0
  478. package/dist/rich-text-editor/look.js.map +1 -0
  479. package/dist/rich-text-editor/markdown.d.ts +18 -0
  480. package/dist/rich-text-editor/markdown.d.ts.map +1 -0
  481. package/dist/rich-text-editor/markdown.js +496 -0
  482. package/dist/rich-text-editor/markdown.js.map +1 -0
  483. package/dist/rich-text-editor/marks.d.ts +9 -0
  484. package/dist/rich-text-editor/marks.d.ts.map +1 -0
  485. package/dist/rich-text-editor/marks.js +83 -0
  486. package/dist/rich-text-editor/marks.js.map +1 -0
  487. package/dist/rich-text-editor/nodes.d.ts +135 -0
  488. package/dist/rich-text-editor/nodes.d.ts.map +1 -0
  489. package/dist/rich-text-editor/nodes.js +397 -0
  490. package/dist/rich-text-editor/nodes.js.map +1 -0
  491. package/dist/rich-text-editor/render.d.ts +68 -0
  492. package/dist/rich-text-editor/render.d.ts.map +1 -0
  493. package/dist/rich-text-editor/render.js +518 -0
  494. package/dist/rich-text-editor/render.js.map +1 -0
  495. package/dist/rich-text-editor/schema.d.ts +16 -0
  496. package/dist/rich-text-editor/schema.d.ts.map +1 -0
  497. package/dist/rich-text-editor/schema.js +386 -0
  498. package/dist/rich-text-editor/schema.js.map +1 -0
  499. package/dist/rich-text-editor/store.d.ts +11 -0
  500. package/dist/rich-text-editor/store.d.ts.map +1 -0
  501. package/dist/rich-text-editor/store.js +43 -0
  502. package/dist/rich-text-editor/store.js.map +1 -0
  503. package/dist/rich-text-editor/suggest.d.ts +127 -0
  504. package/dist/rich-text-editor/suggest.d.ts.map +1 -0
  505. package/dist/rich-text-editor/suggest.js +0 -0
  506. package/dist/rich-text-editor/suggest.js.map +1 -0
  507. package/dist/rich-text-editor/tables.d.ts +41 -0
  508. package/dist/rich-text-editor/tables.d.ts.map +1 -0
  509. package/dist/rich-text-editor/tables.js +204 -0
  510. package/dist/rich-text-editor/tables.js.map +1 -0
  511. package/dist/rich-text-editor/toolbar.d.ts +58 -0
  512. package/dist/rich-text-editor/toolbar.d.ts.map +1 -0
  513. package/dist/rich-text-editor/toolbar.js +548 -0
  514. package/dist/rich-text-editor/toolbar.js.map +1 -0
  515. package/dist/rich-text-editor/view.d.ts +368 -0
  516. package/dist/rich-text-editor/view.d.ts.map +1 -0
  517. package/dist/rich-text-editor/view.js +1968 -0
  518. package/dist/rich-text-editor/view.js.map +1 -0
  519. package/dist/rich-text-editor/virtual.d.ts +54 -0
  520. package/dist/rich-text-editor/virtual.d.ts.map +1 -0
  521. package/dist/rich-text-editor/virtual.js +279 -0
  522. package/dist/rich-text-editor/virtual.js.map +1 -0
  523. package/dist/richtext/node.d.ts +71 -4
  524. package/dist/richtext/node.d.ts.map +1 -1
  525. package/dist/richtext/node.js +233 -28
  526. package/dist/richtext/node.js.map +1 -1
  527. package/dist/richtext/runs.d.ts +13 -8
  528. package/dist/richtext/runs.d.ts.map +1 -1
  529. package/dist/richtext/runs.js +18 -8
  530. package/dist/richtext/runs.js.map +1 -1
  531. package/dist/table/index.d.ts.map +1 -1
  532. package/dist/table/index.js +23 -0
  533. package/dist/table/index.js.map +1 -1
  534. package/dist/table/rows.d.ts +3 -2
  535. package/dist/table/rows.d.ts.map +1 -1
  536. package/dist/table/rows.js +20 -6
  537. package/dist/table/rows.js.map +1 -1
  538. package/dist/terminal/backends.d.ts +4 -1
  539. package/dist/terminal/backends.d.ts.map +1 -1
  540. package/dist/terminal/backends.js.map +1 -1
  541. package/dist/terminal/index.d.ts +18 -7
  542. package/dist/terminal/index.d.ts.map +1 -1
  543. package/dist/terminal/index.js +32 -11
  544. package/dist/terminal/index.js.map +1 -1
  545. package/dist/terminal/vt/pty.d.ts +13 -2
  546. package/dist/terminal/vt/pty.d.ts.map +1 -1
  547. package/dist/terminal/vt/pty.js +18 -3
  548. package/dist/terminal/vt/pty.js.map +1 -1
  549. package/dist/terminal-output/index.d.ts.map +1 -1
  550. package/dist/terminal-output/index.js +6 -1
  551. package/dist/terminal-output/index.js.map +1 -1
  552. package/dist/three/canvas.d.ts.map +1 -1
  553. package/dist/three/canvas.js +85 -7
  554. package/dist/three/canvas.js.map +1 -1
  555. package/dist/three/events.d.ts +22 -4
  556. package/dist/three/events.d.ts.map +1 -1
  557. package/dist/three/events.js +34 -4
  558. package/dist/three/events.js.map +1 -1
  559. package/dist/tree/index.d.ts.map +1 -1
  560. package/dist/tree/index.js +17 -0
  561. package/dist/tree/index.js.map +1 -1
  562. package/package.json +59 -31
  563. package/src/charts/node.ts +68 -28
  564. package/src/charts/render.ts +120 -30
  565. package/src/code/index.ts +3 -1
  566. package/src/code-editor/completion.ts +3 -2
  567. package/src/code-editor/index.ts +19 -0
  568. package/src/code-editor/node.ts +1574 -184
  569. package/src/code-language/languages/glsl.ts +12 -2
  570. package/src/code-language/languages/javascript.ts +21 -4
  571. package/src/code-language/languages/json.ts +12 -2
  572. package/src/code-language/languages/shell.ts +12 -2
  573. package/src/code-language/languages/sql.ts +22 -2
  574. package/src/code-language/stream.ts +257 -17
  575. package/src/code-language/types.ts +5 -4
  576. package/src/codeblock/index.ts +20 -3
  577. package/src/embed/client.ts +102 -8
  578. package/src/embed/index.ts +2 -0
  579. package/src/flow/draw.ts +167 -41
  580. package/src/flow/gl/color.ts +85 -0
  581. package/src/flow/gl/index.ts +342 -0
  582. package/src/flow/gl/pack.ts +585 -0
  583. package/src/flow/gl/renderer.ts +679 -0
  584. package/src/flow/gl/shaders.ts +371 -0
  585. package/src/flow/gl/text.ts +1295 -0
  586. package/src/flow/index.ts +794 -67
  587. package/src/flow/node.ts +2496 -1256
  588. package/src/flow/paint.ts +511 -0
  589. package/src/flow/paths.ts +80 -15
  590. package/src/flow/scene.ts +2199 -0
  591. package/src/flow/types.ts +113 -1
  592. package/src/html/controls.ts +73 -2
  593. package/src/html/css/calc.ts +385 -0
  594. package/src/html/css/cascade.ts +1403 -62
  595. package/src/html/css/color.ts +755 -0
  596. package/src/html/css/content.ts +417 -0
  597. package/src/html/css/counter-styles.ts +973 -0
  598. package/src/html/css/decode.ts +130 -0
  599. package/src/html/css/parse.ts +1514 -160
  600. package/src/html/css/style.ts +4102 -222
  601. package/src/html/css/ua.ts +58 -12
  602. package/src/html/css/values.ts +150 -50
  603. package/src/html/css/vars.ts +348 -0
  604. package/src/html/dom.ts +284 -17
  605. package/src/html/fonts.ts +641 -0
  606. package/src/html/gif.ts +233 -0
  607. package/src/html/index.ts +180 -20
  608. package/src/html/layout/block.ts +3456 -230
  609. package/src/html/layout/boxes.ts +2100 -190
  610. package/src/html/layout/cache.ts +289 -0
  611. package/src/html/layout/collapse.ts +317 -0
  612. package/src/html/layout/css-grid.ts +1063 -0
  613. package/src/html/layout/flex.ts +1115 -106
  614. package/src/html/layout/floats.ts +128 -14
  615. package/src/html/layout/grid-lines.ts +141 -0
  616. package/src/html/layout/grid.ts +181 -0
  617. package/src/html/layout/inline.ts +3943 -192
  618. package/src/html/layout/shaping.ts +140 -0
  619. package/src/html/layout/table.ts +696 -186
  620. package/src/html/layout/tracks.ts +437 -0
  621. package/src/html/node.ts +1486 -121
  622. package/src/html/paint.ts +4293 -169
  623. package/src/html/resources.ts +161 -50
  624. package/src/html/surfaces.ts +81 -0
  625. package/src/html/svg.ts +493 -0
  626. package/src/html/url.ts +86 -0
  627. package/src/index.ts +4 -0
  628. package/src/internal/collate.ts +12 -0
  629. package/src/{markdown → internal/markdown}/ast.ts +35 -7
  630. package/src/{markdown → internal/markdown}/parse.ts +288 -35
  631. package/src/internal/markdown/stringify.ts +772 -0
  632. package/src/internal/prewarm.ts +45 -0
  633. package/src/internal/scroll.ts +5 -3
  634. package/src/internal/sdf.ts +227 -0
  635. package/src/internal/splice.ts +25 -0
  636. package/src/internal/window.ts +36 -5
  637. package/src/maps/anchors.ts +913 -0
  638. package/src/maps/controller.ts +1084 -0
  639. package/src/maps/gl/buckets.ts +461 -0
  640. package/src/maps/gl/build-worker.ts +66 -0
  641. package/src/maps/gl/color.ts +62 -0
  642. package/src/maps/gl/cover.ts +205 -0
  643. package/src/maps/gl/index.ts +23 -0
  644. package/src/maps/gl/markers.ts +83 -0
  645. package/src/maps/gl/overlays.ts +379 -0
  646. package/src/maps/gl/pane.ts +42 -0
  647. package/src/maps/gl/placement.ts +968 -0
  648. package/src/maps/gl/renderer.ts +1660 -0
  649. package/src/maps/gl/shaders.ts +489 -0
  650. package/src/maps/gl/store.ts +615 -0
  651. package/src/maps/gl/text.ts +868 -0
  652. package/src/maps/gl/view.ts +1489 -0
  653. package/src/maps/icons.ts +183 -0
  654. package/src/maps/index.ts +274 -81
  655. package/src/maps/labels.ts +457 -144
  656. package/src/maps/node.ts +832 -665
  657. package/src/maps/overlay.ts +148 -43
  658. package/src/maps/paint.ts +3 -0
  659. package/src/maps/proj.ts +118 -0
  660. package/src/maps/renderer.ts +155 -0
  661. package/src/maps/sources.ts +43 -6
  662. package/src/maps/style.ts +32 -0
  663. package/src/maps/styles.ts +215 -4
  664. package/src/maps/theme.ts +51 -0
  665. package/src/maps/tiles.ts +253 -62
  666. package/src/maps/types.ts +213 -21
  667. package/src/markdown/expressions.ts +5 -1
  668. package/src/markdown/index.ts +163 -78
  669. package/src/markdown/spans.ts +6 -1
  670. package/src/media-player/index.ts +18 -4
  671. package/src/qml/containers.tsx +6 -1
  672. package/src/qml/interaction.tsx +42 -5
  673. package/src/qml/layouts.tsx +21 -6
  674. package/src/qml/qtquick.tsx +9 -2
  675. package/src/qml/react.tsx +7 -5
  676. package/src/reorder/clock.ts +27 -0
  677. package/src/reorder/index.ts +100 -27
  678. package/src/rich-text-editor/clipboard.ts +439 -0
  679. package/src/rich-text-editor/collab.ts +91 -0
  680. package/src/rich-text-editor/commands.ts +448 -0
  681. package/src/rich-text-editor/dom-globals.d.ts +23 -0
  682. package/src/rich-text-editor/drag.ts +211 -0
  683. package/src/rich-text-editor/html.ts +619 -0
  684. package/src/rich-text-editor/index.ts +1364 -0
  685. package/src/rich-text-editor/inline.ts +345 -0
  686. package/src/rich-text-editor/keymap.ts +510 -0
  687. package/src/rich-text-editor/keys.ts +228 -0
  688. package/src/rich-text-editor/look.ts +427 -0
  689. package/src/rich-text-editor/markdown.ts +653 -0
  690. package/src/rich-text-editor/marks.ts +101 -0
  691. package/src/rich-text-editor/nodes.ts +497 -0
  692. package/src/rich-text-editor/render.ts +837 -0
  693. package/src/rich-text-editor/schema.ts +431 -0
  694. package/src/rich-text-editor/store.ts +39 -0
  695. package/src/rich-text-editor/suggest.ts +597 -0
  696. package/src/rich-text-editor/tables.ts +272 -0
  697. package/src/rich-text-editor/toolbar.ts +724 -0
  698. package/src/rich-text-editor/view.ts +2287 -0
  699. package/src/rich-text-editor/virtual.ts +372 -0
  700. package/src/richtext/node.ts +294 -44
  701. package/src/richtext/runs.ts +23 -12
  702. package/src/table/index.ts +29 -0
  703. package/src/table/rows.ts +18 -8
  704. package/src/terminal/backends.ts +4 -1
  705. package/src/terminal/index.ts +47 -15
  706. package/src/terminal/vt/pty.ts +16 -2
  707. package/src/terminal-output/index.ts +6 -1
  708. package/src/three/canvas.ts +102 -8
  709. package/src/three/events.ts +49 -9
  710. package/src/tree/index.ts +19 -0
  711. package/dist/markdown/ast.d.ts.map +0 -1
  712. package/dist/markdown/ast.js +0 -17
  713. package/dist/markdown/ast.js.map +0 -1
  714. package/dist/markdown/parse.d.ts.map +0 -1
  715. package/dist/markdown/parse.js.map +0 -1
  716. package/dist/markdown/tags.d.ts.map +0 -1
  717. package/dist/markdown/tags.js.map +0 -1
  718. /package/dist/{markdown → internal/markdown}/parse.d.ts +0 -0
  719. /package/dist/{markdown → internal/markdown}/tags.d.ts +0 -0
  720. /package/dist/{markdown → internal/markdown}/tags.js +0 -0
  721. /package/src/{markdown → internal/markdown}/tags.ts +0 -0
@@ -0,0 +1,233 @@
1
+ // A GIF's first frame, as RGBA.
2
+ //
3
+ // ntk decodes PNG and JPEG, and a document handed to this component is
4
+ // still full of GIFs: a mail's logo and its spacer images, a table layout's
5
+ // one-pixel shims sized by `width` and `height`. An image that does not
6
+ // decode is drawn as a frame, which on a spacer is a line through the
7
+ // layout that the author meant to be nothing. So the format is read here:
8
+ // GIF89a (and 87a) is small, fixed and unambiguous, and the decoder is the
9
+ // LZW variant the format defines, nothing more.
10
+ //
11
+ // Only the first frame. An animation is drawn as it stands before it moves,
12
+ // which is what a paused animation shows; playing one would mean a timer per
13
+ // image and a repaint per frame, which is not this renderer's business.
14
+
15
+ /** A decoded frame: straight RGBA, `width * height * 4` bytes — the shape
16
+ * ntk's `Image` is constructed from. */
17
+ export interface DecodedGif {
18
+ width: number;
19
+ height: number;
20
+ data: Uint8Array;
21
+ }
22
+
23
+ /** The most pixels a GIF may say it has: past this a malformed header is a
24
+ * request for gigabytes, not an image. */
25
+ const MAX_PIXELS = 1 << 25;
26
+
27
+ /**
28
+ * Decode a GIF's first frame, or null for bytes that are not a GIF. The
29
+ * logical screen is the image; what the frame does not cover, and its
30
+ * transparent colour, are transparent. Data that ends early leaves the rest
31
+ * of the frame transparent rather than failing the image.
32
+ */
33
+ export function decodeGif(bytes: Uint8Array): DecodedGif | null {
34
+ if (
35
+ bytes.length < 13 ||
36
+ bytes[0] !== 0x47 || // G
37
+ bytes[1] !== 0x49 || // I
38
+ bytes[2] !== 0x46 || // F
39
+ bytes[3] !== 0x38 || // 8
40
+ (bytes[4] !== 0x37 && bytes[4] !== 0x39) || // 7 or 9
41
+ bytes[5] !== 0x61 // a
42
+ ) {
43
+ return null;
44
+ }
45
+ const width = bytes[6] | (bytes[7] << 8);
46
+ const height = bytes[8] | (bytes[9] << 8);
47
+ if (!width || !height || width * height > MAX_PIXELS) return null;
48
+ const packed = bytes[10];
49
+ let at = 13;
50
+ let global: Uint8Array | null = null;
51
+ if (packed & 0x80) {
52
+ const size = 3 * (1 << ((packed & 7) + 1));
53
+ global = bytes.subarray(at, at + size);
54
+ at += size;
55
+ }
56
+ const data = new Uint8Array(width * height * 4);
57
+ let transparent = -1;
58
+
59
+ while (at < bytes.length) {
60
+ const block = bytes[at++];
61
+ if (block === 0x3b) break; // the trailer
62
+ if (block === 0x21) {
63
+ // an extension: a Graphic Control one says which colour is not drawn
64
+ const label = bytes[at++];
65
+ if (label === 0xf9 && bytes[at] >= 4) {
66
+ const flags = bytes[at + 1];
67
+ transparent = flags & 1 ? bytes[at + 4] : -1;
68
+ }
69
+ at = skipSubBlocks(bytes, at);
70
+ continue;
71
+ }
72
+ if (block !== 0x2c) return null; // neither: not a GIF this can read
73
+ if (at + 9 > bytes.length) return null;
74
+ const left = bytes[at] | (bytes[at + 1] << 8);
75
+ const top = bytes[at + 2] | (bytes[at + 3] << 8);
76
+ const frameWidth = bytes[at + 4] | (bytes[at + 5] << 8);
77
+ const frameHeight = bytes[at + 6] | (bytes[at + 7] << 8);
78
+ const flags = bytes[at + 8];
79
+ at += 9;
80
+ let palette = global;
81
+ if (flags & 0x80) {
82
+ const size = 3 * (1 << ((flags & 7) + 1));
83
+ palette = bytes.subarray(at, at + size);
84
+ at += size;
85
+ }
86
+ if (!palette || frameWidth * frameHeight > MAX_PIXELS) return null;
87
+ const minCodeSize = bytes[at++];
88
+ if (minCodeSize < 2 || minCodeSize > 11) return null;
89
+ const indices = lzw(bytes, at, minCodeSize, frameWidth * frameHeight);
90
+ const interlaced = (flags & 0x40) !== 0;
91
+ for (let row = 0; row < frameHeight; row += 1) {
92
+ const y = top + (interlaced ? interlacedRow(row, frameHeight) : row);
93
+ if (y >= height) continue;
94
+ for (let col = 0; col < frameWidth; col += 1) {
95
+ const x = left + col;
96
+ if (x >= width) continue;
97
+ const index = indices[row * frameWidth + col];
98
+ if (index === transparent || index * 3 + 2 >= palette.length) continue;
99
+ const o = (y * width + x) * 4;
100
+ data[o] = palette[index * 3];
101
+ data[o + 1] = palette[index * 3 + 1];
102
+ data[o + 2] = palette[index * 3 + 2];
103
+ data[o + 3] = 255;
104
+ }
105
+ }
106
+ return { width, height, data };
107
+ }
108
+ return null;
109
+ }
110
+
111
+ /** Past a run of data sub-blocks: each a length byte and that many bytes,
112
+ * ended by an empty one. */
113
+ function skipSubBlocks(bytes: Uint8Array, at: number): number {
114
+ while (at < bytes.length) {
115
+ const size = bytes[at++];
116
+ if (size === 0) break;
117
+ at += size;
118
+ }
119
+ return at;
120
+ }
121
+
122
+ /** Which row of the frame an interlaced image's `n`th stored row is: every
123
+ * eighth from 0, every eighth from 4, every fourth from 2, every second
124
+ * from 1. */
125
+ function interlacedRow(n: number, height: number): number {
126
+ const passes: [number, number][] = [
127
+ [0, 8],
128
+ [4, 8],
129
+ [2, 4],
130
+ [1, 2],
131
+ ];
132
+ for (const [start, step] of passes) {
133
+ const rows = Math.ceil(Math.max(0, height - start) / step);
134
+ if (n < rows) return start + n * step;
135
+ n -= rows;
136
+ }
137
+ return height;
138
+ }
139
+
140
+ /**
141
+ * The colour indices of one frame, from its LZW data (GIF89a, Appendix F):
142
+ * variable-width codes, least significant bit first, across data sub-blocks,
143
+ * starting a code wider than the palette's and growing to twelve bits. A
144
+ * frame whose data ends early has the rest of its indices 0, which the
145
+ * caller never reaches past the pixels it has — they are left transparent
146
+ * only when the frame said the colour 0 was.
147
+ */
148
+ function lzw(
149
+ bytes: Uint8Array,
150
+ at: number,
151
+ minCodeSize: number,
152
+ pixels: number,
153
+ ): Uint8Array {
154
+ const out = new Uint8Array(pixels);
155
+ const clear = 1 << minCodeSize;
156
+ const end = clear + 1;
157
+ const prefix = new Uint16Array(4096);
158
+ const suffix = new Uint8Array(4096);
159
+ const stack = new Uint8Array(4097);
160
+ for (let i = 0; i < clear; i += 1) suffix[i] = i;
161
+
162
+ let size = minCodeSize + 1;
163
+ let mask = (1 << size) - 1;
164
+ let next = clear + 2;
165
+ let previous = -1;
166
+ let first = 0;
167
+ let written = 0;
168
+
169
+ // the bit reader, over the sub-blocks
170
+ let block = 0;
171
+ let bits = 0;
172
+ let count = 0;
173
+
174
+ while (written < pixels) {
175
+ while (count < size) {
176
+ if (block === 0) {
177
+ if (at >= bytes.length) return out;
178
+ block = bytes[at++];
179
+ if (block === 0) return out;
180
+ }
181
+ if (at >= bytes.length) return out;
182
+ bits |= bytes[at++] << count;
183
+ count += 8;
184
+ block -= 1;
185
+ }
186
+ let code = bits & mask;
187
+ bits >>>= size;
188
+ count -= size;
189
+
190
+ if (code === clear) {
191
+ size = minCodeSize + 1;
192
+ mask = (1 << size) - 1;
193
+ next = clear + 2;
194
+ previous = -1;
195
+ continue;
196
+ }
197
+ if (code === end) break;
198
+ if (previous === -1) {
199
+ if (code >= clear) break; // a first code that is no colour: corrupt
200
+ out[written++] = code;
201
+ previous = code;
202
+ first = code;
203
+ continue;
204
+ }
205
+ const incoming = code;
206
+ let top = 0;
207
+ if (code >= next) {
208
+ // the code being defined by this very step: the previous string and
209
+ // its own first character (the "KwKwK" case)
210
+ if (code > next) break;
211
+ stack[top++] = first;
212
+ code = previous;
213
+ }
214
+ while (code >= clear) {
215
+ stack[top++] = suffix[code];
216
+ code = prefix[code];
217
+ }
218
+ first = code;
219
+ stack[top++] = first;
220
+ if (next < 4096) {
221
+ prefix[next] = previous;
222
+ suffix[next] = first;
223
+ next += 1;
224
+ if ((next & mask) === 0 && next < 4096) {
225
+ size += 1;
226
+ mask = (1 << size) - 1;
227
+ }
228
+ }
229
+ previous = incoming;
230
+ while (top > 0 && written < pixels) out[written++] = stack[--top];
231
+ }
232
+ return out;
233
+ }
package/src/html/index.ts CHANGED
@@ -22,15 +22,16 @@ import {
22
22
  Select,
23
23
  useTheme,
24
24
  } from 'react-x11';
25
- import type { DrawnNode, MouseEvent as X11MouseEvent } from 'react-x11';
25
+ import type { DrawnNode, MouseEvent as X11MouseEvent, Rect } from 'react-x11';
26
26
  import { tint } from 'react-x11/style';
27
27
  import type { Style } from 'react-x11/style';
28
28
 
29
29
  import type {} from 'react-x11/jsx-runtime';
30
30
 
31
31
  import { useLinkClicks, useSelectionMenu } from '../richtext/index.js';
32
+ import { useFontPrewarm } from '../internal/prewarm.js';
32
33
  import { hx } from './hx.js';
33
- import { attr } from './dom.js';
34
+ import { attr, tagOf } from './dom.js';
34
35
  import type { Document, Element } from './dom.js';
35
36
  import { ELEMENT, HtmlViewNode, registerHtmlView } from './node.js';
36
37
  import type { HtmlViewProps, ScriptRequest } from './node.js';
@@ -41,7 +42,7 @@ import {
41
42
  selectedOption,
42
43
  textareaValue,
43
44
  } from './controls.js';
44
- import type { ControlRect } from './controls.js';
45
+ import type { BareField, ControlRect } from './controls.js';
45
46
  import type { ResourceRequest, ResourceResult } from './resources.js';
46
47
 
47
48
  export {
@@ -51,7 +52,7 @@ export {
51
52
  } from './node.js';
52
53
  export type { HtmlViewProps, ScriptRequest } from './node.js';
53
54
  export type { ResourceRequest, ResourceResult } from './resources.js';
54
- export type { ControlRect } from './controls.js';
55
+ export type { BareField, ControlRect } from './controls.js';
55
56
  export type { ComputedStyle, RootLook } from './css/style.js';
56
57
  export type {
57
58
  AnyNode,
@@ -97,15 +98,37 @@ export interface HtmlProps {
97
98
  selectable?: boolean;
98
99
  /** Extra author stylesheets, applied after the document's own. */
99
100
  stylesheet?: string | string[];
101
+ /**
102
+ * The encoding the host decoded `source` from, as a label (`'shift_jis'`,
103
+ * `'windows-1251'`). A stylesheet `onResource` hands over as bytes, with no
104
+ * byte order mark, charset or `@charset` of its own, is decoded with it, as
105
+ * CSS says a sheet is in its document's encoding. Default UTF-8.
106
+ */
107
+ charset?: string;
108
+ /**
109
+ * The URL the document came from. Given one — or a document with an
110
+ * absolute `<base href>` — every URL the document names reaches
111
+ * `onResource` and `onLink` absolute: resolved against its `<base href>`
112
+ * or this, and a `url()` in a linked stylesheet against the stylesheet's
113
+ * own URL, as a browser resolves it. Absent, URLs are handed over as the
114
+ * document wrote them.
115
+ *
116
+ * Nothing is fetched because of it: it says where relative URLs point,
117
+ * and `onResource` still decides whether anything goes there.
118
+ */
119
+ baseUrl?: string | null;
100
120
  /**
101
121
  * An external resource is wanted — an `<img src>`, a `<link rel=stylesheet>`
102
- * or an `@import`. Return the bytes or the text, or a promise of them, or
103
- * `null` to decline.
122
+ * or an `@import`, or a font an `@font-face` declares and the document
123
+ * uses. Return the bytes or the text, or a promise of them, or `null` to
124
+ * decline. A stylesheet's bytes are decoded as CSS says, from the
125
+ * `charset` the protocol named, if the host passes it on, and its `url`,
126
+ * if the host passes that, is where it came from after redirects.
104
127
  *
105
128
  * **Absent, nothing loads.** This component has no network and no
106
- * filesystem of its own; images render as a frame and linked stylesheets
107
- * are skipped. The host is the one that knows its cache, its proxy and
108
- * whether this document is trusted.
129
+ * filesystem of its own; images render as a frame, linked stylesheets are
130
+ * skipped and text is set in the fonts the system has. The host is the one
131
+ * that knows its cache, its proxy and whether this document is trusted.
109
132
  */
110
133
  onResource?: (
111
134
  request: ResourceRequest,
@@ -118,15 +141,17 @@ export interface HtmlProps {
118
141
  onScript?: (script: ScriptRequest) => void;
119
142
  /**
120
143
  * A link was activated. Absent means clicks do nothing: this component
121
- * never navigates by itself.
144
+ * never navigates by itself. The `href` is resolved against the
145
+ * document's base where it has one (`baseUrl`), and as written where not.
122
146
  */
123
147
  onLink?: (href: string, ev: X11MouseEvent<DrawnNode>) => void;
124
148
  /** The parsed document, each time it is re-parsed — the DOM handle. */
125
149
  onDocument?: (document: Document) => void;
126
150
  /**
127
- * A form control changed. The element is the one in the DOM, so a handler
128
- * that wants to keep the value writes it back with `setAttribute`-shaped
129
- * mutation and calls the handle's `refresh()`.
151
+ * A form control changed, or a `<button>` was pressed — reported with its
152
+ * `value`. The element is the one in the DOM, so a handler that wants to
153
+ * keep the value writes it back with `setAttribute`-shaped mutation and
154
+ * calls the handle's `refresh()`.
130
155
  */
131
156
  onControlChange?: (element: Element, value: string | boolean) => void;
132
157
  /** Base text style. Defaults: theme `fontSize` (14), `sans-serif`. */
@@ -165,8 +190,23 @@ export interface HtmlHandle {
165
190
  refresh(): void;
166
191
  /** The element under a point, in the window's coordinates. */
167
192
  elementAt(x: number, y: number): Element | null;
193
+ /** The link under a point, in the window's coordinates — resolved, as
194
+ * `onLink` is handed one — for a status bar, or a menu on a link. */
195
+ hrefAt(x: number, y: number): string | null;
196
+ /**
197
+ * Where an element is, in logical pixels from the document's top left:
198
+ * the space the offset of a box scrolling the document is in, so a link
199
+ * to `#section` is `scroller.scrollTo({ y: handle.elementRect(el).y })`.
200
+ * A block's border box; an inline element's across its fragments, padding
201
+ * and border included, as `getBoundingClientRect` measures it, and as
202
+ * tall as its lines. Null for an element with no box.
203
+ */
204
+ elementRect(element: Element): Rect | null;
168
205
  /** The document's `<title>`, if it had one. */
169
206
  readonly title: string | null;
207
+ /** The URL the document's relative URLs resolve against — its
208
+ * `<base href>`, or `baseUrl` — or null where it has none. */
209
+ readonly base: string | null;
170
210
  }
171
211
 
172
212
  // --- the look ---------------------------------------------------------------
@@ -193,6 +233,30 @@ function deriveLook(
193
233
  };
194
234
  }
195
235
 
236
+ /** What a document sets in the code face: the elements the UA sheet puts in
237
+ * it, and a style sheet that names `monospace`, in either case. */
238
+ const CODE_MARKUP = /<(?:code|pre|kbd|samp|tt|listing|xmp)\b|monospace/i;
239
+
240
+ /**
241
+ * The code face, once the source holds code, and null before. A source that
242
+ * grows is read once, from a little before where it was last read to find a
243
+ * name a chunk split, so a document streamed in thousands of pieces is not
244
+ * read again at each one; a source that does not start with the last is
245
+ * read whole. Once found, found: warming a face twice warms nothing.
246
+ */
247
+ function useCodeFamily(source: string, family: string): string | null {
248
+ const read = React.useRef({ source: '', found: false });
249
+ const seen = read.current;
250
+ if (!seen.found && source !== seen.source) {
251
+ const from = source.startsWith(seen.source)
252
+ ? Math.max(0, seen.source.length - 'monospace'.length)
253
+ : 0;
254
+ seen.found = CODE_MARKUP.test(from ? source.slice(from) : source);
255
+ seen.source = source;
256
+ }
257
+ return seen.found ? family : null;
258
+ }
259
+
196
260
  // --- the component ----------------------------------------------------------
197
261
 
198
262
  /**
@@ -214,6 +278,8 @@ export function Html(props: HtmlProps): ReactElement {
214
278
  partial = true,
215
279
  selectable = true,
216
280
  stylesheet,
281
+ charset,
282
+ baseUrl,
217
283
  onLink,
218
284
  onResource,
219
285
  onScript,
@@ -224,12 +290,17 @@ export function Html(props: HtmlProps): ReactElement {
224
290
 
225
291
  const theme = useTheme() as unknown as Record<string, unknown>;
226
292
  const links = useLinkClicks(onLink);
293
+ const buttons = useButtonPresses(onControlChange);
227
294
  const menu = useSelectionMenu(selectable);
228
295
 
229
296
  const look = React.useMemo(
230
297
  () => deriveLook(theme, props),
231
298
  [theme, props.fontSize, props.fontFamily, props.monoFamily],
232
299
  );
300
+ // a document with code in it sets that code in the mono family, and its
301
+ // render is the head start its first layout would otherwise wait on the
302
+ // system's font matcher for (`useFontPrewarm`)
303
+ useFontPrewarm(useCodeFamily(source, look.monoFamily));
233
304
 
234
305
  const documentRef = React.useRef<Document | null>(null);
235
306
  const [controls, setControls] = React.useState<ControlRect[]>([]);
@@ -258,6 +329,8 @@ export function Html(props: HtmlProps): ReactElement {
258
329
  source,
259
330
  complete: !partial,
260
331
  stylesheet,
332
+ charset,
333
+ baseUrl,
261
334
  look,
262
335
  selectionColor,
263
336
  onResource,
@@ -266,7 +339,9 @@ export function Html(props: HtmlProps): ReactElement {
266
339
  onControls: handleControls,
267
340
  domRevision,
268
341
  ref: props.ref as React.Ref<unknown>,
269
- style: { alignSelf: 'stretch' },
342
+ // grown with the component, where an application grows it: the root's
343
+ // background covers the whole of it, as a page's covers the window
344
+ style: { alignSelf: 'stretch', flexGrow: 1 },
270
345
  };
271
346
 
272
347
  const children: ReactNode[] = [
@@ -297,6 +372,14 @@ export function Html(props: HtmlProps): ReactElement {
297
372
  selectable,
298
373
  selectionColor: props.selectionColor,
299
374
  ...links,
375
+ onMouseDown: (ev: X11MouseEvent<DrawnNode>) => {
376
+ links.onMouseDown(ev);
377
+ buttons.onMouseDown(ev);
378
+ },
379
+ onMouseUp: (ev: X11MouseEvent<DrawnNode>) => {
380
+ links.onMouseUp(ev);
381
+ buttons.onMouseUp(ev);
382
+ },
300
383
  ...menu,
301
384
  'data-testname': props['data-testname'],
302
385
  } as Record<string, unknown>,
@@ -327,17 +410,72 @@ export function useHtmlHandle(): HtmlHandle & { ref: React.Ref<unknown> } {
327
410
  get title() {
328
411
  return nodeRef.current?.title ?? null;
329
412
  },
413
+ get base() {
414
+ return nodeRef.current?.documentBase ?? null;
415
+ },
330
416
  refresh: () => {
331
417
  nodeRef.current?.touchDocument();
332
418
  force();
333
419
  },
334
420
  elementAt: (x: number, y: number) =>
335
421
  nodeRef.current?.elementAtPoint(x, y) ?? null,
422
+ hrefAt: (x: number, y: number) =>
423
+ nodeRef.current?.hrefAtPoint(x, y) ?? null,
424
+ elementRect: (element: Element) =>
425
+ nodeRef.current?.elementRect(element) ?? null,
336
426
  }),
337
427
  [],
338
428
  );
339
429
  }
340
430
 
431
+ /**
432
+ * A press and a release on the same `<button>` the document draws, reported
433
+ * as a pressed widget reports one: `onControlChange` with the button and its
434
+ * `value`. A `<button>` is laid out and drawn like any box (the UA sheet's
435
+ * `button` rule) — its content is the page's, and most of the buttons on
436
+ * the web are an icon or a pill of a page's own design — so it is the
437
+ * element that finds out it was pressed, not a widget. A disabled one, or
438
+ * a press that lands in a link inside one, is not a press of it.
439
+ */
440
+ function useButtonPresses(onControlChange: HtmlProps['onControlChange']): {
441
+ onMouseDown: (ev: X11MouseEvent<DrawnNode>) => void;
442
+ onMouseUp: (ev: X11MouseEvent<DrawnNode>) => void;
443
+ } {
444
+ const press = React.useRef<Element | null>(null);
445
+ const buttonAt = (ev: X11MouseEvent<DrawnNode>): Element | null => {
446
+ const target = ev.target as {
447
+ elementAtPoint?: (x: number, y: number) => Element | null;
448
+ } | null;
449
+ let node =
450
+ typeof target?.elementAtPoint === 'function'
451
+ ? target.elementAtPoint(ev.x, ev.y)
452
+ : null;
453
+ for (
454
+ ;
455
+ node;
456
+ node = node.parent?.type === 'tag' ? (node.parent as Element) : null
457
+ ) {
458
+ if (tagOf(node) === 'a' && attr(node, 'href') !== undefined) return null;
459
+ if (tagOf(node) === 'button') {
460
+ return attr(node, 'disabled') === undefined ? node : null;
461
+ }
462
+ }
463
+ return null;
464
+ };
465
+ return {
466
+ onMouseDown: (ev) => {
467
+ press.current = onControlChange && ev.button === 1 ? buttonAt(ev) : null;
468
+ },
469
+ onMouseUp: (ev) => {
470
+ const pressed = press.current;
471
+ press.current = null;
472
+ if (!pressed || !onControlChange || ev.button !== 1) return;
473
+ if (buttonAt(ev) !== pressed) return;
474
+ onControlChange(pressed, attr(pressed, 'value') ?? '');
475
+ },
476
+ };
477
+ }
478
+
341
479
  // --- the widgets ------------------------------------------------------------
342
480
 
343
481
  /**
@@ -359,13 +497,16 @@ function renderControl(
359
497
  const key = `${rect.kind}:${rect.x},${rect.y}`;
360
498
  const disabled = attr(el, 'disabled') !== undefined;
361
499
  const readOnly = attr(el, 'readonly') !== undefined;
500
+ // a field whose box the document draws takes its content box
501
+ const at = rect.bare ?? rect;
362
502
  const frame: Style = {
363
503
  position: 'absolute',
364
- left: Math.round(rect.x),
365
- top: Math.round(rect.y),
366
- width: Math.round(rect.width),
367
- height: Math.round(rect.height),
504
+ left: Math.round(at.x),
505
+ top: Math.round(at.y),
506
+ width: Math.round(at.width),
507
+ height: Math.round(at.height),
368
508
  };
509
+ const field = rect.bare ? bareField(rect.bare) : fieldChrome(look);
369
510
  const report = (value: string | boolean): void => {
370
511
  onChange?.(el, value);
371
512
  touch();
@@ -444,7 +585,7 @@ function renderControl(
444
585
  // with whatever was last echoed into the DOM.
445
586
  widget = hx('textarea', {
446
587
  defaultValue: textareaValue(el),
447
- style: [fieldChrome(look), { width: '100%', height: '100%' }],
588
+ style: [field, { width: '100%', height: '100%' }],
448
589
  onChange: readOnly ? undefined : (ev) => reportText(ev.value),
449
590
  });
450
591
  break;
@@ -456,7 +597,7 @@ function renderControl(
456
597
  // Core's word for a password field: nothing in it reaches a
457
598
  // selection, PRIMARY included.
458
599
  sensitive: type === 'password',
459
- style: [fieldChrome(look), { width: '100%', height: '100%' }],
600
+ style: [field, { width: '100%', height: '100%' }],
460
601
  onChange: readOnly
461
602
  ? undefined
462
603
  : (ev) => {
@@ -495,6 +636,25 @@ function fieldChrome(look: RootLook): Style {
495
636
  };
496
637
  }
497
638
 
639
+ /**
640
+ * A text field whose box the author styled: the document draws the border
641
+ * and the background, so the widget draws neither, and its text is the
642
+ * element's colour and font, which the author chose to go on that
643
+ * background, rather than the theme's.
644
+ */
645
+ function bareField(bare: BareField): Style {
646
+ return {
647
+ backgroundColor: 'transparent',
648
+ borderWidth: 0,
649
+ borderRadius: 0,
650
+ paddingLeft: 0,
651
+ paddingRight: 0,
652
+ color: bare.color,
653
+ fontFamily: bare.fontFamily,
654
+ fontSize: bare.fontSize,
655
+ };
656
+ }
657
+
498
658
  function clearRadioGroup(el: Element): void {
499
659
  const name = attr(el, 'name');
500
660
  if (!name) return;