@react-x11/components 0.1.0 → 0.2.1

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 (788) 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 +88 -0
  335. package/dist/internal/heights.d.ts.map +1 -0
  336. package/dist/internal/heights.js +203 -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/scroll.d.ts +62 -0
  343. package/dist/internal/scroll.d.ts.map +1 -0
  344. package/dist/internal/scroll.js +224 -0
  345. package/dist/internal/scroll.js.map +1 -0
  346. package/dist/internal/text.d.ts +6 -0
  347. package/dist/internal/text.d.ts.map +1 -0
  348. package/dist/internal/text.js +44 -0
  349. package/dist/internal/text.js.map +1 -0
  350. package/dist/internal/timers.d.ts +8 -0
  351. package/dist/internal/timers.d.ts.map +1 -0
  352. package/dist/internal/timers.js +22 -0
  353. package/dist/internal/timers.js.map +1 -0
  354. package/dist/internal/widget.d.ts +40 -0
  355. package/dist/internal/widget.d.ts.map +1 -0
  356. package/dist/internal/widget.js +44 -0
  357. package/dist/internal/widget.js.map +1 -0
  358. package/dist/markdown/ast.d.ts +126 -0
  359. package/dist/markdown/ast.d.ts.map +1 -0
  360. package/dist/markdown/ast.js +8 -0
  361. package/dist/markdown/ast.js.map +1 -0
  362. package/dist/markdown/hx.d.ts +24 -0
  363. package/dist/markdown/hx.d.ts.map +1 -0
  364. package/dist/markdown/hx.js +25 -0
  365. package/dist/markdown/hx.js.map +1 -0
  366. package/dist/markdown/index.d.ts +90 -0
  367. package/dist/markdown/index.d.ts.map +1 -0
  368. package/dist/markdown/index.js +413 -0
  369. package/dist/markdown/index.js.map +1 -0
  370. package/dist/markdown/parse.d.ts +8 -0
  371. package/dist/markdown/parse.d.ts.map +1 -0
  372. package/dist/markdown/parse.js +911 -0
  373. package/dist/markdown/parse.js.map +1 -0
  374. package/dist/markdown/spans.d.ts +20 -0
  375. package/dist/markdown/spans.d.ts.map +1 -0
  376. package/dist/markdown/spans.js +96 -0
  377. package/dist/markdown/spans.js.map +1 -0
  378. package/dist/media-player/backends.d.ts +64 -0
  379. package/dist/media-player/backends.d.ts.map +1 -0
  380. package/dist/media-player/backends.js +110 -0
  381. package/dist/media-player/backends.js.map +1 -0
  382. package/dist/media-player/control.d.ts +40 -0
  383. package/dist/media-player/control.d.ts.map +1 -0
  384. package/dist/media-player/control.js +44 -0
  385. package/dist/media-player/control.js.map +1 -0
  386. package/dist/media-player/hx.d.ts +24 -0
  387. package/dist/media-player/hx.d.ts.map +1 -0
  388. package/dist/media-player/hx.js +25 -0
  389. package/dist/media-player/hx.js.map +1 -0
  390. package/dist/media-player/index.d.ts +107 -0
  391. package/dist/media-player/index.d.ts.map +1 -0
  392. package/dist/media-player/index.js +219 -0
  393. package/dist/media-player/index.js.map +1 -0
  394. package/dist/media-player/mpv.d.ts +4 -0
  395. package/dist/media-player/mpv.d.ts.map +1 -0
  396. package/dist/media-player/mpv.js +120 -0
  397. package/dist/media-player/mpv.js.map +1 -0
  398. package/dist/media-player/vlc.d.ts +8 -0
  399. package/dist/media-player/vlc.d.ts.map +1 -0
  400. package/dist/media-player/vlc.js +83 -0
  401. package/dist/media-player/vlc.js.map +1 -0
  402. package/dist/richtext/index.d.ts +19 -0
  403. package/dist/richtext/index.d.ts.map +1 -0
  404. package/dist/richtext/index.js +4 -0
  405. package/dist/richtext/index.js.map +1 -0
  406. package/dist/richtext/links.d.ts +12 -0
  407. package/dist/richtext/links.d.ts.map +1 -0
  408. package/dist/richtext/links.js +64 -0
  409. package/dist/richtext/links.js.map +1 -0
  410. package/dist/richtext/menu.d.ts +11 -0
  411. package/dist/richtext/menu.d.ts.map +1 -0
  412. package/dist/richtext/menu.js +43 -0
  413. package/dist/richtext/menu.js.map +1 -0
  414. package/dist/richtext/node.d.ts +151 -0
  415. package/dist/richtext/node.d.ts.map +1 -0
  416. package/dist/richtext/node.js +255 -0
  417. package/dist/richtext/node.js.map +1 -0
  418. package/dist/richtext/runs.d.ts +92 -0
  419. package/dist/richtext/runs.d.ts.map +1 -0
  420. package/dist/richtext/runs.js +158 -0
  421. package/dist/richtext/runs.js.map +1 -0
  422. package/dist/table/hx.d.ts +24 -0
  423. package/dist/table/hx.d.ts.map +1 -0
  424. package/dist/table/hx.js +25 -0
  425. package/dist/table/hx.js.map +1 -0
  426. package/dist/table/index.d.ts +169 -0
  427. package/dist/table/index.d.ts.map +1 -0
  428. package/dist/table/index.js +890 -0
  429. package/dist/table/index.js.map +1 -0
  430. package/dist/table/rows.d.ts +136 -0
  431. package/dist/table/rows.d.ts.map +1 -0
  432. package/dist/table/rows.js +146 -0
  433. package/dist/table/rows.js.map +1 -0
  434. package/dist/terminal/backends.d.ts +105 -0
  435. package/dist/terminal/backends.d.ts.map +1 -0
  436. package/dist/terminal/backends.js +185 -0
  437. package/dist/terminal/backends.js.map +1 -0
  438. package/dist/terminal/hx.d.ts +24 -0
  439. package/dist/terminal/hx.d.ts.map +1 -0
  440. package/dist/terminal/hx.js +25 -0
  441. package/dist/terminal/hx.js.map +1 -0
  442. package/dist/terminal/index.d.ts +160 -0
  443. package/dist/terminal/index.d.ts.map +1 -0
  444. package/dist/terminal/index.js +344 -0
  445. package/dist/terminal/index.js.map +1 -0
  446. package/dist/terminal/title.d.ts +24 -0
  447. package/dist/terminal/title.d.ts.map +1 -0
  448. package/dist/terminal/title.js +129 -0
  449. package/dist/terminal/title.js.map +1 -0
  450. package/dist/terminal/vt/colors.d.ts +63 -0
  451. package/dist/terminal/vt/colors.d.ts.map +1 -0
  452. package/dist/terminal/vt/colors.js +203 -0
  453. package/dist/terminal/vt/colors.js.map +1 -0
  454. package/dist/terminal/vt/diff.d.ts +117 -0
  455. package/dist/terminal/vt/diff.d.ts.map +1 -0
  456. package/dist/terminal/vt/diff.js +358 -0
  457. package/dist/terminal/vt/diff.js.map +1 -0
  458. package/dist/terminal/vt/fonts.d.ts +92 -0
  459. package/dist/terminal/vt/fonts.d.ts.map +1 -0
  460. package/dist/terminal/vt/fonts.js +178 -0
  461. package/dist/terminal/vt/fonts.js.map +1 -0
  462. package/dist/terminal/vt/index.d.ts +78 -0
  463. package/dist/terminal/vt/index.d.ts.map +1 -0
  464. package/dist/terminal/vt/index.js +312 -0
  465. package/dist/terminal/vt/index.js.map +1 -0
  466. package/dist/terminal/vt/keys.d.ts +74 -0
  467. package/dist/terminal/vt/keys.d.ts.map +1 -0
  468. package/dist/terminal/vt/keys.js +309 -0
  469. package/dist/terminal/vt/keys.js.map +1 -0
  470. package/dist/terminal/vt/mouse.d.ts +44 -0
  471. package/dist/terminal/vt/mouse.d.ts.map +1 -0
  472. package/dist/terminal/vt/mouse.js +106 -0
  473. package/dist/terminal/vt/mouse.js.map +1 -0
  474. package/dist/terminal/vt/node.d.ts +246 -0
  475. package/dist/terminal/vt/node.d.ts.map +1 -0
  476. package/dist/terminal/vt/node.js +1068 -0
  477. package/dist/terminal/vt/node.js.map +1 -0
  478. package/dist/terminal/vt/pty.d.ts +81 -0
  479. package/dist/terminal/vt/pty.d.ts.map +1 -0
  480. package/dist/terminal/vt/pty.js +201 -0
  481. package/dist/terminal/vt/pty.js.map +1 -0
  482. package/dist/terminal/vt/renderer.d.ts +179 -0
  483. package/dist/terminal/vt/renderer.d.ts.map +1 -0
  484. package/dist/terminal/vt/renderer.js +357 -0
  485. package/dist/terminal/vt/renderer.js.map +1 -0
  486. package/dist/terminal/vt/timers.d.ts +6 -0
  487. package/dist/terminal/vt/timers.d.ts.map +1 -0
  488. package/dist/terminal/vt/timers.js +16 -0
  489. package/dist/terminal/vt/timers.js.map +1 -0
  490. package/dist/terminal/vt/xterm.d.ts +142 -0
  491. package/dist/terminal/vt/xterm.d.ts.map +1 -0
  492. package/dist/terminal/vt/xterm.js +32 -0
  493. package/dist/terminal/vt/xterm.js.map +1 -0
  494. package/dist/terminal-output/hx.d.ts +24 -0
  495. package/dist/terminal-output/hx.d.ts.map +1 -0
  496. package/dist/terminal-output/hx.js +25 -0
  497. package/dist/terminal-output/hx.js.map +1 -0
  498. package/dist/terminal-output/index.d.ts +92 -0
  499. package/dist/terminal-output/index.d.ts.map +1 -0
  500. package/dist/terminal-output/index.js +179 -0
  501. package/dist/terminal-output/index.js.map +1 -0
  502. package/dist/terminal-output/runs.d.ts +27 -0
  503. package/dist/terminal-output/runs.d.ts.map +1 -0
  504. package/dist/terminal-output/runs.js +66 -0
  505. package/dist/terminal-output/runs.js.map +1 -0
  506. package/dist/three/canvas.d.ts +46 -0
  507. package/dist/three/canvas.d.ts.map +1 -0
  508. package/dist/three/canvas.js +305 -0
  509. package/dist/three/canvas.js.map +1 -0
  510. package/dist/three/events.d.ts +64 -0
  511. package/dist/three/events.d.ts.map +1 -0
  512. package/dist/three/events.js +146 -0
  513. package/dist/three/events.js.map +1 -0
  514. package/dist/three/geometries.d.ts +89 -0
  515. package/dist/three/geometries.d.ts.map +1 -0
  516. package/dist/three/geometries.js +345 -0
  517. package/dist/three/geometries.js.map +1 -0
  518. package/dist/three/globals.d.ts +7 -0
  519. package/dist/three/globals.d.ts.map +1 -0
  520. package/dist/three/globals.js +20 -0
  521. package/dist/three/globals.js.map +1 -0
  522. package/dist/three/hx.d.ts +9 -0
  523. package/dist/three/hx.d.ts.map +1 -0
  524. package/dist/three/hx.js +10 -0
  525. package/dist/three/hx.js.map +1 -0
  526. package/dist/three/index.d.ts +22 -0
  527. package/dist/three/index.d.ts.map +1 -0
  528. package/dist/three/index.js +24 -0
  529. package/dist/three/index.js.map +1 -0
  530. package/dist/three/jsx-dev-runtime.d.ts +19 -0
  531. package/dist/three/jsx-dev-runtime.d.ts.map +1 -0
  532. package/dist/three/jsx-dev-runtime.js +2 -0
  533. package/dist/three/jsx-dev-runtime.js.map +1 -0
  534. package/dist/three/jsx-runtime.d.ts +19 -0
  535. package/dist/three/jsx-runtime.d.ts.map +1 -0
  536. package/dist/three/jsx-runtime.js +2 -0
  537. package/dist/three/jsx-runtime.js.map +1 -0
  538. package/dist/three/jsx.d.ts +198 -0
  539. package/dist/three/jsx.d.ts.map +1 -0
  540. package/dist/three/jsx.js +2 -0
  541. package/dist/three/jsx.js.map +1 -0
  542. package/dist/three/materials.d.ts +125 -0
  543. package/dist/three/materials.d.ts.map +1 -0
  544. package/dist/three/materials.js +229 -0
  545. package/dist/three/materials.js.map +1 -0
  546. package/dist/three/math.d.ts +146 -0
  547. package/dist/three/math.d.ts.map +1 -0
  548. package/dist/three/math.js +464 -0
  549. package/dist/three/math.js.map +1 -0
  550. package/dist/three/objects.d.ts +185 -0
  551. package/dist/three/objects.d.ts.map +1 -0
  552. package/dist/three/objects.js +309 -0
  553. package/dist/three/objects.js.map +1 -0
  554. package/dist/three/passes.d.ts +54 -0
  555. package/dist/three/passes.d.ts.map +1 -0
  556. package/dist/three/passes.js +78 -0
  557. package/dist/three/passes.js.map +1 -0
  558. package/dist/three/postprocess.d.ts +85 -0
  559. package/dist/three/postprocess.d.ts.map +1 -0
  560. package/dist/three/postprocess.js +503 -0
  561. package/dist/three/postprocess.js.map +1 -0
  562. package/dist/three/raycast.d.ts +24 -0
  563. package/dist/three/raycast.d.ts.map +1 -0
  564. package/dist/three/raycast.js +138 -0
  565. package/dist/three/raycast.js.map +1 -0
  566. package/dist/three/reconciler.d.ts +48 -0
  567. package/dist/three/reconciler.d.ts.map +1 -0
  568. package/dist/three/reconciler.js +416 -0
  569. package/dist/three/reconciler.js.map +1 -0
  570. package/dist/three/renderer-direct.d.ts +102 -0
  571. package/dist/three/renderer-direct.d.ts.map +1 -0
  572. package/dist/three/renderer-direct.js +782 -0
  573. package/dist/three/renderer-direct.js.map +1 -0
  574. package/dist/three/renderer-indirect.d.ts +68 -0
  575. package/dist/three/renderer-indirect.d.ts.map +1 -0
  576. package/dist/three/renderer-indirect.js +438 -0
  577. package/dist/three/renderer-indirect.js.map +1 -0
  578. package/dist/three/store.d.ts +81 -0
  579. package/dist/three/store.d.ts.map +1 -0
  580. package/dist/three/store.js +110 -0
  581. package/dist/three/store.js.map +1 -0
  582. package/dist/timeline/hx.d.ts +18 -0
  583. package/dist/timeline/hx.d.ts.map +1 -0
  584. package/dist/timeline/hx.js +10 -0
  585. package/dist/timeline/hx.js.map +1 -0
  586. package/dist/timeline/index.d.ts +152 -0
  587. package/dist/timeline/index.d.ts.map +1 -0
  588. package/dist/timeline/index.js +383 -0
  589. package/dist/timeline/index.js.map +1 -0
  590. package/dist/tray-host/hx.d.ts +24 -0
  591. package/dist/tray-host/hx.d.ts.map +1 -0
  592. package/dist/tray-host/hx.js +25 -0
  593. package/dist/tray-host/hx.js.map +1 -0
  594. package/dist/tray-host/index.d.ts +110 -0
  595. package/dist/tray-host/index.d.ts.map +1 -0
  596. package/dist/tray-host/index.js +191 -0
  597. package/dist/tray-host/index.js.map +1 -0
  598. package/dist/tray-host/manager.d.ts +137 -0
  599. package/dist/tray-host/manager.d.ts.map +1 -0
  600. package/dist/tray-host/manager.js +462 -0
  601. package/dist/tray-host/manager.js.map +1 -0
  602. package/dist/tray-host/notify.d.ts +22 -0
  603. package/dist/tray-host/notify.d.ts.map +1 -0
  604. package/dist/tray-host/notify.js +74 -0
  605. package/dist/tray-host/notify.js.map +1 -0
  606. package/dist/tray-host/protocol.d.ts +106 -0
  607. package/dist/tray-host/protocol.d.ts.map +1 -0
  608. package/dist/tray-host/protocol.js +191 -0
  609. package/dist/tray-host/protocol.js.map +1 -0
  610. package/dist/tree/hx.d.ts +24 -0
  611. package/dist/tree/hx.d.ts.map +1 -0
  612. package/dist/tree/hx.js +25 -0
  613. package/dist/tree/hx.js.map +1 -0
  614. package/dist/tree/index.d.ts +221 -0
  615. package/dist/tree/index.d.ts.map +1 -0
  616. package/dist/tree/index.js +751 -0
  617. package/dist/tree/index.js.map +1 -0
  618. package/dist/tree/internal.d.ts +18 -0
  619. package/dist/tree/internal.d.ts.map +1 -0
  620. package/dist/tree/internal.js +66 -0
  621. package/dist/tree/internal.js.map +1 -0
  622. package/dist/tree/rows.d.ts +177 -0
  623. package/dist/tree/rows.d.ts.map +1 -0
  624. package/dist/tree/rows.js +179 -0
  625. package/dist/tree/rows.js.map +1 -0
  626. package/package.json +166 -12
  627. package/src/ansi/cast.ts +159 -0
  628. package/src/ansi/index.ts +53 -0
  629. package/src/ansi/palette.ts +226 -0
  630. package/src/ansi/parse.ts +780 -0
  631. package/src/ansi/sgr.ts +380 -0
  632. package/src/ansi/utf8.ts +84 -0
  633. package/src/calendar/Calendar.ts +744 -0
  634. package/src/calendar/DatePicker.ts +368 -0
  635. package/src/calendar/dates.ts +307 -0
  636. package/src/calendar/index.ts +51 -0
  637. package/src/charts/components.ts +864 -0
  638. package/src/charts/data.ts +776 -0
  639. package/src/charts/hx.ts +39 -0
  640. package/src/charts/index.ts +99 -0
  641. package/src/charts/node.ts +932 -0
  642. package/src/charts/render.ts +982 -0
  643. package/src/charts/scale.ts +214 -0
  644. package/src/charts/spec.ts +122 -0
  645. package/src/charts/timers.ts +24 -0
  646. package/src/code/hx.ts +51 -0
  647. package/src/code/index.ts +174 -0
  648. package/src/code-editor/completion.ts +161 -0
  649. package/src/code-editor/doc.ts +198 -0
  650. package/src/code-editor/hx.ts +26 -0
  651. package/src/code-editor/index.ts +615 -0
  652. package/src/code-editor/node.ts +1926 -0
  653. package/src/code-language/hljs.ts +302 -0
  654. package/src/code-language/index.ts +51 -0
  655. package/src/code-language/languages/glsl.ts +120 -0
  656. package/src/code-language/languages/javascript.ts +419 -0
  657. package/src/code-language/languages/json.ts +72 -0
  658. package/src/code-language/languages/shell.ts +221 -0
  659. package/src/code-language/languages/sql.ts +165 -0
  660. package/src/code-language/lezer.ts +190 -0
  661. package/src/code-language/registry.ts +66 -0
  662. package/src/code-language/runs.ts +128 -0
  663. package/src/code-language/stream.ts +306 -0
  664. package/src/code-language/textmate.ts +134 -0
  665. package/src/code-language/theme.ts +124 -0
  666. package/src/code-language/timers.ts +36 -0
  667. package/src/code-language/types.ts +252 -0
  668. package/src/codeblock/index.ts +146 -0
  669. package/src/color-picker/ColorField.ts +333 -0
  670. package/src/color-picker/ColorPicker.ts +1069 -0
  671. package/src/color-picker/color.ts +399 -0
  672. package/src/color-picker/index.ts +50 -0
  673. package/src/desktop-calendar/eds.ts +484 -0
  674. package/src/desktop-calendar/ical.ts +119 -0
  675. package/src/desktop-calendar/index.ts +287 -0
  676. package/src/embed/client.ts +311 -0
  677. package/src/embed/host.ts +432 -0
  678. package/src/embed/index.ts +33 -0
  679. package/src/embed/timers.ts +32 -0
  680. package/src/flow/draw.ts +418 -0
  681. package/src/flow/index.ts +473 -0
  682. package/src/flow/model.ts +687 -0
  683. package/src/flow/node.ts +3694 -0
  684. package/src/flow/paths.ts +403 -0
  685. package/src/flow/types.ts +634 -0
  686. package/src/formula/hx.ts +51 -0
  687. package/src/formula/index.ts +243 -0
  688. package/src/formula/katex.ts +209 -0
  689. package/src/formula/layout.ts +876 -0
  690. package/src/formula/node.ts +467 -0
  691. package/src/html/controls.ts +244 -0
  692. package/src/html/css/cascade.ts +606 -0
  693. package/src/html/css/parse.ts +500 -0
  694. package/src/html/css/style.ts +1371 -0
  695. package/src/html/css/ua.ts +174 -0
  696. package/src/html/css/values.ts +358 -0
  697. package/src/html/dom.ts +410 -0
  698. package/src/html/hx.ts +55 -0
  699. package/src/html/index.ts +545 -0
  700. package/src/html/layout/block.ts +876 -0
  701. package/src/html/layout/boxes.ts +981 -0
  702. package/src/html/layout/flex.ts +297 -0
  703. package/src/html/layout/floats.ts +125 -0
  704. package/src/html/layout/inline.ts +870 -0
  705. package/src/html/layout/table.ts +380 -0
  706. package/src/html/node.ts +967 -0
  707. package/src/html/paint.ts +605 -0
  708. package/src/html/resources.ts +214 -0
  709. package/src/index.ts +638 -0
  710. package/src/internal/heights.ts +222 -0
  711. package/src/internal/hx.ts +53 -0
  712. package/src/internal/scroll.ts +288 -0
  713. package/src/internal/text.ts +44 -0
  714. package/src/internal/timers.ts +44 -0
  715. package/src/internal/widget.ts +92 -0
  716. package/src/markdown/ast.ts +163 -0
  717. package/src/markdown/hx.ts +51 -0
  718. package/src/markdown/index.ts +686 -0
  719. package/src/markdown/parse.ts +1037 -0
  720. package/src/markdown/spans.ts +143 -0
  721. package/src/media-player/backends.ts +155 -0
  722. package/src/media-player/control.ts +70 -0
  723. package/src/media-player/hx.ts +51 -0
  724. package/src/media-player/index.ts +378 -0
  725. package/src/media-player/mpv.ts +146 -0
  726. package/src/media-player/vlc.ts +97 -0
  727. package/src/richtext/index.ts +42 -0
  728. package/src/richtext/links.ts +78 -0
  729. package/src/richtext/menu.ts +49 -0
  730. package/src/richtext/node.ts +406 -0
  731. package/src/richtext/runs.ts +253 -0
  732. package/src/table/hx.ts +51 -0
  733. package/src/table/index.ts +1270 -0
  734. package/src/table/rows.ts +275 -0
  735. package/src/terminal/backends.ts +242 -0
  736. package/src/terminal/hx.ts +51 -0
  737. package/src/terminal/index.ts +574 -0
  738. package/src/terminal/title.ts +172 -0
  739. package/src/terminal/vt/colors.ts +247 -0
  740. package/src/terminal/vt/diff.ts +467 -0
  741. package/src/terminal/vt/fonts.ts +233 -0
  742. package/src/terminal/vt/index.ts +443 -0
  743. package/src/terminal/vt/keys.ts +369 -0
  744. package/src/terminal/vt/mouse.ts +144 -0
  745. package/src/terminal/vt/node.ts +1242 -0
  746. package/src/terminal/vt/pty.ts +334 -0
  747. package/src/terminal/vt/renderer.ts +555 -0
  748. package/src/terminal/vt/timers.ts +31 -0
  749. package/src/terminal/vt/xterm.ts +193 -0
  750. package/src/terminal-output/hx.ts +51 -0
  751. package/src/terminal-output/index.ts +340 -0
  752. package/src/terminal-output/runs.ts +79 -0
  753. package/src/three/canvas.ts +451 -0
  754. package/src/three/events.ts +197 -0
  755. package/src/three/geometries.ts +429 -0
  756. package/src/three/globals.ts +34 -0
  757. package/src/three/hx.ts +22 -0
  758. package/src/three/index.ts +98 -0
  759. package/src/three/jsx-dev-runtime.ts +27 -0
  760. package/src/three/jsx-runtime.ts +38 -0
  761. package/src/three/jsx.ts +275 -0
  762. package/src/three/materials.ts +270 -0
  763. package/src/three/math.ts +585 -0
  764. package/src/three/objects.ts +397 -0
  765. package/src/three/passes.ts +90 -0
  766. package/src/three/postprocess.ts +677 -0
  767. package/src/three/raycast.ts +189 -0
  768. package/src/three/react-reconciler.d.ts +50 -0
  769. package/src/three/reconciler.ts +624 -0
  770. package/src/three/renderer-direct.ts +1055 -0
  771. package/src/three/renderer-indirect.ts +570 -0
  772. package/src/three/store.ts +207 -0
  773. package/src/timeline/hx.ts +31 -0
  774. package/src/timeline/index.ts +603 -0
  775. package/src/tray-host/hx.ts +51 -0
  776. package/src/tray-host/index.ts +331 -0
  777. package/src/tray-host/manager.ts +639 -0
  778. package/src/tray-host/notify.ts +102 -0
  779. package/src/tray-host/protocol.ts +235 -0
  780. package/src/tree/hx.ts +51 -0
  781. package/src/tree/index.ts +1127 -0
  782. package/src/tree/internal.ts +87 -0
  783. package/src/tree/rows.ts +334 -0
  784. package/src/index.d.ts +0 -2
  785. package/src/index.js +0 -9
  786. package/src/sparkline/index.d.ts +0 -29
  787. package/src/sparkline/index.js +0 -50
  788. package/src/sparkline/node.js +0 -72
