@react-x11/components 0.1.0 → 0.2.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 (783) hide show
  1. package/README.md +979 -21
  2. package/dist/ansi/cast.d.ts +48 -0
  3. package/dist/ansi/cast.d.ts.map +1 -0
  4. package/dist/ansi/cast.js +135 -0
  5. package/dist/ansi/cast.js.map +1 -0
  6. package/dist/ansi/index.d.ts +10 -0
  7. package/dist/ansi/index.d.ts.map +1 -0
  8. package/dist/ansi/index.js +27 -0
  9. package/dist/ansi/index.js.map +1 -0
  10. package/dist/ansi/palette.d.ts +79 -0
  11. package/dist/ansi/palette.d.ts.map +1 -0
  12. package/dist/ansi/palette.js +155 -0
  13. package/dist/ansi/palette.js.map +1 -0
  14. package/dist/ansi/parse.d.ts +114 -0
  15. package/dist/ansi/parse.d.ts.map +1 -0
  16. package/dist/ansi/parse.js +687 -0
  17. package/dist/ansi/parse.js.map +1 -0
  18. package/dist/ansi/sgr.d.ts +87 -0
  19. package/dist/ansi/sgr.d.ts.map +1 -0
  20. package/dist/ansi/sgr.js +302 -0
  21. package/dist/ansi/sgr.js.map +1 -0
  22. package/dist/ansi/utf8.d.ts +15 -0
  23. package/dist/ansi/utf8.d.ts.map +1 -0
  24. package/dist/ansi/utf8.js +82 -0
  25. package/dist/ansi/utf8.js.map +1 -0
  26. package/dist/calendar/Calendar.d.ts +136 -0
  27. package/dist/calendar/Calendar.d.ts.map +1 -0
  28. package/dist/calendar/Calendar.js +460 -0
  29. package/dist/calendar/Calendar.js.map +1 -0
  30. package/dist/calendar/DatePicker.d.ts +52 -0
  31. package/dist/calendar/DatePicker.d.ts.map +1 -0
  32. package/dist/calendar/DatePicker.js +257 -0
  33. package/dist/calendar/DatePicker.js.map +1 -0
  34. package/dist/calendar/dates.d.ts +90 -0
  35. package/dist/calendar/dates.d.ts.map +1 -0
  36. package/dist/calendar/dates.js +236 -0
  37. package/dist/calendar/dates.js.map +1 -0
  38. package/dist/calendar/index.d.ts +8 -0
  39. package/dist/calendar/index.d.ts.map +1 -0
  40. package/dist/calendar/index.js +15 -0
  41. package/dist/calendar/index.js.map +1 -0
  42. package/dist/charts/components.d.ts +141 -0
  43. package/dist/charts/components.d.ts.map +1 -0
  44. package/dist/charts/components.js +580 -0
  45. package/dist/charts/components.js.map +1 -0
  46. package/dist/charts/data.d.ts +198 -0
  47. package/dist/charts/data.d.ts.map +1 -0
  48. package/dist/charts/data.js +616 -0
  49. package/dist/charts/data.js.map +1 -0
  50. package/dist/charts/hx.d.ts +21 -0
  51. package/dist/charts/hx.d.ts.map +1 -0
  52. package/dist/charts/hx.js +15 -0
  53. package/dist/charts/hx.js.map +1 -0
  54. package/dist/charts/index.d.ts +27 -0
  55. package/dist/charts/index.d.ts.map +1 -0
  56. package/dist/charts/index.js +38 -0
  57. package/dist/charts/index.js.map +1 -0
  58. package/dist/charts/node.d.ts +96 -0
  59. package/dist/charts/node.d.ts.map +1 -0
  60. package/dist/charts/node.js +720 -0
  61. package/dist/charts/node.js.map +1 -0
  62. package/dist/charts/render.d.ts +153 -0
  63. package/dist/charts/render.d.ts.map +1 -0
  64. package/dist/charts/render.js +762 -0
  65. package/dist/charts/render.js.map +1 -0
  66. package/dist/charts/scale.d.ts +42 -0
  67. package/dist/charts/scale.d.ts.map +1 -0
  68. package/dist/charts/scale.js +173 -0
  69. package/dist/charts/scale.js.map +1 -0
  70. package/dist/charts/spec.d.ts +91 -0
  71. package/dist/charts/spec.d.ts.map +1 -0
  72. package/dist/charts/spec.js +33 -0
  73. package/dist/charts/spec.js.map +1 -0
  74. package/dist/charts/timers.d.ts +6 -0
  75. package/dist/charts/timers.d.ts.map +1 -0
  76. package/dist/charts/timers.js +14 -0
  77. package/dist/charts/timers.js.map +1 -0
  78. package/dist/code/hx.d.ts +24 -0
  79. package/dist/code/hx.d.ts.map +1 -0
  80. package/dist/code/hx.js +25 -0
  81. package/dist/code/hx.js.map +1 -0
  82. package/dist/code/index.d.ts +45 -0
  83. package/dist/code/index.d.ts.map +1 -0
  84. package/dist/code/index.js +93 -0
  85. package/dist/code/index.js.map +1 -0
  86. package/dist/code-editor/completion.d.ts +26 -0
  87. package/dist/code-editor/completion.d.ts.map +1 -0
  88. package/dist/code-editor/completion.js +129 -0
  89. package/dist/code-editor/completion.js.map +1 -0
  90. package/dist/code-editor/doc.d.ts +35 -0
  91. package/dist/code-editor/doc.d.ts.map +1 -0
  92. package/dist/code-editor/doc.js +162 -0
  93. package/dist/code-editor/doc.js.map +1 -0
  94. package/dist/code-editor/hx.d.ts +13 -0
  95. package/dist/code-editor/hx.d.ts.map +1 -0
  96. package/dist/code-editor/hx.js +10 -0
  97. package/dist/code-editor/hx.js.map +1 -0
  98. package/dist/code-editor/index.d.ts +88 -0
  99. package/dist/code-editor/index.d.ts.map +1 -0
  100. package/dist/code-editor/index.js +401 -0
  101. package/dist/code-editor/index.js.map +1 -0
  102. package/dist/code-editor/node.d.ts +343 -0
  103. package/dist/code-editor/node.d.ts.map +1 -0
  104. package/dist/code-editor/node.js +1521 -0
  105. package/dist/code-editor/node.js.map +1 -0
  106. package/dist/code-language/hljs.d.ts +47 -0
  107. package/dist/code-language/hljs.d.ts.map +1 -0
  108. package/dist/code-language/hljs.js +211 -0
  109. package/dist/code-language/hljs.js.map +1 -0
  110. package/dist/code-language/index.d.ts +22 -0
  111. package/dist/code-language/index.d.ts.map +1 -0
  112. package/dist/code-language/index.js +20 -0
  113. package/dist/code-language/index.js.map +1 -0
  114. package/dist/code-language/languages/glsl.d.ts +4 -0
  115. package/dist/code-language/languages/glsl.d.ts.map +1 -0
  116. package/dist/code-language/languages/glsl.js +99 -0
  117. package/dist/code-language/languages/glsl.js.map +1 -0
  118. package/dist/code-language/languages/javascript.d.ts +10 -0
  119. package/dist/code-language/languages/javascript.d.ts.map +1 -0
  120. package/dist/code-language/languages/javascript.js +360 -0
  121. package/dist/code-language/languages/javascript.js.map +1 -0
  122. package/dist/code-language/languages/json.d.ts +4 -0
  123. package/dist/code-language/languages/json.d.ts.map +1 -0
  124. package/dist/code-language/languages/json.js +68 -0
  125. package/dist/code-language/languages/json.js.map +1 -0
  126. package/dist/code-language/languages/shell.d.ts +4 -0
  127. package/dist/code-language/languages/shell.d.ts.map +1 -0
  128. package/dist/code-language/languages/shell.js +189 -0
  129. package/dist/code-language/languages/shell.js.map +1 -0
  130. package/dist/code-language/languages/sql.d.ts +11 -0
  131. package/dist/code-language/languages/sql.d.ts.map +1 -0
  132. package/dist/code-language/languages/sql.js +133 -0
  133. package/dist/code-language/languages/sql.js.map +1 -0
  134. package/dist/code-language/lezer.d.ts +24 -0
  135. package/dist/code-language/lezer.d.ts.map +1 -0
  136. package/dist/code-language/lezer.js +148 -0
  137. package/dist/code-language/lezer.js.map +1 -0
  138. package/dist/code-language/registry.d.ts +19 -0
  139. package/dist/code-language/registry.d.ts.map +1 -0
  140. package/dist/code-language/registry.js +56 -0
  141. package/dist/code-language/registry.js.map +1 -0
  142. package/dist/code-language/runs.d.ts +35 -0
  143. package/dist/code-language/runs.d.ts.map +1 -0
  144. package/dist/code-language/runs.js +88 -0
  145. package/dist/code-language/runs.js.map +1 -0
  146. package/dist/code-language/stream.d.ts +70 -0
  147. package/dist/code-language/stream.d.ts.map +1 -0
  148. package/dist/code-language/stream.js +243 -0
  149. package/dist/code-language/stream.js.map +1 -0
  150. package/dist/code-language/textmate.d.ts +27 -0
  151. package/dist/code-language/textmate.d.ts.map +1 -0
  152. package/dist/code-language/textmate.js +86 -0
  153. package/dist/code-language/textmate.js.map +1 -0
  154. package/dist/code-language/theme.d.ts +26 -0
  155. package/dist/code-language/theme.d.ts.map +1 -0
  156. package/dist/code-language/theme.js +108 -0
  157. package/dist/code-language/theme.js.map +1 -0
  158. package/dist/code-language/timers.d.ts +7 -0
  159. package/dist/code-language/timers.d.ts.map +1 -0
  160. package/dist/code-language/timers.js +22 -0
  161. package/dist/code-language/timers.js.map +1 -0
  162. package/dist/code-language/types.d.ts +173 -0
  163. package/dist/code-language/types.d.ts.map +1 -0
  164. package/dist/code-language/types.js +41 -0
  165. package/dist/code-language/types.js.map +1 -0
  166. package/dist/codeblock/index.d.ts +69 -0
  167. package/dist/codeblock/index.d.ts.map +1 -0
  168. package/dist/codeblock/index.js +85 -0
  169. package/dist/codeblock/index.js.map +1 -0
  170. package/dist/color-picker/ColorField.d.ts +39 -0
  171. package/dist/color-picker/ColorField.d.ts.map +1 -0
  172. package/dist/color-picker/ColorField.js +239 -0
  173. package/dist/color-picker/ColorField.js.map +1 -0
  174. package/dist/color-picker/ColorPicker.d.ts +109 -0
  175. package/dist/color-picker/ColorPicker.d.ts.map +1 -0
  176. package/dist/color-picker/ColorPicker.js +757 -0
  177. package/dist/color-picker/ColorPicker.js.map +1 -0
  178. package/dist/color-picker/color.d.ts +105 -0
  179. package/dist/color-picker/color.d.ts.map +1 -0
  180. package/dist/color-picker/color.js +313 -0
  181. package/dist/color-picker/color.js.map +1 -0
  182. package/dist/color-picker/index.d.ts +8 -0
  183. package/dist/color-picker/index.d.ts.map +1 -0
  184. package/dist/color-picker/index.js +19 -0
  185. package/dist/color-picker/index.js.map +1 -0
  186. package/dist/desktop-calendar/eds.d.ts +102 -0
  187. package/dist/desktop-calendar/eds.d.ts.map +1 -0
  188. package/dist/desktop-calendar/eds.js +356 -0
  189. package/dist/desktop-calendar/eds.js.map +1 -0
  190. package/dist/desktop-calendar/ical.d.ts +63 -0
  191. package/dist/desktop-calendar/ical.d.ts.map +1 -0
  192. package/dist/desktop-calendar/ical.js +57 -0
  193. package/dist/desktop-calendar/ical.js.map +1 -0
  194. package/dist/desktop-calendar/index.d.ts +72 -0
  195. package/dist/desktop-calendar/index.d.ts.map +1 -0
  196. package/dist/desktop-calendar/index.js +213 -0
  197. package/dist/desktop-calendar/index.js.map +1 -0
  198. package/dist/embed/client.d.ts +121 -0
  199. package/dist/embed/client.d.ts.map +1 -0
  200. package/dist/embed/client.js +203 -0
  201. package/dist/embed/client.js.map +1 -0
  202. package/dist/embed/host.d.ts +96 -0
  203. package/dist/embed/host.d.ts.map +1 -0
  204. package/dist/embed/host.js +266 -0
  205. package/dist/embed/host.js.map +1 -0
  206. package/dist/embed/index.d.ts +5 -0
  207. package/dist/embed/index.d.ts.map +1 -0
  208. package/dist/embed/index.js +13 -0
  209. package/dist/embed/index.js.map +1 -0
  210. package/dist/embed/timers.d.ts +6 -0
  211. package/dist/embed/timers.d.ts.map +1 -0
  212. package/dist/embed/timers.js +16 -0
  213. package/dist/embed/timers.js.map +1 -0
  214. package/dist/flow/draw.d.ts +45 -0
  215. package/dist/flow/draw.d.ts.map +1 -0
  216. package/dist/flow/draw.js +295 -0
  217. package/dist/flow/draw.js.map +1 -0
  218. package/dist/flow/index.d.ts +64 -0
  219. package/dist/flow/index.d.ts.map +1 -0
  220. package/dist/flow/index.js +306 -0
  221. package/dist/flow/index.js.map +1 -0
  222. package/dist/flow/model.d.ts +158 -0
  223. package/dist/flow/model.d.ts.map +1 -0
  224. package/dist/flow/model.js +566 -0
  225. package/dist/flow/model.js.map +1 -0
  226. package/dist/flow/node.d.ts +429 -0
  227. package/dist/flow/node.d.ts.map +1 -0
  228. package/dist/flow/node.js +3025 -0
  229. package/dist/flow/node.js.map +1 -0
  230. package/dist/flow/paths.d.ts +43 -0
  231. package/dist/flow/paths.d.ts.map +1 -0
  232. package/dist/flow/paths.js +327 -0
  233. package/dist/flow/paths.js.map +1 -0
  234. package/dist/flow/types.d.ts +561 -0
  235. package/dist/flow/types.d.ts.map +1 -0
  236. package/dist/flow/types.js +2 -0
  237. package/dist/flow/types.js.map +1 -0
  238. package/dist/formula/hx.d.ts +24 -0
  239. package/dist/formula/hx.d.ts.map +1 -0
  240. package/dist/formula/hx.js +25 -0
  241. package/dist/formula/hx.js.map +1 -0
  242. package/dist/formula/index.d.ts +74 -0
  243. package/dist/formula/index.d.ts.map +1 -0
  244. package/dist/formula/index.js +155 -0
  245. package/dist/formula/index.js.map +1 -0
  246. package/dist/formula/katex.d.ts +78 -0
  247. package/dist/formula/katex.d.ts.map +1 -0
  248. package/dist/formula/katex.js +130 -0
  249. package/dist/formula/katex.js.map +1 -0
  250. package/dist/formula/layout.d.ts +103 -0
  251. package/dist/formula/layout.d.ts.map +1 -0
  252. package/dist/formula/layout.js +716 -0
  253. package/dist/formula/layout.js.map +1 -0
  254. package/dist/formula/node.d.ts +50 -0
  255. package/dist/formula/node.d.ts.map +1 -0
  256. package/dist/formula/node.js +351 -0
  257. package/dist/formula/node.js.map +1 -0
  258. package/dist/html/controls.d.ts +48 -0
  259. package/dist/html/controls.d.ts.map +1 -0
  260. package/dist/html/controls.js +195 -0
  261. package/dist/html/controls.js.map +1 -0
  262. package/dist/html/css/cascade.d.ts +51 -0
  263. package/dist/html/css/cascade.d.ts.map +1 -0
  264. package/dist/html/css/cascade.js +552 -0
  265. package/dist/html/css/cascade.js.map +1 -0
  266. package/dist/html/css/parse.d.ts +74 -0
  267. package/dist/html/css/parse.d.ts.map +1 -0
  268. package/dist/html/css/parse.js +464 -0
  269. package/dist/html/css/parse.js.map +1 -0
  270. package/dist/html/css/style.d.ts +142 -0
  271. package/dist/html/css/style.d.ts.map +1 -0
  272. package/dist/html/css/style.js +1145 -0
  273. package/dist/html/css/style.js.map +1 -0
  274. package/dist/html/css/ua.d.ts +5 -0
  275. package/dist/html/css/ua.d.ts.map +1 -0
  276. package/dist/html/css/ua.js +171 -0
  277. package/dist/html/css/ua.js.map +1 -0
  278. package/dist/html/css/values.d.ts +78 -0
  279. package/dist/html/css/values.d.ts.map +1 -0
  280. package/dist/html/css/values.js +330 -0
  281. package/dist/html/css/values.js.map +1 -0
  282. package/dist/html/dom.d.ts +112 -0
  283. package/dist/html/dom.d.ts.map +1 -0
  284. package/dist/html/dom.js +374 -0
  285. package/dist/html/dom.js.map +1 -0
  286. package/dist/html/hx.d.ts +24 -0
  287. package/dist/html/hx.d.ts.map +1 -0
  288. package/dist/html/hx.js +29 -0
  289. package/dist/html/hx.js.map +1 -0
  290. package/dist/html/index.d.ts +137 -0
  291. package/dist/html/index.d.ts.map +1 -0
  292. package/dist/html/index.js +339 -0
  293. package/dist/html/index.js.map +1 -0
  294. package/dist/html/layout/block.d.ts +58 -0
  295. package/dist/html/layout/block.d.ts.map +1 -0
  296. package/dist/html/layout/block.js +724 -0
  297. package/dist/html/layout/block.js.map +1 -0
  298. package/dist/html/layout/boxes.d.ts +261 -0
  299. package/dist/html/layout/boxes.d.ts.map +1 -0
  300. package/dist/html/layout/boxes.js +725 -0
  301. package/dist/html/layout/boxes.js.map +1 -0
  302. package/dist/html/layout/flex.d.ts +16 -0
  303. package/dist/html/layout/flex.d.ts.map +1 -0
  304. package/dist/html/layout/flex.js +242 -0
  305. package/dist/html/layout/flex.js.map +1 -0
  306. package/dist/html/layout/floats.d.ts +50 -0
  307. package/dist/html/layout/floats.d.ts.map +1 -0
  308. package/dist/html/layout/floats.js +110 -0
  309. package/dist/html/layout/floats.js.map +1 -0
  310. package/dist/html/layout/inline.d.ts +44 -0
  311. package/dist/html/layout/inline.d.ts.map +1 -0
  312. package/dist/html/layout/inline.js +700 -0
  313. package/dist/html/layout/inline.js.map +1 -0
  314. package/dist/html/layout/table.d.ts +5 -0
  315. package/dist/html/layout/table.d.ts.map +1 -0
  316. package/dist/html/layout/table.js +340 -0
  317. package/dist/html/layout/table.js.map +1 -0
  318. package/dist/html/node.d.ts +149 -0
  319. package/dist/html/node.d.ts.map +1 -0
  320. package/dist/html/node.js +861 -0
  321. package/dist/html/node.js.map +1 -0
  322. package/dist/html/paint.d.ts +48 -0
  323. package/dist/html/paint.d.ts.map +1 -0
  324. package/dist/html/paint.js +495 -0
  325. package/dist/html/paint.js.map +1 -0
  326. package/dist/html/resources.d.ts +48 -0
  327. package/dist/html/resources.d.ts.map +1 -0
  328. package/dist/html/resources.js +156 -0
  329. package/dist/html/resources.js.map +1 -0
  330. package/dist/index.d.ts +48 -0
  331. package/dist/index.d.ts.map +1 -0
  332. package/dist/index.js +92 -0
  333. package/dist/index.js.map +1 -0
  334. package/dist/internal/heights.d.ts +81 -0
  335. package/dist/internal/heights.d.ts.map +1 -0
  336. package/dist/internal/heights.js +193 -0
  337. package/dist/internal/heights.js.map +1 -0
  338. package/dist/internal/hx.d.ts +24 -0
  339. package/dist/internal/hx.d.ts.map +1 -0
  340. package/dist/internal/hx.js +27 -0
  341. package/dist/internal/hx.js.map +1 -0
  342. package/dist/internal/text.d.ts +6 -0
  343. package/dist/internal/text.d.ts.map +1 -0
  344. package/dist/internal/text.js +44 -0
  345. package/dist/internal/text.js.map +1 -0
  346. package/dist/internal/timers.d.ts +8 -0
  347. package/dist/internal/timers.d.ts.map +1 -0
  348. package/dist/internal/timers.js +22 -0
  349. package/dist/internal/timers.js.map +1 -0
  350. package/dist/internal/widget.d.ts +40 -0
  351. package/dist/internal/widget.d.ts.map +1 -0
  352. package/dist/internal/widget.js +44 -0
  353. package/dist/internal/widget.js.map +1 -0
  354. package/dist/markdown/ast.d.ts +126 -0
  355. package/dist/markdown/ast.d.ts.map +1 -0
  356. package/dist/markdown/ast.js +8 -0
  357. package/dist/markdown/ast.js.map +1 -0
  358. package/dist/markdown/hx.d.ts +24 -0
  359. package/dist/markdown/hx.d.ts.map +1 -0
  360. package/dist/markdown/hx.js +25 -0
  361. package/dist/markdown/hx.js.map +1 -0
  362. package/dist/markdown/index.d.ts +90 -0
  363. package/dist/markdown/index.d.ts.map +1 -0
  364. package/dist/markdown/index.js +413 -0
  365. package/dist/markdown/index.js.map +1 -0
  366. package/dist/markdown/parse.d.ts +8 -0
  367. package/dist/markdown/parse.d.ts.map +1 -0
  368. package/dist/markdown/parse.js +911 -0
  369. package/dist/markdown/parse.js.map +1 -0
  370. package/dist/markdown/spans.d.ts +20 -0
  371. package/dist/markdown/spans.d.ts.map +1 -0
  372. package/dist/markdown/spans.js +96 -0
  373. package/dist/markdown/spans.js.map +1 -0
  374. package/dist/media-player/backends.d.ts +64 -0
  375. package/dist/media-player/backends.d.ts.map +1 -0
  376. package/dist/media-player/backends.js +110 -0
  377. package/dist/media-player/backends.js.map +1 -0
  378. package/dist/media-player/control.d.ts +40 -0
  379. package/dist/media-player/control.d.ts.map +1 -0
  380. package/dist/media-player/control.js +44 -0
  381. package/dist/media-player/control.js.map +1 -0
  382. package/dist/media-player/hx.d.ts +24 -0
  383. package/dist/media-player/hx.d.ts.map +1 -0
  384. package/dist/media-player/hx.js +25 -0
  385. package/dist/media-player/hx.js.map +1 -0
  386. package/dist/media-player/index.d.ts +107 -0
  387. package/dist/media-player/index.d.ts.map +1 -0
  388. package/dist/media-player/index.js +219 -0
  389. package/dist/media-player/index.js.map +1 -0
  390. package/dist/media-player/mpv.d.ts +4 -0
  391. package/dist/media-player/mpv.d.ts.map +1 -0
  392. package/dist/media-player/mpv.js +120 -0
  393. package/dist/media-player/mpv.js.map +1 -0
  394. package/dist/media-player/vlc.d.ts +8 -0
  395. package/dist/media-player/vlc.d.ts.map +1 -0
  396. package/dist/media-player/vlc.js +83 -0
  397. package/dist/media-player/vlc.js.map +1 -0
  398. package/dist/richtext/index.d.ts +19 -0
  399. package/dist/richtext/index.d.ts.map +1 -0
  400. package/dist/richtext/index.js +4 -0
  401. package/dist/richtext/index.js.map +1 -0
  402. package/dist/richtext/links.d.ts +12 -0
  403. package/dist/richtext/links.d.ts.map +1 -0
  404. package/dist/richtext/links.js +64 -0
  405. package/dist/richtext/links.js.map +1 -0
  406. package/dist/richtext/menu.d.ts +11 -0
  407. package/dist/richtext/menu.d.ts.map +1 -0
  408. package/dist/richtext/menu.js +43 -0
  409. package/dist/richtext/menu.js.map +1 -0
  410. package/dist/richtext/node.d.ts +151 -0
  411. package/dist/richtext/node.d.ts.map +1 -0
  412. package/dist/richtext/node.js +255 -0
  413. package/dist/richtext/node.js.map +1 -0
  414. package/dist/richtext/runs.d.ts +92 -0
  415. package/dist/richtext/runs.d.ts.map +1 -0
  416. package/dist/richtext/runs.js +158 -0
  417. package/dist/richtext/runs.js.map +1 -0
  418. package/dist/table/hx.d.ts +24 -0
  419. package/dist/table/hx.d.ts.map +1 -0
  420. package/dist/table/hx.js +25 -0
  421. package/dist/table/hx.js.map +1 -0
  422. package/dist/table/index.d.ts +169 -0
  423. package/dist/table/index.d.ts.map +1 -0
  424. package/dist/table/index.js +844 -0
  425. package/dist/table/index.js.map +1 -0
  426. package/dist/table/rows.d.ts +136 -0
  427. package/dist/table/rows.d.ts.map +1 -0
  428. package/dist/table/rows.js +146 -0
  429. package/dist/table/rows.js.map +1 -0
  430. package/dist/terminal/backends.d.ts +105 -0
  431. package/dist/terminal/backends.d.ts.map +1 -0
  432. package/dist/terminal/backends.js +185 -0
  433. package/dist/terminal/backends.js.map +1 -0
  434. package/dist/terminal/hx.d.ts +24 -0
  435. package/dist/terminal/hx.d.ts.map +1 -0
  436. package/dist/terminal/hx.js +25 -0
  437. package/dist/terminal/hx.js.map +1 -0
  438. package/dist/terminal/index.d.ts +160 -0
  439. package/dist/terminal/index.d.ts.map +1 -0
  440. package/dist/terminal/index.js +344 -0
  441. package/dist/terminal/index.js.map +1 -0
  442. package/dist/terminal/title.d.ts +24 -0
  443. package/dist/terminal/title.d.ts.map +1 -0
  444. package/dist/terminal/title.js +129 -0
  445. package/dist/terminal/title.js.map +1 -0
  446. package/dist/terminal/vt/colors.d.ts +63 -0
  447. package/dist/terminal/vt/colors.d.ts.map +1 -0
  448. package/dist/terminal/vt/colors.js +203 -0
  449. package/dist/terminal/vt/colors.js.map +1 -0
  450. package/dist/terminal/vt/diff.d.ts +117 -0
  451. package/dist/terminal/vt/diff.d.ts.map +1 -0
  452. package/dist/terminal/vt/diff.js +358 -0
  453. package/dist/terminal/vt/diff.js.map +1 -0
  454. package/dist/terminal/vt/fonts.d.ts +92 -0
  455. package/dist/terminal/vt/fonts.d.ts.map +1 -0
  456. package/dist/terminal/vt/fonts.js +178 -0
  457. package/dist/terminal/vt/fonts.js.map +1 -0
  458. package/dist/terminal/vt/index.d.ts +78 -0
  459. package/dist/terminal/vt/index.d.ts.map +1 -0
  460. package/dist/terminal/vt/index.js +312 -0
  461. package/dist/terminal/vt/index.js.map +1 -0
  462. package/dist/terminal/vt/keys.d.ts +74 -0
  463. package/dist/terminal/vt/keys.d.ts.map +1 -0
  464. package/dist/terminal/vt/keys.js +309 -0
  465. package/dist/terminal/vt/keys.js.map +1 -0
  466. package/dist/terminal/vt/mouse.d.ts +44 -0
  467. package/dist/terminal/vt/mouse.d.ts.map +1 -0
  468. package/dist/terminal/vt/mouse.js +106 -0
  469. package/dist/terminal/vt/mouse.js.map +1 -0
  470. package/dist/terminal/vt/node.d.ts +246 -0
  471. package/dist/terminal/vt/node.d.ts.map +1 -0
  472. package/dist/terminal/vt/node.js +1068 -0
  473. package/dist/terminal/vt/node.js.map +1 -0
  474. package/dist/terminal/vt/pty.d.ts +81 -0
  475. package/dist/terminal/vt/pty.d.ts.map +1 -0
  476. package/dist/terminal/vt/pty.js +201 -0
  477. package/dist/terminal/vt/pty.js.map +1 -0
  478. package/dist/terminal/vt/renderer.d.ts +179 -0
  479. package/dist/terminal/vt/renderer.d.ts.map +1 -0
  480. package/dist/terminal/vt/renderer.js +357 -0
  481. package/dist/terminal/vt/renderer.js.map +1 -0
  482. package/dist/terminal/vt/timers.d.ts +6 -0
  483. package/dist/terminal/vt/timers.d.ts.map +1 -0
  484. package/dist/terminal/vt/timers.js +16 -0
  485. package/dist/terminal/vt/timers.js.map +1 -0
  486. package/dist/terminal/vt/xterm.d.ts +142 -0
  487. package/dist/terminal/vt/xterm.d.ts.map +1 -0
  488. package/dist/terminal/vt/xterm.js +32 -0
  489. package/dist/terminal/vt/xterm.js.map +1 -0
  490. package/dist/terminal-output/hx.d.ts +24 -0
  491. package/dist/terminal-output/hx.d.ts.map +1 -0
  492. package/dist/terminal-output/hx.js +25 -0
  493. package/dist/terminal-output/hx.js.map +1 -0
  494. package/dist/terminal-output/index.d.ts +92 -0
  495. package/dist/terminal-output/index.d.ts.map +1 -0
  496. package/dist/terminal-output/index.js +179 -0
  497. package/dist/terminal-output/index.js.map +1 -0
  498. package/dist/terminal-output/runs.d.ts +27 -0
  499. package/dist/terminal-output/runs.d.ts.map +1 -0
  500. package/dist/terminal-output/runs.js +66 -0
  501. package/dist/terminal-output/runs.js.map +1 -0
  502. package/dist/three/canvas.d.ts +46 -0
  503. package/dist/three/canvas.d.ts.map +1 -0
  504. package/dist/three/canvas.js +305 -0
  505. package/dist/three/canvas.js.map +1 -0
  506. package/dist/three/events.d.ts +64 -0
  507. package/dist/three/events.d.ts.map +1 -0
  508. package/dist/three/events.js +146 -0
  509. package/dist/three/events.js.map +1 -0
  510. package/dist/three/geometries.d.ts +89 -0
  511. package/dist/three/geometries.d.ts.map +1 -0
  512. package/dist/three/geometries.js +345 -0
  513. package/dist/three/geometries.js.map +1 -0
  514. package/dist/three/globals.d.ts +7 -0
  515. package/dist/three/globals.d.ts.map +1 -0
  516. package/dist/three/globals.js +20 -0
  517. package/dist/three/globals.js.map +1 -0
  518. package/dist/three/hx.d.ts +9 -0
  519. package/dist/three/hx.d.ts.map +1 -0
  520. package/dist/three/hx.js +10 -0
  521. package/dist/three/hx.js.map +1 -0
  522. package/dist/three/index.d.ts +22 -0
  523. package/dist/three/index.d.ts.map +1 -0
  524. package/dist/three/index.js +24 -0
  525. package/dist/three/index.js.map +1 -0
  526. package/dist/three/jsx-dev-runtime.d.ts +19 -0
  527. package/dist/three/jsx-dev-runtime.d.ts.map +1 -0
  528. package/dist/three/jsx-dev-runtime.js +2 -0
  529. package/dist/three/jsx-dev-runtime.js.map +1 -0
  530. package/dist/three/jsx-runtime.d.ts +19 -0
  531. package/dist/three/jsx-runtime.d.ts.map +1 -0
  532. package/dist/three/jsx-runtime.js +2 -0
  533. package/dist/three/jsx-runtime.js.map +1 -0
  534. package/dist/three/jsx.d.ts +198 -0
  535. package/dist/three/jsx.d.ts.map +1 -0
  536. package/dist/three/jsx.js +2 -0
  537. package/dist/three/jsx.js.map +1 -0
  538. package/dist/three/materials.d.ts +125 -0
  539. package/dist/three/materials.d.ts.map +1 -0
  540. package/dist/three/materials.js +229 -0
  541. package/dist/three/materials.js.map +1 -0
  542. package/dist/three/math.d.ts +146 -0
  543. package/dist/three/math.d.ts.map +1 -0
  544. package/dist/three/math.js +464 -0
  545. package/dist/three/math.js.map +1 -0
  546. package/dist/three/objects.d.ts +185 -0
  547. package/dist/three/objects.d.ts.map +1 -0
  548. package/dist/three/objects.js +309 -0
  549. package/dist/three/objects.js.map +1 -0
  550. package/dist/three/passes.d.ts +54 -0
  551. package/dist/three/passes.d.ts.map +1 -0
  552. package/dist/three/passes.js +78 -0
  553. package/dist/three/passes.js.map +1 -0
  554. package/dist/three/postprocess.d.ts +85 -0
  555. package/dist/three/postprocess.d.ts.map +1 -0
  556. package/dist/three/postprocess.js +503 -0
  557. package/dist/three/postprocess.js.map +1 -0
  558. package/dist/three/raycast.d.ts +24 -0
  559. package/dist/three/raycast.d.ts.map +1 -0
  560. package/dist/three/raycast.js +138 -0
  561. package/dist/three/raycast.js.map +1 -0
  562. package/dist/three/reconciler.d.ts +48 -0
  563. package/dist/three/reconciler.d.ts.map +1 -0
  564. package/dist/three/reconciler.js +416 -0
  565. package/dist/three/reconciler.js.map +1 -0
  566. package/dist/three/renderer-direct.d.ts +102 -0
  567. package/dist/three/renderer-direct.d.ts.map +1 -0
  568. package/dist/three/renderer-direct.js +782 -0
  569. package/dist/three/renderer-direct.js.map +1 -0
  570. package/dist/three/renderer-indirect.d.ts +68 -0
  571. package/dist/three/renderer-indirect.d.ts.map +1 -0
  572. package/dist/three/renderer-indirect.js +438 -0
  573. package/dist/three/renderer-indirect.js.map +1 -0
  574. package/dist/three/store.d.ts +81 -0
  575. package/dist/three/store.d.ts.map +1 -0
  576. package/dist/three/store.js +110 -0
  577. package/dist/three/store.js.map +1 -0
  578. package/dist/timeline/hx.d.ts +18 -0
  579. package/dist/timeline/hx.d.ts.map +1 -0
  580. package/dist/timeline/hx.js +10 -0
  581. package/dist/timeline/hx.js.map +1 -0
  582. package/dist/timeline/index.d.ts +152 -0
  583. package/dist/timeline/index.d.ts.map +1 -0
  584. package/dist/timeline/index.js +383 -0
  585. package/dist/timeline/index.js.map +1 -0
  586. package/dist/tray-host/hx.d.ts +24 -0
  587. package/dist/tray-host/hx.d.ts.map +1 -0
  588. package/dist/tray-host/hx.js +25 -0
  589. package/dist/tray-host/hx.js.map +1 -0
  590. package/dist/tray-host/index.d.ts +110 -0
  591. package/dist/tray-host/index.d.ts.map +1 -0
  592. package/dist/tray-host/index.js +191 -0
  593. package/dist/tray-host/index.js.map +1 -0
  594. package/dist/tray-host/manager.d.ts +137 -0
  595. package/dist/tray-host/manager.d.ts.map +1 -0
  596. package/dist/tray-host/manager.js +462 -0
  597. package/dist/tray-host/manager.js.map +1 -0
  598. package/dist/tray-host/notify.d.ts +22 -0
  599. package/dist/tray-host/notify.d.ts.map +1 -0
  600. package/dist/tray-host/notify.js +74 -0
  601. package/dist/tray-host/notify.js.map +1 -0
  602. package/dist/tray-host/protocol.d.ts +106 -0
  603. package/dist/tray-host/protocol.d.ts.map +1 -0
  604. package/dist/tray-host/protocol.js +191 -0
  605. package/dist/tray-host/protocol.js.map +1 -0
  606. package/dist/tree/hx.d.ts +24 -0
  607. package/dist/tree/hx.d.ts.map +1 -0
  608. package/dist/tree/hx.js +25 -0
  609. package/dist/tree/hx.js.map +1 -0
  610. package/dist/tree/index.d.ts +221 -0
  611. package/dist/tree/index.d.ts.map +1 -0
  612. package/dist/tree/index.js +716 -0
  613. package/dist/tree/index.js.map +1 -0
  614. package/dist/tree/internal.d.ts +18 -0
  615. package/dist/tree/internal.d.ts.map +1 -0
  616. package/dist/tree/internal.js +66 -0
  617. package/dist/tree/internal.js.map +1 -0
  618. package/dist/tree/rows.d.ts +177 -0
  619. package/dist/tree/rows.d.ts.map +1 -0
  620. package/dist/tree/rows.js +179 -0
  621. package/dist/tree/rows.js.map +1 -0
  622. package/package.json +166 -12
  623. package/src/ansi/cast.ts +159 -0
  624. package/src/ansi/index.ts +53 -0
  625. package/src/ansi/palette.ts +226 -0
  626. package/src/ansi/parse.ts +780 -0
  627. package/src/ansi/sgr.ts +380 -0
  628. package/src/ansi/utf8.ts +84 -0
  629. package/src/calendar/Calendar.ts +744 -0
  630. package/src/calendar/DatePicker.ts +368 -0
  631. package/src/calendar/dates.ts +307 -0
  632. package/src/calendar/index.ts +51 -0
  633. package/src/charts/components.ts +864 -0
  634. package/src/charts/data.ts +776 -0
  635. package/src/charts/hx.ts +39 -0
  636. package/src/charts/index.ts +99 -0
  637. package/src/charts/node.ts +932 -0
  638. package/src/charts/render.ts +982 -0
  639. package/src/charts/scale.ts +214 -0
  640. package/src/charts/spec.ts +122 -0
  641. package/src/charts/timers.ts +24 -0
  642. package/src/code/hx.ts +51 -0
  643. package/src/code/index.ts +174 -0
  644. package/src/code-editor/completion.ts +161 -0
  645. package/src/code-editor/doc.ts +198 -0
  646. package/src/code-editor/hx.ts +26 -0
  647. package/src/code-editor/index.ts +615 -0
  648. package/src/code-editor/node.ts +1926 -0
  649. package/src/code-language/hljs.ts +302 -0
  650. package/src/code-language/index.ts +51 -0
  651. package/src/code-language/languages/glsl.ts +120 -0
  652. package/src/code-language/languages/javascript.ts +419 -0
  653. package/src/code-language/languages/json.ts +72 -0
  654. package/src/code-language/languages/shell.ts +221 -0
  655. package/src/code-language/languages/sql.ts +165 -0
  656. package/src/code-language/lezer.ts +190 -0
  657. package/src/code-language/registry.ts +66 -0
  658. package/src/code-language/runs.ts +128 -0
  659. package/src/code-language/stream.ts +306 -0
  660. package/src/code-language/textmate.ts +134 -0
  661. package/src/code-language/theme.ts +124 -0
  662. package/src/code-language/timers.ts +36 -0
  663. package/src/code-language/types.ts +252 -0
  664. package/src/codeblock/index.ts +146 -0
  665. package/src/color-picker/ColorField.ts +333 -0
  666. package/src/color-picker/ColorPicker.ts +1069 -0
  667. package/src/color-picker/color.ts +399 -0
  668. package/src/color-picker/index.ts +50 -0
  669. package/src/desktop-calendar/eds.ts +484 -0
  670. package/src/desktop-calendar/ical.ts +119 -0
  671. package/src/desktop-calendar/index.ts +287 -0
  672. package/src/embed/client.ts +311 -0
  673. package/src/embed/host.ts +432 -0
  674. package/src/embed/index.ts +33 -0
  675. package/src/embed/timers.ts +32 -0
  676. package/src/flow/draw.ts +418 -0
  677. package/src/flow/index.ts +473 -0
  678. package/src/flow/model.ts +687 -0
  679. package/src/flow/node.ts +3694 -0
  680. package/src/flow/paths.ts +403 -0
  681. package/src/flow/types.ts +634 -0
  682. package/src/formula/hx.ts +51 -0
  683. package/src/formula/index.ts +243 -0
  684. package/src/formula/katex.ts +209 -0
  685. package/src/formula/layout.ts +876 -0
  686. package/src/formula/node.ts +467 -0
  687. package/src/html/controls.ts +244 -0
  688. package/src/html/css/cascade.ts +606 -0
  689. package/src/html/css/parse.ts +500 -0
  690. package/src/html/css/style.ts +1371 -0
  691. package/src/html/css/ua.ts +174 -0
  692. package/src/html/css/values.ts +358 -0
  693. package/src/html/dom.ts +410 -0
  694. package/src/html/hx.ts +55 -0
  695. package/src/html/index.ts +545 -0
  696. package/src/html/layout/block.ts +876 -0
  697. package/src/html/layout/boxes.ts +981 -0
  698. package/src/html/layout/flex.ts +297 -0
  699. package/src/html/layout/floats.ts +125 -0
  700. package/src/html/layout/inline.ts +870 -0
  701. package/src/html/layout/table.ts +380 -0
  702. package/src/html/node.ts +967 -0
  703. package/src/html/paint.ts +605 -0
  704. package/src/html/resources.ts +214 -0
  705. package/src/index.ts +638 -0
  706. package/src/internal/heights.ts +211 -0
  707. package/src/internal/hx.ts +53 -0
  708. package/src/internal/text.ts +44 -0
  709. package/src/internal/timers.ts +44 -0
  710. package/src/internal/widget.ts +92 -0
  711. package/src/markdown/ast.ts +163 -0
  712. package/src/markdown/hx.ts +51 -0
  713. package/src/markdown/index.ts +686 -0
  714. package/src/markdown/parse.ts +1037 -0
  715. package/src/markdown/spans.ts +143 -0
  716. package/src/media-player/backends.ts +155 -0
  717. package/src/media-player/control.ts +70 -0
  718. package/src/media-player/hx.ts +51 -0
  719. package/src/media-player/index.ts +378 -0
  720. package/src/media-player/mpv.ts +146 -0
  721. package/src/media-player/vlc.ts +97 -0
  722. package/src/richtext/index.ts +42 -0
  723. package/src/richtext/links.ts +78 -0
  724. package/src/richtext/menu.ts +49 -0
  725. package/src/richtext/node.ts +406 -0
  726. package/src/richtext/runs.ts +253 -0
  727. package/src/table/hx.ts +51 -0
  728. package/src/table/index.ts +1219 -0
  729. package/src/table/rows.ts +275 -0
  730. package/src/terminal/backends.ts +242 -0
  731. package/src/terminal/hx.ts +51 -0
  732. package/src/terminal/index.ts +574 -0
  733. package/src/terminal/title.ts +172 -0
  734. package/src/terminal/vt/colors.ts +247 -0
  735. package/src/terminal/vt/diff.ts +467 -0
  736. package/src/terminal/vt/fonts.ts +233 -0
  737. package/src/terminal/vt/index.ts +443 -0
  738. package/src/terminal/vt/keys.ts +369 -0
  739. package/src/terminal/vt/mouse.ts +144 -0
  740. package/src/terminal/vt/node.ts +1242 -0
  741. package/src/terminal/vt/pty.ts +334 -0
  742. package/src/terminal/vt/renderer.ts +555 -0
  743. package/src/terminal/vt/timers.ts +31 -0
  744. package/src/terminal/vt/xterm.ts +193 -0
  745. package/src/terminal-output/hx.ts +51 -0
  746. package/src/terminal-output/index.ts +340 -0
  747. package/src/terminal-output/runs.ts +79 -0
  748. package/src/three/canvas.ts +451 -0
  749. package/src/three/events.ts +197 -0
  750. package/src/three/geometries.ts +429 -0
  751. package/src/three/globals.ts +34 -0
  752. package/src/three/hx.ts +22 -0
  753. package/src/three/index.ts +98 -0
  754. package/src/three/jsx-dev-runtime.ts +27 -0
  755. package/src/three/jsx-runtime.ts +38 -0
  756. package/src/three/jsx.ts +275 -0
  757. package/src/three/materials.ts +270 -0
  758. package/src/three/math.ts +585 -0
  759. package/src/three/objects.ts +397 -0
  760. package/src/three/passes.ts +90 -0
  761. package/src/three/postprocess.ts +677 -0
  762. package/src/three/raycast.ts +189 -0
  763. package/src/three/react-reconciler.d.ts +50 -0
  764. package/src/three/reconciler.ts +624 -0
  765. package/src/three/renderer-direct.ts +1055 -0
  766. package/src/three/renderer-indirect.ts +570 -0
  767. package/src/three/store.ts +207 -0
  768. package/src/timeline/hx.ts +31 -0
  769. package/src/timeline/index.ts +603 -0
  770. package/src/tray-host/hx.ts +51 -0
  771. package/src/tray-host/index.ts +331 -0
  772. package/src/tray-host/manager.ts +639 -0
  773. package/src/tray-host/notify.ts +102 -0
  774. package/src/tray-host/protocol.ts +235 -0
  775. package/src/tree/hx.ts +51 -0
  776. package/src/tree/index.ts +1087 -0
  777. package/src/tree/internal.ts +87 -0
  778. package/src/tree/rows.ts +334 -0
  779. package/src/index.d.ts +0 -2
  780. package/src/index.js +0 -9
  781. package/src/sparkline/index.d.ts +0 -29
  782. package/src/sparkline/index.js +0 -50
  783. package/src/sparkline/node.js +0 -72
