@velumo/renderer-dom 0.1.0-beta.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 (58) hide show
  1. package/dist/background-renderer.d.ts +16 -0
  2. package/dist/background-renderer.d.ts.map +1 -0
  3. package/dist/background-renderer.js +41 -0
  4. package/dist/background-renderer.js.map +1 -0
  5. package/dist/camera-adapter.d.ts +16 -0
  6. package/dist/camera-adapter.d.ts.map +1 -0
  7. package/dist/camera-adapter.js +13 -0
  8. package/dist/camera-adapter.js.map +1 -0
  9. package/dist/default-theme.d.ts +5 -0
  10. package/dist/default-theme.d.ts.map +1 -0
  11. package/dist/default-theme.js +579 -0
  12. package/dist/default-theme.js.map +1 -0
  13. package/dist/dom-renderer.d.ts +62 -0
  14. package/dist/dom-renderer.d.ts.map +1 -0
  15. package/dist/dom-renderer.js +306 -0
  16. package/dist/dom-renderer.js.map +1 -0
  17. package/dist/html-sanitize.d.ts +18 -0
  18. package/dist/html-sanitize.d.ts.map +1 -0
  19. package/dist/html-sanitize.js +379 -0
  20. package/dist/html-sanitize.js.map +1 -0
  21. package/dist/index.d.ts +12 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +10 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/layout-renderer.d.ts +16 -0
  26. package/dist/layout-renderer.d.ts.map +1 -0
  27. package/dist/layout-renderer.js +450 -0
  28. package/dist/layout-renderer.js.map +1 -0
  29. package/dist/slide-thumbnail.d.ts +63 -0
  30. package/dist/slide-thumbnail.d.ts.map +1 -0
  31. package/dist/slide-thumbnail.js +93 -0
  32. package/dist/slide-thumbnail.js.map +1 -0
  33. package/dist/spatial-renderer.d.ts +18 -0
  34. package/dist/spatial-renderer.d.ts.map +1 -0
  35. package/dist/spatial-renderer.js +36 -0
  36. package/dist/spatial-renderer.js.map +1 -0
  37. package/dist/theme-fonts.d.ts +8 -0
  38. package/dist/theme-fonts.d.ts.map +1 -0
  39. package/dist/theme-fonts.js +68 -0
  40. package/dist/theme-fonts.js.map +1 -0
  41. package/dist/theme-tokens.d.ts +3 -0
  42. package/dist/theme-tokens.d.ts.map +1 -0
  43. package/dist/theme-tokens.js +43 -0
  44. package/dist/theme-tokens.js.map +1 -0
  45. package/dist/tsconfig.tsbuildinfo +1 -0
  46. package/package.json +20 -0
  47. package/src/background-renderer.ts +77 -0
  48. package/src/camera-adapter.ts +21 -0
  49. package/src/default-theme.ts +582 -0
  50. package/src/dom-renderer.ts +486 -0
  51. package/src/html-sanitize.ts +446 -0
  52. package/src/index.ts +25 -0
  53. package/src/layout-renderer.ts +721 -0
  54. package/src/slide-thumbnail.ts +146 -0
  55. package/src/spatial-renderer.ts +62 -0
  56. package/src/theme-fonts.ts +75 -0
  57. package/src/theme-tokens.ts +66 -0
  58. package/tsconfig.json +10 -0
