pptx-angular-viewer 3.9.0 → 3.11.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.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,22 @@ A release listed with no entries carried no Conventional Commit in this package'
7
7
  scope: scripts/release-plan.mjs re-releases a package whenever any of its files
8
8
  change, not only on conventional ones.
9
9
 
10
+ ## [3.10.0](https://github.com/ChristopherVR/pptx-viewer/releases/tag/pptx-angular-viewer@3.10.0) - 2026-09-06
11
+
12
+ ### Features
13
+
14
+ - **core:** Close the wave-5 OpenXML limitation gaps in parse/save (by @ChristopherVR) ([175dbbd](https://github.com/ChristopherVR/pptx-viewer/commit/175dbbdccefebd5b4c4cd386a421b3bcb0209093))
15
+ - **shared:** Wave-5 render logic for the closed limitation rows (by @ChristopherVR) ([2c9ea37](https://github.com/ChristopherVR/pptx-viewer/commit/2c9ea37519fed39982a83692baef630153c2844c))
16
+ - **angular:** Wave-5 limitation closures (3D charts, userShapes, ink, effects) (by @ChristopherVR) ([1f39d88](https://github.com/ChristopherVR/pptx-viewer/commit/1f39d883cff234ac6f3358ee943072e89e2aec0e))
17
+
18
+ ## [3.9.0](https://github.com/ChristopherVR/pptx-viewer/releases/tag/pptx-angular-viewer@3.9.0) - 2026-09-05
19
+
20
+ ### Features
21
+
22
+ - **core:** Openxml parity wave 4/5 (table styles, userShapes, alt text, bldLst) (by @ChristopherVR) ([bfd2af8](https://github.com/ChristopherVR/pptx-viewer/commit/bfd2af899ea78a50e88762a3278756b9c7bcf8b5))
23
+ - **shared:** Parity wave 4/5 decision modules for all five bindings (by @ChristopherVR) ([16c6147](https://github.com/ChristopherVR/pptx-viewer/commit/16c61473d8ac16c396a1fab347afb9ab98879b6b))
24
+ - **angular:** Parity wave 4/5 (accessibility, table styles, chart runs, save options) (by @ChristopherVR) ([b33ee41](https://github.com/ChristopherVR/pptx-viewer/commit/b33ee418701416889e81504c3bf292c38f754402))
25
+
10
26
  ## [3.8.0](https://github.com/ChristopherVR/pptx-viewer/releases/tag/pptx-angular-viewer@3.8.0) - 2026-09-05
11
27
 
12
28
  ### Features
@@ -1,4 +1,4 @@
1
- import { t as toChatSummary } from './pptx-angular-viewer-pptx-angular-viewer-BzS7I0F9.mjs';
1
+ import { t as toChatSummary } from './pptx-angular-viewer-pptx-angular-viewer-C1wF12EK.mjs';
2
2
 
3
3
  /**
4
4
  * IndexedDB backend for {@link createChatHistoryStore}. Kept in its own module
@@ -103,4 +103,4 @@ function createIdbBackend(db) {
103
103
  }
104
104
 
105
105
  export { CHAT_STORE, createIdbBackend, openChatDb };
106
- //# sourceMappingURL=pptx-angular-viewer-chat-history-idb-BHSiNfjU.mjs.map
106
+ //# sourceMappingURL=pptx-angular-viewer-chat-history-idb-HlR4XrKD.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pptx-angular-viewer-chat-history-idb-BHSiNfjU.mjs","sources":["../../src/internal/shared-src/ai/chat-history-idb.ts"],"sourcesContent":["/**\n * IndexedDB backend for {@link createChatHistoryStore}. Kept in its own module\n * so the localStorage fallback and the public factory stay within the per-file\n * size budget. Uses the raw IndexedDB API with tiny promise wrappers so no new\n * runtime dependency is pulled in.\n *\n * Every browser global is touched lazily from inside a function, never at module\n * load, so importing this file in a non-DOM environment (Node, SSR) never throws.\n */\n\nimport type { ChatBackend, PptxAiChatSummary, PptxAiStoredChat } from './chat-history-store';\nimport { toChatSummary } from './chat-history-store';\n\n/** Object store holding one record per chat, keyed by `id`. */\nexport const CHAT_STORE = 'chats';\n/** Index over the optional `deckId` key path, used for per-deck filtering. */\nconst DECK_INDEX = 'deckId';\n\n/** Resolve an `IDBRequest` to a promise. */\nfunction requestToPromise<T>(request: IDBRequest<T>): Promise<T> {\n\treturn new Promise<T>((resolve, reject) => {\n\t\trequest.onsuccess = () => resolve(request.result);\n\t\trequest.onerror = () => reject(request.error ?? new Error('IndexedDB request failed.'));\n\t});\n}\n\n/** Resolve when a transaction commits (or reject on error/abort). */\nfunction transactionDone(tx: IDBTransaction): Promise<void> {\n\treturn new Promise<void>((resolve, reject) => {\n\t\ttx.oncomplete = () => resolve();\n\t\ttx.onerror = () => reject(tx.error ?? new Error('IndexedDB transaction failed.'));\n\t\ttx.onabort = () => reject(tx.error ?? new Error('IndexedDB transaction aborted.'));\n\t});\n}\n\n/**\n * Open (and if needed create/upgrade) the chat database. Throws when there is no\n * `indexedDB` global so the caller can transparently fall back to localStorage.\n */\nexport function openChatDb(dbName: string): Promise<IDBDatabase> {\n\tconst idb = typeof indexedDB !== 'undefined' ? indexedDB : undefined;\n\tif (!idb) {\n\t\tthrow new Error('IndexedDB is not available in this environment.');\n\t}\n\treturn new Promise<IDBDatabase>((resolve, reject) => {\n\t\tconst open = idb.open(dbName, 1);\n\t\topen.onupgradeneeded = () => {\n\t\t\tconst db = open.result;\n\t\t\tif (!db.objectStoreNames.contains(CHAT_STORE)) {\n\t\t\t\tconst store = db.createObjectStore(CHAT_STORE, { keyPath: 'id' });\n\t\t\t\tstore.createIndex(DECK_INDEX, 'deckId', { unique: false });\n\t\t\t}\n\t\t};\n\t\topen.onsuccess = () => resolve(open.result);\n\t\topen.onerror = () => reject(open.error ?? new Error('Failed to open IndexedDB.'));\n\t\topen.onblocked = () => reject(new Error('IndexedDB open blocked by another connection.'));\n\t});\n}\n\n/** Read every stored chat (newest-first ordering is applied by the caller). */\nasync function readAll(db: IDBDatabase, deckId: string | undefined): Promise<PptxAiStoredChat[]> {\n\tconst tx = db.transaction(CHAT_STORE, 'readonly');\n\tconst store = tx.objectStore(CHAT_STORE);\n\tconst source =\n\t\tdeckId === undefined\n\t\t\t? store.getAll()\n\t\t\t: store.index(DECK_INDEX).getAll(IDBKeyRange.only(deckId));\n\tconst rows = await requestToPromise<PptxAiStoredChat[]>(source);\n\tawait transactionDone(tx);\n\treturn rows;\n}\n\n/** Create an IndexedDB-backed {@link ChatBackend}. */\nexport function createIdbBackend(db: IDBDatabase): ChatBackend {\n\treturn {\n\t\tasync list(deckId: string | undefined): Promise<PptxAiChatSummary[]> {\n\t\t\tconst rows = await readAll(db, deckId);\n\t\t\treturn rows.map(toChatSummary).sort((a, b) => b.updatedAt - a.updatedAt);\n\t\t},\n\t\tasync load(id: string): Promise<PptxAiStoredChat | null> {\n\t\t\tconst tx = db.transaction(CHAT_STORE, 'readonly');\n\t\t\tconst row = await requestToPromise<PptxAiStoredChat | undefined>(\n\t\t\t\ttx.objectStore(CHAT_STORE).get(id),\n\t\t\t);\n\t\t\tawait transactionDone(tx);\n\t\t\treturn row ?? null;\n\t\t},\n\t\tasync save(chat: PptxAiStoredChat): Promise<void> {\n\t\t\tconst tx = db.transaction(CHAT_STORE, 'readwrite');\n\t\t\ttx.objectStore(CHAT_STORE).put(chat);\n\t\t\tawait transactionDone(tx);\n\t\t},\n\t\tasync remove(id: string): Promise<void> {\n\t\t\tconst tx = db.transaction(CHAT_STORE, 'readwrite');\n\t\t\ttx.objectStore(CHAT_STORE).delete(id);\n\t\t\tawait transactionDone(tx);\n\t\t},\n\t\tasync clear(deckId: string | undefined): Promise<void> {\n\t\t\tconst tx = db.transaction(CHAT_STORE, 'readwrite');\n\t\t\tconst store = tx.objectStore(CHAT_STORE);\n\t\t\tif (deckId === undefined) {\n\t\t\t\tstore.clear();\n\t\t\t} else {\n\t\t\t\tconst ids = await requestToPromise<IDBValidKey[]>(\n\t\t\t\t\tstore.index(DECK_INDEX).getAllKeys(IDBKeyRange.only(deckId)),\n\t\t\t\t);\n\t\t\t\tfor (const id of ids) {\n\t\t\t\t\tstore.delete(id);\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait transactionDone(tx);\n\t\t},\n\t};\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pptx-angular-viewer-chat-history-idb-HlR4XrKD.mjs","sources":["../../src/internal/shared-src/ai/chat-history-idb.ts"],"sourcesContent":["/**\n * IndexedDB backend for {@link createChatHistoryStore}. Kept in its own module\n * so the localStorage fallback and the public factory stay within the per-file\n * size budget. Uses the raw IndexedDB API with tiny promise wrappers so no new\n * runtime dependency is pulled in.\n *\n * Every browser global is touched lazily from inside a function, never at module\n * load, so importing this file in a non-DOM environment (Node, SSR) never throws.\n */\n\nimport type { ChatBackend, PptxAiChatSummary, PptxAiStoredChat } from './chat-history-store';\nimport { toChatSummary } from './chat-history-store';\n\n/** Object store holding one record per chat, keyed by `id`. */\nexport const CHAT_STORE = 'chats';\n/** Index over the optional `deckId` key path, used for per-deck filtering. */\nconst DECK_INDEX = 'deckId';\n\n/** Resolve an `IDBRequest` to a promise. */\nfunction requestToPromise<T>(request: IDBRequest<T>): Promise<T> {\n\treturn new Promise<T>((resolve, reject) => {\n\t\trequest.onsuccess = () => resolve(request.result);\n\t\trequest.onerror = () => reject(request.error ?? new Error('IndexedDB request failed.'));\n\t});\n}\n\n/** Resolve when a transaction commits (or reject on error/abort). */\nfunction transactionDone(tx: IDBTransaction): Promise<void> {\n\treturn new Promise<void>((resolve, reject) => {\n\t\ttx.oncomplete = () => resolve();\n\t\ttx.onerror = () => reject(tx.error ?? new Error('IndexedDB transaction failed.'));\n\t\ttx.onabort = () => reject(tx.error ?? new Error('IndexedDB transaction aborted.'));\n\t});\n}\n\n/**\n * Open (and if needed create/upgrade) the chat database. Throws when there is no\n * `indexedDB` global so the caller can transparently fall back to localStorage.\n */\nexport function openChatDb(dbName: string): Promise<IDBDatabase> {\n\tconst idb = typeof indexedDB !== 'undefined' ? indexedDB : undefined;\n\tif (!idb) {\n\t\tthrow new Error('IndexedDB is not available in this environment.');\n\t}\n\treturn new Promise<IDBDatabase>((resolve, reject) => {\n\t\tconst open = idb.open(dbName, 1);\n\t\topen.onupgradeneeded = () => {\n\t\t\tconst db = open.result;\n\t\t\tif (!db.objectStoreNames.contains(CHAT_STORE)) {\n\t\t\t\tconst store = db.createObjectStore(CHAT_STORE, { keyPath: 'id' });\n\t\t\t\tstore.createIndex(DECK_INDEX, 'deckId', { unique: false });\n\t\t\t}\n\t\t};\n\t\topen.onsuccess = () => resolve(open.result);\n\t\topen.onerror = () => reject(open.error ?? new Error('Failed to open IndexedDB.'));\n\t\topen.onblocked = () => reject(new Error('IndexedDB open blocked by another connection.'));\n\t});\n}\n\n/** Read every stored chat (newest-first ordering is applied by the caller). */\nasync function readAll(db: IDBDatabase, deckId: string | undefined): Promise<PptxAiStoredChat[]> {\n\tconst tx = db.transaction(CHAT_STORE, 'readonly');\n\tconst store = tx.objectStore(CHAT_STORE);\n\tconst source =\n\t\tdeckId === undefined\n\t\t\t? store.getAll()\n\t\t\t: store.index(DECK_INDEX).getAll(IDBKeyRange.only(deckId));\n\tconst rows = await requestToPromise<PptxAiStoredChat[]>(source);\n\tawait transactionDone(tx);\n\treturn rows;\n}\n\n/** Create an IndexedDB-backed {@link ChatBackend}. */\nexport function createIdbBackend(db: IDBDatabase): ChatBackend {\n\treturn {\n\t\tasync list(deckId: string | undefined): Promise<PptxAiChatSummary[]> {\n\t\t\tconst rows = await readAll(db, deckId);\n\t\t\treturn rows.map(toChatSummary).sort((a, b) => b.updatedAt - a.updatedAt);\n\t\t},\n\t\tasync load(id: string): Promise<PptxAiStoredChat | null> {\n\t\t\tconst tx = db.transaction(CHAT_STORE, 'readonly');\n\t\t\tconst row = await requestToPromise<PptxAiStoredChat | undefined>(\n\t\t\t\ttx.objectStore(CHAT_STORE).get(id),\n\t\t\t);\n\t\t\tawait transactionDone(tx);\n\t\t\treturn row ?? null;\n\t\t},\n\t\tasync save(chat: PptxAiStoredChat): Promise<void> {\n\t\t\tconst tx = db.transaction(CHAT_STORE, 'readwrite');\n\t\t\ttx.objectStore(CHAT_STORE).put(chat);\n\t\t\tawait transactionDone(tx);\n\t\t},\n\t\tasync remove(id: string): Promise<void> {\n\t\t\tconst tx = db.transaction(CHAT_STORE, 'readwrite');\n\t\t\ttx.objectStore(CHAT_STORE).delete(id);\n\t\t\tawait transactionDone(tx);\n\t\t},\n\t\tasync clear(deckId: string | undefined): Promise<void> {\n\t\t\tconst tx = db.transaction(CHAT_STORE, 'readwrite');\n\t\t\tconst store = tx.objectStore(CHAT_STORE);\n\t\t\tif (deckId === undefined) {\n\t\t\t\tstore.clear();\n\t\t\t} else {\n\t\t\t\tconst ids = await requestToPromise<IDBValidKey[]>(\n\t\t\t\t\tstore.index(DECK_INDEX).getAllKeys(IDBKeyRange.only(deckId)),\n\t\t\t\t);\n\t\t\t\tfor (const id of ids) {\n\t\t\t\t\tstore.delete(id);\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait transactionDone(tx);\n\t\t},\n\t};\n}\n"],"names":[],"mappings":"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"}
@@ -34,6 +34,17 @@ function wrapLines(ctx, text, maxWidth) {
34
34
  lines.push(line);
35
35
  return lines;
36
36
  }
37
+ /** Resolve the canvas `font` string weight/style + effective colour for an optional emphasis override. */
38
+ function resolveEmphasisFont(color, emphasis) {
39
+ const weight = emphasis?.bold === undefined ? '600' : emphasis.bold ? '700' : '400';
40
+ const italic = emphasis?.italic ? 'italic ' : '';
41
+ const scale = typeof emphasis?.fontScale === 'number' &&
42
+ Number.isFinite(emphasis.fontScale) &&
43
+ emphasis.fontScale > 0
44
+ ? emphasis.fontScale
45
+ : 1;
46
+ return { weight, italic, color: emphasis?.color ?? color, scale };
47
+ }
37
48
  /**
38
49
  * Build a label texture for a node's front face.
39
50
  *
@@ -42,12 +53,14 @@ function wrapLines(ctx, text, maxWidth) {
42
53
  * @param fontSize Requested font size in layout pixels.
43
54
  * @param footW Node footprint width (layout pixels).
44
55
  * @param footH Node footprint height (layout pixels).
56
+ * @param emphasis Active font-style emphasis override (bold/italic/underline/size/colour), if any.
45
57
  * @returns The texture + plane size, or `null` when no DOM / empty text.
46
58
  */
47
- function makeTextTexture(text, color, fontSize, footW, footH) {
59
+ function makeTextTexture(text, color, fontSize, footW, footH, emphasis) {
48
60
  if (typeof document === 'undefined' || !text.trim() || footW <= 0 || footH <= 0) {
49
61
  return null;
50
62
  }
63
+ const { weight, italic, color: effectiveColor, scale } = resolveEmphasisFont(color, emphasis);
51
64
  const worldWidth = footW * FILL;
52
65
  const worldHeight = footH * FILL;
53
66
  const canvas = document.createElement('canvas');
@@ -59,11 +72,12 @@ function makeTextTexture(text, color, fontSize, footW, footH) {
59
72
  }
60
73
  const family = 'system-ui, -apple-system, Segoe UI, Roboto, sans-serif';
61
74
  const maxTextWidth = canvas.width * 0.94;
75
+ const fontString = (px) => `${italic}${weight} ${px}px ${family}`;
62
76
  // Shrink the font until the wrapped block fits the canvas height.
63
- let px = Math.max(6, fontSize) * SUPERSAMPLE;
77
+ let px = Math.max(6, fontSize) * scale * SUPERSAMPLE;
64
78
  let lines = [];
65
79
  for (let attempt = 0; attempt < 12; attempt++) {
66
- ctx.font = `600 ${px}px ${family}`;
80
+ ctx.font = fontString(px);
67
81
  lines = wrapLines(ctx, text, maxTextWidth);
68
82
  const lineHeight = px * 1.2;
69
83
  if (lines.length * lineHeight <= canvas.height * 0.96 || px <= 6 * SUPERSAMPLE) {
@@ -72,15 +86,25 @@ function makeTextTexture(text, color, fontSize, footW, footH) {
72
86
  px *= 0.88;
73
87
  }
74
88
  ctx.clearRect(0, 0, canvas.width, canvas.height);
75
- ctx.fillStyle = color;
89
+ ctx.fillStyle = effectiveColor;
76
90
  ctx.textAlign = 'center';
77
91
  ctx.textBaseline = 'middle';
78
- ctx.font = `600 ${px}px ${family}`;
92
+ ctx.font = fontString(px);
79
93
  const lineHeight = px * 1.2;
80
94
  const blockHeight = lines.length * lineHeight;
81
95
  const startY = canvas.height / 2 - blockHeight / 2 + lineHeight / 2;
82
96
  for (let i = 0; i < lines.length; i++) {
83
- ctx.fillText(lines[i], canvas.width / 2, startY + i * lineHeight);
97
+ const y = startY + i * lineHeight;
98
+ ctx.fillText(lines[i], canvas.width / 2, y);
99
+ if (emphasis?.underline) {
100
+ const w = ctx.measureText(lines[i]).width;
101
+ ctx.strokeStyle = effectiveColor;
102
+ ctx.lineWidth = Math.max(1, px * 0.06);
103
+ ctx.beginPath();
104
+ ctx.moveTo(canvas.width / 2 - w / 2, y + px * 0.32);
105
+ ctx.lineTo(canvas.width / 2 + w / 2, y + px * 0.32);
106
+ ctx.stroke();
107
+ }
84
108
  }
85
109
  const texture = new CanvasTexture(canvas);
86
110
  texture.colorSpace = SRGBColorSpace;
@@ -157,14 +181,14 @@ function addBlock(group, disposables, m) {
157
181
  }
158
182
  return geo;
159
183
  }
160
- /** Add a front-face text plane for one node, if it has a label. */
161
- function addLabel(group, disposables, m) {
184
+ /** Build a front-face text plane for one node, or `null` when it has no label / no DOM. */
185
+ function buildLabelPlane(m, textStyle) {
162
186
  if (!m.text) {
163
- return;
187
+ return null;
164
188
  }
165
- const tex = makeTextTexture(m.text, m.textColor, m.fontSize, m.halfWidth * 2, m.halfHeight * 2);
189
+ const tex = makeTextTexture(m.text, m.textColor, m.fontSize, m.halfWidth * 2, m.halfHeight * 2, textStyle);
166
190
  if (!tex) {
167
- return;
191
+ return null;
168
192
  }
169
193
  const planeGeo = new PlaneGeometry(tex.worldWidth, tex.worldHeight);
170
194
  const planeMaterial = new MeshBasicMaterial({
@@ -179,8 +203,7 @@ function addLabel(group, disposables, m) {
179
203
  const offset = new Vector3(0, 0, m.depth + m.bevel + 0.4).applyEuler(euler);
180
204
  plane.position.set(m.position.x + offset.x, m.position.y + offset.y, m.position.z + offset.z);
181
205
  plane.rotation.copy(euler);
182
- group.add(plane);
183
- disposables.push(planeGeo, planeMaterial, tex.texture);
206
+ return { plane, disposables: [planeGeo, planeMaterial, tex.texture] };
184
207
  }
185
208
  /** Add a connector poly-line on the base plane. */
186
209
  function addConnectors(group, disposables, model) {
@@ -198,24 +221,56 @@ function addConnectors(group, disposables, model) {
198
221
  disposables.push(geo, material);
199
222
  }
200
223
  }
224
+ /** Remove and dispose one label entry's current plane, if any. */
225
+ function clearLabel(group, entry) {
226
+ if (entry.plane) {
227
+ group.remove(entry.plane);
228
+ }
229
+ for (const d of entry.disposables) {
230
+ d.dispose();
231
+ }
232
+ entry.plane = null;
233
+ entry.disposables = [];
234
+ }
201
235
  /**
202
236
  * Build a `THREE.Group` for a SmartArt 3D model. The group is centred on the
203
237
  * origin (the model positions already are); callers add it to the scene.
238
+ * `textStyle` is a font-style emphasis override applied to every node's
239
+ * label (see {@link BuiltMeshGroup.setTextStyle}); emphasis is authored per
240
+ * shape/animation-target, not per SmartArt node, so it applies uniformly.
204
241
  */
205
- function buildMeshGroup(model) {
242
+ function buildMeshGroup(model, textStyle) {
206
243
  const group = new Group();
207
- const disposables = [];
208
- for (const m of model.meshes) {
209
- addBlock(group, disposables, m);
210
- addLabel(group, disposables, m);
211
- }
212
- addConnectors(group, disposables, model);
244
+ const blockDisposables = [];
245
+ const labelEntries = model.meshes.map((m) => {
246
+ addBlock(group, blockDisposables, m);
247
+ const built = buildLabelPlane(m, textStyle);
248
+ if (built) {
249
+ group.add(built.plane);
250
+ }
251
+ return { node: m, plane: built?.plane ?? null, disposables: built?.disposables ?? [] };
252
+ });
253
+ addConnectors(group, blockDisposables, model);
213
254
  return {
214
255
  group,
256
+ setTextStyle(style) {
257
+ for (const entry of labelEntries) {
258
+ clearLabel(group, entry);
259
+ const built = buildLabelPlane(entry.node, style);
260
+ if (built) {
261
+ group.add(built.plane);
262
+ entry.plane = built.plane;
263
+ entry.disposables = built.disposables;
264
+ }
265
+ }
266
+ },
215
267
  dispose() {
216
- for (const d of disposables) {
268
+ for (const d of blockDisposables) {
217
269
  d.dispose();
218
270
  }
271
+ for (const entry of labelEntries) {
272
+ clearLabel(group, entry);
273
+ }
219
274
  },
220
275
  };
221
276
  }
@@ -302,7 +357,7 @@ function mountSmartArt3D(canvas, model, width, height, options = {}) {
302
357
  const fill = new DirectionalLight(0xffffff, 0.3);
303
358
  fill.position.set(cx - radius, cy - radius * 0.6, cz + dist * 0.6);
304
359
  scene.add(fill);
305
- const built = buildMeshGroup(model);
360
+ const built = buildMeshGroup(model, options.textStyle);
306
361
  scene.add(built.group);
307
362
  let controls = null;
308
363
  const enableControls = (on) => {
@@ -344,6 +399,9 @@ function mountSmartArt3D(canvas, model, width, height, options = {}) {
344
399
  setInteractive(on) {
345
400
  enableControls(on);
346
401
  },
402
+ setTextStyle(style) {
403
+ built.setTextStyle(style);
404
+ },
347
405
  dispose() {
348
406
  disposed = true;
349
407
  cancelAnimationFrame(frame);
@@ -365,4 +423,4 @@ function mountSmartArt3D(canvas, model, width, height, options = {}) {
365
423
  */
366
424
 
367
425
  export { mountSmartArt3D };
368
- //# sourceMappingURL=pptx-angular-viewer-index-BbiIOY_Y.mjs.map
426
+ //# sourceMappingURL=pptx-angular-viewer-index-PoHn1XJd.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pptx-angular-viewer-index-PoHn1XJd.mjs","sources":["../../src/internal/shared-src/smartart-3d/text-texture.ts","../../src/internal/shared-src/smartart-3d/meshes.ts","../../src/internal/shared-src/smartart-3d/scene.ts","../../src/internal/shared-src/smartart-3d/index.ts"],"sourcesContent":["/**\n * Three.js SmartArt renderer - front-face text textures.\n *\n * Renders a node label onto an offscreen 2D canvas and wraps it as a\n * `THREE.CanvasTexture`, sized to sit on the extruded block's front face. Text\n * is word-wrapped and auto-shrunk to fit the node footprint. Returns `null` in\n * non-DOM environments (SSR / unit tests).\n */\n\nimport { CanvasTexture, LinearFilter, RepeatWrapping, SRGBColorSpace } from 'three';\n\nimport type { TextStyleAnimationDescriptor } from '../render/animation-text-style-resolve';\n\n/** A built label texture plus the world-space plane size it should fill. */\nexport interface SmartArtTextTexture {\n\ttexture: CanvasTexture;\n\t/** Plane width in world (layout-pixel) units. */\n\tworldWidth: number;\n\t/** Plane height in world units. */\n\tworldHeight: number;\n}\n\n/** Supersampling factor for crisp text at oblique camera angles. */\nconst SUPERSAMPLE = 4;\n/** Fraction of the footprint the text plane occupies (inset padding). */\nconst FILL = 0.86;\n\n/** Greedily word-wrap `text` to lines that fit `maxWidth` at the given font. */\nfunction wrapLines(ctx: CanvasRenderingContext2D, text: string, maxWidth: number): string[] {\n\tconst words = text.split(/\\s+/u).filter(Boolean);\n\tif (words.length === 0) {\n\t\treturn [];\n\t}\n\tconst lines: string[] = [];\n\tlet line = words[0];\n\tfor (let i = 1; i < words.length; i++) {\n\t\tconst candidate = `${line} ${words[i]}`;\n\t\tif (ctx.measureText(candidate).width <= maxWidth) {\n\t\t\tline = candidate;\n\t\t} else {\n\t\t\tlines.push(line);\n\t\t\tline = words[i];\n\t\t}\n\t}\n\tlines.push(line);\n\treturn lines;\n}\n\n/** Resolve the canvas `font` string weight/style + effective colour for an optional emphasis override. */\nfunction resolveEmphasisFont(\n\tcolor: string,\n\temphasis: TextStyleAnimationDescriptor | undefined,\n): { weight: string; italic: string; color: string; scale: number } {\n\tconst weight = emphasis?.bold === undefined ? '600' : emphasis.bold ? '700' : '400';\n\tconst italic = emphasis?.italic ? 'italic ' : '';\n\tconst scale =\n\t\ttypeof emphasis?.fontScale === 'number' &&\n\t\tNumber.isFinite(emphasis.fontScale) &&\n\t\temphasis.fontScale > 0\n\t\t\t? emphasis.fontScale\n\t\t\t: 1;\n\treturn { weight, italic, color: emphasis?.color ?? color, scale };\n}\n\n/**\n * Build a label texture for a node's front face.\n *\n * @param text Label text.\n * @param color CSS colour for the text.\n * @param fontSize Requested font size in layout pixels.\n * @param footW Node footprint width (layout pixels).\n * @param footH Node footprint height (layout pixels).\n * @param emphasis Active font-style emphasis override (bold/italic/underline/size/colour), if any.\n * @returns The texture + plane size, or `null` when no DOM / empty text.\n */\nexport function makeTextTexture(\n\ttext: string,\n\tcolor: string,\n\tfontSize: number,\n\tfootW: number,\n\tfootH: number,\n\temphasis?: TextStyleAnimationDescriptor,\n): SmartArtTextTexture | null {\n\tif (typeof document === 'undefined' || !text.trim() || footW <= 0 || footH <= 0) {\n\t\treturn null;\n\t}\n\n\tconst { weight, italic, color: effectiveColor, scale } = resolveEmphasisFont(color, emphasis);\n\tconst worldWidth = footW * FILL;\n\tconst worldHeight = footH * FILL;\n\tconst canvas = document.createElement('canvas');\n\tcanvas.width = Math.max(8, Math.round(worldWidth * SUPERSAMPLE));\n\tcanvas.height = Math.max(8, Math.round(worldHeight * SUPERSAMPLE));\n\tconst ctx = canvas.getContext('2d');\n\tif (!ctx) {\n\t\treturn null;\n\t}\n\n\tconst family = 'system-ui, -apple-system, Segoe UI, Roboto, sans-serif';\n\tconst maxTextWidth = canvas.width * 0.94;\n\tconst fontString = (px: number): string => `${italic}${weight} ${px}px ${family}`;\n\n\t// Shrink the font until the wrapped block fits the canvas height.\n\tlet px = Math.max(6, fontSize) * scale * SUPERSAMPLE;\n\tlet lines: string[] = [];\n\tfor (let attempt = 0; attempt < 12; attempt++) {\n\t\tctx.font = fontString(px);\n\t\tlines = wrapLines(ctx, text, maxTextWidth);\n\t\tconst lineHeight = px * 1.2;\n\t\tif (lines.length * lineHeight <= canvas.height * 0.96 || px <= 6 * SUPERSAMPLE) {\n\t\t\tbreak;\n\t\t}\n\t\tpx *= 0.88;\n\t}\n\n\tctx.clearRect(0, 0, canvas.width, canvas.height);\n\tctx.fillStyle = effectiveColor;\n\tctx.textAlign = 'center';\n\tctx.textBaseline = 'middle';\n\tctx.font = fontString(px);\n\tconst lineHeight = px * 1.2;\n\tconst blockHeight = lines.length * lineHeight;\n\tconst startY = canvas.height / 2 - blockHeight / 2 + lineHeight / 2;\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst y = startY + i * lineHeight;\n\t\tctx.fillText(lines[i], canvas.width / 2, y);\n\t\tif (emphasis?.underline) {\n\t\t\tconst w = ctx.measureText(lines[i]).width;\n\t\t\tctx.strokeStyle = effectiveColor;\n\t\t\tctx.lineWidth = Math.max(1, px * 0.06);\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(canvas.width / 2 - w / 2, y + px * 0.32);\n\t\t\tctx.lineTo(canvas.width / 2 + w / 2, y + px * 0.32);\n\t\t\tctx.stroke();\n\t\t}\n\t}\n\n\tconst texture = new CanvasTexture(canvas);\n\ttexture.colorSpace = SRGBColorSpace;\n\ttexture.minFilter = LinearFilter;\n\ttexture.magFilter = LinearFilter;\n\t// Disable GPU-side flip: WebGL2 does not allow UNPACK_FLIP_Y_WEBGL for\n\t// texImage3D targets (depth buffers, LUTs, shadow maps). Leaving flipY=true\n\t// (the Three.js default) pollutes the global pixel-store state and causes\n\t// \"INVALID_OPERATION: texImage3D: FLIP_Y or PREMULTIPLY_ALPHA isn't allowed\"\n\t// errors. Compensate in UV space instead.\n\ttexture.flipY = false;\n\ttexture.premultiplyAlpha = false;\n\ttexture.wrapT = RepeatWrapping;\n\ttexture.repeat.set(1, -1);\n\ttexture.offset.set(0, 1);\n\ttexture.needsUpdate = true;\n\n\treturn { texture, worldWidth, worldHeight };\n}\n","/**\n * Three.js SmartArt renderer - mesh-group construction.\n *\n * Turns a pure {@link SmartArt3DModel} into a `THREE.Group` of extruded blocks\n * (with bevels, edge outlines, and front-face text planes) plus connector\n * lines. All allocated GPU resources are tracked so the caller can dispose them\n * deterministically.\n */\n\nimport {\n\tBufferGeometry,\n\tColor,\n\tEdgesGeometry,\n\tEuler,\n\tExtrudeGeometry,\n\tGroup,\n\tLine,\n\tLineBasicMaterial,\n\tLineSegments,\n\tMesh,\n\tMeshBasicMaterial,\n\tMeshStandardMaterial,\n\tPlaneGeometry,\n\tShape,\n\tVector3,\n} from 'three';\n\nimport type { TextStyleAnimationDescriptor } from '../render/animation-text-style-resolve';\nimport type { SmartArt3DMesh, SmartArt3DModel } from '../render/smartart-3d-types';\nimport { makeTextTexture } from './text-texture';\n\n/** A disposable GPU resource (geometry, material, or texture). */\ninterface Disposable {\n\tdispose: () => void;\n}\n\n/** A built mesh group plus its teardown hook. */\nexport interface BuiltMeshGroup {\n\tgroup: Group;\n\t/**\n\t * Rebuild every node's label plane with a new font-style emphasis override\n\t * (or `undefined` to clear it) - the LABEL textures are baked into a canvas\n\t * (see `text-texture.ts`), so applying an emphasis change means disposing\n\t * and repainting them, unlike a CSS override on DOM text. Leaves the block\n\t * extrusions and connectors untouched.\n\t */\n\tsetTextStyle: (style: TextStyleAnimationDescriptor | undefined) => void;\n\tdispose: () => void;\n}\n\n/** Build the extruded geometry for one node. */\nfunction extrudeGeometry(m: SmartArt3DMesh): ExtrudeGeometry {\n\tconst shape = new Shape();\n\tm.outline.forEach((p, i) => {\n\t\tif (i === 0) {\n\t\t\tshape.moveTo(p.x, p.y);\n\t\t} else {\n\t\t\tshape.lineTo(p.x, p.y);\n\t\t}\n\t});\n\tshape.closePath();\n\n\tconst bevelEnabled = m.bevel > 0;\n\treturn new ExtrudeGeometry(shape, {\n\t\tdepth: m.depth,\n\t\tbevelEnabled,\n\t\tbevelThickness: m.bevel,\n\t\tbevelSize: m.bevel,\n\t\tbevelSegments: 2,\n\t\tcurveSegments: m.rounded ? 24 : 1,\n\t\tsteps: 1,\n\t});\n}\n\n/** Add the extruded block + edge outline for one node to the group. */\nfunction addBlock(group: Group, disposables: Disposable[], m: SmartArt3DMesh): ExtrudeGeometry {\n\tconst geo = extrudeGeometry(m);\n\tconst material = new MeshStandardMaterial({\n\t\tcolor: new Color(m.fill),\n\t\tmetalness: 0.12,\n\t\troughness: 0.52,\n\t\ttransparent: m.opacity < 1,\n\t\topacity: m.opacity,\n\t});\n\tconst mesh = new Mesh(geo, material);\n\tmesh.position.set(m.position.x, m.position.y, m.position.z);\n\tmesh.rotation.set(m.rotation.x, m.rotation.y, m.rotation.z);\n\tgroup.add(mesh);\n\tdisposables.push(geo, material);\n\n\tif (m.strokeWidth > 0) {\n\t\tconst edges = new EdgesGeometry(geo, 30);\n\t\tconst lineMaterial = new LineBasicMaterial({ color: new Color(m.stroke) });\n\t\tconst line = new LineSegments(edges, lineMaterial);\n\t\tline.position.copy(mesh.position);\n\t\tline.rotation.copy(mesh.rotation);\n\t\tgroup.add(line);\n\t\tdisposables.push(edges, lineMaterial);\n\t}\n\treturn geo;\n}\n\n/** One node's currently-mounted label plane (or none), tracked for `setTextStyle` rebuilds. */\ninterface LabelEntry {\n\tnode: SmartArt3DMesh;\n\tplane: Mesh | null;\n\tdisposables: Disposable[];\n}\n\n/** Build a front-face text plane for one node, or `null` when it has no label / no DOM. */\nfunction buildLabelPlane(\n\tm: SmartArt3DMesh,\n\ttextStyle: TextStyleAnimationDescriptor | undefined,\n): { plane: Mesh; disposables: Disposable[] } | null {\n\tif (!m.text) {\n\t\treturn null;\n\t}\n\tconst tex = makeTextTexture(\n\t\tm.text,\n\t\tm.textColor,\n\t\tm.fontSize,\n\t\tm.halfWidth * 2,\n\t\tm.halfHeight * 2,\n\t\ttextStyle,\n\t);\n\tif (!tex) {\n\t\treturn null;\n\t}\n\tconst planeGeo = new PlaneGeometry(tex.worldWidth, tex.worldHeight);\n\tconst planeMaterial = new MeshBasicMaterial({\n\t\tmap: tex.texture,\n\t\ttransparent: true,\n\t\tdepthWrite: false,\n\t});\n\tconst plane = new Mesh(planeGeo, planeMaterial);\n\t// Float just past the front (+z) face, clearing any bevel, following the\n\t// mesh's rotation so the label sits flat on the (possibly rotated) face.\n\tconst euler = new Euler(m.rotation.x, m.rotation.y, m.rotation.z);\n\tconst offset = new Vector3(0, 0, m.depth + m.bevel + 0.4).applyEuler(euler);\n\tplane.position.set(m.position.x + offset.x, m.position.y + offset.y, m.position.z + offset.z);\n\tplane.rotation.copy(euler);\n\treturn { plane, disposables: [planeGeo, planeMaterial, tex.texture] };\n}\n\n/** Add a connector poly-line on the base plane. */\nfunction addConnectors(group: Group, disposables: Disposable[], model: SmartArt3DModel): void {\n\tfor (const c of model.connectors) {\n\t\tif (c.points.length < 2) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst geo = new BufferGeometry().setFromPoints(c.points.map((p) => new Vector3(p.x, p.y, p.z)));\n\t\tconst material = new LineBasicMaterial({\n\t\t\tcolor: new Color(c.color),\n\t\t\ttransparent: true,\n\t\t\topacity: 0.7,\n\t\t});\n\t\tgroup.add(new Line(geo, material));\n\t\tdisposables.push(geo, material);\n\t}\n}\n\n/** Remove and dispose one label entry's current plane, if any. */\nfunction clearLabel(group: Group, entry: LabelEntry): void {\n\tif (entry.plane) {\n\t\tgroup.remove(entry.plane);\n\t}\n\tfor (const d of entry.disposables) {\n\t\td.dispose();\n\t}\n\tentry.plane = null;\n\tentry.disposables = [];\n}\n\n/**\n * Build a `THREE.Group` for a SmartArt 3D model. The group is centred on the\n * origin (the model positions already are); callers add it to the scene.\n * `textStyle` is a font-style emphasis override applied to every node's\n * label (see {@link BuiltMeshGroup.setTextStyle}); emphasis is authored per\n * shape/animation-target, not per SmartArt node, so it applies uniformly.\n */\nexport function buildMeshGroup(\n\tmodel: SmartArt3DModel,\n\ttextStyle?: TextStyleAnimationDescriptor,\n): BuiltMeshGroup {\n\tconst group = new Group();\n\tconst blockDisposables: Disposable[] = [];\n\tconst labelEntries: LabelEntry[] = model.meshes.map((m) => {\n\t\taddBlock(group, blockDisposables, m);\n\t\tconst built = buildLabelPlane(m, textStyle);\n\t\tif (built) {\n\t\t\tgroup.add(built.plane);\n\t\t}\n\t\treturn { node: m, plane: built?.plane ?? null, disposables: built?.disposables ?? [] };\n\t});\n\taddConnectors(group, blockDisposables, model);\n\n\treturn {\n\t\tgroup,\n\t\tsetTextStyle(style) {\n\t\t\tfor (const entry of labelEntries) {\n\t\t\t\tclearLabel(group, entry);\n\t\t\t\tconst built = buildLabelPlane(entry.node, style);\n\t\t\t\tif (built) {\n\t\t\t\t\tgroup.add(built.plane);\n\t\t\t\t\tentry.plane = built.plane;\n\t\t\t\t\tentry.disposables = built.disposables;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tdispose() {\n\t\t\tfor (const d of blockDisposables) {\n\t\t\t\td.dispose();\n\t\t\t}\n\t\t\tfor (const entry of labelEntries) {\n\t\t\t\tclearLabel(group, entry);\n\t\t\t}\n\t\t},\n\t};\n}\n","/**\n * Three.js SmartArt renderer - vanilla scene runtime.\n *\n * Frames a {@link SmartArt3DModel} in a WebGL scene (lights, perspective\n * camera, optional OrbitControls, render loop) on a caller-provided canvas.\n * Pure vanilla three.js - no framework code - so the React, Vue, and Angular\n * bindings all mount it through a thin canvas wrapper. `three` is imported here\n * only; this module lives behind the `pptx-viewer-shared/smartart-3d` subpath so\n * it is lazily loaded and `three` stays an optional dependency.\n */\n\nimport {\n\tAmbientLight,\n\tColor,\n\tDirectionalLight,\n\tPerspectiveCamera,\n\tScene,\n\tWebGLRenderer,\n} from 'three';\nimport { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';\n\nimport type { TextStyleAnimationDescriptor } from '../render/animation-text-style-resolve';\nimport type { SmartArt3DModel } from '../render/smartart-3d-types';\nimport { buildMeshGroup } from './meshes';\n\n/** Tunables for the mounted 3D view. */\nexport interface SmartArt3DViewOptions {\n\t/** Enable OrbitControls (rotate/zoom). Default `false`. */\n\tinteractive?: boolean;\n\t/** Slowly auto-rotate the model. Default `false`. */\n\tautoRotate?: boolean;\n\t/** Solid background colour `#rrggbb`; omit for transparent. */\n\tbackground?: string;\n\t/** Device pixel-ratio cap. Default `2`. */\n\tmaxPixelRatio?: number;\n\t/** Active font-style emphasis override (bold/italic/underline/size/colour) for every node's caption. */\n\ttextStyle?: TextStyleAnimationDescriptor;\n}\n\n/** Imperative handle to a mounted SmartArt 3D view. */\nexport interface SmartArt3DHandle {\n\t/** Resize the renderer + camera to new pixel dimensions. */\n\tresize: (width: number, height: number) => void;\n\t/** Toggle interactive orbit controls at runtime. */\n\tsetInteractive: (on: boolean) => void;\n\t/** Apply (or clear) a font-style emphasis override on every node's caption. */\n\tsetTextStyle: (style: TextStyleAnimationDescriptor | undefined) => void;\n\t/** Tear down the renderer, controls, and all GPU resources. */\n\tdispose: () => void;\n}\n\nconst FOV = 42;\n\n/** A bounding sphere of the 3D content (centre + radius). */\ninterface ContentSphere {\n\tcx: number;\n\tcy: number;\n\tcz: number;\n\tradius: number;\n}\n\n/** Bounding sphere of all meshes (expanded by footprint/depth) + connectors. */\nfunction contentSphere(model: SmartArt3DModel): ContentSphere {\n\tlet minX = Infinity;\n\tlet minY = Infinity;\n\tlet minZ = Infinity;\n\tlet maxX = -Infinity;\n\tlet maxY = -Infinity;\n\tlet maxZ = -Infinity;\n\tconst expand = (x: number, y: number, z: number, r: number): void => {\n\t\tminX = Math.min(minX, x - r);\n\t\tminY = Math.min(minY, y - r);\n\t\tminZ = Math.min(minZ, z - r);\n\t\tmaxX = Math.max(maxX, x + r);\n\t\tmaxY = Math.max(maxY, y + r);\n\t\tmaxZ = Math.max(maxZ, z + r);\n\t};\n\tfor (const m of model.meshes) {\n\t\tconst r = Math.max(m.halfWidth, m.halfHeight) + m.depth + m.bevel;\n\t\texpand(m.position.x, m.position.y, m.position.z, r);\n\t}\n\tfor (const c of model.connectors) {\n\t\tfor (const p of c.points) {\n\t\t\texpand(p.x, p.y, p.z, 1);\n\t\t}\n\t}\n\tif (!Number.isFinite(minX)) {\n\t\tconst fallback = Math.max(model.bounds.width, model.bounds.height) / 2 || 1;\n\t\treturn { cx: 0, cy: 0, cz: 0, radius: fallback };\n\t}\n\treturn {\n\t\tcx: (minX + maxX) / 2,\n\t\tcy: (minY + maxY) / 2,\n\t\tcz: (minZ + maxZ) / 2,\n\t\tradius: 0.5 * Math.hypot(maxX - minX, maxY - minY, maxZ - minZ) || 1,\n\t};\n}\n\n/** Camera distance that frames a bounding sphere of `radius` at the given FOV. */\nfunction frameDistance(radius: number, aspect: number): number {\n\tconst vFov = (FOV * Math.PI) / 180;\n\tconst hFov = 2 * Math.atan(Math.tan(vFov / 2) * aspect);\n\tconst minFov = Math.min(vFov, hFov);\n\treturn (radius / Math.sin(minFov / 2)) * 1.1;\n}\n\n/**\n * Mount a SmartArt 3D model onto a canvas and start rendering.\n *\n * @returns a handle for resizing, toggling interactivity, and disposal.\n */\nexport function mountSmartArt3D(\n\tcanvas: HTMLCanvasElement,\n\tmodel: SmartArt3DModel,\n\twidth: number,\n\theight: number,\n\toptions: SmartArt3DViewOptions = {},\n): SmartArt3DHandle {\n\tconst renderer = new WebGLRenderer({ canvas, antialias: true, alpha: !options.background });\n\trenderer.setPixelRatio(\n\t\tMath.min(\n\t\t\ttypeof window === 'undefined' ? 1 : window.devicePixelRatio || 1,\n\t\t\toptions.maxPixelRatio ?? 2,\n\t\t),\n\t);\n\trenderer.setSize(width, height, false);\n\n\tconst scene = new Scene();\n\tif (options.background) {\n\t\tscene.background = new Color(options.background);\n\t}\n\n\tconst { cx, cy, cz, radius } = contentSphere(model);\n\tconst aspect = width / Math.max(1, height);\n\tconst dist = frameDistance(radius, aspect);\n\n\tconst camera = new PerspectiveCamera(FOV, aspect, 0.1, dist * 8 + radius * 4);\n\t// A slight elevation + offset gives the extrusion/spatial depth a readable\n\t// three-quarter presence, framing the content's own centroid.\n\tcamera.position.set(cx + radius * 0.25, cy + radius * 0.3, cz + dist);\n\tcamera.lookAt(cx, cy, cz);\n\n\tscene.add(new AmbientLight(0xffffff, 0.62));\n\tconst key = new DirectionalLight(0xffffff, 0.95);\n\tkey.position.set(cx + radius, cy + radius * 1.4, cz + dist);\n\tscene.add(key);\n\tconst fill = new DirectionalLight(0xffffff, 0.3);\n\tfill.position.set(cx - radius, cy - radius * 0.6, cz + dist * 0.6);\n\tscene.add(fill);\n\n\tconst built = buildMeshGroup(model, options.textStyle);\n\tscene.add(built.group);\n\n\tlet controls: OrbitControls | null = null;\n\tconst enableControls = (on: boolean): void => {\n\t\tif (on && !controls) {\n\t\t\tcontrols = new OrbitControls(camera, canvas);\n\t\t\tcontrols.enablePan = false;\n\t\t\tcontrols.target.set(cx, cy, cz);\n\t\t\tcontrols.minDistance = dist * 0.4;\n\t\t\tcontrols.maxDistance = dist * 3;\n\t\t\tcontrols.update();\n\t\t} else if (!on && controls) {\n\t\t\tcontrols.dispose();\n\t\t\tcontrols = null;\n\t\t}\n\t\tif (controls) {\n\t\t\tcontrols.autoRotate = Boolean(options.autoRotate);\n\t\t\tcontrols.autoRotateSpeed = 1.2;\n\t\t}\n\t};\n\tenableControls(Boolean(options.interactive));\n\n\tlet frame = 0;\n\tlet disposed = false;\n\tconst renderLoop = (): void => {\n\t\tif (disposed) {\n\t\t\treturn;\n\t\t}\n\t\tframe = requestAnimationFrame(renderLoop);\n\t\tcontrols?.update();\n\t\trenderer.render(scene, camera);\n\t};\n\tframe = requestAnimationFrame(renderLoop);\n\n\treturn {\n\t\tresize(w: number, h: number) {\n\t\t\tcamera.aspect = w / Math.max(1, h);\n\t\t\tcamera.updateProjectionMatrix();\n\t\t\trenderer.setSize(w, h, false);\n\t\t},\n\t\tsetInteractive(on: boolean) {\n\t\t\tenableControls(on);\n\t\t},\n\t\tsetTextStyle(style: TextStyleAnimationDescriptor | undefined) {\n\t\t\tbuilt.setTextStyle(style);\n\t\t},\n\t\tdispose() {\n\t\t\tdisposed = true;\n\t\t\tcancelAnimationFrame(frame);\n\t\t\tcontrols?.dispose();\n\t\t\tbuilt.dispose();\n\t\t\trenderer.dispose();\n\t\t},\n\t};\n}\n","/**\n * `pptx-viewer-shared/smartart-3d` - vanilla three.js SmartArt scene runtime.\n *\n * Lazily imported by each binding's SmartArt 3D wrapper so `three` stays an\n * optional dependency: when it is not installed the dynamic import rejects and\n * the binding falls back to the SVG `SmartArtRenderer`. The pure model builder\n * (`buildSmartArt3DModel`) and its types live in the main barrel\n * (`pptx-viewer-shared`) and should be imported from there directly.\n */\n\nexport { mountSmartArt3D } from './scene';\nexport type { SmartArt3DHandle, SmartArt3DViewOptions } from './scene';\nexport type {\n\tSmartArt3DModel,\n\tSmartArt3DModelOptions,\n\tSmartArt3DMesh,\n\tSmartArt3DConnector,\n} from '../render/smartart-3d-types';\n"],"names":[],"mappings":"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"}