@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
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Applies `BufferingFlowSynchronizer` per stretch row (one shared sync id per `<tr>`). The shorter
3
+ * cell gets `padding-bottom` so the row matches the taller side—same contract as `BBBB` in core
4
+ * approval fixtures, recomputed when layout changes (Mermaid, wrap, viewport).
5
+ */
6
+ export declare function applyBlockStretchRowBuffers(table: HTMLTableElement): void;
7
+ export declare function dispatchCommentrayMermaidDone(): void;
8
+ export type BlockStretchBufferSyncHandle = {
9
+ disconnect: () => void;
10
+ };
11
+ /**
12
+ * Schedules `applyBlockStretchRowBuffers` on viewport changes, table geometry changes, and after
13
+ * Mermaid finishes (see `dispatchCommentrayMermaidDone` / inline mermaid module).
14
+ */
15
+ export declare function wireBlockStretchBufferSync(table: HTMLTableElement): BlockStretchBufferSyncHandle;
16
+ //# sourceMappingURL=block-stretch-buffer-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-stretch-buffer-sync.d.ts","sourceRoot":"","sources":["../src/block-stretch-buffer-sync.ts"],"names":[],"mappings":"AAkMA;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CASzE;AAED,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD;AAED,MAAM,MAAM,4BAA4B,GAAG;IACzC,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,gBAAgB,GAAG,4BAA4B,CAuEhG"}
@@ -0,0 +1,271 @@
1
+ import { BufferingFlowSynchronizer, } from "@commentray/core/buffering-flow-synchronizer";
2
+ /**
3
+ * Stretch layout uses **one** vertical scroll (`#shell.shell--stretch-rows`). Per logical row we
4
+ * materialize the core synchronizer’s `bufferBelow` / `bufferAbove` as **`padding-bottom`** /
5
+ * **`padding-top`** on the shorter `<td>`: the browser equivalent of approval grids’ `BBBB` fill so
6
+ * both columns share the same row height and scroll as a single surface (see
7
+ * `buffering-flow-synchronizer.approvals/`).
8
+ */
9
+ const STRETCH_ROW_SELECTOR = "tbody tr.stretch-row[data-commentray-stretch-sync-id]";
10
+ const MERMAID_DONE_EVENT = "commentray-mermaid-done";
11
+ const synchronizer = new BufferingFlowSynchronizer();
12
+ function roundCssPx(n) {
13
+ if (!Number.isFinite(n) || n <= 0)
14
+ return 0;
15
+ return Math.max(0, Math.round(n));
16
+ }
17
+ function asHTMLElement(el) {
18
+ return el;
19
+ }
20
+ /** `Node.ELEMENT_NODE` without relying on global `Node` (e.g. some Vitest environments). */
21
+ const ELEMENT_NODE = 1;
22
+ function readHeightFromDocInner(cell) {
23
+ const docInner = cell.querySelector(":scope .stretch-doc-inner");
24
+ if (docInner === null || docInner.nodeType !== ELEMENT_NODE)
25
+ return 0;
26
+ const hi = asHTMLElement(docInner);
27
+ const sh = hi.scrollHeight;
28
+ if (typeof sh === "number" && sh > 0)
29
+ return roundCssPx(sh);
30
+ const byRect = roundCssPx(hi.getBoundingClientRect().height);
31
+ if (byRect > 0)
32
+ return byRect;
33
+ return 0;
34
+ }
35
+ function readHeightFromCodeStack(cell) {
36
+ const stack = cell.querySelector(":scope .stretch-code-stack");
37
+ if (stack === null || stack.nodeType !== ELEMENT_NODE)
38
+ return 0;
39
+ const st = asHTMLElement(stack);
40
+ const sh = st.scrollHeight;
41
+ if (typeof sh === "number" && sh > 0)
42
+ return roundCssPx(sh);
43
+ const byRect = roundCssPx(st.getBoundingClientRect().height);
44
+ if (byRect > 0)
45
+ return byRect;
46
+ return 0;
47
+ }
48
+ function readHeightFromCodeLines(measure) {
49
+ const lines = measure.querySelectorAll(".code-line");
50
+ if (lines.length === 0)
51
+ return 0;
52
+ let top = Infinity;
53
+ let bottom = -Infinity;
54
+ for (const line of lines) {
55
+ const r = line.getBoundingClientRect();
56
+ top = Math.min(top, r.top);
57
+ bottom = Math.max(bottom, r.bottom);
58
+ }
59
+ if (bottom <= top || !Number.isFinite(top))
60
+ return 0;
61
+ const span = roundCssPx(bottom - top);
62
+ return span > 0 ? span : 0;
63
+ }
64
+ function readHeightFromGapMark(measure) {
65
+ const gapMark = measure.querySelector(".stretch-gap-mark");
66
+ if (gapMark === null || gapMark.nodeType !== ELEMENT_NODE)
67
+ return 0;
68
+ return roundCssPx(asHTMLElement(gapMark).getBoundingClientRect().height);
69
+ }
70
+ /**
71
+ * Table cells share the row’s used height, so `td.offsetHeight` is useless for slack. Prefer
72
+ * content roots (`.stretch-code-stack`, `.stretch-doc-inner`, gap `.code-line` spans) via
73
+ * geometry / `scrollHeight`, then fall back to the measure wrapper.
74
+ */
75
+ function readCellIntrinsicHeightPx(cell) {
76
+ const hDoc = readHeightFromDocInner(cell);
77
+ if (hDoc > 0)
78
+ return hDoc;
79
+ const hStack = readHeightFromCodeStack(cell);
80
+ if (hStack > 0)
81
+ return hStack;
82
+ const measure = cell.querySelector(":scope > .stretch-cell-measure");
83
+ if (measure === null || measure.nodeType !== ELEMENT_NODE)
84
+ return roundCssPx(cell.offsetHeight);
85
+ const me = asHTMLElement(measure);
86
+ const linesSpan = readHeightFromCodeLines(me);
87
+ if (linesSpan > 0)
88
+ return linesSpan;
89
+ const gapH = readHeightFromGapMark(measure);
90
+ if (gapH > 0)
91
+ return gapH;
92
+ const wrapRect = roundCssPx(me.getBoundingClientRect().height);
93
+ if (wrapRect > 0)
94
+ return wrapRect;
95
+ return roundCssPx(me.offsetHeight);
96
+ }
97
+ function stretchRowsWithSyncId(table) {
98
+ return Array.from(table.querySelectorAll(STRETCH_ROW_SELECTOR)).filter((row) => (row.dataset.commentrayStretchSyncId?.trim() ?? "").length > 0);
99
+ }
100
+ function clearStretchRowPadding(codeTd, docTd) {
101
+ codeTd.style.paddingBottom = "";
102
+ docTd.style.paddingBottom = "";
103
+ codeTd.style.paddingTop = "";
104
+ docTd.style.paddingTop = "";
105
+ }
106
+ function applyStretchSyncPadding(codeTd, docTd, l, r) {
107
+ if (l.bufferAbove > 0)
108
+ codeTd.style.paddingTop = `${String(l.bufferAbove)}px`;
109
+ if (r.bufferAbove > 0)
110
+ docTd.style.paddingTop = `${String(r.bufferAbove)}px`;
111
+ if (l.bufferBelow > 0)
112
+ codeTd.style.paddingBottom = `${String(l.bufferBelow)}px`;
113
+ if (r.bufferBelow > 0)
114
+ docTd.style.paddingBottom = `${String(r.bufferBelow)}px`;
115
+ }
116
+ function stretchRowCells(row) {
117
+ const cells = row.querySelectorAll("td");
118
+ const codeTd = cells[0];
119
+ const docTd = cells[1];
120
+ if (codeTd === undefined || docTd === undefined)
121
+ return null;
122
+ return { codeTd, docTd };
123
+ }
124
+ function clearPaddingOnStretchRows(rows) {
125
+ for (const row of rows) {
126
+ const pair = stretchRowCells(row);
127
+ if (pair === null)
128
+ continue;
129
+ clearStretchRowPadding(pair.codeTd, pair.docTd);
130
+ }
131
+ }
132
+ function collectStretchRowHeights(rows) {
133
+ const left = [];
134
+ const right = [];
135
+ for (const row of rows) {
136
+ const pair = stretchRowCells(row);
137
+ if (pair === null)
138
+ continue;
139
+ const id = row.dataset.commentrayStretchSyncId?.trim() ?? "";
140
+ left.push({
141
+ id,
142
+ height: readCellIntrinsicHeightPx(pair.codeTd),
143
+ bufferAbove: 0,
144
+ bufferBelow: 0,
145
+ });
146
+ right.push({
147
+ id,
148
+ height: readCellIntrinsicHeightPx(pair.docTd),
149
+ bufferAbove: 0,
150
+ bufferBelow: 0,
151
+ });
152
+ }
153
+ if (left.length === 0)
154
+ return null;
155
+ return { left, right };
156
+ }
157
+ function applySynchronizedPaddingToStretchRows(rows, sync) {
158
+ const rowCount = rows.length;
159
+ for (let i = 0; i < rowCount; i++) {
160
+ const row = rows[i];
161
+ const pair = row === undefined ? null : stretchRowCells(row);
162
+ const l = sync.left[i];
163
+ const r = sync.right[i];
164
+ if (pair === null || l === undefined || r === undefined)
165
+ continue;
166
+ applyStretchSyncPadding(pair.codeTd, pair.docTd, l, r);
167
+ }
168
+ }
169
+ function clearTerminalBottomSlack(rows) {
170
+ const lastRow = rows.at(-1);
171
+ if (lastRow === undefined || !lastRow.classList.contains("stretch-row--gap"))
172
+ return;
173
+ const pair = lastRow === undefined ? null : stretchRowCells(lastRow);
174
+ if (pair === null)
175
+ return;
176
+ // In shared-table stretch mode, terminal tail slack only creates dead blank space at the end.
177
+ pair.codeTd.style.paddingBottom = "";
178
+ pair.docTd.style.paddingBottom = "";
179
+ }
180
+ /**
181
+ * Applies `BufferingFlowSynchronizer` per stretch row (one shared sync id per `<tr>`). The shorter
182
+ * cell gets `padding-bottom` so the row matches the taller side—same contract as `BBBB` in core
183
+ * approval fixtures, recomputed when layout changes (Mermaid, wrap, viewport).
184
+ */
185
+ export function applyBlockStretchRowBuffers(table) {
186
+ const rows = stretchRowsWithSyncId(table);
187
+ if (rows.length === 0)
188
+ return;
189
+ clearPaddingOnStretchRows(rows);
190
+ const columns = collectStretchRowHeights(rows);
191
+ if (columns === null)
192
+ return;
193
+ const sync = synchronizer.synchronize(columns.left, columns.right);
194
+ applySynchronizedPaddingToStretchRows(rows, sync);
195
+ clearTerminalBottomSlack(rows);
196
+ }
197
+ export function dispatchCommentrayMermaidDone() {
198
+ globalThis.dispatchEvent(new CustomEvent(MERMAID_DONE_EVENT));
199
+ }
200
+ /**
201
+ * Schedules `applyBlockStretchRowBuffers` on viewport changes, table geometry changes, and after
202
+ * Mermaid finishes (see `dispatchCommentrayMermaidDone` / inline mermaid module).
203
+ */
204
+ export function wireBlockStretchBufferSync(table) {
205
+ let raf = 0;
206
+ let moTimer;
207
+ const schedule = () => {
208
+ if (raf !== 0)
209
+ globalThis.cancelAnimationFrame(raf);
210
+ raf = globalThis.requestAnimationFrame(() => {
211
+ raf = 0;
212
+ applyBlockStretchRowBuffers(table);
213
+ });
214
+ };
215
+ const scheduleMutationDebounced = () => {
216
+ if (moTimer !== undefined)
217
+ globalThis.clearTimeout(moTimer);
218
+ moTimer = globalThis.setTimeout(() => {
219
+ moTimer = undefined;
220
+ schedule();
221
+ }, 32);
222
+ };
223
+ const ro = new ResizeObserver(() => {
224
+ schedule();
225
+ });
226
+ ro.observe(table);
227
+ const tbody = table.querySelector("tbody");
228
+ const mo = tbody !== null
229
+ ? new MutationObserver(() => {
230
+ scheduleMutationDebounced();
231
+ })
232
+ : null;
233
+ if (mo !== null && tbody !== null) {
234
+ mo.observe(tbody, { childList: true, subtree: true });
235
+ }
236
+ const onWin = () => {
237
+ schedule();
238
+ };
239
+ globalThis.addEventListener("resize", onWin, { passive: true });
240
+ globalThis.visualViewport?.addEventListener("resize", onWin, { passive: true });
241
+ const onMermaid = () => {
242
+ schedule();
243
+ };
244
+ globalThis.addEventListener(MERMAID_DONE_EVENT, onMermaid);
245
+ queueMicrotask(() => {
246
+ schedule();
247
+ globalThis.requestAnimationFrame(() => {
248
+ schedule();
249
+ globalThis.requestAnimationFrame(() => {
250
+ schedule();
251
+ });
252
+ });
253
+ globalThis.setTimeout(() => {
254
+ schedule();
255
+ }, 120);
256
+ });
257
+ return {
258
+ disconnect: () => {
259
+ if (raf !== 0)
260
+ globalThis.cancelAnimationFrame(raf);
261
+ if (moTimer !== undefined)
262
+ globalThis.clearTimeout(moTimer);
263
+ ro.disconnect();
264
+ mo?.disconnect();
265
+ globalThis.removeEventListener("resize", onWin);
266
+ globalThis.visualViewport?.removeEventListener("resize", onWin);
267
+ globalThis.removeEventListener(MERMAID_DONE_EVENT, onMermaid);
268
+ },
269
+ };
270
+ }
271
+ //# sourceMappingURL=block-stretch-buffer-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-stretch-buffer-sync.js","sourceRoot":"","sources":["../src/block-stretch-buffer-sync.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,11 @@
1
1
  import { type CommentrayIndex } from "@commentray/core";
