@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.
- package/README.md +295 -51
- package/dist/charts/node.d.ts +1 -1
- package/dist/charts/node.d.ts.map +1 -1
- package/dist/charts/node.js +6 -2
- package/dist/charts/node.js.map +1 -1
- package/dist/color-picker/ColorPicker.d.ts.map +1 -1
- package/dist/color-picker/ColorPicker.js +43 -33
- package/dist/color-picker/ColorPicker.js.map +1 -1
- package/dist/embed/client.d.ts +48 -3
- package/dist/embed/client.d.ts.map +1 -1
- package/dist/embed/client.js +79 -5
- package/dist/embed/client.js.map +1 -1
- package/dist/embed/index.d.ts +1 -1
- package/dist/embed/index.d.ts.map +1 -1
- package/dist/embed/index.js +1 -1
- package/dist/embed/index.js.map +1 -1
- package/dist/html/node.d.ts +3 -1
- package/dist/html/node.d.ts.map +1 -1
- package/dist/html/node.js +7 -5
- package/dist/html/node.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/{markdown → internal/markdown}/ast.d.ts +12 -0
- package/dist/internal/markdown/ast.d.ts.map +1 -0
- package/dist/internal/markdown/ast.js +22 -0
- package/dist/internal/markdown/ast.js.map +1 -0
- package/dist/internal/markdown/parse.d.ts.map +1 -0
- package/dist/{markdown → internal/markdown}/parse.js +112 -22
- package/dist/internal/markdown/parse.js.map +1 -0
- package/dist/internal/markdown/stringify.d.ts +4 -0
- package/dist/internal/markdown/stringify.d.ts.map +1 -0
- package/dist/internal/markdown/stringify.js +684 -0
- package/dist/internal/markdown/stringify.js.map +1 -0
- package/dist/internal/markdown/tags.d.ts.map +1 -0
- package/dist/internal/markdown/tags.js.map +1 -0
- package/dist/internal/scroll.d.ts +3 -2
- package/dist/internal/scroll.d.ts.map +1 -1
- package/dist/internal/scroll.js +33 -15
- package/dist/internal/scroll.js.map +1 -1
- package/dist/internal/units.d.ts +2 -0
- package/dist/internal/units.d.ts.map +1 -0
- package/dist/internal/units.js +35 -0
- package/dist/internal/units.js.map +1 -0
- package/dist/internal/window.d.ts.map +1 -1
- package/dist/internal/window.js +4 -2
- package/dist/internal/window.js.map +1 -1
- package/dist/maps/anchors.d.ts +98 -0
- package/dist/maps/anchors.d.ts.map +1 -0
- package/dist/maps/anchors.js +531 -0
- package/dist/maps/anchors.js.map +1 -0
- package/dist/maps/controller.d.ts +283 -0
- package/dist/maps/controller.d.ts.map +1 -0
- package/dist/maps/controller.js +743 -0
- package/dist/maps/controller.js.map +1 -0
- package/dist/maps/gl/buckets.d.ts +95 -0
- package/dist/maps/gl/buckets.d.ts.map +1 -0
- package/dist/maps/gl/buckets.js +362 -0
- package/dist/maps/gl/buckets.js.map +1 -0
- package/dist/maps/gl/build-worker.d.ts +13 -0
- package/dist/maps/gl/build-worker.d.ts.map +1 -0
- package/dist/maps/gl/build-worker.js +44 -0
- package/dist/maps/gl/build-worker.js.map +1 -0
- package/dist/maps/gl/color.d.ts +8 -0
- package/dist/maps/gl/color.d.ts.map +1 -0
- package/dist/maps/gl/color.js +57 -0
- package/dist/maps/gl/color.js.map +1 -0
- package/dist/maps/gl/cover.d.ts +51 -0
- package/dist/maps/gl/cover.d.ts.map +1 -0
- package/dist/maps/gl/cover.js +124 -0
- package/dist/maps/gl/cover.js.map +1 -0
- package/dist/maps/gl/index.d.ts +3 -0
- package/dist/maps/gl/index.d.ts.map +1 -0
- package/dist/maps/gl/index.js +20 -0
- package/dist/maps/gl/index.js.map +1 -0
- package/dist/maps/gl/markers.d.ts +28 -0
- package/dist/maps/gl/markers.d.ts.map +1 -0
- package/dist/maps/gl/markers.js +60 -0
- package/dist/maps/gl/markers.js.map +1 -0
- package/dist/maps/gl/overlays.d.ts +68 -0
- package/dist/maps/gl/overlays.d.ts.map +1 -0
- package/dist/maps/gl/overlays.js +300 -0
- package/dist/maps/gl/overlays.js.map +1 -0
- package/dist/maps/gl/pane.d.ts +12 -0
- package/dist/maps/gl/pane.d.ts.map +1 -0
- package/dist/maps/gl/pane.js +37 -0
- package/dist/maps/gl/pane.js.map +1 -0
- package/dist/maps/gl/placement.d.ts +111 -0
- package/dist/maps/gl/placement.d.ts.map +1 -0
- package/dist/maps/gl/placement.js +567 -0
- package/dist/maps/gl/placement.js.map +1 -0
- package/dist/maps/gl/renderer.d.ts +352 -0
- package/dist/maps/gl/renderer.d.ts.map +1 -0
- package/dist/maps/gl/renderer.js +1127 -0
- package/dist/maps/gl/renderer.js.map +1 -0
- package/dist/maps/gl/shaders.d.ts +120 -0
- package/dist/maps/gl/shaders.d.ts.map +1 -0
- package/dist/maps/gl/shaders.js +451 -0
- package/dist/maps/gl/shaders.js.map +1 -0
- package/dist/maps/gl/store.d.ts +115 -0
- package/dist/maps/gl/store.d.ts.map +1 -0
- package/dist/maps/gl/store.js +469 -0
- package/dist/maps/gl/store.js.map +1 -0
- package/dist/maps/gl/text.d.ts +154 -0
- package/dist/maps/gl/text.d.ts.map +1 -0
- package/dist/maps/gl/text.js +382 -0
- package/dist/maps/gl/text.js.map +1 -0
- package/dist/maps/gl/view.d.ts +54 -0
- package/dist/maps/gl/view.d.ts.map +1 -0
- package/dist/maps/gl/view.js +974 -0
- package/dist/maps/gl/view.js.map +1 -0
- package/dist/maps/index.d.ts +1 -1
- package/dist/maps/index.d.ts.map +1 -1
- package/dist/maps/index.js +216 -52
- package/dist/maps/index.js.map +1 -1
- package/dist/maps/labels.d.ts +37 -16
- package/dist/maps/labels.d.ts.map +1 -1
- package/dist/maps/labels.js +188 -119
- package/dist/maps/labels.js.map +1 -1
- package/dist/maps/node.d.ts +162 -56
- package/dist/maps/node.d.ts.map +1 -1
- package/dist/maps/node.js +607 -515
- package/dist/maps/node.js.map +1 -1
- package/dist/maps/overlay.d.ts +72 -9
- package/dist/maps/overlay.d.ts.map +1 -1
- package/dist/maps/overlay.js +108 -28
- package/dist/maps/overlay.js.map +1 -1
- package/dist/maps/paint.d.ts +3 -0
- package/dist/maps/paint.d.ts.map +1 -1
- package/dist/maps/paint.js.map +1 -1
- package/dist/maps/proj.d.ts +14 -0
- package/dist/maps/proj.d.ts.map +1 -1
- package/dist/maps/proj.js +28 -0
- package/dist/maps/proj.js.map +1 -1
- package/dist/maps/renderer.d.ts +69 -0
- package/dist/maps/renderer.d.ts.map +1 -0
- package/dist/maps/renderer.js +66 -0
- package/dist/maps/renderer.js.map +1 -0
- package/dist/maps/sources.d.ts +25 -3
- package/dist/maps/sources.d.ts.map +1 -1
- package/dist/maps/sources.js +17 -0
- package/dist/maps/sources.js.map +1 -1
- package/dist/maps/theme.d.ts +19 -0
- package/dist/maps/theme.d.ts.map +1 -0
- package/dist/maps/theme.js +44 -0
- package/dist/maps/theme.js.map +1 -0
- package/dist/maps/tiles.d.ts +117 -17
- package/dist/maps/tiles.d.ts.map +1 -1
- package/dist/maps/tiles.js +163 -30
- package/dist/maps/tiles.js.map +1 -1
- package/dist/maps/types.d.ts +188 -20
- package/dist/maps/types.d.ts.map +1 -1
- package/dist/markdown/expressions.d.ts +1 -1
- package/dist/markdown/expressions.d.ts.map +1 -1
- package/dist/markdown/expressions.js.map +1 -1
- package/dist/markdown/index.d.ts +7 -6
- package/dist/markdown/index.d.ts.map +1 -1
- package/dist/markdown/index.js +9 -7
- package/dist/markdown/index.js.map +1 -1
- package/dist/markdown/spans.d.ts +1 -1
- package/dist/markdown/spans.d.ts.map +1 -1
- package/dist/media-player/index.d.ts +11 -3
- package/dist/media-player/index.d.ts.map +1 -1
- package/dist/media-player/index.js +13 -2
- package/dist/media-player/index.js.map +1 -1
- package/dist/rich-text-editor/clipboard.d.ts +23 -0
- package/dist/rich-text-editor/clipboard.d.ts.map +1 -0
- package/dist/rich-text-editor/clipboard.js +307 -0
- package/dist/rich-text-editor/clipboard.js.map +1 -0
- package/dist/rich-text-editor/collab.d.ts +32 -0
- package/dist/rich-text-editor/collab.d.ts.map +1 -0
- package/dist/rich-text-editor/collab.js +55 -0
- package/dist/rich-text-editor/collab.js.map +1 -0
- package/dist/rich-text-editor/commands.d.ts +50 -0
- package/dist/rich-text-editor/commands.d.ts.map +1 -0
- package/dist/rich-text-editor/commands.js +376 -0
- package/dist/rich-text-editor/commands.js.map +1 -0
- package/dist/rich-text-editor/drag.d.ts +68 -0
- package/dist/rich-text-editor/drag.d.ts.map +1 -0
- package/dist/rich-text-editor/drag.js +148 -0
- package/dist/rich-text-editor/drag.js.map +1 -0
- package/dist/rich-text-editor/html.d.ts +145 -0
- package/dist/rich-text-editor/html.d.ts.map +1 -0
- package/dist/rich-text-editor/html.js +516 -0
- package/dist/rich-text-editor/html.js.map +1 -0
- package/dist/rich-text-editor/index.d.ts +263 -0
- package/dist/rich-text-editor/index.d.ts.map +1 -0
- package/dist/rich-text-editor/index.js +822 -0
- package/dist/rich-text-editor/index.js.map +1 -0
- package/dist/rich-text-editor/inline.d.ts +94 -0
- package/dist/rich-text-editor/inline.d.ts.map +1 -0
- package/dist/rich-text-editor/inline.js +252 -0
- package/dist/rich-text-editor/inline.js.map +1 -0
- package/dist/rich-text-editor/keymap.d.ts +71 -0
- package/dist/rich-text-editor/keymap.d.ts.map +1 -0
- package/dist/rich-text-editor/keymap.js +393 -0
- package/dist/rich-text-editor/keymap.js.map +1 -0
- package/dist/rich-text-editor/keys.d.ts +29 -0
- package/dist/rich-text-editor/keys.d.ts.map +1 -0
- package/dist/rich-text-editor/keys.js +93 -0
- package/dist/rich-text-editor/keys.js.map +1 -0
- package/dist/rich-text-editor/look.d.ts +71 -0
- package/dist/rich-text-editor/look.d.ts.map +1 -0
- package/dist/rich-text-editor/look.js +342 -0
- package/dist/rich-text-editor/look.js.map +1 -0
- package/dist/rich-text-editor/markdown.d.ts +18 -0
- package/dist/rich-text-editor/markdown.d.ts.map +1 -0
- package/dist/rich-text-editor/markdown.js +496 -0
- package/dist/rich-text-editor/markdown.js.map +1 -0
- package/dist/rich-text-editor/nodes.d.ts +135 -0
- package/dist/rich-text-editor/nodes.d.ts.map +1 -0
- package/dist/rich-text-editor/nodes.js +397 -0
- package/dist/rich-text-editor/nodes.js.map +1 -0
- package/dist/rich-text-editor/render.d.ts +68 -0
- package/dist/rich-text-editor/render.d.ts.map +1 -0
- package/dist/rich-text-editor/render.js +500 -0
- package/dist/rich-text-editor/render.js.map +1 -0
- package/dist/rich-text-editor/schema.d.ts +16 -0
- package/dist/rich-text-editor/schema.d.ts.map +1 -0
- package/dist/rich-text-editor/schema.js +386 -0
- package/dist/rich-text-editor/schema.js.map +1 -0
- package/dist/rich-text-editor/store.d.ts +11 -0
- package/dist/rich-text-editor/store.d.ts.map +1 -0
- package/dist/rich-text-editor/store.js +43 -0
- package/dist/rich-text-editor/store.js.map +1 -0
- package/dist/rich-text-editor/suggest.d.ts +127 -0
- package/dist/rich-text-editor/suggest.d.ts.map +1 -0
- package/dist/rich-text-editor/suggest.js +0 -0
- package/dist/rich-text-editor/suggest.js.map +1 -0
- package/dist/rich-text-editor/tables.d.ts +41 -0
- package/dist/rich-text-editor/tables.d.ts.map +1 -0
- package/dist/rich-text-editor/tables.js +204 -0
- package/dist/rich-text-editor/tables.js.map +1 -0
- package/dist/rich-text-editor/toolbar.d.ts +58 -0
- package/dist/rich-text-editor/toolbar.d.ts.map +1 -0
- package/dist/rich-text-editor/toolbar.js +548 -0
- package/dist/rich-text-editor/toolbar.js.map +1 -0
- package/dist/rich-text-editor/view.d.ts +368 -0
- package/dist/rich-text-editor/view.d.ts.map +1 -0
- package/dist/rich-text-editor/view.js +1968 -0
- package/dist/rich-text-editor/view.js.map +1 -0
- package/dist/rich-text-editor/virtual.d.ts +54 -0
- package/dist/rich-text-editor/virtual.d.ts.map +1 -0
- package/dist/rich-text-editor/virtual.js +262 -0
- package/dist/rich-text-editor/virtual.js.map +1 -0
- package/dist/richtext/node.d.ts +25 -2
- package/dist/richtext/node.d.ts.map +1 -1
- package/dist/richtext/node.js +46 -24
- package/dist/richtext/node.js.map +1 -1
- package/dist/table/index.d.ts.map +1 -1
- package/dist/table/index.js +14 -5
- package/dist/table/index.js.map +1 -1
- package/dist/terminal/backends.d.ts +4 -1
- package/dist/terminal/backends.d.ts.map +1 -1
- package/dist/terminal/backends.js.map +1 -1
- package/dist/terminal/index.d.ts +18 -7
- package/dist/terminal/index.d.ts.map +1 -1
- package/dist/terminal/index.js +28 -11
- package/dist/terminal/index.js.map +1 -1
- package/dist/terminal/vt/node.d.ts +56 -3
- package/dist/terminal/vt/node.d.ts.map +1 -1
- package/dist/terminal/vt/node.js +106 -26
- package/dist/terminal/vt/node.js.map +1 -1
- package/dist/terminal/vt/renderer.d.ts +4 -0
- package/dist/terminal/vt/renderer.d.ts.map +1 -1
- package/dist/terminal/vt/renderer.js +14 -5
- package/dist/terminal/vt/renderer.js.map +1 -1
- package/dist/tree/index.d.ts.map +1 -1
- package/dist/tree/index.js +6 -4
- package/dist/tree/index.js.map +1 -1
- package/package.json +23 -4
- package/src/charts/node.ts +6 -2
- package/src/color-picker/ColorPicker.ts +107 -81
- package/src/embed/client.ts +102 -8
- package/src/embed/index.ts +2 -0
- package/src/html/node.ts +7 -5
- package/src/index.ts +2 -0
- package/src/{markdown → internal/markdown}/ast.ts +24 -7
- package/src/{markdown → internal/markdown}/parse.ts +134 -24
- package/src/internal/markdown/stringify.ts +772 -0
- package/src/internal/scroll.ts +39 -18
- package/src/internal/units.ts +34 -0
- package/src/internal/window.ts +4 -2
- package/src/maps/anchors.ts +607 -0
- package/src/maps/controller.ts +999 -0
- package/src/maps/gl/buckets.ts +457 -0
- package/src/maps/gl/build-worker.ts +55 -0
- package/src/maps/gl/color.ts +62 -0
- package/src/maps/gl/cover.ts +170 -0
- package/src/maps/gl/index.ts +23 -0
- package/src/maps/gl/markers.ts +83 -0
- package/src/maps/gl/overlays.ts +379 -0
- package/src/maps/gl/pane.ts +42 -0
- package/src/maps/gl/placement.ts +816 -0
- package/src/maps/gl/renderer.ts +1576 -0
- package/src/maps/gl/shaders.ts +486 -0
- package/src/maps/gl/store.ts +566 -0
- package/src/maps/gl/text.ts +495 -0
- package/src/maps/gl/view.ts +1224 -0
- package/src/maps/index.ts +270 -81
- package/src/maps/labels.ts +214 -121
- package/src/maps/node.ts +763 -629
- package/src/maps/overlay.ts +148 -43
- package/src/maps/paint.ts +3 -0
- package/src/maps/proj.ts +31 -0
- package/src/maps/renderer.ts +155 -0
- package/src/maps/sources.ts +38 -3
- package/src/maps/theme.ts +51 -0
- package/src/maps/tiles.ts +191 -33
- package/src/maps/types.ts +188 -20
- package/src/markdown/expressions.ts +5 -1
- package/src/markdown/index.ts +14 -11
- package/src/markdown/spans.ts +1 -1
- package/src/media-player/index.ts +18 -4
- package/src/rich-text-editor/clipboard.ts +439 -0
- package/src/rich-text-editor/collab.ts +91 -0
- package/src/rich-text-editor/commands.ts +448 -0
- package/src/rich-text-editor/dom-globals.d.ts +23 -0
- package/src/rich-text-editor/drag.ts +211 -0
- package/src/rich-text-editor/html.ts +619 -0
- package/src/rich-text-editor/index.ts +1331 -0
- package/src/rich-text-editor/inline.ts +345 -0
- package/src/rich-text-editor/keymap.ts +510 -0
- package/src/rich-text-editor/keys.ts +119 -0
- package/src/rich-text-editor/look.ts +427 -0
- package/src/rich-text-editor/markdown.ts +653 -0
- package/src/rich-text-editor/nodes.ts +497 -0
- package/src/rich-text-editor/render.ts +800 -0
- package/src/rich-text-editor/schema.ts +431 -0
- package/src/rich-text-editor/store.ts +39 -0
- package/src/rich-text-editor/suggest.ts +597 -0
- package/src/rich-text-editor/tables.ts +272 -0
- package/src/rich-text-editor/toolbar.ts +724 -0
- package/src/rich-text-editor/view.ts +2287 -0
- package/src/rich-text-editor/virtual.ts +347 -0
- package/src/richtext/node.ts +59 -30
- package/src/table/index.ts +14 -5
- package/src/terminal/backends.ts +4 -1
- package/src/terminal/index.ts +43 -15
- package/src/terminal/vt/node.ts +128 -29
- package/src/terminal/vt/renderer.ts +27 -5
- package/src/tree/index.ts +6 -4
- package/dist/markdown/ast.d.ts.map +0 -1
- package/dist/markdown/ast.js +0 -17
- package/dist/markdown/ast.js.map +0 -1
- package/dist/markdown/parse.d.ts.map +0 -1
- package/dist/markdown/parse.js.map +0 -1
- package/dist/markdown/tags.d.ts.map +0 -1
- package/dist/markdown/tags.js.map +0 -1
- /package/dist/{markdown → internal/markdown}/parse.d.ts +0 -0
- /package/dist/{markdown → internal/markdown}/tags.d.ts +0 -0
- /package/dist/{markdown → internal/markdown}/tags.js +0 -0
- /package/src/{markdown → internal/markdown}/tags.ts +0 -0
package/src/internal/scroll.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
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:
|
|
228
|
-
|
|
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):
|
|
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
|
-
|
|
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
|
+
}
|
package/src/internal/window.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
|