@commentray/render 0.2.0 → 0.3.1

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 (68) hide show
  1. package/dist/block-stretch-buffer-sync.d.ts +16 -0
  2. package/dist/block-stretch-buffer-sync.d.ts.map +1 -0
  3. package/dist/block-stretch-buffer-sync.js +271 -0
  4. package/dist/block-stretch-buffer-sync.js.map +1 -0
  5. package/dist/block-stretch-layout.d.ts +18 -5
  6. package/dist/block-stretch-layout.d.ts.map +1 -1
  7. package/dist/block-stretch-layout.js +119 -43
  8. package/dist/block-stretch-layout.js.map +1 -1
  9. package/dist/browse-page-slug.d.ts +3 -4
  10. package/dist/browse-page-slug.d.ts.map +1 -1
  11. package/dist/browse-page-slug.js +3 -4
  12. package/dist/browse-page-slug.js.map +1 -1
  13. package/dist/build-commentray-nav-search.d.ts +2 -2
  14. package/dist/build-commentray-nav-search.js +1 -1
  15. package/dist/code-browser-block-rays.d.ts +11 -0
  16. package/dist/code-browser-block-rays.d.ts.map +1 -1
  17. package/dist/code-browser-block-rays.js +25 -5
  18. package/dist/code-browser-block-rays.js.map +1 -1
  19. package/dist/code-browser-client.bundle.js +12 -11
  20. package/dist/code-browser-client.js +1366 -257
  21. package/dist/code-browser-client.js.map +1 -1
  22. package/dist/code-browser-pair-nav.d.ts +9 -2
  23. package/dist/code-browser-pair-nav.d.ts.map +1 -1
  24. package/dist/code-browser-pair-nav.js +53 -14
  25. package/dist/code-browser-pair-nav.js.map +1 -1
  26. package/dist/code-browser-scroll-sync-monotonic.d.ts +17 -0
  27. package/dist/code-browser-scroll-sync-monotonic.d.ts.map +1 -0
  28. package/dist/code-browser-scroll-sync-monotonic.js +22 -0
  29. package/dist/code-browser-scroll-sync-monotonic.js.map +1 -0
  30. package/dist/code-browser-scroll-sync-strategy.d.ts +12 -0
  31. package/dist/code-browser-scroll-sync-strategy.d.ts.map +1 -0
  32. package/dist/code-browser-scroll-sync-strategy.js +28 -0
  33. package/dist/code-browser-scroll-sync-strategy.js.map +1 -0
  34. package/dist/code-browser-scroll-sync.d.ts +2 -2
  35. package/dist/code-browser-scroll-sync.d.ts.map +1 -1
  36. package/dist/code-browser-scroll-sync.js +1 -1
  37. package/dist/code-browser-scroll-sync.js.map +1 -1
  38. package/dist/code-browser-smooth-reveal-dedup.d.ts +25 -0
  39. package/dist/code-browser-smooth-reveal-dedup.d.ts.map +1 -0
  40. package/dist/code-browser-smooth-reveal-dedup.js +25 -0
  41. package/dist/code-browser-smooth-reveal-dedup.js.map +1 -0
  42. package/dist/code-browser.d.ts +25 -8
  43. package/dist/code-browser.d.ts.map +1 -1
  44. package/dist/code-browser.js +382 -93
  45. package/dist/code-browser.js.map +1 -1
  46. package/dist/commentray-anchor-viewport-probe.d.ts +5 -1
  47. package/dist/commentray-anchor-viewport-probe.d.ts.map +1 -1
  48. package/dist/commentray-anchor-viewport-probe.js +8 -2
  49. package/dist/commentray-anchor-viewport-probe.js.map +1 -1
  50. package/dist/index.d.ts +2 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +1 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/inject-md-line-anchors.d.ts +1 -1
  55. package/dist/inject-md-line-anchors.d.ts.map +1 -1
  56. package/dist/inject-md-line-anchors.js +9 -5
  57. package/dist/inject-md-line-anchors.js.map +1 -1
  58. package/dist/markdown-pipeline.d.ts.map +1 -1
  59. package/dist/markdown-pipeline.js +10 -3
  60. package/dist/markdown-pipeline.js.map +1 -1
  61. package/dist/mermaid-runtime-html.d.ts.map +1 -1
  62. package/dist/mermaid-runtime-html.js +4 -1
  63. package/dist/mermaid-runtime-html.js.map +1 -1
  64. package/dist/reading-viewport-comfort.d.ts +12 -0
  65. package/dist/reading-viewport-comfort.d.ts.map +1 -0
  66. package/dist/reading-viewport-comfort.js +14 -0
  67. package/dist/reading-viewport-comfort.js.map +1 -0
  68. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"code-browser-pair-nav.d.ts","sourceRoot":"","sources":["../src/code-browser-pair-nav.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CASrE;AAQD,yFAAyF;AACzF,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGnE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,MAAM,CAiBR;AAED;;;;GAIG;AACH,wBAAgB,qCAAqC,CACnD,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,MAAM,CAQR;AAED,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,qBAAqB,EAChE,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,GACjB,CAAC,GAAG,SAAS,CAYf;AAED,wBAAgB,oBAAoB,CAClC,CAAC,EAAE,qBAAqB,EACxB,aAAa,EAAE,MAAM,EACrB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAKT"}
