pptx-svelte-viewer 1.3.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/CHANGELOG.md +446 -0
  2. package/README.md +175 -17
  3. package/dist/AiChatPanel-CssmoLYL.js +1110 -0
  4. package/dist/__vite-browser-external-DOmiXdGM.js +7 -0
  5. package/dist/{dist-JuzVOe21.js → dist-AHWCPEmj.js} +44997 -40276
  6. package/dist/export-DplwT6FC.js +96087 -0
  7. package/dist/i18n.d.ts +9 -7
  8. package/dist/i18n.js +1 -1
  9. package/dist/index.d.ts +6102 -4099
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +22 -22
  12. package/dist/pptx-svelte-viewer.css +1 -1
  13. package/dist/rolldown-runtime--_vEcKDh.js +29 -0
  14. package/dist/{translator-D4a_pxY4.js → translator-Ddi-liGk.js} +251 -7
  15. package/dist/viewer/ai/ai-bridge.d.ts +61 -0
  16. package/dist/viewer/ai/ai-bridge.d.ts.map +1 -0
  17. package/dist/viewer/ai/ai-history-persist.d.ts +13 -0
  18. package/dist/viewer/ai/ai-history-persist.d.ts.map +1 -0
  19. package/dist/viewer/ai/ai-log-export.d.ts +71 -0
  20. package/dist/viewer/ai/ai-log-export.d.ts.map +1 -0
  21. package/dist/viewer/ai/ai-panel-controller.svelte.d.ts +77 -0
  22. package/dist/viewer/ai/ai-panel-controller.svelte.d.ts.map +1 -0
  23. package/dist/viewer/ai/chat.svelte.d.ts +43 -0
  24. package/dist/viewer/ai/chat.svelte.d.ts.map +1 -0
  25. package/dist/viewer/ai/focus-targets.d.ts +36 -0
  26. package/dist/viewer/ai/focus-targets.d.ts.map +1 -0
  27. package/dist/viewer/ai/index.d.ts +11 -0
  28. package/dist/viewer/ai/index.d.ts.map +1 -0
  29. package/dist/viewer/collab/collaboration-deps.d.ts +23 -0
  30. package/dist/viewer/collab/collaboration-deps.d.ts.map +1 -0
  31. package/dist/viewer/collab/collaboration-remote-sync.d.ts +13 -0
  32. package/dist/viewer/collab/collaboration-remote-sync.d.ts.map +1 -1
  33. package/dist/viewer/collab/collaboration.svelte.d.ts +9 -21
  34. package/dist/viewer/collab/collaboration.svelte.d.ts.map +1 -1
  35. package/dist/viewer/collab/components/props.d.ts +12 -0
  36. package/dist/viewer/collab/components/props.d.ts.map +1 -1
  37. package/dist/viewer/collab/components/remote-selection.d.ts +29 -0
  38. package/dist/viewer/collab/components/remote-selection.d.ts.map +1 -0
  39. package/dist/viewer/collab/components/share-helpers.d.ts +7 -28
  40. package/dist/viewer/collab/components/share-helpers.d.ts.map +1 -1
  41. package/dist/viewer/collab/index.d.ts +1 -1
  42. package/dist/viewer/collab/index.d.ts.map +1 -1
  43. package/dist/viewer/components/props.d.ts +72 -2
  44. package/dist/viewer/components/props.d.ts.map +1 -1
  45. package/dist/viewer/components/ribbon/anchored-popup.d.ts +21 -0
  46. package/dist/viewer/components/ribbon/anchored-popup.d.ts.map +1 -0
  47. package/dist/viewer/components/ribbon/ribbon-types.d.ts +7 -0
  48. package/dist/viewer/components/ribbon/ribbon-types.d.ts.map +1 -1
  49. package/dist/viewer/components/typed-exports.d.ts +19 -0
  50. package/dist/viewer/components/typed-exports.d.ts.map +1 -0
  51. package/dist/viewer/editor/editor-controller-deps.d.ts +5 -0
  52. package/dist/viewer/editor/editor-controller-deps.d.ts.map +1 -1
  53. package/dist/viewer/editor/editor-slides-controller.d.ts +15 -0
  54. package/dist/viewer/editor/editor-slides-controller.d.ts.map +1 -1
  55. package/dist/viewer/editor/editor-state.svelte.d.ts +9 -0
  56. package/dist/viewer/editor/editor-state.svelte.d.ts.map +1 -1
  57. package/dist/viewer/export/export-ui.svelte.d.ts +5 -0
  58. package/dist/viewer/export/export-ui.svelte.d.ts.map +1 -1
  59. package/dist/viewer/index.d.ts +7893 -5277
  60. package/dist/viewer/index.d.ts.map +1 -1
  61. package/dist/viewer/index.js +392 -14
  62. package/dist/viewer/presentation/animation-playback-helpers.d.ts +43 -0
  63. package/dist/viewer/presentation/animation-playback-helpers.d.ts.map +1 -0
  64. package/dist/viewer/presentation/animation-playback.svelte.d.ts +50 -40
  65. package/dist/viewer/presentation/animation-playback.svelte.d.ts.map +1 -1
  66. package/dist/viewer/presentation/animation-sound.d.ts +20 -0
  67. package/dist/viewer/presentation/animation-sound.d.ts.map +1 -0
  68. package/dist/viewer/presentation/apply-animation-styles.d.ts +6 -5
  69. package/dist/viewer/presentation/apply-animation-styles.d.ts.map +1 -1
  70. package/dist/viewer/presentation/index.d.ts +2 -1
  71. package/dist/viewer/presentation/index.d.ts.map +1 -1
  72. package/dist/viewer/presentation/keyframes.d.ts +9 -0
  73. package/dist/viewer/presentation/keyframes.d.ts.map +1 -1
  74. package/dist/viewer/presentation/presentation-controller.svelte.d.ts +32 -10
  75. package/dist/viewer/presentation/presentation-controller.svelte.d.ts.map +1 -1
  76. package/dist/viewer/presentation/presentation-effects.svelte.d.ts +6 -2
  77. package/dist/viewer/presentation/presentation-effects.svelte.d.ts.map +1 -1
  78. package/dist/viewer/presentation/presentation-triggers.d.ts +18 -0
  79. package/dist/viewer/presentation/presentation-triggers.d.ts.map +1 -0
  80. package/dist/viewer/presentation/transition-overlay.d.ts +23 -0
  81. package/dist/viewer/presentation/transition-overlay.d.ts.map +1 -0
  82. package/dist/viewer/render/smartart-view.d.ts +7 -2
  83. package/dist/viewer/render/smartart-view.d.ts.map +1 -1
  84. package/dist/viewer/state/create-viewer-state-collab.svelte.d.ts +37 -0
  85. package/dist/viewer/state/create-viewer-state-collab.svelte.d.ts.map +1 -0
  86. package/dist/viewer/state/create-viewer-state-editor-ui.svelte.d.ts +42 -0
  87. package/dist/viewer/state/create-viewer-state-editor-ui.svelte.d.ts.map +1 -0
  88. package/dist/viewer/state/create-viewer-state-export-notes.svelte.d.ts +36 -0
  89. package/dist/viewer/state/create-viewer-state-export-notes.svelte.d.ts.map +1 -0
  90. package/dist/viewer/state/create-viewer-state-presentation.svelte.d.ts +30 -0
  91. package/dist/viewer/state/create-viewer-state-presentation.svelte.d.ts.map +1 -0
  92. package/dist/viewer/state/create-viewer-state-types.d.ts +134 -0
  93. package/dist/viewer/state/create-viewer-state-types.d.ts.map +1 -0
  94. package/dist/viewer/state/create-viewer-state.svelte.d.ts +30 -0
  95. package/dist/viewer/state/create-viewer-state.svelte.d.ts.map +1 -0
  96. package/dist/viewer/state/index.d.ts +2 -0
  97. package/dist/viewer/state/index.d.ts.map +1 -1
  98. package/dist/viewer/state/presentation-element-states-context.d.ts +37 -0
  99. package/dist/viewer/state/presentation-element-states-context.d.ts.map +1 -0
  100. package/dist/viewer/state/render-context.d.ts +3 -1
  101. package/dist/viewer/state/render-context.d.ts.map +1 -1
  102. package/dist/viewer/state/viewer-effects.svelte.d.ts +8 -0
  103. package/dist/viewer/state/viewer-effects.svelte.d.ts.map +1 -1
  104. package/dist/viewer/state/viewer-options-context.d.ts +10 -0
  105. package/dist/viewer/state/viewer-options-context.d.ts.map +1 -0
  106. package/dist/viewer/state/viewer-options-wiring.svelte.d.ts +31 -0
  107. package/dist/viewer/state/viewer-options-wiring.svelte.d.ts.map +1 -0
  108. package/dist/viewer/state/viewer-options.svelte.d.ts +55 -0
  109. package/dist/viewer/state/viewer-options.svelte.d.ts.map +1 -0
  110. package/dist/viewer/style/element-style.d.ts +3 -3
  111. package/dist/viewer/style/element-style.d.ts.map +1 -1
  112. package/dist/viewer/types.d.ts +16 -5
  113. package/dist/viewer/types.d.ts.map +1 -1
  114. package/dist/{y-webrtc-BdH40MC6.js → y-webrtc-BiViqyU2.js} +1079 -1101
  115. package/package.json +18 -5
  116. package/dist/export-D7pIn3W2.js +0 -38286