@@ -0,0 +1,467 @@
1
+ // What changed on screen, derived by diffing the emulator's buffer against a
2
+ // mirror of what the surface currently shows.
3
+ //
4
+ // The renderer deliberately never asks "what did that escape sequence touch?".
5
+ // Escape-level damage is fragile — one CSI can move the whole screen, and a
6
+ // palette change or a selection drag touches cells no sequence named — while
7
+ // a signature compare over the viewport is a few thousand integer compares
8
+ // (microseconds for a normal grid) and catches *everything*. It also makes
9
+ // "eventually correct" structural rather than a discipline: skip as many
10
+ // frames as you like, the next diff repairs the screen, because the mirror
11
+ // describes pixels rather than intentions.
12
+ //
13
+ // Pure: structural emulator types in, plain arrays out. No X, no node, no
14
+ // `@xterm/headless` import — so the whole model is asserted against synthetic
15
+ // grids in `test/terminal-vt.test.ts`.
16
+ import { resolveCell } from './colors.js';
17
+ import type { CellState, Palette, ResolvedCell } from './colors.js';
18
+ import type { XtermCell, XtermTerminal } from './xterm.js';
19
+
20
+ /** A run of cells to redraw, in grid coordinates. */
21
+ export interface DirtySpan {
22
+ row: number;
23
+ col: number;
24
+ count: number;
25
+ }
26
+
27
+ /** The band the scroll fast path moves, in rows. */
28
+ export interface RowCopy {
29
+ srcRow: number;
30
+ dstRow: number;
31
+ count: number;
32
+ }
33
+
34
+ export interface DiffResult {
35
+ /** Issued before anything is drawn, or null when nothing survived. */
36
+ copy: RowCopy | null;
37
+ spans: DirtySpan[];
38
+ /** Geometry or buffer changed under us: everything was marked dirty. */
39
+ full: boolean;
40
+ }
41
+
42
+ /**
43
+ * One frame's worth of resolved cells.
44
+ *
45
+ * Parallel typed arrays rather than objects: a 240×67 grid is 16k cells, and
46
+ * the whole point of the diff is that touching all of them costs less than a
47
+ * millisecond. `chars` is the one string array, and it is read only for cells
48
+ * the diff already decided are dirty.
49
+ */
50
+ export interface GridSnapshot {
51
+ cols: number;
52
+ rows: number;
53
+ chars: string[];
54
+ /** 1 normally, 2 for a wide glyph, 0 for the cell it covers. */
55
+ width: Uint8Array;
56
+ fg: Int32Array;
57
+ bg: Int32Array;
58
+ /** `DECO_*` and `VARIANT_*` from `./colors.ts`. */
59
+ flags: Uint16Array;
60
+ sig: Uint32Array;
61
+ rowSig: Uint32Array;
62
+ /** Buffer-absolute index of the row at the top of the viewport. */
63
+ absTop: number;
64
+ alt: boolean;
65
+ }
66
+
67
+ export function createSnapshot(cols: number, rows: number): GridSnapshot {
68
+ const n = Math.max(1, cols * rows);
69
+ return {
70
+ cols,
71
+ rows,
72
+ chars: new Array<string>(n).fill(' '),
73
+ width: new Uint8Array(n).fill(1),
74
+ fg: new Int32Array(n),
75
+ bg: new Int32Array(n),
76
+ flags: new Uint16Array(n),
77
+ sig: new Uint32Array(n),
78
+ rowSig: new Uint32Array(Math.max(1, rows)),
79
+ absTop: 0,
80
+ alt: false,
81
+ };
82
+ }
83
+
84
+ /** A selection, in buffer-absolute lines so scrollback keeps it. */
85
+ export interface SelectionRange {
86
+ startLine: number;
87
+ startCol: number;
88
+ endLine: number;
89
+ endCol: number;
90
+ }
91
+
92
+ /** Where the cursor is and what it looks like this frame. */
93
+ export interface CursorState {
94
+ col: number;
95
+ /** Viewport row, or -1 when the cursor is scrolled out of view. */
96
+ row: number;
97
+ shape: 'block' | 'underline' | 'bar' | 'hollow' | 'none';
98
+ }
99
+
100
+ export interface ReadOptions {
101
+ palette: Palette;
102
+ selection: SelectionRange | null;
103
+ cursor: CursorState;
104
+ brightBold: boolean;
105
+ }
106
+
107
+ /** Whether an absolute line/column is inside the selection. */
108
+ export function inSelection(
109
+ selection: SelectionRange | null,
110
+ line: number,
111
+ col: number,
112
+ ): boolean {
113
+ if (!selection) return false;
114
+ const { startLine, startCol, endLine, endCol } = selection;
115
+ if (line < startLine || line > endLine) return false;
116
+ if (line === startLine && col < startCol) return false;
117
+ if (line === endLine && col >= endCol) return false;
118
+ return true;
119
+ }
120
+
121
+ /** Selection endpoints, ordered — a drag runs in either direction. */
122
+ export function orderSelection(
123
+ anchorLine: number,
124
+ anchorCol: number,
125
+ headLine: number,
126
+ headCol: number,
127
+ ): SelectionRange {
128
+ const backwards =
129
+ headLine < anchorLine || (headLine === anchorLine && headCol < anchorCol);
130
+ return backwards
131
+ ? {
132
+ startLine: headLine,
133
+ startCol: headCol,
134
+ endLine: anchorLine,
135
+ endCol: anchorCol,
136
+ }
137
+ : {
138
+ startLine: anchorLine,
139
+ startCol: anchorCol,
140
+ endLine: headLine,
141
+ endCol: headCol,
142
+ };
143
+ }
144
+
145
+ /** FNV-1a, 32 bits. Fast, well-mixed, and the arithmetic stays in int32. */
146
+ function mixIn(hash: number, value: number): number {
147
+ let h = (hash ^ (value & 0xffff)) >>> 0;
148
+ h = Math.imul(h, 0x01000193) >>> 0;
149
+ h = (h ^ ((value >>> 16) & 0xffff)) >>> 0;
150
+ return Math.imul(h, 0x01000193) >>> 0;
151
+ }
152
+
153
+ const FNV_OFFSET = 0x811c9dc5;
154
+
155
+ /** Distinct numbers rather than the shape names: two of them start with the
156
+ * same letter, and a signature that cannot tell a bar from a block is a
157
+ * cursor that does not repaint when the style prop changes. */
158
+ const CURSOR_SHAPE_ID: Record<CursorState['shape'], number> = {
159
+ none: 0,
160
+ block: 1,
161
+ underline: 2,
162
+ bar: 3,
163
+ hollow: 4,
164
+ };
165
+
166
+ const scratch: ResolvedCell = { fg: 0, bg: 0, flags: 0 };
167
+ const cellState: CellState = {
168
+ selected: false,
169
+ cursor: 'none',
170
+ brightBold: true,
171
+ };
172
+
173
+ /**
174
+ * Read the viewport into `out`, resolving every cell to its two paint colours
175
+ * and its signature.
176
+ *
177
+ * The signature is where selection, cursor position, cursor phase and the
178
+ * palette generation enter the model: they are inputs to the hash, so a
179
+ * selection drag or a theme flip repaints exactly the cells whose *pixels*
180
+ * differ, through the same one mechanism as a program writing text. There is
181
+ * no second damage path anywhere in this component.
182
+ */
183
+ export function readViewport(
184
+ term: XtermTerminal,
185
+ out: GridSnapshot,
186
+ options: ReadOptions,
187
+ work?: XtermCell,
188
+ ): GridSnapshot {
189
+ const buffer = term.buffer.active;
190
+ const { cols, rows } = out;
191
+ const cell = work ?? buffer.getNullCell();
192
+ const { palette, selection, cursor } = options;
193
+ cellState.brightBold = options.brightBold;
194
+
195
+ out.absTop = buffer.viewportY;
196
+ out.alt = buffer.type === 'alternate';
197
+
198
+ for (let row = 0; row < rows; row++) {
199
+ const line = buffer.getLine(buffer.viewportY + row);
200
+ const absLine = buffer.viewportY + row;
201
+ // The row hash mixes only its cells. Nothing extra — an input that is
202
+ // *not* visible in a cell (a palette counter, a frame number) would make
203
+ // every row differ every frame, and the scroll detector below reads these
204
+ // signatures to find the band that survived a shift.
205
+ let rowHash = FNV_OFFSET;
206
+ const base = row * cols;
207
+ for (let col = 0; col < cols; col++) {
208
+ const index = base + col;
209
+ const got = line?.getCell(col, cell);
210
+ let chars = ' ';
211
+ let width = 1;
212
+ if (got) {
213
+ chars = got.getChars() || ' ';
214
+ width = got.getWidth();
215
+ }
216
+ cellState.selected = inSelection(selection, absLine, col);
217
+ cellState.cursor =
218
+ cursor.row === row && cursor.col === col ? cursor.shape : 'none';
219
+ if (got) {
220
+ resolveCell(got, palette, cellState, scratch);
221
+ } else {
222
+ // Past the end of a short line, or a line the buffer has trimmed:
223
+ // blank in the default colours, which is what the screen shows.
224
+ scratch.fg = palette.foreground;
225
+ scratch.bg = palette.background;
226
+ scratch.flags = 0;
227
+ if (cellState.selected) {
228
+ scratch.bg = palette.selectionBackground;
229
+ scratch.fg = palette.selectionForeground;
230
+ }
231
+ if (cellState.cursor === 'block') {
232
+ scratch.bg = palette.cursor;
233
+ scratch.fg = palette.cursorText;
234
+ }
235
+ }
236
+
237
+ out.chars[index] = chars;
238
+ out.width[index] = width;
239
+ out.fg[index] = scratch.fg;
240
+ out.bg[index] = scratch.bg;
241
+ out.flags[index] = scratch.flags;
242
+
243
+ let hash = mixIn(FNV_OFFSET, scratch.fg);
244
+ hash = mixIn(hash, scratch.bg);
245
+ hash = mixIn(hash, scratch.flags | (width << 8));
246
+ for (let i = 0; i < chars.length; i++) {
247
+ hash = mixIn(hash, chars.charCodeAt(i));
248
+ }
249
+ // The cursor shape is not a colour, so it has to enter the signature on
250
+ // its own — a bar becoming an underline changes pixels and nothing else.
251
+ if (cellState.cursor !== 'none') {
252
+ hash = mixIn(hash, CURSOR_SHAPE_ID[cellState.cursor] << 24);
253
+ }
254
+ out.sig[index] = hash;
255
+ rowHash = mixIn(rowHash, hash);
256
+ }
257
+ out.rowSig[row] = rowHash;
258
+ }
259
+ return out;
260
+ }
261
+
262
+ /**
263
+ * What the surface currently shows, as signatures.
264
+ *
265
+ * Only hashes: the mirror never holds text or colours, because the only
266
+ * question it answers is "does this cell still look like what I drew".
267
+ */
268
+ export class Mirror {
269
+ cols = 0;
270
+ rows = 0;
271
+ absTop = 0;
272
+ alt = false;
273
+ /** No frame has been drawn yet, so nothing on the surface is trustworthy. */
274
+ private _valid = false;
275
+ private _sig = new Uint32Array(0);
276
+ private _rowSig = new Uint32Array(0);
277
+ private _force = new Uint8Array(0);
278
+
279
+ /** Forget everything: a resize, a font change, a renderer swap. */
280
+ invalidate(): void {
281
+ this._valid = false;
282
+ }
283
+
284
+ resize(cols: number, rows: number): void {
285
+ if (cols === this.cols && rows === this.rows) return;
286
+ this.cols = cols;
287
+ this.rows = rows;
288
+ this._sig = new Uint32Array(Math.max(1, cols * rows));
289
+ this._rowSig = new Uint32Array(Math.max(1, rows));
290
+ this._force = new Uint8Array(Math.max(1, rows));
291
+ this._valid = false;
292
+ }
293
+
294
+ /**
295
+ * Diff a snapshot against the mirror and adopt it.
296
+ *
297
+ * The mirror is updated to describe what the caller is *about* to draw, so
298
+ * a caller that does not draw the result has to `invalidate()`.
299
+ */
300
+ diff(snapshot: GridSnapshot): DiffResult {
301
+ const { cols, rows } = snapshot;
302
+ if (cols !== this.cols || rows !== this.rows) this.resize(cols, rows);
303
+
304
+ const spans: DirtySpan[] = [];
305
+ const full =
306
+ !this._valid || snapshot.alt !== this.alt || cols === 0 || rows === 0;
307
+
308
+ let copy: RowCopy | null = null;
309
+ this._force.fill(full ? 1 : 0);
310
+
311
+ if (!full) {
312
+ const shift = detectShift(this, snapshot);
313
+ if (shift !== 0) {
314
+ copy = shiftMirror(this, shift, cols, rows);
315
+ }
316
+ }
317
+
318
+ for (let row = 0; row < rows; row++) {
319
+ const base = row * cols;
320
+ if (!this._force[row] && this._rowSig[row] === snapshot.rowSig[row]) {
321
+ continue;
322
+ }
323
+ this._rowSig[row] = snapshot.rowSig[row];
324
+ if (this._force[row]) {
325
+ // Nothing is known about this row's pixels — a fresh mirror, or the
326
+ // strip a scroll exposed. One span, no per-cell comparison.
327
+ for (let col = 0; col < cols; col++) {
328
+ this._sig[base + col] = snapshot.sig[base + col];
329
+ }
330
+ if (cols > 0) spans.push({ row, col: 0, count: cols });
331
+ continue;
332
+ }
333
+ // Collect runs of changed cells, bridging gaps of up to two unchanged
334
+ // cells: three draw calls for `a_b_c` cost more than one for `a_b_c`.
335
+ let start = -1;
336
+ let clean = 0;
337
+ for (let col = 0; col < cols; col++) {
338
+ const index = base + col;
339
+ const changed = this._sig[index] !== snapshot.sig[index];
340
+ if (changed) {
341
+ this._sig[index] = snapshot.sig[index];
342
+ if (start < 0) start = col;
343
+ clean = 0;
344
+ } else if (start >= 0) {
345
+ clean++;
346
+ if (clean > 2) {
347
+ spans.push({ row, col: start, count: col - clean - start + 1 });
348
+ start = -1;
349
+ clean = 0;
350
+ }
351
+ }
352
+ }
353
+ if (start >= 0)
354
+ spans.push({ row, col: start, count: cols - clean - start });
355
+ }
356
+
357
+ this.absTop = snapshot.absTop;
358
+ this.alt = snapshot.alt;
359
+ this._valid = true;
360
+ return { copy, spans, full };
361
+ }
362
+
363
+ /** For the shift search and the row shuffle — not part of the contract. */
364
+ rowSignature(row: number): number {
365
+ return this._rowSig[row];
366
+ }
367
+
368
+ /** @internal */
369
+ _internals(): {
370
+ sig: Uint32Array;
371
+ rowSig: Uint32Array;
372
+ force: Uint8Array;
373
+ } {
374
+ return { sig: this._sig, rowSig: this._rowSig, force: this._force };
375
+ }
376
+ }
377
+
378
+ /**
379
+ * How far the screen moved, in rows. Positive means content moved *up* — the
380
+ * shell scrolled, or the user paged down.
381
+ *
382
+ * The buffer's own `viewportY` is the first guess and is exact while the
383
+ * scrollback is still filling. Once it saturates, lines are trimmed off the
384
+ * top and `viewportY` stops moving although the screen very much does — so
385
+ * the fallback is a search over the mirror's row signatures.
386
+ *
387
+ * A wrong guess cannot corrupt anything. The mirror is shifted by exactly the
388
+ * amount the pixels were, so any row that does not then match its snapshot
389
+ * signature is repainted; a bad guess costs one CopyArea and some redraw, and
390
+ * that is the whole exposure.
391
+ */
392
+ function detectShift(mirror: Mirror, snapshot: GridSnapshot): number {
393
+ const { rows, cols } = snapshot;
394
+ if (rows < 2 || cols === 0) return 0;
395
+
396
+ let differing = 0;
397
+ for (let row = 0; row < rows; row++) {
398
+ if (mirror.rowSignature(row) !== snapshot.rowSig[row]) differing++;
399
+ if (differing > 2) break;
400
+ }
401
+ // Typing, a spinner, a cursor blink: nothing moved, and the search is the
402
+ // most expensive thing that would happen this frame if we let it run.
403
+ if (differing <= 2) return 0;
404
+
405
+ const hint = snapshot.absTop - mirror.absTop;
406
+ if (
407
+ hint !== 0 &&
408
+ Math.abs(hint) < rows &&
409
+ verifyShift(mirror, snapshot, hint)
410
+ ) {
411
+ return hint;
412
+ }
413
+ for (let shift = 1; shift < rows; shift++) {
414
+ if (mirror.rowSignature(shift) === snapshot.rowSig[0]) {
415
+ if (verifyShift(mirror, snapshot, shift)) return shift;
416
+ }
417
+ if (mirror.rowSignature(0) === snapshot.rowSig[shift]) {
418
+ if (verifyShift(mirror, snapshot, -shift)) return -shift;
419
+ }
420
+ }
421
+ return 0;
422
+ }
423
+
424
+ /** Does most of the band that would survive this shift actually match? */
425
+ function verifyShift(
426
+ mirror: Mirror,
427
+ snapshot: GridSnapshot,
428
+ shift: number,
429
+ ): boolean {
430
+ const { rows } = snapshot;
431
+ const survivors = rows - Math.abs(shift);
432
+ if (survivors < 2) return false;
433
+ let matched = 0;
434
+ for (let i = 0; i < survivors; i++) {
435
+ const from = shift > 0 ? i + shift : i;
436
+ const to = shift > 0 ? i : i - shift;
437
+ if (mirror.rowSignature(from) === snapshot.rowSig[to]) matched++;
438
+ }
439
+ // Three quarters: a partial scroll region (vim inserting a line inside a
440
+ // window) still moves most of the band, and the rows it does not move are
441
+ // repainted by the ordinary diff below.
442
+ return matched >= Math.max(2, Math.ceil(survivors * 0.75));
443
+ }
444
+
445
+ /** Move the mirror's rows the way the pixels are about to move. */
446
+ function shiftMirror(
447
+ mirror: Mirror,
448
+ shift: number,
449
+ cols: number,
450
+ rows: number,
451
+ ): RowCopy {
452
+ const { sig, rowSig, force } = mirror._internals();
453
+ const count = rows - Math.abs(shift);
454
+ if (shift > 0) {
455
+ sig.copyWithin(0, shift * cols, rows * cols);
456
+ rowSig.copyWithin(0, shift, rows);
457
+ for (let row = count; row < rows; row++) force[row] = 1;
458
+ } else {
459
+ const up = -shift;
460
+ sig.copyWithin(up * cols, 0, count * cols);
461
+ rowSig.copyWithin(up, 0, count);
462
+ for (let row = 0; row < up; row++) force[row] = 1;
463
+ }
464
+ return shift > 0
465
+ ? { srcRow: shift, dstRow: 0, count }
466
+ : { srcRow: 0, dstRow: -shift, count };
467
+ }
@@ -0,0 +1,233 @@
1
+ // Cell metrics and glyphs.
2
+ //
3
+ // A terminal bypasses text shaping by construction: the grid decides where
4
+ // every glyph goes, so there are no ligatures, no kerning and no cluster
5
+ // positioning to compute — which is exactly what makes the fast path fast.
6
+ // ntk's public seam for that is `Font.glyphIdFor(cp)` plus the documented
7
+ // `drawGlyphs` run contract (ntk#254): a cmap lookup and a hand-built run,
8
+ // no shaping anywhere.
9
+ //
10
+ // The one case that does need shaping is a cluster — a base letter with
11
+ // combining marks, a text-presentation emoji with a variation selector — and
12
+ // `Font.shape()` handles those one cluster at a time, cached, on a path a
13
+ // normal screen never touches.
14
+
15
+ /** ntk's `Font`, as this module uses it. */
16
+ export interface NtkFont {
17
+ metrics(size: number): {
18
+ ascent: number;
19
+ descent: number;
20
+ lineGap: number;
21
+ lineHeight: number;
22
+ };
23
+ advanceOf(glyphId: number, size: number): number;
24
+ hasGlyph(codepoint: number): boolean;
25
+ /** ntk#254 — the lookup twin of `hasGlyph`, `null` when uncovered. */
26
+ glyphIdFor(codepoint: number): number | null;
27
+ shape(
28
+ text: string,
29
+ size: number,
30
+ opts?: Record<string, unknown>,
31
+ ): { glyphs: { id: number; ax: number; dx: number; dy: number }[] };
32
+ }
33
+
34
+ /** ntk's font manager, off `app.fonts`. */
35
+ export interface NtkFonts {
36
+ match(
37
+ family: string,
38
+ opts?: { weight?: number | string; style?: string },
39
+ ): NtkFont;
40
+ fallbackFor(
41
+ codepoint: number,
42
+ family?: string,
43
+ opts?: { weight?: number | string; style?: string },
44
+ ): NtkFont | null;
45
+ }
46
+
47
+ /** One glyph run, in the shape `ctx.drawGlyphs` documents. */
48
+ export interface GlyphRun {
49
+ font: NtkFont;
50
+ size: number;
51
+ glyphs: { id: number; ax: number; dx: number; dy: number }[];
52
+ }
53
+
54
+ export const VARIANTS = ['regular', 'bold', 'italic', 'boldItalic'] as const;
55
+ export type Variant = (typeof VARIANTS)[number];
56
+
57
+ export interface CellMetrics {
58
+ /** Integers, because the grid, the copy band and the fill rects are. */
59
+ cellWidth: number;
60
+ cellHeight: number;
61
+ /** Baseline offset from the top of the cell. */
62
+ baseline: number;
63
+ /** Where a single underline sits, from the top of the cell. */
64
+ underline: number;
65
+ /** Thickness of underline/strike/overline rules. */
66
+ ruleHeight: number;
67
+ }
68
+
69
+ /**
70
+ * The four faces, the cell box, and the glyph cache — everything that depends
71
+ * on the font and nothing that depends on the frame.
72
+ *
73
+ * Rebuilt when the family or the size changes; the node drops its mirror at
74
+ * the same time, because every cell's pixels moved.
75
+ */
76
+ export class FontSet {
77
+ readonly family: string;
78
+ readonly size: number;
79
+ readonly metrics: CellMetrics;
80
+ private _fonts: NtkFonts;
81
+ private _faces = new Map<Variant, NtkFont | null>();
82
+ /** `variant \0 chars` → the run to stamp, or null for "nothing to draw". */
83
+ private _glyphs = new Map<string, GlyphRun | null>();
84
+
85
+ constructor(fonts: NtkFonts, family: string, size: number) {
86
+ this._fonts = fonts;
87
+ this.family = family;
88
+ this.size = size;
89
+
90
+ const regular = this.face('regular');
91
+ const m = regular?.metrics(size);
92
+ const ascent = m ? m.ascent : size * 0.8;
93
+ const descent = m ? m.descent : size * 0.2;
94
+ const lineHeight = m ? m.lineHeight : size * 1.2;
95
+ // The advance of a digit is the cell width: in a monospace face every
96
+ // glyph agrees, and in a face that is not monospace the digit is still
97
+ // the least surprising answer.
98
+ let advance = size * 0.6;
99
+ if (regular) {
100
+ const gid = regular.glyphIdFor(0x30);
101
+ if (gid !== null) advance = regular.advanceOf(gid, size) || advance;
102
+ }
103
+ const cellWidth = Math.max(1, Math.round(advance));
104
+ const cellHeight = Math.max(1, Math.ceil(lineHeight));
105
+ const baseline = Math.min(
106
+ cellHeight - 1,
107
+ Math.round(ascent + (cellHeight - ascent - descent) / 2),
108
+ );
109
+ this.metrics = {
110
+ cellWidth,
111
+ cellHeight,
112
+ baseline,
113
+ underline: Math.min(
114
+ cellHeight - 1,
115
+ baseline + Math.max(1, Math.round(size / 10)),
116
+ ),
117
+ ruleHeight: Math.max(1, Math.round(size / 14)),
118
+ };
119
+ }
120
+
121
+ /**
122
+ * One of the four faces. A family with no bold or no italic resolves to the
123
+ * regular one — ntk does not synthesise either, and a fake oblique is worse
124
+ * than an honest upright (overstrike emulation is a later, separate call).
125
+ */
126
+ face(variant: Variant): NtkFont | null {
127
+ const cached = this._faces.get(variant);
128
+ if (cached !== undefined) return cached;
129
+ let font: NtkFont | null = null;
130
+ try {
131
+ font = this._fonts.match(this.family, {
132
+ weight: variant === 'bold' || variant === 'boldItalic' ? 700 : 400,
133
+ style:
134
+ variant === 'italic' || variant === 'boldItalic'
135
+ ? 'italic'
136
+ : 'normal',
137
+ });
138
+ } catch {
139
+ // no fontconfig, no fonts on the box: the caller draws backgrounds and
140
+ // no glyphs rather than failing to paint at all
141
+ font = null;
142
+ }
143
+ this._faces.set(variant, font);
144
+ return font;
145
+ }
146
+
147
+ /**
148
+ * The run for one cell's characters, or null when there is nothing to draw.
149
+ *
150
+ * Cached per (variant, chars) — a screen of text is a few hundred distinct
151
+ * entries, and the cache is what keeps a full-screen redraw a matter of
152
+ * lookups rather than cmap searches.
153
+ */
154
+ run(chars: string, variant: Variant): GlyphRun | null {
155
+ if (!chars || chars === ' ') return null;
156
+ const key = `${variant}\u0000${chars}`;
157
+ const hit = this._glyphs.get(key);
158
+ if (hit !== undefined) return hit;
159
+ const run = this._build(chars, variant);
160
+ this._glyphs.set(key, run);
161
+ return run;
162
+ }
163
+
164
+ private _build(chars: string, variant: Variant): GlyphRun | null {
165
+ const font = this.face(variant);
166
+ if (!font) return null;
167
+ const first = chars.codePointAt(0);
168
+ if (first === undefined) return null;
169
+ const single = String.fromCodePoint(first).length === chars.length;
170
+
171
+ if (single) {
172
+ let face = font;
173
+ let gid = safeGlyphId(face, first);
174
+ if (gid === null) {
175
+ // Nothing in the terminal's own face covers it — a box-drawing
176
+ // character in a font that has none, a CJK glyph, an emoji. The
177
+ // fallback face is a different glyphset, so it becomes its own run;
178
+ // it still goes out in the same request as everything else.
179
+ const fallback = this._fallback(first, variant);
180
+ if (!fallback) return null;
181
+ face = fallback;
182
+ gid = safeGlyphId(face, first);
183
+ if (gid === null) return null;
184
+ }
185
+ return {
186
+ font: face,
187
+ size: this.size,
188
+ glyphs: [{ id: gid, ax: this.metrics.cellWidth, dx: 0, dy: 0 }],
189
+ };
190
+ }
191
+
192
+ // A cluster: shape it once and keep the result. Rare enough that the
193
+ // shaping cost never reaches a frame budget, and correct where a
194
+ // codepoint-at-a-time walk would stack the marks on top of each other.
195
+ try {
196
+ const shaped = font.shape(chars, this.size);
197
+ if (!shaped.glyphs.length) return null;
198
+ return { font, size: this.size, glyphs: shaped.glyphs };
199
+ } catch {
200
+ return null;
201
+ }
202
+ }
203
+
204
+ private _fallback(codepoint: number, variant: Variant): NtkFont | null {
205
+ try {
206
+ return this._fonts.fallbackFor(codepoint, this.family, {
207
+ weight: variant === 'bold' || variant === 'boldItalic' ? 700 : 400,
208
+ style:
209
+ variant === 'italic' || variant === 'boldItalic'
210
+ ? 'italic'
211
+ : 'normal',
212
+ });
213
+ } catch {
214
+ return null;
215
+ }
216
+ }
217
+ }
218
+
219
+ function safeGlyphId(font: NtkFont, codepoint: number): number | null {
220
+ try {
221
+ return font.glyphIdFor(codepoint);
222
+ } catch {
223
+ return null;
224
+ }
225
+ }
226
+
227
+ /** `VARIANT_*` bits from `./colors.ts` to one of the four faces. */
228
+ export function variantOf(bold: boolean, italic: boolean): Variant {
229
+ if (bold && italic) return 'boldItalic';
230
+ if (bold) return 'bold';
231
+ if (italic) return 'italic';
232
+ return 'regular';
233
+ }