@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
package/src/flow/types.ts CHANGED
@@ -509,6 +509,12 @@ export interface NodeBodyRect extends FlowRect {
509
509
  * units. */
510
510
  zoom: number;
511
511
  selected: boolean;
512
+ /** The whole card the body sits in, in the same frame as the body's rect:
513
+ * `<Flow>` paints it (`paintCard`) under the body, so card and body are
514
+ * stacked together. */
515
+ card: FlowRect;
516
+ /** The pointer is over the node — its card paints its hover border. */
517
+ hovered: boolean;
512
518
  }
513
519
 
514
520
  // --- the imperative surface ------------------------------------------------
@@ -649,11 +655,117 @@ export interface FlowProps<N = FlowNodeData, E = unknown> {
649
655
  * between the drawn half and the mounted one, and the raw `<flowgraph>`
650
656
  * element is the only reason it is a prop rather than a private method.
651
657
  *
658
+ * Each rect is relative to `origin`: where the graph's own origin sits in
659
+ * the pane, which is the viewport's translation. A pan moves the origin
660
+ * and nothing else, and re-sends the same `bodies` array — so the bodies
661
+ * can be laid out in one box at `origin` that a pan moves, rather than
662
+ * each moved by a render of its own.
663
+ *
652
664
  * `sync` is true when the change came out of a live gesture — a drag
653
665
  * step, a wheel tick, an arrow key. Motion dispatches at continuous
654
666
  * priority, which React may hold across several frames while the pane
655
667
  * paints each step immediately; a gesture-time receiver must commit
656
668
  * synchronously or the mounted bodies visibly trail the drawn cards.
669
+ *
670
+ * `held` is true while a zoom is moving: the bodies are to stay mounted
671
+ * and be hidden, and `bodies`/`origin` are the last ones sent, unchanged.
672
+ * The next call, once the zoom has rested, has `held` false and the
673
+ * bodies at the new scale.
674
+ */
675
+ /**
676
+ * Where the minimap and the controls are, relative to the pane's top-left
677
+ * — sent when that changes. `<Flow>` paints them on canvases of its own
678
+ * over the node bodies (`setPanelCanvases`).
679
+ * @internal
680
+ */
681
+ onPanels?: (rects: readonly FlowRect[]) => void;
682
+ onNodeBodies?: (
683
+ bodies: readonly NodeBodyRect[],
684
+ sync: boolean,
685
+ origin: XYPosition,
686
+ held: boolean,
687
+ ) => void;
688
+ /**
689
+ * Which renderer draws the graph. `'retained'` (the default) draws through
690
+ * the 2D context, everywhere a window can. `'gl'` draws through a
691
+ * `<glarea>`, every frame from the whole scene, and needs direct GL —
692
+ * `useSupports('shaders')`; where it has none, or its surface fails, the
693
+ * pane falls back to `'retained'` and says so through `onError`.
694
+ *
695
+ * **Not yet a replacement.** The GL renderer draws the graph — cards,
696
+ * edges, arrowheads, handles, labels, the grid, the minimap — but not yet
697
+ * a node type's own `paint`, nor a mounted body over the surface. Labels
698
+ * are drawn from distance fields, sharp at every zoom, and a string drawn
699
+ * for the first time arrives a frame or two after the frame that asked
700
+ * for it; `onFrame`'s `gaps` counts what a frame left out.
701
+ * `docs/prd-flow-gl.md` has the plan and the numbers.
702
+ */
703
+ renderer?: 'retained' | 'gl';
704
+ /**
705
+ * Every frame the pane drew, on either renderer, with what it cost this
706
+ * thread — `<Map onFrame>`'s shape, for the same reason: one callback an
707
+ * application can read an FPS off without caring which renderer drew.
708
+ *
709
+ * A frame, not a paint: the 2D renderer may paint several damage rects in
710
+ * one window flush, and those are reported once, summed. Both renderers
711
+ * draw on change and not otherwise, so an idle pane reports nothing.
712
+ */
713
+ onFrame?: (stats: FlowFrameStats) => void;
714
+ /**
715
+ * How mounted node bodies ride a zoom gesture. Re-scaling a body is a
716
+ * restyle, a layout and a repaint of its whole subtree on every step —
717
+ * about a millisecond each — so each step predicts what the bodies on
718
+ * screen would add, and over the budget they sit the gesture out: mounted,
719
+ * state intact, off screen, back at the new scale once the zoom rests.
720
+ *
721
+ * `true` (the default) budgets 8 ms a step; `{ budgetMs }` picks another,
722
+ * `0` holding them through every gesture zoom; `false` never holds them —
723
+ * every body zooms live, whatever it costs. A pan or a programmatic
724
+ * viewport change never holds them.
657
725
  */
658
- onNodeBodies?: (bodies: readonly NodeBodyRect[], sync: boolean) => void;
726
+ adaptive?: boolean | { budgetMs?: number };
727
+ /** The GL renderer could not draw, and the pane went back to the 2D one. */
728
+ onError?: (error: Error) => void;
729
+ }
730
+
731
+ /** One frame — see {@link FlowProps.onFrame}. The draw-call and buffer
732
+ * counts are the GL renderer's, and always `0` on the retained one. */
733
+ export interface FlowFrameStats {
734
+ /** Which renderer drew the frame. */
735
+ renderer: 'retained' | 'gl';
736
+ /** Milliseconds building the scene: routing, culling, colours. */
737
+ sceneMs: number;
738
+ /** Milliseconds packing it into instance streams — `0` on the retained
739
+ * renderer, which packs nothing. */
740
+ packMs: number;
741
+ /** Milliseconds issuing it: the 2D calls, or the uploads and draws. */
742
+ drawMs: number;
743
+ drawCalls: number;
744
+ lines: number;
745
+ boxes: number;
746
+ triangles: number;
747
+ /** Bytes handed to the GPU this frame. */
748
+ uploadBytes: number;
749
+ /** Whether the graph was rebuilt and re-uploaded this frame, rather than
750
+ * drawn from the GPU where a pan moved it. False on a pan. */
751
+ worldRebuilt: boolean;
752
+ /** What the frame could not draw yet: strings, and nodes whose type
753
+ * paints itself. */
754
+ gaps: { text: number; custom: number };
755
+ /** The mounted bodies' budget (`adaptive`) as the frame found it. */
756
+ bodies: FlowBodyBudget;
757
+ }
758
+
759
+ /** Where mounted node bodies stand against `adaptive`'s budget. */
760
+ export interface FlowBodyBudget {
761
+ /** Bodies on screen. */
762
+ count: number;
763
+ /** Sitting the current zoom gesture out. */
764
+ held: boolean;
765
+ /** What re-scaling one body adds to a zoom step, learned from frames. */
766
+ perBodyMs: number;
767
+ /** `count × perBodyMs`: what a zoom step would pay to re-scale them. */
768
+ predictedMs: number;
769
+ /** The budget that is held against — `Infinity` when `adaptive` is off. */
770
+ budgetMs: number;
659
771
  }