@@ -0,0 +1,450 @@
1
+ export function renderLayoutNode(node, factories) {
2
+ if (!isRecord(node) || typeof node.kind !== "string") {
3
+ return unknownLayoutElement(factories);
4
+ }
5
+ switch (node.kind) {
6
+ case "stack":
7
+ return renderLayoutContainer(node, "stack", factories);
8
+ case "grid":
9
+ return renderGridLayout(node, factories);
10
+ case "split":
11
+ return renderSplitLayout(node, factories);
12
+ case "hero":
13
+ return renderLayoutContainer(node, "hero", factories);
14
+ case "frame":
15
+ return renderFrameLayout(node, factories);
16
+ case "heading":
17
+ return renderHeadingElement(node, factories);
18
+ case "text":
19
+ return renderTextElement(node, factories);
20
+ case "media":
21
+ return renderMediaElement(node, factories);
22
+ case "callout":
23
+ return renderCalloutElement(node, factories);
24
+ case "canvas":
25
+ return renderCanvasLayout(node, factories);
26
+ case "animate":
27
+ return renderAnimateLayout(node, factories);
28
+ case "code":
29
+ return renderCodeElement(node, factories);
30
+ case "icon":
31
+ return renderIconElement(node, factories);
32
+ case "badge":
33
+ return renderBadgeElement(node, factories);
34
+ case "rule":
35
+ return renderRuleElement(node, factories);
36
+ case "table":
37
+ return renderTableLayout(node, factories);
38
+ case "connector":
39
+ return renderConnectorElement(node, factories);
40
+ default:
41
+ return unknownLayoutElement(factories);
42
+ }
43
+ }
44
+ function renderLayoutContainer(node, kind, factories) {
45
+ const element = factories.createElement("div");
46
+ element.setAttribute("data-velumo-layout", kind);
47
+ if (typeof node.direction === "string") {
48
+ element.setAttribute("data-velumo-stack-direction", node.direction);
49
+ }
50
+ if (typeof node.justify === "string") {
51
+ element.setAttribute("data-velumo-stack-justify", node.justify);
52
+ }
53
+ if (typeof node.align === "string") {
54
+ element.setAttribute("data-velumo-stack-align", node.align);
55
+ }
56
+ appendLayoutChildren(element, node.children, factories);
57
+ return element;
58
+ }
59
+ function renderGridLayout(node, factories) {
60
+ const element = renderLayoutContainer(node, "grid", factories);
61
+ if (typeof node.columns === "number") {
62
+ factories.setStyleProperty(element, "--velumo-layout-columns", String(node.columns));
63
+ }
64
+ if (typeof node.rows === "number") {
65
+ factories.setStyleProperty(element, "--velumo-layout-rows", String(node.rows));
66
+ }
67
+ return element;
68
+ }
69
+ function renderSplitLayout(node, factories) {
70
+ const element = renderLayoutContainer(node, "split", factories);
71
+ if (Array.isArray(node.weights)) {
72
+ factories.setStyleProperty(element, "--velumo-layout-weights", node.weights.join(" "));
73
+ }
74
+ return element;
75
+ }
76
+ function renderFrameLayout(node, factories) {
77
+ const element = renderLayoutContainer(node, "frame", factories);
78
+ if (typeof node.tone === "string") {
79
+ element.setAttribute("data-velumo-frame-tone", node.tone);
80
+ }
81
+ if (isRecord(node.meta)) {
82
+ if (typeof node.meta.safeArea === "string") {
83
+ element.setAttribute("data-velumo-safe-area", node.meta.safeArea);
84
+ }
85
+ if (typeof node.meta.cameraHint === "string") {
86
+ element.setAttribute("data-velumo-camera-hint", node.meta.cameraHint);
87
+ }
88
+ if (typeof node.meta.depth === "number") {
89
+ factories.setStyleProperty(element, "--velumo-layout-depth", String(node.meta.depth));
90
+ }
91
+ }
92
+ return element;
93
+ }
94
+ function applyTextStyleAttributes(element, node) {
95
+ if (typeof node.transform === "string") {
96
+ element.setAttribute("data-velumo-text-transform", node.transform);
97
+ }
98
+ if (typeof node.decoration === "string") {
99
+ element.setAttribute("data-velumo-text-decoration", node.decoration);
100
+ }
101
+ if (node.glow === true) {
102
+ element.setAttribute("data-velumo-text-glow", "");
103
+ }
104
+ if (typeof node.tone === "string") {
105
+ element.setAttribute("data-velumo-text-tone", node.tone);
106
+ }
107
+ }
108
+ function renderHeadingElement(node, factories) {
109
+ const level = typeof node.level === "number" &&
110
+ Number.isInteger(node.level) &&
111
+ node.level >= 1 &&
112
+ node.level <= 6
113
+ ? node.level
114
+ : 1;
115
+ const element = factories.createElement(`h${level}`);
116
+ element.textContent = String(node.text ?? "");
117
+ element.setAttribute("data-velumo-element", "heading");
118
+ if (typeof node.size === "string") {
119
+ element.setAttribute("data-velumo-heading-size", node.size);
120
+ }
121
+ applyTextStyleAttributes(element, node);
122
+ return element;
123
+ }
124
+ function renderTextElement(node, factories) {
125
+ const element = factories.createElement("p");
126
+ element.textContent = String(node.text ?? "");
127
+ element.setAttribute("data-velumo-element", "text");
128
+ if (typeof node.variant === "string") {
129
+ element.setAttribute("data-velumo-text-variant", node.variant);
130
+ }
131
+ applyTextStyleAttributes(element, node);
132
+ return element;
133
+ }
134
+ function renderMediaElement(node, factories) {
135
+ const element = factories.createElement("img");
136
+ element.setAttribute("data-velumo-element", "media");
137
+ element.setAttribute("src", String(node.src ?? ""));
138
+ element.setAttribute("alt", String(node.alt ?? ""));
139
+ if (typeof node.fit === "string") {
140
+ element.setAttribute("data-velumo-media-fit", node.fit);
141
+ }
142
+ return element;
143
+ }
144
+ function renderCalloutElement(node, factories) {
145
+ const element = factories.createElement("aside");
146
+ element.setAttribute("data-velumo-element", "callout");
147
+ if (typeof node.tone === "string") {
148
+ element.setAttribute("data-velumo-callout-tone", node.tone);
149
+ }
150
+ appendLayoutChildren(element, node.children, factories);
151
+ return element;
152
+ }
153
+ function appendLayoutChildren(parent, children, factories) {
154
+ if (!Array.isArray(children)) {
155
+ return;
156
+ }
157
+ for (const child of children) {
158
+ parent.appendChild(renderLayoutNode(child, factories));
159
+ }
160
+ }
161
+ function renderCanvasLayout(node, factories) {
162
+ const element = factories.createElement("div");
163
+ element.setAttribute("data-velumo-layout", "canvas");
164
+ factories.setStyleProperty(element, "position", "relative");
165
+ factories.setStyleProperty(element, "flex", "1");
166
+ factories.setStyleProperty(element, "min-height", "0");
167
+ factories.setStyleProperty(element, "width", "100%");
168
+ // height:100% fills any definite-height parent (grid item, spatial world);
169
+ // in a flex column flex-basis:0% from flex:1 overrides height so the canvas
170
+ // still fills remaining space — no overlap regression since it is in-flow.
171
+ factories.setStyleProperty(element, "height", "100%");
172
+ if (Array.isArray(node.items)) {
173
+ for (const item of node.items) {
174
+ if (!isRecord(item)) {
175
+ continue;
176
+ }
177
+ const slot = factories.createElement("div");
178
+ slot.setAttribute("data-velumo-canvas-item", "");
179
+ factories.setStyleProperty(slot, "position", "absolute");
180
+ if (typeof item.x === "number") {
181
+ factories.setStyleProperty(slot, "left", `${item.x}%`);
182
+ }
183
+ if (typeof item.y === "number") {
184
+ factories.setStyleProperty(slot, "top", `${item.y}%`);
185
+ }
186
+ if (typeof item.width === "number") {
187
+ factories.setStyleProperty(slot, "width", `${item.width}%`);
188
+ }
189
+ if (typeof item.height === "number") {
190
+ factories.setStyleProperty(slot, "height", `${item.height}%`);
191
+ }
192
+ slot.appendChild(renderLayoutNode(item.child, factories));
193
+ element.appendChild(slot);
194
+ }
195
+ }
196
+ return element;
197
+ }
198
+ function renderAnimateLayout(node, factories) {
199
+ const element = factories.createElement("div");
200
+ element.setAttribute("data-velumo-layout", "animate");
201
+ if (typeof node.name === "string") {
202
+ element.setAttribute("data-velumo-animation", node.name);
203
+ }
204
+ if (typeof node.delay === "number") {
205
+ factories.setStyleProperty(element, "--velumo-animation-delay", `${node.delay}s`);
206
+ }
207
+ if (typeof node.duration === "number") {
208
+ factories.setStyleProperty(element, "--velumo-animation-duration", `${node.duration}s`);
209
+ }
210
+ if (typeof node.easing === "string") {
211
+ factories.setStyleProperty(element, "--velumo-animation-easing", node.easing);
212
+ }
213
+ element.appendChild(renderLayoutNode(node.child, factories));
214
+ return element;
215
+ }
216
+ function renderCodeElement(node, factories) {
217
+ const element = factories.createElement("pre");
218
+ element.setAttribute("data-velumo-element", "code");
219
+ const lines = Array.isArray(node.lines) ? node.lines : [];
220
+ lines.forEach((line, lineIndex) => {
221
+ if (Array.isArray(line)) {
222
+ for (const tok of line) {
223
+ if (!isRecord(tok)) {
224
+ continue;
225
+ }
226
+ const span = factories.createElement("span");
227
+ span.setAttribute("data-velumo-token", typeof tok.kind === "string" ? tok.kind : "plain");
228
+ span.textContent = String(tok.text ?? "");
229
+ element.appendChild(span);
230
+ }
231
+ }
232
+ if (lineIndex < lines.length - 1) {
233
+ const newline = factories.createElement("span");
234
+ newline.textContent = "\n";
235
+ element.appendChild(newline);
236
+ }
237
+ });
238
+ return element;
239
+ }
240
+ function renderIconElement(node, factories) {
241
+ const element = factories.createElement("span");
242
+ element.setAttribute("data-velumo-element", "icon");
243
+ element.setAttribute("data-velumo-icon", typeof node.name === "string" ? node.name : "dot");
244
+ if (typeof node.tone === "string") {
245
+ element.setAttribute("data-velumo-text-tone", node.tone);
246
+ }
247
+ if (typeof node.label === "string" && node.label.length > 0) {
248
+ element.setAttribute("role", "img");
249
+ element.setAttribute("aria-label", node.label);
250
+ }
251
+ else {
252
+ element.setAttribute("aria-hidden", "true");
253
+ }
254
+ return element;
255
+ }
256
+ function renderBadgeElement(node, factories) {
257
+ const element = factories.createElement("span");
258
+ element.setAttribute("data-velumo-element", "badge");
259
+ if (typeof node.tone === "string") {
260
+ element.setAttribute("data-velumo-badge-tone", node.tone);
261
+ }
262
+ if (typeof node.variant === "string") {
263
+ element.setAttribute("data-velumo-badge-variant", node.variant);
264
+ }
265
+ if (node.mono === true) {
266
+ element.setAttribute("data-velumo-badge-mono", "");
267
+ }
268
+ if (typeof node.dot === "string") {
269
+ const dot = factories.createElement("span");
270
+ dot.setAttribute("data-velumo-badge-dot", node.dot);
271
+ element.appendChild(dot);
272
+ }
273
+ const label = factories.createElement("span");
274
+ label.textContent = String(node.text ?? "");
275
+ element.appendChild(label);
276
+ return element;
277
+ }
278
+ function renderRuleElement(node, factories) {
279
+ const element = factories.createElement("span");
280
+ element.setAttribute("data-velumo-element", "rule");
281
+ const width = typeof node.length === "number"
282
+ ? `${node.length}px`
283
+ : typeof node.length === "string"
284
+ ? node.length
285
+ : "100%";
286
+ const height = typeof node.thickness === "number" ? `${node.thickness}px` : "2px";
287
+ const radius = typeof node.radius === "number" ? `${node.radius}px` : "999px";
288
+ factories.setStyleProperty(element, "width", width);
289
+ factories.setStyleProperty(element, "height", height);
290
+ factories.setStyleProperty(element, "border-radius", radius);
291
+ if (Array.isArray(node.gradient) && node.gradient.length === 2) {
292
+ const [from, to] = node.gradient;
293
+ element.setAttribute("data-velumo-rule-gradient", `${String(from)} ${String(to)}`);
294
+ factories.setStyleProperty(element, "--velumo-rule-from", `var(--velumo-tone-${String(from)})`);
295
+ factories.setStyleProperty(element, "--velumo-rule-to", `var(--velumo-tone-${String(to)})`);
296
+ }
297
+ else if (typeof node.tone === "string") {
298
+ element.setAttribute("data-velumo-rule-tone", node.tone);
299
+ }
300
+ return element;
301
+ }
302
+ function renderTableLayout(node, factories) {
303
+ const columns = Array.isArray(node.columns) ? node.columns : [];
304
+ const element = factories.createElement("div");
305
+ element.setAttribute("data-velumo-layout", "table");
306
+ element.setAttribute("role", "table");
307
+ const weights = columns
308
+ .map((c) => (isRecord(c) && typeof c.weight === "number" ? c.weight : 1))
309
+ .join("fr ");
310
+ factories.setStyleProperty(element, "--velumo-table-columns", columns.length > 0 ? `${weights}fr` : "1fr");
311
+ const applyColAttrs = (cell, column) => {
312
+ if (!isRecord(column)) {
313
+ return;
314
+ }
315
+ if (column.emphasis === true) {
316
+ cell.setAttribute("data-velumo-col-emphasis", "");
317
+ }
318
+ if (typeof column.align === "string") {
319
+ cell.setAttribute("data-velumo-col-align", column.align);
320
+ }
321
+ };
322
+ const hasHeader = columns.some((c) => isRecord(c) && c.header !== undefined);
323
+ if (hasHeader) {
324
+ const headRow = factories.createElement("div");
325
+ headRow.setAttribute("role", "row");
326
+ headRow.setAttribute("data-velumo-table-head", "");
327
+ columns.forEach((column) => {
328
+ const cell = factories.createElement("div");
329
+ cell.setAttribute("role", "columnheader");
330
+ applyColAttrs(cell, column);
331
+ if (isRecord(column) && column.header !== undefined) {
332
+ cell.appendChild(renderLayoutNode(column.header, factories));
333
+ }
334
+ headRow.appendChild(cell);
335
+ });
336
+ element.appendChild(headRow);
337
+ }
338
+ const body = factories.createElement("div");
339
+ body.setAttribute("role", "rowgroup");
340
+ const rows = Array.isArray(node.rows) ? node.rows : [];
341
+ for (const row of rows) {
342
+ const rowEl = factories.createElement("div");
343
+ rowEl.setAttribute("role", "row");
344
+ const cells = Array.isArray(row) ? row.slice(0, columns.length) : [];
345
+ cells.forEach((cellNode, cellIndex) => {
346
+ const cell = factories.createElement("div");
347
+ cell.setAttribute("role", "cell");
348
+ applyColAttrs(cell, columns[cellIndex]);
349
+ cell.appendChild(renderLayoutNode(cellNode, factories));
350
+ rowEl.appendChild(cell);
351
+ });
352
+ body.appendChild(rowEl);
353
+ }
354
+ element.appendChild(body);
355
+ return element;
356
+ }
357
+ const SVG_NAMESPACE = "http://www.w3.org/2000/svg";
358
+ function connectorMarkerId(node) {
359
+ // Deterministic, collision-resistant id from all style-bearing fields so that
360
+ // two connectors sharing endpoints but differing in tone/arrow/dashed/control
361
+ // receive distinct marker ids (inline-SVG ids are document-global).
362
+ const pt = (p) => isRecord(p) ? `${String(p.x)}_${String(p.y)}` : "x";
363
+ const parts = [
364
+ pt(node.from),
365
+ pt(node.to),
366
+ isRecord(node.control) ? pt(node.control) : "noctl",
367
+ typeof node.arrow === "string" ? node.arrow : "none",
368
+ node.dashed === true ? "d" : "s",
369
+ typeof node.tone === "string" ? node.tone : "default",
370
+ ].join("-");
371
+ return `velumo-arrow-${parts}`.replace(/[^a-zA-Z0-9_-]/g, "");
372
+ }
373
+ function renderConnectorElement(node, factories) {
374
+ const create = (tag) => factories.createElementNS
375
+ ? factories.createElementNS(SVG_NAMESPACE, tag)
376
+ : factories.createElement(tag);
377
+ const svg = create("svg");
378
+ svg.setAttribute("data-velumo-element", "connector");
379
+ svg.setAttribute("viewBox", "0 0 100 100");
380
+ svg.setAttribute("preserveAspectRatio", "none");
381
+ svg.setAttribute("width", "100%");
382
+ svg.setAttribute("height", "100%");
383
+ svg.setAttribute("aria-hidden", "true");
384
+ if (typeof node.tone === "string") {
385
+ svg.setAttribute("data-velumo-text-tone", node.tone);
386
+ }
387
+ // Guard against non-finite coordinates (e.g. NaN from non-numeric input) so
388
+ // the path data attribute is always well-formed.
389
+ const num = (v) => {
390
+ const n = Number(v);
391
+ return Number.isFinite(n) ? n : 0;
392
+ };
393
+ const from = isRecord(node.from) ? node.from : { x: 0, y: 0 };
394
+ const to = isRecord(node.to) ? node.to : { x: 0, y: 0 };
395
+ const fx = num(from.x ?? 0);
396
+ const fy = num(from.y ?? 0);
397
+ const tx = num(to.x ?? 0);
398
+ const ty = num(to.y ?? 0);
399
+ const d = isRecord(node.control)
400
+ ? `M ${fx} ${fy} Q ${num(node.control.x ?? 0)} ${num(node.control.y ?? 0)} ${tx} ${ty}`
401
+ : `M ${fx} ${fy} L ${tx} ${ty}`;
402
+ const arrow = typeof node.arrow === "string" ? node.arrow : "none";
403
+ const markerId = connectorMarkerId(node);
404
+ // Append the connection path first so depth-first tree walkers encounter it
405
+ // before the arrowhead path nested inside <defs>/<marker>.
406
+ const path = create("path");
407
+ path.setAttribute("d", d);
408
+ path.setAttribute("fill", "none");
409
+ path.setAttribute("stroke", "currentColor");
410
+ path.setAttribute("stroke-width", "2.5");
411
+ path.setAttribute("vector-effect", "non-scaling-stroke");
412
+ path.setAttribute("stroke-linecap", "round");
413
+ if (node.dashed === true) {
414
+ path.setAttribute("stroke-dasharray", "4 4");
415
+ }
416
+ if (arrow === "end" || arrow === "both") {
417
+ path.setAttribute("marker-end", `url(#${markerId})`);
418
+ }
419
+ if (arrow === "start" || arrow === "both") {
420
+ path.setAttribute("marker-start", `url(#${markerId})`);
421
+ }
422
+ svg.appendChild(path);
423
+ if (arrow === "end" || arrow === "start" || arrow === "both") {
424
+ const defs = create("defs");
425
+ const marker = create("marker");
426
+ marker.setAttribute("id", markerId);
427
+ marker.setAttribute("markerWidth", "2.6");
428
+ marker.setAttribute("markerHeight", "2.6");
429
+ marker.setAttribute("refX", "2.2");
430
+ marker.setAttribute("refY", "1.3");
431
+ marker.setAttribute("orient", "auto");
432
+ marker.setAttribute("markerUnits", "userSpaceOnUse");
433
+ const head = create("path");
434
+ head.setAttribute("d", "M 0 0 L 2.6 1.3 L 0 2.6 z");
435
+ head.setAttribute("fill", "currentColor");
436
+ marker.appendChild(head);
437
+ defs.appendChild(marker);
438
+ svg.appendChild(defs);
439
+ }
440
+ return svg;
441
+ }
442
+ function unknownLayoutElement(factories) {
443
+ const element = factories.createElement("div");
444
+ element.setAttribute("data-velumo-layout", "unknown");
445
+ return element;
446
+ }
447
+ function isRecord(value) {
448
+ return typeof value === "object" && value !== null && !Array.isArray(value);
449
+ }
450
+ //# sourceMappingURL=layout-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-renderer.js","sourceRoot":"","sources":["../src/layout-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { Manifest } from "@velumo/core";
2
+ import { type DomRendererOptions } from "./dom-renderer.js";
3
+ export interface SlideThumbnailOptions {
4
+ /** The host element that will contain the thumbnail. The HOST is responsible
5
+ * for sizing this element's width; the thumbnail fills it via aspect-ratio. */
6
+ readonly root: {
7
+ readonly ownerDocument: {
8
+ createElement(tagName: string): any;
9
+ createElementNS?(ns: string, tagName: string): any;
10
+ createTextNode(text: string): any;
11
+ readonly head?: any;
12
+ querySelector?(selectors: string): any;
13
+ readonly defaultView?: {
14
+ ResizeObserver?: new (cb: ResizeObserverCallback) => ResizeObserver;
15
+ } | null;
16
+ };
17
+ replaceChildren(...children: any[]): void;
18
+ querySelector(selector: string): any;
19
+ getBoundingClientRect?(): {
20
+ width: number;
21
+ height: number;
22
+ top: number;
23
+ left: number;
24
+ right: number;
25
+ bottom: number;
26
+ };
27
+ };
28
+ readonly manifest: Manifest;
29
+ readonly slideId: string;
30
+ /** Override the canonical reference dimensions (default: 1280x720). */
31
+ readonly reference?: {
32
+ width: number;
33
+ height: number;
34
+ };
35
+ /** The runtime registry, so plugin-registered layer renderers (e.g. `fx:*`)
36
+ * render real content in the thumbnail instead of fallback layer-type text. */
37
+ readonly registry?: DomRendererOptions["registry"];
38
+ }
39
+ export interface SlideThumbnailHandle {
40
+ dispose(): void;
41
+ }
42
+ /**
43
+ * Mounts a slide thumbnail into `options.root`.
44
+ *
45
+ * DOM structure:
46
+ * root
47
+ * └── box [data-velumo-thumbnail] (overflow:hidden, aspect-ratio:16/9)
48
+ * └── stage [data-velumo-thumbnail-stage] (1280×720, container-type:size)
49
+ * └── surface [data-velumo-renderer="dom"] (DomRenderer root)
50
+ *
51
+ * The HOST sizes box's width. The stage is always 1280px wide (reference.width)
52
+ * so that cqw units resolve canonically. A CSS transform scales the stage to fit
53
+ * the host-sized box (transform-origin: top left).
54
+ *
55
+ * ResizeObserver (when available) keeps the scale updated. A synchronous
56
+ * initial measure is taken at mount time; a zero width falls back to reference.width.
57
+ *
58
+ * The [data-velumo-thumbnail] marker on the box causes the defaultThemeCss rule
59
+ * [data-velumo-thumbnail] [data-velumo-animation] { animation: none !important; }
60
+ * to suppress entry animations, keeping thumbnails visually settled.
61
+ */
62
+ export declare function mountSlideThumbnail(options: SlideThumbnailOptions): SlideThumbnailHandle;
63
+ //# sourceMappingURL=slide-thumbnail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slide-thumbnail.d.ts","sourceRoot":"","sources":["../src/slide-thumbnail.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAe,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAKzE,MAAM,WAAW,qBAAqB;IACpC;mFAC+E;IAC/E,QAAQ,CAAC,IAAI,EAAE;QACb,QAAQ,CAAC,aAAa,EAAE;YACtB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC;YACpC,eAAe,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC;YACnD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC;YAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC;YACpB,aAAa,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,GAAG,CAAC;YACvC,QAAQ,CAAC,WAAW,CAAC,EAAE;gBACrB,cAAc,CAAC,EAAE,KAAK,EAAE,EAAE,sBAAsB,KAAK,cAAc,CAAC;aACrE,GAAG,IAAI,CAAC;SACV,CAAC;QACF,eAAe,CAAC,GAAG,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAC1C,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC;QACrC,qBAAqB,CAAC,IAAI;YACxB,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;YACf,GAAG,EAAE,MAAM,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;KACH,CAAC;IACF,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,QAAQ,CAAC,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD;mFAC+E;IAC/E,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,qBAAqB,GAC7B,oBAAoB,CA8EtB"}
@@ -0,0 +1,93 @@
1
+ import { RuntimeController } from "@velumo/runtime";
2
+ import { DomRenderer } from "./dom-renderer.js";
3
+ // Default reference dimensions for a 16:9 slide stage.
4
+ const DEFAULT_REFERENCE = { width: 1280, height: 720 };
5
+ /**
6
+ * Mounts a slide thumbnail into `options.root`.
7
+ *
8
+ * DOM structure:
9
+ * root
10
+ * └── box [data-velumo-thumbnail] (overflow:hidden, aspect-ratio:16/9)
11
+ * └── stage [data-velumo-thumbnail-stage] (1280×720, container-type:size)
12
+ * └── surface [data-velumo-renderer="dom"] (DomRenderer root)
13
+ *
14
+ * The HOST sizes box's width. The stage is always 1280px wide (reference.width)
15
+ * so that cqw units resolve canonically. A CSS transform scales the stage to fit
16
+ * the host-sized box (transform-origin: top left).
17
+ *
18
+ * ResizeObserver (when available) keeps the scale updated. A synchronous
19
+ * initial measure is taken at mount time; a zero width falls back to reference.width.
20
+ *
21
+ * The [data-velumo-thumbnail] marker on the box causes the defaultThemeCss rule
22
+ * [data-velumo-thumbnail] [data-velumo-animation] { animation: none !important; }
23
+ * to suppress entry animations, keeping thumbnails visually settled.
24
+ */
25
+ export function mountSlideThumbnail(options) {
26
+ const reference = options.reference ?? DEFAULT_REFERENCE;
27
+ const doc = options.root.ownerDocument;
28
+ // Build DOM: box > stage > surface
29
+ const box = doc.createElement("div");
30
+ box.setAttribute("data-velumo-thumbnail", "");
31
+ box.style.overflow = "hidden";
32
+ box.style.aspectRatio = "16 / 9";
33
+ const stage = doc.createElement("div");
34
+ stage.setAttribute("data-velumo-thumbnail-stage", "");
35
+ stage.style.width = `${reference.width}px`;
36
+ stage.style.height = `${reference.height}px`;
37
+ stage.style.containerType = "size";
38
+ stage.style.transformOrigin = "top left";
39
+ const surface = doc.createElement("div");
40
+ // Fill the stage so the renderer root has a DEFINITE 1280x720 size. Without an
41
+ // explicit height the surface shrink-wraps its content, so its `container-type:
42
+ // size` would resolve `cqh` to the content height instead of 720px and the
43
+ // slide's `cqh`-based frame padding would be wrong (gate-3 finding 1).
44
+ surface.style.width = "100%";
45
+ surface.style.height = "100%";
46
+ stage.appendChild(surface);
47
+ box.appendChild(stage);
48
+ options.root.replaceChildren(box);
49
+ // Wire up runtime + renderer
50
+ const runtime = new RuntimeController(options.manifest, {
51
+ initialSlideId: options.slideId,
52
+ });
53
+ const renderer = new DomRenderer({
54
+ root: surface,
55
+ manifest: options.manifest,
56
+ runtime,
57
+ registry: options.registry,
58
+ });
59
+ renderer.mount();
60
+ // Scale helpers
61
+ function applyScale(boxWidth) {
62
+ stage.style.transform = `scale(${boxWidth / reference.width})`;
63
+ }
64
+ // Synchronous initial measure
65
+ const initialWidth = box.getBoundingClientRect?.()?.width ?? 0;
66
+ applyScale(initialWidth > 0 ? initialWidth : reference.width);
67
+ // ResizeObserver (observe the BOX — a test asserts this)
68
+ let disposed = false;
69
+ const ROCtor = globalThis.ResizeObserver ?? doc.defaultView?.ResizeObserver;
70
+ let observer;
71
+ if (ROCtor !== undefined) {
72
+ observer = new ROCtor((entries) => {
73
+ if (disposed)
74
+ return;
75
+ const width = entries[0]?.contentRect?.width;
76
+ if (typeof width === "number") {
77
+ applyScale(width);
78
+ }
79
+ });
80
+ observer.observe(box);
81
+ }
82
+ return {
83
+ dispose() {
84
+ if (disposed)
85
+ return;
86
+ disposed = true;
87
+ observer?.disconnect();
88
+ renderer.dispose();
89
+ options.root.replaceChildren();
90
+ },
91
+ };
92
+ }
93
+ //# sourceMappingURL=slide-thumbnail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slide-thumbnail.js","sourceRoot":"","sources":["../src/slide-thumbnail.ts"],"names":[],"mappings":"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"}