@react-x11/components 0.7.1 → 0.9.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 (354) hide show
  1. package/README.md +295 -51
  2. package/dist/charts/node.d.ts +1 -1
  3. package/dist/charts/node.d.ts.map +1 -1
  4. package/dist/charts/node.js +6 -2
  5. package/dist/charts/node.js.map +1 -1
  6. package/dist/color-picker/ColorPicker.d.ts.map +1 -1
  7. package/dist/color-picker/ColorPicker.js +43 -33
  8. package/dist/color-picker/ColorPicker.js.map +1 -1
  9. package/dist/embed/client.d.ts +48 -3
  10. package/dist/embed/client.d.ts.map +1 -1
  11. package/dist/embed/client.js +79 -5
  12. package/dist/embed/client.js.map +1 -1
  13. package/dist/embed/index.d.ts +1 -1
  14. package/dist/embed/index.d.ts.map +1 -1
  15. package/dist/embed/index.js +1 -1
  16. package/dist/embed/index.js.map +1 -1
  17. package/dist/html/node.d.ts +3 -1
  18. package/dist/html/node.d.ts.map +1 -1
  19. package/dist/html/node.js +7 -5
  20. package/dist/html/node.js.map +1 -1
  21. package/dist/index.d.ts +1 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +1 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/{markdown → internal/markdown}/ast.d.ts +12 -0
  26. package/dist/internal/markdown/ast.d.ts.map +1 -0
  27. package/dist/internal/markdown/ast.js +22 -0
  28. package/dist/internal/markdown/ast.js.map +1 -0
  29. package/dist/internal/markdown/parse.d.ts.map +1 -0
  30. package/dist/{markdown → internal/markdown}/parse.js +112 -22
  31. package/dist/internal/markdown/parse.js.map +1 -0
  32. package/dist/internal/markdown/stringify.d.ts +4 -0
  33. package/dist/internal/markdown/stringify.d.ts.map +1 -0
  34. package/dist/internal/markdown/stringify.js +684 -0
  35. package/dist/internal/markdown/stringify.js.map +1 -0
  36. package/dist/internal/markdown/tags.d.ts.map +1 -0
  37. package/dist/internal/markdown/tags.js.map +1 -0
  38. package/dist/internal/scroll.d.ts +3 -2
  39. package/dist/internal/scroll.d.ts.map +1 -1
  40. package/dist/internal/scroll.js +33 -15
  41. package/dist/internal/scroll.js.map +1 -1
  42. package/dist/internal/units.d.ts +2 -0
  43. package/dist/internal/units.d.ts.map +1 -0
  44. package/dist/internal/units.js +35 -0
  45. package/dist/internal/units.js.map +1 -0
  46. package/dist/internal/window.d.ts.map +1 -1
  47. package/dist/internal/window.js +4 -2
  48. package/dist/internal/window.js.map +1 -1
  49. package/dist/maps/anchors.d.ts +98 -0
  50. package/dist/maps/anchors.d.ts.map +1 -0
  51. package/dist/maps/anchors.js +531 -0
  52. package/dist/maps/anchors.js.map +1 -0
  53. package/dist/maps/controller.d.ts +283 -0
  54. package/dist/maps/controller.d.ts.map +1 -0
  55. package/dist/maps/controller.js +743 -0
  56. package/dist/maps/controller.js.map +1 -0
  57. package/dist/maps/gl/buckets.d.ts +95 -0
  58. package/dist/maps/gl/buckets.d.ts.map +1 -0
  59. package/dist/maps/gl/buckets.js +362 -0
  60. package/dist/maps/gl/buckets.js.map +1 -0
  61. package/dist/maps/gl/build-worker.d.ts +13 -0
  62. package/dist/maps/gl/build-worker.d.ts.map +1 -0
  63. package/dist/maps/gl/build-worker.js +44 -0
  64. package/dist/maps/gl/build-worker.js.map +1 -0
  65. package/dist/maps/gl/color.d.ts +8 -0
  66. package/dist/maps/gl/color.d.ts.map +1 -0
  67. package/dist/maps/gl/color.js +57 -0
  68. package/dist/maps/gl/color.js.map +1 -0
  69. package/dist/maps/gl/cover.d.ts +51 -0
  70. package/dist/maps/gl/cover.d.ts.map +1 -0
  71. package/dist/maps/gl/cover.js +124 -0
  72. package/dist/maps/gl/cover.js.map +1 -0
  73. package/dist/maps/gl/index.d.ts +3 -0
  74. package/dist/maps/gl/index.d.ts.map +1 -0
  75. package/dist/maps/gl/index.js +20 -0
  76. package/dist/maps/gl/index.js.map +1 -0
  77. package/dist/maps/gl/markers.d.ts +28 -0
  78. package/dist/maps/gl/markers.d.ts.map +1 -0
  79. package/dist/maps/gl/markers.js +60 -0
  80. package/dist/maps/gl/markers.js.map +1 -0
  81. package/dist/maps/gl/overlays.d.ts +68 -0
  82. package/dist/maps/gl/overlays.d.ts.map +1 -0
  83. package/dist/maps/gl/overlays.js +300 -0
  84. package/dist/maps/gl/overlays.js.map +1 -0
  85. package/dist/maps/gl/pane.d.ts +12 -0
  86. package/dist/maps/gl/pane.d.ts.map +1 -0
  87. package/dist/maps/gl/pane.js +37 -0
  88. package/dist/maps/gl/pane.js.map +1 -0
  89. package/dist/maps/gl/placement.d.ts +111 -0
  90. package/dist/maps/gl/placement.d.ts.map +1 -0
  91. package/dist/maps/gl/placement.js +567 -0
  92. package/dist/maps/gl/placement.js.map +1 -0
  93. package/dist/maps/gl/renderer.d.ts +352 -0
  94. package/dist/maps/gl/renderer.d.ts.map +1 -0
  95. package/dist/maps/gl/renderer.js +1127 -0
  96. package/dist/maps/gl/renderer.js.map +1 -0
  97. package/dist/maps/gl/shaders.d.ts +120 -0
  98. package/dist/maps/gl/shaders.d.ts.map +1 -0
  99. package/dist/maps/gl/shaders.js +451 -0
  100. package/dist/maps/gl/shaders.js.map +1 -0
  101. package/dist/maps/gl/store.d.ts +115 -0
  102. package/dist/maps/gl/store.d.ts.map +1 -0
  103. package/dist/maps/gl/store.js +469 -0
  104. package/dist/maps/gl/store.js.map +1 -0
  105. package/dist/maps/gl/text.d.ts +154 -0
  106. package/dist/maps/gl/text.d.ts.map +1 -0
  107. package/dist/maps/gl/text.js +382 -0
  108. package/dist/maps/gl/text.js.map +1 -0
  109. package/dist/maps/gl/view.d.ts +54 -0
  110. package/dist/maps/gl/view.d.ts.map +1 -0
  111. package/dist/maps/gl/view.js +974 -0
  112. package/dist/maps/gl/view.js.map +1 -0
  113. package/dist/maps/index.d.ts +1 -1
  114. package/dist/maps/index.d.ts.map +1 -1
  115. package/dist/maps/index.js +216 -52
  116. package/dist/maps/index.js.map +1 -1
  117. package/dist/maps/labels.d.ts +37 -16
  118. package/dist/maps/labels.d.ts.map +1 -1
  119. package/dist/maps/labels.js +188 -119
  120. package/dist/maps/labels.js.map +1 -1
  121. package/dist/maps/node.d.ts +162 -56
  122. package/dist/maps/node.d.ts.map +1 -1
  123. package/dist/maps/node.js +607 -515
  124. package/dist/maps/node.js.map +1 -1
  125. package/dist/maps/overlay.d.ts +72 -9
  126. package/dist/maps/overlay.d.ts.map +1 -1
  127. package/dist/maps/overlay.js +108 -28
  128. package/dist/maps/overlay.js.map +1 -1
  129. package/dist/maps/paint.d.ts +3 -0
  130. package/dist/maps/paint.d.ts.map +1 -1
  131. package/dist/maps/paint.js.map +1 -1
  132. package/dist/maps/proj.d.ts +14 -0
  133. package/dist/maps/proj.d.ts.map +1 -1
  134. package/dist/maps/proj.js +28 -0
  135. package/dist/maps/proj.js.map +1 -1
  136. package/dist/maps/renderer.d.ts +69 -0
  137. package/dist/maps/renderer.d.ts.map +1 -0
  138. package/dist/maps/renderer.js +66 -0
  139. package/dist/maps/renderer.js.map +1 -0
  140. package/dist/maps/sources.d.ts +25 -3
  141. package/dist/maps/sources.d.ts.map +1 -1
  142. package/dist/maps/sources.js +17 -0
  143. package/dist/maps/sources.js.map +1 -1
  144. package/dist/maps/theme.d.ts +19 -0
  145. package/dist/maps/theme.d.ts.map +1 -0
  146. package/dist/maps/theme.js +44 -0
  147. package/dist/maps/theme.js.map +1 -0
  148. package/dist/maps/tiles.d.ts +117 -17
  149. package/dist/maps/tiles.d.ts.map +1 -1
  150. package/dist/maps/tiles.js +163 -30
  151. package/dist/maps/tiles.js.map +1 -1
  152. package/dist/maps/types.d.ts +188 -20
  153. package/dist/maps/types.d.ts.map +1 -1
  154. package/dist/markdown/expressions.d.ts +1 -1
  155. package/dist/markdown/expressions.d.ts.map +1 -1
  156. package/dist/markdown/expressions.js.map +1 -1
  157. package/dist/markdown/index.d.ts +7 -6
  158. package/dist/markdown/index.d.ts.map +1 -1
  159. package/dist/markdown/index.js +9 -7
  160. package/dist/markdown/index.js.map +1 -1
  161. package/dist/markdown/spans.d.ts +1 -1
  162. package/dist/markdown/spans.d.ts.map +1 -1
  163. package/dist/media-player/index.d.ts +11 -3
  164. package/dist/media-player/index.d.ts.map +1 -1
  165. package/dist/media-player/index.js +13 -2
  166. package/dist/media-player/index.js.map +1 -1
  167. package/dist/rich-text-editor/clipboard.d.ts +23 -0
  168. package/dist/rich-text-editor/clipboard.d.ts.map +1 -0
  169. package/dist/rich-text-editor/clipboard.js +307 -0
  170. package/dist/rich-text-editor/clipboard.js.map +1 -0
  171. package/dist/rich-text-editor/collab.d.ts +32 -0
  172. package/dist/rich-text-editor/collab.d.ts.map +1 -0
  173. package/dist/rich-text-editor/collab.js +55 -0
  174. package/dist/rich-text-editor/collab.js.map +1 -0
  175. package/dist/rich-text-editor/commands.d.ts +50 -0
  176. package/dist/rich-text-editor/commands.d.ts.map +1 -0
  177. package/dist/rich-text-editor/commands.js +376 -0
  178. package/dist/rich-text-editor/commands.js.map +1 -0
  179. package/dist/rich-text-editor/drag.d.ts +68 -0
  180. package/dist/rich-text-editor/drag.d.ts.map +1 -0
  181. package/dist/rich-text-editor/drag.js +148 -0
  182. package/dist/rich-text-editor/drag.js.map +1 -0
  183. package/dist/rich-text-editor/html.d.ts +145 -0
  184. package/dist/rich-text-editor/html.d.ts.map +1 -0
  185. package/dist/rich-text-editor/html.js +516 -0
  186. package/dist/rich-text-editor/html.js.map +1 -0
  187. package/dist/rich-text-editor/index.d.ts +263 -0
  188. package/dist/rich-text-editor/index.d.ts.map +1 -0
  189. package/dist/rich-text-editor/index.js +822 -0
  190. package/dist/rich-text-editor/index.js.map +1 -0
  191. package/dist/rich-text-editor/inline.d.ts +94 -0
  192. package/dist/rich-text-editor/inline.d.ts.map +1 -0
  193. package/dist/rich-text-editor/inline.js +252 -0
  194. package/dist/rich-text-editor/inline.js.map +1 -0
  195. package/dist/rich-text-editor/keymap.d.ts +71 -0
  196. package/dist/rich-text-editor/keymap.d.ts.map +1 -0
  197. package/dist/rich-text-editor/keymap.js +393 -0
  198. package/dist/rich-text-editor/keymap.js.map +1 -0
  199. package/dist/rich-text-editor/keys.d.ts +29 -0
  200. package/dist/rich-text-editor/keys.d.ts.map +1 -0
  201. package/dist/rich-text-editor/keys.js +93 -0
  202. package/dist/rich-text-editor/keys.js.map +1 -0
  203. package/dist/rich-text-editor/look.d.ts +71 -0
  204. package/dist/rich-text-editor/look.d.ts.map +1 -0
  205. package/dist/rich-text-editor/look.js +342 -0
  206. package/dist/rich-text-editor/look.js.map +1 -0
  207. package/dist/rich-text-editor/markdown.d.ts +18 -0
  208. package/dist/rich-text-editor/markdown.d.ts.map +1 -0
  209. package/dist/rich-text-editor/markdown.js +496 -0
  210. package/dist/rich-text-editor/markdown.js.map +1 -0
  211. package/dist/rich-text-editor/nodes.d.ts +135 -0
  212. package/dist/rich-text-editor/nodes.d.ts.map +1 -0
  213. package/dist/rich-text-editor/nodes.js +397 -0
  214. package/dist/rich-text-editor/nodes.js.map +1 -0
  215. package/dist/rich-text-editor/render.d.ts +68 -0
  216. package/dist/rich-text-editor/render.d.ts.map +1 -0
  217. package/dist/rich-text-editor/render.js +500 -0
  218. package/dist/rich-text-editor/render.js.map +1 -0
  219. package/dist/rich-text-editor/schema.d.ts +16 -0
  220. package/dist/rich-text-editor/schema.d.ts.map +1 -0
  221. package/dist/rich-text-editor/schema.js +386 -0
  222. package/dist/rich-text-editor/schema.js.map +1 -0
  223. package/dist/rich-text-editor/store.d.ts +11 -0
  224. package/dist/rich-text-editor/store.d.ts.map +1 -0
  225. package/dist/rich-text-editor/store.js +43 -0
  226. package/dist/rich-text-editor/store.js.map +1 -0
  227. package/dist/rich-text-editor/suggest.d.ts +127 -0
  228. package/dist/rich-text-editor/suggest.d.ts.map +1 -0
  229. package/dist/rich-text-editor/suggest.js +0 -0
  230. package/dist/rich-text-editor/suggest.js.map +1 -0
  231. package/dist/rich-text-editor/tables.d.ts +41 -0
  232. package/dist/rich-text-editor/tables.d.ts.map +1 -0
  233. package/dist/rich-text-editor/tables.js +204 -0
  234. package/dist/rich-text-editor/tables.js.map +1 -0
  235. package/dist/rich-text-editor/toolbar.d.ts +58 -0
  236. package/dist/rich-text-editor/toolbar.d.ts.map +1 -0
  237. package/dist/rich-text-editor/toolbar.js +548 -0
  238. package/dist/rich-text-editor/toolbar.js.map +1 -0
  239. package/dist/rich-text-editor/view.d.ts +368 -0
  240. package/dist/rich-text-editor/view.d.ts.map +1 -0
  241. package/dist/rich-text-editor/view.js +1968 -0
  242. package/dist/rich-text-editor/view.js.map +1 -0
  243. package/dist/rich-text-editor/virtual.d.ts +54 -0
  244. package/dist/rich-text-editor/virtual.d.ts.map +1 -0
  245. package/dist/rich-text-editor/virtual.js +262 -0
  246. package/dist/rich-text-editor/virtual.js.map +1 -0
  247. package/dist/richtext/node.d.ts +25 -2
  248. package/dist/richtext/node.d.ts.map +1 -1
  249. package/dist/richtext/node.js +46 -24
  250. package/dist/richtext/node.js.map +1 -1
  251. package/dist/table/index.d.ts.map +1 -1
  252. package/dist/table/index.js +14 -5
  253. package/dist/table/index.js.map +1 -1
  254. package/dist/terminal/backends.d.ts +4 -1
  255. package/dist/terminal/backends.d.ts.map +1 -1
  256. package/dist/terminal/backends.js.map +1 -1
  257. package/dist/terminal/index.d.ts +18 -7
  258. package/dist/terminal/index.d.ts.map +1 -1
  259. package/dist/terminal/index.js +28 -11
  260. package/dist/terminal/index.js.map +1 -1
  261. package/dist/terminal/vt/node.d.ts +56 -3
  262. package/dist/terminal/vt/node.d.ts.map +1 -1
  263. package/dist/terminal/vt/node.js +106 -26
  264. package/dist/terminal/vt/node.js.map +1 -1
  265. package/dist/terminal/vt/renderer.d.ts +4 -0
  266. package/dist/terminal/vt/renderer.d.ts.map +1 -1
  267. package/dist/terminal/vt/renderer.js +14 -5
  268. package/dist/terminal/vt/renderer.js.map +1 -1
  269. package/dist/tree/index.d.ts.map +1 -1
  270. package/dist/tree/index.js +6 -4
  271. package/dist/tree/index.js.map +1 -1
  272. package/package.json +23 -4
  273. package/src/charts/node.ts +6 -2
  274. package/src/color-picker/ColorPicker.ts +107 -81
  275. package/src/embed/client.ts +102 -8
  276. package/src/embed/index.ts +2 -0
  277. package/src/html/node.ts +7 -5
  278. package/src/index.ts +2 -0
  279. package/src/{markdown → internal/markdown}/ast.ts +24 -7
  280. package/src/{markdown → internal/markdown}/parse.ts +134 -24
  281. package/src/internal/markdown/stringify.ts +772 -0
  282. package/src/internal/scroll.ts +39 -18
  283. package/src/internal/units.ts +34 -0
  284. package/src/internal/window.ts +4 -2
  285. package/src/maps/anchors.ts +607 -0
  286. package/src/maps/controller.ts +999 -0
  287. package/src/maps/gl/buckets.ts +457 -0
  288. package/src/maps/gl/build-worker.ts +55 -0
  289. package/src/maps/gl/color.ts +62 -0
  290. package/src/maps/gl/cover.ts +170 -0
  291. package/src/maps/gl/index.ts +23 -0
  292. package/src/maps/gl/markers.ts +83 -0
  293. package/src/maps/gl/overlays.ts +379 -0
  294. package/src/maps/gl/pane.ts +42 -0
  295. package/src/maps/gl/placement.ts +816 -0
  296. package/src/maps/gl/renderer.ts +1576 -0
  297. package/src/maps/gl/shaders.ts +486 -0
  298. package/src/maps/gl/store.ts +566 -0
  299. package/src/maps/gl/text.ts +495 -0
  300. package/src/maps/gl/view.ts +1224 -0
  301. package/src/maps/index.ts +270 -81
  302. package/src/maps/labels.ts +214 -121
  303. package/src/maps/node.ts +763 -629
  304. package/src/maps/overlay.ts +148 -43
  305. package/src/maps/paint.ts +3 -0
  306. package/src/maps/proj.ts +31 -0
  307. package/src/maps/renderer.ts +155 -0
  308. package/src/maps/sources.ts +38 -3
  309. package/src/maps/theme.ts +51 -0
  310. package/src/maps/tiles.ts +191 -33
  311. package/src/maps/types.ts +188 -20
  312. package/src/markdown/expressions.ts +5 -1
  313. package/src/markdown/index.ts +14 -11
  314. package/src/markdown/spans.ts +1 -1
  315. package/src/media-player/index.ts +18 -4
  316. package/src/rich-text-editor/clipboard.ts +439 -0
  317. package/src/rich-text-editor/collab.ts +91 -0
  318. package/src/rich-text-editor/commands.ts +448 -0
  319. package/src/rich-text-editor/dom-globals.d.ts +23 -0
  320. package/src/rich-text-editor/drag.ts +211 -0
  321. package/src/rich-text-editor/html.ts +619 -0
  322. package/src/rich-text-editor/index.ts +1331 -0
  323. package/src/rich-text-editor/inline.ts +345 -0
  324. package/src/rich-text-editor/keymap.ts +510 -0
  325. package/src/rich-text-editor/keys.ts +119 -0
  326. package/src/rich-text-editor/look.ts +427 -0
  327. package/src/rich-text-editor/markdown.ts +653 -0
  328. package/src/rich-text-editor/nodes.ts +497 -0
  329. package/src/rich-text-editor/render.ts +800 -0
  330. package/src/rich-text-editor/schema.ts +431 -0
  331. package/src/rich-text-editor/store.ts +39 -0
  332. package/src/rich-text-editor/suggest.ts +597 -0
  333. package/src/rich-text-editor/tables.ts +272 -0
  334. package/src/rich-text-editor/toolbar.ts +724 -0
  335. package/src/rich-text-editor/view.ts +2287 -0
  336. package/src/rich-text-editor/virtual.ts +347 -0
  337. package/src/richtext/node.ts +59 -30
  338. package/src/table/index.ts +14 -5
  339. package/src/terminal/backends.ts +4 -1
  340. package/src/terminal/index.ts +43 -15
  341. package/src/terminal/vt/node.ts +128 -29
  342. package/src/terminal/vt/renderer.ts +27 -5
  343. package/src/tree/index.ts +6 -4
  344. package/dist/markdown/ast.d.ts.map +0 -1
  345. package/dist/markdown/ast.js +0 -17
  346. package/dist/markdown/ast.js.map +0 -1
  347. package/dist/markdown/parse.d.ts.map +0 -1
  348. package/dist/markdown/parse.js.map +0 -1
  349. package/dist/markdown/tags.d.ts.map +0 -1
  350. package/dist/markdown/tags.js.map +0 -1
  351. /package/dist/{markdown → internal/markdown}/parse.d.ts +0 -0
  352. /package/dist/{markdown → internal/markdown}/tags.d.ts +0 -0
  353. /package/dist/{markdown → internal/markdown}/tags.js +0 -0
  354. /package/src/{markdown → internal/markdown}/tags.ts +0 -0
