@commentray/render 0.1.2 → 0.3.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/dist/block-stretch-buffer-sync.d.ts +16 -0
- package/dist/block-stretch-buffer-sync.d.ts.map +1 -0
- package/dist/block-stretch-buffer-sync.js +271 -0
- package/dist/block-stretch-buffer-sync.js.map +1 -0
- package/dist/block-stretch-layout.d.ts +18 -5
- package/dist/block-stretch-layout.d.ts.map +1 -1
- package/dist/block-stretch-layout.js +121 -43
- package/dist/block-stretch-layout.js.map +1 -1
- package/dist/browse-page-slug.d.ts +3 -4
- package/dist/browse-page-slug.d.ts.map +1 -1
- package/dist/browse-page-slug.js +3 -4
- package/dist/browse-page-slug.js.map +1 -1
- package/dist/build-commentray-nav-search.d.ts +2 -2
- package/dist/build-commentray-nav-search.d.ts.map +1 -1
- package/dist/build-commentray-nav-search.js +8 -3
- package/dist/build-commentray-nav-search.js.map +1 -1
- package/dist/code-browser-block-rays.d.ts +11 -0
- package/dist/code-browser-block-rays.d.ts.map +1 -1
- package/dist/code-browser-block-rays.js +25 -5
- package/dist/code-browser-block-rays.js.map +1 -1
- package/dist/code-browser-client.bundle.js +12 -11
- package/dist/code-browser-client.js +1484 -265
- package/dist/code-browser-client.js.map +1 -1
- package/dist/code-browser-pair-nav.d.ts +9 -2
- package/dist/code-browser-pair-nav.d.ts.map +1 -1
- package/dist/code-browser-pair-nav.js +53 -14
- package/dist/code-browser-pair-nav.js.map +1 -1
- package/dist/code-browser-scroll-buffer-equalize.d.ts +25 -0
- package/dist/code-browser-scroll-buffer-equalize.d.ts.map +1 -0
- package/dist/code-browser-scroll-buffer-equalize.js +316 -0
- package/dist/code-browser-scroll-buffer-equalize.js.map +1 -0
- package/dist/code-browser-scroll-sync-monotonic.d.ts +17 -0
- package/dist/code-browser-scroll-sync-monotonic.d.ts.map +1 -0
- package/dist/code-browser-scroll-sync-monotonic.js +22 -0
- package/dist/code-browser-scroll-sync-monotonic.js.map +1 -0
- package/dist/code-browser-scroll-sync-strategy.d.ts +12 -0
- package/dist/code-browser-scroll-sync-strategy.d.ts.map +1 -0
- package/dist/code-browser-scroll-sync-strategy.js +28 -0
- package/dist/code-browser-scroll-sync-strategy.js.map +1 -0
- package/dist/code-browser-scroll-sync.d.ts +2 -2
- package/dist/code-browser-scroll-sync.d.ts.map +1 -1
- package/dist/code-browser-scroll-sync.js +1 -1
- package/dist/code-browser-scroll-sync.js.map +1 -1
- package/dist/code-browser-smooth-reveal-dedup.d.ts +25 -0
- package/dist/code-browser-smooth-reveal-dedup.d.ts.map +1 -0
- package/dist/code-browser-smooth-reveal-dedup.js +25 -0
- package/dist/code-browser-smooth-reveal-dedup.js.map +1 -0
- package/dist/code-browser.d.ts +25 -8
- package/dist/code-browser.d.ts.map +1 -1
- package/dist/code-browser.js +359 -86
- package/dist/code-browser.js.map +1 -1
- package/dist/commentray-anchor-viewport-probe.d.ts +5 -1
- package/dist/commentray-anchor-viewport-probe.d.ts.map +1 -1
- package/dist/commentray-anchor-viewport-probe.js +8 -2
- package/dist/commentray-anchor-viewport-probe.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/inject-md-line-anchors.d.ts +1 -1
- package/dist/inject-md-line-anchors.d.ts.map +1 -1
- package/dist/inject-md-line-anchors.js +9 -5
- package/dist/inject-md-line-anchors.js.map +1 -1
- package/dist/markdown-pipeline.js +1 -1
- package/dist/markdown-pipeline.js.map +1 -1
- package/dist/mermaid-runtime-html.d.ts.map +1 -1
- package/dist/mermaid-runtime-html.js +4 -1
- package/dist/mermaid-runtime-html.js.map +1 -1
- package/dist/reading-viewport-comfort.d.ts +12 -0
- package/dist/reading-viewport-comfort.d.ts.map +1 -0
- package/dist/reading-viewport-comfort.js +14 -0
- package/dist/reading-viewport-comfort.js.map +1 -0
- package/package.json +2 -2
|
@@ -20,34 +20,44 @@ export function siteRootPathnameFromPathname(pathname) {
|
|
|
20
20
|
return "/";
|
|
21
21
|
return noFile.replace(/\/+$/, "") || "/";
|
|
22
22
|
}
|
|
23
|
-
/**
|
|
24
|
-
const
|
|
25
|
-
/**
|
|
26
|
-
|
|
23
|
+
/** Indexed pair page: `./browse/…/index.html` or path-absolute `/browse/…/index.html`. */
|
|
24
|
+
const STATIC_BROWSE_INDEXED = /^(?:\.\/|\/)?browse\/(.+)\/index\.html$/i;
|
|
25
|
+
/**
|
|
26
|
+
* Flat HTML under `browse/`: a lone `*.html` file (e.g. legacy or opaque slug). Multi-angle pairs
|
|
27
|
+
* use indexed `./browse/…/…/index.html` only. Must not match indexed URLs ending in `/index.html`
|
|
28
|
+
* (check {@link STATIC_BROWSE_INDEXED} first).
|
|
29
|
+
*/
|
|
30
|
+
const STATIC_BROWSE_FLAT_HTML = /^(?:\.\/|\/)?browse\/(.+\.html)$/i;
|
|
27
31
|
/** True when `href` is hub-root-relative static browse (not same-dir `./other.html`). */
|
|
32
|
+
function isStaticBrowseIndexedHref(t) {
|
|
33
|
+
return STATIC_BROWSE_INDEXED.test(t);
|
|
34
|
+
}
|
|
35
|
+
function isStaticBrowseFlatHtmlHref(t) {
|
|
36
|
+
return STATIC_BROWSE_FLAT_HTML.test(t) && !t.toLowerCase().endsWith("/index.html");
|
|
37
|
+
}
|
|
28
38
|
export function isHubRelativeStaticBrowseHref(href) {
|
|
29
39
|
const t = href.trim();
|
|
30
|
-
return
|
|
40
|
+
return isStaticBrowseIndexedHref(t) || isStaticBrowseFlatHtmlHref(t);
|
|
31
41
|
}
|
|
32
42
|
/**
|
|
33
|
-
* Resolves `staticBrowseUrl` from nav JSON (
|
|
43
|
+
* Resolves `staticBrowseUrl` from nav JSON (`./browse/…/index.html` or legacy flat `./browse/…@….html`) to an absolute href.
|
|
34
44
|
*/
|
|
35
45
|
export function resolveStaticBrowseHref(relativeBrowse, pathname, origin) {
|
|
36
46
|
const r = relativeBrowse.trim();
|
|
37
47
|
if (r.startsWith("/"))
|
|
38
48
|
return `${origin}${r}`;
|
|
39
49
|
const root = siteRootPathnameFromPathname(pathname);
|
|
40
|
-
const mFlat = STATIC_BROWSE_FLAT.exec(r);
|
|
41
|
-
if (mFlat?.[1]) {
|
|
42
|
-
const path = root === "/" ? `/browse/${mFlat[1]}` : `${root}/browse/${mFlat[1]}`;
|
|
43
|
-
return `${origin}${path}`;
|
|
44
|
-
}
|
|
45
50
|
const mIdx = STATIC_BROWSE_INDEXED.exec(r);
|
|
46
51
|
if (mIdx?.[1]) {
|
|
47
52
|
const inner = mIdx[1];
|
|
48
53
|
const path = root === "/" ? `/browse/${inner}/index.html` : `${root}/browse/${inner}/index.html`;
|
|
49
54
|
return `${origin}${path}`;
|
|
50
55
|
}
|
|
56
|
+
const mFlat = STATIC_BROWSE_FLAT_HTML.exec(r);
|
|
57
|
+
if (mFlat?.[1] && !r.toLowerCase().endsWith("/index.html")) {
|
|
58
|
+
const path = root === "/" ? `/browse/${mFlat[1]}` : `${root}/browse/${mFlat[1]}`;
|
|
59
|
+
return `${origin}${path}`;
|
|
60
|
+
}
|
|
51
61
|
return new URL(r, `${origin}${pathname}`).href;
|
|
52
62
|
}
|
|
53
63
|
/**
|
|
@@ -59,12 +69,12 @@ export function staticBrowseHrefForShellDataAttribute(staticBrowseUrl, pathname,
|
|
|
59
69
|
const r = staticBrowseUrl.trim();
|
|
60
70
|
if (r.length === 0)
|
|
61
71
|
return "";
|
|
62
|
-
const flat = STATIC_BROWSE_FLAT.exec(r);
|
|
63
|
-
if (flat?.[1])
|
|
64
|
-
return `./browse/${flat[1]}`;
|
|
65
72
|
const indexed = STATIC_BROWSE_INDEXED.exec(r);
|
|
66
73
|
if (indexed?.[1])
|
|
67
74
|
return `./browse/${indexed[1]}/index.html`;
|
|
75
|
+
const flat = STATIC_BROWSE_FLAT_HTML.exec(r);
|
|
76
|
+
if (flat?.[1] && !r.toLowerCase().endsWith("/index.html"))
|
|
77
|
+
return `./browse/${flat[1]}`;
|
|
68
78
|
return resolveStaticBrowseHref(r, pathname, origin);
|
|
69
79
|
}
|
|
70
80
|
export function findDocumentedPair(pairs, commentrayPath, sourcePath) {
|
|
@@ -82,6 +92,35 @@ export function findDocumentedPair(pairs, commentrayPath, sourcePath) {
|
|
|
82
92
|
}
|
|
83
93
|
return undefined;
|
|
84
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Opaque browse pages are files `browse/<slug>.html`. A bare `/…/browse/<slug>` (one segment after
|
|
97
|
+
* `browse/`, no `.` in the slug) has no static file on disk — append `.html` so dev server and
|
|
98
|
+
* address-bar sync match emitted assets (same link shape users should share).
|
|
99
|
+
*/
|
|
100
|
+
export function appendHtmlToOpaqueBrowsePathname(pathname) {
|
|
101
|
+
const needle = "/browse/";
|
|
102
|
+
const idx = pathname.lastIndexOf(needle);
|
|
103
|
+
if (idx < 0)
|
|
104
|
+
return pathname;
|
|
105
|
+
const rest = pathname.slice(idx + needle.length);
|
|
106
|
+
if (rest.length === 0 || rest.includes("/") || rest.includes("."))
|
|
107
|
+
return pathname;
|
|
108
|
+
return `${pathname.slice(0, idx + needle.length)}${rest}.html`;
|
|
109
|
+
}
|
|
110
|
+
/** Apply {@link appendHtmlToOpaqueBrowsePathname} to the path part of a request URL. */
|
|
111
|
+
export function appendHtmlToOpaqueBrowseRequestUrl(rawUrl) {
|
|
112
|
+
try {
|
|
113
|
+
const u = new URL(rawUrl, "http://localhost");
|
|
114
|
+
const nextPath = appendHtmlToOpaqueBrowsePathname(u.pathname);
|
|
115
|
+
if (nextPath === u.pathname)
|
|
116
|
+
return rawUrl;
|
|
117
|
+
u.pathname = nextPath;
|
|
118
|
+
return `${u.pathname}${u.search}${u.hash}`;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return rawUrl;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
85
124
|
export function isSameDocumentedPair(a, curSourcePath, curCommentrayPath) {
|
|
86
125
|
return (normPosixPath(a.sourcePath) === normPosixPath(curSourcePath) &&
|
|
87
126
|
normPosixPath(a.commentrayPath) === normPosixPath(curCommentrayPath));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-browser-pair-nav.js","sourceRoot":"","sources":["../src/code-browser-pair-nav.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,UAAU,aAAa,CAAC,CAAS;IACrC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAAC,QAAgB;IAC3D,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC1D,OAAO,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IACtC,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAChD,IAAI,MAAM,KAAK,EAAE,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC;IAChD,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;AAC3C,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"code-browser-pair-nav.js","sourceRoot":"","sources":["../src/code-browser-pair-nav.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,UAAU,aAAa,CAAC,CAAS;IACrC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAAC,QAAgB;IAC3D,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC1D,OAAO,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IACtC,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAChD,IAAI,MAAM,KAAK,EAAE,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC;IAChD,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;AAC3C,CAAC;AAED,0FAA0F;AAC1F,MAAM,qBAAqB,GAAG,0CAA0C,CAAC;AAEzE;;;;GAIG;AACH,MAAM,uBAAuB,GAAG,mCAAmC,CAAC;AAEpE,yFAAyF;AACzF,SAAS,yBAAyB,CAAC,CAAS;IAC1C,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,0BAA0B,CAAC,CAAS;IAC3C,OAAO,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,IAAY;IACxD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACtB,OAAO,yBAAyB,CAAC,CAAC,CAAC,IAAI,0BAA0B,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,cAAsB,EACtB,QAAgB,EAChB,MAAc;IAEd,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC;IAC9C,MAAM,IAAI,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3C,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,IAAI,GACR,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW,KAAK,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,WAAW,KAAK,aAAa,CAAC;QACtF,OAAO,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC;IAC5B,CAAC;IACD,MAAM,KAAK,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9C,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,WAAW,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,OAAO,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,GAAG,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qCAAqC,CACnD,eAAuB,EACvB,QAAgB,EAChB,MAAc;IAEd,MAAM,CAAC,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9C,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,YAAY,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;IAC7D,MAAM,IAAI,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7C,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAAE,OAAO,YAAY,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACxF,OAAO,uBAAuB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAAmB,EACnB,cAAsB,EACtB,UAAkB;IAElB,MAAM,EAAE,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC;QACtE,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;IACtB,CAAC;IACD,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;QAClE,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;IACtB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gCAAgC,CAAC,QAAgB;IAC/D,MAAM,MAAM,GAAG,UAAU,CAAC;IAC1B,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IACnF,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC;AACjE,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,kCAAkC,CAAC,MAAc;IAC/D,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,gCAAgC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC9D,IAAI,QAAQ,KAAK,CAAC,CAAC,QAAQ;YAAE,OAAO,MAAM,CAAC;QAC3C,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACtB,OAAO,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,CAAwB,EACxB,aAAqB,EACrB,iBAAyB;IAEzB,OAAO,CACL,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,aAAa,CAAC,aAAa,CAAC;QAC5D,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,aAAa,CAAC,iBAAiB,CAAC,CACrE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { BlockScrollLink } from "@commentray/core";
|
|
2
|
+
/** Class on spacer divs injected to equalize paired doc/code segment heights. */
|
|
3
|
+
export declare const COMMENTRAY_SYNC_BUFFER_CLASS = "commentray-sync-buffer";
|
|
4
|
+
export type InstallPerBlockScrollBuffersOptions = {
|
|
5
|
+
codePane: HTMLElement;
|
|
6
|
+
docScrollEl: HTMLElement;
|
|
7
|
+
/** Observed for `innerHTML` swaps (multi-angle); may equal `docScrollEl`. */
|
|
8
|
+
docBody: HTMLElement | null;
|
|
9
|
+
getLinks: () => BlockScrollLink[];
|
|
10
|
+
getLineIdPrefix: () => string;
|
|
11
|
+
};
|
|
12
|
+
export type PerBlockScrollBufferHandle = {
|
|
13
|
+
disconnect: () => void;
|
|
14
|
+
/** Re-run segment + total height buffers (same as internal resize/content schedule). */
|
|
15
|
+
scheduleReequalize: () => void;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Injects invisible spacer blocks so paired doc/code **segment** heights match (prelude, each
|
|
19
|
+
* indexed block including inter-block source lines until the next block, then tail), then pads
|
|
20
|
+
* the shorter pane so **total** `scrollHeight` matches. Proportional sync is then ~1:1 so paired
|
|
21
|
+
* lines stay aligned while scrolling. Re-runs on pane resize, doc DOM changes, and
|
|
22
|
+
* {@link PerBlockScrollBufferHandle.scheduleReequalize} (wrap, splitter, etc.).
|
|
23
|
+
*/
|
|
24
|
+
export declare function installPerBlockScrollBuffers(opts: InstallPerBlockScrollBuffersOptions): PerBlockScrollBufferHandle;
|
|
25
|
+
//# sourceMappingURL=code-browser-scroll-buffer-equalize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-browser-scroll-buffer-equalize.d.ts","sourceRoot":"","sources":["../src/code-browser-scroll-buffer-equalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAKxD,iFAAiF;AACjF,eAAO,MAAM,4BAA4B,2BAA2B,CAAC;AAkSrE,MAAM,MAAM,mCAAmC,GAAG;IAChD,QAAQ,EAAE,WAAW,CAAC;IACtB,WAAW,EAAE,WAAW,CAAC;IACzB,6EAA6E;IAC7E,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,eAAe,EAAE,CAAC;IAClC,eAAe,EAAE,MAAM,MAAM,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,wFAAwF;IACxF,kBAAkB,EAAE,MAAM,IAAI,CAAC;CAChC,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,mCAAmC,GACxC,0BAA0B,CAE5B"}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { dedupeBlockScrollLinksById } from "./code-browser-block-rays.js";
|
|
2
|
+
import { partnerDocScrollTopFromCodeScrollTop } from "./code-browser-scroll-sync.js";
|
|
3
|
+
/** Class on spacer divs injected to equalize paired doc/code segment heights. */
|
|
4
|
+
export const COMMENTRAY_SYNC_BUFFER_CLASS = "commentray-sync-buffer";
|
|
5
|
+
const MIN_BUFFER_PX = 2;
|
|
6
|
+
/** Debounce ResizeObserver / visualViewport so buffer churn does not fight slow wheel scrolling. */
|
|
7
|
+
const RESIZE_REEQUALIZE_DEBOUNCE_MS = 140;
|
|
8
|
+
function clamp01(n) {
|
|
9
|
+
return Math.max(0, Math.min(1, n));
|
|
10
|
+
}
|
|
11
|
+
/** Scroll position as a fraction of max scroll (stable across temporary buffer removal). */
|
|
12
|
+
function captureScrollAlpha(pane) {
|
|
13
|
+
const max = pane.scrollHeight - pane.clientHeight;
|
|
14
|
+
if (max <= 0)
|
|
15
|
+
return 0;
|
|
16
|
+
return clamp01(pane.scrollTop / max);
|
|
17
|
+
}
|
|
18
|
+
function restoreScrollAlpha(pane, alpha) {
|
|
19
|
+
const max = Math.max(0, pane.scrollHeight - pane.clientHeight);
|
|
20
|
+
if (max <= 0) {
|
|
21
|
+
pane.scrollTop = 0;
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
pane.scrollTop = Math.round(clamp01(alpha) * max);
|
|
25
|
+
}
|
|
26
|
+
function querySelectorByHtmlId(root, id) {
|
|
27
|
+
if (typeof CSS !== "undefined" && typeof CSS.escape === "function") {
|
|
28
|
+
try {
|
|
29
|
+
const hit = root.querySelector(`#${CSS.escape(id)}`);
|
|
30
|
+
if (hit instanceof HTMLElement)
|
|
31
|
+
return hit;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
/* fall through */
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const forAttr = id.replaceAll("\\", "\\\\").replaceAll('"', '\\"');
|
|
38
|
+
const hit = root.querySelector(`[id="${forAttr}"]`);
|
|
39
|
+
return hit instanceof HTMLElement ? hit : null;
|
|
40
|
+
}
|
|
41
|
+
function sortedBlockLinks(getLinks) {
|
|
42
|
+
const deduped = dedupeBlockScrollLinksById(getLinks());
|
|
43
|
+
return [...deduped].sort((a, b) => a.sourceStart - b.sourceStart);
|
|
44
|
+
}
|
|
45
|
+
function clearBuffersIn(roots) {
|
|
46
|
+
for (const root of roots) {
|
|
47
|
+
for (const el of Array.from(root.querySelectorAll(`.${COMMENTRAY_SYNC_BUFFER_CLASS}`))) {
|
|
48
|
+
el.remove();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function makeBufferDiv(heightPx) {
|
|
53
|
+
const d = document.createElement("div");
|
|
54
|
+
d.className = COMMENTRAY_SYNC_BUFFER_CLASS;
|
|
55
|
+
d.setAttribute("aria-hidden", "true");
|
|
56
|
+
d.style.height = `${heightPx}px`;
|
|
57
|
+
return d;
|
|
58
|
+
}
|
|
59
|
+
function yInScroller(scroller, el, edge) {
|
|
60
|
+
const sr = scroller.getBoundingClientRect();
|
|
61
|
+
const er = el.getBoundingClientRect();
|
|
62
|
+
if (edge === "top")
|
|
63
|
+
return er.top - sr.top + scroller.scrollTop;
|
|
64
|
+
return er.bottom - sr.top + scroller.scrollTop;
|
|
65
|
+
}
|
|
66
|
+
function docAnchorEl(scroller, blockId) {
|
|
67
|
+
return querySelectorByHtmlId(scroller, `commentray-block-${blockId}`);
|
|
68
|
+
}
|
|
69
|
+
function findCodeLineBySrc0(codePane, lineIdPrefix, src0) {
|
|
70
|
+
return querySelectorByHtmlId(codePane, `${lineIdPrefix}${String(src0)}`);
|
|
71
|
+
}
|
|
72
|
+
function lastSourceLine1Based(codePane) {
|
|
73
|
+
let max0 = -1;
|
|
74
|
+
for (const el of codePane.querySelectorAll(".code-line")) {
|
|
75
|
+
if (!(el instanceof HTMLElement))
|
|
76
|
+
continue;
|
|
77
|
+
const d = el.dataset.line;
|
|
78
|
+
if (d === undefined)
|
|
79
|
+
continue;
|
|
80
|
+
const v = Number.parseInt(d, 10);
|
|
81
|
+
if (Number.isFinite(v))
|
|
82
|
+
max0 = Math.max(max0, v);
|
|
83
|
+
}
|
|
84
|
+
return max0 + 1;
|
|
85
|
+
}
|
|
86
|
+
function docSegmentHeight(docScrollEl, anchor, nextAnchor) {
|
|
87
|
+
const endY = nextAnchor !== undefined
|
|
88
|
+
? yInScroller(docScrollEl, nextAnchor, "top")
|
|
89
|
+
: docScrollEl.scrollHeight;
|
|
90
|
+
return endY - yInScroller(docScrollEl, anchor, "top");
|
|
91
|
+
}
|
|
92
|
+
function maybePreludeInsertWithPrefix(docScrollEl, codePane, lineIdPrefix, headAnchor, head) {
|
|
93
|
+
const block0First = findCodeLineBySrc0(codePane, lineIdPrefix, head.sourceStart - 1);
|
|
94
|
+
if (!block0First)
|
|
95
|
+
return null;
|
|
96
|
+
const docPreH = Math.max(0, yInScroller(docScrollEl, headAnchor, "top"));
|
|
97
|
+
const firstCodeLine = findCodeLineBySrc0(codePane, lineIdPrefix, 0);
|
|
98
|
+
if (!firstCodeLine)
|
|
99
|
+
return null;
|
|
100
|
+
const codePreH = Math.max(0, yInScroller(codePane, block0First, "top") - yInScroller(codePane, firstCodeLine, "top"));
|
|
101
|
+
const preDelta = Math.round(Math.abs(docPreH - codePreH));
|
|
102
|
+
if (preDelta < MIN_BUFFER_PX)
|
|
103
|
+
return null;
|
|
104
|
+
if (docPreH < codePreH)
|
|
105
|
+
return { k: "pre-doc", px: preDelta, beforeAnchor: headAnchor };
|
|
106
|
+
if (codePreH < docPreH)
|
|
107
|
+
return { k: "pre-code", px: preDelta, beforeLine: block0First };
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
function maybeBlockInsert(args) {
|
|
111
|
+
const { docScrollEl, codePane, lineIdPrefix, link, anchor, nextAnchor, nextLink, maxLine1 } = args;
|
|
112
|
+
const docSegH = docSegmentHeight(docScrollEl, anchor, nextAnchor);
|
|
113
|
+
const start1 = link.sourceStart;
|
|
114
|
+
const end1Inclusive = nextLink !== undefined ? nextLink.sourceStart - 1 : maxLine1;
|
|
115
|
+
if (end1Inclusive < start1)
|
|
116
|
+
return null;
|
|
117
|
+
const startLine = findCodeLineBySrc0(codePane, lineIdPrefix, start1 - 1);
|
|
118
|
+
const endLine = findCodeLineBySrc0(codePane, lineIdPrefix, end1Inclusive - 1);
|
|
119
|
+
if (!startLine || !endLine)
|
|
120
|
+
return null;
|
|
121
|
+
const codeSegH = yInScroller(codePane, endLine, "bottom") - yInScroller(codePane, startLine, "top");
|
|
122
|
+
const segDelta = Math.round(Math.abs(docSegH - codeSegH));
|
|
123
|
+
if (segDelta < MIN_BUFFER_PX)
|
|
124
|
+
return null;
|
|
125
|
+
if (docSegH < codeSegH) {
|
|
126
|
+
return { k: "blk-doc", px: segDelta, nextAnchor: nextAnchor ?? null };
|
|
127
|
+
}
|
|
128
|
+
return { k: "blk-code", px: segDelta, afterLine: endLine };
|
|
129
|
+
}
|
|
130
|
+
function buildBufferInsertList(args) {
|
|
131
|
+
const { codePane, docScrollEl, getLinks, getLineIdPrefix } = args;
|
|
132
|
+
clearBuffersIn([codePane, docScrollEl]);
|
|
133
|
+
const links = sortedBlockLinks(getLinks);
|
|
134
|
+
if (links.length === 0)
|
|
135
|
+
return null;
|
|
136
|
+
const prefix = getLineIdPrefix();
|
|
137
|
+
const anchors = links.map((l) => docAnchorEl(docScrollEl, l.id));
|
|
138
|
+
if (!anchors.every((a) => a !== null))
|
|
139
|
+
return null;
|
|
140
|
+
const firstCodeLine = findCodeLineBySrc0(codePane, prefix, 0);
|
|
141
|
+
if (!firstCodeLine)
|
|
142
|
+
return null;
|
|
143
|
+
const maxLine1 = lastSourceLine1Based(codePane);
|
|
144
|
+
if (maxLine1 < 1)
|
|
145
|
+
return null;
|
|
146
|
+
const head = links[0];
|
|
147
|
+
const headAnchor = anchors[0];
|
|
148
|
+
if (head === undefined || headAnchor === undefined)
|
|
149
|
+
return null;
|
|
150
|
+
const inserts = [];
|
|
151
|
+
const prelude = maybePreludeInsertWithPrefix(docScrollEl, codePane, prefix, headAnchor, head);
|
|
152
|
+
if (prelude !== null)
|
|
153
|
+
inserts.push(prelude);
|
|
154
|
+
for (let i = 0; i < links.length; i++) {
|
|
155
|
+
const link = links[i];
|
|
156
|
+
const anchor = anchors[i];
|
|
157
|
+
const nextAnchor = anchors[i + 1];
|
|
158
|
+
const nextLink = links[i + 1];
|
|
159
|
+
if (link === undefined || anchor === undefined)
|
|
160
|
+
continue;
|
|
161
|
+
const ins = maybeBlockInsert({
|
|
162
|
+
docScrollEl,
|
|
163
|
+
codePane,
|
|
164
|
+
lineIdPrefix: prefix,
|
|
165
|
+
link,
|
|
166
|
+
anchor,
|
|
167
|
+
nextAnchor,
|
|
168
|
+
nextLink,
|
|
169
|
+
maxLine1,
|
|
170
|
+
});
|
|
171
|
+
if (ins !== null)
|
|
172
|
+
inserts.push(ins);
|
|
173
|
+
}
|
|
174
|
+
return inserts;
|
|
175
|
+
}
|
|
176
|
+
function applyBufferInserts(docScrollEl, inserts) {
|
|
177
|
+
for (const ins of inserts) {
|
|
178
|
+
if (ins.k === "pre-doc") {
|
|
179
|
+
ins.beforeAnchor.insertAdjacentElement("beforebegin", makeBufferDiv(ins.px));
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
if (ins.k === "pre-code") {
|
|
183
|
+
ins.beforeLine.insertAdjacentElement("beforebegin", makeBufferDiv(ins.px));
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (ins.k === "blk-doc") {
|
|
187
|
+
if (ins.nextAnchor !== null) {
|
|
188
|
+
ins.nextAnchor.insertAdjacentElement("beforebegin", makeBufferDiv(ins.px));
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
docScrollEl.appendChild(makeBufferDiv(ins.px));
|
|
192
|
+
}
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
ins.afterLine.insertAdjacentElement("afterend", makeBufferDiv(ins.px));
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/** After segment buffers, pad the shorter pane so both scroll heights match (1:1 proportional sync). */
|
|
199
|
+
function applyTotalScrollHeightBuffer(codePane, docScrollEl) {
|
|
200
|
+
void docScrollEl.offsetHeight;
|
|
201
|
+
void codePane.offsetHeight;
|
|
202
|
+
const docH = docScrollEl.scrollHeight;
|
|
203
|
+
const codeH = codePane.scrollHeight;
|
|
204
|
+
const raw = Math.abs(docH - codeH);
|
|
205
|
+
const delta = Math.round(raw);
|
|
206
|
+
if (delta < MIN_BUFFER_PX)
|
|
207
|
+
return;
|
|
208
|
+
if (docH < codeH) {
|
|
209
|
+
docScrollEl.appendChild(makeBufferDiv(delta));
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
codePane.appendChild(makeBufferDiv(delta));
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* After spacer / tail buffers change `scrollHeight`, restoring **both** panes by scroll **fraction**
|
|
217
|
+
* can break pairing: segment buffers move content so the same fraction no longer means the same
|
|
218
|
+
* doc↔code alignment. Dual-pane scroll sync uses {@link mirroredScrollTop} on equal max ranges —
|
|
219
|
+
* re-apply that mapping from the code pane (reading position source of truth) once layout settles.
|
|
220
|
+
*/
|
|
221
|
+
function alignDocScrollToCodeAfterBufferLayout(codePane, docScrollEl) {
|
|
222
|
+
docScrollEl.scrollTop = partnerDocScrollTopFromCodeScrollTop(codePane.scrollTop, codePane.scrollHeight, codePane.clientHeight, docScrollEl.scrollHeight, docScrollEl.clientHeight);
|
|
223
|
+
}
|
|
224
|
+
function runEqualizeScrollBuffers(args) {
|
|
225
|
+
const codeAlpha = captureScrollAlpha(args.codePane);
|
|
226
|
+
const inserts = buildBufferInsertList(args);
|
|
227
|
+
if (inserts === null)
|
|
228
|
+
return;
|
|
229
|
+
applyBufferInserts(args.docScrollEl, inserts);
|
|
230
|
+
applyTotalScrollHeightBuffer(args.codePane, args.docScrollEl);
|
|
231
|
+
restoreScrollAlpha(args.codePane, codeAlpha);
|
|
232
|
+
alignDocScrollToCodeAfterBufferLayout(args.codePane, args.docScrollEl);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Injects invisible spacer blocks so paired doc/code **segment** heights match (prelude, each
|
|
236
|
+
* indexed block including inter-block source lines until the next block, then tail), then pads
|
|
237
|
+
* the shorter pane so **total** `scrollHeight` matches. Proportional sync is then ~1:1 so paired
|
|
238
|
+
* lines stay aligned while scrolling. Re-runs on pane resize, doc DOM changes, and
|
|
239
|
+
* {@link PerBlockScrollBufferHandle.scheduleReequalize} (wrap, splitter, etc.).
|
|
240
|
+
*/
|
|
241
|
+
export function installPerBlockScrollBuffers(opts) {
|
|
242
|
+
return attachScrollBufferEqualizer(opts);
|
|
243
|
+
}
|
|
244
|
+
function attachScrollBufferEqualizer(opts) {
|
|
245
|
+
const { codePane, docScrollEl, docBody, getLinks, getLineIdPrefix } = opts;
|
|
246
|
+
let raf = 0;
|
|
247
|
+
let resizeDebounce;
|
|
248
|
+
const schedule = () => {
|
|
249
|
+
if (raf !== 0)
|
|
250
|
+
return;
|
|
251
|
+
raf = globalThis.requestAnimationFrame(() => {
|
|
252
|
+
raf = 0;
|
|
253
|
+
runEqualize();
|
|
254
|
+
});
|
|
255
|
+
};
|
|
256
|
+
const scheduleResizeDebounced = () => {
|
|
257
|
+
if (resizeDebounce !== undefined) {
|
|
258
|
+
globalThis.clearTimeout(resizeDebounce);
|
|
259
|
+
}
|
|
260
|
+
resizeDebounce = globalThis.setTimeout(() => {
|
|
261
|
+
resizeDebounce = undefined;
|
|
262
|
+
schedule();
|
|
263
|
+
}, RESIZE_REEQUALIZE_DEBOUNCE_MS);
|
|
264
|
+
};
|
|
265
|
+
const ro = typeof ResizeObserver !== "undefined"
|
|
266
|
+
? new ResizeObserver(() => {
|
|
267
|
+
scheduleResizeDebounced();
|
|
268
|
+
})
|
|
269
|
+
: null;
|
|
270
|
+
ro?.observe(codePane);
|
|
271
|
+
ro?.observe(docScrollEl);
|
|
272
|
+
const visualViewport = globalThis.visualViewport ?? null;
|
|
273
|
+
if (visualViewport !== null) {
|
|
274
|
+
visualViewport.addEventListener("resize", scheduleResizeDebounced, { passive: true });
|
|
275
|
+
}
|
|
276
|
+
const moTarget = docBody ?? docScrollEl;
|
|
277
|
+
const mo = typeof MutationObserver !== "undefined"
|
|
278
|
+
? new MutationObserver(() => {
|
|
279
|
+
schedule();
|
|
280
|
+
})
|
|
281
|
+
: null;
|
|
282
|
+
mo?.observe(moTarget, { childList: true, subtree: true });
|
|
283
|
+
function runEqualize() {
|
|
284
|
+
mo?.disconnect();
|
|
285
|
+
ro?.disconnect();
|
|
286
|
+
try {
|
|
287
|
+
runEqualizeScrollBuffers({ codePane, docScrollEl, getLinks, getLineIdPrefix });
|
|
288
|
+
}
|
|
289
|
+
finally {
|
|
290
|
+
ro?.observe(codePane);
|
|
291
|
+
ro?.observe(docScrollEl);
|
|
292
|
+
mo?.observe(moTarget, { childList: true, subtree: true });
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
schedule();
|
|
296
|
+
return {
|
|
297
|
+
scheduleReequalize: schedule,
|
|
298
|
+
disconnect: () => {
|
|
299
|
+
if (raf !== 0) {
|
|
300
|
+
globalThis.cancelAnimationFrame(raf);
|
|
301
|
+
raf = 0;
|
|
302
|
+
}
|
|
303
|
+
if (resizeDebounce !== undefined) {
|
|
304
|
+
globalThis.clearTimeout(resizeDebounce);
|
|
305
|
+
resizeDebounce = undefined;
|
|
306
|
+
}
|
|
307
|
+
if (visualViewport !== null) {
|
|
308
|
+
visualViewport.removeEventListener("resize", scheduleResizeDebounced);
|
|
309
|
+
}
|
|
310
|
+
ro?.disconnect();
|
|
311
|
+
mo?.disconnect();
|
|
312
|
+
clearBuffersIn([codePane, docScrollEl]);
|
|
313
|
+
},
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=code-browser-scroll-buffer-equalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-browser-scroll-buffer-equalize.js","sourceRoot":"","sources":["../src/code-browser-scroll-buffer-equalize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normative scroll-sync monotonicity (see `docs/spec/dual-pane-scroll-sync.md`).
|
|
3
|
+
* Pure predicates so Vitest can lock the contract without a browser scroll stack.
|
|
4
|
+
*/
|
|
5
|
+
/** Sub-pixel / wheel noise: ignore driver direction when |delta| is below this. */
|
|
6
|
+
export declare const SCROLL_SYNC_MONOTONIC_EPS = 1.5;
|
|
7
|
+
/**
|
|
8
|
+
* After applying partner scroll from a driver-driven sync, returns whether the partner moved
|
|
9
|
+
* **opposite** to the driver’s direction (forbidden UX: backward jump while scrolling one column).
|
|
10
|
+
*/
|
|
11
|
+
export declare function shouldRevertPartnerScrollForMonotonicity(args: {
|
|
12
|
+
driverDelta: number;
|
|
13
|
+
partnerBefore: number;
|
|
14
|
+
partnerAfter: number;
|
|
15
|
+
eps?: number;
|
|
16
|
+
}): boolean;
|
|
17
|
+
//# sourceMappingURL=code-browser-scroll-sync-monotonic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-browser-scroll-sync-monotonic.d.ts","sourceRoot":"","sources":["../src/code-browser-scroll-sync-monotonic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,mFAAmF;AACnF,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C;;;GAGG;AACH,wBAAgB,wCAAwC,CAAC,IAAI,EAAE;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAOV"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normative scroll-sync monotonicity (see `docs/spec/dual-pane-scroll-sync.md`).
|
|
3
|
+
* Pure predicates so Vitest can lock the contract without a browser scroll stack.
|
|
4
|
+
*/
|
|
5
|
+
/** Sub-pixel / wheel noise: ignore driver direction when |delta| is below this. */
|
|
6
|
+
export const SCROLL_SYNC_MONOTONIC_EPS = 1.5;
|
|
7
|
+
/**
|
|
8
|
+
* After applying partner scroll from a driver-driven sync, returns whether the partner moved
|
|
9
|
+
* **opposite** to the driver’s direction (forbidden UX: backward jump while scrolling one column).
|
|
10
|
+
*/
|
|
11
|
+
export function shouldRevertPartnerScrollForMonotonicity(args) {
|
|
12
|
+
const eps = args.eps ?? SCROLL_SYNC_MONOTONIC_EPS;
|
|
13
|
+
const { driverDelta, partnerBefore, partnerAfter } = args;
|
|
14
|
+
if (Math.abs(driverDelta) < eps)
|
|
15
|
+
return false;
|
|
16
|
+
if (driverDelta > eps && partnerAfter < partnerBefore - eps)
|
|
17
|
+
return true;
|
|
18
|
+
if (driverDelta < -eps && partnerAfter > partnerBefore + eps)
|
|
19
|
+
return true;
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=code-browser-scroll-sync-monotonic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-browser-scroll-sync-monotonic.js","sourceRoot":"","sources":["../src/code-browser-scroll-sync-monotonic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,mFAAmF;AACnF,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAE7C;;;GAGG;AACH,MAAM,UAAU,wCAAwC,CAAC,IAKxD;IACC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,yBAAyB,CAAC;IAClD,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAC1D,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,GAAG;QAAE,OAAO,KAAK,CAAC;IAC9C,IAAI,WAAW,GAAG,GAAG,IAAI,YAAY,GAAG,aAAa,GAAG,GAAG;QAAE,OAAO,IAAI,CAAC;IACzE,IAAI,WAAW,GAAG,CAAC,GAAG,IAAI,YAAY,GAAG,aAAa,GAAG,GAAG;QAAE,OAAO,IAAI,CAAC;IAC1E,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mutually exclusive dual-pane scroll correlation modes for the code browser client.
|
|
3
|
+
*
|
|
4
|
+
* Selected at runtime from `#shell` `data-scroll-sync-strategy` (optional; default when absent).
|
|
5
|
+
* Build-time / preview can set {@link CodeBrowserPageOptions.dualPaneScrollSyncStrategy} on the
|
|
6
|
+
* render package to emit the attribute for experiments.
|
|
7
|
+
*/
|
|
8
|
+
export declare const DUAL_PANE_SCROLL_SYNC_STRATEGIES: readonly ["block-aware-proportional", "block-snap-only", "filler-blocks"];
|
|
9
|
+
export type DualPaneScrollSyncStrategyId = (typeof DUAL_PANE_SCROLL_SYNC_STRATEGIES)[number];
|
|
10
|
+
export declare const DEFAULT_DUAL_PANE_SCROLL_SYNC_STRATEGY: DualPaneScrollSyncStrategyId;
|
|
11
|
+
export declare function parseDualPaneScrollSyncStrategy(raw: string | null | undefined): DualPaneScrollSyncStrategyId;
|
|
12
|
+
//# sourceMappingURL=code-browser-scroll-sync-strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-browser-scroll-sync-strategy.d.ts","sourceRoot":"","sources":["../src/code-browser-scroll-sync-strategy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,gCAAgC,2EAOnC,CAAC;AAEX,MAAM,MAAM,4BAA4B,GAAG,CAAC,OAAO,gCAAgC,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7F,eAAO,MAAM,sCAAsC,EAAE,4BACzB,CAAC;AAE7B,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC7B,4BAA4B,CAQ9B"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mutually exclusive dual-pane scroll correlation modes for the code browser client.
|
|
3
|
+
*
|
|
4
|
+
* Selected at runtime from `#shell` `data-scroll-sync-strategy` (optional; default when absent).
|
|
5
|
+
* Build-time / preview can set {@link CodeBrowserPageOptions.dualPaneScrollSyncStrategy} on the
|
|
6
|
+
* render package to emit the attribute for experiments.
|
|
7
|
+
*/
|
|
8
|
+
export const DUAL_PANE_SCROLL_SYNC_STRATEGIES = [
|
|
9
|
+
/** Indexed block snaps + proportional mirror in gaps and when there is no index (current product default). */
|
|
10
|
+
"block-aware-proportional",
|
|
11
|
+
/** Block snaps only; partner is not proportionally mirrored in gaps or without an index (partner “holds” until the next snap). */
|
|
12
|
+
"block-snap-only",
|
|
13
|
+
/** Alias of {@link DEFAULT_DUAL_PANE_SCROLL_SYNC_STRATEGY} (reserved id for experiments). */
|
|
14
|
+
"filler-blocks",
|
|
15
|
+
];
|
|
16
|
+
export const DEFAULT_DUAL_PANE_SCROLL_SYNC_STRATEGY = "block-aware-proportional";
|
|
17
|
+
export function parseDualPaneScrollSyncStrategy(raw) {
|
|
18
|
+
if (raw === null || raw === undefined)
|
|
19
|
+
return DEFAULT_DUAL_PANE_SCROLL_SYNC_STRATEGY;
|
|
20
|
+
const t = raw.trim();
|
|
21
|
+
if (t.length === 0)
|
|
22
|
+
return DEFAULT_DUAL_PANE_SCROLL_SYNC_STRATEGY;
|
|
23
|
+
if (DUAL_PANE_SCROLL_SYNC_STRATEGIES.includes(t)) {
|
|
24
|
+
return t;
|
|
25
|
+
}
|
|
26
|
+
return DEFAULT_DUAL_PANE_SCROLL_SYNC_STRATEGY;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=code-browser-scroll-sync-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-browser-scroll-sync-strategy.js","sourceRoot":"","sources":["../src/code-browser-scroll-sync-strategy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC9C,8GAA8G;IAC9G,0BAA0B;IAC1B,kIAAkI;IAClI,iBAAiB;IACjB,6FAA6F;IAC7F,eAAe;CACP,CAAC;AAIX,MAAM,CAAC,MAAM,sCAAsC,GACjD,0BAA0B,CAAC;AAE7B,MAAM,UAAU,+BAA+B,CAC7C,GAA8B;IAE9B,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,sCAAsC,CAAC;IACrF,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACrB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,sCAAsC,CAAC;IAClE,IAAK,gCAAsD,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,OAAO,CAAiC,CAAC;IAC3C,CAAC;IACD,OAAO,sCAAsC,CAAC;AAChD,CAAC"}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Static browser scroll helpers: proportional mirror plus block pickers from
|
|
3
3
|
* `@commentray/core/block-scroll-pickers` (small browser bundle entry).
|
|
4
4
|
*/
|
|
5
|
-
export type { BlockScrollLink } from "@commentray/core/block-scroll-pickers";
|
|
6
|
-
export { pickCommentrayLineForSourceScroll, pickSourceLine0ForCommentrayScroll, } from "@commentray/core/block-scroll-pickers";
|
|
5
|
+
export type { BlockScrollLink, BlockScrollStickyState, } from "@commentray/core/block-scroll-pickers";
|
|
6
|
+
export { blockStrictlyContainingSourceViewportLine, commentrayProbeInStrictInterMarkerGap, DEFAULT_COMMENTRAY_VIEWPORT_HYSTERESIS_LINES, DEFAULT_SOURCE_VIEWPORT_HYSTERESIS_LINES, pickBlockScrollLinkForCommentrayScroll, pickBlockScrollLinkForCommentrayViewportWithHysteresis, pickBlockScrollLinkForSourceViewportTop, pickBlockScrollLinkForSourceViewportWithHysteresis, pickCommentrayLineForSourceScroll, pickSourceLine0ForCommentrayScroll, sourceTopLineStrictlyBeforeFirstIndexLine, } from "@commentray/core/block-scroll-pickers";
|
|
7
7
|
/**
|
|
8
8
|
* Maps one pane’s scroll position to the other for **proportional** scroll sync
|
|
9
9
|
* (static code browser). Mirrors the ratio fallback used while editing when
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-browser-scroll-sync.d.ts","sourceRoot":"","sources":["../src/code-browser-scroll-sync.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,YAAY,
|
|
1
|
+
{"version":3,"file":"code-browser-scroll-sync.d.ts","sourceRoot":"","sources":["../src/code-browser-scroll-sync.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,YAAY,EACV,eAAe,EACf,sBAAsB,GACvB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,yCAAyC,EACzC,qCAAqC,EACrC,4CAA4C,EAC5C,wCAAwC,EACxC,sCAAsC,EACtC,sDAAsD,EACtD,uCAAuC,EACvC,kDAAkD,EAClD,iCAAiC,EACjC,kCAAkC,EAClC,yCAAyC,GAC1C,MAAM,uCAAuC,CAAC;AAE/C;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,MAAM,EACvB,kBAAkB,EAAE,MAAM,EAC1B,kBAAkB,EAAE,MAAM,EAC1B,kBAAkB,EAAE,MAAM,EAC1B,kBAAkB,EAAE,MAAM,GACzB,MAAM,CAMR"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { pickCommentrayLineForSourceScroll, pickSourceLine0ForCommentrayScroll, } from "@commentray/core/block-scroll-pickers";
|
|
1
|
+
export { blockStrictlyContainingSourceViewportLine, commentrayProbeInStrictInterMarkerGap, DEFAULT_COMMENTRAY_VIEWPORT_HYSTERESIS_LINES, DEFAULT_SOURCE_VIEWPORT_HYSTERESIS_LINES, pickBlockScrollLinkForCommentrayScroll, pickBlockScrollLinkForCommentrayViewportWithHysteresis, pickBlockScrollLinkForSourceViewportTop, pickBlockScrollLinkForSourceViewportWithHysteresis, pickCommentrayLineForSourceScroll, pickSourceLine0ForCommentrayScroll, sourceTopLineStrictlyBeforeFirstIndexLine, } from "@commentray/core/block-scroll-pickers";
|
|
2
2
|
/**
|
|
3
3
|
* Maps one pane’s scroll position to the other for **proportional** scroll sync
|
|
4
4
|
* (static code browser). Mirrors the ratio fallback used while editing when
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-browser-scroll-sync.js","sourceRoot":"","sources":["../src/code-browser-scroll-sync.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"code-browser-scroll-sync.js","sourceRoot":"","sources":["../src/code-browser-scroll-sync.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,yCAAyC,EACzC,qCAAqC,EACrC,4CAA4C,EAC5C,wCAAwC,EACxC,sCAAsC,EACtC,sDAAsD,EACtD,uCAAuC,EACvC,kDAAkD,EAClD,iCAAiC,EACjC,kCAAkC,EAClC,yCAAyC,GAC1C,MAAM,uCAAuC,CAAC;AAE/C;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,eAAuB,EACvB,kBAA0B,EAC1B,kBAA0B,EAC1B,kBAA0B,EAC1B,kBAA0B;IAE1B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,kBAAkB,GAAG,kBAAkB,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,kBAAkB,GAAG,kBAAkB,CAAC,CAAC;IACvE,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC,CAAC,CAAC;IACpE,OAAO,KAAK,GAAG,SAAS,CAAC;AAC3B,CAAC"}
|