@@ -0,0 +1,287 @@
1
+ // Read the calendars the user's desktop already has, and hand them to a
2
+ // `<Calendar dayContent>`.
3
+ //
4
+ // The point of this module is that an app gets the user's real events —
5
+ // Google, Microsoft, CalDAV, local — without asking for a single credential
6
+ // and without an OAuth flow, because the desktop already did all of that. See
7
+ // `./eds.js` for how, and `../calendar/` for what to draw them on.
8
+ //
9
+ // Nothing here opens a D-Bus connection. `useSessionBus()` (or `sessionBus()`
10
+ // for the imperative path) hands over react-x11's shared one, so an app is one
11
+ // name on the bus however many features it turns on.
12
+ import { useCallback, useEffect, useMemo, useState } from 'react';
13
+ import { useSessionBus } from 'react-x11';
14
+
15
+ import { DesktopCalendar } from './eds.js';
16
+ import type {
17
+ CalendarChange,
18
+ DesktopCalendarError,
19
+ DesktopCalendarInfo,
20
+ DesktopEvent,
21
+ } from './eds.js';
22
+
23
+ export { DesktopCalendar, parseKeyFile } from './eds.js';
24
+ export type {
25
+ CalendarChange,
26
+ DesktopCalendarError,
27
+ DesktopCalendarInfo,
28
+ DesktopEvent,
29
+ EventsResult,
30
+ } from './eds.js';
31
+ export { IcalUnavailableError } from './ical.js';
32
+
33
+ const pad = (n: number): string => String(n).padStart(2, '0');
34
+
35
+ /**
36
+ * The local calendar day a `Date` falls on, as `'YYYY-MM-DD'`.
37
+ *
38
+ * Deliberately a local three-liner rather than an import from `../calendar/`:
39
+ * no component in this package imports another, because a lateral import
40
+ * makes the two one unit in a bundler's eyes and an app that wanted only the
41
+ * events would start paying for the grid. The **format** is the contract they
42
+ * share, not the function — these keys index straight into a `<Calendar>`'s
43
+ * `dayContent`.
44
+ */
45
+ function dayKeyOf(date: Date): string {
46
+ return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
47
+ }
48
+
49
+ /**
50
+ * Occurrences grouped by the local day they appear on — which is what a
51
+ * calendar grid actually renders.
52
+ *
53
+ * An all-day event spans `[start, end)` across possibly several days, and a
54
+ * timed one can cross midnight, so an event lands under **every** day it
55
+ * touches rather than only under its start.
56
+ */
57
+ export function byDay(events: DesktopEvent[]): Map<string, DesktopEvent[]> {
58
+ const days = new Map<string, DesktopEvent[]>();
59
+ for (const event of events) {
60
+ // `end` is exclusive, so a one-day all-day event ending at the next
61
+ // midnight must not also mark the next day.
62
+ const lastMs = Math.max(event.start.getTime(), event.end.getTime() - 1);
63
+ const last = new Date(lastMs);
64
+ const cursor = new Date(
65
+ event.start.getFullYear(),
66
+ event.start.getMonth(),
67
+ event.start.getDate(),
68
+ );
69
+ while (cursor <= last) {
70
+ const key = dayKeyOf(cursor);
71
+ const list = days.get(key);
72
+ if (list) list.push(event);
73
+ else days.set(key, [event]);
74
+ cursor.setDate(cursor.getDate() + 1);
75
+ }
76
+ }
77
+ return days;
78
+ }
79
+
80
+ export type DesktopCalendarStatus =
81
+ 'idle' | 'loading' | 'ready' | 'unavailable';
82
+
83
+ export interface UseDesktopCalendarEventsOptions {
84
+ /** Start of the window to read, inclusive. */
85
+ from: Date;
86
+ /** End of the window, exclusive. */
87
+ to: Date;
88
+ /** Restrict to these calendar UIDs. Default: every enabled calendar. */
89
+ calendars?: string[];
90
+ /** Re-query when the desktop says something in the range changed. */
91
+ watch?: boolean;
92
+ /** Set false to hold off entirely — a picker that is not open yet. */
93
+ enabled?: boolean;
94
+ }
95
+
96
+ export interface UseDesktopCalendarEventsResult {
97
+ events: DesktopEvent[];
98
+ /** The same events, keyed by `'YYYY-MM-DD'`, ready for `dayContent`. */
99
+ byDay: Map<string, DesktopEvent[]>;
100
+ /** Every calendar found, for a legend or a filter. */
101
+ calendars: DesktopCalendarInfo[];
102
+ /** Backends that would not answer. Not fatal; the rest still loaded. */
103
+ errors: DesktopCalendarError[];
104
+ status: DesktopCalendarStatus;
105
+ /** Why there are no events: no bus, or no `ical.js`. */
106
+ error: Error | null;
107
+ /** Re-query now. */
108
+ refresh: () => void;
109
+ }
110
+
111
+ const NO_EVENTS: DesktopEvent[] = [];
112
+ const NO_CALENDARS: DesktopCalendarInfo[] = [];
113
+ const NO_ERRORS: DesktopCalendarError[] = [];
114
+
115
+ /** The calendars a caller asked for by uid, or every enabled one. `onlyKey`
116
+ * is the comma-joined list, because an array prop is a new identity every
117
+ * render and these two effects are keyed on it. */
118
+ function pickCalendars(
119
+ all: DesktopCalendarInfo[],
120
+ onlyKey: string,
121
+ ): DesktopCalendarInfo[] {
122
+ if (!onlyKey) return all.filter((c) => c.enabled);
123
+ const wanted = new Set(onlyKey.split(','));
124
+ return all.filter((c) => wanted.has(c.uid));
125
+ }
126
+
127
+ /**
128
+ * The user's desktop calendar events, as rendering state.
129
+ *
130
+ * ```tsx
131
+ * const { byDay } = useDesktopCalendarEvents({ from, to });
132
+ *
133
+ * <Calendar
134
+ * dayContent={(day, state) =>
135
+ * byDay.get(day)?.slice(0, 3).map((ev) => (
136
+ * <box key={ev.uid} style={{ width: 4, height: 4, borderRadius: 2,
137
+ * backgroundColor: state.selected
138
+ * ? state.color
139
+ * : (ev.calendar.color ?? '$accent') }} />
140
+ * ))
141
+ * }
142
+ * />
143
+ * ```
144
+ *
145
+ * **`from` and `to` are read by their timestamps, not their identity**, so
146
+ * `new Date(...)` inline in the render is fine and will not re-query on every
147
+ * paint. That is the mistake this hook would otherwise invite, and it costs a
148
+ * D-Bus round trip per frame.
149
+ *
150
+ * `status` is `'unavailable'` when there is no session bus or `ical.js` is not
151
+ * installed — both are ordinary on a machine that simply does not have them,
152
+ * so neither throws, and `error` says which it was. Treat it as "no calendar
153
+ * integration here", not as a failure to report.
154
+ */
155
+ export function useDesktopCalendarEvents(
156
+ options: UseDesktopCalendarEventsOptions,
157
+ ): UseDesktopCalendarEventsResult {
158
+ const { from, to, calendars: only, watch = false, enabled = true } = options;
159
+ const { bus } = useSessionBus();
160
+
161
+ const [events, setEvents] = useState<DesktopEvent[]>(NO_EVENTS);
162
+ const [found, setFound] = useState<DesktopCalendarInfo[]>(NO_CALENDARS);
163
+ const [errors, setErrors] = useState<DesktopCalendarError[]>(NO_ERRORS);
164
+ const [status, setStatus] = useState<DesktopCalendarStatus>('idle');
165
+ const [error, setError] = useState<Error | null>(null);
166
+ const [nonce, setNonce] = useState(0);
167
+
168
+ const refresh = useCallback(() => setNonce((n) => n + 1), []);
169
+
170
+ // Timestamps, not the Date objects: a caller writing `from={new Date(y, m, 1)}`
171
+ // in the render body hands us a new identity every paint, and an effect keyed
172
+ // on that would re-query the bus on every frame.
173
+ const fromMs = from.getTime();
174
+ const toMs = to.getTime();
175
+ const onlyKey = only ? only.join(',') : '';
176
+
177
+ useEffect(() => {
178
+ if (!enabled) {
179
+ setStatus('idle');
180
+ return undefined;
181
+ }
182
+ if (!bus) {
183
+ // `useSessionBus` is still connecting, or there is no bus at all. Its
184
+ // own `status` distinguishes them; from here both mean "nothing yet".
185
+ setStatus('unavailable');
186
+ setEvents(NO_EVENTS);
187
+ return undefined;
188
+ }
189
+
190
+ let live = true;
191
+ const desktop = new DesktopCalendar(bus);
192
+
193
+ const run = async (): Promise<void> => {
194
+ setStatus('loading');
195
+ setError(null);
196
+ try {
197
+ const all = await desktop.listCalendars();
198
+ if (!live) return;
199
+ setFound(all);
200
+
201
+ const result = await desktop.eventsBetween(
202
+ new Date(fromMs),
203
+ new Date(toMs),
204
+ { calendars: pickCalendars(all, onlyKey) },
205
+ );
206
+ if (!live) return;
207
+ setEvents(result.events);
208
+ setErrors(result.errors);
209
+ setStatus('ready');
210
+ } catch (err) {
211
+ if (!live) return;
212
+ // No bus, no ical.js, no EDS on this desktop — all ordinary.
213
+ setError(err instanceof Error ? err : new Error(String(err)));
214
+ setEvents(NO_EVENTS);
215
+ setStatus('unavailable');
216
+ }
217
+ };
218
+
219
+ void run();
220
+
221
+ return () => {
222
+ live = false;
223
+ void desktop.dispose();
224
+ };
225
+ // `refresh` is stable; `nonce` is what a manual refresh moves.
226
+ }, [bus, enabled, fromMs, toMs, onlyKey, nonce, refresh]);
227
+
228
+ // The subscription is a **separate** effect, and deliberately not keyed on
229
+ // `nonce`: a change has to re-run the query, and only the query. Watching
230
+ // from inside the effect the change re-runs means every notification tears
231
+ // the views down and starts new ones — which is a loop as soon as anything
232
+ // is delivered while a view is starting, and was one for as long as
233
+ // `Start()` reported the range's existing contents as a change.
234
+ //
235
+ // The cost is one extra `listCalendars()` per range, not per refresh.
236
+ useEffect(() => {
237
+ if (!enabled || !watch || !bus) return undefined;
238
+
239
+ let live = true;
240
+ let stopWatching: (() => Promise<void>) | null = null;
241
+ const desktop = new DesktopCalendar(bus);
242
+
243
+ void (async () => {
244
+ try {
245
+ const all = await desktop.listCalendars();
246
+ if (!live) return;
247
+ stopWatching = await desktop.watch(
248
+ new Date(fromMs),
249
+ new Date(toMs),
250
+ () => {
251
+ // Re-query rather than patch: a recurrence master edited months
252
+ // away changes what this range looks like.
253
+ if (live) refresh();
254
+ },
255
+ { calendars: pickCalendars(all, onlyKey) },
256
+ );
257
+ if (!live) await stopWatching();
258
+ } catch {
259
+ // No bus, no EDS, nothing to watch. The query effect above is what
260
+ // reports that to the caller; a second copy of it would only race.
261
+ }
262
+ })();
263
+
264
+ return () => {
265
+ live = false;
266
+ void (async () => {
267
+ if (stopWatching) await stopWatching();
268
+ await desktop.dispose();
269
+ })();
270
+ };
271
+ }, [bus, enabled, watch, fromMs, toMs, onlyKey, refresh]);
272
+
273
+ const grouped = useMemo(() => byDay(events), [events]);
274
+
275
+ return {
276
+ events,
277
+ byDay: grouped,
278
+ calendars: found,
279
+ errors,
280
+ status,
281
+ error,
282
+ refresh,
283
+ };
284
+ }
285
+
286
+ /** A subscription that only reports *when* something changed. */
287
+ export type { CalendarChange as DesktopCalendarChange };
@@ -0,0 +1,311 @@
1
+ // The lifecycle both XEmbed wrappers have, with none of the vocabulary
2
+ // either of them has.
3
+ //
4
+ // `<Terminal>` and `<MediaPlayer>` are the same component twice: render a
5
+ // `<foreign>` with no `windowId` so it *adopts* whatever turns up inside it,
6
+ // take the container id `onReady` hands over, spawn a program that draws into
7
+ // that id, and hand the program back when the tree changes. Only the argv and
8
+ // the control channel differ, and those are what the two `backends.ts` files
9
+ // are for.
10
+ //
11
+ // Everything here is ordinary React state. The X part is one prop —
12
+ // `onReady` — because core's `<foreign>` already owns the protocol
13
+ // (react-x11#269, ntk#246): the reparent, the save set, `_XEMBED_INFO`, the
14
+ // synthetic ConfigureNotify, and handing the client back on unmount without
15
+ // ever destroying it.
16
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
17
+
18
+ import { nodeProcessHost } from './host.js';
19
+ import type { ExitInfo, ProcessHost, SpawnedProcess } from './host.js';
20
+
21
+ /**
22
+ * Where the child is in its life.
23
+ *
24
+ * `'unavailable'` is not an error state to report as a failure: a machine
25
+ * with no terminal emulator installed, or no mpv, is an ordinary machine.
26
+ * Both components render their `fallback` on it, the way
27
+ * `useDesktopCalendarEvents` reports "no bus, no ical.js" rather than
28
+ * throwing.
29
+ */
30
+ export type EmbedStatus =
31
+ 'idle' | 'starting' | 'running' | 'exited' | 'unavailable';
32
+
33
+ /**
34
+ * No backend for this component is installed.
35
+ *
36
+ * Thrown by a `PlanFactory`, caught by the hook, and turned into
37
+ * `status: 'unavailable'`. `tried` is what was looked for, so the message an
38
+ * app shows can name the install line rather than saying "not found".
39
+ */
40
+ export class BackendUnavailableError extends Error {
41
+ readonly tried: readonly string[];
42
+
43
+ constructor(what: string, tried: readonly string[]) {
44
+ super(
45
+ `@react-x11/components: no ${what} backend is installed — looked for ` +
46
+ `${tried.join(', ')}. Install one, or pass \`fallback\` to render ` +
47
+ 'something else.',
48
+ );
49
+ this.name = 'BackendUnavailableError';
50
+ this.tried = tried;
51
+ }
52
+ }
53
+
54
+ /** What to run, and what to do with it once it is running. */
55
+ export interface LaunchPlan {
56
+ /** Absolute path or a name on `PATH`. */
57
+ command: string;
58
+ args: readonly string[];
59
+ cwd?: string;
60
+ env?: Record<string, string | undefined>;
61
+ /** Which backend this plan chose, for `onBackend` and the handle. */
62
+ backend?: string;
63
+ /**
64
+ * Attach a control channel now that the process exists. Its return value is
65
+ * called at teardown, before the process is signalled.
66
+ */
67
+ attach?(
68
+ process: SpawnedProcess,
69
+ ): void | (() => void) | Promise<void | (() => void)>;
70
+ /** Always run at teardown — temporary directories, sockets. */
71
+ dispose?(): void | Promise<void>;
72
+ }
73
+
74
+ export interface PlanContext {
75
+ /** The `<foreign>` container the program must draw into. */
76
+ windowId: number;
77
+ host: ProcessHost;
78
+ }
79
+
80
+ /** Builds the command line, once the window to draw into exists. */
81
+ export type PlanFactory = (context: PlanContext) => Promise<LaunchPlan>;
82
+
83
+ export interface UseEmbeddedClientOptions {
84
+ /**
85
+ * **Must be referentially stable for as long as the child should keep
86
+ * running.** A new identity is the restart signal — that is how "the
87
+ * command changed" reaches a program that cannot be reconfigured in place —
88
+ * so a factory rebuilt every render restarts the child every render.
89
+ *
90
+ * Both components build theirs with `useMemo` over a *string* key rather
91
+ * than over the props themselves, because `command={['bash']}` is a new
92
+ * array on every paint and an effect keyed on that never settles. Same
93
+ * reason `useDesktopCalendarEvents` keys on `from.getTime()`.
94
+ */
95
+ plan: PlanFactory;
96
+ /** Defaults to `nodeProcessHost()`. */
97
+ host?: ProcessHost;
98
+ /** False holds off entirely — a pane that is not visible yet. */
99
+ enabled?: boolean;
100
+ /** Sent on unmount and on restart. Default `SIGTERM`. */
101
+ stopSignal?: string;
102
+ onStart?: (info: { process: SpawnedProcess; backend?: string }) => void;
103
+ onExit?: (info: ExitInfo) => void;
104
+ /** Spawn failures and missing backends alike. */
105
+ onError?: (err: Error) => void;
106
+ }
107
+
108
+ export interface EmbeddedClient {
109
+ status: EmbedStatus;
110
+ /** The last failure, including a `BackendUnavailableError`. */
111
+ error: Error | null;
112
+ pid: number | null;
113
+ /** The container window, once `<foreign>` has one. */
114
+ windowId: number | null;
115
+ /** Which backend the plan picked. */
116
+ backend: string | null;
117
+ /** Wire straight to `<foreign onReady>`. */
118
+ handleReady: (info: { windowId: number }) => void;
119
+ /** Stop the child and start it again with a freshly built plan. */
120
+ restart: () => void;
121
+ /** Signal the child. `false` if there is not one. */
122
+ signal: (signal?: string) => boolean;
123
+ }
124
+
125
+ /**
126
+ * Run a program inside a `<foreign>`.
127
+ *
128
+ * ```jsx
129
+ * const client = useEmbeddedClient({ plan });
130
+ * return <foreign onReady={client.handleReady} style={{ flexGrow: 1 }} />;
131
+ * ```
132
+ *
133
+ * The `<foreign>` is rendered by the caller rather than here, because the
134
+ * element's props — style, focus, the `onEmbedded`/`onClientGone` handlers a
135
+ * component may want to compose with — belong to the component, not to the
136
+ * lifecycle.
137
+ */
138
+ export function useEmbeddedClient(
139
+ options: UseEmbeddedClientOptions,
140
+ ): EmbeddedClient {
141
+ const { plan, enabled = true, stopSignal = 'SIGTERM' } = options;
142
+ const host = useMemo(() => options.host ?? nodeProcessHost(), [options.host]);
143
+
144
+ const [windowId, setWindowId] = useState<number | null>(null);
145
+ const [status, setStatus] = useState<EmbedStatus>('idle');
146
+ const [error, setError] = useState<Error | null>(null);
147
+ const [pid, setPid] = useState<number | null>(null);
148
+ const [backend, setBackend] = useState<string | null>(null);
149
+ const [generation, setGeneration] = useState(0);
150
+
151
+ // The live child, for `signal()`. A ref rather than state because a caller
152
+ // reaching for it through a handle is not rendering, and re-rendering the
153
+ // tree because a pid arrived would be work for nothing.
154
+ const processRef = useRef<SpawnedProcess | null>(null);
155
+
156
+ // Handlers are read at the moment they fire, so a component that passes a
157
+ // fresh arrow function every render does not restart its child.
158
+ const handlers = useRef(options);
159
+ handlers.current = options;
160
+
161
+ const handleReady = useCallback((info: { windowId: number }) => {
162
+ setWindowId(info.windowId);
163
+ }, []);
164
+
165
+ const restart = useCallback(() => setGeneration((n) => n + 1), []);
166
+
167
+ const signal = useCallback((sig = 'SIGTERM') => {
168
+ const child = processRef.current;
169
+ return child ? child.kill(sig) : false;
170
+ }, []);
171
+
172
+ useEffect(() => {
173
+ if (!enabled || windowId === null) {
174
+ setStatus('idle');
175
+ return undefined;
176
+ }
177
+
178
+ let live = true;
179
+ let child: SpawnedProcess | null = null;
180
+ let detach: (() => void) | void;
181
+ let planned: LaunchPlan | null = null;
182
+
183
+ const fail = (err: unknown, next: EmbedStatus): void => {
184
+ const wrapped = err instanceof Error ? err : new Error(String(err));
185
+ if (!live) return;
186
+ setError(wrapped);
187
+ setStatus(next);
188
+ handlers.current.onError?.(wrapped);
189
+ };
190
+
191
+ void (async () => {
192
+ setStatus('starting');
193
+ setError(null);
194
+ try {
195
+ planned = await plan({ windowId, host });
196
+ } catch (err) {
197
+ // "no xterm on this machine" is not the same kind of news as "spawn
198
+ // failed", and only one of the two is worth a fallback.
199
+ fail(
200
+ err,
201
+ err instanceof BackendUnavailableError ? 'unavailable' : 'exited',
202
+ );
203
+ return;
204
+ }
205
+ if (!live) {
206
+ await planned.dispose?.();
207
+ return;
208
+ }
209
+
210
+ try {
211
+ child = await host.spawn(planned.command, planned.args, {
212
+ cwd: planned.cwd,
213
+ env: planned.env,
214
+ });
215
+ } catch (err) {
216
+ await planned.dispose?.();
217
+ fail(err, 'exited');
218
+ return;
219
+ }
220
+
221
+ // Unmounted while `spawn` was in flight: nothing rendered it, so
222
+ // nothing should outlive it.
223
+ if (!live) {
224
+ child.kill(stopSignal);
225
+ await planned.dispose?.();
226
+ return;
227
+ }
228
+
229
+ processRef.current = child;
230
+ setPid(child.pid);
231
+ setBackend(planned.backend ?? null);
232
+ setStatus('running');
233
+
234
+ child.onExit((info) => {
235
+ if (!live) return;
236
+ processRef.current = null;
237
+ setStatus('exited');
238
+ setPid(null);
239
+ handlers.current.onExit?.(info);
240
+ });
241
+ child.onError((err) => fail(err, 'exited'));
242
+
243
+ handlers.current.onStart?.({ process: child, backend: planned.backend });
244
+
245
+ try {
246
+ const opened = await planned.attach?.(child);
247
+ // Opening a control channel can take seconds — the socket does not
248
+ // exist until the player creates it — so the teardown below may
249
+ // already have run with nothing to tear down. Closing it here is the
250
+ // only chance there will be.
251
+ if (live) detach = opened;
252
+ else opened?.();
253
+ } catch (err) {
254
+ // A control channel that would not open is a degraded player, not a
255
+ // dead one: the video is already on screen.
256
+ fail(err, 'running');
257
+ }
258
+ })();
259
+
260
+ return () => {
261
+ live = false;
262
+ processRef.current = null;
263
+ // Order matters: drop the control channel first, so a socket close
264
+ // triggered by the signal is not reported as the player failing.
265
+ try {
266
+ detach?.();
267
+ } catch {
268
+ // a channel that is already gone
269
+ }
270
+ child?.kill(stopSignal);
271
+ void planned?.dispose?.();
272
+ };
273
+ // `plan` is the restart signal — see the note on the option.
274
+ }, [enabled, windowId, plan, host, stopSignal, generation]);
275
+
276
+ return {
277
+ status,
278
+ error,
279
+ pid,
280
+ windowId,
281
+ backend,
282
+ handleReady,
283
+ restart,
284
+ signal,
285
+ };
286
+ }
287
+
288
+ /**
289
+ * The first of `candidates` that is installed, or a `BackendUnavailableError`
290
+ * naming all of them.
291
+ *
292
+ * Auto-detection rather than a hard dependency is the whole reason both
293
+ * components take a `backend` prop that defaults to `'auto'`: this package
294
+ * cannot depend on a binary, and most machines have exactly one of the ones
295
+ * it can drive.
296
+ */
297
+ export async function resolveBackend<T extends { binaries: readonly string[] }>(
298
+ host: ProcessHost,
299
+ what: string,
300
+ candidates: readonly T[],
301
+ ): Promise<{ backend: T; path: string }> {
302
+ const tried: string[] = [];
303
+ for (const backend of candidates) {
304
+ for (const binary of backend.binaries) {
305
+ tried.push(binary);
306
+ const path = await host.which(binary);
307
+ if (path) return { backend, path };
308
+ }
309
+ }
310
+ throw new BackendUnavailableError(what, tried);
311
+ }