2
2
  import { type CommentrayOutputUrlOptions } from "./markdown-pipeline.js";
3
+ /**
4
+ * Stretch column slack strategy (see `CodeBrowserPageOptions.stretchBufferSync`).
5
+ * - `flow-synchronizer` (default): row sync ids + measure wrappers + client `BufferingFlowSynchronizer` padding.
6
+ * - `table`: `<table>` row height only (legacy; no client buffer pass).
7
+ */
8
+ export type StretchBufferSyncStrategy = "table" | "flow-synchronizer";
3
9
  export type BlockStretchTableOptions = {
4
10
  code: string;
5
11
  language: string;
@@ -8,6 +14,9 @@ export type BlockStretchTableOptions = {
8
14
  sourceRelative: string;
9
15
  commentrayPathRel: string;
10
16
  commentrayOutputUrls?: CommentrayOutputUrlOptions;
17
+ sourceMarkdownOutputUrls?: CommentrayOutputUrlOptions;
18
+ /** Omitted uses `DEFAULT_STRETCH_BUFFER_SYNC` from `@commentray/core` (`flow-synchronizer`). */
19
+ stretchBufferSync?: StretchBufferSyncStrategy;
11
20
  };
12
21
  export declare function splitCommentrayMarkdownSegments(markdown: string): {
13
22
  preamble: string;
@@ -17,11 +26,15 @@ export declare function splitCommentrayMarkdownSegments(markdown: string): {
17
26
  }[];
18
27
  };
19
28
  /**
20
- * When index blocks + markdown markers align, builds a two-column table in the spirit of
21
- * GitHub **blame**: **one row per block** (plus one row per unmapped source line). The code
22
- * and commentary cells share the **same row height** whichever side is taller sets the
23
- * row; the shorter side is top-aligned with natural empty space below inside its cell.
24
- * A single outer scroll (`shell--stretch-rows`) keeps both columns in lockstep.
29
+ * When index blocks + markdown markers align, builds a two-column **`<table>`**: each logical
30
+ * pair (gap line, or one indexed block) is one `<tr>`. Row height is one number — the taller cell
31
+ * wins; the shorter cell shows top-aligned content with empty space below (browser table layout).
32
+ * “Buffer” rows (`stretch-row--gap`) absorb one-sided slack the same way: one code line + a doc
33
+ * em-dash still share one row height. A single outer scroll (`shell--stretch-rows`) keeps both
34
+ * columns in lockstep — no dual-pane scroll sync. The client may add per-cell bottom padding via
35
+ * `BufferingFlowSynchronizer` so row heights stay matched after async reflow (same idea as `BBBB`
36
+ * fills in `buffering-flow-synchronizer.approvals/`). Default is `flow-synchronizer`; pass
37
+ * `stretchBufferSync: "table"` for legacy table-only markup.
25
38
  */
26
39
  export declare function tryBuildBlockStretchTableHtml(opts: BlockStretchTableOptions): Promise<{
27
40
  preambleHtml: string;
@@ -1 +1 @@
1
- {"version":3,"file":"block-stretch-layout.d.ts","sourceRoot":"","sources":["../src/block-stretch-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EAGrB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EAAE,KAAK,0BAA0B,EAAwB,MAAM,wBAAwB,CAAC;AAO/F,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,eAAe,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,0BAA0B,CAAC;CACnD,CAAC;AAEF,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,GAAG;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC1C,CA6BA;AAgBD;;;;;;GAMG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA+ElE"}
1
+ {"version":3,"file":"block-stretch-layout.d.ts","sourceRoot":"","sources":["../src/block-stretch-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EAIrB,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EAAE,KAAK,0BAA0B,EAAwB,MAAM,wBAAwB,CAAC;AAO/F;;;;GAIG;AACH,MAAM,MAAM,yBAAyB,GAAG,OAAO,GAAG,mBAAmB,CAAC;AAEtE,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,eAAe,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,0BAA0B,CAAC;IAClD,wBAAwB,CAAC,EAAE,0BAA0B,CAAC;IACtD,gGAAgG;IAChG,iBAAiB,CAAC,EAAE,yBAAyB,CAAC;CAC/C,CAAC;AAyCF,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,GAAG;IACjE,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC1C,CA6BA;AAsID;;;;;;;;;;GAUG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA4ClE"}
@@ -1,8 +1,26 @@
1
- import { MARKER_ID_BODY, buildBlockScrollLinks, } from "@commentray/core";
1
+ import { DEFAULT_STRETCH_BUFFER_SYNC, MARKER_ID_BODY, buildBlockScrollLinks, } from "@commentray/core";
2
2
  import { escapeHtml } from "./html-utils.js";
3
3
  import { renderHighlightedCodeLineRows } from "./highlighted-code-lines.js";
4
+ import { injectSourceMarkdownAnchors } from "./inject-md-line-anchors.js";
4
5
  import { renderMarkdownToHtml } from "./markdown-pipeline.js";
5
6
  const BLOCK_MARKER_LINE = new RegExp(`^<!--\\s*commentray:block\\s+id=(${MARKER_ID_BODY})\\s*-->$`, "i");
7
+ function sourceMarkdownEnabled(language) {
8
+ const normalized = language.trim().toLowerCase();
9
+ return normalized === "md" || normalized === "markdown" || normalized === "mdx";
10
+ }
11
+ async function renderSourceMarkdownSlice(lines, startLine0, endLine0, outputUrls) {
12
+ const markdown = lines.slice(startLine0, endLine0 + 1).join("\n");
13
+ const anchored = injectSourceMarkdownAnchors(markdown, startLine0);
14
+ const rendered = await renderMarkdownToHtml(anchored.trim().length > 0 ? anchored : " ", {
15
+ commentrayOutputUrls: outputUrls,
16
+ });
17
+ return `<div class="source-pane source-pane--rendered-md stretch-source-markdown-body" data-source-markdown-body="true">${rendered}</div>`;
18
+ }
19
+ function wrapStretchSourceCell(codeHtml, renderedMarkdownHtml, mode) {
20
+ const rendered = renderedMarkdownHtml ?? "";
21
+ const inner = `<div class="source-pane source-pane--code">${codeHtml}</div>${rendered}`;
22
+ return mode === "flow-synchronizer" ? `<div class="stretch-cell-measure">${inner}</div>` : inner;
23
+ }
6
24
  export function splitCommentrayMarkdownSegments(markdown) {
7
25
  const lines = markdown.split("\n");
8
26
  const preambleLines = [];
@@ -41,65 +59,123 @@ async function renderCodeLineStack(lines, startLine0, endLine0, language) {
41
59
  });
42
60
  return `<div class="stretch-code-stack">${inner}</div>`;
43
61
  }
44
- /**
45
- * When index blocks + markdown markers align, builds a two-column table in the spirit of
46
- * GitHub **blame**: **one row per block** (plus one row per unmapped source line). The code
47
- * and commentary cells share the **same row height** — whichever side is taller sets the
48
- * row; the shorter side is top-aligned with natural empty space below inside its cell.
49
- * A single outer scroll (`shell--stretch-rows`) keeps both columns in lockstep.
50
- */
51
- export async function tryBuildBlockStretchTableHtml(opts) {
52
- const links = buildBlockScrollLinks(opts.index, opts.sourceRelative, opts.commentrayPathRel, opts.commentrayMarkdown, opts.code);
53
- if (links.length === 0)
54
- return null;
55
- const { preamble, segments } = splitCommentrayMarkdownSegments(opts.commentrayMarkdown);
56
- const mdOpts = { commentrayOutputUrls: opts.commentrayOutputUrls };
62
+ async function renderCommentraySegmentBodies(segments, outputUrls) {
63
+ const mdOpts = { commentrayOutputUrls: outputUrls };
57
64
  const renderedById = new Map();
58
65
  for (const s of segments) {
59
66
  renderedById.set(s.id, await renderMarkdownToHtml(s.body.trim().length > 0 ? s.body : " ", mdOpts));
60
67
  }
61
- const lines = opts.code.split("\n");
68
+ return renderedById;
69
+ }
70
+ function buildLineToBlockLookup(links) {
62
71
  const lineToBlock = new Map();
63
72
  for (const b of links) {
64
73
  const { lo, hiExclusive } = b.markerViewportHalfOpen1Based;
65
- for (let L = lo; L < hiExclusive; L++) {
66
- lineToBlock.set(L, b);
74
+ for (let line1 = lo; line1 < hiExclusive; line1++) {
75
+ lineToBlock.set(line1, b);
67
76
  }
68
77
  }
78
+ return lineToBlock;
79
+ }
80
+ async function maybeRenderSourceMarkdownSlice(ctx, startLine0, endLine0) {
81
+ if (!ctx.sourceMarkdownSlicesEnabled)
82
+ return undefined;
83
+ return renderSourceMarkdownSlice(ctx.lines, startLine0, endLine0, ctx.sourceMarkdownOutputUrls);
84
+ }
85
+ function nextGapSyncId(gapSyncSeq) {
86
+ if (gapSyncSeq === null)
87
+ return null;
88
+ const gapId = `__gap__${gapSyncSeq.n}`;
89
+ gapSyncSeq.n += 1;
90
+ return gapId;
91
+ }
92
+ async function buildStretchGapRowHtml(ctx, lineIndex0) {
93
+ const codeLineHtml = await renderHighlightedCodeLineRows(ctx.lines[lineIndex0] ?? "", ctx.language, {
94
+ lineIndexOffset: lineIndex0,
95
+ omitLineStackWrapper: true,
96
+ });
97
+ const renderedSourceMarkdownHtml = await maybeRenderSourceMarkdownSlice(ctx, lineIndex0, lineIndex0);
98
+ const sourceCellInner = wrapStretchSourceCell(codeLineHtml, renderedSourceMarkdownHtml, ctx.mode);
99
+ const gapId = ctx.mode === "flow-synchronizer" ? nextGapSyncId(ctx.gapSyncSeq) : null;
100
+ if (gapId !== null) {
101
+ return (`<tr class="stretch-row stretch-row--gap" data-commentray-stretch-sync-id="${escapeHtml(gapId)}">` +
102
+ `<td class="stretch-code">${sourceCellInner}</td>` +
103
+ `<td class="stretch-doc stretch-doc--gap"><div class="stretch-cell-measure"></div></td></tr>`);
104
+ }
105
+ return (`<tr class="stretch-row stretch-row--gap"><td class="stretch-code">${sourceCellInner}</td>` +
106
+ `<td class="stretch-doc stretch-doc--gap"></td></tr>`);
107
+ }
108
+ async function buildStretchBlockRowHtml(ctx, block) {
109
+ const start0 = block.sourceStart - 1;
110
+ const end0 = block.sourceEnd - 1;
111
+ const stackHtml = await renderCodeLineStack(ctx.lines, start0, end0, ctx.language);
112
+ const renderedSourceMarkdownHtml = await maybeRenderSourceMarkdownSlice(ctx, start0, end0);
113
+ const sourceCellInner = wrapStretchSourceCell(stackHtml, renderedSourceMarkdownHtml, ctx.mode);
114
+ const docInner = ctx.renderedById.get(block.id) ??
115
+ `<p class="stretch-doc-missing"><em>No commentary segment for block <code>${escapeHtml(block.id)}</code>.</em></p>`;
116
+ if (ctx.mode === "flow-synchronizer") {
117
+ return (`<tr class="stretch-row stretch-row--block" data-commentray-stretch-sync-id="${escapeHtml(block.id)}">` +
118
+ `<td class="stretch-code">${sourceCellInner}</td>` +
119
+ `<td class="stretch-doc"><div class="stretch-cell-measure"><div class="stretch-doc-inner">${docInner}</div></div></td></tr>`);
120
+ }
121
+ return (`<tr class="stretch-row stretch-row--block"><td class="stretch-code">${sourceCellInner}</td>` +
122
+ `<td class="stretch-doc"><div class="stretch-doc-inner">${docInner}</div></td></tr>`);
123
+ }
124
+ async function buildStretchRows(ctx, lineToBlock) {
69
125
  const rows = [];
70
- let i = 0;
71
- while (i < lines.length) {
72
- const L = i + 1;
73
- const b = lineToBlock.get(L);
74
- if (!b) {
75
- const codeLineHtml = await renderHighlightedCodeLineRows(lines[i] ?? "", opts.language, {
76
- lineIndexOffset: i,
77
- omitLineStackWrapper: true,
78
- });
79
- rows.push(`<tr class="stretch-row stretch-row--gap"><td class="stretch-code">${codeLineHtml}</td>` +
80
- `<td class="stretch-doc stretch-doc--gap"><span class="stretch-gap-mark" aria-hidden="true">—</span></td></tr>`);
81
- i += 1;
126
+ let lineIndex0 = 0;
127
+ while (lineIndex0 < ctx.lines.length) {
128
+ const block = lineToBlock.get(lineIndex0 + 1);
129
+ if (block === undefined || lineIndex0 < block.sourceStart - 1) {
130
+ rows.push(await buildStretchGapRowHtml(ctx, lineIndex0));
131
+ lineIndex0 += 1;
82
132
  continue;
83
133
  }
84
- if (i !== b.sourceStart - 1) {
85
- throw new Error(`block-stretch desync at 0-based index ${String(i)} (block ${b.id} should start at index ${String(b.sourceStart - 1)})`);
86
- }
87
- const start0 = b.sourceStart - 1;
88
- const end0 = b.sourceEnd - 1;
89
- const stackHtml = await renderCodeLineStack(lines, start0, end0, opts.language);
90
- const docInner = renderedById.get(b.id) ??
91
- `<p class="stretch-doc-missing"><em>No commentary segment for block <code>${escapeHtml(b.id)}</code>.</em></p>`;
92
- rows.push(`<tr class="stretch-row stretch-row--block"><td class="stretch-code">${stackHtml}</td>` +
93
- `<td class="stretch-doc"><div class="stretch-doc-inner">${docInner}</div></td></tr>`);
94
- i = end0 + 1;
134
+ rows.push(await buildStretchBlockRowHtml(ctx, block));
135
+ lineIndex0 = block.sourceEnd;
95
136
  }
137
+ return rows;
138
+ }
139
+ /**
140
+ * When index blocks + markdown markers align, builds a two-column **`<table>`**: each logical
141
+ * pair (gap line, or one indexed block) is one `<tr>`. Row height is one number — the taller cell
142
+ * wins; the shorter cell shows top-aligned content with empty space below (browser table layout).
143
+ * “Buffer” rows (`stretch-row--gap`) absorb one-sided slack the same way: one code line + a doc
144
+ * em-dash still share one row height. A single outer scroll (`shell--stretch-rows`) keeps both
145
+ * columns in lockstep — no dual-pane scroll sync. The client may add per-cell bottom padding via
146
+ * `BufferingFlowSynchronizer` so row heights stay matched after async reflow (same idea as `BBBB`
147
+ * fills in `buffering-flow-synchronizer.approvals/`). Default is `flow-synchronizer`; pass
148
+ * `stretchBufferSync: "table"` for legacy table-only markup.
149
+ */
150
+ export async function tryBuildBlockStretchTableHtml(opts) {
151
+ const mode = opts.stretchBufferSync ?? DEFAULT_STRETCH_BUFFER_SYNC;
152
+ const links = buildBlockScrollLinks(opts.index, opts.sourceRelative, opts.commentrayPathRel, opts.commentrayMarkdown, opts.code);
153
+ const { preamble, segments } = splitCommentrayMarkdownSegments(opts.commentrayMarkdown);
154
+ const lines = opts.code.split("\n");
155
+ const lnMinCh = Math.max(2, String(Math.max(1, lines.length)).length);
156
+ const mdOpts = { commentrayOutputUrls: opts.commentrayOutputUrls };
157
+ const renderedById = await renderCommentraySegmentBodies(segments, opts.commentrayOutputUrls);
158
+ const ctx = {
159
+ lines,
160
+ language: opts.language,
161
+ mode,
162
+ gapSyncSeq: mode === "flow-synchronizer" ? { n: 0 } : null,
163
+ sourceMarkdownSlicesEnabled: sourceMarkdownEnabled(opts.language),
164
+ sourceMarkdownOutputUrls: opts.sourceMarkdownOutputUrls,
165
+ renderedById,
166
+ };
167
+ const rows = await buildStretchRows(ctx, buildLineToBlockLookup(links));
96
168
  const preambleHtml = preamble.trim().length > 0
97
169
  ? `<section class="stretch-preamble" aria-label="Introduction">${await renderMarkdownToHtml(preamble, mdOpts)}</section>`
98
170
  : "";
99
- const tableInnerHtml = `<table class="block-stretch pane--code" id="code-pane" role="presentation">` +
171
+ const tableInnerHtml = `<div class="stretch-grid" id="stretch-grid">` +
172
+ `${preambleHtml}` +
173
+ `<table class="block-stretch pane--code" id="code-pane" role="presentation" style="--code-ln-min-ch:${String(lnMinCh)}">` +
100
174
  `<colgroup><col class="stretch-col-code" /><col class="stretch-col-doc" /></colgroup>` +
101
175
  `<tbody>\n${rows.join("\n")}\n</tbody>` +
102
- `</table>`;
103
- return { preambleHtml, tableInnerHtml };
176
+ `</table>` +
177
+ `<div class="stretch-gutter" id="stretch-gutter" role="separator" aria-orientation="vertical" aria-label="Resize columns"></div>` +
178
+ `</div>`;
179
+ return { preambleHtml: "", tableInnerHtml };
104
180
  }
105
181
  //# sourceMappingURL=block-stretch-layout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"block-stretch-layout.js","sourceRoot":"","sources":["../src/block-stretch-layout.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"block-stretch-layout.js","sourceRoot":"","sources":["../src/block-stretch-layout.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,7 @@
1
1
  /**
2
- * Opaque filename stem for `_site/browse/<slug>.html` (nav search + browse pages).
3
- * **Stable across rebuilds** while `commentrayPath` and `sourcePath` are unchanged;
4
- * deterministic from those exact strings. **Rename or move** either file new
5
- * strings → **a new slug** (no automatic redirect from old URLs).
2
+ * Legacy hash stem (28-char base64url) from `sourcePath` + `commentrayPath`.
3
+ * Static Pages browse HTML now uses human-readable paths under `_site/browse/`; this helper
4
+ * remains for tests and any tooling that still keys off the old filename shape.
6
5
  */
7
6
  export declare function browsePageSlugFromPair(pair: {
8
7
  sourcePath: string;
@@ -1 +1 @@
1
- {"version":3,"file":"browse-page-slug.d.ts","sourceRoot":"","sources":["../src/browse-page-slug.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB,GAAG,MAAM,CAKT"}
1
+ {"version":3,"file":"browse-page-slug.d.ts","sourceRoot":"","sources":["../src/browse-page-slug.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB,GAAG,MAAM,CAKT"}
@@ -1,9 +1,8 @@
1
1
  import { createHash } from "node:crypto";
2
2
  /**
3
- * Opaque filename stem for `_site/browse/<slug>.html` (nav search + browse pages).
4
- * **Stable across rebuilds** while `commentrayPath` and `sourcePath` are unchanged;
5
- * deterministic from those exact strings. **Rename or move** either file new
6
- * strings → **a new slug** (no automatic redirect from old URLs).
3
+ * Legacy hash stem (28-char base64url) from `sourcePath` + `commentrayPath`.
4
+ * Static Pages browse HTML now uses human-readable paths under `_site/browse/`; this helper
5
+ * remains for tests and any tooling that still keys off the old filename shape.
7
6
  */
8
7
  export function browsePageSlugFromPair(pair) {
9
8
  return createHash("sha256")
@@ -1 +1 @@
1
- {"version":3,"file":"browse-page-slug.js","sourceRoot":"","sources":["../src/browse-page-slug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAGtC;IACC,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC;SAC5D,MAAM,CAAC,WAAW,CAAC;SACnB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"browse-page-slug.js","sourceRoot":"","sources":["../src/browse-page-slug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAGtC;IACC,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC;SAC5D,MAAM,CAAC,WAAW,CAAC;SACnB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC"}