pptx-react-viewer 1.0.10 → 1.0.12

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 (28) hide show
  1. package/README.md +68 -0
  2. package/dist/{PowerPointViewer-K2URyPlJ.d.mts → PowerPointViewer-DtLlYf0r.d.mts} +47 -2
  3. package/dist/{PowerPointViewer-K2URyPlJ.d.ts → PowerPointViewer-DtLlYf0r.d.ts} +47 -2
  4. package/dist/index.d.mts +2 -2
  5. package/dist/index.d.ts +2 -2
  6. package/dist/index.js +3171 -915
  7. package/dist/index.mjs +3172 -916
  8. package/dist/pptx-viewer.css +1 -1
  9. package/dist/viewer/index.d.mts +18 -4
  10. package/dist/viewer/index.d.ts +18 -4
  11. package/dist/viewer/index.js +3579 -1298
  12. package/dist/viewer/index.mjs +3580 -1300
  13. package/node_modules/emf-converter/package.json +1 -1
  14. package/node_modules/mtx-decompressor/package.json +1 -1
  15. package/node_modules/pptx-viewer-core/dist/{SvgExporter-DqcmwxFu.d.mts → SvgExporter-B4-1_Hjp.d.mts} +1 -1
  16. package/node_modules/pptx-viewer-core/dist/{SvgExporter-BZJguJbp.d.ts → SvgExporter-CPr1npgo.d.ts} +1 -1
  17. package/node_modules/pptx-viewer-core/dist/cli/index.d.mts +2 -2
  18. package/node_modules/pptx-viewer-core/dist/cli/index.d.ts +2 -2
  19. package/node_modules/pptx-viewer-core/dist/converter/index.d.mts +3 -3
  20. package/node_modules/pptx-viewer-core/dist/converter/index.d.ts +3 -3
  21. package/node_modules/pptx-viewer-core/dist/index.d.mts +5 -5
  22. package/node_modules/pptx-viewer-core/dist/index.d.ts +5 -5
  23. package/node_modules/pptx-viewer-core/dist/{presentation-Bo7cMMCe.d.mts → presentation-DgkIYhXo.d.mts} +6 -0
  24. package/node_modules/pptx-viewer-core/dist/{presentation-Bo7cMMCe.d.ts → presentation-DgkIYhXo.d.ts} +6 -0
  25. package/node_modules/pptx-viewer-core/dist/{text-operations-D0f1jred.d.ts → text-operations-B6U6XxWt.d.ts} +1 -1
  26. package/node_modules/pptx-viewer-core/dist/{text-operations-Bo-WG-Z8.d.mts → text-operations-dYKZp3zE.d.mts} +1 -1
  27. package/node_modules/pptx-viewer-core/package.json +1 -1
  28. package/package.json +4 -4
