pptx-vanilla-viewer 0.1.0 → 0.1.2

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/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { n, o, m, l, P, d, e, X, p, q, r, s, t, u, v, w, x, y, z, A, B, D, E, F, G, H, J, K, L, h, i, k, j, f, g } from './presentation-CLc4eS3z.js';
2
- export { P as PptxElement, l as PptxSlide } from './presentation-CLc4eS3z.js';
1
+ import { n, o, m, P, a, e, f, X, p, q, r, s, t, u, v, w, x, y, z, A, B, D, E, F, G, H, J, K, L, i, j, l, k, g, h } from './presentation-BfnrtJV1.js';
2
+ export { a as PptxElement, P as PptxSlide } from './presentation-BfnrtJV1.js';
3
3
  import { ViewerTheme } from './theme/index.js';
4
4
  export { ViewerTheme, ViewerThemeColors, defaultCssVars, defaultRadius, defaultThemeColors, themeToCssVars, vermilionDarkTheme, vermilionLightTheme } from './theme/index.js';
5
5
  export { TranslationKey, keyToLabel, translationsEn } from 'pptx-viewer-shared/i18n';
@@ -36,9 +36,9 @@ interface PptxThemePreset {
36
36
  /** Human-readable display name. */
37
37
  name: string;
38
38
  /** The 12-colour scheme. */
39
- colorScheme: d;
39
+ colorScheme: e;
40
40
  /** Heading and body font families. */
41
- fontScheme: e;
41
+ fontScheme: f;
42
42
  }
43
43
 
44
44
  /**
@@ -89,7 +89,7 @@ type FillInput = {
89
89
  interface StrokeInput {
90
90
  color?: string;
91
91
  width?: number;
92
- dash?: h;
92
+ dash?: i;
93
93
  opacity?: number;
94
94
  join?: 'round' | 'bevel' | 'miter';
95
95
  cap?: 'flat' | 'rnd' | 'sq';
@@ -194,8 +194,8 @@ interface ChartOptions extends Partial<ElementPosition> {
194
194
  interface ConnectorOptions extends Partial<ElementPosition> {
195
195
  type?: 'straight' | 'bent' | 'curved';
196
196
  stroke?: StrokeInput;
197
- startArrow?: i;
198
- endArrow?: i;
197
+ startArrow?: j;
198
+ endArrow?: j;
199
199
  from?: {
200
200
  elementId: string;
201
201
  site: number;
@@ -230,14 +230,14 @@ type BackgroundInput = {
230
230
  source: string;
231
231
  };
232
232
  interface TransitionInput {
233
- type: j;
233
+ type: k;
234
234
  duration?: number;
235
235
  direction?: string;
236
236
  advanceAfterMs?: number;
237
237
  }
238
238
  interface AnimationInput {
239
- preset: f;
240
- trigger?: g;
239
+ preset: g;
240
+ trigger?: h;
241
241
  duration?: number;
242
242
  delay?: number;
243
243
  }
@@ -321,13 +321,13 @@ declare class SlideBuilder {
321
321
  /** Add a table to the slide. */
322
322
  addTable(input: TableInput, options?: TableOptions): this;
323
323
  /** Add a chart to the slide. */
324
- addChart(chartType: k, input: ChartInput, options?: ChartOptions): this;
324
+ addChart(chartType: l, input: ChartInput, options?: ChartOptions): this;
325
325
  /** Add a media element (video or audio) to the slide. */
326
326
  addMedia(mediaType: 'video' | 'audio', source: string, options?: MediaOptions): this;
327
327
  /** Add a group of elements to the slide. */
328
- addGroup(children: P[], options?: GroupOptions): this;
328
+ addGroup(children: a[], options?: GroupOptions): this;
329
329
  /** Add a pre-built element directly. */
330
- addElement(element: P): this;
330
+ addElement(element: a): this;
331
331
  /** Set slide background. */
332
332
  setBackground(bg: BackgroundInput): this;
333
333
  /** Set slide transition. */
@@ -376,7 +376,7 @@ declare class SlideBuilder {
376
376
  * ```
377
377
  */
378
378
  addBuilderElement(builder: {
379
- build(): P;
379
+ build(): a;
380
380
  }): this;
381
381
  /**
382
382
  * Remove an element by its ID.
@@ -410,7 +410,7 @@ declare class SlideBuilder {
410
410
  * console.log(builder.getElements().length); // 1
411
411
  * ```
412
412
  */
413
- getElements(): readonly P[];
413
+ getElements(): readonly a[];
414
414
  /**
415
415
  * Get the number of elements on this slide.
416
416
  *
@@ -440,7 +440,7 @@ declare class SlideBuilder {
440
440
  * }
441
441
  * ```
442
442
  */
443
- getLastElement(): P | undefined;
443
+ getLastElement(): a | undefined;
444
444
  /**
445
445
  * Set the slide name/title for organizational purposes.
446
446
  *
@@ -460,7 +460,7 @@ declare class SlideBuilder {
460
460
  */
461
461
  setName(name: string): this;
462
462
  /** Return the built {@link PptxSlide}. */
463
- build(): l;
463
+ build(): P;
464
464
  }
