@commentray/render 0.0.9 → 0.1.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 (82) hide show
  1. package/README.md +1 -1
  2. package/dist/block-stretch-layout.d.ts.map +1 -1
  3. package/dist/block-stretch-layout.js +2 -1
  4. package/dist/block-stretch-layout.js.map +1 -1
  5. package/dist/browse-page-slug.d.ts +6 -1
  6. package/dist/browse-page-slug.d.ts.map +1 -1
  7. package/dist/browse-page-slug.js +6 -1
  8. package/dist/browse-page-slug.js.map +1 -1
  9. package/dist/browse-pair-html-test-fixtures.d.ts +10 -0
  10. package/dist/browse-pair-html-test-fixtures.d.ts.map +1 -0
  11. package/dist/browse-pair-html-test-fixtures.js +19 -0
  12. package/dist/browse-pair-html-test-fixtures.js.map +1 -0
  13. package/dist/build-commentray-nav-search.d.ts +4 -4
  14. package/dist/build-commentray-nav-search.js +1 -1
  15. package/dist/code-browser-block-rays.d.ts +29 -0
  16. package/dist/code-browser-block-rays.d.ts.map +1 -1
  17. package/dist/code-browser-block-rays.js +120 -0
  18. package/dist/code-browser-block-rays.js.map +1 -1
  19. package/dist/code-browser-client.bundle.js +24 -11
  20. package/dist/code-browser-client.js +766 -116
  21. package/dist/code-browser-client.js.map +1 -1
  22. package/dist/code-browser-intro.css +187 -0
  23. package/dist/code-browser-pair-nav.d.ts +3 -3
  24. package/dist/code-browser-pair-nav.d.ts.map +1 -1
  25. package/dist/code-browser-pair-nav.js +25 -13
  26. package/dist/code-browser-pair-nav.js.map +1 -1
  27. package/dist/code-browser-wide-intro-controller.d.ts +4 -0
  28. package/dist/code-browser-wide-intro-controller.d.ts.map +1 -0
  29. package/dist/code-browser-wide-intro-controller.js +148 -0
  30. package/dist/code-browser-wide-intro-controller.js.map +1 -0
  31. package/dist/code-browser-wide-intro-layout.d.ts +3 -0
  32. package/dist/code-browser-wide-intro-layout.d.ts.map +1 -0
  33. package/dist/code-browser-wide-intro-layout.js +84 -0
  34. package/dist/code-browser-wide-intro-layout.js.map +1 -0
  35. package/dist/code-browser-wide-intro-steps.d.ts +11 -0
  36. package/dist/code-browser-wide-intro-steps.d.ts.map +1 -0
  37. package/dist/code-browser-wide-intro-steps.js +108 -0
  38. package/dist/code-browser-wide-intro-steps.js.map +1 -0
  39. package/dist/code-browser-wide-intro-ui.d.ts +14 -0
  40. package/dist/code-browser-wide-intro-ui.d.ts.map +1 -0
  41. package/dist/code-browser-wide-intro-ui.js +67 -0
  42. package/dist/code-browser-wide-intro-ui.js.map +1 -0
  43. package/dist/code-browser.d.ts +18 -4
  44. package/dist/code-browser.d.ts.map +1 -1
  45. package/dist/code-browser.js +506 -154
  46. package/dist/code-browser.js.map +1 -1
  47. package/dist/commentray-anchor-viewport-probe.d.ts +9 -0
  48. package/dist/commentray-anchor-viewport-probe.d.ts.map +1 -0
  49. package/dist/commentray-anchor-viewport-probe.js +13 -0
  50. package/dist/commentray-anchor-viewport-probe.js.map +1 -0
  51. package/dist/commentray-preview-html.d.ts +13 -0
  52. package/dist/commentray-preview-html.d.ts.map +1 -0
  53. package/dist/commentray-preview-html.js +12 -0
  54. package/dist/commentray-preview-html.js.map +1 -0
  55. package/dist/companion-markdown-preview-entry.d.ts +7 -0
  56. package/dist/companion-markdown-preview-entry.d.ts.map +1 -0
  57. package/dist/companion-markdown-preview-entry.js +6 -0
  58. package/dist/companion-markdown-preview-entry.js.map +1 -0
  59. package/dist/index.d.ts +2 -0
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +2 -0
  62. package/dist/index.js.map +1 -1
  63. package/dist/inject-md-line-anchors.d.ts +18 -0
  64. package/dist/inject-md-line-anchors.d.ts.map +1 -0
  65. package/dist/inject-md-line-anchors.js +250 -0
  66. package/dist/inject-md-line-anchors.js.map +1 -0
  67. package/dist/inline-favicon.js +15 -15
  68. package/dist/markdown-pipeline.d.ts +5 -0
  69. package/dist/markdown-pipeline.d.ts.map +1 -1
  70. package/dist/markdown-pipeline.js +47 -1
  71. package/dist/markdown-pipeline.js.map +1 -1
  72. package/dist/side-by-side-layout-css.d.ts +1 -1
  73. package/dist/side-by-side-layout-css.d.ts.map +1 -1
  74. package/dist/side-by-side-layout-css.js +48 -0
  75. package/dist/side-by-side-layout-css.js.map +1 -1
  76. package/package.json +8 -3
  77. package/dist/code-browser-client.d.ts +0 -2
  78. package/dist/side-by-side-layout.css +0 -58
  79. package/dist/side-by-side-layout.embedded.d.ts +0 -3
  80. package/dist/side-by-side-layout.embedded.d.ts.map +0 -1
  81. package/dist/side-by-side-layout.embedded.js +0 -3
  82. package/dist/side-by-side-layout.embedded.js.map +0 -1