package/README.md CHANGED
@@ -86,27 +86,185 @@ import 'pptx-svelte-viewer/styles';
86
86
 
87
87
  ## Props
88
88
 
89
- | Prop | Type | Default | Description |
90
- | ---------------- | ------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------- |
91
- | `source` | `Uint8Array \| ArrayBuffer` | - | Raw `.pptx` bytes. |
92
- | `theme` | `ViewerTheme` | - | Color/radius/CSS-var overrides. |
93
- | `locale` | `string` | `'en'` | UI locale (see `pptx-svelte-viewer/i18n`). |
94
- | `initialSlide` | `number` | `0` | Slide shown after load (0-based). |
95
- | `showThumbnails` | `boolean` | `true` | Thumbnail sidebar. |
96
- | `showToolbar` | `boolean` | `true` | Navigation/zoom/fullscreen toolbar. |
97
- | `showNotes` | `boolean` | `true` | Speaker-notes panel and its toolbar toggle. |
98
- | `hiddenActions` | `ToolbarActionId[]` | - | Toolbar buttons/ribbon tabs to hide individually (e.g. `['share', 'broadcast']`), instead of hiding the whole toolbar. |
99
- | `editable` | `boolean` | `false` | Ribbon editing, insertion, arrange, and save. |
100
- | `smartArt3D` | `boolean` | `false` | Opt-in Three.js 3D SmartArt renderer. |
101
- | `onload` | `(d: ViewerLoadDetail) => void` | - | Fired after a presentation loads. |
102
- | `onerror` | `(message: string) => void` | - | Fired when loading fails. |
103
- | `onslidechange` | `(index: number) => void` | - | Fired when the active slide changes. |
104
- | `onnotesupdate` | `(notes: string) => void` | - | Fired when the user edits the speaker notes. |
105
- | `onchange` | `() => void` | - | Fired after every committed edit when `editable`. |
89
+ | Prop | Type | Default | Description |
90
+ | -------------------- | ------------------------------------ | ------- | ---------------------------------------------------------------------------------------------------------------------- |
91
+ | `source` | `Uint8Array \| ArrayBuffer \| null` | - | Raw `.pptx` bytes. |
92
+ | `theme` | `ViewerTheme` | - | Color/radius/CSS-var overrides. |
93
+ | `fonts` | `ViewerFontSource[]` | `[]` | Licensed font sources supplied by the host application. |
94
+ | `locale` | `string` | `'en'` | UI locale (see `pptx-svelte-viewer/i18n`). |
95
+ | `initialSlide` | `number` | `0` | Slide shown after load (0-based). |
96
+ | `showThumbnails` | `boolean` | `true` | Thumbnail sidebar. |
97
+ | `showToolbar` | `boolean` | `true` | Navigation/zoom/fullscreen toolbar. |
98
+ | `showNotes` | `boolean` | `true` | Speaker-notes panel and its toolbar toggle. |
99
+ | `hiddenActions` | `ToolbarActionId[]` | - | Toolbar buttons/ribbon tabs to hide individually (e.g. `['share', 'broadcast']`), instead of hiding the whole toolbar. |
100
+ | `editable` | `boolean` | `false` | Ribbon editing, insertion, arrange, and save. |
101
+ | `smartArt3D` | `boolean` | `false` | Opt-in Three.js 3D SmartArt renderer (needs the optional `three` peer; falls back to SVG without it). |
102
+ | `class` | `string` | - | Class applied to the root element. |
103
+ | `fileName` | `string` | - | Display name shown in the desktop title bar. |
104
+ | `autosave` | `boolean` | `false` | Debounced crash-recovery autosave to IndexedDB (requires `filePath`; fires `onautosave`). |
105
+ | `filePath` | `string` | - | IndexedDB record key for autosave; autosave is inert without it. |
106
+ | `autosaveIntervalMs` | `number` | `2000` | Autosave debounce window in milliseconds. |
107
+ | `collaboration` | `CollaborationConfig` | - | Yjs real-time collaboration config (y-websocket or serverless y-webrtc room, role). |
108
+ | `shareDefaults` | `{ roomId?, userName?, serverUrl? }` | - | Prefilled values for the Share/Broadcast dialogs. |
109
+ | `defaultThemeKey` | `string` | - | Initial File > Options > Appearance selection when no persisted preference exists. |
110
+ | `availableThemes` | `ThemeCatalogEntry[]` | - | Theme choices offered by File > Options > Appearance (defaults to the built-in catalog). |
111
+ | `onThemeChange` | `(key: string) => void` | - | Host hook for the appearance picker; when set, the host owns persisting the choice. |
112
+ | `defaultLocale` | `string` | - | Initial File > Options > Language selection when no persisted preference exists. |
113
+ | `availableLocales` | `LocaleCatalogEntry[]` | - | Locale choices offered by File > Options > Language (defaults to the registered dictionaries). |
114
+ | `onLocaleChange` | `(code: string) => void` | - | Host hook for the language picker; when set, the host owns persisting the switch. |
115
+ | `accountAuth` | `AccountAuthConfig` | - | Optional sign-in hook point for File > Account (disabled unless `enabled: true`). |
116
+
117
+ ### Callbacks
118
+
119
+ | Callback | Payload | Description |
120
+ | ---------------------- | --------------------- | -------------------------------------------------------------------------------- |
121
+ | `onload` | `ViewerLoadDetail` | Fired after a presentation loads. |
122
+ | `onerror` | `string` | Fired when loading fails (human-readable message). |
123
+ | `onslidechange` | `number` | Fired when the active slide changes (0-based). |
124
+ | `onnotesupdate` | `string` | Fired when the user edits the speaker notes; omit to render the panel read-only. |
125
+ | `onchange` | - | Fired after every committed edit when `editable`. |
126
+ | `ondirtychange` | `boolean` | Fired when the unsaved-changes flag toggles. |
127
+ | `oncontentchange` | `Uint8Array` | Fired with freshly serialised `.pptx` bytes when the content changes. |
128
+ | `onmodechange` | `string` | Fired when the viewer mode changes. |
129
+ | `onzoomchange` | `number` | Fired when the zoom level changes. |
130
+ | `onselectionchange` | `string[]` | Fired with the selected element IDs when selection changes. |
131
+ | `onslidecountchange` | `number` | Fired when the total slide count changes. |
132
+ | `onopenfile` | - | Host override for the File > Open action. |
133
+ | `onautosave` | `Uint8Array` | Fired with serialised bytes after each successful autosave. |
134
+ | `onautosavetoggle` | `boolean` | Fired when the title bar toggles AutoSave. |
135
+ | `onstartcollaboration` | `CollaborationConfig` | Fired when a collaboration session starts. |
136
+ | `onstopcollaboration` | - | Fired when a collaboration session stops. |
137
+
138
+ ## Imperative API (`bind:this`)
139
+
140
+ The component instance implements the full shared `PowerPointViewerAPI` plus
141
+ editing and export methods (the `PowerPointViewerApi` type):
142
+
143
+ ```svelte
144
+ <script lang="ts">
145
+ import { PowerPointViewer, type PowerPointViewerApi } from 'pptx-svelte-viewer';
146
+
147
+ let viewer: PowerPointViewerApi | undefined = $state();
148
+ </script>
149
+
150
+ <PowerPointViewer bind:this={viewer} {source} editable />
151
+ <button onclick={() => viewer?.undo()}>Undo</button>
152
+ ```
153
+
154
+ - **Serialisation**: `getContent()`, `save(format?)`, `downloadPptx(fileName?)`,
155
+ `downloadAs(format, fileName?)`, `packageForSharing(fileName?)`.
156
+ - **Navigation / zoom / mode**: `goTo(index)`, `goPrev()`, `goNext()`,
157
+ `getZoom()`, `setZoom(level)`, `zoomIn()`, `zoomOut()`, `zoomReset()`,
158
+ `getMode()`, `setMode(mode)`, `getActiveSlideIndex()`,
159
+ `setActiveSlideIndex(index)`, `getSlideCount()`, `isDirty()`.
160
+ - **Editing**: `undo()`, `redo()`, `canUndo()`, `canRedo()`, `deleteSelected()`,
161
+ `getSelectedElementId()`, `getSelectedElementIds()`, `selectElements(ids)`,
162
+ `clearSelection()`.
163
+ - **Slides / elements**: `getSlides()`, `getSlide(index)`, `getActiveSlide()`,
164
+ `addSlide(afterIndex?)`, `deleteSlides(indexes)`, `duplicateSlides(indexes)`,
165
+ `moveSlide(from, to)`, `toggleHideSlides(indexes)`, `getElements(slideIndex?)`,
166
+ `getElementById(id, slideIndex?)`, `updateElement(id, patch)`,
167
+ `deleteElements(ids)`, `duplicateElement(id)`.
168
+ - **Export / print**: `exportSlidePng(index?)`, `copySlideAsImage(index?)`,
169
+ `exportPdf(options?)`, `exportGif(options?)`, `exportVideo(options?)`,
170
+ `print(options?)`.
106
171
 