@@ -44,6 +44,7 @@ import type { DrawnNode, ScrollableNode } from 'react-x11';
44
44
  import type { RowHeights, RowKey } from './heights.js';
45
45
  import { afterLayout, cancelAfterLayout } from './timers.js';
46
46
  import type { LayoutTick } from './timers.js';
47
+ import { scaleOf } from './units.js';
47
48
 
48
49
  /** All a reveal needs of a row: `<TreeRow>` and `<TableRow>` are both this. */
49
50
  interface Keyed {
@@ -100,8 +101,9 @@ export interface Reveal {
100
101
  /** Scroll the pane, recording that this component is the one that asked. */
101
102
  scrollTo(y: number): void;
102
103
  /** An `onScroll` arrived. One this component did not ask for is the user
103
- * taking over, and it cancels whatever was owed. */
104
- heard(scrollY: number): void;
104
+ * taking over, and it cancels whatever was owed. Answers whether it was
105
+ * this component's own. */
106
+ heard(scrollY: number): boolean;
105
107
  }
106
108
 
107
109
  /**
@@ -148,13 +150,17 @@ export function useReveal(sources: RevealSources): Reveal {
148
150
  const scrollTo = useCallback((y: number): void => {
149
151
  const box = src.current.box.current;
150
152
  if (!box) return;
153
+ // `y` is logical, like everything the reveal computes with; the raw
154
+ // node properties are device (../internal/units.ts), divided here so the
155
+ // clamp and the early-out speak the caller's unit.
156
+ const s = scaleOf(box);
151
157
  // Clamped here rather than left to the container, so what comes back on
152
158
  // `onScroll` is the number that was asked for and can be recognised.
153
159
  const to = Math.min(
154
160
  Math.max(0, y),
155
- Math.max(0, box.contentHeight - box.abs.height),
161
+ Math.max(0, (box.contentHeight - box.abs.height) / s),
156
162
  );
157
- if (to === box.scrollY) return;
163
+ if (to === box.scrollY / s) return;
158
164
  asked.current = to;
159
165
  box.scrollTo({ y: to });
160
166
  }, []);
@@ -166,9 +172,10 @@ export function useReveal(sources: RevealSources): Reveal {
166
172
  const box = src.current.box.current;
167
173
  const want = owedShift.current;
168
174
  if (!box || want === 0) return;
169
- const was = box.scrollY;
175
+ const s = scaleOf(box);
176
+ const was = box.scrollY / s;
170
177
  scrollTo(was + want);
171
- owedShift.current = want - (box.scrollY - was);
178
+ owedShift.current = want - (box.scrollY / s - was);
172
179
  }, [scrollTo]);
173
180
 
174
181
  const nudge = useCallback(
@@ -208,7 +215,10 @@ export function useReveal(sources: RevealSources): Reveal {
208
215
  settled.current = null;
209
216
  return;
210
217
  }
211
- const viewport = box.abs.height;
218
+ // Logical, like the height index the unmounted arithmetic mixes with —
219
+ // the raw properties are device (../internal/units.ts).
220
+ const s = scaleOf(box);
221
+ const viewport = box.abs.height / s;
212
222
  if (viewport <= 0) return; // nothing laid out to scroll inside yet
213
223
 
214
224
  // How far the row is outside the pane, in pixels of scrolling. The row's
@@ -223,16 +233,20 @@ export function useReveal(sources: RevealSources): Reveal {
223
233
  : null;
224
234
  const placed = mounted
225
235
  ? {
226
- above: box.abs.y - mounted.abs.y,
227
- below: mounted.abs.y + mounted.abs.height - (box.abs.y + viewport),
228
- height: mounted.abs.height,
236
+ above: (box.abs.y - mounted.abs.y) / s,
237
+ below:
238
+ (mounted.abs.y +
239
+ mounted.abs.height -
240
+ (box.abs.y + box.abs.height)) /
241
+ s,
242
+ height: mounted.abs.height / s,
229
243
  }
230
244
  : {
231
- above: box.scrollY - heights.offsetAt(at),
245
+ above: box.scrollY / s - heights.offsetAt(at),
232
246
  below:
233
247
  heights.offsetAt(at) +
234
248
  heights.heightAt(at) -
235
- (box.scrollY + viewport),
249
+ (box.scrollY / s + viewport),
236
250
  height: heights.heightAt(at),
237
251
  };
238
252
  /**
@@ -254,8 +268,8 @@ export function useReveal(sources: RevealSources): Reveal {
254
268
  */
255
269
  let certain = mounted !== null || heights.isMeasured(at);
256
270
  if (certain && heights.hasMeasurements()) {
257
- const from = Math.min(at, heights.indexAt(box.scrollY));
258
- const to = Math.max(at, heights.indexAt(box.scrollY + viewport));
271
+ const from = Math.min(at, heights.indexAt(box.scrollY / s));
272
+ const to = Math.max(at, heights.indexAt(box.scrollY / s + viewport));
259
273
  for (let i = from; i <= to && certain; i++) {
260
274
  certain = heights.isMeasured(i);
261
275
  }
@@ -283,8 +297,10 @@ export function useReveal(sources: RevealSources): Reveal {
283
297
  }
284
298
  // A move the pane cannot make yet leaves the debt standing: the layout
285
299
  // that admits the rows just appended is the one that will let it finish.
300
+ // `was` in device, compared against the same raw property — whether it
301
+ // moved is unit-free; the request itself goes through logical scrollTo.
286
302
  const was = box.scrollY;
287
- scrollTo(was + move);
303
+ scrollTo(was / s + move);
288
304
  if (box.scrollY !== was) {
289
305
  stuck.current = null; // it moved; the scroll it caused brings us back
290
306
  return;
@@ -321,15 +337,20 @@ export function useReveal(sources: RevealSources): Reveal {
321
337
  [retry],
322
338
  );
323
339
 
324
- const heard = useCallback((scrollY: number): void => {
340
+ const heard = useCallback((scrollY: number): boolean => {
325
341
  // A scroll this component did not ask for ends the whole chase, not just
326
- // the outstanding half of it.
327
- if (scrollY !== asked.current) {
342
+ // the outstanding half of it. Within half a pixel is ours: the payload
343
+ // is the device offset divided back to logical, and at a fractional
344
+ // scale that round trip need not be bit-identical to what was asked.
345
+ const ours =
346
+ asked.current !== null && Math.abs(scrollY - asked.current) < 0.5;
347
+ if (!ours) {
328
348
  owed.current = null;
329
349
  settled.current = null;
330
350
  owedShift.current = 0;
331
351
  }
332
352
  asked.current = null;
353
+ return ours;
333
354
  }, []);
334
355
 
335
356
  // One stable object, not a fresh literal per render: callbacks built on
@@ -0,0 +1,34 @@
1
+ // One logical pixel is `scale` device pixels — react-x11's docs/scale.md.
2
+ //
3
+ // **Shared between `<Tree>` and `<Table>`** like the rest of this directory;
4
+ // see the header of `./heights.ts` for why it is internal rather than a
5
+ // shared module with a subpath.
6
+ //
7
+ // The virtualizers keep their whole model in logical pixels: style lengths,
8
+ // the `onScroll`/`onViewport` payloads, the height index, and the props
9
+ // (`rowHeight`, `estimatedRowHeight`) are all logical. But the **raw node
10
+ // properties** they read back between events — `scrollY`, `contentHeight`,
11
+ // `abs` — are device pixels. At scale 1 the two units coincide, which is how
12
+ // every harness test and every Xvfb check passed while a retina display
13
+ // doubled every raw read: the offset re-read after layout landed at twice
14
+ // the logical value, the slice was rebuilt a viewport below where the user
15
+ // was looking, and the table example went blank on a flick (and stayed
16
+ // blank after an append-and-reveal). Every raw read goes through this
17
+ // divisor so the arithmetic stays in one unit.
18
+ //
19
+ // **A pointer is the other half of this.** An event's `x`/`y` are logical,
20
+ // so a gesture measured against a laid-out box wants the box in that unit:
21
+ // `node.getClientRects()[0]`, which is `abs` already divided, rather than
22
+ // `abs` and a multiply. `<ColorPicker>` compared the two directly and put
23
+ // its thumb a quarter of the way from the corner on every retina panel.
24
+ // Reach for `scaleOf` where there is no rect to ask for — a raw `scrollY`,
25
+ // a `contentHeight`, a constant that never passes through a style.
26
+ //
27
+ // `scale` is on every retained node at run time but not on the public
28
+ // `DrawnNode` type — hence the structural read, and `object` rather than
29
+ // `{ scale?: unknown }` in the signature: a weak type with no property in
30
+ // common with `DrawnNode` fails TS2559 at every call site.
31
+ export function scaleOf(node: object | null | undefined): number {
32
+ const s = node ? (node as { scale?: unknown }).scale : undefined;
33
+ return typeof s === 'number' && s > 0 ? s : 1;
34
+ }
@@ -48,6 +48,7 @@ import type { ScrollableNode } from 'react-x11';
48
48
  import type { RowHeights, RowKey } from './heights.js';
49
49
  import { cancelLater, later } from './timers.js';
50
50
  import type { DelayTick } from './timers.js';
51
+ import { scaleOf } from './units.js';
51
52
 
52
53
  /** All this needs of a row — `TreeRow` and `TableRow` are both this. */
53
54
  interface Keyed {
@@ -298,7 +299,6 @@ export function useVirtualWindow(inputs: VirtualWindowInputs): VirtualWindow {
298
299
  // one has no slice to rebuild, and re-rendering it on a scroll it
299
300
  // already drew would be work for nothing.
300
301
  if (!inp.current.virtualizing) return;
301
- (globalThis as any).__scrolls = ((globalThis as any).__scrolls ?? 0) + 1;
302
302
  const now = Date.now();
303
303
  const s = vel.current;
304
304
  const dt = now - s.t;
@@ -332,7 +332,9 @@ export function useVirtualWindow(inputs: VirtualWindowInputs): VirtualWindow {
332
332
  const { box, virtualizing } = inp.current;
333
333
  const node = box.current;
334
334
  if (!node || !virtualizing) return;
335
- const y = node.scrollY;
335
+ // The raw property is device pixels; the viewport model — like the
336
+ // `onScroll` payload `scrolled` is fed — is logical (../internal/units.ts).
337
+ const y = node.scrollY / scaleOf(node);
336
338
  setView((prev) => (prev.top === y ? prev : { ...prev, top: y }));
337
339
  }, []);
338
340