465
465
 
466
466
  /**
@@ -545,7 +545,7 @@ declare class PptxSlideBuilder {
545
545
  * @param slideValue - The slide data.
546
546
  * @param rootBuilder - The parent builder.
547
547
  */
548
- constructor(slideValue: l, rootBuilder: PptxXmlBuilder);
548
+ constructor(slideValue: P, rootBuilder: PptxXmlBuilder);
549
549
  /** Navigate to the slide's notes builder (getter). */
550
550
  get Notes(): PptxSlideNotesBuilder;
551
551
  /** Navigate to the slide's notes builder. */
@@ -553,9 +553,9 @@ declare class PptxSlideBuilder {
553
553
  /** Navigate to the slide's elements builder. */
554
554
  elements(): PptxSlideElementsBuilder;
555
555
  /** Return the underlying slide data. */
556
- project(): l;
556
+ project(): P;
557
557
  /** Pascal-case alias for {@link project}. */
558
- Project(): l;
558
+ Project(): P;
559
559
  /** Navigate back to the root builder. */
560
560
  done(): PptxXmlBuilder;
561
561
  /** Pascal-case alias for {@link done}. */
@@ -572,13 +572,13 @@ declare class PptxSlideElementsBuilder {
572
572
  * @param slideValue - The slide whose elements are being modified.
573
573
  * @param slideBuilder - The parent slide builder for chaining.
574
574
  */
575
- constructor(slideValue: l, slideBuilder: PptxSlideBuilder);
575
+ constructor(slideValue: P, slideBuilder: PptxSlideBuilder);
576
576
  /**
577
577
  * Append an element to the slide's element list.
578
578
  * @param element - The element to add.
579
579
  * @returns This builder for chaining.
580
580
  */
581
- add(element: P): this;
581
+ add(element: a): this;
582
582
  /**
583
583
  * Remove an element from the slide by its ID.
584
584
  * @param elementId - The ID of the element to remove.
@@ -591,9 +591,9 @@ declare class PptxSlideElementsBuilder {
591
591
  * @param updater - A function that receives the current element and returns the replacement.
592
592
  * @returns This builder for chaining.
593
593
  */
594
- updateById(elementId: string, updater: (current: P) => P): this;
594
+ updateById(elementId: string, updater: (current: a) => a): this;
595
595
  /** Return the current elements array. */
596
- project(): P[];
596
+ project(): a[];
597
597
  /** Navigate back to the slide builder. */
598
598
  done(): PptxSlideBuilder;
599
599
  }
@@ -608,7 +608,7 @@ declare class PptxSlideNotesBuilder {
608
608
  * @param slideValue - The slide whose notes are being modified.
609
609
  * @param slideBuilder - The parent slide builder for chaining.
610
610
  */
611
- constructor(slideValue: l, slideBuilder: PptxSlideBuilder);
611
+ constructor(slideValue: P, slideBuilder: PptxSlideBuilder);
612
612
  /**
613
613
  * Append text to existing notes (separated by newline).
614
614
  * @param text - The text to append.
@@ -757,10 +757,10 @@ interface IPptxHandlerRuntime {
757
757
  setTemplateBackground(path: string, backgroundColor: string | undefined): void;
758
758
  setPresentationTheme(themePath: string, applyToAllMasters?: boolean): Promise<void>;
759
759
  getTemplateBackgroundColor(path: string): string | undefined;
760
- updateThemeColorScheme(colorScheme: d): Promise<void>;
761
- updateThemeFontScheme(fontScheme: e): Promise<void>;
760
+ updateThemeColorScheme(colorScheme: e): Promise<void>;
761
+ updateThemeFontScheme(fontScheme: f): Promise<void>;
762
762
  updateThemeName(name: string): Promise<void>;
763
- applyTheme(colorScheme: d, fontScheme: e, themeName?: string): Promise<void>;
763
+ applyTheme(colorScheme: e, fontScheme: f, themeName?: string): Promise<void>;
764
764
  load(data: ArrayBuffer, options?: PptxHandlerLoadOptions): Promise<m>;
765
765
  getChartDataForGraphicFrame(slidePath: string, graphicFrame: X | undefined): Promise<p | undefined>;
766
766
  getSmartArtDataForGraphicFrame(slidePath: string, graphicFrame: X | undefined): Promise<q | undefined>;
@@ -770,8 +770,8 @@ interface IPptxHandlerRuntime {
770
770
  * Returns undefined if the file is not found.
771
771
  */
772
772
  getMediaArrayBuffer(mediaPath: string): Promise<ArrayBuffer | undefined>;
773
- save(slides: l[], options?: PptxHandlerSaveOptions): Promise<Uint8Array>;
774
- exportSlides(slides: l[], options: L): Promise<Map<number, Uint8Array>>;
773
+ save(slides: P[], options?: PptxHandlerSaveOptions): Promise<Uint8Array>;
774
+ exportSlides(slides: P[], options: L): Promise<Map<number, Uint8Array>>;
775
775
  /**
776
776
  * Get the available slide layouts for a specific slide, based on the
777
777
  * slide's master. Scans the slide master's relationships to find all
@@ -781,7 +781,7 @@ interface IPptxHandlerRuntime {
781
781
  * @param slides - Current slides array.
782
782
  * @returns Array of layout options belonging to the same slide master.
783
783
  */
784
- getAvailableLayoutsForSlide(slideIndex: number, slides: l[]): Promise<o[]>;
784
+ getAvailableLayoutsForSlide(slideIndex: number, slides: P[]): Promise<o[]>;
785
785
  /**
786
786
  * Resolve the editable template (master + layout) elements a slide
787
787
  * inherits, each carrying a `master-` / `layout-` prefixed id. Excludes
@@ -789,7 +789,7 @@ interface IPptxHandlerRuntime {
789
789
  *
790
790
  * @param slideId - The slide's archive path (`PptxSlide.id`).
791
791
  */
792
- getTemplateElementsForSlide(slideId: string): Promise<P[]>;
792
+ getTemplateElementsForSlide(slideId: string): Promise<a[]>;
793
793
  /**
794
794
  * Scan the loaded PPTX archive for all theme parts.
795
795
  */
@@ -808,7 +808,7 @@ interface IPptxHandlerRuntime {
808
808
  * @param slides - Current slides array.
809
809
  * @returns The updated slide with new layout path, name, and background.
810
810
  */
811
- applyLayoutToSlide(slideIndex: number, layoutPath: string, slides: l[]): Promise<l>;
811
+ applyLayoutToSlide(slideIndex: number, layoutPath: string, slides: P[]): Promise<P>;
812
812
  }
813
813
 
814
814
  /**
@@ -997,7 +997,7 @@ declare class PptxHandlerCore {
997
997
  * // => void — colour scheme updated in the in-memory theme XML
998
998
  * ```
999
999
  */
1000
- updateThemeColorScheme(colorScheme: d): Promise<void>;
1000
+ updateThemeColorScheme(colorScheme: e): Promise<void>;
1001
1001
  /**
1002
1002
  * Update the theme’s font scheme (heading + body typefaces).
1003
1003
  *
@@ -1012,7 +1012,7 @@ declare class PptxHandlerCore {
1012
1012
  * // => void — font scheme updated in the in-memory theme XML
1013
1013
  * ```
1014
1014
  */
1015
- updateThemeFontScheme(fontScheme: e): Promise<void>;
1015
+ updateThemeFontScheme(fontScheme: f): Promise<void>;
1016
1016
  /**
1017
1017
  * Rename the presentation theme.
1018
1018
  *
@@ -1039,7 +1039,7 @@ declare class PptxHandlerCore {
1039
1039
  * // => void — colour scheme, font scheme, and name applied atomically
1040
1040
  * ```
1041
1041
  */
1042
- applyTheme(colorScheme: d, fontScheme: e, themeName?: string): Promise<void>;
1042
+ applyTheme(colorScheme: e, fontScheme: f, themeName?: string): Promise<void>;
1043
1043
  /**
1044
1044
  * Switch the presentation's theme, updating both the underlying XML and
1045
1045
  * re-resolving all element colours in-place.
@@ -1070,7 +1070,7 @@ declare class PptxHandlerCore {
1070
1070
  * // => PptxData with all colours updated to the Ion theme
1071
1071
  * ```
1072
1072
  */
1073
- switchTheme(data: m, colorScheme: d, fontScheme?: e, themeName?: string): Promise<m>;
1073
+ switchTheme(data: m, colorScheme: e, fontScheme?: f, themeName?: string): Promise<m>;
1074
1074
  /**
1075
1075
  * Apply a built-in theme preset to the presentation.
1076
1076
  *
@@ -1155,7 +1155,7 @@ declare class PptxHandlerCore {
1155
1155
  * // => Uint8Array written to disk as a valid .pptx file
1156
1156
  * ```
1157
1157
  */
1158
- save(slides: l[], options?: PptxHandlerSaveOptions): Promise<Uint8Array>;
1158
+ save(slides: P[], options?: PptxHandlerSaveOptions): Promise<Uint8Array>;
1159
1159
  /**
1160
1160
  * Serialise slides and then encrypt the output with a password.
1161
1161
  *
@@ -1175,7 +1175,7 @@ declare class PptxHandlerCore {
1175
1175
  * // => Encrypted OLE2 file requiring password to open
1176
1176
  * ```
1177
1177
  */
1178
- saveEncrypted(slides: l[], password: string, options?: PptxHandlerSaveOptions & {
1178
+ saveEncrypted(slides: P[], password: string, options?: PptxHandlerSaveOptions & {
1179
1179
  encryption?: EncryptionOptions;
1180
1180
  }): Promise<Uint8Array>;
1181
1181
  /**
@@ -1196,7 +1196,7 @@ declare class PptxHandlerCore {
1196
1196
  * // => ["Title Slide", "Title and Content", "Blank", ...]
1197
1197
  * ```
1198
1198
  */
1199
- getAvailableLayoutsForSlide(slideIndex: number, slides: l[]): Promise<o[]>;
1199
+ getAvailableLayoutsForSlide(slideIndex: number, slides: P[]): Promise<o[]>;
1200
1200
  /**
1201
1201
  * Resolve the editable template (master + layout) elements a slide
1202
1202
  * inherits, each carrying a `master-` / `layout-` prefixed id.
@@ -1227,7 +1227,7 @@ declare class PptxHandlerCore {
1227
1227
  * }
1228
1228
  * ```
1229
1229
  */
1230
- getTemplateElementsForSlide(slideId: string): Promise<P[]>;
1230
+ getTemplateElementsForSlide(slideId: string): Promise<a[]>;
1231
1231
  /**
1232
1232
  * Apply a different layout to an existing slide.
1233
1233
  *
@@ -1253,7 +1253,7 @@ declare class PptxHandlerCore {
1253
1253
  * // => "Two Content"
1254
1254
  * ```
1255
1255
  */
1256
- applyLayoutToSlide(slideIndex: number, layoutPath: string, slides: l[]): Promise<l>;
1256
+ applyLayoutToSlide(slideIndex: number, layoutPath: string, slides: P[]): Promise<P>;
1257
1257
  /**
1258
1258
  * Scan the loaded PPTX archive for all theme parts (`ppt/theme/theme*.xml`)
1259
1259
  * and return their paths and display names.
@@ -1283,7 +1283,7 @@ declare class PptxHandlerCore {
1283
1283
  * // => Map<number, Uint8Array> — one standalone .pptx per exported slide
1284
1284
  * ```
1285
1285
  */
1286
- exportSlides(slides: l[], options: L): Promise<Map<number, Uint8Array>>;
1286
+ exportSlides(slides: P[], options: L): Promise<Map<number, Uint8Array>>;
1287
1287
  }
1288
1288
 
1289
1289
  /**
@@ -1394,8 +1394,87 @@ type TranslationMessages = Record<string, Record<string, string>>;
1394
1394
  */
1395
1395
  declare function createTranslator(locale?: string, messages?: TranslationMessages): Translator;
1396
1396
 
1397
+ /** State the panel needs to reflect: the slide to read notes from, and whether edits are allowed. */
1398
+ interface NotesPanelUpdate {
1399
+ slide: P | undefined;
1400
+ editable: boolean;
1401
+ }
1402
+ interface NotesPanel {
1403
+ el: HTMLElement;
1404
+ /**
1405
+ * Sync the panel to the given slide/editable state. The textarea's value is
1406
+ * only reseeded when the slide id actually changes (never on every render),
1407
+ * so an in-progress edit is never interrupted mid-typing.
1408
+ */
1409
+ update(update: NotesPanelUpdate): void;
1410
+ /** Expand or collapse the notes body (header stays visible either way). */
1411
+ setExpanded(expanded: boolean): void;
1412
+ }
1413
+
1414
+ interface ThumbnailRail {
1415
+ el: HTMLElement;
1416
+ /** Rebuild the rail for a new slide list (uses `renderStage` per slide). */
1417
+ render(slides: P[], canvasSize: CanvasSize, renderStage: (slide: P, scale: number) => HTMLElement): void;
1418
+ /** Highlight the active slide and scroll it into view. */
1419
+ setActive(index: number): void;
1420
+ /** Show or hide the rail. */
1421
+ setVisible(visible: boolean): void;
1422
+ }
1423
+
1424
+ interface ToolbarUpdate {
1425
+ /** Zero-based current slide index. */
1426
+ current: number;
1427
+ /** Total slide count. */
1428
+ total: number;
1429
+ /** Effective zoom percentage (100 = 1:1). */
1430
+ zoomPercent: number;
1431
+ }
1432
+ /** Editing-cluster state (Save / Undo / Redo buttons). */
1433
+ interface ToolbarEditState {
1434
+ /** Shows/hides the whole editing cluster. */
1435
+ editable: boolean;
1436
+ canUndo: boolean;
1437
+ canRedo: boolean;
1438
+ }
1439
+ interface Toolbar {
1440
+ el: HTMLElement;
1441
+ update(state: ToolbarUpdate): void;
1442
+ setEditState(state: ToolbarEditState): void;
1443
+ /** Reflect the notes panel's expanded/collapsed state on the Notes button. */
1444
+ setNotesExpanded(expanded: boolean): void;
1445
+ }
1446
+
1447
+ /** The viewer's static DOM skeleton plus the mutable overlay controls. */
1448
+ interface ViewerChrome {
1449
+ /** `.pptxv` root (focusable; keyboard navigation attaches here). */
1450
+ root: HTMLElement;
1451
+ toolbar: Toolbar | null;
1452
+ thumbnails: ThumbnailRail | null;
1453
+ /** Scrollable centring viewport around the stage. */
1454
+ viewport: HTMLElement;
1455
+ /** Box sized to `canvasSize * scale`; the rendered stage goes inside. */
1456
+ stageWrap: HTMLElement;
1457
+ /** Collapsible speaker-notes panel docked below the slide area. */
1458
+ notes: NotesPanel;
1459
+ setLoading(loading: boolean): void;
1460
+ setError(message: string | null): void;
1461
+ setEmpty(empty: boolean): void;
1462
+ setPresenting(presenting: boolean): void;
1463
+ }
1464
+
1465
+ interface PresentationController {
1466
+ /** Enter presentation mode (real Fullscreen API on the target element). */
1467
+ enter(): Promise<void>;
1468
+ /** Exit presentation mode. */
1469
+ exit(): Promise<void>;
1470
+ /** True while the target is the fullscreen element. */
1471
+ isActive(): boolean;
1472
+ /** Remove listeners. */
1473
+ dispose(): void;
1474
+ }
1475
+
1397
1476
  /** Discriminant values of the {@link PptxElement} union (`'text'`, `'chart'`, ...). */
1398
- type PptxElementType = P['type'];
1477
+ type PptxElementType = a['type'];
1399
1478
  /**
1400
1479
  * Everything an element renderer may need, passed to every renderer call.
1401
1480
  *
@@ -1407,7 +1486,7 @@ interface ElementRenderContext {
1407
1486
  /** Document used for all DOM creation. */
1408
1487
  readonly document: Document;
1409
1488
  /** The slide being rendered. */
1410
- readonly slide: l;
1489
+ readonly slide: P;
1411
1490
  /** Full slide canvas size in CSS px (elements are positioned in this space). */
1412
1491
  readonly canvasSize: CanvasSize;
1413
1492
  /**
@@ -1420,13 +1499,25 @@ interface ElementRenderContext {
1420
1499
  readonly mediaDataUrls: ReadonlyMap<string, string>;
1421
1500
  /** Shared-dictionary translator (`pptx.*` keys). */
1422
1501
  readonly t: Translator;
1502
+ /**
1503
+ * Opt-in flag: render `smartArt` elements as an extruded Three.js scene
1504
+ * instead of flat SVG (see `PptxViewerOptions.smartArt3D`). Defaults to
1505
+ * `false` when the option is unset.
1506
+ */
1507
+ readonly smartArt3D: boolean;
1508
+ /**
1509
+ * True only for the live presentation stage (real Fullscreen API active):
1510
+ * media renderers use this to autoplay once mounted, matching PowerPoint's
1511
+ * slideshow behaviour. `false` for the editor canvas and thumbnail rail.
1512
+ */
1513
+ readonly presenting: boolean;
1423
1514
  /** The registry in effect, for renderers that need to inspect it. */
1424
1515
  readonly registry: ElementRendererRegistry;
1425
1516
  /**
1426
1517
  * Render a child element through the registry (used by the group renderer
1427
1518
  * for recursion; custom renderers may nest elements the same way).
1428
1519
  */
1429
- renderElement(element: P, zIndex: number): HTMLElement | SVGElement | null;
1520
+ renderElement(element: a, zIndex: number): HTMLElement | SVGElement | null;
1430
1521
  }
1431
1522
  /**
1432
1523
  * Renders one slide element to a DOM node (or `null` to render nothing).
@@ -1439,7 +1530,7 @@ interface ElementRenderContext {
1439
1530
  * - Create all DOM via `context.document`.
1440
1531
  * - Never mutate `element` or anything on the context.
1441
1532
  */
1442
- type ElementRenderer = (element: P, zIndex: number, context: ElementRenderContext) => HTMLElement | SVGElement | null;
1533
+ type ElementRenderer = (element: a, zIndex: number, context: ElementRenderContext) => HTMLElement | SVGElement | null;
1443
1534
  /**
1444
1535
  * Registry dispatching elements to renderers by their `type` discriminant.
1445
1536
  *
@@ -1487,13 +1578,25 @@ declare function createSvgEl<K extends keyof SVGElementTagNameMap>(doc: Document
1487
1578
 
1488
1579
  interface SlideStageOptions {
1489
1580
  document: Document;
1490
- slide: l;
1581
+ slide: P;
1491
1582
  canvasSize: CanvasSize;
1492
1583
  mediaDataUrls: ReadonlyMap<string, string>;
1493
1584
  registry: ElementRendererRegistry;
1494
1585
  t: Translator;
1495
1586
  /** Scale applied via CSS transform (default 1). */
1496
1587
  scale?: number;
1588
+ /** Opt-in WebGL SmartArt renderer flag; see `PptxViewerOptions.smartArt3D`. */
1589
+ smartArt3D?: boolean;
1590
+ /** True only for the live presentation stage; see `ElementRenderContext.presenting`. */
1591
+ presenting?: boolean;
1592
+ /**
1593
+ * True only for the main (interactive) canvas, never the thumbnail rail.
1594
+ * Marks every rendered element (recursively, including group children) with
1595
+ * `data-pptx-element="true"` and the stage itself with
1596
+ * `role="region" aria-roledescription="slide"` - the framework-neutral e2e
1597
+ * test hooks the React/Vue/Angular bindings also emit. Defaults to `false`.
1598
+ */
1599
+ interactive?: boolean;
1497
1600
  }
1498
1601
  /**
1499
1602
  * Render one slide as a fixed-size stage: the resolved slide background plus
@@ -1517,6 +1620,25 @@ declare function renderSlideStage(options: SlideStageOptions): HTMLElement;
1517
1620
  */
1518
1621
  declare function createDefaultRegistry(): ElementRendererRegistry;
1519
1622
 
1623
+ /**
1624
+ * A tiny framework-free reactive store: `get` / `set(patch)` / `subscribe`.
1625
+ *
1626
+ * This is deliberately minimal (a few dozen lines, no external deps). It only
1627
+ * carries the vanilla binding's *view state*; all domain logic (parsing,
1628
+ * styles, geometry, text building) stays in `pptx-viewer-core` and
1629
+ * `pptx-viewer-shared`.
1630
+ */
1631
+ /** Listener invoked after every state change with the next and previous state. */
1632
+ type StoreListener<T> = (state: T, previous: T) => void;
1633
+ interface Store<T extends object> {
1634
+ /** Current state snapshot (do not mutate). */
1635
+ get(): T;
1636
+ /** Shallow-merge a partial patch into the state and notify subscribers. */
1637
+ set(patch: Partial<T>): void;
1638
+ /** Subscribe to state changes; returns an unsubscribe function. */
1639
+ subscribe(listener: StoreListener<T>): () => void;
1640
+ }
1641
+
1520
1642
  /** `zoom` is either an explicit scale factor (1 = 100%) or fit-to-viewport. */
1521
1643
  type ZoomLevel = number | 'fit';
1522
1644
  /**
@@ -1525,7 +1647,7 @@ type ZoomLevel = number | 'fit';
1525
1647
  */
1526
1648
  interface ViewerState {
1527
1649
  /** Parsed slides (image/media URLs already patched in by the load pipeline). */
1528
- slides: l[];
1650
+ slides: P[];
1529
1651
  /** Slide canvas size in CSS pixels. */
1530
1652
  canvasSize: CanvasSize;
1531
1653
  /** Archive-path to displayable URL map for media + poster frames. */
@@ -1551,6 +1673,32 @@ interface ViewerState {
1551
1673
  * re-renders are deferred until the gesture ends.
1552
1674
  */
1553
1675
  interactionActive: boolean;
1676
+ /**
1677
+ * True when the speaker-notes panel body is expanded. Persists across slide
1678
+ * navigation for the life of the viewer instance (in-memory only).
1679
+ */
1680
+ notesExpanded: boolean;
1681
+ }
1682
+
1683
+ interface RenderController {
1684
+ /** Re-render everything (used after a chrome rebuild). */
1685
+ renderAll(): void;
1686
+ /** Re-render the main stage + toolbar counters at the current state. */
1687
+ renderStage(): void;
1688
+ /** Rebuild the thumbnail rail from the current slide list. */
1689
+ renderThumbnails(): void;
1690
+ /** Resolve the requested zoom into a concrete scale factor. */
1691
+ effectiveScale(): number;
1692
+ }
1693
+
1694
+ /** Per-slide progress callback: `(currentSlideIndex, totalSlides)`. */
1695
+ type ExportProgress = (current: number, total: number) => void;
1696
+ /** Options for the multi-slide PDF export (progress + cooperative cancel). */
1697
+ interface ExportPdfOptions {
1698
+ /** Capture-phase progress callback: `(currentSlide, totalSlides)`. */
1699
+ onProgress?: ExportProgress;
1700
+ /** Abort the export early; the loop checks this between slides. */
1701
+ signal?: AbortSignal;
1554
1702
  }
1555
1703
 
1556
1704
  /**
@@ -1627,6 +1775,15 @@ interface PptxViewerOptions extends PptxViewerCallbacks {
1627
1775
  * override element renderers.
1628
1776
  */
1629
1777
  registry?: ElementRendererRegistry;
1778
+ /**
1779
+ * Opt-in WebGL SmartArt renderer (default `false`): renders `smartArt`
1780
+ * elements as an extruded Three.js scene instead of the flat SVG layout.
1781
+ * `three` is an optional peer dependency, lazily imported only when this is
1782
+ * `true`; when it is unavailable or the scene fails to mount, the SVG
1783
+ * renderer is used instead. Set once at construction (no runtime setter,
1784
+ * mirroring the Vue/React/Angular bindings).
1785
+ */
1786
+ smartArt3D?: boolean;
1630
1787
  }
1631
1788
  /** The viewer handle returned by `createPptxViewer`. */
1632
1789
  interface PptxViewerInstance {
@@ -1675,6 +1832,17 @@ interface PptxViewerInstance {
1675
1832
  deleteSelected(): void;
1676
1833
  /** Id of the selected element, or `null`. */
1677
1834
  getSelectedElementId(): string | null;
1835
+ /**
1836
+ * Export a slide as a PNG download (defaults to the current slide). Renders
1837
+ * the slide off-screen at scale 1 and rasterises it with `html2canvas-pro`
1838
+ * (dynamically imported), so the first call pays a one-time load cost.
1839
+ */
1840
+ exportSlidePng(index?: number): Promise<void>;
1841
+ /**
1842
+ * Export every slide as a multi-page PDF download (one slide per page).
1843
+ * `jspdf` is dynamically imported on first use.
1844
+ */
1845
+ exportPdf(options?: ExportPdfOptions): Promise<void>;
1678
1846
  /** The element-renderer registry in effect (extension point). */
1679
1847
  getRegistry(): ElementRendererRegistry;
1680
1848
  /**
@@ -1687,6 +1855,66 @@ interface PptxViewerInstance {
1687
1855
  destroy(): void;
1688
1856
  }
1689
1857
 
1858
+ /** The mutable pieces `PptxViewer` owns for one chrome mount lifecycle. */
1859
+ interface ChromeLifecycle {
1860
+ chrome: ViewerChrome;
1861
+ presentation: PresentationController;
1862
+ detachKeyboard: () => void;
1863
+ resizeObserver: ResizeObserver | null;
1864
+ appliedThemeVars: string[];
1865
+ }
1866
+ /** The subset of `PptxViewer` needed to build its `MountChromeDeps`. */
1867
+ interface ChromeHost {
1868
+ doc: Document;
1869
+ container: HTMLElement;
1870
+ t: Translator;
1871
+ options: PptxViewerOptions;
1872
+ store: Store<ViewerState>;
1873
+ renderer: RenderController;
1874
+ lifecycle: ChromeLifecycle;
1875
+ editor: {
1876
+ commitNotes(notes: string): void;
1877
+ };
1878
+ prev(): void;
1879
+ next(): void;
1880
+ zoomIn(): void;
1881
+ zoomOut(): void;
1882
+ zoomToFit(): void;
1883
+ undo(): void;
1884
+ redo(): void;
1885
+ downloadPptx(): Promise<void>;
1886
+ toggleNotes(): void;
1887
+ goToSlide(index: number): void;
1888
+ getSlideCount(): number;
1889
+ enterPresentation(): Promise<void>;
1890
+ exitPresentation(): Promise<void>;
1891
+ }
1892
+
1893
+ interface EditorController {
1894
+ /** (Re)wire listeners + overlay into the current chrome (after mount). */
1895
+ attachChrome(): void;
1896
+ detachChrome(): void;
1897
+ /** Called by the render controller after every stage render. */
1898
+ onStageRendered(): void;
1899
+ /** True while editing owns the keyboard (selection or inline editing). */
1900
+ capturesKeyboard(): boolean;
1901
+ /** Drop history/selection/dirty state (new content loaded). */
1902
+ reset(): void;
1903
+ setEditable(editable: boolean): void;
1904
+ undo(): void;
1905
+ redo(): void;
1906
+ canUndo(): boolean;
1907
+ canRedo(): boolean;
1908
+ deleteSelected(): void;
1909
+ duplicateSelected(): string | null;
1910
+ getSelectedElementId(): string | null;
1911
+ /** Commit the speaker-notes textarea's plain text onto the current slide. */
1912
+ commitNotes(notes: string): void;
1913
+ save(): Promise<Uint8Array>;
1914
+ downloadPptx(fileName?: string): Promise<void>;
1915
+ destroy(): void;
1916
+ }
1917
+
1690
1918
  /**
1691
1919
  * The zero-framework PowerPoint viewer. Construct via {@link createPptxViewer}
1692
1920
  * (or `new PptxViewer(container, options)`): builds its chrome inside
@@ -1694,30 +1922,22 @@ interface PptxViewerInstance {
1694
1922
  * tiny reactive store. All parsing lives in `pptx-viewer-core`; all pure
1695
1923
  * render logic in `pptx-viewer-shared`.
1696
1924
  */
1697
- declare class PptxViewer implements PptxViewerInstance {
1698
- private readonly container;
1699
- private readonly doc;
1700
- private readonly options;
1701
- private readonly store;
1925
+ declare class PptxViewer implements PptxViewerInstance, ChromeHost {
1926
+ readonly container: HTMLElement;
1927
+ readonly doc: Document;
1928
+ readonly options: PptxViewerOptions;
1929
+ readonly store: Store<ViewerState>;
1930
+ readonly renderer: RenderController;
1931
+ t: Translator;
1932
+ lifecycle: ChromeLifecycle;
1933
+ editor: EditorController;
1934
+ private readonly loading;
1935
+ private readonly exportLifecycle;
1702
1936
  private readonly registry;
1703
- private readonly renderer;
1704
- private t;
1705
- private chrome;
1706
- private presentation;
1707
- private detachKeyboard;
1708
- private resizeObserver;
1709
- private handler;
1710
- private blobUrls;
1711
- private appliedThemeVars;
1712
- private loadToken;
1713
1937
  private destroyed;
1714
- private editor;
1715
1938
  constructor(container: HTMLElement, options?: PptxViewerOptions);
1716
1939
  loadFile(file: Blob | ArrayBuffer | Uint8Array): Promise<void>;
1717
1940
  loadUrl(url: string): Promise<void>;
1718
- private load;
1719
- /** Dispose the previous handler + Blob URLs (before replacing or on destroy). */
1720
- private releaseLoaded;
1721
1941
  next(): void;
1722
1942
  prev(): void;
1723
1943
  goToSlide(index: number): void;
@@ -1728,6 +1948,8 @@ declare class PptxViewer implements PptxViewerInstance {
1728
1948
  zoomIn(): void;
1729
1949
  zoomOut(): void;
1730
1950
  zoomToFit(): void;
1951
+ /** Expand/collapse the speaker-notes panel; persists for the instance's life. */
1952
+ toggleNotes(): void;
1731
1953
  setTheme(theme: ViewerTheme | undefined): void;
1732
1954
  setLocale(locale: string): void;
1733
1955
  setEditable(editable: boolean): void;
@@ -1738,14 +1960,15 @@ declare class PptxViewer implements PptxViewerInstance {
1738
1960
  save(): Promise<Uint8Array>;
1739
1961
  downloadPptx(fileName?: string): Promise<void>;
1740
1962
  deleteSelected(): void;
1963
+ exportSlidePng(index?: number): Promise<void>;
1964
+ exportPdf(options?: ExportPdfOptions): Promise<void>;
1741
1965
  getSelectedElementId(): string | null;
1742
1966
  enterPresentation(): Promise<void>;
1743
1967
  exitPresentation(): Promise<void>;
1744
1968
  getRegistry(): ElementRendererRegistry;
1745
1969
  getHandler(): PptxHandler | null;
1746
1970
  destroy(): void;
1747
- private mountChrome;
1748
- private unmountChrome;
1971
+ private remountChrome;
1749
1972
  }
1750
1973
  /**
1751
1974
  * Create a PowerPoint viewer inside `container`.
@@ -1763,4 +1986,4 @@ declare function createPptxViewer(container: HTMLElement, options?: PptxViewerOp
1763
1986
  /** The complete viewer stylesheet text (for hosts that self-manage CSS). */
1764
1987
  declare function getViewerCss(): string;
1765
1988
 
1766
- export { type CssStyleMap, type ElementRenderContext, type ElementRenderer, type ElementRendererRegistry, type PptxElementType, PptxHandler, PptxViewer, type PptxViewerCallbacks, type PptxViewerInstance, type PptxViewerOptions, type PptxViewerSource, type SlideStageOptions, type TranslationMessages, type Translator, type ViewerState, type ZoomLevel, applyStyleMap, createDefaultRegistry, createEl, createElementRendererRegistry, createPptxViewer, createSvgEl, createTranslator, getViewerCss, renderSlideStage };
1989
+ export { type CssStyleMap, type ElementRenderContext, type ElementRenderer, type ElementRendererRegistry, type ExportPdfOptions, type ExportProgress, type PptxElementType, PptxHandler, PptxViewer, type PptxViewerCallbacks, type PptxViewerInstance, type PptxViewerOptions, type PptxViewerSource, type SlideStageOptions, type TranslationMessages, type Translator, type ViewerState, type ZoomLevel, applyStyleMap, createDefaultRegistry, createEl, createElementRendererRegistry, createPptxViewer, createSvgEl, createTranslator, getViewerCss, renderSlideStage };