@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,844 @@
1
+ // <Table> — the data table: columns as data, rows from the app's own
2
+ // objects, and only the rows in view actually built.
3
+ //
4
+ // This is a **successor to react-x11's own `<Table>`, not a wrapper around
5
+ // it** — the same relationship `<Tree>` has to core's tree. Core's may be
6
+ // stripped down or removed altogether; nothing here imports it, and the two
7
+ // share no code. What is kept is the behaviour a user has already learnt —
8
+ // select on the first click, open on the second, the header that stays put,
9
+ // the resize grips, the sort toggle — and the prop names core's call sites
10
+ // already use (`columns`, `rows`, `sort`, `selected`, `onActivate`,
11
+ // `onColumnResize`), so migrating is changing the import.
12
+ //
13
+ // What it grows, per docs/prd-table.md (the bar `<Tree>` set):
14
+ //
15
+ // 1. **The data is the app's.** `getId` plus per-column `value` render any
16
+ // row shape where it lies; a row of `{ id, … }` configures nothing.
17
+ // 2. **Rows may be any height.** `rowHeight` declares them uniform and the
18
+ // slice is arithmetic, core's model; omit it and the rows are measured —
19
+ // the tree's model, same machinery — so a `render` seam may wrap text or
20
+ // stack lines without breaking the scrollbar.
21
+ // 3. **Every visible part is a seam**: `column.render`,
22
+ // `column.renderHeader`, `renderRow`, `renderEmpty`, and a `styles` bag
23
+ // whose row/cell entries may be functions of row state.
24
+ // 4. **Ceremony is additive.** Sorting, selection, multi-selection,
25
+ // virtualization and the seams are independent opt-ins on this one
26
+ // element — the PRD's continuity contract. There is no second API.
27
+ //
28
+ // Nothing here registers a host element. A table is `<box>`, `<text>` and
29
+ // core's chevron, so there is no `registerElement` call, no JSX augmentation
30
+ // and no side effect at import time at all.
31
+ import React, { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState, } from 'react';
32
+ import { createStyles } from 'react-x11/style';
33
+ import { Icon, useDirection, useTheme } from 'react-x11';
34
+ import { XK_DOWN, XK_END, XK_HOME, XK_LEFT, XK_PAGE_DOWN, XK_PAGE_UP, XK_RETURN, XK_RIGHT, XK_UP, } from 'react-x11/keysyms';
35
+ import { hx } from './hx.js';
36
+ // Shared with <Tree> — internal, deliberately not a shared *module*; the
37
+ // header of src/internal/heights.ts says why.
38
+ import { RowHeights } from '../internal/heights.js';
39
+ import { afterLayout, cancelAfterLayout } from '../internal/timers.js';
40
+ import { MIN_COLUMN, columnValue, orderRows, resolveGetId, resolveWidths, } from './rows.js';
41
+ export { MIN_COLUMN, UNSIZED_MIN, columnValue, defaultCompare, orderRows, resolveGetId, resolveWidths, } from './rows.js';
42
+ /** The header strip's height. Core's number — independent of the body's
43
+ * `rowHeight`, so a table of tall rows keeps a normal header. */
44
+ const HEADER_HEIGHT = 24;
45
+ /** The default row-height guess, and core's fixed row height. */
46
+ const ROW_HEIGHT = 24;
47
+ // The band you can grab, and the line you can see — two different sizes on
48
+ // purpose. A separator wants to be a hairline; a resize handle wants to be
49
+ // wide enough to hit without aiming. The band is centred **on** the rule:
50
+ // it is the boundary being moved, so a band lying to one side would light up
51
+ // off-centre and read as belonging to the column it covers.
52
+ const RULE = 1;
53
+ const HALF = 3;
54
+ const GRIP = HALF + RULE + HALF;
55
+ /** What one Left/Right on a focused grip is worth. */
56
+ const STEP = 16;
57
+ /** Rows kept either side of the viewport, so a fast scroll does not show a
58
+ * gap before the next frame catches up. */
59
+ const OVERSCAN = 6;
60
+ /**
61
+ * What to build before the viewport has been measured. `onViewport` cannot
62
+ * arrive until layout has run, which is a frame after the first commit, so
63
+ * there is always one render that has to guess — and guessing "all of them"
64
+ * puts a hundred thousand rows in the tree for a frame.
65
+ */
66
+ const ASSUMED_ROWS = 40;
67
+ /**
68
+ * Where `virtual="auto"` starts virtualizing.
69
+ *
70
+ * Well above any viewport, so a table that is merely long is still built
71
+ * whole and keeps the one thing virtualization costs — every row in the
72
+ * accessibility tree. Well below the point where building every row is felt.
73
+ * The tree's threshold, for the tree's reasons.
74
+ */
75
+ const VIRTUAL_THRESHOLD = 200;
76
+ /** The sort chevron, matched to the capitals of the 12px header caption. */
77
+ const SORT_MARK = 9;
78
+ const s = createStyles({
79
+ root: { flexGrow: 1, minHeight: 0, minWidth: 0 },
80
+ headerClip: { flexShrink: 0, overflow: 'hidden' },
81
+ headerRow: { flexDirection: 'row', flexShrink: 0 },
82
+ header: {
83
+ flexDirection: 'row',
84
+ alignItems: 'center',
85
+ height: HEADER_HEIGHT,
86
+ paddingStart: 8,
87
+ // Matching the leading inset: the sort mark sits against this edge, and
88
+ // without it the chevron touches the rule between the columns.
89
+ paddingEnd: 8,
90
+ flexShrink: 0,
91
+ transition: { backgroundColor: 80 },
92
+ },
93
+ headerLabel: {
94
+ fontSize: 12,
95
+ textWrap: 'nowrap',
96
+ textBoxTrim: 'cap-alphabetic',
97
+ },
98
+ /** Pushes the sort mark to the far end of the header, so the caption sits
99
+ * at the column's start edge — where the eye scans — and the marks of
100
+ * every sortable column line up instead of drifting with caption length. */
101
+ headerSpring: { flexGrow: 1 },
102
+ grip: {
103
+ flexShrink: 0,
104
+ cursor: 'col-resize',
105
+ alignSelf: 'stretch',
106
+ alignItems: 'center',
107
+ flexDirection: 'row',
108
+ justifyContent: 'center',
109
+ transition: { backgroundColor: 80 },
110
+ },
111
+ rule: { width: RULE, flexShrink: 0, alignSelf: 'stretch' },
112
+ body: { flexGrow: 1, minHeight: 0, overflow: 'scroll' },
113
+ rowsBox: { flexDirection: 'column', flexShrink: 0 },
114
+ row: {
115
+ flexDirection: 'row',
116
+ flexShrink: 0,
117
+ transition: { backgroundColor: 80 },
118
+ },
119
+ cell: {
120
+ justifyContent: 'center',
121
+ paddingStart: 8,
122
+ flexShrink: 0,
123
+ overflow: 'hidden',
124
+ },
125
+ cellText: { fontSize: 12, textWrap: 'nowrap', textBoxTrim: 'cap-alphabetic' },
126
+ spacer: { flexShrink: 0 },
127
+ sortMark: { marginStart: 4 },
128
+ empty: {
129
+ flexGrow: 1,
130
+ alignItems: 'center',
131
+ justifyContent: 'center',
132
+ padding: 16,
133
+ },
134
+ });
135
+ const EMPTY_SET = new Set();
136
+ /**
137
+ * `<Table columns rows />` — a data table with a header that stays put.
138
+ *
139
+ * <Table
140
+ * columns={[{ id: 'name', label: 'Name', flex: 1 }]}
141
+ * rows={[{ id: 1, name: 'index.ts' }]}
142
+ * />
143
+ *
144
+ * Columns are `{ id, label, width | flex, align, value, render }` — core's
145
+ * shape. `value(row)` feeds sorting and the default cell text;
146
+ * `render(row, state)` replaces the cell entirely, and the state says
147
+ * whether it is on the selected row, because that row is a filled bar and a
148
+ * colour chosen against the resting background is unreadable on it. A
149
+ * column declaring neither `width` nor `flex` stretches (`flex: 1`, floored
150
+ * at 120px), so a table with no sizing config fills its box.
151
+ *
152
+ * Sorting is uncontrolled unless you pass `sort`; the header reports
153
+ * `onSortChange` either way, and `presorted` says the rows already arrive
154
+ * ordered. Selection is single by default (`selected` + `onSelect`),
155
+ * `selectionMode="multiple"` for the set (`selected` + `onSelectedChange`),
156
+ * `"none"` for display. `onActivate` is the *open* gesture on top — a double
157
+ * click or Enter.
158
+ *
159
+ * The table is a single tab stop; Up/Down walk the rows, PageUp/PageDown
160
+ * move by a viewport, Home/End jump, Shift extends in multiple mode, Space
161
+ * toggles there, Ctrl+A takes everything. **The focus is on the table, not
162
+ * the row** — a virtualized row is unmounted the moment it scrolls out and
163
+ * focus would go with it, so the selection is the cursor. The honest caveat:
164
+ * while virtualizing, only the rendered rows are in the accessibility tree —
165
+ * the same rows a sighted user can see.
166
+ */
167
+ export function Table(props) {
168
+ const { columns = [], rows = [], getId, sort, defaultSort, onSortChange, presorted = false, onActivate, onRowContextMenu, onColumnResize, rowHeight, estimatedRowHeight, virtual = 'auto', overscan = OVERSCAN, renderRow, renderEmpty, styles, style, focusable = true, ref, selectionMode = 'single', selected, defaultSelected, onSelect, onSelectedChange,
169
+ // ours to chain rather than to hand over: virtualization and the sticky
170
+ // header are measured through both of these
171
+ onScroll, onViewport, ...boxProps } = props;
172
+ // The union keeps a caller honest at compile time; this keeps a caller
173
+ // honest who got the props from somewhere the compiler could not see.
174
+ if (selectionMode === 'multiple') {
175
+ if (selected !== undefined && !Array.isArray(selected)) {
176
+ throw new TypeError('<Table selectionMode="multiple"> takes `selected` as an array of ' +
177
+ 'ids. Pass `selected={[id]}`, or drop selectionMode for single ' +
178
+ 'selection.');
179
+ }
180
+ if (defaultSelected !== undefined && !Array.isArray(defaultSelected)) {
181
+ throw new TypeError('<Table selectionMode="multiple"> takes `defaultSelected` as an ' +
182
+ 'array of ids.');
183
+ }
184
+ }
185
+ else if (Array.isArray(selected) || Array.isArray(defaultSelected)) {
186
+ throw new TypeError(`<Table> got an array for \`selected\` but selectionMode is ` +
187
+ `'${selectionMode}' — pass selectionMode="multiple", or one id.`);
188
+ }
189
+ const theme = useTheme();
190
+ const rtl = useDirection() === 'rtl';
191
+ const [ownSort, setOwnSort] = useState(defaultSort ?? null);
192
+ const [ownSingle, setOwnSingle] = useState(() => Array.isArray(defaultSelected)
193
+ ? null
194
+ : (defaultSelected ?? null));
195
+ const [ownMulti, setOwnMulti] = useState(() => Array.isArray(defaultSelected) ? defaultSelected : []);
196
+ /** The keyboard cursor in multiple mode; in single mode the selection is
197
+ * the cursor. */
198
+ const [cursorId, setCursorId] = useState(null);
199
+ const [userWidths, setUserWidths] = useState({});
200
+ const [scrollX, setScrollX] = useState(0);
201
+ const [view, setView] = useState({ top: 0, height: 0, width: 0 });
202
+ // Bumped by a measurement pass that found a row taller or shorter than the
203
+ // index believed. It is the only reason the component re-renders for a
204
+ // measurement, and a pass that finds nothing new does not bump it — which
205
+ // is what makes measure → render → measure converge instead of spinning.
206
+ const [, setMeasured] = useState(0);
207
+ const readId = useMemo(() => resolveGetId(getId), [getId]);
208
+ const activeSort = sort === undefined ? ownSort : sort;
209
+ const ordered = useMemo(() => orderRows(rows, columns, readId, activeSort, presorted), [rows, columns, readId, activeSort, presorted]);
210
+ const selectedIds = useMemo(() => {
211
+ if (selectionMode === 'none')
212
+ return EMPTY_SET;
213
+ if (selectionMode === 'multiple') {
214
+ const list = selected === undefined ? ownMulti : selected;
215
+ return new Set(list);
216
+ }
217
+ const one = selected === undefined ? ownSingle : selected;
218
+ return one === null || one === undefined ? EMPTY_SET : new Set([one]);
219
+ }, [selectionMode, selected, ownMulti, ownSingle]);
220
+ const cursor = selectionMode === 'multiple'
221
+ ? cursorId
222
+ : selected === undefined
223
+ ? ownSingle
224
+ : selected;
225
+ // Held-down or fast keys arrive in a burst, and every handler in that
226
+ // burst sees the render it started from — so the order, the selection and
227
+ // the cursor are mirrored here and updated the moment they change, or
228
+ // three Downs in a row all step off the same starting point.
229
+ const orderedRef = useRef(ordered);
230
+ orderedRef.current = ordered;
231
+ const columnsRef = useRef(columns);
232
+ columnsRef.current = columns;
233
+ const selectedRef = useRef(selectedIds);
234
+ selectedRef.current = selectedIds;
235
+ const cursorRef = useRef(cursor);
236
+ cursorRef.current = cursor;
237
+ const viewRef = useRef(view);
238
+ viewRef.current = view;
239
+ /** Where a Shift range grows from — the last plain click or plain step. */
240
+ const anchorRef = useRef(null);
241
+ const root = useRef(null);
242
+ const body = useRef(null);
243
+ /** The rows on screen, by id — with the index each was drawn at, so a
244
+ * measurement pass does not have to search the row list for it. */
245
+ const rowNodes = useRef(new Map());
246
+ const drag = useRef(null);
247
+ const userWidthsRef = useRef(userWidths);
248
+ userWidthsRef.current = userWidths;
249
+ /** Declared uniform: divide, never measure — core's model. */
250
+ const uniform = rowHeight !== undefined;
251
+ const estimate = rowHeight ?? estimatedRowHeight ?? ROW_HEIGHT;
252
+ // `useState` for its lazy initializer rather than `useRef`: one index per
253
+ // mounted table, built once. Nothing ever calls the setter — what it holds
254
+ // is mutable and its changes are announced through `setMeasured`. With
255
+ // `rowHeight` declared nothing is ever measured, every height stays the
256
+ // estimate, and the index computes exactly `i * rowHeight` — one code
257
+ // path for both models.
258
+ const [heights] = useState(() => new RowHeights(estimate));
259
+ heights.sync(ordered, estimate);
260
+ const virtualizing = virtual === true ||
261
+ (virtual === 'auto' && ordered.length > VIRTUAL_THRESHOLD);
262
+ // The slice worth building: what is on screen, plus a little either side.
263
+ const first = virtualizing
264
+ ? Math.max(0, heights.indexAt(view.top) - overscan)
265
+ : 0;
266
+ let last = ordered.length;
267
+ if (virtualizing) {
268
+ if (view.height > 0) {
269
+ last = Math.min(ordered.length, heights.indexAt(view.top + view.height) + 1 + overscan);
270
+ }
271
+ else {
272
+ last = Math.min(ordered.length, first + ASSUMED_ROWS);
273
+ }
274
+ }
275
+ /** Where the slice starts, and how much of the list is below it — the two
276
+ * spacers that keep the scrollbar measuring the whole table. */
277
+ const above = virtualizing ? heights.offsetAt(first) : 0;
278
+ const below = virtualizing ? heights.total() - heights.offsetAt(last) : 0;
279
+ /** Columns resolve to pixels once, at the table level, per (columns,
280
+ * viewport, resizes) — every row agrees on the grid by construction. */
281
+ const { widths, total } = useMemo(() => resolveWidths(columns, userWidths, view.width), [columns, userWidths, view.width]);
282
+ /**
283
+ * Read back what the rows on screen actually laid out at.
284
+ *
285
+ * Runs a tick after the commit because layout runs on the frame flush —
286
+ * an effect reads the *previous* pass's geometry (see ./timers.ts).
287
+ * Idempotent: a row whose measurement has not changed reports no change,
288
+ * so the second pass over the same rows re-renders nothing. Rows above
289
+ * the viewport anchor shift the scroll offset by their delta, or
290
+ * measuring a row already scrolled past yanks the list under the pointer.
291
+ */
292
+ const measureRows = useCallback(() => {
293
+ if (uniform || !virtualizing)
294
+ return;
295
+ // Before the first `onViewport` the flex columns sit on their floors and
296
+ // every row is laid out against a width that is about to change — there
297
+ // is nothing honest to measure yet.
298
+ if (viewRef.current.width <= 0)
299
+ return;
300
+ // A row laid out at a width the columns no longer resolve to is a
301
+ // measurement of the wrong table, and it must not be recorded — a row
302
+ // that scrolls out before the corrected pass would keep a wrong-width
303
+ // height forever. The expectation is recomputed from event-fresh inputs
304
+ // rather than read from the last render: this tick runs *between* an
305
+ // `onViewport` and the re-render it causes, which is exactly when the
306
+ // rendered state is stale. The tree never needs any of this: its row
307
+ // width never depends on a resolved column model.
308
+ const expected = resolveWidths(columnsRef.current, userWidthsRef.current, viewRef.current.width).total;
309
+ const box = body.current;
310
+ const rows = orderedRef.current;
311
+ const anchor = box ? heights.indexAt(box.scrollY) : 0;
312
+ let shift = 0;
313
+ let changed = false;
314
+ for (const [id, { node, at }] of rowNodes.current) {
315
+ if (rows[at]?.id !== id)
316
+ continue; // drawn against a list that moved
317
+ if (node.abs.width !== expected)
318
+ continue;
319
+ const height = node.abs.height;
320
+ const was = heights.heightAt(at);
321
+ if (!heights.measure(id, at, height))
322
+ continue;
323
+ changed = true;
324
+ if (at < anchor)
325
+ shift += height - was;
326
+ }
327
+ if (!changed)
328
+ return;
329
+ if (shift !== 0 && box) {
330
+ box.scrollTo({ y: Math.max(0, box.scrollY + shift) });
331
+ }
332
+ setMeasured((n) => n + 1);
333
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- `heights` is a
334
+ // stable instance
335
+ }, [uniform, virtualizing]);
336
+ useEffect(() => {
337
+ if (uniform || !virtualizing)
338
+ return undefined;
339
+ const id = afterLayout(measureRows);
340
+ return () => cancelAfterLayout(id);
341
+ });
342
+ /**
343
+ * Put a row in view. A mounted row can say where it is, and
344
+ * `scrollIntoView` then works whatever height it turned out to be; a row
345
+ * that is not mounted has no geometry to ask, so the height index answers
346
+ * instead.
347
+ */
348
+ const reveal = useCallback((at) => {
349
+ const box = body.current;
350
+ const row = orderedRef.current[at];
351
+ if (!box || !row)
352
+ return;
353
+ const drawn = rowNodes.current.get(row.id);
354
+ if (drawn) {
355
+ box.scrollIntoView(drawn.node);
356
+ return;
357
+ }
358
+ const top = heights.offsetAt(at);
359
+ const rowH = heights.heightAt(at);
360
+ const height = viewRef.current.height;
361
+ if (top < box.scrollY)
362
+ box.scrollTo({ y: top });
363
+ else if (height > 0 && top + rowH > box.scrollY + height) {
364
+ box.scrollTo({ y: top + rowH - height });
365
+ }
366
+ // eslint-disable-next-line react-hooks/exhaustive-deps
367
+ }, []);
368
+ const commitSingle = useCallback((row) => {
369
+ cursorRef.current = row.id;
370
+ if (selected === undefined)
371
+ setOwnSingle(row.id);
372
+ onSelect?.(row.id, row.row);
373
+ }, [selected, onSelect]);
374
+ const commitMulti = useCallback((ids, change) => {
375
+ selectedRef.current = new Set(ids);
376
+ if (selected === undefined)
377
+ setOwnMulti(ids);
378
+ onSelectedChange?.(ids, change);
379
+ }, [selected, onSelectedChange]);
380
+ /**
381
+ * One gesture, pointer or keyboard: land on a row, with modifiers.
382
+ * Multiple mode is the file-manager grammar — plain replaces and moves the
383
+ * anchor, Ctrl toggles, Shift extends from the anchor. The cursor and the
384
+ * anchor are **ids, not indexes**, so a re-sort moves the rows, not the
385
+ * user's place.
386
+ */
387
+ const tap = useCallback((row, mods) => {
388
+ if (selectionMode === 'none')
389
+ return;
390
+ if (selectionMode === 'single') {
391
+ commitSingle(row);
392
+ reveal(row.index);
393
+ return;
394
+ }
395
+ cursorRef.current = row.id;
396
+ setCursorId(row.id);
397
+ const anchor = anchorRef.current;
398
+ if (mods.shift && anchor !== null) {
399
+ const all = orderedRef.current;
400
+ let a = all.findIndex((r) => r.id === anchor);
401
+ let b = row.index;
402
+ if (a < 0)
403
+ a = b;
404
+ const [lo, hi] = a <= b ? [a, b] : [b, a];
405
+ commitMulti(all.slice(lo, hi + 1).map((r) => r.id), { type: 'range', id: row.id, row: row.row });
406
+ }
407
+ else if (mods.ctrl) {
408
+ const next = new Set(selectedRef.current);
409
+ if (next.has(row.id))
410
+ next.delete(row.id);
411
+ else
412
+ next.add(row.id);
413
+ anchorRef.current = row.id;
414
+ commitMulti([...next], { type: 'toggle', id: row.id, row: row.row });
415
+ }
416
+ else {
417
+ anchorRef.current = row.id;
418
+ commitMulti([row.id], { type: 'replace', id: row.id, row: row.row });
419
+ }
420
+ reveal(row.index);
421
+ }, [selectionMode, commitSingle, commitMulti, reveal]);
422
+ const activate = useCallback((row) => {
423
+ onActivate?.(row.id, row.row);
424
+ }, [onActivate]);
425
+ const toggleSort = (column) => {
426
+ const next = activeSort?.column === column.id && activeSort.direction === 'asc'
427
+ ? { column: column.id, direction: 'desc' }
428
+ : { column: column.id, direction: 'asc' };
429
+ if (sort === undefined)
430
+ setOwnSort(next);
431
+ onSortChange?.(next);
432
+ };
433
+ const resize = (column, width) => {
434
+ const next = Math.max(column.minWidth ?? MIN_COLUMN, Math.round(width));
435
+ if (userWidthsRef.current[column.id] === next)
436
+ return;
437
+ const map = { ...userWidthsRef.current, [column.id]: next };
438
+ userWidthsRef.current = map;
439
+ setUserWidths(map);
440
+ onColumnResize?.(column.id, next);
441
+ };
442
+ const resizeProps = (column, resolved) => ({
443
+ // The handle takes focus on the press, so it is in the tab order whether
444
+ // or not it answers a key. Left/Right, the pair `SplitPane`'s divider
445
+ // takes; the table's own keys are Up/Down and never collide.
446
+ focusable: true,
447
+ onMouseDown: (ev) => {
448
+ drag.current = { id: column.id, from: ev.x, width: resolved };
449
+ ev.capturePointer();
450
+ },
451
+ onMouseMove: (ev) => {
452
+ const d = drag.current;
453
+ if (!d || d.id !== column.id)
454
+ return;
455
+ // dragging the grip away from the column's own start edge widens it,
456
+ // and which way that is follows the layout
457
+ resize(column, d.width + (rtl ? d.from - ev.x : ev.x - d.from));
458
+ },
459
+ onMouseUp: () => {
460
+ drag.current = null;
461
+ },
462
+ onKeyDown: (ev) => {
463
+ const narrower = rtl ? XK_RIGHT : XK_LEFT;
464
+ const wider = rtl ? XK_LEFT : XK_RIGHT;
465
+ if (ev.keysym === narrower)
466
+ resize(column, resolved - STEP);
467
+ else if (ev.keysym === wider)
468
+ resize(column, resolved + STEP);
469
+ },
470
+ });
471
+ /** Returns whether the key was the table's, so a control that forwards its
472
+ * keys here keeps the ones it did not use. */
473
+ const handleKey = useCallback((ev) => {
474
+ const rows = orderedRef.current;
475
+ if (!rows.length || selectionMode === 'none')
476
+ return false;
477
+ const at = rows.findIndex((r) => r.id === cursorRef.current);
478
+ const clamp = (i) => Math.max(0, Math.min(rows.length - 1, i));
479
+ const move = (to) => {
480
+ const row = rows[clamp(to)];
481
+ if (row) {
482
+ tap(row, {
483
+ ctrl: false,
484
+ shift: selectionMode === 'multiple' && ev.shiftKey,
485
+ });
486
+ }
487
+ };
488
+ /**
489
+ * How far a page key moves, in rows — with measured heights that is
490
+ * not a division: it is "where does this row's offset land after a
491
+ * viewport", with one row of overlap kept, and never standing still
492
+ * even when a row is taller than the viewport.
493
+ */
494
+ const pageFrom = (from, dir) => {
495
+ const viewport = viewRef.current.height;
496
+ if (viewport <= 0)
497
+ return from + dir;
498
+ const here = clamp(from);
499
+ const target = heights.offsetAt(here) + dir * Math.max(1, viewport - estimate);
500
+ const landed = heights.indexAt(Math.max(0, target));
501
+ return landed === here ? here + dir : landed;
502
+ };
503
+ switch (ev.keysym) {
504
+ case XK_UP:
505
+ move((at < 0 ? rows.length : at) - 1);
506
+ return true;
507
+ case XK_DOWN:
508
+ move((at < 0 ? -1 : at) + 1);
509
+ return true;
510
+ case XK_PAGE_UP:
511
+ move(pageFrom(at < 0 ? 0 : at, -1));
512
+ return true;
513
+ case XK_PAGE_DOWN:
514
+ move(pageFrom(at < 0 ? 0 : at, 1));
515
+ return true;
516
+ case XK_HOME:
517
+ move(0);
518
+ return true;
519
+ case XK_END:
520
+ move(rows.length - 1);
521
+ return true;
522
+ case XK_RETURN: {
523
+ const row = rows[at];
524
+ if (row)
525
+ activate(row);
526
+ return true;
527
+ }
528
+ default:
529
+ break;
530
+ }
531
+ if (ev.codepoint === 32) {
532
+ const row = rows[at];
533
+ if (!row)
534
+ return false;
535
+ if (selectionMode === 'multiple')
536
+ tap(row, { ctrl: true, shift: false });
537
+ else
538
+ activate(row);
539
+ return true;
540
+ }
541
+ if (selectionMode === 'multiple' &&
542
+ ev.ctrlKey &&
543
+ (ev.key === 'a' || ev.key === 'A')) {
544
+ commitMulti(rows.map((r) => r.id), { type: 'all' });
545
+ return true;
546
+ }
547
+ return false;
548
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- `heights` is
549
+ // a stable instance
550
+ }, [selectionMode, tap, activate, commitMulti, estimate]);
551
+ useImperativeHandle(ref, () => ({
552
+ focus: () => {
553
+ root.current?.focus();
554
+ },
555
+ select: (id) => {
556
+ if (id === null) {
557
+ cursorRef.current = null;
558
+ setCursorId(null);
559
+ anchorRef.current = null;
560
+ if (selected !== undefined)
561
+ return; // controlled: the caller owns it
562
+ if (selectionMode === 'multiple')
563
+ setOwnMulti([]);
564
+ else
565
+ setOwnSingle(null);
566
+ return;
567
+ }
568
+ const row = orderedRef.current.find((r) => r.id === id);
569
+ if (row)
570
+ tap(row, { ctrl: false, shift: false });
571
+ },
572
+ scrollToRow: (id) => {
573
+ const row = orderedRef.current.find((r) => r.id === id);
574
+ if (!row)
575
+ return false;
576
+ reveal(row.index);
577
+ return true;
578
+ },
579
+ handleKey,
580
+ rows: () => orderedRef.current,
581
+ }), [tap, handleKey, reveal, selectionMode, selected]);
582
+ // --- rendering -----------------------------------------------------------
583
+ const rowStyleProp = styles?.row;
584
+ const cellStyleProp = styles?.cell;
585
+ const headerCellStyleProp = styles?.headerCell;
586
+ const selectable = selectionMode !== 'none';
587
+ const renderOneRow = (entry) => {
588
+ const isSelected = selectedIds.has(entry.id);
589
+ const color = isSelected ? theme.hoverText : theme.text;
590
+ const state = { ...entry, selected: isSelected, color };
591
+ const content = columns.map((column, at) => {
592
+ const cellState = { ...state, column };
593
+ return hx('box', {
594
+ key: column.id,
595
+ role: 'cell',
596
+ style: [
597
+ s.cell,
598
+ { width: widths[at] },
599
+ uniform && { height: rowHeight },
600
+ column.align === 'end' && {
601
+ alignItems: 'flex-end',
602
+ paddingEnd: 8,
603
+ },
604
+ column.align === 'center' && { alignItems: 'center' },
605
+ typeof cellStyleProp === 'function'
606
+ ? cellStyleProp(cellState)
607
+ : cellStyleProp,
608
+ ],
609
+ }, column.render
610
+ ? // A cell that draws itself still has to know it is on the
611
+ // selected row — see the doc comment. Keyed by the component,
612
+ // the way every seam's return is.
613
+ React.createElement(React.Fragment, { key: 'content' }, column.render(entry.row, cellState))
614
+ : hx('text', { style: [s.cellText, { color }] }, String(columnValue(entry.row, column) ?? '')));
615
+ });
616
+ return hx('box', {
617
+ key: String(entry.id),
618
+ role: 'row',
619
+ 'aria-selected': selectable ? isSelected : undefined,
620
+ 'aria-posinset': entry.index + 1,
621
+ 'aria-setsize': ordered.length,
622
+ // The index the row was drawn at travels with the node, so measuring
623
+ // does not have to search the row list for it. It can go stale — the
624
+ // rows may move before the tick that measures — and both this and
625
+ // the height index check it rather than trust it.
626
+ ref: (node) => {
627
+ if (node)
628
+ rowNodes.current.set(entry.id, { node, at: entry.index });
629
+ else
630
+ rowNodes.current.delete(entry.id);
631
+ },
632
+ onClick: (ev) => {
633
+ // A right-click also arrives here as a click; the selection it
634
+ // implies is `onContextMenu`'s to make (select-unless-selected),
635
+ // not the left button's replace.
636
+ if (ev.button !== 1)
637
+ return;
638
+ tap(entry, { ctrl: ev.ctrlKey, shift: ev.shiftKey });
639
+ // Select on the first click, open on the second — the gesture
640
+ // every file list has. `detail` is the click count the renderer
641
+ // already counts for text selection.
642
+ if (ev.detail === 2)
643
+ activate(entry);
644
+ },
645
+ onContextMenu: onRowContextMenu
646
+ ? (ev) => {
647
+ // The menu applies to what is under the pointer, so the row is
648
+ // selected first — unless it is already part of the selection,
649
+ // which a menu over "the selected files" must not collapse.
650
+ if (selectable && !selectedRef.current.has(entry.id)) {
651
+ tap(entry, { ctrl: false, shift: false });
652
+ }
653
+ onRowContextMenu(entry.id, entry.row, ev);
654
+ }
655
+ : undefined,
656
+ style: [
657
+ s.row,
658
+ // Declared uniform: exactly this tall, content clipped — core's
659
+ // row. Measured: a floor, and the row grows to whatever its
660
+ // content needs; the height index reads back what it became.
661
+ uniform
662
+ ? { height: rowHeight, alignItems: 'center' }
663
+ : { minHeight: estimate },
664
+ selectable && { cursor: 'pointer' },
665
+ {
666
+ backgroundColor: isSelected ? theme.hoverBackground : 'transparent',
667
+ // The row's ink, said once: `color` inherits, so default cells
668
+ // take it without being handed it.
669
+ color,
670
+ },
671
+ selectable && {
672
+ // pressed even on the selected row: a re-press on the row that
673
+ // is already current is the one click in the table that would
674
+ // otherwise look ignored
675
+ ':active': {
676
+ backgroundColor: isSelected
677
+ ? theme.accentActive
678
+ : theme.surfaceActive,
679
+ },
680
+ },
681
+ selectable &&
682
+ !isSelected && {
683
+ ':hover': { backgroundColor: theme.surfaceHover },
684
+ },
685
+ typeof rowStyleProp === 'function'
686
+ ? rowStyleProp(state)
687
+ : rowStyleProp,
688
+ ],
689
+ }, renderRow ? renderRow(state, content) : content);
690
+ };
691
+ const headerCells = columns.map((column, at) => {
692
+ const canSort = column.sortable !== false;
693
+ const headerState = {
694
+ column,
695
+ sort: activeSort,
696
+ resolvedWidth: widths[at],
697
+ };
698
+ const isLast = at === columns.length - 1;
699
+ return React.createElement(React.Fragment, { key: column.id }, hx('box', {
700
+ role: 'columnheader',
701
+ focusable: true,
702
+ onClick: canSort ? () => toggleSort(column) : undefined,
703
+ style: [
704
+ s.header,
705
+ // The header cell and the grab band are **siblings**, not a cell
706
+ // with a handle inside it — a click fires on the nearest common
707
+ // ancestor of press and release, so a grip nested in the header
708
+ // made every resize end in a sort. The band is centred on the
709
+ // rule and takes HALF from the column on each side, so every
710
+ // header but the first is inset by that much.
711
+ {
712
+ width: Math.max(0, widths[at] - HALF - RULE - (at ? HALF : 0)),
713
+ },
714
+ canSort && { cursor: 'pointer' },
715
+ typeof headerCellStyleProp === 'function'
716
+ ? headerCellStyleProp(headerState)
717
+ : headerCellStyleProp,
718
+ ],
719
+ }, column.renderHeader
720
+ ? React.createElement(React.Fragment, { key: 'content' }, column.renderHeader(headerState))
721
+ : [
722
+ hx('text', {
723
+ key: 'label',
724
+ style: [s.headerLabel, { color: theme.text }],
725
+ }, column.label ?? column.id),
726
+ hx('box', { key: 'spring', style: s.headerSpring }),
727
+ activeSort?.column === column.id
728
+ ? React.createElement(Icon, {
729
+ key: 'mark',
730
+ name: activeSort.direction === 'asc'
731
+ ? 'chevronUp'
732
+ : 'chevronDown',
733
+ size: SORT_MARK,
734
+ color: theme.textMuted,
735
+ style: s.sortMark,
736
+ })
737
+ : null,
738
+ ]),
739
+ // The band is invisible until the pointer is on it, and answers the
740
+ // press itself — a captured press keeps `:active` for the whole drag,
741
+ // wherever the pointer wanders. The rule is its child, so the lit band
742
+ // is symmetric about the line it moves.
743
+ hx('box', {
744
+ ...resizeProps(column, widths[at]),
745
+ role: 'separator',
746
+ 'aria-orientation': 'vertical',
747
+ 'aria-label': `Resize ${column.label || column.id}`,
748
+ 'aria-valuenow': widths[at],
749
+ 'aria-valuemin': column.minWidth ?? MIN_COLUMN,
750
+ style: [
751
+ s.grip,
752
+ {
753
+ width: isLast ? HALF + RULE : GRIP,
754
+ justifyContent: isLast ? 'flex-end' : 'center',
755
+ },
756
+ { backgroundColor: 'transparent' },
757
+ { ':hover': { backgroundColor: theme.track } },
758
+ { ':active': { backgroundColor: theme.accent } },
759
+ ],
760
+ }, hx('box', { style: [s.rule, { backgroundColor: theme.border }] })));
761
+ });
762
+ const bodyChildren = [];
763
+ if (ordered.length === 0) {
764
+ if (renderEmpty) {
765
+ bodyChildren.push(hx('box', { key: 'empty', style: s.empty }, renderEmpty()));
766
+ }
767
+ }
768
+ else {
769
+ if (virtualizing && first > 0) {
770
+ bodyChildren.push(hx('box', {
771
+ key: 'spacer:before',
772
+ style: [s.spacer, { height: above }],
773
+ }));
774
+ }
775
+ for (let i = first; i < last; i++)
776
+ bodyChildren.push(renderOneRow(ordered[i]));
777
+ if (virtualizing && last < ordered.length) {
778
+ bodyChildren.push(hx('box', {
779
+ key: 'spacer:after',
780
+ style: [s.spacer, { height: below }],
781
+ }));
782
+ }
783
+ }
784
+ return hx('box', {
785
+ theme,
786
+ // The table role, with the honest caveat that virtualization keeps
787
+ // only the rendered rows in the accessible tree. `aria-label` via
788
+ // boxProps names the table.
789
+ role: 'table',
790
+ // the *table* takes focus, not the row — see the doc comment
791
+ focusable,
792
+ ...boxProps,
793
+ ref: root,
794
+ style: [s.root, style],
795
+ /**
796
+ * `preventDefault` is the load-bearing half: the focused table sits
797
+ * over a scroll container with default key actions of its own, and
798
+ * without it every arrow both moved the selection and scrolled the
799
+ * list under it. A key the table did not take keeps its default.
800
+ */
801
+ onKeyDown: (ev) => {
802
+ if (handleKey(ev))
803
+ ev.preventDefault();
804
+ },
805
+ },
806
+ // the header scrolls sideways with the body but never vertically, so it
807
+ // lives outside the scrolling pane and is shifted by the body's scrollX —
808
+ // `marginStart`, so it tracks in the direction the columns actually run
809
+ hx('box', {
810
+ style: [
811
+ s.headerClip,
812
+ { backgroundColor: theme.surfaceHover },
813
+ styles?.header,
814
+ ],
815
+ }, hx('box', { style: [s.headerRow, { marginStart: -scrollX, width: total }] }, headerCells)), hx('box', {
816
+ ref: body,
817
+ style: s.body,
818
+ onScroll: (ev) => {
819
+ setScrollX((prev) => (prev === ev.scrollX ? prev : ev.scrollX));
820
+ if (virtualizing) {
821
+ setView((prev) => prev.top === ev.scrollY ? prev : { ...prev, top: ev.scrollY });
822
+ }
823
+ onScroll?.(ev);
824
+ },
825
+ // Layout, not scrolling, is what first tells a table how much of it
826
+ // is worth building — and the viewport width is what the flex
827
+ // columns resolve against, so this is measured whether or not the
828
+ // table virtualizes.
829
+ onViewport: (ev) => {
830
+ // The ref first, at event time: the measure tick runs before the
831
+ // re-render this setState causes, and it must see this viewport.
832
+ viewRef.current = {
833
+ ...viewRef.current,
834
+ height: ev.height,
835
+ width: ev.width,
836
+ };
837
+ setView((prev) => prev.height === ev.height && prev.width === ev.width
838
+ ? prev
839
+ : { ...prev, height: ev.height, width: ev.width });
840
+ onViewport?.(ev);
841
+ },
842
+ }, hx('box', { style: [s.rowsBox, { width: total }] }, bodyChildren)));
843
+ }
844
+ //# sourceMappingURL=index.js.map