@coldtea/pr-lens-renderer 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +15 -0
  2. package/dist/glob.d.ts.map +1 -1
  3. package/dist/glob.js +72 -9
  4. package/dist/glob.js.map +1 -1
  5. package/dist/index.d.ts +7 -3
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +7 -3
  8. package/dist/index.js.map +1 -1
  9. package/dist/manifest.d.ts +11 -3
  10. package/dist/manifest.d.ts.map +1 -1
  11. package/dist/manifest.js +10 -1
  12. package/dist/manifest.js.map +1 -1
  13. package/dist/render-all.d.ts +35 -0
  14. package/dist/render-all.d.ts.map +1 -0
  15. package/dist/render-all.js +110 -0
  16. package/dist/render-all.js.map +1 -0
  17. package/dist/render.d.ts +4 -31
  18. package/dist/render.d.ts.map +1 -1
  19. package/dist/render.js +5 -75
  20. package/dist/render.js.map +1 -1
  21. package/dist/svg/document.d.ts +8 -0
  22. package/dist/svg/document.d.ts.map +1 -1
  23. package/dist/svg/document.js +3 -2
  24. package/dist/svg/document.js.map +1 -1
  25. package/dist/theme.d.ts +2 -0
  26. package/dist/theme.d.ts.map +1 -1
  27. package/dist/theme.js +1 -0
  28. package/dist/theme.js.map +1 -1
  29. package/dist/version.d.ts +1 -1
  30. package/dist/version.js +1 -1
  31. package/dist/walkthrough/camera.d.ts +43 -0
  32. package/dist/walkthrough/camera.d.ts.map +1 -0
  33. package/dist/walkthrough/camera.js +101 -0
  34. package/dist/walkthrough/camera.js.map +1 -0
  35. package/dist/walkthrough/caption.d.ts +5 -0
  36. package/dist/walkthrough/caption.d.ts.map +1 -0
  37. package/dist/walkthrough/caption.js +36 -0
  38. package/dist/walkthrough/caption.js.map +1 -0
  39. package/dist/walkthrough/embed.d.ts +31 -0
  40. package/dist/walkthrough/embed.d.ts.map +1 -0
  41. package/dist/walkthrough/embed.js +297 -0
  42. package/dist/walkthrough/embed.js.map +1 -0
  43. package/dist/walkthrough/index.d.ts +8 -0
  44. package/dist/walkthrough/index.d.ts.map +1 -0
  45. package/dist/walkthrough/index.js +6 -0
  46. package/dist/walkthrough/index.js.map +1 -0
  47. package/dist/walkthrough/layout.d.ts +28 -0
  48. package/dist/walkthrough/layout.d.ts.map +1 -0
  49. package/dist/walkthrough/layout.js +31 -0
  50. package/dist/walkthrough/layout.js.map +1 -0
  51. package/dist/walkthrough/nest.d.ts +4 -0
  52. package/dist/walkthrough/nest.d.ts.map +1 -0
  53. package/dist/walkthrough/nest.js +4 -0
  54. package/dist/walkthrough/nest.js.map +1 -0
  55. package/dist/walkthrough/resolve.d.ts +45 -0
  56. package/dist/walkthrough/resolve.d.ts.map +1 -0
  57. package/dist/walkthrough/resolve.js +189 -0
  58. package/dist/walkthrough/resolve.js.map +1 -0
  59. package/dist/walkthrough/tile-ids.d.ts +8 -0
  60. package/dist/walkthrough/tile-ids.d.ts.map +1 -0
  61. package/dist/walkthrough/tile-ids.js +16 -0
  62. package/dist/walkthrough/tile-ids.js.map +1 -0
  63. package/dist/walkthrough/tiles.d.ts +15 -0
  64. package/dist/walkthrough/tiles.d.ts.map +1 -0
  65. package/dist/walkthrough/tiles.js +80 -0
  66. package/dist/walkthrough/tiles.js.map +1 -0
  67. package/package.json +7 -3
  68. package/src/glob.ts +76 -11
  69. package/src/index.ts +23 -6
  70. package/src/manifest.ts +20 -3
  71. package/src/render-all.ts +195 -0
  72. package/src/render.ts +8 -116
  73. package/src/svg/document.ts +3 -2
  74. package/src/theme.ts +4 -0
  75. package/src/version.ts +1 -1
  76. package/src/walkthrough/camera.ts +142 -0
  77. package/src/walkthrough/caption.ts +35 -0
  78. package/src/walkthrough/embed.ts +436 -0
  79. package/src/walkthrough/index.ts +42 -0
  80. package/src/walkthrough/layout.ts +46 -0
  81. package/src/walkthrough/nest.ts +6 -0
  82. package/src/walkthrough/resolve.ts +268 -0
  83. package/src/walkthrough/tile-ids.ts +17 -0
  84. package/src/walkthrough/tiles.ts +106 -0