@@ -20,11 +20,14 @@ export function siteRootPathnameFromPathname(pathname) {
20
20
  return "/";
21
21
  return noFile.replace(/\/+$/, "") || "/";
22
22
  }
23
- /** `./browse/<slug>.html` or `browse/<slug>.html` from nav JSON (see `github-pages-site.ts`). */
24
- const STATIC_BROWSE_REL = /^(?:\.\/)?browse\/([^/?#]+\.html)$/i;
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;
25
27
  /** True when `href` is hub-root-relative static browse (not same-dir `./other.html`). */
26
28
  export function isHubRelativeStaticBrowseHref(href) {
27
- return STATIC_BROWSE_REL.test(href.trim());
29
+ const t = href.trim();
30
+ return STATIC_BROWSE_FLAT.test(t) || STATIC_BROWSE_INDEXED.test(t);
28
31
  }
29
32
  /**
30
33
  * Resolves `staticBrowseUrl` from nav JSON (typically `./browse/<slug>.html`) to an absolute href.
@@ -33,26 +36,35 @@ export function resolveStaticBrowseHref(relativeBrowse, pathname, origin) {
33
36
  const r = relativeBrowse.trim();
34
37
  if (r.startsWith("/"))
35
38
  return `${origin}${r}`;
36
- const m = STATIC_BROWSE_REL.exec(r);
37
- if (m?.[1]) {
38
- const root = siteRootPathnameFromPathname(pathname);
39
- const path = root === "/" ? `/browse/${m[1]}` : `${root}/browse/${m[1]}`;
39
+ 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
+ const mIdx = STATIC_BROWSE_INDEXED.exec(r);
46
+ if (mIdx?.[1]) {
47
+ const inner = mIdx[1];
48
+ const path = root === "/" ? `/browse/${inner}/index.html` : `${root}/browse/${inner}/index.html`;
40
49
  return `${origin}${path}`;
41
50
  }
42
51
  return new URL(r, `${origin}${pathname}`).href;
43
52
  }
44
53
  /**
45
- * Value for `#shell` `data-commentray-pair-browse-href`: keep portable `./browse/<slug>.html`
46
- * when the static site build emits hub-relative URLs (matches server HTML); otherwise resolve
47
- * like {@link resolveStaticBrowseHref} for anchors and odd relative forms.
54
+ * Value for `#shell` `data-commentray-pair-browse-href`: keep portable `./browse/…` hub-relative
55
+ * URLs when the static site emits them (`*.html` or `…/index.html`); otherwise resolve like
56
+ * {@link resolveStaticBrowseHref} for anchors and odd relative forms.
48
57
  */
49
58
  export function staticBrowseHrefForShellDataAttribute(staticBrowseUrl, pathname, origin) {
50
59
  const r = staticBrowseUrl.trim();
51
60
  if (r.length === 0)
52
61
  return "";
53
- const m = STATIC_BROWSE_REL.exec(r);
54
- if (m?.[1])
55
- return `./browse/${m[1]}`;
62
+ const flat = STATIC_BROWSE_FLAT.exec(r);
63
+ if (flat?.[1])
64
+ return `./browse/${flat[1]}`;
65
+ const indexed = STATIC_BROWSE_INDEXED.exec(r);
66
+ if (indexed?.[1])
67
+ return `./browse/${indexed[1]}/index.html`;
56
68
  return resolveStaticBrowseHref(r, pathname, origin);
57
69
  }
58
70
  export function findDocumentedPair(pairs, commentrayPath, sourcePath) {
@@ -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,4 @@
1
+ export declare function wireWideModeIntroTour(shell: HTMLElement, isNarrowViewport: () => boolean, opts?: {
2
+ force?: boolean;
3
+ }): void;
4
+ //# sourceMappingURL=code-browser-wide-intro-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-browser-wide-intro-controller.d.ts","sourceRoot":"","sources":["../src/code-browser-wide-intro-controller.ts"],"names":[],"mappings":"AA0GA,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,WAAW,EAClB,gBAAgB,EAAE,MAAM,OAAO,EAC/B,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACzB,IAAI,CAsEN"}
@@ -0,0 +1,148 @@
1
+ import { renderWideIntroArrows, repositionWideIntroBubble, } from "./code-browser-wide-intro-layout.js";
2
+ import { wideIntroStepsForShell, wideIntroVisibleTargetsForCurrentStep, } from "./code-browser-wide-intro-steps.js";
3
+ import { clearOpenWideModeIntroTourUi, createWideIntroElements, } from "./code-browser-wide-intro-ui.js";
4
+ import { readWebStorageItem, writeWebStorageItem } from "./code-browser-web-storage.js";
5
+ const STORAGE_WIDE_MODE_INTRO_DONE = "commentray.codeCommentrayStatic.wideModeIntro.v1";
6
+ function refreshWideIntroSteps(runtime) {
7
+ const nextMode = runtime.isNarrowViewport() ? "narrow" : "wide";
8
+ if (nextMode === runtime.viewportMode)
9
+ return;
10
+ runtime.viewportMode = nextMode;
11
+ runtime.steps = wideIntroStepsForShell(runtime.shell, nextMode === "narrow");
12
+ }
13
+ function repositionWideIntro(runtime) {
14
+ const { bubble, arrowLayer } = runtime.elements;
15
+ refreshWideIntroSteps(runtime);
16
+ const targets = wideIntroVisibleTargetsForCurrentStep(runtime.steps, runtime.current);
17
+ const primary = targets[0];
18
+ if (!primary) {
19
+ bubble.dataset.side = "none";
20
+ bubble.style.top = "12px";
21
+ bubble.style.left = "12px";
22
+ arrowLayer.replaceChildren();
23
+ return;
24
+ }
25
+ repositionWideIntroBubble(bubble, primary);
26
+ renderWideIntroArrows(bubble, arrowLayer, targets);
27
+ }
28
+ function advanceWideIntroToRenderableStep(runtime) {
29
+ refreshWideIntroSteps(runtime);
30
+ while (runtime.current < runtime.steps.length) {
31
+ const step = runtime.steps[runtime.current];
32
+ if (!step)
33
+ break;
34
+ const visibleTargets = wideIntroVisibleTargetsForCurrentStep(runtime.steps, runtime.current);
35
+ const hasFallbackAction = typeof step.fallbackAction === "function";
36
+ if (visibleTargets.length > 0 || hasFallbackAction)
37
+ break;
38
+ runtime.current++;
39
+ }
40
+ }
41
+ function syncWideIntroStepActionUi(runtime, step, targets) {
42
+ const { stepActionBtn } = runtime.elements;
43
+ if (targets.length === 0 &&
44
+ typeof step.fallbackAction === "function" &&
45
+ step.fallbackActionLabel) {
46
+ stepActionBtn.hidden = false;
47
+ stepActionBtn.textContent = step.fallbackActionLabel;
48
+ stepActionBtn.disabled = false;
49
+ return;
50
+ }
51
+ stepActionBtn.hidden = true;
52
+ stepActionBtn.textContent = "";
53
+ stepActionBtn.disabled = true;
54
+ }
55
+ function renderWideIntro(runtime, closeTour) {
56
+ const { titleEl, bodyEl, progressEl, backBtn, nextBtn } = runtime.elements;
57
+ advanceWideIntroToRenderableStep(runtime);
58
+ if (runtime.current >= runtime.steps.length) {
59
+ closeTour();
60
+ return;
61
+ }
62
+ const step = runtime.steps[runtime.current];
63
+ if (!step)
64
+ return;
65
+ const targets = wideIntroVisibleTargetsForCurrentStep(runtime.steps, runtime.current);
66
+ for (const el of runtime.highlighted)
67
+ el.classList.remove("commentray-wide-intro-target");
68
+ runtime.highlighted = targets;
69
+ for (const el of runtime.highlighted)
70
+ el.classList.add("commentray-wide-intro-target");
71
+ titleEl.textContent = step.title;
72
+ bodyEl.textContent = step.body;
73
+ syncWideIntroStepActionUi(runtime, step, targets);
74
+ progressEl.textContent = `${String(runtime.current + 1)} / ${String(runtime.steps.length)}`;
75
+ backBtn.disabled = runtime.current === 0;
76
+ nextBtn.textContent = runtime.current === runtime.steps.length - 1 ? "Done" : "Next";
77
+ repositionWideIntro(runtime);
78
+ }
79
+ export function wireWideModeIntroTour(shell, isNarrowViewport, opts) {
80
+ if (!opts?.force && readWebStorageItem(localStorage, STORAGE_WIDE_MODE_INTRO_DONE) === "1")
81
+ return;
82
+ clearOpenWideModeIntroTourUi();
83
+ const elements = createWideIntroElements();
84
+ if (!elements)
85
+ return;
86
+ const runtime = {
87
+ shell,
88
+ steps: wideIntroStepsForShell(shell, isNarrowViewport()),
89
+ viewportMode: isNarrowViewport() ? "narrow" : "wide",
90
+ current: 0,
91
+ highlighted: [],
92
+ elements,
93
+ isNarrowViewport,
94
+ };
95
+ const { bubble, arrowLayer, stepActionBtn, backBtn, nextBtn, skipBtn } = runtime.elements;
96
+ const closeTour = () => {
97
+ for (const el of runtime.highlighted)
98
+ el.classList.remove("commentray-wide-intro-target");
99
+ runtime.highlighted = [];
100
+ arrowLayer.remove();
101
+ bubble.remove();
102
+ globalThis.removeEventListener("resize", onResize);
103
+ globalThis.removeEventListener("scroll", reposition, true);
104
+ document.removeEventListener("keydown", onKeyDown, true);
105
+ writeWebStorageItem(localStorage, STORAGE_WIDE_MODE_INTRO_DONE, "1");
106
+ };
107
+ const reposition = () => {
108
+ repositionWideIntro(runtime);
109
+ };
110
+ const render = () => {
111
+ renderWideIntro(runtime, closeTour);
112
+ };
113
+ const onResize = () => {
114
+ render();
115
+ };
116
+ const onKeyDown = (ev) => {
117
+ if (ev.key !== "Escape")
118
+ return;
119
+ ev.preventDefault();
120
+ closeTour();
121
+ };
122
+ backBtn.addEventListener("click", () => {
123
+ if (runtime.current > 0)
124
+ runtime.current--;
125
+ render();
126
+ });
127
+ stepActionBtn.addEventListener("click", () => {
128
+ const step = runtime.steps[runtime.current];
129
+ if (!step || typeof step.fallbackAction !== "function")
130
+ return;
131
+ step.fallbackAction();
132
+ render();
133
+ });
134
+ nextBtn.addEventListener("click", () => {
135
+ if (runtime.current >= runtime.steps.length - 1) {
136
+ closeTour();
137
+ return;
138
+ }
139
+ runtime.current++;
140
+ render();
141
+ });
142
+ skipBtn.addEventListener("click", closeTour);
143
+ globalThis.addEventListener("resize", onResize);
144
+ globalThis.addEventListener("scroll", reposition, true);
145
+ document.addEventListener("keydown", onKeyDown, true);
146
+ render();
147
+ }
148
+ //# sourceMappingURL=code-browser-wide-intro-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-browser-wide-intro-controller.js","sourceRoot":"","sources":["../src/code-browser-wide-intro-controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function repositionWideIntroBubble(bubble: HTMLElement, target: HTMLElement): void;
2
+ export declare function renderWideIntroArrows(bubble: HTMLElement, arrowLayer: HTMLElement, targets: HTMLElement[]): void;
3
+ //# sourceMappingURL=code-browser-wide-intro-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-browser-wide-intro-layout.d.ts","sourceRoot":"","sources":["../src/code-browser-wide-intro-layout.ts"],"names":[],"mappings":"AAIA,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAkBxF;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,WAAW,EAAE,GACrB,IAAI,CAsEN"}
@@ -0,0 +1,84 @@
1
+ function clamp(n, lo, hi) {
2
+ return Math.max(lo, Math.min(hi, n));
3
+ }
4
+ export function repositionWideIntroBubble(bubble, target) {
5
+ const rect = target.getBoundingClientRect();
6
+ const vw = globalThis.innerWidth;
7
+ const vh = globalThis.innerHeight;
8
+ const bubbleRect = bubble.getBoundingClientRect();
9
+ const bubbleWidth = bubbleRect.width > 0 ? bubbleRect.width : 340;
10
+ const bubbleHeight = bubbleRect.height > 0 ? bubbleRect.height : 160;
11
+ const margin = 8;
12
+ const canPlaceBelow = rect.bottom + 12 + bubbleHeight <= vh - margin;
13
+ const top = canPlaceBelow
14
+ ? Math.max(margin, rect.bottom + 12)
15
+ : Math.max(margin, rect.top - bubbleHeight - 12);
16
+ const left = clamp(rect.left, margin, vw - bubbleWidth - margin);
17
+ bubble.style.top = `${String(Math.round(top))}px`;
18
+ bubble.style.left = `${String(Math.round(left))}px`;
19
+ bubble.dataset.side = canPlaceBelow ? "below" : "above";
20
+ const pointerLeft = clamp(rect.left + rect.width / 2 - left - 8, 10, bubbleWidth - 22);
21
+ bubble.style.setProperty("--pointer-left", `${String(Math.round(pointerLeft))}px`);
22
+ }
23
+ export function renderWideIntroArrows(bubble, arrowLayer, targets) {
24
+ arrowLayer.replaceChildren();
25
+ if (targets.length === 0)
26
+ return;
27
+ const bubbleRect = bubble.getBoundingClientRect();
28
+ const bubbleCenterX = bubbleRect.left + bubbleRect.width / 2;
29
+ const bubbleCenterY = bubbleRect.top + bubbleRect.height / 2;
30
+ const edgePadding = 12;
31
+ const sideInset = 8;
32
+ const spread = 12;
33
+ const side = bubble.dataset.side;
34
+ const pointerLeftRaw = Number.parseFloat(bubble.style.getPropertyValue("--pointer-left"));
35
+ const pointerCenterX = Number.isFinite(pointerLeftRaw)
36
+ ? bubbleRect.left + pointerLeftRaw + 8
37
+ : bubbleCenterX;
38
+ const pointerTipY = side === "below"
39
+ ? bubbleRect.top - sideInset
40
+ : side === "above"
41
+ ? bubbleRect.bottom + sideInset
42
+ : bubbleCenterY;
43
+ for (const [index, target] of targets.entries()) {
44
+ const rect = target.getBoundingClientRect();
45
+ // Point to the middle of each target element.
46
+ const endX = rect.left + rect.width / 2;
47
+ const endY = rect.top + rect.height / 2;
48
+ const toTargetX = endX - bubbleCenterX;
49
+ const toTargetY = endY - bubbleCenterY;
50
+ const horizontalDominant = Math.abs(toTargetX) >= Math.abs(toTargetY);
51
+ const spreadOffset = index - (targets.length - 1) / 2;
52
+ let startX;
53
+ let startY;
54
+ if (targets.length === 1 && (side === "below" || side === "above")) {
55
+ // Single-target tours look cleaner when the arrow starts from the bubble pointer notch.
56
+ startX = pointerCenterX;
57
+ startY = pointerTipY;
58
+ }
59
+ else if (horizontalDominant) {
60
+ startX = toTargetX >= 0 ? bubbleRect.right + sideInset : bubbleRect.left - sideInset;
61
+ startY = clamp(endY + spreadOffset * spread, bubbleRect.top + edgePadding, bubbleRect.bottom - edgePadding);
62
+ }
63
+ else {
64
+ startY = toTargetY >= 0 ? bubbleRect.bottom + sideInset : bubbleRect.top - sideInset;
65
+ startX = clamp(endX + spreadOffset * spread, bubbleRect.left + edgePadding, bubbleRect.right - edgePadding);
66
+ }
67
+ const dx = endX - startX;
68
+ const dy = endY - startY;
69
+ const length = Math.hypot(dx, dy);
70
+ if (!Number.isFinite(length) || length < 12)
71
+ continue;
72
+ const arrow = document.createElement("span");
73
+ arrow.className = "commentray-wide-intro-arrow";
74
+ arrow.style.left = `${String(Math.round(startX))}px`;
75
+ arrow.style.top = `${String(Math.round(startY))}px`;
76
+ arrow.style.width = `${String(Math.round(length))}px`;
77
+ arrow.style.setProperty("--wide-intro-arrow-angle", `${String(Math.atan2(dy, dx))}rad`);
78
+ const head = document.createElement("span");
79
+ head.className = "commentray-wide-intro-arrow-head";
80
+ arrow.appendChild(head);
81
+ arrowLayer.appendChild(arrow);
82
+ }
83
+ }
84
+ //# sourceMappingURL=code-browser-wide-intro-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-browser-wide-intro-layout.js","sourceRoot":"","sources":["../src/code-browser-wide-intro-layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export type WideIntroStep = {
2
+ targetSelector?: string;
3
+ targetSelectors?: string[];
4
+ title: string;
5
+ body: string;
6
+ fallbackActionLabel?: string;
7
+ fallbackAction?: () => void;
8
+ };
9
+ export declare function wideIntroStepsForShell(shell: HTMLElement, isNarrowViewport: boolean): WideIntroStep[];
10
+ export declare function wideIntroVisibleTargetsForCurrentStep(steps: WideIntroStep[], current: number): HTMLElement[];
11
+ //# sourceMappingURL=code-browser-wide-intro-steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-browser-wide-intro-steps.d.ts","sourceRoot":"","sources":["../src/code-browser-wide-intro-steps.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B,CAAC;AAEF,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,WAAW,EAClB,gBAAgB,EAAE,OAAO,GACxB,aAAa,EAAE,CA2EjB;AA8BD,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,aAAa,EAAE,EACtB,OAAO,EAAE,MAAM,GACd,WAAW,EAAE,CAIf"}
@@ -0,0 +1,108 @@
1
+ export function wideIntroStepsForShell(shell, isNarrowViewport) {
2
+ const introTargetSelector = isNarrowViewport ? "#mobile-pane-flip" : "#shell";
3
+ const shellSelector = shell.id.trim().length > 0 && typeof globalThis.CSS?.escape === "function"
4
+ ? `#${globalThis.CSS.escape(shell.id)}`
5
+ : "#shell";
6
+ const shellOrIntroTargetSelector = introTargetSelector === "#shell" ? shellSelector : introTargetSelector;
7
+ return [
8
+ {
9
+ targetSelectors: isNarrowViewport
10
+ ? [shellOrIntroTargetSelector]
11
+ : ["#code-pane", "#doc-pane"],
12
+ title: "Welcome",
13
+ body: "Welcome to commentray, a system to create and view commentaries next to the source tree. Angles are different aspects of these commentaries, so switch between them and keep scrolling while both panes stay aligned.",
14
+ },
15
+ {
16
+ targetSelectors: isNarrowViewport
17
+ ? [shellOrIntroTargetSelector]
18
+ : ["#code-pane", "#doc-pane"],
19
+ title: "Two views",
20
+ body: isNarrowViewport
21
+ ? "You are in narrow view now. Use the pane flip to switch code and commentary. Wide view shows both panes side by side."
22
+ : "You are in wide view now. It shows code and commentary side by side. Narrow view uses one pane and a flip control.",
23
+ },
24
+ {
25
+ targetSelectors: isNarrowViewport
26
+ ? ["#mobile-pane-flip", "#doc-pane"]
27
+ : ["#code-pane", "#doc-pane"],
28
+ title: isNarrowViewport ? "Scroll and toggle" : "Scroll both panes",
29
+ body: isNarrowViewport
30
+ ? "Try scrolling commentary, then use the pane flip to switch to source and keep exploring."
31
+ : "Try scrolling in either pane. Source and commentary stay aligned while you read side by side.",
32
+ },
33
+ {
34
+ targetSelector: "#search-q",
35
+ title: "Search quickly",
36
+ body: "Use this search input to jump to documented source lines and markdown snippets.",
37
+ },
38
+ {
39
+ targetSelector: "#angle-select",
40
+ title: "Angle switch",
41
+ body: "Change the Commentray angle to view a different narrative for this same source file.",
42
+ },
43
+ {
44
+ targetSelector: "#source-markdown-pane-flip",
45
+ title: "Source view mode",
46
+ body: "Toggle between raw source and rendered markdown in the source pane.",
47
+ },
48
+ {
49
+ targetSelector: "#wrap-lines",
50
+ title: "Readability controls",
51
+ body: "Wrap lines to reduce horizontal scrolling in both source and commentary panes.",
52
+ fallbackActionLabel: "Switch to markdown source",
53
+ fallbackAction: () => {
54
+ const sourceModeFlip = document.getElementById("source-markdown-pane-flip");
55
+ if (sourceModeFlip instanceof HTMLButtonElement)
56
+ sourceModeFlip.click();
57
+ },
58
+ },
59
+ {
60
+ targetSelector: "#commentray-theme-trigger",
61
+ title: "Appearance",
62
+ body: "Change theme mode from this trigger (menu on left-click, quick cycle on right-click).",
63
+ },
64
+ {
65
+ targetSelector: "#commentray-share-link",
66
+ title: "Share this view",
67
+ body: "Use this link button to copy a shareable permalink to the exact page and state you are viewing.",
68
+ },
69
+ {
70
+ targetSelector: "#commentray-help-tour",
71
+ title: "Need a refresher?",
72
+ body: "You can always go back to this tutorial via the help button.",
73
+ },
74
+ ];
75
+ }
76
+ function wideIntroTargetsForCurrentStep(steps, current) {
77
+ const step = steps[current];
78
+ if (!step)
79
+ return [];
80
+ const selectors = Array.isArray(step.targetSelectors) && step.targetSelectors.length > 0
81
+ ? step.targetSelectors
82
+ : step.targetSelector
83
+ ? [step.targetSelector]
84
+ : [];
85
+ const targets = [];
86
+ const seen = new Set();
87
+ for (const selector of selectors) {
88
+ const found = document.querySelector(selector);
89
+ if (!(found instanceof HTMLElement) || seen.has(found))
90
+ continue;
91
+ seen.add(found);
92
+ targets.push(found);
93
+ }
94
+ return targets;
95
+ }
96
+ function isWideIntroTargetVisible(target) {
97
+ if (target.hidden)
98
+ return false;
99
+ const style = globalThis.getComputedStyle(target);
100
+ if (style.display === "none" || style.visibility === "hidden")
101
+ return false;
102
+ const rect = target.getBoundingClientRect();
103
+ return rect.width > 0 && rect.height > 0;
104
+ }
105
+ export function wideIntroVisibleTargetsForCurrentStep(steps, current) {
106
+ return wideIntroTargetsForCurrentStep(steps, current).filter((target) => isWideIntroTargetVisible(target));
107
+ }
108
+ //# sourceMappingURL=code-browser-wide-intro-steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-browser-wide-intro-steps.js","sourceRoot":"","sources":["../src/code-browser-wide-intro-steps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export type WideIntroElements = {
2
+ bubble: HTMLElement;
3
+ arrowLayer: HTMLElement;
4
+ titleEl: HTMLElement;
5
+ bodyEl: HTMLElement;
6
+ stepActionBtn: HTMLButtonElement;
7
+ progressEl: HTMLElement;
8
+ backBtn: HTMLButtonElement;
9
+ nextBtn: HTMLButtonElement;
10
+ skipBtn: HTMLButtonElement;
11
+ };
12
+ export declare function clearOpenWideModeIntroTourUi(): void;
13
+ export declare function createWideIntroElements(): WideIntroElements | null;
14
+ //# sourceMappingURL=code-browser-wide-intro-ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-browser-wide-intro-ui.d.ts","sourceRoot":"","sources":["../src/code-browser-wide-intro-ui.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,WAAW,CAAC;IACxB,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,WAAW,CAAC;IACpB,aAAa,EAAE,iBAAiB,CAAC;IACjC,UAAU,EAAE,WAAW,CAAC;IACxB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,iBAAiB,CAAC;CAC5B,CAAC;AAEF,wBAAgB,4BAA4B,IAAI,IAAI,CAQnD;AAED,wBAAgB,uBAAuB,IAAI,iBAAiB,GAAG,IAAI,CAyDlE"}
@@ -0,0 +1,67 @@
1
+ export function clearOpenWideModeIntroTourUi() {
2
+ for (const el of Array.from(document.querySelectorAll(".commentray-wide-intro-target"))) {
3
+ if (el instanceof HTMLElement)
4
+ el.classList.remove("commentray-wide-intro-target");
5
+ }
6
+ const open = document.getElementById("commentray-wide-intro");
7
+ if (open instanceof HTMLElement)
8
+ open.remove();
9
+ const arrows = document.getElementById("commentray-wide-intro-arrows");
10
+ if (arrows instanceof HTMLElement)
11
+ arrows.remove();
12
+ }
13
+ export function createWideIntroElements() {
14
+ const arrowLayer = document.createElement("div");
15
+ arrowLayer.id = "commentray-wide-intro-arrows";
16
+ arrowLayer.setAttribute("aria-hidden", "true");
17
+ document.body.appendChild(arrowLayer);
18
+ const bubble = document.createElement("section");
19
+ bubble.id = "commentray-wide-intro";
20
+ bubble.setAttribute("role", "dialog");
21
+ bubble.setAttribute("aria-live", "polite");
22
+ bubble.innerHTML = `
23
+ <span class="commentray-wide-intro-pointer" aria-hidden="true"></span>
24
+ <p class="commentray-wide-intro-title"></p>
25
+ <p class="commentray-wide-intro-body"></p>
26
+ <button type="button" class="commentray-wide-intro-step-action" hidden></button>
27
+ <div class="commentray-wide-intro-footer">
28
+ <span class="commentray-wide-intro-progress"></span>
29
+ <div class="commentray-wide-intro-actions">
30
+ <button type="button" data-wide-intro="back">Back</button>
31
+ <button type="button" data-wide-intro="next">Next</button>
32
+ <button type="button" data-wide-intro="skip">Skip</button>
33
+ </div>
34
+ </div>
35
+ `;
36
+ document.body.appendChild(bubble);
37
+ const titleEl = bubble.querySelector(".commentray-wide-intro-title");
38
+ const bodyEl = bubble.querySelector(".commentray-wide-intro-body");
39
+ const stepActionBtn = bubble.querySelector(".commentray-wide-intro-step-action");
40
+ const progressEl = bubble.querySelector(".commentray-wide-intro-progress");
41
+ const backBtn = bubble.querySelector('button[data-wide-intro="back"]');
42
+ const nextBtn = bubble.querySelector('button[data-wide-intro="next"]');
43
+ const skipBtn = bubble.querySelector('button[data-wide-intro="skip"]');
44
+ if (!(titleEl instanceof HTMLElement) ||
45
+ !(bodyEl instanceof HTMLElement) ||
46
+ !(stepActionBtn instanceof HTMLButtonElement) ||
47
+ !(progressEl instanceof HTMLElement) ||
48
+ !(backBtn instanceof HTMLButtonElement) ||
49
+ !(nextBtn instanceof HTMLButtonElement) ||
50
+ !(skipBtn instanceof HTMLButtonElement)) {
51
+ arrowLayer.remove();
52
+ bubble.remove();
53
+ return null;
54
+ }
55
+ return {
56
+ bubble,
57
+ arrowLayer,
58
+ titleEl,
59
+ bodyEl,
60
+ stepActionBtn,
61
+ progressEl,
62
+ backBtn,
63
+ nextBtn,
64
+ skipBtn,
65
+ };
66
+ }
67
+ //# sourceMappingURL=code-browser-wide-intro-ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-browser-wide-intro-ui.js","sourceRoot":"","sources":["../src/code-browser-wide-intro-ui.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,4BAA4B;IAC1C,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,+BAA+B,CAAC,CAAC,EAAE,CAAC;QACxF,IAAI,EAAE,YAAY,WAAW;YAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;IACrF,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC;IAC9D,IAAI,IAAI,YAAY,WAAW;QAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAC/C,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,8BAA8B,CAAC,CAAC;IACvE,IAAI,MAAM,YAAY,WAAW;QAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACjD,UAAU,CAAC,EAAE,GAAG,8BAA8B,CAAC;IAC/C,UAAU,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC/C,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAEtC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,CAAC,EAAE,GAAG,uBAAuB,CAAC;IACpC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtC,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC3C,MAAM,CAAC,SAAS,GAAG;;;;;;;;;;;;;GAalB,CAAC;IACF,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAElC,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,8BAA8B,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,6BAA6B,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,oCAAoC,CAAC,CAAC;IACjF,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC,iCAAiC,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,gCAAgC,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,gCAAgC,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,gCAAgC,CAAC,CAAC;IACvE,IACE,CAAC,CAAC,OAAO,YAAY,WAAW,CAAC;QACjC,CAAC,CAAC,MAAM,YAAY,WAAW,CAAC;QAChC,CAAC,CAAC,aAAa,YAAY,iBAAiB,CAAC;QAC7C,CAAC,CAAC,UAAU,YAAY,WAAW,CAAC;QACpC,CAAC,CAAC,OAAO,YAAY,iBAAiB,CAAC;QACvC,CAAC,CAAC,OAAO,YAAY,iBAAiB,CAAC;QACvC,CAAC,CAAC,OAAO,YAAY,iBAAiB,CAAC,EACvC,CAAC;QACD,UAAU,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,MAAM;QACN,UAAU;QACV,OAAO;QACP,MAAM;QACN,aAAa;QACb,UAAU;QACV,OAAO;QACP,OAAO;QACP,OAAO;KACR,CAAC;AACJ,CAAC"}
@@ -8,10 +8,18 @@ export type CodeBrowserMultiAngleSpec = {
8
8
  commentrayPathRel: string;
9
9
  commentrayOnGithubUrl?: string;
10
10
  /**
11
- * When the static site emits `_site/browse/<slug>.html` per pair, same-tab navigation for the
12
- * Doc toolbar control (preferred over {@link commentrayOnGithubUrl} on the hub).
11
+ * 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.
13
15
  */
14
16
  staticBrowseUrl?: string;
17
+ /**
18
+ * When set, `blockStretchRows.commentrayPathRel` must equal this angle’s {@link commentrayPathRel}
19
+ * and `blockStretchRows.sourceRelative` must equal the page primary {@link CodeBrowserPageOptions.filePath}
20
+ * (repo-relative, normalized the same way as the index). Otherwise scroll links are omitted so one
21
+ * angle never inherits another angle’s index slice.
22
+ */
15
23
  blockStretchRows?: {
16
24
  index: CommentrayIndex;
17
25
  sourceRelative: string;
@@ -113,8 +121,8 @@ export type CodeBrowserPageOptions = {
113
121
  */
114
122
  commentrayOnGithubUrl?: string;
115
123
  /**
116
- * When set (e.g. `./browse/<slug>.html` from the static Pages build), the Doc toolbar icon
117
- * opens this URL on the **same origin** instead of GitHub.
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.
118
126
  */
119
127
  commentrayStaticBrowseUrl?: string;
120
128
  /**
@@ -133,6 +141,12 @@ export type CodeBrowserPageOptions = {
133
141
  * an Angle selector, embeds each rendered Markdown body, and disables stretch layout.
134
142
  */
135
143
  multiAngleBrowsing?: CodeBrowserMultiAngleBrowsing;
144
+ /**
145
+ * When set to a valid Git object id (7–40 hex digits, e.g. CI `github.sha`), appended to the
146
+ * page footer after the build time so published static output is traceable to a commit.
147
+ * Omit for local builds.
148
+ */
149
+ pagesBuildCommitSha?: string;
136
150
  };
137
151
  /**
138
152
  * Static HTML shell for a minimal “code browser”: code + rendered commentray,