@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,368 @@
1
+ // <DatePicker> — a <Calendar> on a <popup>, hung off a field that shows the
2
+ // current date. Ported from react-x11's `src/components/DatePicker.js`.
3
+ import React, { useRef, useState } from 'react';
4
+ import type { ReactElement } from 'react';
5
+ import { createStyles } from 'react-x11/style';
6
+ import type { Style, StyleProperties } from 'react-x11/style';
7
+ import { useAnchor, useAnchorTracking, useTheme } from 'react-x11';
8
+ import type {
9
+ AnchorOptions,
10
+ AnchorRect,
11
+ DrawnNode,
12
+ KeyboardEvent,
13
+ } from 'react-x11';
14
+ import { XK_DOWN, XK_ESCAPE, XK_RETURN, XK_UP } from 'react-x11/keysyms';
15
+
16
+ import { hx } from '../internal/hx.js';
17
+ import { useDismissOnWindowBlur } from '../internal/widget.js';
18
+ import type { WidgetChangeEvent } from '../internal/widget.js';
19
+ import { CALENDAR_HEIGHT, CALENDAR_WIDTH, Calendar } from './Calendar.js';
20
+ import type {
21
+ CalendarHandle,
22
+ CalendarProps,
23
+ DateRange,
24
+ DateRangeInput,
25
+ } from './Calendar.js';
26
+ import { formatDay, formatDayRange, toDay } from './dates.js';
27
+ import type { DayInput } from './dates.js';
28
+
29
+ // A hairline round the sheet, as the menus and `Select` use: this border is
30
+ // where the popup meets the desktop, not a control's outline, so a theme that
31
+ // draws 2px borders on its buttons does not get a 2px frame here.
32
+ const SHEET_BORDER = 1;
33
+
34
+ /**
35
+ * `'@supports transparency'` is a real style block — react-x11 answers it from
36
+ * whether the display gave the window an ARGB visual — but its `Style` type
37
+ * models only the `@width`/`@height` size queries and the `:state` blocks. So
38
+ * the block is spelled out here rather than by augmenting `StyleBlocks`
39
+ * globally: this package should not quietly widen what type-checks in an app
40
+ * that merely installs it.
41
+ */
42
+ type SupportsStyle = Style & {
43
+ '@supports transparency'?: StyleProperties;
44
+ };
45
+
46
+ const s = createStyles({
47
+ trigger: {
48
+ flexDirection: 'row',
49
+ alignItems: 'center',
50
+ gap: 8,
51
+ padding: 8,
52
+ paddingLeft: 10,
53
+ paddingRight: 10,
54
+ cursor: 'pointer',
55
+ },
56
+ label: { flexGrow: 1 },
57
+ icon: { width: 14, height: 14, flexShrink: 0 },
58
+ sheet: { flexGrow: 1, flexShrink: 1, borderWidth: SHEET_BORDER },
59
+ });
60
+
61
+ /** A wall calendar, 14×14: the page, its two hangers and the ruled week. */
62
+ function CalendarGlyph({ color }: { color: string }): ReactElement {
63
+ return hx('canvas', {
64
+ style: s.icon,
65
+ onDraw: (ctx, { width, height }) => {
66
+ ctx.strokeStyle = color;
67
+ ctx.lineWidth = 1;
68
+ ctx.strokeRect(0.5, 2.5, width - 1, height - 3);
69
+ ctx.beginPath();
70
+ ctx.moveTo(0.5, 6.5);
71
+ ctx.lineTo(width - 0.5, 6.5);
72
+ ctx.moveTo(4.5, 0.5);
73
+ ctx.lineTo(4.5, 3.5);
74
+ ctx.moveTo(width - 4.5, 0.5);
75
+ ctx.lineTo(width - 4.5, 3.5);
76
+ ctx.stroke();
77
+ },
78
+ });
79
+ }
80
+
81
+ /** What the trigger says, when the app has not said it itself. */
82
+ function defaultFormat(
83
+ mode: string,
84
+ value: unknown,
85
+ locale: string | undefined,
86
+ ): string | null {
87
+ if (mode === 'range') {
88
+ const range = (value ?? {}) as DateRangeInput;
89
+ const start = toDay(range.start);
90
+ const end = toDay(range.end);
91
+ if (!start) return null;
92
+ if (!end) return `${formatDay(start, locale)} → …`;
93
+ return formatDayRange(start, end, locale);
94
+ }
95
+ const day = toDay(value as DayInput);
96
+ return day ? formatDay(day, locale) : null;
97
+ }
98
+
99
+ type PickerOwnProps = {
100
+ /** What the trigger shows. Defaults to the locale's medium date, and
101
+ * `Intl`'s own range format when there are two of them. */
102
+ format?: (value: unknown) => string | null;
103
+ /** Shown when nothing is picked yet. */
104
+ placeholder?: string;
105
+ disabled?: boolean;
106
+ style?: Style | Style[];
107
+ };
108
+
109
+ /**
110
+ * `Omit` over a union collapses it into one member, which would cost the
111
+ * picker the thing that makes it pleasant to use: `mode` discriminating
112
+ * single from range, and with it the type of the `onChange` parameter. So the
113
+ * omit is distributed across the union instead, and `<DatePicker mode="range"
114
+ * onChange={(ev) => …}>` still knows `ev.value` is a `DateRange`.
115
+ */
116
+ type DistributiveOmit<T, K extends PropertyKey> = T extends unknown
117
+ ? Omit<T, K>
118
+ : never;
119
+
120
+ export type DatePickerProps = DistributiveOmit<
121
+ CalendarProps,
122
+ 'focusable' | 'focusVisible' | 'ref' | 'style'
123
+ > &
124
+ PickerOwnProps;
125
+
126
+ /**
127
+ * <DatePicker value onChange …boxProps> — a `<Calendar>` on a `<popup>`, hung
128
+ * off a field that shows the current date.
129
+ *
130
+ * <DatePicker value={day} onChange={(ev) => setDay(ev.value)} />
131
+ * <DatePicker mode="range" value={span} onChange={…} max="2026-12-31" />
132
+ *
133
+ * Every calendar prop passes straight through — `mode`, `min`/`max`,
134
+ * `isDateBlocked`, `spanBlocked`, `dayContent`, `locale`, `weekStartsOn` — and
135
+ * the value has the same shape here as there: a `'YYYY-MM-DD'` day, or
136
+ * `{ start, end }` in range mode.
137
+ *
138
+ * The calendar opens on the **press**, not the release, for the reason
139
+ * `Select`'s menu does: a control whose whole purpose is to be looked at has
140
+ * nothing to gain from waiting out the length of the click. It closes when the
141
+ * value is complete — the day in single mode, the second end of a range — on
142
+ * Escape, on a second press of the trigger, and when the window loses focus.
143
+ *
144
+ * The popup is override-redirect and never takes focus, so the **trigger keeps
145
+ * the keyboard** and hands the calendar its keys: Down/Up/Enter/Space open it,
146
+ * and once it is open everything the grid understands (arrows, Home/End,
147
+ * PageUp/PageDown, Enter, Space) goes there. Escape and Tab stay here, which
148
+ * is why `handleKey` reports whether it took the key.
149
+ *
150
+ * `format(value)` is the seam for the label: the default is the locale's
151
+ * medium date, and `Intl`'s own range format when there are two of them, which
152
+ * collapses the parts the ends share ("7 – 12 Aug 2026").
153
+ */
154
+ export function DatePicker(props: DatePickerProps): ReactElement {
155
+ const {
156
+ mode = 'single',
157
+ value,
158
+ defaultValue,
159
+ onChange,
160
+ name,
161
+ month,
162
+ defaultMonth,
163
+ onMonthChange,
164
+ min,
165
+ max,
166
+ isDateBlocked,
167
+ spanBlocked,
168
+ dayContent,
169
+ locale,
170
+ weekStartsOn,
171
+ format,
172
+ placeholder,
173
+ disabled = false,
174
+ style,
175
+ ...boxProps
176
+ } = props as DatePickerProps & {
177
+ mode?: string;
178
+ value?: unknown;
179
+ defaultValue?: unknown;
180
+ onChange?: (ev: WidgetChangeEvent<unknown>) => void;
181
+ };
182
+
183
+ const theme = useTheme();
184
+ const [open, setOpen] = useState(false);
185
+ // `AnchorRect` rather than `Rect`: `useAnchorTracking` reports the side the
186
+ // sheet actually landed on (react-x11#280), and its `setRect` is typed to
187
+ // hand that back. Nothing here reads `placement` — the sheet has no arrow
188
+ // to aim — but the state has to be able to hold it.
189
+ const [anchor, setAnchor] = useState<AnchorRect | null>(null);
190
+ const [focused, setFocused] = useState(false);
191
+ const [ownValue, setOwnValue] = useState<unknown>(defaultValue ?? null);
192
+ const triggerRef = useRef<DrawnNode | null>(null);
193
+ const calendarRef = useRef<CalendarHandle | null>(null);
194
+
195
+ const measureAnchor = useAnchor(triggerRef);
196
+ const current = value === undefined ? ownValue : value;
197
+
198
+ const width = CALENDAR_WIDTH + SHEET_BORDER * 2;
199
+ const height = CALENDAR_HEIGHT + SHEET_BORDER * 2;
200
+ const anchorOptions = (): AnchorOptions => ({
201
+ placement: 'bottom',
202
+ width,
203
+ height,
204
+ });
205
+
206
+ const close = (): void => setOpen(false);
207
+ const openCalendar = (): void => {
208
+ const rect = measureAnchor(anchorOptions());
209
+ if (!rect) return;
210
+ setAnchor(rect);
211
+ setOpen(true);
212
+ };
213
+ const toggle = (): void => (open ? close() : openCalendar());
214
+
215
+ // the same two the other popups take: keep the sheet under the trigger while
216
+ // anything moves it, and shut it when the window itself loses focus (the
217
+ // trigger keeps its focus, so its own onBlur never hears about that)
218
+ useAnchorTracking(triggerRef, open, anchorOptions, setAnchor, close);
219
+ useDismissOnWindowBlur(triggerRef, open, close);
220
+
221
+ const handleChange = (ev: WidgetChangeEvent<unknown>): void => {
222
+ if (value === undefined) setOwnValue(ev.value);
223
+ onChange?.(ev);
224
+ // a half-picked range is the one selection that is not finished, and the
225
+ // calendar has to stay up for the other end of it
226
+ if (mode !== 'range' || (ev.value as DateRange | null)?.end) close();
227
+ };
228
+
229
+ const onKeyDown = (ev: KeyboardEvent): void => {
230
+ if (ev.keysym === XK_ESCAPE) {
231
+ if (open) close();
232
+ return;
233
+ }
234
+ if (open && calendarRef.current?.handleKey(ev)) return;
235
+ if (
236
+ ev.keysym === XK_DOWN ||
237
+ ev.keysym === XK_UP ||
238
+ ev.keysym === XK_RETURN ||
239
+ ev.codepoint === 32
240
+ ) {
241
+ if (!open) openCalendar();
242
+ }
243
+ };
244
+
245
+ const label = format ? format(current) : defaultFormat(mode, current, locale);
246
+ const empty = label == null || label === '';
247
+ const text = empty
248
+ ? (placeholder ?? (mode === 'range' ? 'Pick dates…' : 'Pick a date…'))
249
+ : label;
250
+
251
+ return hx(
252
+ 'box',
253
+ {
254
+ theme,
255
+ role: 'combobox',
256
+ 'aria-expanded': Boolean(open),
257
+ 'aria-haspopup': 'dialog',
258
+ disabled: disabled || undefined,
259
+ ref: triggerRef,
260
+ focusable: !disabled,
261
+ onMouseDown: disabled ? undefined : toggle,
262
+ onFocus: () => setFocused(true),
263
+ onBlur: () => {
264
+ setFocused(false);
265
+ close();
266
+ },
267
+ onKeyDown: disabled ? undefined : onKeyDown,
268
+ ...boxProps,
269
+ style: [
270
+ s.trigger,
271
+ {
272
+ cursor: disabled ? 'default' : 'pointer',
273
+ borderWidth: theme.borderWidth,
274
+ borderRadius: theme.radius,
275
+ borderColor: focused || open ? theme.borderFocus : theme.border,
276
+ backgroundColor: disabled ? theme.surfaceHover : theme.background,
277
+ },
278
+ // hover and press say "this opens", so they belong to the trigger
279
+ // while it is shut and are simply not declared once the calendar is
280
+ // down — a state block always outranks the base style, so the only
281
+ // way for the open look to win is for nothing to be competing
282
+ !disabled &&
283
+ !open && {
284
+ ':hover': { backgroundColor: theme.surfaceHover },
285
+ ':active': { backgroundColor: theme.surfaceActive },
286
+ },
287
+ style,
288
+ ],
289
+ },
290
+ hx(
291
+ 'text',
292
+ {
293
+ style: [
294
+ s.label,
295
+ { color: disabled || empty ? theme.textMuted : theme.text },
296
+ ],
297
+ },
298
+ text,
299
+ ),
300
+ React.createElement(CalendarGlyph, {
301
+ color: disabled ? theme.border : theme.textMuted,
302
+ }),
303
+ open &&
304
+ anchor &&
305
+ hx(
306
+ 'popup',
307
+ {
308
+ theme,
309
+ x: anchor.x,
310
+ y: anchor.y,
311
+ width,
312
+ height,
313
+ grab: true,
314
+ onDismiss: close,
315
+ // ARGB where the display has it, so the corners the sheet gives up
316
+ // are the desktop rather than a colour. The window paints nothing
317
+ // itself when it can be seen through — the box below is the whole
318
+ // of the sheet, and a square fill under it would put the corners
319
+ // straight back.
320
+ transparent: true,
321
+ style: {
322
+ backgroundColor: theme.background,
323
+ '@supports transparency': { backgroundColor: 'transparent' },
324
+ } as SupportsStyle,
325
+ },
326
+ hx(
327
+ 'box',
328
+ {
329
+ style: [
330
+ s.sheet,
331
+ {
332
+ borderColor: theme.border,
333
+ backgroundColor: theme.background,
334
+ '@supports transparency': { borderRadius: theme.radiusPopup },
335
+ } as SupportsStyle,
336
+ ],
337
+ },
338
+ React.createElement(Calendar, {
339
+ ref: calendarRef,
340
+ mode,
341
+ value: current,
342
+ onChange: handleChange,
343
+ name,
344
+ month,
345
+ defaultMonth,
346
+ onMonthChange,
347
+ min,
348
+ max,
349
+ isDateBlocked,
350
+ spanBlocked,
351
+ dayContent,
352
+ locale,
353
+ weekStartsOn,
354
+ // The trigger owns the keyboard: the popup is override-redirect
355
+ // and never takes focus, so a focusable grid inside it would take
356
+ // focus on the press instead — blurring the trigger, whose onBlur
357
+ // closes the sheet, unmounting the day under the pointer before
358
+ // the release could turn into a click.
359
+ focusable: false,
360
+ // …and because it does not hold the focus, it would not draw the
361
+ // day cursor either, leaving the arrow keys moving something
362
+ // invisible.
363
+ focusVisible: true,
364
+ } as CalendarProps),
365
+ ),
366
+ ),
367
+ );
368
+ }
@@ -0,0 +1,307 @@
1
+ // Calendar days, and the arithmetic the date widgets do on them.
2
+ //
3
+ // Vendored from react-x11's `src/components/dates.js` when `<Calendar>` moved
4
+ // out here. It is pure — no renderer, no ntk, no React — which is what made
5
+ // the move cheap, and core is expected to drop its copy. Divergence is fine
6
+ // and expected; this is the owner now.
7
+ //
8
+ // **A day here is a string, `'2026-08-07'`, not a `Date`.** A date picker
9
+ // selects a square on a wall calendar, and that is not an instant: it has no
10
+ // time, no zone, and no duration that survives a DST boundary. A `Date` is an
11
+ // instant, so every comparison the widgets need — is this the selected day, is
12
+ // it inside the range, is it blocked — would be a comparison of two timestamps
13
+ // that are only equal if both were built the same way. `new Date(2026, 7, 7)`
14
+ // and `new Date('2026-08-07')` are eleven hours apart in Sydney and neither is
15
+ // wrong.
16
+ //
17
+ // A string has none of that: `a === b` is "the same day", `a < b` is "earlier"
18
+ // (fixed-width fields, so lexical order *is* chronological order), it is a
19
+ // `Map`/`Set` key without a codec, and it is what a calendar API hands back
20
+ // over the wire in the first place — which is exactly the shape the desktop
21
+ // event overlay in `../desktop-calendar/` produces.
22
+ //
23
+ // `Date` is still accepted everywhere a day is taken: `toDay()` converts one
24
+ // using its **local** calendar day, because that is the day the user was
25
+ // looking at when they built it.
26
+ //
27
+ // The arithmetic runs in UTC (`Date.UTC`, `getUTC*`) so that "add a day" is
28
+ // always 86400 seconds and never 23 or 25 — the local-time trap that puts a
29
+ // month grid an hour out on the last Sunday in October.
30
+
31
+ /** A calendar day, `'YYYY-MM-DD'`. */
32
+ export type CalendarDay = string;
33
+
34
+ /** A calendar month, `'YYYY-MM'`. */
35
+ export type CalendarMonth = string;
36
+
37
+ /** What every day-shaped prop accepts. */
38
+ export type DayInput = CalendarDay | Date | null | undefined;
39
+
40
+ /** The parts of a day, so a caller does not have to parse the string. */
41
+ export interface DayParts {
42
+ year: number;
43
+ /** 1-based, unlike `Date`'s. */
44
+ month: number;
45
+ day: number;
46
+ /** `0`-`6` from Sunday, as `Date#getDay()` counts. */
47
+ weekday: number;
48
+ date: Date;
49
+ }
50
+
51
+ const DAY_RE = /^(\d{4})-(\d{2})-(\d{2})$/;
52
+ const MONTH_RE = /^(\d{4})-(\d{2})$/;
53
+
54
+ function pad(n: number, width: number): string {
55
+ return String(n).padStart(width, '0');
56
+ }
57
+
58
+ function key(year: number, month: number, day: number): CalendarDay {
59
+ return `${pad(year, 4)}-${pad(month, 2)}-${pad(day, 2)}`;
60
+ }
61
+
62
+ /**
63
+ * A day key from a `'YYYY-MM-DD'` string, a `Date`, or `null`/`undefined`
64
+ * (which is "no day", and comes back as `null`).
65
+ *
66
+ * Throws on anything else, and on a string that is not a real date —
67
+ * `'2026-02-30'` is a typo, not a day, and silently sliding it to March 2nd
68
+ * the way `new Date()` does is how a booking ends up a day out. The message
69
+ * names what arrived, because the value in a props object is usually miles
70
+ * from the line that built it.
71
+ */
72
+ export function toDay(value: DayInput): CalendarDay | null {
73
+ if (value == null) return null;
74
+ if (value instanceof Date) {
75
+ if (Number.isNaN(value.getTime())) {
76
+ throw new TypeError(
77
+ '@react-x11/components: an Invalid Date was passed where a calendar day was expected.',
78
+ );
79
+ }
80
+ // its *local* calendar day: `new Date(2026, 7, 7)` is local midnight, and
81
+ // the day the developer wrote down is the one they meant
82
+ return key(value.getFullYear(), value.getMonth() + 1, value.getDate());
83
+ }
84
+ if (typeof value === 'string') {
85
+ const m = DAY_RE.exec(value);
86
+ if (!m) {
87
+ throw new TypeError(
88
+ `@react-x11/components: expected a calendar day as 'YYYY-MM-DD' or a Date, got ${JSON.stringify(value)}.`,
89
+ );
90
+ }
91
+ const [, y, mo, d] = m;
92
+ // through a real Date and back: the fields on their own are well-formed
93
+ // for '2026-02-30' too, and only the calendar knows February ends earlier
94
+ const date = new Date(Date.UTC(Number(y), Number(mo) - 1, Number(d)));
95
+ const round = key(
96
+ date.getUTCFullYear(),
97
+ date.getUTCMonth() + 1,
98
+ date.getUTCDate(),
99
+ );
100
+ if (round !== value) {
101
+ throw new TypeError(
102
+ `@react-x11/components: ${JSON.stringify(value)} is not a real calendar date.`,
103
+ );
104
+ }
105
+ return value;
106
+ }
107
+ throw new TypeError(
108
+ `@react-x11/components: expected a calendar day as 'YYYY-MM-DD' or a Date, got ${typeof value}.`,
109
+ );
110
+ }
111
+
112
+ /** `'YYYY-MM'` from the same set of inputs, for the *visible month* props. */
113
+ export function toMonth(value: DayInput): CalendarMonth | null {
114
+ if (value == null) return null;
115
+ if (typeof value === 'string' && MONTH_RE.test(value)) return value;
116
+ const day = toDay(value);
117
+ return day == null ? null : monthOf(day);
118
+ }
119
+
120
+ /** Today, on this machine, in local time — which is the day the user's wall
121
+ * calendar is showing. */
122
+ export function today(): CalendarDay {
123
+ const now = new Date();
124
+ return key(now.getFullYear(), now.getMonth() + 1, now.getDate());
125
+ }
126
+
127
+ /** The day as a UTC-midnight `Date`, for `Intl` and for arithmetic. */
128
+ export function dayDate(day: CalendarDay): Date {
129
+ const [y, m, d] = day.split('-').map(Number);
130
+ return new Date(Date.UTC(y, m - 1, d));
131
+ }
132
+
133
+ /**
134
+ * `{ year, month, day, weekday, date }` — the parts a caller needs to decide
135
+ * something about a day without parsing the string itself. `weekday` is
136
+ * `0`-`6` from Sunday, as `Date#getDay()` counts, so blocking weekends is
137
+ * `weekday === 0 || weekday === 6`. `month` is 1-based, unlike `Date`'s.
138
+ */
139
+ export function dayParts(day: CalendarDay): DayParts {
140
+ const date = dayDate(day);
141
+ return {
142
+ year: date.getUTCFullYear(),
143
+ month: date.getUTCMonth() + 1,
144
+ day: date.getUTCDate(),
145
+ weekday: date.getUTCDay(),
146
+ date,
147
+ };
148
+ }
149
+
150
+ export function addDays(day: CalendarDay, n: number): CalendarDay {
151
+ const date = dayDate(day);
152
+ date.setUTCDate(date.getUTCDate() + n);
153
+ return key(date.getUTCFullYear(), date.getUTCMonth() + 1, date.getUTCDate());
154
+ }
155
+
156
+ /** `'2026-08'` — the month a day is in. */
157
+ export function monthOf(day: CalendarDay): CalendarMonth {
158
+ return day.slice(0, 7);
159
+ }
160
+
161
+ /** The first day of a `'YYYY-MM'`. */
162
+ export function firstOfMonth(month: CalendarMonth): CalendarDay {
163
+ return `${month}-01`;
164
+ }
165
+
166
+ /**
167
+ * `n` months on from a `'YYYY-MM'`. Months, unlike days, are not all the same
168
+ * length, so this deliberately works on the month key and never on a day: the
169
+ * "same date next month" question (Jan 31 → Feb 31?) has no good answer and
170
+ * nothing here asks it.
171
+ */
172
+ export function addMonths(month: CalendarMonth, n: number): CalendarMonth {
173
+ const [y, m] = month.split('-').map(Number);
174
+ const total = y * 12 + (m - 1) + n;
175
+ return `${pad(Math.floor(total / 12), 4)}-${pad((total % 12) + 1, 2)}`;
176
+ }
177
+
178
+ /** `day` held inside `[min, max]`; either bound may be null. */
179
+ export function clampDay(
180
+ day: CalendarDay,
181
+ min: CalendarDay | null,
182
+ max: CalendarDay | null,
183
+ ): CalendarDay {
184
+ if (min && day < min) return min;
185
+ if (max && day > max) return max;
186
+ return day;
187
+ }
188
+
189
+ /**
190
+ * The grid a month is drawn on: **six weeks of seven days**, always, starting
191
+ * on `weekStartsOn` and running through whatever days of the neighbouring
192
+ * months it takes to fill the corners.
193
+ *
194
+ * Six rows even when five would do (and a 28-day February starting on the
195
+ * first day of the week needs only four) because the alternative is a picker
196
+ * whose popup changes height as you page through it, moving the very buttons
197
+ * the pointer is aiming at.
198
+ */
199
+ export function monthGrid(
200
+ month: CalendarMonth,
201
+ weekStartsOn = 1,
202
+ ): CalendarDay[][] {
203
+ const first = firstOfMonth(month);
204
+ const lead = (dayParts(first).weekday - weekStartsOn + 7) % 7;
205
+ const start = addDays(first, -lead);
206
+ const weeks: CalendarDay[][] = [];
207
+ for (let w = 0; w < 6; w++) {
208
+ const days: CalendarDay[] = [];
209
+ for (let d = 0; d < 7; d++) days.push(addDays(start, w * 7 + d));
210
+ weeks.push(days);
211
+ }
212
+ return weeks;
213
+ }
214
+
215
+ // Intl formatters are expensive to build and every cell in the grid wants the
216
+ // same three, so they are made once per (locale, shape) and kept.
217
+ const formatters = new Map<string, Intl.DateTimeFormat>();
218
+
219
+ function formatter(
220
+ locale: string | undefined,
221
+ options: Intl.DateTimeFormatOptions,
222
+ ): Intl.DateTimeFormat {
223
+ const id = `${locale ?? ''}|${JSON.stringify(options)}`;
224
+ let f = formatters.get(id);
225
+ if (!f) {
226
+ // everything here is a UTC-midnight Date, so the formatter has to read it
227
+ // in UTC or a negative offset prints the day before
228
+ f = new Intl.DateTimeFormat(locale, { ...options, timeZone: 'UTC' });
229
+ formatters.set(id, f);
230
+ }
231
+ return f;
232
+ }
233
+
234
+ /**
235
+ * Which day the week starts on for a locale: `0` Sunday … `6` Saturday.
236
+ *
237
+ * The runtime knows this — CLDR carries it — but only through
238
+ * `Intl.Locale#getWeekInfo`, which is recent enough that a small-ICU build or
239
+ * an older V8 has neither it nor the `weekInfo` property it was proposed as.
240
+ * So it is feature-detected, and what is left when it is missing is **Monday**:
241
+ * ISO 8601's answer, and the one most of the world uses.
242
+ */
243
+ export function localeWeekStart(locale?: string): number {
244
+ try {
245
+ const info = new Intl.Locale(locale ?? 'und');
246
+ // `getWeekInfo()` is the standardised spelling; `weekInfo` is what the
247
+ // proposal shipped as and what older V8 still has.
248
+ const withWeek = info as Intl.Locale & {
249
+ getWeekInfo?: () => { firstDay?: number };
250
+ weekInfo?: { firstDay?: number };
251
+ };
252
+ const week = withWeek.getWeekInfo?.() ?? withWeek.weekInfo;
253
+ // CLDR counts 1 Monday … 7 Sunday; JS counts 0 Sunday … 6 Saturday
254
+ if (week?.firstDay) return week.firstDay % 7;
255
+ } catch {
256
+ // an invalid locale tag: the caller's formatters will complain about it
257
+ // more usefully than a week-start fallback could
258
+ }
259
+ return 1;
260
+ }
261
+
262
+ /** `['Mon', 'Tue', …]` in the locale, rotated to start on `weekStartsOn`. */
263
+ export function weekdayLabels(locale?: string, weekStartsOn = 1): string[] {
264
+ const f = formatter(locale, { weekday: 'short' });
265
+ // 2026-08-02 is a Sunday, so `+ weekday` lands on the day we want a name for
266
+ return Array.from({ length: 7 }, (_, i) =>
267
+ f.format(dayDate(addDays('2026-08-02', (weekStartsOn + i) % 7))),
268
+ );
269
+ }
270
+
271
+ /** `'August 2026'` in the locale. */
272
+ export function formatMonth(month: CalendarMonth, locale?: string): string {
273
+ return formatter(locale, { month: 'long', year: 'numeric' }).format(
274
+ dayDate(firstOfMonth(month)),
275
+ );
276
+ }
277
+
278
+ /** `'7 Aug 2026'` in the locale — what a picker's trigger shows. */
279
+ export function formatDay(
280
+ day: CalendarDay,
281
+ locale?: string,
282
+ options?: Intl.DateTimeFormatOptions,
283
+ ): string {
284
+ return formatter(locale, options ?? { dateStyle: 'medium' }).format(
285
+ dayDate(day),
286
+ );
287
+ }
288
+
289
+ /**
290
+ * `'7 – 12 Aug 2026'`: the locale's own way of writing a span, which collapses
291
+ * the parts the two ends share. `formatRange` is ES2021 and universal in the
292
+ * Node versions this package supports, but a small-ICU build can still throw,
293
+ * so a plain "a – b" is kept behind it.
294
+ */
295
+ export function formatDayRange(
296
+ start: CalendarDay,
297
+ end: CalendarDay,
298
+ locale?: string,
299
+ options?: Intl.DateTimeFormatOptions,
300
+ ): string {
301
+ const f = formatter(locale, options ?? { dateStyle: 'medium' });
302
+ try {
303
+ return f.formatRange(dayDate(start), dayDate(end));
304
+ } catch {
305
+ return `${f.format(dayDate(start))} – ${f.format(dayDate(end))}`;
306
+ }
307
+ }