@@ -23,6 +23,7 @@ import type { Element } from 'domhandler';
23
23
 
24
24
  import { attr, tagOf } from './dom.js';
25
25
  import type { ComputedStyle } from './css/style.js';
26
+ import { isTransparent } from './css/values.js';
26
27
  import type { BoxTree, ReplacedKind } from './layout/boxes.js';
27
28
  import type { FontsLike } from './layout/inline.js';
28
29
 
@@ -46,6 +47,24 @@ export interface ControlRect {
46
47
  y: number;
47
48
  width: number;
48
49
  height: number;
50
+ /**
51
+ * Set on a text field whose own box the author styled — gave it a border
52
+ * or a background (`styledField`). The document draws that box, and the
53
+ * widget goes bare inside its content box, here, with no frame or fill
54
+ * of its own and its text in the element's colour and font.
55
+ */
56
+ bare?: BareField;
57
+ }
58
+
59
+ /** Where a styled text field's widget goes, and how its text looks. */
60
+ export interface BareField {
61
+ x: number;
62
+ y: number;
63
+ width: number;
64
+ height: number;
65
+ color: string;
66
+ fontFamily: string;
67
+ fontSize: number;
49
68
  }
50
69
 
51
70
  /** The rectangles every control in a laid-out document landed on. */
