@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
@@ -26,6 +26,10 @@ export function lookKey(look: RootLook): string {
26
26
  look.borderColor,
27
27
  look.mutedColor,
28
28
  look.background,
29
+ look.surface,
30
+ look.controlPadY,
31
+ look.controlBorder,
32
+ look.controlRadius,
29
33
  ].join('|');
30
34
  }
31
35
 
@@ -40,8 +44,11 @@ export function uaStylesheet(look: RootLook): Stylesheet {
40
44
  }
41
45
 
42
46
  /**
43
- * Margins are in `em` throughout, so a document that sets `font-size` on
44
- * `body` scales its whitespace with its text the way a browser's does.
47
+ * Margins above and below are in `em`, so a document that sets `font-size`
48
+ * on `body` scales its whitespace with its text the way a browser's does.
49
+ * The indents of lists, definitions and figures are the HTML standard's
50
+ * 40px (15.3.3, 15.3.8), whatever the size: a list in a 10px sidebar is
51
+ * indented as far as one in the body.
45
52
  */
46
53
  function uaText(look: RootLook): string {
47
54
  const mono = look.monoFamily;
@@ -52,10 +59,21 @@ article, aside, footer, header, hgroup, main, nav, section, details,
52
59
  summary, dir, menu, center, marquee {
53
60
  display: block;
54
61
  }
62
+ /* <map> is inline (HTML 15.3.1), so an <area> in it the author gives a
63
+ display of its own is drawn */
55
64
  head, link, meta, style, script, title, base, template, noscript, param,
56
- source, track, col, colgroup, datalist, area, map, rp { display: none; }
57
-
58
- body { margin: 8px; color: ${look.color}; font-family: ${look.fontFamily}; }
65
+ source, track, col, colgroup, datalist, area, rp { display: none; }
66
+
67
+ /* HTML's bidi rules for the two elements that are about it: <bdi> takes
68
+ its first strong letter's direction, and <bdo> overrides. The \`dir\`
69
+ attribute's isolation is a presentational hint (\`hints\`), where the
70
+ attribute is read already, rather than a selector every element tries */
71
+ bdi { unicode-bidi: plaintext; }
72
+ bdo { unicode-bidi: isolate-override; }
73
+
74
+ /* the theme's colour and font are the root's (\`initialStyle\`), and the
75
+ body inherits them, from an author's \`html\` rule too */
76
+ body { margin: 8px; }
59
77
  html { color: ${look.color}; }
60
78
 
61
79
  p { margin: 1em 0; }
@@ -66,16 +84,18 @@ h4 { font-size: 1em; font-weight: bold; margin: 1.33em 0; }
66
84
  h5 { font-size: 0.83em; font-weight: bold; margin: 1.67em 0; }
67
85
  h6 { font-size: 0.67em; font-weight: bold; margin: 2.33em 0; }
68
86
 
69
- ul, ol { margin: 1em 0; padding-left: 2.5em; }
87
+ ul, ol { margin: 1em 0; padding-left: 40px; }
70
88
  ul { list-style-type: disc; }
71
89
  ol { list-style-type: decimal; }
90
+ ol, ul, menu, dir { counter-reset: list-item; }
91
+ ol[reversed] { counter-reset: reversed(list-item); }
72
92
  li { display: list-item; }
73
93
  ul ul, ol ul { list-style-type: circle; }
74
94
  ul ul ul, ol ol ul, ul ol ul, ol ul ul { list-style-type: square; }
75
95
  ul ul, ul ol, ol ul, ol ol { margin: 0; }
76
96
 
77
97
  dl { margin: 1em 0; }
78
- dd { margin-left: 2.5em; }
98
+ dd { margin-left: 40px; }
79
99
  dt { font-weight: bold; }
80
100
 
81
101
  blockquote {
@@ -106,39 +126,51 @@ big { font-size: 1.17em; }
106
126
  sub { vertical-align: sub; font-size: 0.75em; }
107
127
  sup { vertical-align: super; font-size: 0.75em; }
108
128
  mark { background-color: #fff2a8; color: #1a1a1a; }
109
- abbr { text-decoration: none; }
110
- center { text-align: center; }
129
+ /* the HTML standard's rendering (15.3.4): an abbreviation with its
130
+ expansion in a title says so */
131
+ abbr[title], acronym[title] { text-decoration: dotted underline; }
132
+ center { text-align: -webkit-center; }
111
133
  nobr { white-space: nowrap; }
134
+ q::before { content: open-quote; }
135
+ q::after { content: close-quote; }
112
136
 
113
137
  /* Deliberately no 'a:hover' rule, though a browser's sheet has one: a
114
138
  document containing any ':hover' selector has to be restyled as the
115
139
  pointer moves, and a rule that changes nothing (the link is already
116
- underlined) would make every plain document pay that. */
117
- a { color: ${look.linkColor}; text-decoration: underline; cursor: pointer; }
140
+ underlined) would make every plain document pay that. An 'a' with no
141
+ 'href' is an anchor, not a link, and is drawn as the text around it. */
142
+ a[href] { color: ${look.linkColor}; text-decoration: underline; cursor: pointer; }
118
143
 
119
144
  hr {
120
- margin: 0.5em 0;
145
+ margin: 0.5em auto;
121
146
  border: none;
122
147
  border-top: 1px solid ${look.borderColor};
123
148
  height: 0;
124
149
  }
125
150
 
126
151
  img { display: inline-block; }
127
- figure { margin: 1em 2.5em; }
152
+ /* never loaded: a box of its own size, framed as a browser frames one */
153
+ iframe { border: 2px inset; }
154
+ /* a poster is drawn within the video's box at its own ratio (HTML 15.4.1) */
155
+ video { object-fit: contain; }
156
+ figure { margin: 1em 40px; }
128
157
 
129
- table { display: table; border-collapse: separate; border-spacing: 2px; }
158
+ table { display: table; border-collapse: separate; border-spacing: 2px; box-sizing: border-box; }
130
159
  caption { display: table-caption; text-align: center; }
131
160
  thead { display: table-header-group; }
132
161
  tbody { display: table-row-group; }
133
162
  tfoot { display: table-footer-group; }
134
163
  tr { display: table-row; }
135
- td { display: table-cell; padding: 1px; vertical-align: middle; }
164
+ /* HTML's rendering rules: the rows are middle, and a cell takes its row's,
165
+ so a <tr valign="top"> sets its cells at the top */
166
+ thead, tbody, tfoot, tr { vertical-align: middle; }
167
+ td { display: table-cell; padding: 1px; vertical-align: inherit; }
136
168
  th {
137
169
  display: table-cell;
138
170
  padding: 1px;
139
171
  font-weight: bold;
140
172
  text-align: center;
141
- vertical-align: middle;
173
+ vertical-align: inherit;
142
174
  }
143
175
  colgroup { display: table-column-group; }
144
176
  col { display: table-column; }
@@ -159,13 +191,30 @@ input, button, select, textarea, meter, progress {
159
191
  input[type=checkbox] { margin: 3px 4px 3px 4px; }
160
192
  input[type=radio] { margin: 3px 4px 3px 5px; }
161
193
  input[type=hidden] { display: none; }
194
+ /* A <button> is drawn rather than mounted: its content is the document's —
195
+ an icon, a label in spans, a pill of the page's own design, which is what
196
+ most buttons on the web are — and the page restyles it as it restyles
197
+ anything. What the sheet gives one the page left alone is the palette's
198
+ control, the chrome a mounted widget around it has. */
199
+ button {
200
+ vertical-align: baseline;
201
+ padding: ${look.controlPadY}px 0.75em;
202
+ border: ${look.controlBorder}px solid ${look.borderColor};
203
+ border-radius: ${look.controlRadius}px;
204
+ background-color: ${look.surface};
205
+ color: ${look.color};
206
+ text-align: center;
207
+ cursor: pointer;
208
+ }
209
+ button[disabled] { color: ${look.mutedColor}; cursor: default; }
162
210
  textarea { vertical-align: top; }
163
211
  fieldset { margin: 0 2px; padding: 0.35em 0.75em 0.6em; border: 1px solid ${look.borderColor}; }
164
212
  legend { display: block; padding: 0 2px; }
165
213
  label { cursor: pointer; }
166
214
 
167
215
  details { margin: 0.5em 0; }
168
- summary { display: block; cursor: pointer; font-weight: bold; }
216
+ summary { display: list-item; counter-increment: list-item 0; list-style: disclosure-closed inside; cursor: pointer; }
217
+ details[open] > summary:first-of-type { list-style-type: disclosure-open; }
169
218
 
170
219
  /* 'hidden' is an attribute, not a style, and a document that uses it expects
171
220
  it to win over the display above. */
@@ -13,11 +13,15 @@
13
13
  // layout can resolve them against a new containing block on its own.
14
14
  //
15
15
  // Colours are the other half of that decision, from the other side: they are
16
- // kept as **strings**, never parsed. ntk's context takes a CSS colour for
17
- // `fillStyle` and parses it behind its own cache, so parsing here would be
18
- // work done twice — and the only questions this renderer actually asks about
19
- // a colour are "is it `transparent`" and "is it `currentColor`", both of
20
- // which are string comparisons.
16
+ // kept as **strings**, never parsed into components, since the only
17
+ // questions this renderer asks about a colour are "is it `transparent`" and
18
+ // "is it `currentColor`", both string comparisons. A named or hex colour
19
+ // goes to the context as written. A functional one is read once, in
20
+ // `color.ts`, and written back in the form every context reads the same.
21
+
22
+ import type { ComputedStyle } from './style.js';
23
+ import { functionalColor } from './color.js';
24
+ import { LARGEST, parseMath, parseMathNumber } from './calc.js';
21
25
 
22
26
  /** A length that layout may still have to resolve. */
23
27
  export type Len = number | Pct | 'auto';
@@ -25,6 +29,12 @@ export type Len = number | Pct | 'auto';
25
29
  /** A percentage of something layout knows and computed style does not. */
26
30
  export interface Pct {
27
31
  pct: number;
32
+ /** A length added to it: `calc(100% - 20px)`, or a background position
33
+ * written from its far edge, `right 10px`. */
34
+ px?: number;
35
+ /** In place of the two: `min()` or `max()` with a percentage among its
36
+ * arguments, which is a different sum at every base (`calc.ts`). */
37
+ of?: { max: boolean; args: Len[] };
28
38
  }
29
39
 
30
40
  export const AUTO = 'auto';
@@ -41,8 +51,16 @@ export function isPct(len: Len): len is Pct {
41
51
  */
42
52
  export function resolve(len: Len, base: number, fallback = 0): number {
43
53
  if (typeof len === 'number') return len;
44
- if (len === AUTO) return fallback;
45
- return Number.isFinite(base) ? (len.pct / 100) * base : fallback;
54
+ if (len === AUTO || !Number.isFinite(base)) return fallback;
55
+ const px = len.of ? compared(len.of, base) : ofBase(len, base);
56
+ return px > LARGEST ? LARGEST : px < -LARGEST ? -LARGEST : px;
57
+ }
58
+
59
+ /** A gap between flex items or grid tracks: a length, or a percentage of
60
+ * the content box's size along it — of nothing where that is not known,
61
+ * as a gap in an intrinsic size is (CSS Box Alignment 3, 8.3). */
62
+ export function gapOf(len: Len, base: number): number {
63
+ return Math.max(0, resolve(len, Number.isFinite(base) ? base : 0));
46
64
  }
47
65
 
48
66
  /** Resolve, but keep "indefinite" distinguishable from zero — what a height
@@ -50,8 +68,21 @@ export function resolve(len: Len, base: number, fallback = 0): number {
50
68
  * "there is no height here". */
51
69
  export function resolveOrNull(len: Len, base: number): number | null {
52
70
  if (typeof len === 'number') return len;
53
- if (len === AUTO) return null;
54
- return Number.isFinite(base) ? (len.pct / 100) * base : null;
71
+ if (len === AUTO || !Number.isFinite(base)) return null;
72
+ return len.of ? compared(len.of, base) : ofBase(len, base);
73
+ }
74
+
75
+ function ofBase(len: Pct, base: number): number {
76
+ return (len.pct / 100) * base + (len.px ?? 0);
77
+ }
78
+
79
+ function compared(of: { max: boolean; args: Len[] }, base: number): number {
80
+ let out = of.max ? -Infinity : Infinity;
81
+ for (const arg of of.args) {
82
+ const v = resolve(arg, base);
83
+ out = of.max ? Math.max(out, v) : Math.min(out, v);
84
+ }
85
+ return out;
55
86
  }
56
87
 
57
88
  /**
@@ -76,10 +107,37 @@ export interface UnitContext {
76
107
  vh: number;
77
108
  /** Device pixels per CSS pixel — the display scale. */
78
109
  scale: number;
110
+ /** The x-height of the font the lengths are in, asked only for a length
111
+ * in `ex`; half an em where it is missing. */
112
+ ex?: () => number;
113
+ /** The advance of that font's "0", asked only for a length in `ch`; half
114
+ * an em where it is missing. */
115
+ ch?: () => number;
116
+ /** A computed `font-family` list with the families the document loads
117
+ * itself, with `@font-face`, put as the text engine knows them — see
118
+ * `fonts.ts`. Absent, the list is the one the author wrote. */
119
+ families?: (list: string) => string;
120
+ /** The element's line height and the root's, for `lh` and `rlh`, asked
121
+ * only for a length in them; 1.2em where they are missing. */
122
+ lh?: () => number;
123
+ rlh?: () => number;
124
+ /** Every property at its initial value, which `initial` sets one to. */
125
+ initial?: ComputedStyle;
79
126
  }
80
127
 
81
- const LENGTH_RE =
82
- /^([+-]?(?:\d+\.?\d*|\.\d+))(px|em|rem|pt|pc|in|cm|mm|ex|ch|vw|vh|vmin|vmax|q|%)?$/;
128
+ /** A CSS number (CSS Syntax 3 4.3.12): a sign, digits with at most one
129
+ * point and a digit after it, and an exponent — `1e1px` is ten pixels, and
130
+ * `1.px` is no length. */
131
+ const NUMBER_SRC = '[+-]?(?:\\d*\\.\\d+|\\d+)(?:e[+-]?\\d+)?';
132
+
133
+ const LENGTH_RE = new RegExp(
134
+ `^(${NUMBER_SRC})(px|em|rem|pt|pc|in|cm|mm|ex|ch|lh|rlh|vw|vh|vmin|vmax|q|%)?$`,
135
+ );
136
+
137
+ const NUMBER_RE = new RegExp(`^${NUMBER_SRC}$`, 'i');
138
+
139
+ /** A math function: `calc()`, `min()`, `max()` or `clamp()`. */
140
+ const MATH = /^(?:-webkit-)?calc\(|^(?:min|max|clamp)\(/i;
83
141
 
84
142
  /**
85
143
  * Parse a length. Returns `null` for anything that is not one, which is how
@@ -99,12 +157,24 @@ export function parseLength(
99
157
  if (v === 'auto') return AUTO;
100
158
  if (v === '0') return 0;
101
159
  const m = LENGTH_RE.exec(v);
102
- if (!m) return null;
160
+ if (!m) {
161
+ // `calc()` and its kin, down to pixels and a percentage (CSS Values 4 10)
162
+ if (!MATH.test(v)) return null;
163
+ return parseMath(v, (token) => {
164
+ const len = parseLength(token, ctx);
165
+ return typeof len === 'number' ? len : null;
166
+ });
167
+ }
103
168
  const n = Number(m[1]);
104
169
  const unit = m[2];
105
- if (!unit) return bareIsPx ? n * ctx.scale : null;
170
+ // a zero needs no unit however it is written — `-0`, `+0`, `0.0`
171
+ if (!unit) return n === 0 ? 0 : bareIsPx ? n * ctx.scale : null;
106
172
  if (unit === '%') return { pct: n };
107
- return n * unitScale(unit, ctx);
173
+ // Kept to what a browser holds: a `1e308px` height or margin, which a
174
+ // hostile or broken page writes, added up past what a number holds, and
175
+ // the document's height came to infinity
176
+ const px = n * unitScale(unit, ctx);
177
+ return px > LARGEST ? LARGEST : px < -LARGEST ? -LARGEST : px;
108
178
  }
109
179
 
110
180
  /** Device pixels per one of `unit`. The absolute units are CSS pixels and
@@ -130,13 +200,23 @@ function unitScale(unit: string, ctx: UnitContext): number {
130
200
  return (96 / 25.4) * ctx.scale;
131
201
  case 'q':
132
202
  return (96 / 101.6) * ctx.scale;
133
- // Approximations rather than font queries: both are within a few percent
134
- // for every text face, and asking the font manager here would make the
135
- // cascade depend on font loading.
203
+ // The font's own x-height where the cascade was handed a way to ask
204
+ // for it, and half an em where it was not, which is within a few
205
+ // percent for most text faces — and for Ahem, whose x-height is 0.8em,
206
+ // is not.
136
207
  case 'ex':
137
- return ctx.em * 0.5;
208
+ return ctx.ex ? ctx.ex() : ctx.em * 0.5;
209
+ // the advance of the font's "0" (CSS Values 4, 6.1.1), where the
210
+ // cascade can ask for it: half an em is Times's, a little under
211
+ // Arial's, and half of Ahem's and a monospace font's
138
212
  case 'ch':
139
- return ctx.em * 0.5;
213
+ return ctx.ch ? ctx.ch() : ctx.em * 0.5;
214
+ // the computed `line-height`, `normal` as the font's own (CSS Values
215
+ // 4, 6.1.1)
216
+ case 'lh':
217
+ return ctx.lh ? ctx.lh() : ctx.em * 1.2;
218
+ case 'rlh':
219
+ return ctx.rlh ? ctx.rlh() : ctx.rem * 1.2;
140
220
  case 'vw':
141
221
  return ctx.vw / 100;
142
222
  case 'vh':
@@ -152,19 +232,20 @@ function unitScale(unit: string, ctx: UnitContext): number {
152
232
 
153
233
  /** A plain number — `flex-grow`, `opacity`, `z-index`, `line-height`. */
154
234
  export function parseNumber(value: string): number | null {
155
- const n = Number(value.trim());
235
+ // `Number()` alone reads `0x10`, `1.` and white space as numbers
236
+ const v = value.trim();
237
+ if (!NUMBER_RE.test(v)) return MATH.test(v) ? parseMathNumber(v) : null;
238
+ const n = Number(v);
156
239
  return Number.isFinite(n) ? n : null;
157
240
  }
158
241
 
159
242
  /** `opacity: 50%` is as legal as `opacity: .5`. */
160
243
  export function parseAlpha(value: string): number | null {
161
244
  const v = value.trim();
162
- if (v.endsWith('%')) {
163
- const n = Number(v.slice(0, -1));
164
- return Number.isFinite(n) ? Math.max(0, Math.min(1, n / 100)) : null;
165
- }
166
- const n = Number(v);
167
- return Number.isFinite(n) ? Math.max(0, Math.min(1, n)) : null;
245
+ const pct = v.endsWith('%');
246
+ const n = parseNumber(pct ? v.slice(0, -1) : v);
247
+ if (n === null) return null;
248
+ return Math.max(0, Math.min(1, pct ? n / 100 : n));
168
249
  }
169
250
 
170
251
  /**
@@ -231,33 +312,21 @@ export function fourSides<T>(parts: T[]): [T, T, T, T] {
231
312
  return [a, b, c, d];
232
313
  }
233
314
 
234
- /** `url(x)`, `url("x")`, or a bare token. `null` for `none`. */
235
- export function parseUrl(value: string): string | null {
236
- const v = value.trim();
237
- if (!v || v.toLowerCase() === 'none') return null;
238
- const m = /^url\(\s*(.*?)\s*\)$/i.exec(v);
239
- const inner = m ? m[1] : v;
240
- return unquote(inner) || null;
241
- }
242
-
243
- export function unquote(value: string): string {
244
- const v = value.trim();
245
- if (
246
- v.length >= 2 &&
247
- (v[0] === '"' || v[0] === "'") &&
248
- v[v.length - 1] === v[0]
249
- ) {
250
- return v.slice(1, -1);
251
- }
252
- return v;
253
- }
254
-
255
315
  /** A colour as it is about to be used: `currentColor` resolved against the
256
316
  * element's own ink, everything else passed through. */
257
317
  export function inkColor(color: string, current: string): string {
258
- return color === 'currentColor' ? current : color;
318
+ if (color === 'currentColor') return current;
319
+ // a `color-mix()` with `currentColor` in it waits for the colour too;
320
+ // every other functional colour was read when it was parsed
321
+ if (color.charCodeAt(0) === 99 && color.startsWith('color-mix(')) {
322
+ return functionalColor(color.replace(CURRENT, current)) ?? current;
323
+ }
324
+ return color;
259
325
  }
260
326
 
327
+ const CURRENT = /currentcolor/gi;
328
+ const HAS_CURRENT = /currentcolor/i;
329
+
261
330
  /** Whether a colour paints anything at all. Two string tests rather than a
262
331
  * parse, for the reason at the top of the file. */
263
332
  export function isTransparent(color: string | null | undefined): boolean {
@@ -269,6 +338,24 @@ export function isTransparent(color: string | null | undefined): boolean {
269
338
  return /^(?:rgba|hsla)\([^)]*[,/]\s*0*(?:\.0+)?\s*\)$/.test(c);
270
339
  }
271
340
 
341
+ /**
342
+ * A colour's opacity, 0 to 1, as `parseColor` leaves it: a hex colour's
343
+ * fourth or eighth digits, an `rgba()`'s last number, and nothing for
344
+ * `transparent`; every other colour, `currentColor` among them, is taken
345
+ * for opaque.
346
+ */
347
+ export function alphaOf(color: string): number {
348
+ if (color === 'transparent') return 0;
349
+ if (color.charCodeAt(0) === 35) {
350
+ // `#rgba` and `#rrggbbaa`
351
+ if (color.length === 5) return parseInt(color[4], 16) / 15;
352
+ if (color.length === 9) return parseInt(color.slice(7), 16) / 255;
353
+ return 1;
354
+ }
355
+ const m = /^rgba\([^)]*,\s*([\d.]+)\s*\)$/.exec(color);
356
+ return m ? Number(m[1]) : 1;
357
+ }
358
+
272
359
  /**
273
360
  * A colour token. `null` means the value was not a colour, which is what a
274
361
  * shorthand parser branches on.
@@ -287,11 +374,24 @@ export function parseColor(value: string): string | null {
287
374
  if (lower === 'transparent') return 'transparent';
288
375
  if (lower === 'inherit' || lower === 'initial' || lower === 'unset')
289
376
  return null;
290
- if (v.startsWith('#')) return /^#[0-9a-f]{3,8}$/i.test(v) ? v : null;
291
- if (/^(?:rgb|rgba|hsl|hsla|color|lab|lch|oklab|oklch)\(/i.test(v)) return v;
377
+ // three, four, six or eight digits: ntk's context throws from paint on
378
+ // five or seven, and a typo'd `#ff000` took the application down
379
+ if (v.startsWith('#')) return HEX_COLOR.test(v) ? v : null;
380
+ if (/^(?:rgba?|hsla?|hwb|lab|lch|oklab|oklch|color|color-mix)\(/i.test(v)) {
381
+ // a mix with `currentColor` in it is kept to be mixed where it is used
382
+ // (`inkColor`), once it is known to be one
383
+ if (HAS_CURRENT.test(v) && /^color-mix\(/i.test(v)) {
384
+ return functionalColor(v.replace(CURRENT, '#000')) === null
385
+ ? null
386
+ : `color-mix(${v.slice(v.indexOf('(') + 1)}`;
387
+ }
388
+ return functionalColor(v);
389
+ }
292
390
  return NAMED_COLORS.has(lower) ? lower : null;
293
391
  }
294
392
 
393
+ const HEX_COLOR = /^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;
394
+
295
395
  /**
296
396
  * The CSS named colours. The list is here rather than reached through ntk's
297
397
  * `parse-color` because the only question asked of it is "is this token a