@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,639 @@
1
+ // The manager selection, and everything that arrives because of it.
2
+ //
3
+ // A tray host is three things on the wire: it owns `_NET_SYSTEM_TRAY_S<n>`,
4
+ // it publishes two properties saying how it wants to be drawn into, and it
5
+ // answers `_NET_SYSTEM_TRAY_OPCODE` messages addressed to the window that
6
+ // owns that selection. None of it is React-shaped, so none of it is in the
7
+ // component — `./index.ts` owns the icon list as state and this owns the
8
+ // protocol that changes it.
9
+ //
10
+ // ### Why this listens on `X.on('event')` rather than `onClientMessage`
11
+ //
12
+ // Core has an element-scoped ClientMessage seam now, and it is the right
13
+ // thing for an application — but it is a **`<window>`** prop, and the window
14
+ // the tray opcodes are addressed to is not an element. It cannot be: the
15
+ // selection has to be held on something that outlives the render, so this
16
+ // creates its own window with `X.CreateWindow` rather than rendering one. A
17
+ // `<TrayHost>` that unmounted while its panel stayed up would otherwise take
18
+ // the selection with it and leave the desktop with no tray.
19
+ //
20
+ // That is exactly the case core's own `src/clientmessage.js` carves out:
21
+ // filtering `X.on('event')` "is the right shape *there*, because a settings
22
+ // daemon's window is nobody's element". A tray's manager window is the same
23
+ // kind of window.
24
+ //
25
+ // The timestamp is the other half, and that one core does answer:
26
+ // `serverTime()` is a current server timestamp for an operation no user
27
+ // action caused, and its own documentation names a tray taking its manager
28
+ // selection as the case. ICCCM 2.1 forbids `CurrentTime` here.
29
+ import { serverTime } from 'react-x11';
30
+ import type { NtkApp } from 'react-x11';
31
+
32
+ import {
33
+ BalloonAssembler,
34
+ MANAGER_ATOM,
35
+ MESSAGE_DATA_ATOM,
36
+ OPCODE_ATOM,
37
+ ORIENTATION_ATOM,
38
+ SYSTEM_TRAY_BEGIN_MESSAGE,
39
+ SYSTEM_TRAY_CANCEL_MESSAGE,
40
+ SYSTEM_TRAY_REQUEST_DOCK,
41
+ VISUAL_ATOM,
42
+ argbVisualOf,
43
+ orientationValue,
44
+ selectionNameFor,
45
+ } from './protocol.js';
46
+ import type { TrayIcon, TrayMessage, TrayOrientation } from './protocol.js';
47
+
48
+ // Core event codes and masks, written out for the same reason
49
+ // `src/xsettings.js` writes them out: they are protocol constants, and
50
+ // naming them here is cheaper than reaching into node-x11 for a number that
51
+ // has not changed since 1987.
52
+ const SELECTION_CLEAR = 29;
53
+ const CLIENT_MESSAGE = 33;
54
+ const STRUCTURE_NOTIFY_MASK = 131072; // x11.eventMask.StructureNotify
55
+ const INPUT_ONLY = 2;
56
+ /** Predefined atoms — no InternAtom round trip for these. */
57
+ const XA_CARDINAL = 6;
58
+ const XA_VISUALID = 32;
59
+
60
+ /**
61
+ * Where a tray host is in its life.
62
+ *
63
+ * `'conflict'` and `'unavailable'` are both ordinary states of a healthy
64
+ * machine rather than failures — a second panel on one display is a
65
+ * configuration mistake, and a connection with no raw protocol access (a
66
+ * headless mock) simply has no tray to be. Same call `<Terminal>` makes
67
+ * about a machine with no emulator installed.
68
+ */
69
+ export type TrayStatus =
70
+ 'starting' | 'owned' | 'conflict' | 'released' | 'unavailable';
71
+
72
+ /** Somebody else is the tray. */
73
+ export interface TrayConflict {
74
+ /** The X window that owns `_NET_SYSTEM_TRAY_S<screen>`. */
75
+ owner: number;
76
+ screen: number;
77
+ }
78
+
79
+ /** What the component wires up. Every one is optional; the manager runs
80
+ * whether or not anybody is listening. */
81
+ export interface TrayManagerHandlers {
82
+ /** The whole list, whenever it changes — what the component renders. */
83
+ onIcons?(icons: readonly TrayIcon[]): void;
84
+ onDock?(icon: TrayIcon): void;
85
+ onUndock?(icon: TrayIcon): void;
86
+ onStatus?(status: TrayStatus, conflict: TrayConflict | null): void;
87
+ onMessage?(message: TrayMessage): void;
88
+ onCancelMessage?(info: { windowId: number; id: number }): void;
89
+ onError?(err: Error): void;
90
+ }
91
+
92
+ /** The slice of the X connection this needs. `useApp()` is declared
93
+ * `unknown` in core — it is the escape hatch, so the shape is written out
94
+ * rather than imported. */
95
+ interface XEvent {
96
+ type: number;
97
+ wid?: number;
98
+ atom?: number;
99
+ time?: number;
100
+ owner?: number;
101
+ selection?: number;
102
+ format?: number;
103
+ message_type?: number;
104
+ data?: number[];
105
+ }
106
+
107
+ interface XConnection {
108
+ AllocID(): number;
109
+ InternAtom(
110
+ onlyIfExists: boolean,
111
+ name: string,
112
+ cb: (err: Error | null, atom: number) => void,
113
+ ): void;
114
+ CreateWindow(
115
+ id: number,
116
+ parent: number,
117
+ x: number,
118
+ y: number,
119
+ width: number,
120
+ height: number,
121
+ borderWidth: number,
122
+ depth: number,
123
+ klass: number,
124
+ visual: number,
125
+ values: Record<string, unknown>,
126
+ ): void;
127
+ DestroyWindow(id: number): void;
128
+ ChangeProperty(
129
+ mode: number,
130
+ wid: number,
131
+ name: number,
132
+ type: number,
133
+ format: number,
134
+ data: readonly number[],
135
+ ): void;
136
+ GetSelectionOwner(
137
+ atom: number,
138
+ cb: (err: Error | null, owner: number) => void,
139
+ ): void;
140
+ SetSelectionOwner(owner: number, atom: number, time: number): void;
141
+ GetWindowAttributes(
142
+ wid: number,
143
+ cb: (err: Error | null, attrs: { visual: number }) => void,
144
+ ): void;
145
+ SendEvent(
146
+ destination: number,
147
+ propagate: number,
148
+ eventMask: number,
149
+ event: Record<string, unknown>,
150
+ ): void;
151
+ on(name: 'event', fn: (ev: XEvent) => void): void;
152
+ removeListener?(name: 'event', fn: (ev: XEvent) => void): void;
153
+ }
154
+
155
+ /** What ntk's app exposes that a tray needs. */
156
+ export interface TrayApp {
157
+ X?: XConnection;
158
+ display?: {
159
+ screen?: {
160
+ root: number;
161
+ depths?: Record<number, Record<string, { class?: number }>>;
162
+ }[];
163
+ };
164
+ }
165
+
166
+ export interface TrayManagerStartOptions {
167
+ orientation: TrayOrientation;
168
+ /**
169
+ * The top-level window the icons will be embedded into, so the visual it
170
+ * actually has can be advertised — or not. `null` skips the question and
171
+ * publishes no `_NET_SYSTEM_TRAY_VISUAL`.
172
+ */
173
+ hostWindowId: number | null;
174
+ }
175
+
176
+ /**
177
+ * The tray host's half of the system tray protocol.
178
+ *
179
+ * ```ts
180
+ * const manager = new TrayManager(app, 0);
181
+ * manager.handlers = { onIcons: setIcons };
182
+ * await manager.start({ orientation: 'horizontal', hostWindowId: id });
183
+ * // …
184
+ * manager.stop();
185
+ * ```
186
+ *
187
+ * Public because a panel that draws its own tray — one that does not want
188
+ * `<TrayHost>`'s layout — should not have to reimplement selection
189
+ * ownership, and because it is what the tests drive. Same reason
190
+ * `ProcessHost` is exported from `../embed/`.
191
+ */
192
+ export class TrayManager {
193
+ #app: TrayApp;
194
+ #screen: number;
195
+ #X: XConnection | null;
196
+ #root: number;
197
+
198
+ #selectionAtom = 0;
199
+ #opcodeAtom = 0;
200
+ #orientationAtom = 0;
201
+ #visualAtom = 0;
202
+ #messageDataAtom = 0;
203
+ #managerAtom = 0;
204
+
205
+ /** The window that owns the selection, and the address the opcodes are
206
+ * sent to. Created here rather than rendered, because a selection held on
207
+ * a node that can unmount is a tray that silently stops being one. */
208
+ #window = 0;
209
+ /** The timestamp the selection was taken with; ICCCM 2.3 wants it back
210
+ * when the selection is given up. */
211
+ #ownedAt = 0;
212
+
213
+ #icons: TrayIcon[] = [];
214
+ #balloons = new BalloonAssembler();
215
+ #status: TrayStatus = 'starting';
216
+ #conflict: TrayConflict | null = null;
217
+ #orientation: TrayOrientation = 'horizontal';
218
+ #visual = 0;
219
+ /**
220
+ * The current run, or `null` between `stop()` and the next `start()`.
221
+ *
222
+ * A token rather than a pair of booleans for the reason `ForeignNode._start`
223
+ * uses one: taking the selection is a chain of round trips, and a run that
224
+ * was stopped part-way through must not have its stale continuation report
225
+ * success or leave a window behind. It is also what makes the manager
226
+ * genuinely restartable — React remounts an effect on the same instance in
227
+ * development, and a one-shot manager would come back dead.
228
+ */
229
+ #run: object | null = null;
230
+ #listener: ((ev: XEvent) => void) | null = null;
231
+
232
+ /** Assign, do not construct with: the component replaces these every
233
+ * render so an inline handler is not a reason to restart anything. */
234
+ handlers: TrayManagerHandlers = {};
235
+
236
+ constructor(app: TrayApp, screen = 0) {
237
+ this.#app = app;
238
+ this.#screen = screen;
239
+ this.#X = app?.X ?? null;
240
+ this.#root = app?.display?.screen?.[screen]?.root ?? 0;
241
+ }
242
+
243
+ get status(): TrayStatus {
244
+ return this.#status;
245
+ }
246
+
247
+ get conflict(): TrayConflict | null {
248
+ return this.#conflict;
249
+ }
250
+
251
+ /** The manager selection window, once there is one. */
252
+ get windowId(): number {
253
+ return this.#window || 0;
254
+ }
255
+
256
+ get icons(): readonly TrayIcon[] {
257
+ return this.#icons;
258
+ }
259
+
260
+ /**
261
+ * Take the selection, if nobody else has it.
262
+ *
263
+ * The order is the spec's: publish the properties, *then* take the
264
+ * selection, *then* broadcast `MANAGER`. A client that starts docking on
265
+ * the broadcast reads the properties immediately afterwards, so they have
266
+ * to be there before the announcement rather than after it.
267
+ */
268
+ async start(options: TrayManagerStartOptions): Promise<void> {
269
+ if (this.#run) return;
270
+ const run = {};
271
+ this.#run = run;
272
+ /** Still the run that started this line? */
273
+ const live = (): boolean => this.#run === run;
274
+ this.#orientation = options.orientation;
275
+ this.#setStatus('starting', null);
276
+
277
+ const X = this.#X;
278
+ // No raw protocol on this connection — a headless mock. Not an error to
279
+ // report: there is simply no display to be the tray of.
280
+ if (!X || typeof X.SetSelectionOwner !== 'function' || !this.#root) {
281
+ this.#setStatus('unavailable', null);
282
+ return;
283
+ }
284
+
285
+ try {
286
+ await this.#internAtoms(X);
287
+ if (!live()) return;
288
+
289
+ const existing = await this.#selectionOwner(X);
290
+ if (!live()) return;
291
+ if (existing) {
292
+ // A second panel on one display is a configuration mistake, not an
293
+ // exception. It says so and embeds nothing.
294
+ this.#setStatus('conflict', { owner: existing, screen: this.#screen });
295
+ return;
296
+ }
297
+
298
+ this.#window = X.AllocID();
299
+ // InputOnly, never mapped, 1x1 off-screen: this window exists to be an
300
+ // address and to hold two properties, which InputOnly windows do. It
301
+ // selects nothing — a ClientMessage reaches the client that created the
302
+ // window whatever its event mask is, which is how the opcodes arrive.
303
+ X.CreateWindow(
304
+ this.#window,
305
+ this.#root,
306
+ -1,
307
+ -1,
308
+ 1,
309
+ 1,
310
+ 0,
311
+ 0,
312
+ INPUT_ONLY,
313
+ 0,
314
+ {
315
+ eventMask: 0,
316
+ },
317
+ );
318
+
319
+ this.#visual = await this.#resolveVisual(X, options.hostWindowId);
320
+ // Stopped mid-flight: the window above is ours and nothing else will
321
+ // drop it, because `stop()` ran before there was one to drop.
322
+ if (!live()) {
323
+ this.#destroyWindow();
324
+ return;
325
+ }
326
+ this.#writeOrientation();
327
+ this.#writeVisual();
328
+
329
+ // ICCCM 2.1: never `CurrentTime`. Nothing the user did caused this, so
330
+ // it is a fresh server timestamp rather than `lastInputTime()`.
331
+ const time = await serverTime(this.#app as unknown as NtkApp);
332
+ if (!live()) {
333
+ this.#destroyWindow();
334
+ return;
335
+ }
336
+ X.SetSelectionOwner(this.#window, this.#selectionAtom, time);
337
+ this.#ownedAt = time;
338
+
339
+ // Ask rather than assume. Two panels starting together both saw an
340
+ // unowned selection above, and only one of them has it now.
341
+ const owner = await this.#selectionOwner(X);
342
+ if (!live()) {
343
+ X.SetSelectionOwner(0, this.#selectionAtom, time);
344
+ this.#destroyWindow();
345
+ return;
346
+ }
347
+ if (owner !== this.#window) {
348
+ this.#setStatus('conflict', { owner, screen: this.#screen });
349
+ this.#destroyWindow();
350
+ return;
351
+ }
352
+
353
+ this.#listen(X);
354
+ this.#broadcastManager(X, time);
355
+ this.#setStatus('owned', null);
356
+ } catch (err) {
357
+ this.#fail(err);
358
+ }
359
+ }
360
+
361
+ /**
362
+ * Give the selection back and drop the manager window.
363
+ *
364
+ * The icons are *not* reparented here: each one is a `<foreign>`, and
365
+ * handing a client back untouched on unmount is that element's promise.
366
+ * All this does is stop being the tray.
367
+ */
368
+ stop(): void {
369
+ if (!this.#run) return;
370
+ this.#run = null;
371
+ const X = this.#X;
372
+ this.#unlisten();
373
+ this.#balloons.clear();
374
+ this.#replaceIcons([]);
375
+ if (X && this.#window) {
376
+ try {
377
+ // ICCCM 2.3: relinquish with the timestamp it was acquired at.
378
+ X.SetSelectionOwner(0, this.#selectionAtom, this.#ownedAt);
379
+ } catch {
380
+ // the connection is going away, which releases it anyway
381
+ }
382
+ }
383
+ this.#destroyWindow();
384
+ this.#setStatus('released', null);
385
+ }
386
+
387
+ /** Republish `_NET_SYSTEM_TRAY_ORIENTATION`. Cheap and idempotent. */
388
+ setOrientation(orientation: TrayOrientation): void {
389
+ if (orientation === this.#orientation) return;
390
+ this.#orientation = orientation;
391
+ this.#writeOrientation();
392
+ }
393
+
394
+ /**
395
+ * The icon's client went away — `<foreign onClientGone>`, which is the
396
+ * ordinary case here rather than an error: tray icons come and go with the
397
+ * applications that own them.
398
+ */
399
+ undock(id: number): void {
400
+ const icon = this.#icons.find((entry) => entry.id === id);
401
+ if (!icon) return;
402
+ // A new array, never a splice: the component holds this as state, and
403
+ // React compares identities — mutating in place removes the icon from
404
+ // the list and leaves it on screen.
405
+ this.#icons = this.#icons.filter((entry) => entry !== icon);
406
+ this.#balloons.forget(id);
407
+ this.#emitIcons();
408
+ this.#safely(() => this.handlers.onUndock?.(icon));
409
+ }
410
+
411
+ // --- the wire ------------------------------------------------------
412
+
413
+ #listen(X: XConnection): void {
414
+ const listener = (ev: XEvent): void => {
415
+ if (!this.#run) return;
416
+ try {
417
+ this.#onEvent(ev);
418
+ } catch (err) {
419
+ this.#fail(err);
420
+ }
421
+ };
422
+ this.#listener = listener;
423
+ X.on('event', listener);
424
+ }
425
+
426
+ #unlisten(): void {
427
+ const listener = this.#listener;
428
+ this.#listener = null;
429
+ if (listener) this.#X?.removeListener?.('event', listener);
430
+ }
431
+
432
+ #onEvent(ev: XEvent): void {
433
+ if (ev.type === SELECTION_CLEAR) {
434
+ // Another tray took over. Letting the icons go is the whole job here:
435
+ // a panel that keeps drawing dead icons after losing the selection is
436
+ // the failure users report as "my tray is empty".
437
+ if (ev.selection !== this.#selectionAtom) return;
438
+ if (this.#window && ev.owner !== this.#window) return;
439
+ this.#unlisten();
440
+ this.#balloons.clear();
441
+ this.#replaceIcons([]);
442
+ this.#destroyWindow();
443
+ this.#setStatus('released', null);
444
+ return;
445
+ }
446
+
447
+ if (ev.type !== CLIENT_MESSAGE) return;
448
+
449
+ if (ev.message_type === this.#opcodeAtom) {
450
+ // A dock request names the manager window; a balloon message names the
451
+ // icon it is about, and both are *sent to* the manager window. So the
452
+ // event's window field is only ever one of those two.
453
+ const from = ev.wid ?? 0;
454
+ if (from !== this.#window && !this.#hasIcon(from)) return;
455
+ this.#onOpcode(from, ev.data ?? []);
456
+ return;
457
+ }
458
+
459
+ if (ev.message_type === this.#messageDataAtom && ev.format === 8) {
460
+ const from = ev.wid ?? 0;
461
+ if (!this.#hasIcon(from)) return;
462
+ const message = this.#balloons.data(from, ev.data ?? []);
463
+ if (message) this.#safely(() => this.handlers.onMessage?.(message));
464
+ }
465
+ }
466
+
467
+ #onOpcode(from: number, data: readonly number[]): void {
468
+ const opcode = data[1];
469
+ if (opcode === SYSTEM_TRAY_REQUEST_DOCK) {
470
+ this.#dock(data[2] ?? 0);
471
+ return;
472
+ }
473
+ if (opcode === SYSTEM_TRAY_BEGIN_MESSAGE) {
474
+ if (!this.#hasIcon(from)) return;
475
+ const message = this.#balloons.begin(from, {
476
+ timeout: data[2] ?? 0,
477
+ length: data[3] ?? 0,
478
+ id: data[4] ?? 0,
479
+ });
480
+ if (message) this.#safely(() => this.handlers.onMessage?.(message));
481
+ return;
482
+ }
483
+ if (opcode === SYSTEM_TRAY_CANCEL_MESSAGE) {
484
+ if (!this.#hasIcon(from)) return;
485
+ const id = data[2] ?? 0;
486
+ if (this.#balloons.cancel(from, id)) {
487
+ this.#safely(() =>
488
+ this.handlers.onCancelMessage?.({ windowId: from, id }),
489
+ );
490
+ }
491
+ }
492
+ }
493
+
494
+ #dock(id: number): void {
495
+ if (!id || this.#status !== 'owned' || this.#hasIcon(id)) return;
496
+ const icon: TrayIcon = { id };
497
+ this.#icons = [...this.#icons, icon];
498
+ this.#emitIcons();
499
+ this.#safely(() => this.handlers.onDock?.(icon));
500
+ }
501
+
502
+ #hasIcon(id: number): boolean {
503
+ return this.#icons.some((icon) => icon.id === id);
504
+ }
505
+
506
+ #replaceIcons(next: TrayIcon[]): void {
507
+ if (this.#icons.length === 0 && next.length === 0) return;
508
+ const gone = this.#icons;
509
+ this.#icons = next;
510
+ this.#emitIcons();
511
+ for (const icon of gone) {
512
+ if (!next.includes(icon))
513
+ this.#safely(() => this.handlers.onUndock?.(icon));
514
+ }
515
+ }
516
+
517
+ #emitIcons(): void {
518
+ const icons = this.#icons;
519
+ this.#safely(() => this.handlers.onIcons?.(icons));
520
+ }
521
+
522
+ /**
523
+ * ICCCM 2.8's `MANAGER` broadcast: clients that were waiting for a tray
524
+ * start docking on this, which is the only reason an application launched
525
+ * before the panel ever gets an icon.
526
+ */
527
+ #broadcastManager(X: XConnection, time: number): void {
528
+ X.SendEvent(this.#root, 0, STRUCTURE_NOTIFY_MASK, {
529
+ name: 'ClientMessage',
530
+ format: 32,
531
+ wid: this.#root,
532
+ message_type: this.#managerAtom,
533
+ data: [time, this.#selectionAtom, this.#window, 0, 0],
534
+ });
535
+ }
536
+
537
+ #writeOrientation(): void {
538
+ const X = this.#X;
539
+ if (!X || !this.#window) return;
540
+ X.ChangeProperty(0, this.#window, this.#orientationAtom, XA_CARDINAL, 32, [
541
+ orientationValue(this.#orientation),
542
+ ]);
543
+ }
544
+
545
+ #writeVisual(): void {
546
+ const X = this.#X;
547
+ // Absent rather than zero when there is nothing honest to say: a client
548
+ // reads "is the property there" and a 0 visual id is not a visual.
549
+ if (!X || !this.#window || !this.#visual) return;
550
+ X.ChangeProperty(0, this.#window, this.#visualAtom, XA_VISUALID, 32, [
551
+ this.#visual,
552
+ ]);
553
+ }
554
+
555
+ async #resolveVisual(
556
+ X: XConnection,
557
+ hostWindowId: number | null,
558
+ ): Promise<number> {
559
+ if (!hostWindowId) return 0;
560
+ try {
561
+ const attrs = await new Promise<{ visual: number }>((resolve, reject) =>
562
+ X.GetWindowAttributes(hostWindowId, (err, value) =>
563
+ err ? reject(err) : resolve(value),
564
+ ),
565
+ );
566
+ const screen = this.#app.display?.screen?.[this.#screen];
567
+ return argbVisualOf(screen, attrs?.visual ?? 0);
568
+ } catch {
569
+ // The window went away, or the server would not say. No property, and
570
+ // the icons fall back to guessing a background — which always worked.
571
+ return 0;
572
+ }
573
+ }
574
+
575
+ #selectionOwner(X: XConnection): Promise<number> {
576
+ return new Promise<number>((resolve, reject) =>
577
+ X.GetSelectionOwner(this.#selectionAtom, (err, owner) =>
578
+ err ? reject(err) : resolve(owner >>> 0),
579
+ ),
580
+ );
581
+ }
582
+
583
+ async #internAtoms(X: XConnection): Promise<void> {
584
+ const intern = (name: string): Promise<number> =>
585
+ new Promise<number>((resolve, reject) =>
586
+ X.InternAtom(false, name, (err, atom) =>
587
+ err ? reject(err) : resolve(atom),
588
+ ),
589
+ );
590
+ const [selection, opcode, orientation, visual, messageData, manager] =
591
+ await Promise.all([
592
+ intern(selectionNameFor(this.#screen)),
593
+ intern(OPCODE_ATOM),
594
+ intern(ORIENTATION_ATOM),
595
+ intern(VISUAL_ATOM),
596
+ intern(MESSAGE_DATA_ATOM),
597
+ intern(MANAGER_ATOM),
598
+ ]);
599
+ this.#selectionAtom = selection ?? 0;
600
+ this.#opcodeAtom = opcode ?? 0;
601
+ this.#orientationAtom = orientation ?? 0;
602
+ this.#visualAtom = visual ?? 0;
603
+ this.#messageDataAtom = messageData ?? 0;
604
+ this.#managerAtom = manager ?? 0;
605
+ }
606
+
607
+ #destroyWindow(): void {
608
+ const id = this.#window;
609
+ this.#window = 0;
610
+ if (!id) return;
611
+ try {
612
+ this.#X?.DestroyWindow(id);
613
+ } catch {
614
+ // the connection is closing; the server drops it with us
615
+ }
616
+ }
617
+
618
+ #setStatus(status: TrayStatus, conflict: TrayConflict | null): void {
619
+ if (this.#status === status && this.#conflict === conflict) return;
620
+ this.#status = status;
621
+ this.#conflict = conflict;
622
+ this.#safely(() => this.handlers.onStatus?.(status, conflict));
623
+ }
624
+
625
+ #fail(err: unknown): void {
626
+ const wrapped = err instanceof Error ? err : new Error(String(err));
627
+ this.#safely(() => this.handlers.onError?.(wrapped));
628
+ }
629
+
630
+ /** One handler throwing must not take the X event loop with it — the same
631
+ * rule `xsettings.js` applies to its subscribers. */
632
+ #safely(fn: () => void): void {
633
+ try {
634
+ fn();
635
+ } catch {
636
+ /* a listener's problem, not the tray's */
637
+ }
638
+ }
639
+ }