@@ -54,18 +73,59 @@ export function controlRectsOf(tree: BoxTree): ControlRect[] {
54
73
  for (const box of tree.controls) {
55
74
  if (!box.el) continue;
56
75
  if (box.width <= 0 || box.height <= 0) continue;
57
- out.push({
76
+ const rect: ControlRect = {
58
77
  element: box.el,
59
78
  kind: box.replaced,
60
79
  x: box.x,
61
80
  y: box.y,
62
81
  width: box.width,
63
82
  height: box.height,
64
- });
83
+ };
84
+ if (styledField(box.replaced, box.style)) {
85
+ rect.bare = {
86
+ x: box.contentX,
87
+ y: box.contentY,
88
+ width: box.contentWidth,
89
+ height: box.contentHeight,
90
+ color: box.style.color,
91
+ fontFamily: box.style.fontFamily,
92
+ fontSize: box.style.fontSize,
93
+ };
94
+ }
95
+ out.push(rect);
65
96
  }
66
97
  return out;
67
98
  }
68
99
 
100
+ /**
101
+ * Whether a text field's box is the author's to draw: one given a border or
102
+ * a background of its own, which the UA sheet gives no control, or set to
103
+ * `appearance: none`, which says so outright. A browser drops a field's
104
+ * native look for the author's then (CSS UI 4 7.1, `appearance`), and so
105
+ * does this: the widget's frame and fill would hide the author's, and what
106
+ * they would draw is the theme's rather than the page's. `appearance: none`
107
+ * is how a design system writes every field it has — meetup.com's search
108
+ * pill holds two with no background, only one of them with a border.
109
+ */
110
+ export function styledField(kind: ReplacedKind, style: ComputedStyle): boolean {
111
+ if (kind !== 'input' && kind !== 'textarea') return false;
112
+ return (
113
+ style.appearance === 'none' ||
114
+ !isTransparent(style.backgroundColor) ||
115
+ !!style.backgroundImage ||
116
+ !!style.backgroundGradient ||
117
+ !!style.backgroundImages ||
118
+ edged(style.borderTopStyle, style.borderTopWidth) ||
119
+ edged(style.borderRightStyle, style.borderRightWidth) ||
120
+ edged(style.borderBottomStyle, style.borderBottomWidth) ||
121
+ edged(style.borderLeftStyle, style.borderLeftWidth)
122
+ );
123
+ }
124
+
125
+ function edged(style: ComputedStyle['borderTopStyle'], width: number): boolean {
126
+ return style !== 'none' && style !== 'hidden' && width > 0;
127
+ }
128
+
69
129
  /**
70
130
  * The size a control's box takes in the flow.
71
131
  *
@@ -119,9 +179,17 @@ export function measureControl(
119
179
  height: lineHeight + chrome,
120
180
  };
121
181
  }
182
+ // a field the author drew the box of is its text and no more, as a
183
+ // browser's is: the room around it is the author's border and padding
122
184
  case 'textarea': {
123
185
  const cols = numberAttr(el, 'cols') ?? 30;
124
186
  const rows = numberAttr(el, 'rows') ?? 3;
187
+ if (styledField(kind, style)) {
188
+ return {
189
+ width: Math.round(ch * cols),
190
+ height: Math.round(lineHeight * rows),
191
+ };
192
+ }
125
193
  return {
126
194
  width: Math.round(ch * cols + padding * 2 + chrome),
127
195
  height: Math.round(lineHeight * rows + chrome),
@@ -129,6 +197,9 @@ export function measureControl(
129
197
  }
130
198
  case 'input': {
131
199
  const size = numberAttr(el, 'size') ?? 20;
200
+ if (styledField(kind, style)) {
201
+ return { width: Math.round(ch * size), height: lineHeight };
202
+ }
132
203
  return {
133
204
  width: Math.round(ch * size + padding * 2 + chrome),
134
205
  height: lineHeight + chrome,
@@ -0,0 +1,385 @@
1
+ // `calc()`, `min()`, `max()` and `clamp()` (CSS Values 4 10), read down to
2
+ // what a length here can hold: device pixels, or a percentage of what
3
+ // layout knows with pixels added (`Pct.px`) — every `calc()` that adds and
4
+ // scales, which is what documents write: `calc(100% - 2em)`. A comparison
5
+ // with a percentage in it, `min(100%, 600px)`, is a different sum at every
6
+ // width, and is kept as one (`Pct.of`) for layout to resolve; sums and
7
+ // scales distribute into it, so `calc(min(100%, 600px) - 2rem)` is
8
+ // `min(100% - 2rem, 600px - 2rem)`.
9
+
10
+ import type { Len } from './values.js';
11
+
12
+ /** A sum: a number, or a length as pixels plus a percentage. */
13
+ interface Linear {
14
+ kind: 'linear';
15
+ length: boolean;
16
+ px: number;
17
+ pct: number;
18
+ /** A percentage was written, even where the sum cancels it: against a
19
+ * height nothing sets, `calc(40px + 10% - 20% / 2)` is still `auto`. */
20
+ hasPct: boolean;
21
+ }
22
+
23
+ /** `min()` or `max()` of lengths, a percentage among them. */
24
+ interface Compare {
25
+ kind: 'compare';
26
+ max: boolean;
27
+ args: Term[];
28
+ }
29
+
30
+ type Term = Linear | Compare;
31
+
32
+ type Token =
33
+ | { t: 'num'; value: number; unit: string }
34
+ | { t: 'op'; value: '+' | '-' | '*' | '/' }
35
+ | { t: 'open'; fn: string }
36
+ | { t: 'close' }
37
+ | { t: 'comma' }
38
+ | { t: 'space' };
39
+
40
+ /**
41
+ * A math function's value as a length, or null where it is none — a
42
+ * number, a type that does not add up, a division by zero. `dimension`
43
+ * reads one `10px` or `2em` as this package's lengths do.
44
+ */
45
+ export function parseMath(
46
+ value: string,
47
+ dimension: (token: string) => number | null,
48
+ ): Len | null {
49
+ const term = parseTerm(value, dimension);
50
+ if (!term || !isLength(term)) return null;
51
+ return toLen(term);
52
+ }
53
+
54
+ /** A math function's value as a number (`calc(1 + 0.5)`), or null. */
55
+ export function parseMathNumber(value: string): number | null {
56
+ const term = parseTerm(value, () => null);
57
+ if (!term || term.kind !== 'linear' || term.length) return null;
58
+ return censor(term.px);
59
+ }
60
+
61
+ function parseTerm(
62
+ value: string,
63
+ dimension: (token: string) => number | null,
64
+ ): Term | null {
65
+ const tokens = tokenize(value);
66
+ if (!tokens) return null;
67
+ const parser = new Parser(tokens, dimension);
68
+ const term = parser.value();
69
+ return term && parser.pos === tokens.length ? term : null;
70
+ }
71
+
72
+ function isLength(term: Term): boolean {
73
+ return term.kind === 'linear' ? term.length : true;
74
+ }
75
+
76
+ function toLen(term: Term): Len | null {
77
+ if (term.kind === 'compare') {
78
+ const args: Len[] = [];
79
+ for (const arg of term.args) {
80
+ const len = toLen(arg);
81
+ if (len === null) return null;
82
+ args.push(len);
83
+ }
84
+ return { pct: 0, of: { max: term.max, args } };
85
+ }
86
+ if (!term.hasPct) return censor(term.px);
87
+ return { pct: censor(term.pct), px: censor(term.px) };
88
+ }
89
+
90
+ const NUMBER = /^[+-]?(?:\d*\.\d+|\d+)(?:e[+-]?\d+)?/;
91
+
92
+ const CONSTANT = /^(?:-?infinity|nan|pi|e)(?![a-z0-9_(-])/;
93
+
94
+ const CONSTANTS: Record<string, number> = {
95
+ infinity: Infinity,
96
+ '-infinity': -Infinity,
97
+ nan: NaN,
98
+ pi: Math.PI,
99
+ e: Math.E,
100
+ };
101
+
102
+ /**
103
+ * What a calculation that is no finite number comes to (CSS Values 4,
104
+ * 10.9): NaN is 0, and an infinity the largest length there is — which,
105
+ * as in a browser, is still a length: a radius of it is a pill.
106
+ */
107
+ function censor(n: number): number {
108
+ if (Number.isNaN(n)) return 0;
109
+ if (n === Infinity) return LARGEST;
110
+ if (n === -Infinity) return -LARGEST;
111
+ return n;
112
+ }
113
+
114
+ /** The largest length a browser holds, 2^25 pixels less a little: what a
115
+ * calculation's infinity comes to, and what any length is kept within
116
+ * (`parseLength`, `resolve`). */
117
+ export const LARGEST = 33554428;
118
+
119
+ function tokenize(text: string): Token[] | null {
120
+ const out: Token[] = [];
121
+ let i = 0;
122
+ while (i < text.length) {
123
+ const c = text[i];
124
+ if (c === ' ' || c === '\t' || c === '\n' || c === '\r' || c === '\f') {
125
+ while (i < text.length && /[ \t\n\r\f]/.test(text[i])) i += 1;
126
+ if (out.length && out[out.length - 1].t !== 'space') {
127
+ out.push({ t: 'space' });
128
+ }
129
+ continue;
130
+ }
131
+ if (c === '(') {
132
+ out.push({ t: 'open', fn: '' });
133
+ i += 1;
134
+ continue;
135
+ }
136
+ if (c === ')' || c === ',') {
137
+ if (out.length && out[out.length - 1].t === 'space') out.pop();
138
+ out.push(c === ')' ? { t: 'close' } : { t: 'comma' });
139
+ i += 1;
140
+ continue;
141
+ }
142
+ if (c === '*' || c === '/') {
143
+ out.push({ t: 'op', value: c });
144
+ i += 1;
145
+ continue;
146
+ }
147
+ // a sign belongs to the number after it, as the tokenizer reads it:
148
+ // `1px -2px` is two values, and `1px - 2px` a difference
149
+ const m = NUMBER.exec(text.slice(i));
150
+ if (m) {
151
+ i += m[0].length;
152
+ const unit = /^(?:%|[a-z]+)/.exec(text.slice(i))?.[0] ?? '';
153
+ i += unit.length;
154
+ out.push({ t: 'num', value: Number(m[0]), unit });
155
+ continue;
156
+ }
157
+ const name = /^-?[a-z][a-z0-9-]*\(/.exec(text.slice(i))?.[0];
158
+ if (name) {
159
+ out.push({ t: 'open', fn: name.slice(0, -1) });
160
+ i += name.length;
161
+ continue;
162
+ }
163
+ // the numbers CSS Values 4 names (10.7.1): Tailwind 4 writes a pill's
164
+ // radius as `calc(infinity * 1px)`
165
+ const constant = CONSTANT.exec(text.slice(i))?.[0];
166
+ if (constant) {
167
+ out.push({ t: 'num', value: CONSTANTS[constant], unit: '' });
168
+ i += constant.length;
169
+ continue;
170
+ }
171
+ if (c === '+' || c === '-') {
172
+ out.push({ t: 'op', value: c });
173
+ i += 1;
174
+ continue;
175
+ }
176
+ return null;
177
+ }
178
+ return out;
179
+ }
180
+
181
+ class Parser {
182
+ pos = 0;
183
+ constructor(
184
+ private tokens: Token[],
185
+ private dimension: (token: string) => number | null,
186
+ ) {}
187
+
188
+ private peek(): Token | undefined {
189
+ return this.tokens[this.pos];
190
+ }
191
+
192
+ private skipSpace(): void {
193
+ if (this.peek()?.t === 'space') this.pos += 1;
194
+ }
195
+
196
+ /** A whole math function, `calc(…)` and the rest. */
197
+ value(): Term | null {
198
+ this.skipSpace();
199
+ const open = this.peek();
200
+ if (open?.t !== 'open' || !open.fn) return null;
201
+ const term = this.fn();
202
+ this.skipSpace();
203
+ return term;
204
+ }
205
+
206
+ private fn(): Term | null {
207
+ const open = this.tokens[this.pos] as { t: 'open'; fn: string };
208
+ this.pos += 1;
209
+ const fn = open.fn.replace(/^-webkit-/, '');
210
+ const args: Term[] = [];
211
+ for (;;) {
212
+ const sum = this.sum();
213
+ if (!sum) return null;
214
+ args.push(sum);
215
+ const next = this.peek();
216
+ if (next?.t === 'comma') {
217
+ this.pos += 1;
218
+ continue;
219
+ }
220
+ if (next?.t !== 'close') return null;
221
+ this.pos += 1;
222
+ break;
223
+ }
224
+ switch (fn) {
225
+ case '':
226
+ case 'calc':
227
+ return args.length === 1 ? args[0] : null;
228
+ case 'min':
229
+ case 'max':
230
+ return compare(args, fn === 'max');
231
+ case 'clamp': {
232
+ if (args.length !== 3) return null;
233
+ const upper = compare([args[1], args[2]], false);
234
+ return upper && compare([args[0], upper], true);
235
+ }
236
+ default:
237
+ return null;
238
+ }
239
+ }
240
+
241
+ private sum(): Term | null {
242
+ this.skipSpace();
243
+ let left = this.product();
244
+ if (!left) return null;
245
+ for (;;) {
246
+ const at = this.pos;
247
+ // `+` and `-` need white space on both sides
248
+ if (this.peek()?.t !== 'space') break;
249
+ this.pos += 1;
250
+ const op = this.peek();
251
+ if (op?.t !== 'op' || (op.value !== '+' && op.value !== '-')) {
252
+ this.pos = at;
253
+ break;
254
+ }
255
+ this.pos += 1;
256
+ if (this.peek()?.t !== 'space') return null;
257
+ this.pos += 1;
258
+ const right = this.product();
259
+ if (!right) return null;
260
+ left = add(left, right, op.value === '+' ? 1 : -1);
261
+ if (!left) return null;
262
+ }
263
+ this.skipSpace();
264
+ return left;
265
+ }
266
+
267
+ private product(): Term | null {
268
+ let left = this.unit();
269
+ if (!left) return null;
270
+ for (;;) {
271
+ const at = this.pos;
272
+ this.skipSpace();
273
+ const op = this.peek();
274
+ if (op?.t !== 'op' || (op.value !== '*' && op.value !== '/')) {
275
+ this.pos = at;
276
+ return left;
277
+ }
278
+ this.pos += 1;
279
+ this.skipSpace();
280
+ const right = this.unit();
281
+ if (!right) return null;
282
+ if (op.value === '*') {
283
+ // one side a number, which scales the other
284
+ if (isNumber(left)) left = scale(right, left.px);
285
+ else if (isNumber(right)) left = scale(left, right.px);
286
+ else return null;
287
+ } else {
288
+ if (!isNumber(right) || right.px === 0) return null;
289
+ left = scale(left, 1 / right.px);
290
+ }
291
+ }
292
+ }
293
+
294
+ private unit(): Term | null {
295
+ const token = this.peek();
296
+ if (!token) return null;
297
+ if (token.t === 'open') return this.fn();
298
+ if (token.t !== 'num') return null;
299
+ this.pos += 1;
300
+ if (token.unit === '') return linear(false, token.value, 0, false);
301
+ if (token.unit === '%') return linear(true, 0, token.value, true);
302
+ const px = this.dimension(`${token.value}${token.unit}`);
303
+ return px === null ? null : linear(true, px, 0, false);
304
+ }
305
+ }
306
+
307
+ function linear(
308
+ length: boolean,
309
+ px: number,
310
+ pct: number,
311
+ hasPct: boolean,
312
+ ): Linear {
313
+ return { kind: 'linear', length, px, pct, hasPct };
314
+ }
315
+
316
+ function isNumber(term: Term): term is Linear {
317
+ return term.kind === 'linear' && !term.length;
318
+ }
319
+
320
+ /** `a + b`, or `a - b` for a sign of -1, distributed into a comparison. */
321
+ function add(a: Term, b: Term, sign: 1 | -1): Term | null {
322
+ if (isLength(a) !== isLength(b)) return null;
323
+ if (a.kind === 'compare') {
324
+ const args: Term[] = [];
325
+ for (const arg of a.args) {
326
+ const sum = add(arg, b, sign);
327
+ if (!sum) return null;
328
+ args.push(sum);
329
+ }
330
+ return { kind: 'compare', max: a.max, args };
331
+ }
332
+ if (b.kind === 'compare') {
333
+ // `a - min(x, y)` is `max(a - x, a - y)`
334
+ const args: Term[] = [];
335
+ for (const arg of b.args) {
336
+ const sum = add(a, arg, sign);
337
+ if (!sum) return null;
338
+ args.push(sum);
339
+ }
340
+ return { kind: 'compare', max: sign === 1 ? b.max : !b.max, args };
341
+ }
342
+ return linear(
343
+ a.length,
344
+ a.px + sign * b.px,
345
+ a.pct + sign * b.pct,
346
+ a.hasPct || b.hasPct,
347
+ );
348
+ }
349
+
350
+ /** `term * k`, distributed into a comparison, which a negative `k` turns
351
+ * over. */
352
+ function scale(term: Term, k: number): Term {
353
+ if (term.kind === 'compare') {
354
+ return {
355
+ kind: 'compare',
356
+ max: k < 0 ? !term.max : term.max,
357
+ args: term.args.map((arg) => scale(arg, k)),
358
+ };
359
+ }
360
+ // nought stays nought, so that an infinity scaling a length is not also
361
+ // a NaN of the percentage it has none of
362
+ return linear(
363
+ term.length,
364
+ term.px === 0 ? 0 : term.px * k,
365
+ term.pct === 0 ? 0 : term.pct * k,
366
+ term.hasPct,
367
+ );
368
+ }
369
+
370
+ /** `min()` or `max()` of terms of one type: a number where no percentage
371
+ * is among them, and a comparison for layout where one is. */
372
+ function compare(args: Term[], max: boolean): Term | null {
373
+ const length = isLength(args[0]);
374
+ if (args.some((a) => isLength(a) !== length)) return null;
375
+ if (args.every((a) => a.kind === 'linear' && !a.hasPct)) {
376
+ const values = args.map((a) => (a as Linear).px);
377
+ return linear(
378
+ length,
379
+ max ? Math.max(...values) : Math.min(...values),
380
+ 0,
381
+ false,
382
+ );
383
+ }
384
+ return { kind: 'compare', max, args };
385
+ }