package/README.md CHANGED
@@ -40,6 +40,9 @@ A full-featured **React** component for viewing, editing, and presenting PowerPo
40
40
  - [Hooks Reference](#hooks-reference)
41
41
  - [Utility Modules Reference](#utility-modules-reference)
42
42
  - [File Structure Reference](#file-structure-reference)
43
+ - [Localization (i18n)](#localization-i18n)
44
+ - [Setup](#setup)
45
+ - [How it works](#how-it-works)
43
46
  - [Limitations](#limitations)
44
47
 
45
48
  ---
@@ -767,6 +770,71 @@ src/
767
770
 
768
771
  ---
769
772
 
773
+ ## Localization (i18n)
774
+
775
+ The viewer uses [i18next](https://www.i18next.com/) with [react-i18next](https://react.i18next.com/) for UI labels. Components call `useTranslation()` and look up dotted keys such as `t('pptx.statusBar.allSaved')`.
776
+
777
+ ### Setup
778
+
779
+ Initialise an i18next instance with your translations and wrap your app in the `I18nextProvider` (or call `i18next.init()` before rendering). The demo app (`demo/i18n.ts`) shows a minimal configuration:
780
+
781
+ ```ts
782
+ import { createInstance } from 'i18next';
783
+ import { initReactI18next } from 'react-i18next';
784
+
785
+ const i18n = createInstance();
786
+
787
+ i18n.use(initReactI18next).init({
788
+ resources: {
789
+ en: {
790
+ translation: {
791
+ 'pptx.statusBar.allSaved': 'All saved',
792
+ 'pptx.sections.addSlide': 'Add Slide',
793
+ 'pptx.notes.clickToAddNotes': 'Click to add notes',
794
+ // ... see demo/i18n.ts for the full key list
795
+ },
796
+ },
797
+ },
798
+ lng: 'en',
799
+ fallbackLng: 'en',
800
+ interpolation: { escapeValue: false },
801
+ // Optional: derive display text from dotted keys for undefined keys
802
+ parseMissingKeyHandler: (key) => {
803
+ const last = key.split('.').pop() ?? key;
804
+ return last.replace(/([a-z])([A-Z])/g, '$1 $2').replace(/^./, (c) => c.toUpperCase());
805
+ },
806
+ });
807
+ ```
808
+
809
+ To add a new language, add a resource bundle under its language code (e.g. `fr`, `de`) and set `lng` accordingly.
810
+
811
+ ### How it works
812
+
813
+ Translation keys follow the pattern `pptx.<area>.<label>` (e.g. `pptx.slideSorter.zoomIn`, `pptx.comments.addComment`). The demo configures a `parseMissingKeyHandler` that converts any undefined key into a Title Case label automatically, so components can reference keys that are not explicitly listed and still render sensible English text.
814
+
815
+ Key namespaces currently in use:
816
+
817
+ | Namespace | Examples |
818
+ | ----------------------- | ---------------------------------------------- |
819
+ | `pptx.statusBar.*` | `allSaved`, `unsavedChanges` |
820
+ | `pptx.autosave.*` | `saving`, `saved`, `error` |
821
+ | `pptx.sections.*` | `addSlide`, `addSection`, `rename`, `delete` |
822
+ | `pptx.notes.*` | `slideN`, `clickToAddNotes`, `noNotes` |
823
+ | `pptx.slideSorter.*` | `zoomIn`, `zoomOut`, `close` |
824
+ | `pptx.grid.*` | `toggleGrid`, `snapToGrid` |
825
+ | `pptx.field.*` | `insertField`, `slideNumber`, `dateTime` |
826
+ | `pptx.master.*` | `layout`, `noMasters` |
827
+ | `pptx.export.*` | `processing`, `cancel` |
828
+ | `pptx.versionHistory.*` | `restore`, `noVersions` |
829
+ | `pptx.presenter.*` | `speakerNotes`, `nextSlidePreview` |
830
+ | `pptx.presentation.*` | `pen`, `highlighter`, `eraser`, `laserPointer` |
831
+ | `pptx.selectionPane.*` | `show`, `hide`, `close` |
832
+ | `pptx.inspector.*` | `element`, `noSlideSelected` |
833
+ | `pptx.comments.*` | `addComment`, `noComments` |
834
+ | `pptx.encryptedFile.*` | `title`, `message`, `instructions` |
835
+
836
+ ---
837
+
770
838
  ## Limitations
771
839
 
772
840
  - **CSS-based rendering** -- Slides are rendered as HTML/CSS rather than Canvas, which gives sharp text at any zoom, native accessibility, and DOM interactivity. The tradeoff is that some visual effects are approximated: `backdrop-filter` is replaced with semi-transparent backgrounds, `mix-blend-mode` is mapped to opacity fallbacks, and CSS 3D transforms (rotateX/Y) are flattened to 2D. Path gradients are approximated as elliptical radials.
@@ -264,6 +264,8 @@ interface ViewerTheme {
264
264
  * `CollaborationProvider` and wires up presence tracking, remote cursors,
265
265
  * and CRDT-based state synchronisation.
266
266
  */
267
+ /** Role of a user within a collaboration or broadcast session. */
268
+ type CollaborationRole = 'collaborator' | 'broadcaster' | 'viewer';
267
269
  interface CollaborationConfig {
268
270
  /** Unique identifier for the collaboration room (alphanumeric, hyphens, underscores). */
269
271
  roomId: string;
@@ -277,6 +279,8 @@ interface CollaborationConfig {
277
279
  userColor?: string;
278
280
  /** Optional authentication token sent with the WebSocket handshake. */
279
281
  authToken?: string;
282
+ /** Role in the session — defaults to `'collaborator'`. */
283
+ role?: CollaborationRole;
280
284
  }
281
285
  /** Connection lifecycle states for the Yjs WebSocket provider. */
282
286
  type ConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'error';
@@ -303,6 +307,8 @@ interface UserPresence {
303
307
  lastUpdated: string;
304
308
  /** Optional currently selected element ID. */
305
309
  selectedElementId?: string;
310
+ /** Role in the session (broadcaster, viewer, or collaborator). */
311
+ role?: CollaborationRole;
306
312
  }
307
313
  /** Value exposed by `CollaborationContext`. */
308
314
  interface CollaborationContextValue {
@@ -316,6 +322,8 @@ interface CollaborationContextValue {
316
322
  connectedCount: number;
317
323
  /** The collaboration config that was provided. */
318
324
  config: CollaborationConfig;
325
+ /** The Yjs document (for document sync). */
326
+ doc: unknown | null;
319
327
  }
320
328
 
321
329
  /**
@@ -405,7 +413,7 @@ interface SlideSectionGroup {
405
413
  /** Alignment direction for distributing/aligning multiple selected elements on the slide. */
406
414
  type SlideAlignment = 'left' | 'center' | 'right' | 'top' | 'middle' | 'bottom';
407
415
  /** Identifies one of the ribbon-style toolbar tabs (home, insert, text, etc.). */
408
- type ToolbarSection = 'home' | 'insert' | 'text' | 'arrange' | 'draw' | 'design' | 'transitions' | 'review' | 'view';
416
+ type ToolbarSection = 'file' | 'home' | 'insert' | 'text' | 'arrange' | 'draw' | 'design' | 'transitions' | 'animations' | 'slideShow' | 'review' | 'view' | 'help';
409
417
  /** The active drawing/inking tool selected in the Draw toolbar tab. */
410
418
  type DrawingTool = 'select' | 'pen' | 'highlighter' | 'eraser' | 'freeform';
411
419
  /** A single entry in the keyboard shortcuts help panel. */
@@ -459,6 +467,11 @@ interface PowerPointViewerProps {
459
467
  canEdit?: boolean;
460
468
  /** Optional class name */
461
469
  className?: string;
470
+ /**
471
+ * Display name used as the author for comments and annotations.
472
+ * Falls back to `collaboration.userName` when collaborating, or `'You'`.
473
+ */
474
+ authorName?: string;
462
475
  /**
463
476
  * Theme configuration for customising the viewer's appearance.
464
477
  *
@@ -501,6 +514,38 @@ interface PowerPointViewerProps {
501
514
  * ```
502
515
  */
503
516
  collaboration?: CollaborationConfig;
517
+ /**
518
+ * Callback invoked when the user starts a collaboration session from the
519
+ * Share dialog. The host app should use this to set the `collaboration`
520
+ * prop with the returned config.
521
+ */
522
+ onStartCollaboration?: (config: CollaborationConfig) => void;
523
+ /**
524
+ * Callback invoked when the user stops a collaboration session from the
525
+ * Share dialog. The host app should clear the `collaboration` prop.
526
+ */
527
+ onStopCollaboration?: () => void;
528
+ /**
529
+ * Default values for the Share dialog fields. The host app should provide
530
+ * these to control the session name, user display name, and server URL.
531
+ * If omitted, the Share dialog fields will be empty and require user input.
532
+ *
533
+ * @example
534
+ * ```tsx
535
+ * <PowerPointViewer
536
+ * shareDefaults={{
537
+ * roomId: "session-abc123",
538
+ * userName: "Alice",
539
+ * serverUrl: "ws://localhost:1234",
540
+ * }}
541
+ * />
542
+ * ```
543
+ */
544
+ shareDefaults?: {
545
+ roomId?: string;
546
+ userName?: string;
547
+ serverUrl?: string;
548
+ };
504
549
  }
505
550
  interface PowerPointViewerHandle extends FileViewerHandle {
506
551
  getContent: () => Promise<Uint8Array>;
@@ -519,4 +564,4 @@ declare function getAnimationInitialStyle(preset: PptxAnimationPreset | undefine
519
564
  */
520
565
  declare const PowerPointViewer: React.ForwardRefExoticComponent<PowerPointViewerProps & React.RefAttributes<PowerPointViewerHandle>>;
521
566
 
522
- export { type AccessibilityIssue as A, type SlideSectionGroup as B, type CollaborationConfig as C, type DragState as D, type EditorHistorySnapshot as E, type FileViewerHandle as F, type SlideTransitionOption as G, type StrokeDashOption as H, type SupportedShapeType as I, type ToolbarSection as J, type ViewerMode as K, type MarqueeSelectionState as M, PowerPointViewer as P, type ResizeHandle as R, type ShapeAdjustmentDragState as S, type TableCellEditorState as T, type UserPresence as U, type ViewerThemeColors as V, type ViewerTheme as a, type PowerPointViewerHandle as b, type PowerPointViewerProps as c, type ConnectionStatus as d, type CollaborationContextValue as e, type AnimationPresetOption as f, getAnimationInitialStyle as g, type CanvasSize as h, type ConnectorArrowOption as i, type ConnectorGeometryOption as j, type ConnectorGeometryType as k, type ConnectorPathGeometry as l, type DrawingTool as m, type ElementBounds as n, type ElementClipboardPayload as o, type ElementContextMenuAction as p, type ElementContextMenuState as q, type ParsedTableCell as r, type ParsedTableData as s, type PresentationAnimationRuntime as t, type ResizeState as u, type ShapeAdjustmentHandleDescriptor as v, type ShapePreset as w, type ShapeQuickStyle as x, type ShortcutReferenceItem as y, type SlideAlignment as z };
567
+ export { type AccessibilityIssue as A, type SlideAlignment as B, type CollaborationConfig as C, type DragState as D, type EditorHistorySnapshot as E, type FileViewerHandle as F, type SlideSectionGroup as G, type SlideTransitionOption as H, type StrokeDashOption as I, type SupportedShapeType as J, type ToolbarSection as K, type ViewerMode as L, type MarqueeSelectionState as M, PowerPointViewer as P, type ResizeHandle as R, type ShapeAdjustmentDragState as S, type TableCellEditorState as T, type UserPresence as U, type ViewerThemeColors as V, type ViewerTheme as a, type PowerPointViewerHandle as b, type PowerPointViewerProps as c, type ConnectionStatus as d, type CollaborationContextValue as e, type AnimationPresetOption as f, getAnimationInitialStyle as g, type CanvasSize as h, type CollaborationRole as i, type ConnectorArrowOption as j, type ConnectorGeometryOption as k, type ConnectorGeometryType as l, type ConnectorPathGeometry as m, type DrawingTool as n, type ElementBounds as o, type ElementClipboardPayload as p, type ElementContextMenuAction as q, type ElementContextMenuState as r, type ParsedTableCell as s, type ParsedTableData as t, type PresentationAnimationRuntime as u, type ResizeState as v, type ShapeAdjustmentHandleDescriptor as w, type ShapePreset as x, type ShapeQuickStyle as y, type ShortcutReferenceItem as z };
@@ -264,6 +264,8 @@ interface ViewerTheme {
264
264
  * `CollaborationProvider` and wires up presence tracking, remote cursors,
265
265
  * and CRDT-based state synchronisation.
266
266
  */
267
+ /** Role of a user within a collaboration or broadcast session. */
268
+ type CollaborationRole = 'collaborator' | 'broadcaster' | 'viewer';
267
269
  interface CollaborationConfig {
268
270
  /** Unique identifier for the collaboration room (alphanumeric, hyphens, underscores). */
269
271
  roomId: string;
@@ -277,6 +279,8 @@ interface CollaborationConfig {
277
279
  userColor?: string;
278
280
  /** Optional authentication token sent with the WebSocket handshake. */
279
281
  authToken?: string;
282
+ /** Role in the session — defaults to `'collaborator'`. */
283
+ role?: CollaborationRole;
280
284
  }
281
285
  /** Connection lifecycle states for the Yjs WebSocket provider. */
282
286
  type ConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'error';
@@ -303,6 +307,8 @@ interface UserPresence {
303
307
  lastUpdated: string;
304
308
  /** Optional currently selected element ID. */
305
309
  selectedElementId?: string;
310
+ /** Role in the session (broadcaster, viewer, or collaborator). */
311
+ role?: CollaborationRole;
306
312
  }
307
313
  /** Value exposed by `CollaborationContext`. */
308
314
  interface CollaborationContextValue {
@@ -316,6 +322,8 @@ interface CollaborationContextValue {
316
322
  connectedCount: number;
317
323
  /** The collaboration config that was provided. */
318
324
  config: CollaborationConfig;
325
+ /** The Yjs document (for document sync). */
326
+ doc: unknown | null;
319
327
  }
320
328
 
321
329
  /**
@@ -405,7 +413,7 @@ interface SlideSectionGroup {
405
413
  /** Alignment direction for distributing/aligning multiple selected elements on the slide. */
406
414
  type SlideAlignment = 'left' | 'center' | 'right' | 'top' | 'middle' | 'bottom';
407
415
  /** Identifies one of the ribbon-style toolbar tabs (home, insert, text, etc.). */
408
- type ToolbarSection = 'home' | 'insert' | 'text' | 'arrange' | 'draw' | 'design' | 'transitions' | 'review' | 'view';
416
+ type ToolbarSection = 'file' | 'home' | 'insert' | 'text' | 'arrange' | 'draw' | 'design' | 'transitions' | 'animations' | 'slideShow' | 'review' | 'view' | 'help';
409
417
  /** The active drawing/inking tool selected in the Draw toolbar tab. */
410
418
  type DrawingTool = 'select' | 'pen' | 'highlighter' | 'eraser' | 'freeform';
411
419
  /** A single entry in the keyboard shortcuts help panel. */
@@ -459,6 +467,11 @@ interface PowerPointViewerProps {
459
467
  canEdit?: boolean;
460
468
  /** Optional class name */
461
469
  className?: string;
470
+ /**
471
+ * Display name used as the author for comments and annotations.
472
+ * Falls back to `collaboration.userName` when collaborating, or `'You'`.
473
+ */
474
+ authorName?: string;
462
475
  /**
463
476
  * Theme configuration for customising the viewer's appearance.
464
477
  *
@@ -501,6 +514,38 @@ interface PowerPointViewerProps {
501
514
  * ```
502
515
  */
503
516
  collaboration?: CollaborationConfig;
517
+ /**
518
+ * Callback invoked when the user starts a collaboration session from the
519
+ * Share dialog. The host app should use this to set the `collaboration`
520
+ * prop with the returned config.
521
+ */
522
+ onStartCollaboration?: (config: CollaborationConfig) => void;
523
+ /**
524
+ * Callback invoked when the user stops a collaboration session from the
525
+ * Share dialog. The host app should clear the `collaboration` prop.
526
+ */
527
+ onStopCollaboration?: () => void;
528
+ /**
529
+ * Default values for the Share dialog fields. The host app should provide
530
+ * these to control the session name, user display name, and server URL.
531
+ * If omitted, the Share dialog fields will be empty and require user input.
532
+ *
533
+ * @example
534
+ * ```tsx
535
+ * <PowerPointViewer
536
+ * shareDefaults={{
537
+ * roomId: "session-abc123",
538
+ * userName: "Alice",
539
+ * serverUrl: "ws://localhost:1234",
540
+ * }}
541
+ * />
542
+ * ```
543
+ */
544
+ shareDefaults?: {
545
+ roomId?: string;
546
+ userName?: string;
547
+ serverUrl?: string;
548
+ };
504
549
  }
505
550
  interface PowerPointViewerHandle extends FileViewerHandle {
506
551
  getContent: () => Promise<Uint8Array>;
@@ -519,4 +564,4 @@ declare function getAnimationInitialStyle(preset: PptxAnimationPreset | undefine
519
564
  */
520
565
  declare const PowerPointViewer: React.ForwardRefExoticComponent<PowerPointViewerProps & React.RefAttributes<PowerPointViewerHandle>>;
521
566
 
522
- export { type AccessibilityIssue as A, type SlideSectionGroup as B, type CollaborationConfig as C, type DragState as D, type EditorHistorySnapshot as E, type FileViewerHandle as F, type SlideTransitionOption as G, type StrokeDashOption as H, type SupportedShapeType as I, type ToolbarSection as J, type ViewerMode as K, type MarqueeSelectionState as M, PowerPointViewer as P, type ResizeHandle as R, type ShapeAdjustmentDragState as S, type TableCellEditorState as T, type UserPresence as U, type ViewerThemeColors as V, type ViewerTheme as a, type PowerPointViewerHandle as b, type PowerPointViewerProps as c, type ConnectionStatus as d, type CollaborationContextValue as e, type AnimationPresetOption as f, getAnimationInitialStyle as g, type CanvasSize as h, type ConnectorArrowOption as i, type ConnectorGeometryOption as j, type ConnectorGeometryType as k, type ConnectorPathGeometry as l, type DrawingTool as m, type ElementBounds as n, type ElementClipboardPayload as o, type ElementContextMenuAction as p, type ElementContextMenuState as q, type ParsedTableCell as r, type ParsedTableData as s, type PresentationAnimationRuntime as t, type ResizeState as u, type ShapeAdjustmentHandleDescriptor as v, type ShapePreset as w, type ShapeQuickStyle as x, type ShortcutReferenceItem as y, type SlideAlignment as z };
567
+ export { type AccessibilityIssue as A, type SlideAlignment as B, type CollaborationConfig as C, type DragState as D, type EditorHistorySnapshot as E, type FileViewerHandle as F, type SlideSectionGroup as G, type SlideTransitionOption as H, type StrokeDashOption as I, type SupportedShapeType as J, type ToolbarSection as K, type ViewerMode as L, type MarqueeSelectionState as M, PowerPointViewer as P, type ResizeHandle as R, type ShapeAdjustmentDragState as S, type TableCellEditorState as T, type UserPresence as U, type ViewerThemeColors as V, type ViewerTheme as a, type PowerPointViewerHandle as b, type PowerPointViewerProps as c, type ConnectionStatus as d, type CollaborationContextValue as e, type AnimationPresetOption as f, getAnimationInitialStyle as g, type CanvasSize as h, type CollaborationRole as i, type ConnectorArrowOption as j, type ConnectorGeometryOption as k, type ConnectorGeometryType as l, type ConnectorPathGeometry as m, type DrawingTool as n, type ElementBounds as o, type ElementClipboardPayload as p, type ElementContextMenuAction as q, type ElementContextMenuState as r, type ParsedTableCell as s, type ParsedTableData as t, type PresentationAnimationRuntime as u, type ResizeState as v, type ShapeAdjustmentHandleDescriptor as w, type ShapePreset as x, type ShapeQuickStyle as y, type ShortcutReferenceItem as z };
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { V as ViewerThemeColors, a as ViewerTheme } from './PowerPointViewer-K2URyPlJ.mjs';
2
- export { P as PowerPointViewer, b as PowerPointViewerHandle, c as PowerPointViewerProps, g as getAnimationInitialStyle } from './PowerPointViewer-K2URyPlJ.mjs';
1
+ import { V as ViewerThemeColors, a as ViewerTheme } from './PowerPointViewer-DtLlYf0r.mjs';
2
+ export { P as PowerPointViewer, b as PowerPointViewerHandle, c as PowerPointViewerProps, g as getAnimationInitialStyle } from './PowerPointViewer-DtLlYf0r.mjs';
3
3
  import { Options } from 'html2canvas-pro';
4
4
  import * as react_jsx_runtime from 'react/jsx-runtime';
5
5
  import 'pptx-viewer-core';
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { V as ViewerThemeColors, a as ViewerTheme } from './PowerPointViewer-K2URyPlJ.js';
2
- export { P as PowerPointViewer, b as PowerPointViewerHandle, c as PowerPointViewerProps, g as getAnimationInitialStyle } from './PowerPointViewer-K2URyPlJ.js';
1
+ import { V as ViewerThemeColors, a as ViewerTheme } from './PowerPointViewer-DtLlYf0r.js';
2
+ export { P as PowerPointViewer, b as PowerPointViewerHandle, c as PowerPointViewerProps, g as getAnimationInitialStyle } from './PowerPointViewer-DtLlYf0r.js';
3
3
  import { Options } from 'html2canvas-pro';
4
4
  import * as react_jsx_runtime from 'react/jsx-runtime';
5
5
  import 'pptx-viewer-core';