107
172
  See the [full docs](https://christophervr.github.io/pptx-viewer/svelte/) for
108
173
  the complete props/events contract, theming, and localization guides.
109
174
 
175
+ ### Composing a custom viewer shell
176
+
177
+ `<PowerPointViewer>` bundles the slide canvas, ribbon, thumbnail rail,
178
+ inspector, and every dialog into one component. If you only want a subset,
179
+ for example your own chrome around just the ribbon and the slide canvas,
180
+ import the pieces independently from the `pptx-svelte-viewer/viewer`
181
+ sub-path instead: `Ribbon` / `ViewerToolbar` (the full editing ribbon and the
182
+ compact read-only toolbar), `SlideCanvas` (the slide stage-holder), and
183
+ `createViewerState`, a factory that builds the same reactive controllers
184
+ (`ViewerState`, `EditorState`, `EditorController`, `CollaborationController`,
185
+ etc.) `PowerPointViewer.svelte` itself constructs, so wiring `Ribbon` /
186
+ `ViewerToolbar` to its return value mirrors the bundled component exactly.
187
+
188
+ ```svelte
189
+ <script lang="ts">
190
+ import { createViewerState, Ribbon, SlideCanvas } from 'pptx-svelte-viewer/viewer';
191
+
192
+ let source: ArrayBuffer | undefined = $state();
193
+ let rootEl: HTMLDivElement | undefined;
194
+ let stageHolderEl: HTMLDivElement | undefined;
195
+ let viewportWidth = $state(0);
196
+ let viewportHeight = $state(0);
197
+
198
+ // Must be called synchronously here, in your own shell component's
199
+ // script (not inside a callback or after an `await`): it registers
200
+ // `onMount`/`onDestroy` and Svelte context (the translator context
201
+ // `Ribbon`'s tabs and `ViewerToolbar` read via `useTranslator()`,
202
+ // among others) that only work during component initialisation.
203
+ const state = createViewerState({
204
+ getSource: () => source,
205
+ getAutosave: () => false,
206
+ getFilePath: () => undefined,
207
+ getInitialSlide: () => 0,
208
+ t: (key) => key, // or `createTranslator` from `pptx-svelte-viewer/i18n`
209
+ getSmartArt3D: () => false,
210
+ getEditable: () => true,
211
+ getStageHolderEl: () => stageHolderEl,
212
+ getRootEl: () => rootEl,
213
+ getViewportWidth: () => viewportWidth,
214
+ getViewportHeight: () => viewportHeight,
215
+ getMasterScale: () => 1,
216
+ });
217
+ </script>
218
+
219
+ <div bind:this={rootEl} class="my-custom-shell">
220
+ <Ribbon
221
+ editor={state.editor}
222
+ findReplace={state.findReplace}
223
+ canvasSize={state.loader.canvasSize}
224
+ current={state.viewer.current}
225
+ total={state.viewer.slideCount}
226
+ onprev={() => state.viewer.prev()}
227
+ onnext={() => state.viewer.next()}
228
+ onnavigateslide={(index) => state.viewer.goTo(index)}
229
+ />
230
+ <!-- ...plus whichever other `RibbonProps` fields your shell needs. -->
231
+ <div bind:clientWidth={viewportWidth} bind:clientHeight={viewportHeight}>
232
+ <SlideCanvas
233
+ slide={state.activeSlide}
234
+ canvasSize={state.loader.canvasSize}
235
+ mediaDataUrls={state.loader.mediaDataUrls}
236
+ scale={state.scale}
237
+ editingActive={state.editingActive}
238
+ onstageholder={(el) => (stageHolderEl = el ?? undefined)}
239
+ onstagepointerdown={state.controller.onStagePointerDown}
240
+ onstagepointermove={state.controller.onStagePointerMove}
241
+ />
242
+ </div>
243
+ </div>
244
+ ```
245
+
246
+ `Ribbon`'s full prop contract is the `RibbonProps` type; `ViewerToolbar`'s is
247
+ `ViewerToolbarProps`; `SlideCanvas`'s is `SlideCanvasProps` (flat/typed
248
+ props, no live state-class instances - the editing/annotation/collaboration
249
+ overlays that stack on top of the stage are passed in as `SlideCanvas`
250
+ children instead, since only the host knows which of them it needs).
251
+ `createViewerState`'s options and return value are `CreateViewerStateOptions`
252
+ and `ViewerStateBag`.
253
+
254
+ Two caveats if you go this route:
255
+
256
+ - There is no standalone "canvas-only" component that also owns the
257
+ thumbnail rail, notes panel, and inspector pane the way the bundled
258
+ viewer's `ViewerBody` does - those stay your shell's responsibility to
259
+ assemble (or reuse `ViewerBody` itself, which is not exported, since it
260
+ takes live state-class instances rather than flat props).
261
+ - `createViewerState` is a newer, lower-level extraction than the rest of
262
+ this package's public API; its exact option/return shape may still be
263
+ refined as more of the bundled component's construction gets folded into
264
+ it. `PowerPointViewer.svelte` currently keeps its own parallel inline copy
265
+ of the same wiring rather than calling `createViewerState` itself, so treat
266
+ the factory as accurate-today rather than the single source of truth yet.
267
+
110
268
  ## License
111
269
 
112
270
  Apache-2.0. See `LICENSE` and `NOTICE`.