1
+ {"version":3,"file":"code-browser-pair-nav.d.ts","sourceRoot":"","sources":["../src/code-browser-pair-nav.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CASrE;AAqBD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGnE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,MAAM,CAiBR;AAED;;;;GAIG;AACH,wBAAgB,qCAAqC,CACnD,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,MAAM,CAQR;AAED,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,qBAAqB,EAChE,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,GACjB,CAAC,GAAG,SAAS,CAYf;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOzE;AAED,wFAAwF;AACxF,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAUzE;AAED,wBAAgB,oBAAoB,CAClC,CAAC,EAAE,qBAAqB,EACxB,aAAa,EAAE,MAAM,EACrB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAKT"}
@@ -20,34 +20,44 @@ export function siteRootPathnameFromPathname(pathname) {
20
20
  return "/";
21
21
  return noFile.replace(/\/+$/, "") || "/";
22
22
  }
23
- /** Flat canonical page: `./browse/<hash>.html` (opaque slug, one path segment). */
24
- const STATIC_BROWSE_FLAT = /^(?:\.\/)?browse\/([^/?#]+\.html)$/i;
25
- /** Human-readable shim: `./browse/<encoded/source/segments>/index.html` (see `browse-pair-static-url.ts`). */
26
- const STATIC_BROWSE_INDEXED = /^(?:\.\/)?browse\/(.+)\/index\.html$/i;
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 STATIC_BROWSE_FLAT.test(t) || STATIC_BROWSE_INDEXED.test(t);
40
+ return isStaticBrowseIndexedHref(t) || isStaticBrowseFlatHtmlHref(t);
31
41
  }
32
42
  /**
33
- * Resolves `staticBrowseUrl` from nav JSON (typically `./browse/<slug>.html`) to an absolute href.
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":"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"}
1
+ {"version":3,"file":"code-browser-pair-nav.js","sourceRoot":"","sources":["../src/code-browser-pair-nav.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,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EACL,iCAAiC,EACjC,kCAAkC,GACnC,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
+ {"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":"AAKA,OAAO,EACL,iCAAiC,EACjC,kCAAkC,GACnC,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"}
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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Historical ceiling for smooth-scroll duration (hash / search helpers may still use `smooth`).
3
+ * Dual-pane block sync uses **instant** partner writes (`applyRevealChildInPane`); partner echo
4
+ * suppression stays above this constant so any remaining smooth paths do not masquerade as driver
5
+ * input mid-gesture.
6
+ */
7
+ /**
8
+ * Ceiling used when sizing partner echo suppression in `code-browser-client` so a smooth
9
+ * programmatic scroll (if any) is not mistaken for user input mid-animation.
10
+ */
11
+ export declare const SMOOTH_REVEAL_INFLIGHT_DEDUP_MS = 800;
12
+ /** Sub-pixel tolerance — clamp / `getBoundingClientRect` math drifts by less than this between frames. */
13
+ export declare const SMOOTH_REVEAL_TARGET_EPSILON_PX = 0.5;
14
+ export type SmoothRevealInFlight = {
15
+ /** Clamped scrollTop the most recent `scrollTo` was aimed at. */
16
+ target: number;
17
+ /** `performance.now()` at the moment of issue. */
18
+ issuedAt: number;
19
+ };
20
+ /**
21
+ * True when `target` essentially equals the last-issued target and the in-flight glide is still
22
+ * within the typical animation duration. The caller should skip its `scrollTo` in that case.
23
+ */
24
+ export declare function smoothRevealAlreadyInFlight(last: SmoothRevealInFlight | null, target: number, now: number): boolean;
25
+ //# sourceMappingURL=code-browser-smooth-reveal-dedup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-browser-smooth-reveal-dedup.d.ts","sourceRoot":"","sources":["../src/code-browser-smooth-reveal-dedup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,eAAO,MAAM,+BAA+B,MAAM,CAAC;AAEnD,0GAA0G;AAC1G,eAAO,MAAM,+BAA+B,MAAM,CAAC;AAEnD,MAAM,MAAM,oBAAoB,GAAG;IACjC,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,oBAAoB,GAAG,IAAI,EACjC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAIT"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Historical ceiling for smooth-scroll duration (hash / search helpers may still use `smooth`).
3
+ * Dual-pane block sync uses **instant** partner writes (`applyRevealChildInPane`); partner echo
4
+ * suppression stays above this constant so any remaining smooth paths do not masquerade as driver
5
+ * input mid-gesture.
6
+ */
7
+ /**
8
+ * Ceiling used when sizing partner echo suppression in `code-browser-client` so a smooth
9
+ * programmatic scroll (if any) is not mistaken for user input mid-animation.
10
+ */
11
+ export const SMOOTH_REVEAL_INFLIGHT_DEDUP_MS = 800;
12
+ /** Sub-pixel tolerance — clamp / `getBoundingClientRect` math drifts by less than this between frames. */
13
+ export const SMOOTH_REVEAL_TARGET_EPSILON_PX = 0.5;
14
+ /**
15
+ * True when `target` essentially equals the last-issued target and the in-flight glide is still
16
+ * within the typical animation duration. The caller should skip its `scrollTo` in that case.
17
+ */
18
+ export function smoothRevealAlreadyInFlight(last, target, now) {
19
+ if (last === null)
20
+ return false;
21
+ if (Math.abs(last.target - target) > SMOOTH_REVEAL_TARGET_EPSILON_PX)
22
+ return false;
23
+ return now - last.issuedAt < SMOOTH_REVEAL_INFLIGHT_DEDUP_MS;
24
+ }
25
+ //# sourceMappingURL=code-browser-smooth-reveal-dedup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-browser-smooth-reveal-dedup.js","sourceRoot":"","sources":["../src/code-browser-smooth-reveal-dedup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAG,CAAC;AAEnD,0GAA0G;AAC1G,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAG,CAAC;AASnD;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,IAAiC,EACjC,MAAc,EACd,GAAW;IAEX,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAChC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,+BAA+B;QAAE,OAAO,KAAK,CAAC;IACnF,OAAO,GAAG,GAAG,IAAI,CAAC,QAAQ,GAAG,+BAA+B,CAAC;AAC/D,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import { type CommentrayIndex } from "@commentray/core";
2
+ import { type StretchBufferSyncStrategy } from "./block-stretch-layout.js";
2
3
  import { type CommentrayOutputUrlOptions } from "./markdown-pipeline.js";
4
+ import { type DualPaneScrollSyncStrategyId } from "./code-browser-scroll-sync-strategy.js";
3
5
  /** One angle tab for {@link CodeBrowserPageOptions.multiAngleBrowsing}. */
4
6
  export type CodeBrowserMultiAngleSpec = {
5
7
  id: string;
@@ -9,9 +11,8 @@ export type CodeBrowserMultiAngleSpec = {
9
11
  commentrayOnGithubUrl?: string;
10
12
  /**
11
13
  * When the static site emits per-pair browse pages, same-tab navigation for the Doc toolbar
12
- * (preferred over {@link commentrayOnGithubUrl} on the hub). Typical values are hub-relative
13
- * `./browse/<human-path>/index.html` or `./browse/<source>@<angle>.html`; opaque `./browse/<hash>.html`
14
- * remains valid for the canonical HTML file on disk.
14
+ * (preferred over {@link commentrayOnGithubUrl} on the hub). Paths mirror the companion layout
15
+ * under `./browse/…/index.html` (see `staticBrowseIndexRelPathFromPair` in `@commentray/core`).
15
16
  */
16
17
  staticBrowseUrl?: string;
17
18
  /**
@@ -48,8 +49,9 @@ export type CodeBrowserPageOptions = {
48
49
  */
49
50
  githubRepoUrl?: string;
50
51
  /**
51
- * Same-site URL for the static documentation hub (e.g. `./` on `index.html`, `../index.html`
52
- * under `browse/`). When set, the first toolbar control is a **home** link here instead of
52
+ * Same-site URL for the static documentation hub (e.g. `./` on `index.html`, or a
53
+ * depth-correct relative path to the hub from nested `browse/…` pages see static export).
54
+ * When set, the first toolbar control is a **home** link here instead of
53
55
  * {@link githubRepoUrl}. Uses the same path safety rules as {@link commentrayStaticBrowseUrl}.
54
56
  */
55
57
  siteHubUrl?: string;
@@ -104,6 +106,18 @@ export type CodeBrowserPageOptions = {
104
106
  * **block-aware** scroll sync and separator lines in the commentray pane.
105
107
  */
106
108
  codeBrowserLayout?: "auto" | "dual";
109
+ /**
110
+ * Stretch layout only. Omitted uses `DEFAULT_STRETCH_BUFFER_SYNC` from `@commentray/core`
111
+ * (`flow-synchronizer`: sync ids + measure wrappers + client `BufferingFlowSynchronizer`).
112
+ * `table`: legacy row height only, no shell flag / client padding pass.
113
+ */
114
+ stretchBufferSync?: StretchBufferSyncStrategy;
115
+ /**
116
+ * Dual-pane scroll correlation (`#shell data-scroll-sync-strategy`). Strategies are mutually
117
+ * exclusive in the client; omit or set to the default for normal builds. `filler-blocks` is
118
+ * reserved until height-matched buffer layout exists (currently behaves like the default).
119
+ */
120
+ dualPaneScrollSyncStrategy?: DualPaneScrollSyncStrategyId;
107
121
  /**
108
122
  * `full` (default): in-page search indexes every source line and every commentray line.
109
123
  * `commentray-and-paths`: search only **toolbar path labels** plus commentray Markdown (no code-body line corpus).
@@ -121,8 +135,8 @@ export type CodeBrowserPageOptions = {
121
135
  */
122
136
  commentrayOnGithubUrl?: string;
123
137
  /**
124
- * When set (e.g. `./browse/…/index.html` or `./browse/<hash>.html` from the static Pages build),
125
- * the Doc toolbar icon opens this URL on the **same origin** instead of GitHub.
138
+ * When set (e.g. `./browse/…/index.html`, `/browse/…/index.html`, or `./browse/<hash>.html` from
139
+ * the static Pages build), the Doc toolbar icon opens this URL on the **same origin** instead of GitHub.
126
140
  */
127
141
  commentrayStaticBrowseUrl?: string;
128
142
  /**
@@ -138,7 +152,8 @@ export type CodeBrowserPageOptions = {
138
152
  documentedPairsEmbeddedB64?: string;
139
153
  /**
140
154
  * When **two or more** angles are listed for the same static browse session, the shell renders
141
- * an Angle selector, embeds each rendered Markdown body, and disables stretch layout.
155
+ * an Angle selector. If every angle can build a block-stretch table (`layout` `auto`), the shell
156
+ * uses **stretch** (one scroll + row-aligned table); otherwise **dual** panes with client swap.
142
157
  */
143
158
  multiAngleBrowsing?: CodeBrowserMultiAngleBrowsing;
144
159
  /**
@@ -154,4 +169,6 @@ export type CodeBrowserPageOptions = {
154
169
  * token-in-line quick search (all non-whitespace tokens must appear on the same line).
155
170
  */
156
171
  export declare function renderCodeBrowserHtml(opts: CodeBrowserPageOptions): Promise<string>;
172
+ export type { DualPaneScrollSyncStrategyId } from "./code-browser-scroll-sync-strategy.js";
173
+ export type { StretchBufferSyncStrategy } from "./block-stretch-layout.js";
157
174
  //# sourceMappingURL=code-browser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"code-browser.d.ts","sourceRoot":"","sources":["../src/code-browser.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,eAAe,EAIrB,MAAM,kBAAkB,CAAC;AAU1B,OAAO,EAAE,KAAK,0BAA0B,EAAwB,MAAM,wBAAwB,CAAC;AAQ/F,2EAA2E;AAC3E,MAAM,MAAM,yBAAyB,GAAG;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE;QACjB,KAAK,EAAE,eAAe,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,yBAAyB,EAAE,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,0BAA0B,CAAC;IAClD;;;OAGG;IACH,gBAAgB,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrD;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,OAAO,CAAC,EAAE,IAAI,CAAC;IACf;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE;QACjB,KAAK,EAAE,eAAe,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACpC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,GAAG,sBAAsB,CAAC;IACpD,oHAAoH;IACpH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;OAGG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,6BAA6B,CAAC;IACnD;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAs7EF;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6EzF"}
1
+ {"version":3,"file":"code-browser.d.ts","sourceRoot":"","sources":["../src/code-browser.ts"],"names":[],"mappings":"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"}