prismdeckjs 0.1.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 (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +45 -0
  3. package/dist/chunks/rapier-D1P_-6v-.js +5727 -0
  4. package/dist/document/archive.d.ts +17 -0
  5. package/dist/document/archive.d.ts.map +1 -0
  6. package/dist/document/archive.js +105 -0
  7. package/dist/document/archive.js.map +1 -0
  8. package/dist/document/html.d.ts +10 -0
  9. package/dist/document/html.d.ts.map +1 -0
  10. package/dist/document/html.js +149 -0
  11. package/dist/document/html.js.map +1 -0
  12. package/dist/document/types.d.ts +188 -0
  13. package/dist/document/types.d.ts.map +1 -0
  14. package/dist/document/types.js +21 -0
  15. package/dist/document/types.js.map +1 -0
  16. package/dist/document/validate.d.ts +9 -0
  17. package/dist/document/validate.d.ts.map +1 -0
  18. package/dist/document/validate.js +77 -0
  19. package/dist/document/validate.js.map +1 -0
  20. package/dist/import/index.d.ts +9 -0
  21. package/dist/import/index.d.ts.map +1 -0
  22. package/dist/import/index.js +41 -0
  23. package/dist/import/index.js.map +1 -0
  24. package/dist/import/odp.d.ts +3 -0
  25. package/dist/import/odp.d.ts.map +1 -0
  26. package/dist/import/odp.js +529 -0
  27. package/dist/import/odp.js.map +1 -0
  28. package/dist/import/pptx.d.ts +3 -0
  29. package/dist/import/pptx.d.ts.map +1 -0
  30. package/dist/import/pptx.js +634 -0
  31. package/dist/import/pptx.js.map +1 -0
  32. package/dist/import/xml.d.ts +19 -0
  33. package/dist/import/xml.d.ts.map +1 -0
  34. package/dist/import/xml.js +100 -0
  35. package/dist/import/xml.js.map +1 -0
  36. package/dist/index.d.ts +12 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +12 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/physics/rapier.d.ts +36 -0
  41. package/dist/physics/rapier.d.ts.map +1 -0
  42. package/dist/physics/rapier.js +137 -0
  43. package/dist/physics/rapier.js.map +1 -0
  44. package/dist/prism-deck.min.js +61229 -0
  45. package/dist/render/renderer.d.ts +78 -0
  46. package/dist/render/renderer.d.ts.map +1 -0
  47. package/dist/render/renderer.js +512 -0
  48. package/dist/render/renderer.js.map +1 -0
  49. package/dist/render/stereo.d.ts +20 -0
  50. package/dist/render/stereo.d.ts.map +1 -0
  51. package/dist/render/stereo.js +26 -0
  52. package/dist/render/stereo.js.map +1 -0
  53. package/dist/runtime/player.d.ts +30 -0
  54. package/dist/runtime/player.d.ts.map +1 -0
  55. package/dist/runtime/player.js +91 -0
  56. package/dist/runtime/player.js.map +1 -0
  57. package/dist/runtime/session.d.ts +50 -0
  58. package/dist/runtime/session.d.ts.map +1 -0
  59. package/dist/runtime/session.js +212 -0
  60. package/dist/runtime/session.js.map +1 -0
  61. package/dist/version.d.ts +2 -0
  62. package/dist/version.d.ts.map +1 -0
  63. package/dist/version.js +3 -0
  64. package/dist/version.js.map +1 -0
  65. package/package.json +61 -0
  66. package/schema/prismdeck.schema.json +124 -0
@@ -0,0 +1,17 @@
1
+ import { type LoadedDeck } from './types';
2
+ export declare const DEFAULT_ARCHIVE_LIMITS: Readonly<{
3
+ maxCompressedBytes: number;
4
+ maxEntries: 4000;
5
+ maxEntryBytes: number;
6
+ maxTotalBytes: number;
7
+ }>;
8
+ export interface ArchiveLimits {
9
+ maxCompressedBytes: number;
10
+ maxEntries: number;
11
+ maxEntryBytes: number;
12
+ maxTotalBytes: number;
13
+ }
14
+ export declare function unzipWithLimits(input: Uint8Array, limits?: ArchiveLimits): Record<string, Uint8Array>;
15
+ export declare function savePrismDeck(deck: LoadedDeck): Promise<Blob>;
16
+ export declare function loadPrismDeck(input: ArrayBuffer | Uint8Array, limits?: ArchiveLimits): Promise<LoadedDeck>;
17
+ //# sourceMappingURL=archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/document/archive.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,SAAS,CAAC;AAGjB,eAAO,MAAM,sBAAsB;;;;;EAKjC,CAAC;AAEH,MAAM,WAAW,aAAa;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB;AAQD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,UAAU,EACjB,MAAM,GAAE,aAAsC,GAC7C,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAkB5B;AAaD,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BnE;AAQD,wBAAsB,aAAa,CACjC,KAAK,EAAE,WAAW,GAAG,UAAU,EAC/B,MAAM,GAAE,aAAsC,GAC7C,OAAO,CAAC,UAAU,CAAC,CA2BrB"}
@@ -0,0 +1,105 @@
1
+ import { strFromU8, strToU8, unzipSync, zipSync } from 'fflate';
2
+ import { PRISMDECK_MIME_TYPE, PRISMDECK_SCHEMA_VERSION, } from './types';
3
+ import { validateDeckDocument } from './validate';
4
+ export const DEFAULT_ARCHIVE_LIMITS = Object.freeze({
5
+ maxCompressedBytes: 128 * 1024 * 1024,
6
+ maxEntries: 4_000,
7
+ maxEntryBytes: 32 * 1024 * 1024,
8
+ maxTotalBytes: 256 * 1024 * 1024,
9
+ });
10
+ function assertSafePath(path) {
11
+ if (path.startsWith('/') || path.includes('..') || path.includes('\\')) {
12
+ throw new Error(`Unsafe archive entry path: ${path}`);
13
+ }
14
+ }
15
+ export function unzipWithLimits(input, limits = DEFAULT_ARCHIVE_LIMITS) {
16
+ if (input.byteLength > limits.maxCompressedBytes) {
17
+ throw new Error(`Archive exceeds ${limits.maxCompressedBytes} compressed bytes`);
18
+ }
19
+ let entries = 0;
20
+ let totalBytes = 0;
21
+ return unzipSync(input, {
22
+ filter(file) {
23
+ assertSafePath(file.name);
24
+ entries += 1;
25
+ totalBytes += file.originalSize;
26
+ if (entries > limits.maxEntries)
27
+ throw new Error('Archive has too many entries');
28
+ if (file.originalSize > limits.maxEntryBytes)
29
+ throw new Error(`Archive entry is too large: ${file.name}`);
30
+ if (totalBytes > limits.maxTotalBytes)
31
+ throw new Error('Archive expands beyond the configured limit');
32
+ return true;
33
+ },
34
+ });
35
+ }
36
+ async function sha256(data) {
37
+ const copied = new Uint8Array(data);
38
+ const digest = await globalThis.crypto.subtle.digest('SHA-256', copied.buffer);
39
+ return Array.from(new Uint8Array(digest), (value) => value.toString(16).padStart(2, '0')).join('');
40
+ }
41
+ function safeAssetFileName(asset) {
42
+ const extension = asset.fileName.match(/\.[a-z0-9]{1,10}$/i)?.[0]?.toLowerCase() ?? '';
43
+ return `${encodeURIComponent(asset.id)}${extension}`;
44
+ }
45
+ export async function savePrismDeck(deck) {
46
+ validateDeckDocument(deck.document);
47
+ const files = {
48
+ 'deck.json': strToU8(JSON.stringify(deck.document, null, 2)),
49
+ };
50
+ const manifest = {
51
+ format: 'prismdeck',
52
+ packageVersion: PRISMDECK_SCHEMA_VERSION,
53
+ document: 'deck.json',
54
+ assets: [],
55
+ };
56
+ for (const asset of deck.assets.values()) {
57
+ const path = `assets/${safeAssetFileName(asset)}`;
58
+ files[path] = asset.data;
59
+ manifest.assets.push({
60
+ id: asset.id,
61
+ path,
62
+ fileName: asset.fileName,
63
+ mimeType: asset.mimeType,
64
+ bytes: asset.data.byteLength,
65
+ sha256: await sha256(asset.data),
66
+ });
67
+ }
68
+ files['manifest.json'] = strToU8(JSON.stringify(manifest, null, 2));
69
+ return new Blob([zipSync(files, { level: 6 })], { type: PRISMDECK_MIME_TYPE });
70
+ }
71
+ function parseJson(files, path) {
72
+ const bytes = files[path];
73
+ if (!bytes)
74
+ throw new Error(`Missing ${path}`);
75
+ return JSON.parse(strFromU8(bytes));
76
+ }
77
+ export async function loadPrismDeck(input, limits = DEFAULT_ARCHIVE_LIMITS) {
78
+ const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);
79
+ const files = unzipWithLimits(bytes, limits);
80
+ const manifest = parseJson(files, 'manifest.json');
81
+ if (manifest.format !== 'prismdeck' || manifest.packageVersion !== PRISMDECK_SCHEMA_VERSION) {
82
+ throw new Error(`Unsupported PrismDeck package version: ${String(manifest.packageVersion)}`);
83
+ }
84
+ const document = parseJson(files, manifest.document);
85
+ validateDeckDocument(document);
86
+ const assets = new Map();
87
+ for (const entry of manifest.assets) {
88
+ assertSafePath(entry.path);
89
+ const data = files[entry.path];
90
+ if (!data)
91
+ throw new Error(`Missing packaged asset: ${entry.path}`);
92
+ if (data.byteLength !== entry.bytes)
93
+ throw new Error(`Asset size mismatch: ${entry.id}`);
94
+ if ((await sha256(data)) !== entry.sha256)
95
+ throw new Error(`Asset digest mismatch: ${entry.id}`);
96
+ assets.set(entry.id, {
97
+ id: entry.id,
98
+ fileName: entry.fileName,
99
+ mimeType: entry.mimeType,
100
+ data,
101
+ });
102
+ }
103
+ return { document, assets };
104
+ }
105
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/document/archive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type ArchiveLimits } from './archive';
2
+ import type { LoadedDeck } from './types';
3
+ export declare const PRISMDECK_HTML_MIME_TYPE: "text/html;charset=utf-8";
4
+ export declare const DEFAULT_PRISMDECK_CDN_URL: `https://cdn.jsdelivr.net/npm/prismdeckjs@${string}/dist/prism-deck.min.js`;
5
+ export interface SavePrismDeckHtmlOptions {
6
+ runtimeUrl?: string;
7
+ }
8
+ export declare function savePrismDeckHtml(deck: LoadedDeck, options?: SavePrismDeckHtmlOptions): Promise<Blob>;
9
+ export declare function loadPrismDeckHtml(input: ArrayBuffer | Uint8Array, limits?: ArchiveLimits): Promise<LoadedDeck>;
10
+ //# sourceMappingURL=html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/document/html.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwD,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AACrG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG1C,eAAO,MAAM,wBAAwB,EAAG,yBAAkC,CAAC;AAC3E,eAAO,MAAM,yBAAyB,6EACmE,CAAC;AAO1G,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA2HD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,UAAU,EAChB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,WAAW,GAAG,UAAU,EAC/B,MAAM,GAAE,aAAsC,GAC7C,OAAO,CAAC,UAAU,CAAC,CAMrB"}
@@ -0,0 +1,149 @@
1
+ import { DEFAULT_ARCHIVE_LIMITS, loadPrismDeck, savePrismDeck } from './archive';
2
+ import { PRISMDECK_PACKAGE_VERSION } from '../version';
3
+ export const PRISMDECK_HTML_MIME_TYPE = 'text/html;charset=utf-8';
4
+ export const DEFAULT_PRISMDECK_CDN_URL = `https://cdn.jsdelivr.net/npm/prismdeckjs@${PRISMDECK_PACKAGE_VERSION}/dist/prism-deck.min.js`;
5
+ const DATA_OPEN = '<script id="prismdeck-data" type="application/vnd.prismdeck+zip;base64">';
6
+ const DATA_CLOSE = '</script>';
7
+ const BASE64_ENCODE_CHUNK_BYTES = 3 * 8192;
8
+ const BASE64_DECODE_CHARS = 4 * 8192;
9
+ function escapeHtml(value) {
10
+ return value
11
+ .replaceAll('&', '&amp;')
12
+ .replaceAll('<', '&lt;')
13
+ .replaceAll('>', '&gt;')
14
+ .replaceAll('"', '&quot;')
15
+ .replaceAll("'", '&#39;');
16
+ }
17
+ function moduleString(value) {
18
+ return JSON.stringify(value).replaceAll('<', '\\u003c');
19
+ }
20
+ function bytesToBase64(bytes) {
21
+ let output = '';
22
+ for (let index = 0; index < bytes.length; index += BASE64_ENCODE_CHUNK_BYTES) {
23
+ const chunk = bytes.subarray(index, index + BASE64_ENCODE_CHUNK_BYTES);
24
+ output += btoa(String.fromCharCode(...chunk));
25
+ }
26
+ return output;
27
+ }
28
+ function base64ToBytes(value, maxBytes) {
29
+ const encoded = value.replace(/\s/g, '');
30
+ if (encoded.length === 0 || encoded.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) {
31
+ throw new Error('Invalid PrismDeck HTML data');
32
+ }
33
+ const padding = encoded.endsWith('==') ? 2 : encoded.endsWith('=') ? 1 : 0;
34
+ const byteLength = (encoded.length / 4) * 3 - padding;
35
+ if (byteLength > maxBytes)
36
+ throw new Error(`Archive exceeds ${maxBytes} compressed bytes`);
37
+ const bytes = new Uint8Array(byteLength);
38
+ let offset = 0;
39
+ for (let index = 0; index < encoded.length; index += BASE64_DECODE_CHARS) {
40
+ const binary = atob(encoded.slice(index, index + BASE64_DECODE_CHARS));
41
+ for (let binaryIndex = 0; binaryIndex < binary.length; binaryIndex += 1) {
42
+ bytes[offset++] = binary.charCodeAt(binaryIndex);
43
+ }
44
+ }
45
+ return bytes;
46
+ }
47
+ function extractArchive(html, limits) {
48
+ const start = html.indexOf(DATA_OPEN);
49
+ if (start < 0)
50
+ throw new Error('Missing PrismDeck HTML data');
51
+ const contentStart = start + DATA_OPEN.length;
52
+ const end = html.indexOf(DATA_CLOSE, contentStart);
53
+ if (end < 0)
54
+ throw new Error('Invalid PrismDeck HTML data');
55
+ if (html.indexOf(DATA_OPEN, end + DATA_CLOSE.length) >= 0)
56
+ throw new Error('Ambiguous PrismDeck HTML data');
57
+ return base64ToBytes(html.slice(contentStart, end), limits.maxCompressedBytes);
58
+ }
59
+ function viewerHtml(deck, archiveBase64, runtimeUrl) {
60
+ const title = escapeHtml(deck.document.metadata.title || 'PrismDeck presentation');
61
+ const moduleUrl = moduleString(runtimeUrl);
62
+ return `<!doctype html>
63
+ <html lang="en">
64
+ <head>
65
+ <meta charset="utf-8">
66
+ <meta name="viewport" content="width=device-width,initial-scale=1">
67
+ <title>${title}</title>
68
+ <style>
69
+ :root{color-scheme:dark;font-family:Inter,ui-sans-serif,system-ui,sans-serif;background:#151311;color:#f7f2ec}
70
+ *{box-sizing:border-box}html,body{width:100%;height:100%;margin:0;overflow:hidden}body{display:grid;grid-template-rows:1fr auto}
71
+ main{position:relative;min-height:0;background:radial-gradient(circle at 50% 40%,#36312c,#161412 72%)}
72
+ canvas{display:block;width:100%;height:100%}.status{position:absolute;inset:0;display:grid;place-items:center;padding:2rem;text-align:center;background:#151311}
73
+ nav{height:58px;display:grid;grid-template-columns:1fr auto 1fr;align-items:center;padding:0 18px;border-top:1px solid #39342f;background:#211e1b}
74
+ .title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}.controls{display:flex;align-items:center;gap:10px}
75
+ button{width:34px;height:34px;border:1px solid #514a44;border-radius:50%;background:#2b2723;color:#f7f2ec;font:700 16px inherit;cursor:pointer}
76
+ button:disabled{opacity:.35;cursor:not-allowed}.count{justify-self:end;color:#aaa29c;font:12px ui-monospace,SFMono-Regular,monospace}
77
+ </style>
78
+ </head>
79
+ <body>
80
+ <main><canvas aria-label="Interactive 3D presentation canvas"></canvas><div class="status">Loading presentation…</div></main>
81
+ <nav aria-label="Presentation controls"><div class="title"></div><div class="controls"><button type="button" data-action="previous" aria-label="Previous slide">←</button><button type="button" data-action="next" aria-label="Next slide">→</button></div><div class="count"></div></nav>
82
+ ${DATA_OPEN}${archiveBase64}${DATA_CLOSE}
83
+ <script type="module">
84
+ const status = document.querySelector('.status');
85
+ try {
86
+ const PrismDeck = await import(${moduleUrl});
87
+ const encoded = document.getElementById('prismdeck-data').textContent.trim();
88
+ const binary = atob(encoded);
89
+ const bytes = new Uint8Array(binary.length);
90
+ for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);
91
+ const deck = await PrismDeck.loadPrismDeck(bytes);
92
+ const canvas = document.querySelector('canvas');
93
+ const player = await PrismDeck.DeckPlayer.create(canvas, deck, { autoStart: true });
94
+ const previous = document.querySelector('[data-action="previous"]');
95
+ const next = document.querySelector('[data-action="next"]');
96
+ const title = document.querySelector('.title');
97
+ const count = document.querySelector('.count');
98
+ const sync = () => {
99
+ const index = player.session.currentSlideIndex;
100
+ const total = player.session.document.slides.length;
101
+ title.textContent = player.session.currentSlide?.name ?? player.session.document.metadata.title;
102
+ count.textContent = total === 0 ? '0 / 0' : (index + 1) + ' / ' + total;
103
+ previous.disabled = index <= 0;
104
+ next.disabled = index < 0 || index >= total - 1;
105
+ };
106
+ previous.addEventListener('click', () => player.session.previous());
107
+ next.addEventListener('click', () => player.session.next());
108
+ player.session.addEventListener('change', sync);
109
+ window.addEventListener('keydown', (event) => {
110
+ if (event.key === 'ArrowLeft' || event.key === 'PageUp') player.session.previous();
111
+ else if (event.key === 'ArrowRight' || event.key === 'PageDown') player.session.next();
112
+ });
113
+ const resize = () => player.renderer.resize(canvas.clientWidth, canvas.clientHeight, false);
114
+ const observer = new ResizeObserver(resize);
115
+ observer.observe(canvas);
116
+ resize();
117
+ sync();
118
+ status.hidden = true;
119
+ window.addEventListener('beforeunload', () => { observer.disconnect(); player.dispose(); }, { once: true });
120
+ } catch (error) {
121
+ status.textContent = error instanceof Error ? error.message : 'Unable to load this presentation';
122
+ }
123
+ </script>
124
+ </body>
125
+ </html>`;
126
+ }
127
+ export async function savePrismDeckHtml(deck, options = {}) {
128
+ const runtimeUrl = options.runtimeUrl ?? DEFAULT_PRISMDECK_CDN_URL;
129
+ let parsedUrl;
130
+ try {
131
+ parsedUrl = new URL(runtimeUrl);
132
+ }
133
+ catch {
134
+ throw new Error('PrismDeck HTML runtime URL must be an absolute HTTPS URL');
135
+ }
136
+ if (parsedUrl.protocol !== 'https:')
137
+ throw new Error('PrismDeck HTML runtime URL must use HTTPS');
138
+ const archive = new Uint8Array(await (await savePrismDeck(deck)).arrayBuffer());
139
+ return new Blob([viewerHtml(deck, bytesToBase64(archive), parsedUrl.href)], { type: PRISMDECK_HTML_MIME_TYPE });
140
+ }
141
+ export async function loadPrismDeckHtml(input, limits = DEFAULT_ARCHIVE_LIMITS) {
142
+ const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);
143
+ const maxHtmlBytes = Math.ceil(limits.maxCompressedBytes / 3) * 4 + 1024 * 1024;
144
+ if (bytes.byteLength > maxHtmlBytes)
145
+ throw new Error(`HTML package exceeds ${maxHtmlBytes} bytes`);
146
+ const html = new TextDecoder('utf-8', { fatal: true }).decode(bytes);
147
+ return loadPrismDeck(extractArchive(html, limits), limits);
148
+ }
149
+ //# sourceMappingURL=html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/document/html.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,188 @@
1
+ export declare const PRISMDECK_SCHEMA_VERSION: "0.1.0";
2
+ export declare const PRISMDECK_MIME_TYPE: "application/vnd.prismdeck+zip";
3
+ export type SourceFormat = 'pptx' | 'odp' | 'prismdeck' | 'native';
4
+ export type DocumentKind = 'presentation' | 'template';
5
+ export interface DeckMetadata {
6
+ title: string;
7
+ author?: string;
8
+ description?: string;
9
+ createdAt?: string;
10
+ modifiedAt?: string;
11
+ sourceFormat?: SourceFormat;
12
+ }
13
+ export interface DeckSize {
14
+ width: number;
15
+ height: number;
16
+ }
17
+ export interface ElementFrame {
18
+ /** Normalized from the left edge of the slide. */
19
+ x: number;
20
+ /** Normalized from the top edge of the slide. */
21
+ y: number;
22
+ width: number;
23
+ height: number;
24
+ }
25
+ export interface ElementTransform {
26
+ /** Fraction of slide height. Positive values move toward the camera. */
27
+ z: number;
28
+ rotationX: number;
29
+ rotationY: number;
30
+ rotationZ: number;
31
+ scaleX: number;
32
+ scaleY: number;
33
+ }
34
+ export interface ElementPhysics {
35
+ body: 'fixed' | 'dynamic' | 'kinematic' | 'sensor';
36
+ shape: 'cuboid' | 'ball';
37
+ density: number;
38
+ restitution: number;
39
+ friction: number;
40
+ }
41
+ export interface ElementSource {
42
+ format: SourceFormat;
43
+ part?: string;
44
+ nativeId?: string;
45
+ nativeType?: string;
46
+ }
47
+ export interface ElementPlaceholder {
48
+ type: string;
49
+ index?: number;
50
+ prompt?: string;
51
+ }
52
+ export interface DeckElementBase {
53
+ id: string;
54
+ type: DeckElement['type'];
55
+ name: string;
56
+ frame: ElementFrame;
57
+ transform: ElementTransform;
58
+ opacity: number;
59
+ visible: boolean;
60
+ renderOrder: number;
61
+ thickness?: number;
62
+ physics?: ElementPhysics;
63
+ source?: ElementSource;
64
+ placeholder?: ElementPlaceholder;
65
+ }
66
+ export interface TextStyle {
67
+ fontFamily: string;
68
+ fontSize: number;
69
+ fontWeight: number;
70
+ fontStyle: 'normal' | 'italic';
71
+ color: string;
72
+ align: 'left' | 'center' | 'right';
73
+ verticalAlign: 'top' | 'middle' | 'bottom';
74
+ lineHeight: number;
75
+ }
76
+ export interface TextElement extends DeckElementBase {
77
+ type: 'text';
78
+ text: string;
79
+ style: TextStyle;
80
+ }
81
+ export interface ImageElement extends DeckElementBase {
82
+ type: 'image';
83
+ assetId: string;
84
+ alt?: string;
85
+ fit: 'contain' | 'cover' | 'fill';
86
+ }
87
+ export interface ShapeElement extends DeckElementBase {
88
+ type: 'shape';
89
+ shape: 'rectangle' | 'roundedRectangle' | 'ellipse' | 'line' | 'custom';
90
+ fill: string;
91
+ stroke: string;
92
+ strokeWidth: number;
93
+ text?: string;
94
+ textStyle?: TextStyle;
95
+ }
96
+ export interface TableElement extends DeckElementBase {
97
+ type: 'table';
98
+ rows: string[][];
99
+ headerRows: number;
100
+ fill: string;
101
+ stroke: string;
102
+ textStyle: TextStyle;
103
+ }
104
+ export interface ChartSeries {
105
+ name: string;
106
+ values: Array<number | null>;
107
+ color?: string;
108
+ }
109
+ export interface ChartElement extends DeckElementBase {
110
+ type: 'chart';
111
+ chartType: 'bar' | 'column' | 'line' | 'pie' | 'area' | 'unknown';
112
+ categories: string[];
113
+ series: ChartSeries[];
114
+ title?: string;
115
+ }
116
+ export interface UnsupportedElement extends DeckElementBase {
117
+ type: 'unsupported';
118
+ reason: string;
119
+ fallbackText?: string;
120
+ }
121
+ export type DeckElement = TextElement | ImageElement | ShapeElement | TableElement | ChartElement | UnsupportedElement;
122
+ export interface DeckLayout {
123
+ id: string;
124
+ name: string;
125
+ elements: DeckElement[];
126
+ }
127
+ export interface DeckSlide {
128
+ id: string;
129
+ name: string;
130
+ layoutId?: string;
131
+ durationMs: number;
132
+ background: string;
133
+ notes?: string;
134
+ elements: DeckElement[];
135
+ }
136
+ export interface DeckDocument {
137
+ schemaVersion: typeof PRISMDECK_SCHEMA_VERSION;
138
+ id: string;
139
+ kind: DocumentKind;
140
+ metadata: DeckMetadata;
141
+ size: DeckSize;
142
+ layouts: DeckLayout[];
143
+ slides: DeckSlide[];
144
+ }
145
+ export interface DeckAsset {
146
+ id: string;
147
+ fileName: string;
148
+ mimeType: string;
149
+ data: Uint8Array;
150
+ }
151
+ export interface LoadedDeck {
152
+ document: DeckDocument;
153
+ assets: Map<string, DeckAsset>;
154
+ }
155
+ export type ImportWarningSeverity = 'info' | 'warning' | 'error';
156
+ export interface ImportWarning {
157
+ code: string;
158
+ severity: ImportWarningSeverity;
159
+ message: string;
160
+ slideIndex?: number;
161
+ elementId?: string;
162
+ sourcePart?: string;
163
+ }
164
+ export interface ImportReport {
165
+ format: SourceFormat;
166
+ warnings: ImportWarning[];
167
+ sourceName?: string;
168
+ }
169
+ export interface ImportResult extends LoadedDeck {
170
+ report: ImportReport;
171
+ }
172
+ export interface PackageAssetEntry {
173
+ id: string;
174
+ path: string;
175
+ fileName: string;
176
+ mimeType: string;
177
+ bytes: number;
178
+ sha256: string;
179
+ }
180
+ export interface DeckPackageManifest {
181
+ format: 'prismdeck';
182
+ packageVersion: typeof PRISMDECK_SCHEMA_VERSION;
183
+ document: 'deck.json';
184
+ assets: PackageAssetEntry[];
185
+ }
186
+ export declare const DEFAULT_TRANSFORM: ElementTransform;
187
+ export declare const DEFAULT_TEXT_STYLE: TextStyle;
188
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/document/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export const PRISMDECK_SCHEMA_VERSION = '0.1.0';
2
+ export const PRISMDECK_MIME_TYPE = 'application/vnd.prismdeck+zip';
3
+ export const DEFAULT_TRANSFORM = Object.freeze({
4
+ z: 0,
5
+ rotationX: 0,
6
+ rotationY: 0,
7
+ rotationZ: 0,
8
+ scaleX: 1,
9
+ scaleY: 1,
10
+ });
11
+ export const DEFAULT_TEXT_STYLE = Object.freeze({
12
+ fontFamily: 'Arial, sans-serif',
13
+ fontSize: 0.04,
14
+ fontWeight: 400,
15
+ fontStyle: 'normal',
16
+ color: '#111111',
17
+ align: 'left',
18
+ verticalAlign: 'top',
19
+ lineHeight: 1.2,
20
+ });
21
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/document/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAgB,CAAC;AACzD,MAAM,CAAC,MAAM,mBAAmB,GAAG,+BAAwC,CAAC;AA4N5E,MAAM,CAAC,MAAM,iBAAiB,GAAqB,MAAM,CAAC,MAAM,CAAC;IAC/D,CAAC,EAAE,CAAC;IACJ,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,CAAC;IACZ,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;CACV,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAc,MAAM,CAAC,MAAM,CAAC;IACzD,UAAU,EAAE,mBAAmB;IAC/B,QAAQ,EAAE,IAAI;IACd,UAAU,EAAE,GAAG;IACf,SAAS,EAAE,QAAQ;IACnB,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,MAAM;IACb,aAAa,EAAE,KAAK;IACpB,UAAU,EAAE,GAAG;CAChB,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ErrorObject } from 'ajv';
2
+ import type { DeckDocument } from './types';
3
+ export declare class DeckValidationError extends Error {
4
+ readonly issues: readonly ErrorObject[];
5
+ constructor(message: string, issues?: readonly ErrorObject[]);
6
+ }
7
+ export declare function validateDeckDocument(value: unknown): asserts value is DeckDocument;
8
+ export declare function isDeckDocument(value: unknown): value is DeckDocument;
9
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/document/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC;AAGvC,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,SAAS,CAAC;AAKzD,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;gBAE5B,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,SAAS,WAAW,EAAO;CAKjE;AA+CD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,YAAY,CAWlF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAOpE"}
@@ -0,0 +1,77 @@
1
+ import Ajv2020 from 'ajv/dist/2020';
2
+ import schema from '../../schema/prismdeck.schema.json';
3
+ const ajv = new Ajv2020({ allErrors: true, strict: false });
4
+ const validateSchema = ajv.compile(schema);
5
+ export class DeckValidationError extends Error {
6
+ issues;
7
+ constructor(message, issues = []) {
8
+ super(message);
9
+ this.name = 'DeckValidationError';
10
+ this.issues = issues;
11
+ }
12
+ }
13
+ function assertElementSpecific(element) {
14
+ switch (element.type) {
15
+ case 'text':
16
+ if (typeof element.text !== 'string' || !element.style) {
17
+ throw new DeckValidationError(`Text element ${element.id} is missing text or style`);
18
+ }
19
+ break;
20
+ case 'image':
21
+ if (!element.assetId) {
22
+ throw new DeckValidationError(`Image element ${element.id} is missing assetId`);
23
+ }
24
+ break;
25
+ case 'shape':
26
+ if (!element.shape || !element.fill || !element.stroke) {
27
+ throw new DeckValidationError(`Shape element ${element.id} is incomplete`);
28
+ }
29
+ break;
30
+ case 'table':
31
+ if (!Array.isArray(element.rows) ||
32
+ !Number.isInteger(element.headerRows) ||
33
+ !element.fill ||
34
+ !element.stroke ||
35
+ !element.textStyle) {
36
+ throw new DeckValidationError(`Table element ${element.id} is incomplete`);
37
+ }
38
+ break;
39
+ case 'chart':
40
+ if (!Array.isArray(element.categories) || !Array.isArray(element.series)) {
41
+ throw new DeckValidationError(`Chart element ${element.id} is incomplete`);
42
+ }
43
+ break;
44
+ case 'unsupported':
45
+ if (!element.reason) {
46
+ throw new DeckValidationError(`Unsupported element ${element.id} is missing a reason`);
47
+ }
48
+ break;
49
+ default: {
50
+ const neverElement = element;
51
+ throw new DeckValidationError(`Unknown element type: ${String(neverElement)}`);
52
+ }
53
+ }
54
+ }
55
+ export function validateDeckDocument(value) {
56
+ if (!validateSchema(value)) {
57
+ throw new DeckValidationError('Invalid PrismDeck document', validateSchema.errors ?? []);
58
+ }
59
+ for (const layout of value.layouts) {
60
+ for (const element of layout.elements)
61
+ assertElementSpecific(element);
62
+ }
63
+ for (const slide of value.slides) {
64
+ for (const element of slide.elements)
65
+ assertElementSpecific(element);
66
+ }
67
+ }
68
+ export function isDeckDocument(value) {
69
+ try {
70
+ validateDeckDocument(value);
71
+ return true;
72
+ }
73
+ catch {
74
+ return false;
75
+ }
76
+ }
77
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/document/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ImportResult, SourceFormat } from '../document/types';
2
+ export interface ImportPresentationOptions {
3
+ sourceName?: string;
4
+ format?: Extract<SourceFormat, 'pptx' | 'odp' | 'prismdeck'> | 'html';
5
+ }
6
+ export declare function importPresentation(input: ArrayBuffer, options?: ImportPresentationOptions): Promise<ImportResult>;
7
+ export { importOdp } from './odp';
8
+ export { importPptx } from './pptx';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/import/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAIpE,MAAM,WAAW,yBAAyB;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,KAAK,GAAG,WAAW,CAAC,GAAG,MAAM,CAAC;CACvE;AAmBD,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,YAAY,CAAC,CASvB;AAED,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC"}