@@ -0,0 +1,297 @@
1
+ import { assertNever } from "@coldtea/pr-lens-schema";
2
+ import { markerDefs } from "../svg/document.js";
3
+ import { escapeXml } from "../svg/primitives.js";
4
+ import { SANS_STACK, truncate } from "../text.js";
5
+ import { paletteFor } from "../theme.js";
6
+ import { balancedLines, words } from "./caption.js";
7
+ import { easeInOut, flightFor, frame, interpolateFlight, lerpRect, } from "./camera.js";
8
+ import { stripLayout, tileRect } from "./layout.js";
9
+ import { nestedRender } from "./nest.js";
10
+ import { resolveWalkthrough } from "./resolve.js";
11
+ import { planTiles } from "./tiles.js";
12
+ export const EMBED_WIDTH = 870;
13
+ const STAGE_HEIGHT = 340;
14
+ const STAGE = { left: 0, top: 0, width: EMBED_WIDTH, height: STAGE_HEIGHT };
15
+ const GAP = 16;
16
+ const FEATHER = 28;
17
+ /** Room for the focus mask to cover past the strip at any zoom. */
18
+ const OVERSCAN = 4000;
19
+ const PASSES = 2;
20
+ /** Keyframes per flight. CSS interpolates linearly between them. */
21
+ const SAMPLES = 16;
22
+ const EASE_OUT = "cubic-bezier(0.23,1,0.32,1)";
23
+ const HEADING_SIZE = 17.5;
24
+ const BODY_SIZE = 16;
25
+ const LINE_HEIGHT = 22;
26
+ const BODY_X = 16;
27
+ const HEADING_X = 40;
28
+ const HEADING_Y = 26;
29
+ const BODY_Y = 52;
30
+ const CAPTION_FOOT = 12;
31
+ /** Short of the full width, since system fonts run up to 8% wider than the width table's face. */
32
+ const CAPTION_WIDTH = 770;
33
+ const PIP = { width: 18, gap: 5, height: 3, y: 19, right: EMBED_WIDTH - 2 };
34
+ const HEADING_AIR = 12;
35
+ /** The `git-pull-request` octicon. */
36
+ const PULL_REQUEST_ICON = "M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z";
37
+ const tokensFor = (theme) => {
38
+ switch (theme) {
39
+ case "dark":
40
+ return {
41
+ text: "#f0f6fc",
42
+ accent: "#3fb950",
43
+ track: "rgba(240,246,252,.14)",
44
+ rim: "rgba(230,237,243,.34)",
45
+ dim: ".24",
46
+ card: false,
47
+ };
48
+ case "light":
49
+ return {
50
+ text: "#1f2328",
51
+ accent: "#1a7f37",
52
+ track: "rgba(31,35,40,.14)",
53
+ rim: "rgba(31,35,40,.5)",
54
+ dim: ".42",
55
+ card: true,
56
+ };
57
+ default:
58
+ return assertNever(theme, "Unhandled embed theme");
59
+ }
60
+ };
61
+ /** `toFixed` with no sign on a zero. */
62
+ const fixed = (value, digits) => {
63
+ const text = value.toFixed(digits);
64
+ return /^-0(?:\.0+)?$/.test(text) ? text.slice(1) : text;
65
+ };
66
+ /** A whole tile is framed at reading distance. A region fills the stage. */
67
+ const target = (focus, box) => {
68
+ switch (focus.kind) {
69
+ case "whole":
70
+ return { rect: tileRect(box), policy: { kind: "diagram" } };
71
+ case "region": {
72
+ const { x, y, width, height } = focus.rect;
73
+ return { rect: { x: box.x + x, y: box.y + y, width, height }, policy: { kind: "selection" } };
74
+ }
75
+ default:
76
+ return assertNever(focus, "Unhandled focus");
77
+ }
78
+ };
79
+ const shotFor = (step, box) => {
80
+ const { rect, policy } = target(step.focus, box);
81
+ return { heading: step.heading, body: step.body, tileId: step.tileId, rect, camera: frame(policy, rect, STAGE) };
82
+ };
83
+ const legFor = (from, to) => {
84
+ const path = interpolateFlight(from.camera, to.camera, STAGE);
85
+ const flight = flightFor(path.distance, false);
86
+ const seconds = (() => {
87
+ switch (flight.kind) {
88
+ case "smooth":
89
+ return flight.durationMs / 1000;
90
+ case "cut":
91
+ return 0;
92
+ default:
93
+ return assertNever(flight, "Unhandled flight");
94
+ }
95
+ })();
96
+ const frames = Array.from({ length: SAMPLES + 1 }, (_, index) => {
97
+ const eased = easeInOut(index / SAMPLES);
98
+ return { camera: path.at(eased), rect: lerpRect(from.rect, to.rect, eased) };
99
+ });
100
+ return { seconds, frames };
101
+ };
102
+ /** The canvas's reading time, quickened for a picture nobody can pause, less the caption's fade out. */
103
+ const dwellFor = (shot) => {
104
+ const count = words(`${shot.heading} ${shot.body}`).length;
105
+ return Math.min(Math.max(3.2 + count * 0.38, 8), 14) * 0.614 - 1.1;
106
+ };
107
+ const clockFor = (shots) => {
108
+ const legs = shots.map((shot, index) => legFor(shots[(index + shots.length - 1) % shots.length] ?? shot, shot));
109
+ const spans = shots.map((shot, index) => dwellFor(shot) + (legs[index]?.seconds ?? 0));
110
+ const starts = spans.map((_, index) => spans.slice(0, index).reduce((sum, span) => sum + span, 0));
111
+ const total = spans.reduce((sum, span) => sum + span, 0);
112
+ const lastLeg = legs[legs.length - 1];
113
+ const last = lastLeg?.frames[lastLeg.frames.length - 1];
114
+ if (last === undefined)
115
+ throw new Error("a walkthrough has at least two steps, so it has a flight");
116
+ return { shots, legs, spans, starts, total, last, at: (seconds) => `${fixed((seconds / total) * 100, 3)}%` };
117
+ };
118
+ /** Every flight's frames in a row, each last frame held through the dwell. */
119
+ const track = (clock, paint) => clock.legs
120
+ .map((leg, index) => {
121
+ const start = clock.starts[index] ?? 0;
122
+ const hold = clock.starts[index + 1] ?? clock.total;
123
+ const steps = leg.frames.map((frame, sample) => `${clock.at(start + (leg.seconds * sample) / SAMPLES)}{${paint(frame)}}`);
124
+ const resting = leg.frames[leg.frames.length - 1];
125
+ return `${steps.join("")}${resting === undefined ? "" : `${clock.at(hold)}{${paint(resting)}}`}`;
126
+ })
127
+ .join("");
128
+ const cameraRule = ({ camera }) => `transform:translate(${fixed(camera.x, 2)}px,${fixed(camera.y, 2)}px) scale(${fixed(camera.scale, 4)})`;
129
+ const holeRule = ({ rect }) => `x:${fixed(rect.x, 1)}px;y:${fixed(rect.y, 1)}px;width:${fixed(rect.width, 1)}px;height:${fixed(rect.height, 1)}px`;
130
+ /** The static values are the resting state, so reduced motion shows the picture the tour ends on. */
131
+ const baseCss = (clock) => [
132
+ `.a{animation-duration:${fixed(clock.total, 2)}s;animation-iteration-count:${PASSES};animation-fill-mode:both;animation-timing-function:linear}`,
133
+ ".pip{transform-box:fill-box;transform-origin:left center}",
134
+ `@keyframes cam{${track(clock, cameraRule)}}`,
135
+ `@keyframes hole{${track(clock, holeRule)}}`,
136
+ `.cam{${cameraRule(clock.last)}}.moving{${holeRule(clock.last)}}`,
137
+ ];
138
+ /** In at 35% of the flight, out just before the step ends. The last caption stays up across the seam. */
139
+ const fadeCss = (clock, name, index, delay) => {
140
+ const start = clock.starts[index] ?? 0;
141
+ const flight = clock.legs[index]?.seconds ?? 0;
142
+ const on = start + flight * 0.35 + delay;
143
+ const seam = index === clock.shots.length - 1;
144
+ if (seam) {
145
+ const out = (clock.legs[0]?.seconds ?? 0) * 0.2;
146
+ return (`@keyframes ${name}{0%,${clock.at(out)}{opacity:1;transform:translateY(0)}` +
147
+ `${clock.at(out + 0.12)},${clock.at(on)}{opacity:0;transform:translateY(3px)}` +
148
+ `${clock.at(on + 0.22)},100%{opacity:1;transform:translateY(0)}}`);
149
+ }
150
+ const end = start + (clock.spans[index] ?? 0);
151
+ return (`@keyframes ${name}{0%,${clock.at(on)}{opacity:0;transform:translateY(3px)}` +
152
+ `${clock.at(on + 0.22)},${clock.at(end - 0.12)}{opacity:1;transform:translateY(0)}` +
153
+ `${clock.at(end)},100%{opacity:0;transform:translateY(0)}}`);
154
+ };
155
+ /** One bar per step, each filling across its step. */
156
+ const pips = (clock, tokens) => {
157
+ const count = clock.shots.length;
158
+ const left = PIP.right - (count * PIP.width + (count - 1) * PIP.gap);
159
+ const css = [];
160
+ let markup = "";
161
+ clock.shots.forEach((_, index) => {
162
+ const start = clock.starts[index] ?? 0;
163
+ const end = start + (clock.spans[index] ?? 0);
164
+ const x = left + index * (PIP.width + PIP.gap);
165
+ css.push(`@keyframes p${index}{0%,${clock.at(start)}{transform:scaleX(0)}${clock.at(end)},100%{transform:scaleX(1)}}`);
166
+ markup +=
167
+ `<rect x="${x}" y="${PIP.y}" width="${PIP.width}" height="${PIP.height}" rx="1.5" fill="${tokens.track}"/>` +
168
+ `<rect class="a pip" style="animation-name:p${index}" x="${x}" y="${PIP.y}" width="${PIP.width}" height="${PIP.height}" rx="1.5" fill="${tokens.accent}"/>`;
169
+ });
170
+ return { markup, css, left };
171
+ };
172
+ const captionHeight = (caption) => BODY_Y + (caption.lines.length - 1) * LINE_HEIGHT + CAPTION_FOOT;
173
+ const captionFor = (heading, body, room) => ({
174
+ heading: truncate(heading, "sans-bold", HEADING_SIZE, room),
175
+ lines: balancedLines(body, "sans", BODY_SIZE, CAPTION_WIDTH),
176
+ });
177
+ const headingMarkup = (caption, tokens) => `<text x="${HEADING_X}" y="${HEADING_Y}" font-size="${HEADING_SIZE}" font-weight="600" fill="${tokens.accent}">${escapeXml(caption.heading)}</text>`;
178
+ const bodyMarkup = (caption, tokens) => caption.lines
179
+ .map((line, index) => `<text x="${BODY_X}" y="${BODY_Y + index * LINE_HEIGHT}" font-size="${BODY_SIZE}" fill="${tokens.text}">${escapeXml(line)}</text>`)
180
+ .join("");
181
+ const captions = (clock, captionsByStep, tokens) => {
182
+ const css = [];
183
+ let markup = "";
184
+ captionsByStep.forEach((caption, index) => {
185
+ const hidden = index === captionsByStep.length - 1 ? "" : ' opacity="0"';
186
+ css.push(fadeCss(clock, `h${index}`, index, 0), fadeCss(clock, `b${index}`, index, 0.05));
187
+ markup +=
188
+ `<g class="a" style="animation-name:h${index}"${hidden}>${headingMarkup(caption, tokens)}</g>` +
189
+ `<g class="a" style="animation-name:b${index}"${hidden}>${bodyMarkup(caption, tokens)}</g>`;
190
+ });
191
+ return { markup, css, height: Math.max(...captionsByStep.map(captionHeight)) };
192
+ };
193
+ /** The alert's bar follows the caption's height between steps. */
194
+ const bar = (clock, captionsByStep, tokens) => {
195
+ const heights = captionsByStep.map(captionHeight);
196
+ const lastHeight = heights[heights.length - 1] ?? BODY_Y + CAPTION_FOOT;
197
+ const keyframes = heights
198
+ .map((height, index) => {
199
+ const start = clock.starts[index] ?? 0;
200
+ const previous = heights[(index + heights.length - 1) % heights.length] ?? height;
201
+ const settled = start + (clock.legs[index]?.seconds ?? 0) * 0.35 + 0.22;
202
+ return `${clock.at(start)}{height:${previous}px;animation-timing-function:${EASE_OUT}}${clock.at(settled)}{height:${height}px}`;
203
+ })
204
+ .join("");
205
+ return {
206
+ markup: `<rect class="bar" width="3" height="${lastHeight}" rx="1.5" fill="${tokens.accent}"/>`,
207
+ css: [
208
+ `@keyframes bar{${keyframes}100%{height:${lastHeight}px}}`,
209
+ `.bar{animation:bar ${fixed(clock.total, 2)}s linear ${PASSES} both}`,
210
+ ],
211
+ };
212
+ };
213
+ /** Stage edges fading into the page. */
214
+ const FEATHER_DEFS = `<linearGradient id="fx"><stop offset="0" stop-color="#000"/><stop offset="${fixed(FEATHER / EMBED_WIDTH, 4)}" stop-color="#fff"/><stop offset="${fixed(1 - FEATHER / EMBED_WIDTH, 4)}" stop-color="#fff"/><stop offset="1" stop-color="#000"/></linearGradient>` +
215
+ '<linearGradient id="ft" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#000"/><stop offset="1" stop-color="#000" stop-opacity="0"/></linearGradient>' +
216
+ '<linearGradient id="fb" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#000" stop-opacity="0"/><stop offset="1" stop-color="#000"/></linearGradient>' +
217
+ `<mask id="edge" maskUnits="userSpaceOnUse" x="0" y="0" width="${EMBED_WIDTH}" height="${STAGE_HEIGHT}">` +
218
+ `<rect width="${EMBED_WIDTH}" height="${STAGE_HEIGHT}" fill="url(#fx)"/>` +
219
+ `<rect width="${EMBED_WIDTH}" height="${FEATHER}" fill="url(#ft)"/>` +
220
+ `<rect y="${STAGE_HEIGHT - FEATHER}" width="${EMBED_WIDTH}" height="${FEATHER}" fill="url(#fb)"/></mask>` +
221
+ `<clipPath id="stage"><rect width="${EMBED_WIDTH}" height="${STAGE_HEIGHT}"/></clipPath>`;
222
+ /** The tiles under the camera, the mask that dims everything outside the focus, and the rim. */
223
+ const world = (tiles, strip, tokens) => {
224
+ const cover = `x="${-OVERSCAN}" y="${-OVERSCAN}" width="${strip.width + OVERSCAN * 2}" height="${strip.height + OVERSCAN * 2}"`;
225
+ const lift = tokens.card
226
+ ? '<filter id="lift" x="-30%" y="-30%" width="160%" height="160%"><feGaussianBlur stdDeviation="12"/></filter>'
227
+ : "";
228
+ const card = tokens.card
229
+ ? '<rect class="a moving" style="animation-name:hole" rx="16" fill="rgba(31,35,40,.18)" filter="url(#lift)" transform="translate(0,4)"/>' +
230
+ '<rect class="a moving" style="animation-name:hole" rx="16" fill="#fff"/>'
231
+ : "";
232
+ return {
233
+ defs: lift +
234
+ '<filter id="soft" x="-30%" y="-30%" width="160%" height="160%"><feGaussianBlur stdDeviation="8"/></filter>' +
235
+ `<mask id="focus" maskUnits="userSpaceOnUse" ${cover}><rect id="base" ${cover} fill="#fff" fill-opacity="${tokens.dim}"/>` +
236
+ '<rect class="a moving" style="animation-name:hole" rx="16" fill="#fff" filter="url(#soft)"/></mask>',
237
+ markup: `<g class="a cam" style="animation-name:cam">${card}<g mask="url(#focus)">${tiles}</g>` +
238
+ `<rect class="a moving" style="animation-name:hole;vector-effect:non-scaling-stroke" rx="16" fill="none" stroke="${tokens.rim}" stroke-width="1.25"/></g>`,
239
+ };
240
+ };
241
+ const REDUCED_MOTION = "@media (prefers-reduced-motion: reduce){.a,.bar{animation:none!important}}";
242
+ const STEP_WORDS = ["two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve"];
243
+ /** The embed's accessible name, and the alt text of any image showing it. */
244
+ export const walkthroughLabel = (title, steps) => `Walkthrough of ${title}, in ${STEP_WORDS[steps - 2] ?? String(steps)} steps`;
245
+ export const renderWalkthroughEmbed = (doc, options) => {
246
+ if (doc.walkthrough === undefined)
247
+ return { type: "absent" };
248
+ const tokens = tokensFor(options.theme);
249
+ const drawn = planTiles(doc).map((plan) => ({ plan, rendered: options.tiles?.get(plan.id) ?? plan.draw(options.theme) }));
250
+ const resolution = resolveWalkthrough(doc, drawn.map(({ plan, rendered }) => ({ id: plan.id, hero: plan.hero, atlas: rendered.atlas })));
251
+ switch (resolution.type) {
252
+ case "absent":
253
+ case "unresolvable":
254
+ return resolution;
255
+ case "resolved":
256
+ break;
257
+ default:
258
+ return assertNever(resolution, "Unhandled walkthrough resolution");
259
+ }
260
+ const strip = stripLayout(drawn.map(({ plan, rendered }) => ({ id: plan.id, width: rendered.width, height: rendered.height })));
261
+ const boxes = new Map(strip.boxes.map((box) => [box.id, box]));
262
+ const shots = resolution.steps.map((step) => {
263
+ const box = boxes.get(step.tileId);
264
+ if (box === undefined)
265
+ throw new Error(`a resolved step plays over a tile the strip lacks: ${step.tileId}`);
266
+ return shotFor(step, box);
267
+ });
268
+ const clock = clockFor(shots);
269
+ // Only the tiles the tour visits travel with the picture.
270
+ const visited = new Set(shots.map((shot) => shot.tileId));
271
+ const tiles = drawn
272
+ .map(({ plan, rendered }) => {
273
+ const box = boxes.get(plan.id);
274
+ return box === undefined || !visited.has(plan.id) ? "" : nestedRender(rendered, box.x, box.y);
275
+ })
276
+ .join("");
277
+ const progress = pips(clock, tokens);
278
+ const room = progress.left - HEADING_AIR - HEADING_X;
279
+ const captionsByStep = shots.map((shot) => captionFor(shot.heading, shot.body, room));
280
+ const caption = captions(clock, captionsByStep, tokens);
281
+ const alert = bar(clock, captionsByStep, tokens);
282
+ const scene = world(tiles, strip, tokens);
283
+ const css = [...baseCss(clock), ...progress.css, ...caption.css, ...alert.css, REDUCED_MOTION].join("");
284
+ const height = caption.height + GAP + STAGE_HEIGHT;
285
+ const label = walkthroughLabel(doc.title, shots.length);
286
+ const svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${EMBED_WIDTH} ${height}" width="${EMBED_WIDTH}" height="${height}" role="img" aria-label="${escapeXml(label)}" font-family="${escapeXml(SANS_STACK)}">` +
287
+ `<style>${css}</style>` +
288
+ `<defs>${markerDefs(paletteFor(options.theme))}${scene.defs}${FEATHER_DEFS}</defs>` +
289
+ alert.markup +
290
+ `<g transform="translate(16,12)"><path d="${PULL_REQUEST_ICON}" fill="${tokens.accent}"/></g>` +
291
+ progress.markup +
292
+ caption.markup +
293
+ `<g transform="translate(0,${caption.height + GAP})"><g mask="url(#edge)"><g clip-path="url(#stage)">${scene.markup}</g></g></g>` +
294
+ "</svg>";
295
+ return { type: "rendered", embed: { svg, width: EMBED_WIDTH, height, theme: options.theme, steps: shots.length } };
296
+ };
297
+ //# sourceMappingURL=embed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed.js","sourceRoot":"","sources":["../../src/walkthrough/embed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** The walkthrough's pure half. Nothing here draws or touches node, so a browser bundle can import it. */
2
+ export { easeInOut, flightFor, frame, interpolateFlight, lerpRect, type Flight, type FlightPath, type FramingPolicy, type Stage, type Viewport, } from "./camera.js";
3
+ export { CAPTION_ROOM, MAX_SCALE, MIN_SCALE, stripLayout, stripRect, TILE_GAP, tileRect, type Sized, type StripBox, type StripLayout, } from "./layout.js";
4
+ export { resolveWalkthrough, tileForStage, walkthroughRefusal, type ResolvedFocus, type ResolvedStep, type WalkthroughIssue, type WalkthroughResolution, type WalkthroughTile, } from "./resolve.js";
5
+ export { stageOfTile, tileIdForFlow, tileIdForView, WHOLE_MAP_TILE_ID, WHOLE_MODEL_TILE_ID } from "./tile-ids.js";
6
+ export type { Box } from "../geometry.js";
7
+ export type { RenderAtlas } from "../atlas.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/walkthrough/index.ts"],"names":[],"mappings":"AAAA,0GAA0G;AAC1G,OAAO,EACL,SAAS,EACT,SAAS,EACT,KAAK,EACL,iBAAiB,EACjB,QAAQ,EACR,KAAK,MAAM,EACX,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,KAAK,EACV,KAAK,QAAQ,GACd,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,YAAY,EACZ,SAAS,EACT,SAAS,EACT,WAAW,EACX,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,KAAK,KAAK,EACV,KAAK,QAAQ,EACb,KAAK,WAAW,GACjB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAElH,YAAY,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,6 @@
1
+ /** The walkthrough's pure half. Nothing here draws or touches node, so a browser bundle can import it. */
2
+ export { easeInOut, flightFor, frame, interpolateFlight, lerpRect, } from "./camera.js";
3
+ export { CAPTION_ROOM, MAX_SCALE, MIN_SCALE, stripLayout, stripRect, TILE_GAP, tileRect, } from "./layout.js";
4
+ export { resolveWalkthrough, tileForStage, walkthroughRefusal, } from "./resolve.js";
5
+ export { stageOfTile, tileIdForFlow, tileIdForView, WHOLE_MAP_TILE_ID, WHOLE_MODEL_TILE_ID } from "./tile-ids.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/walkthrough/index.ts"],"names":[],"mappings":"AAAA,0GAA0G;AAC1G,OAAO,EACL,SAAS,EACT,SAAS,EACT,KAAK,EACL,iBAAiB,EACjB,QAAQ,GAMT,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,YAAY,EACZ,SAAS,EACT,SAAS,EACT,WAAW,EACX,SAAS,EACT,QAAQ,EACR,QAAQ,GAIT,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,GAMnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { Box } from "../geometry.js";
2
+ /** One row, left to right, never stored. The canvas and the embed share it, so their cameras agree. */
3
+ /** Wide enough that two tiles never read as one picture. */
4
+ export declare const TILE_GAP = 162;
5
+ /** Room above each tile for its caption. */
6
+ export declare const CAPTION_ROOM = 40;
7
+ export type Sized = {
8
+ id: string;
9
+ width: number;
10
+ height: number;
11
+ };
12
+ export type StripBox = Box & {
13
+ id: string;
14
+ };
15
+ export type StripLayout = {
16
+ boxes: StripBox[];
17
+ width: number;
18
+ height: number;
19
+ };
20
+ export declare function stripLayout(tiles: readonly Sized[]): StripLayout;
21
+ /** A tile with the caption above it. */
22
+ export declare const tileRect: (box: StripBox) => Box;
23
+ export declare const stripRect: (layout: StripLayout) => Box;
24
+ /** Enough to read a label on the widest render at a laptop's width. */
25
+ export declare const MAX_SCALE = 6;
26
+ /** Far enough out that thirty renders fit in a window. */
27
+ export declare const MIN_SCALE = 0.02;
28
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/walkthrough/layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAE1C,uGAAuG;AAEvG,4DAA4D;AAC5D,eAAO,MAAM,QAAQ,MAAM,CAAC;AAE5B,4CAA4C;AAC5C,eAAO,MAAM,YAAY,KAAK,CAAC;AAE/B,MAAM,MAAM,KAAK,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElE,MAAM,MAAM,QAAQ,GAAG,GAAG,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5C,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/E,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,GAAG,WAAW,CAahE;AAED,wCAAwC;AACxC,eAAO,MAAM,QAAQ,QAAS,QAAQ,KAAG,GAKvC,CAAC;AAEH,eAAO,MAAM,SAAS,WAAY,WAAW,KAAG,GAAmE,CAAC;AAEpH,uEAAuE;AACvE,eAAO,MAAM,SAAS,IAAI,CAAC;AAE3B,0DAA0D;AAC1D,eAAO,MAAM,SAAS,OAAO,CAAC"}
@@ -0,0 +1,31 @@
1
+ /** One row, left to right, never stored. The canvas and the embed share it, so their cameras agree. */
2
+ /** Wide enough that two tiles never read as one picture. */
3
+ export const TILE_GAP = 162;
4
+ /** Room above each tile for its caption. */
5
+ export const CAPTION_ROOM = 40;
6
+ export function stripLayout(tiles) {
7
+ let cursor = 0;
8
+ const boxes = tiles.map((tile) => {
9
+ const box = { id: tile.id, x: cursor, y: CAPTION_ROOM, width: tile.width, height: tile.height };
10
+ cursor += tile.width + TILE_GAP;
11
+ return box;
12
+ });
13
+ return {
14
+ boxes,
15
+ width: Math.max(cursor - TILE_GAP, 0),
16
+ height: CAPTION_ROOM + Math.max(0, ...tiles.map((tile) => tile.height)),
17
+ };
18
+ }
19
+ /** A tile with the caption above it. */
20
+ export const tileRect = (box) => ({
21
+ x: box.x,
22
+ y: box.y - CAPTION_ROOM,
23
+ width: box.width,
24
+ height: box.height + CAPTION_ROOM,
25
+ });
26
+ export const stripRect = (layout) => ({ x: 0, y: 0, width: layout.width, height: layout.height });
27
+ /** Enough to read a label on the widest render at a laptop's width. */
28
+ export const MAX_SCALE = 6;
29
+ /** Far enough out that thirty renders fit in a window. */
30
+ export const MIN_SCALE = 0.02;
31
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/walkthrough/layout.ts"],"names":[],"mappings":"AAEA,uGAAuG;AAEvG,4DAA4D;AAC5D,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,CAAC;AAE5B,4CAA4C;AAC5C,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC;AAQ/B,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC/B,MAAM,GAAG,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QAChG,MAAM,IAAI,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QAChC,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,KAAK;QACL,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC,CAAC;QACrC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KACxE,CAAC;AACJ,CAAC;AAED,wCAAwC;AACxC,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAa,EAAO,EAAE,CAAC,CAAC;IAC/C,CAAC,EAAE,GAAG,CAAC,CAAC;IACR,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,YAAY;IACvB,KAAK,EAAE,GAAG,CAAC,KAAK;IAChB,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,YAAY;CAClC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAmB,EAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAEpH,uEAAuE;AACvE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAE3B,0DAA0D;AAC1D,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { RenderedSvg } from "../render.js";
2
+ /** A render's painting placed inside another SVG. The outer document defines the markers it uses. */
3
+ export declare const nestedRender: (rendered: RenderedSvg, x: number, y: number) => string;
4
+ //# sourceMappingURL=nest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nest.d.ts","sourceRoot":"","sources":["../../src/walkthrough/nest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,qGAAqG;AACrG,eAAO,MAAM,YAAY,aAAc,WAAW,KAAK,MAAM,KAAK,MAAM,KAAG,MACyH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { coord } from "../geometry.js";
2
+ /** A render's painting placed inside another SVG. The outer document defines the markers it uses. */
3
+ export const nestedRender = (rendered, x, y) => `<svg x="${coord(x)}" y="${coord(y)}" width="${coord(rendered.width)}" height="${coord(rendered.height)}" viewBox="0 0 ${coord(rendered.width)} ${coord(rendered.height)}">${rendered.body}</svg>`;
4
+ //# sourceMappingURL=nest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nest.js","sourceRoot":"","sources":["../../src/walkthrough/nest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAGvC,qGAAqG;AACrG,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAqB,EAAE,CAAS,EAAE,CAAS,EAAU,EAAE,CAClF,WAAW,KAAK,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,kBAAkB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,IAAI,QAAQ,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { GraphDoc, StepStage } from "@coldtea/pr-lens-schema";
2
+ import type { RenderAtlas } from "../atlas.js";
3
+ import type { Box } from "../geometry.js";
4
+ /** Which tile each step plays over and which rectangle it points at. Pure, so the canvas and the embed agree. */
5
+ /** The atlas is absent on a revision stored before one was kept. */
6
+ export type WalkthroughTile = {
7
+ id: string;
8
+ hero: boolean;
9
+ atlas?: RenderAtlas;
10
+ };
11
+ /** Rects are in the tile's own viewBox units. The surface adds the tile's place on the strip. */
12
+ export type ResolvedFocus = {
13
+ kind: "whole";
14
+ } | {
15
+ kind: "region";
16
+ rect: Box;
17
+ };
18
+ export type ResolvedStep = {
19
+ id: string;
20
+ heading: string;
21
+ body: string;
22
+ tileId: string;
23
+ focus: ResolvedFocus;
24
+ };
25
+ /** Why a step could not be matched. */
26
+ export type WalkthroughIssue = {
27
+ code: "STAGE_NOT_ON_CANVAS" | "FOCUS_NOT_DRAWN" | "ATLAS_MISSING";
28
+ stepId: string;
29
+ detail: string;
30
+ };
31
+ export type WalkthroughResolution = {
32
+ type: "absent";
33
+ } | {
34
+ type: "resolved";
35
+ steps: ResolvedStep[];
36
+ } | {
37
+ type: "unresolvable";
38
+ issues: WalkthroughIssue[];
39
+ };
40
+ /** Resolves all of the walkthrough or none of it, collecting every issue in step order. */
41
+ export declare function resolveWalkthrough(doc: GraphDoc, tiles: readonly WalkthroughTile[]): WalkthroughResolution;
42
+ /** Copy for a refused push: the first wrong step by name, and a count of the rest. */
43
+ export declare function walkthroughRefusal(issues: readonly WalkthroughIssue[]): string;
44
+ export declare function tileForStage<Tile extends WalkthroughTile>(doc: GraphDoc, stage: StepStage | undefined, tiles: readonly Tile[]): Tile | undefined;
45
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/walkthrough/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAa,SAAS,EAA8B,MAAM,yBAAyB,CAAC;AAE1G,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAI1C,iHAAiH;AAEjH,oEAAoE;AACpE,MAAM,MAAM,eAAe,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,WAAW,CAAA;CAAE,CAAC;AAEjF,iGAAiG;AACjG,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,GAAG,CAAA;CAAE,CAAC;AAE9E,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;CACtB,CAAC;AAEF,uCAAuC;AACvC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,qBAAqB,GAAG,iBAAiB,GAAG,eAAe,CAAC;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,YAAY,EAAE,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAAC;AAQzD,2FAA2F;AAC3F,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,eAAe,EAAE,GAAG,qBAAqB,CAqB1G;AAKD,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,GAAG,MAAM,CAe9E;AAkCD,wBAAgB,YAAY,CAAC,IAAI,SAAS,eAAe,EACvD,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,SAAS,GAAG,SAAS,EAC5B,KAAK,EAAE,SAAS,IAAI,EAAE,GACrB,IAAI,GAAG,SAAS,CAUlB"}