pptx-angular-viewer 2.9.0 → 2.10.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.
@@ -2,7 +2,7 @@ import { NgStyle, NgTemplateOutlet, NgClass } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
3
  import { InjectionToken, input, output, computed, ChangeDetectionStrategy, Component, signal, Injectable, inject, DestroyRef, Injector, effect, viewChild, ElementRef, HostListener, afterNextRender, Renderer2, ViewEncapsulation, forwardRef, untracked } from '@angular/core';
4
4
  import { TranslatePipe, TranslateService, translate } from '@ngx-translate/core';
5
- import { THEME_PRESETS, guideEmuToPx, getShapeClipPath, getAdjustmentAwareClipPath, getShapeClipPathFromPreset, getCloudPathForRendering, ooxmlGradientAngleToCssDegrees, hasShapeProperties, applyDrawingColorTransforms as applyDrawingColorTransforms$1, hslToRgb as hslToRgb$1, PRESET_COLOR_MAP, isImageLikeElement, hasTextProperties, stripXmlOrderSuffix, orderedXmlKey, chartDataAddSeries, chartDataRemoveSeries, chartDataAddCategory, chartDataRemoveCategory, chartDataUpdatePoint, MIN_ELEMENT_SIZE as MIN_ELEMENT_SIZE$2, getLinkedTextBoxSegments, deriveSlideTitle, getSubstituteFontFamily, svgPathToPolygons, THEME_COLOR_SCHEME_KEYS, createBuiltinVariables, resolveCoordinate, PptxHandler, deobfuscateFont, detectFontFormat, checkMissingAltText, checkMissingSlideTitle, checkLowContrast, checkComplexTables, checkBlankSlide, checkDuplicateTitles, createChartElement, PptxMarkdownConverter, ThemePresets, formatCommentTimestamp as formatCommentTimestamp$1, EncryptedFileError, parseSignatureXml, cloneSlide as cloneSlide$1, cloneTemplateElementsBySlideId as cloneTemplateElementsBySlideId$1, cloneElement as cloneElement$1, updateSmartArtNodeText, setSmartArtNodeStyle, isInkElement, parseDataUrlToBytes, isZoomElement, SvgExporter, applyThemeToData, pptxActionToElementAction, elementActionToPptxAction, setChartTitle, setChartLegend, setChartDataLabels, setChartAxis, setChartSeriesTrendline, setChartSeriesErrorBars, setChartDataPointLabel, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointExplosion, chartDataChangeType, getOleObjectTypeLabel, addSmartArtNodeAsChild, removeSmartArtNode, promoteSmartArtNode, demoteSmartArtNode, reorderSmartArtNode, switchSmartArtLayout, SWITCHABLE_LAYOUT_TYPES, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, applyThemeOverrideToSlide, TRANSITION_VALID_DIRECTIONS, getAnimationPresetInfo } from 'pptx-viewer-core';
5
+ import { THEME_PRESETS, guideEmuToPx, getShapeClipPath, getAdjustmentAwareClipPath, getShapeClipPathFromPreset, getCloudPathForRendering, ooxmlGradientAngleToCssDegrees, hasShapeProperties, applyDrawingColorTransforms as applyDrawingColorTransforms$1, hslToRgb as hslToRgb$1, PRESET_COLOR_MAP, isImageLikeElement, hasTextProperties, stripXmlOrderSuffix, orderedXmlKey, chartDataAddSeries, chartDataRemoveSeries, chartDataAddCategory, chartDataRemoveCategory, chartDataUpdatePoint, rebuildTableStructureInRawXml, updateCellTextInRawXml, MIN_ELEMENT_SIZE as MIN_ELEMENT_SIZE$2, getLinkedTextBoxSegments, deriveSlideTitle, getSubstituteFontFamily, svgPathToPolygons, THEME_COLOR_SCHEME_KEYS, createBuiltinVariables, resolveCoordinate, PptxHandler, deobfuscateFont, detectFontFormat, checkMissingAltText, checkMissingSlideTitle, checkLowContrast, checkComplexTables, checkBlankSlide, checkDuplicateTitles, createChartElement, PptxMarkdownConverter, ThemePresets, formatCommentTimestamp as formatCommentTimestamp$1, EncryptedFileError, parseSignatureXml, cloneSlide as cloneSlide$1, cloneTemplateElementsBySlideId as cloneTemplateElementsBySlideId$1, cloneElement as cloneElement$1, updateSmartArtNodeText, setSmartArtNodeStyle, isInkElement, parseDataUrlToBytes, isZoomElement, SvgExporter, applyThemeToData, pptxActionToElementAction, elementActionToPptxAction, setChartTitle, setChartLegend, setChartDataLabels, setChartAxis, setChartSeriesTrendline, setChartSeriesErrorBars, setChartDataPointLabel, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointExplosion, chartDataChangeType, getOleObjectTypeLabel, addSmartArtNodeAsChild, removeSmartArtNode, promoteSmartArtNode, demoteSmartArtNode, reorderSmartArtNode, switchSmartArtLayout, SWITCHABLE_LAYOUT_TYPES, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, applyThemeOverrideToSlide, TRANSITION_VALID_DIRECTIONS, getAnimationPresetInfo } from 'pptx-viewer-core';
6
6
  import DOMPurify from 'dompurify';
7
7
  import { z } from 'zod';
8
8
  import * as mcp from 'pptx-viewer-mcp';
@@ -6226,6 +6226,154 @@ const EQUATION_TEMPLATES = [
6226
6226
  },
6227
6227
  ];
6228
6228
 
6229
+ /**
6230
+ * DOMPurify wrappers shared by every markup-sanitising call site (MathML/SVG
6231
+ * equation rendering, print-document/SVG assembly). DOMPurify's factory has
6232
+ * no working `sanitize` until handed a `window`, so in non-DOM contexts
6233
+ * (node-based tests, SSR without jsdom) these degrade rather than throw.
6234
+ *
6235
+ * Two degradation strategies, picked per call site by how the sanitised
6236
+ * output is used:
6237
+ * - {@link sanitizeMarkupOrRaw}: returns the untouched input outside a DOM.
6238
+ * Safe when the caller only ever renders the result in the browser (e.g.
6239
+ * `dangerouslySetInnerHTML` / `v-html`), so the fallback path never
6240
+ * reaches a real sink.
6241
+ * - {@link sanitizeMarkupOrEmpty}: returns `''` outside a DOM (fail closed).
6242
+ * Used where the sanitised string is unconditionally spliced into a
6243
+ * larger assembled document (print HTML/SVG) with no further gate, so a
6244
+ * silent pass-through of the raw, unsanitised input would defeat the
6245
+ * sanitisation entirely.
6246
+ */
6247
+ function purifyFn() {
6248
+ const purify = DOMPurify;
6249
+ return typeof purify.sanitize === 'function' ? purify.sanitize : undefined;
6250
+ }
6251
+ /** Sanitise `markup`; outside a DOM, returns the raw input unchanged. */
6252
+ function sanitizeMarkupOrRaw(markup, config) {
6253
+ const sanitize = purifyFn();
6254
+ return sanitize ? sanitize(markup, config) : markup;
6255
+ }
6256
+ /** Sanitise `markup`; outside a DOM, returns `''` (fail closed). */
6257
+ function sanitizeMarkupOrEmpty(markup, config) {
6258
+ const sanitize = purifyFn();
6259
+ return sanitize ? sanitize(markup, config) : '';
6260
+ }
6261
+
6262
+ /**
6263
+ * MathML / SVG markup sanitisation, shared by every binding's equation
6264
+ * renderer.
6265
+ *
6266
+ * Equations are converted from OOXML OMML to a MathML markup string (see
6267
+ * {@link ./omml-to-mathml}) and then injected into the DOM via the binding's
6268
+ * raw-HTML mechanism (`dangerouslySetInnerHTML` / `v-html`). To keep that
6269
+ * injection safe we run the markup through DOMPurify with the MathML + SVG
6270
+ * profiles enabled, so `<math>` / `<mfrac>` / `<msqrt>` / `<svg>` survive while
6271
+ * scriptable content is stripped.
6272
+ *
6273
+ * All five bindings consume this, Angular included: its equation renderer and
6274
+ * editor reach the DOM through `DomSanitizer.bypassSecurityTrustHtml`, which
6275
+ * turns Angular's own sanitiser OFF, so it needs this helper more than the
6276
+ * others rather than less. (An earlier note here claimed the opposite and left
6277
+ * Angular injecting unsanitised equation markup.)
6278
+ */
6279
+ /**
6280
+ * Safely sanitise a MathML/SVG markup string.
6281
+ *
6282
+ * In browser environments DOMPurify ships with `sanitize` ready to go. In
6283
+ * non-DOM contexts (node-based tests, SSR without jsdom) there is no
6284
+ * sanitizer to run, and the markup can originate from an untrusted OOXML
6285
+ * equation, so this fails closed (empty string) rather than passing raw,
6286
+ * unsanitised markup through to a caller that injects it as HTML.
6287
+ *
6288
+ * @param markup - MathML (optionally with embedded SVG) markup to sanitise.
6289
+ * @returns The sanitised markup, or `''` when no DOM sanitizer is available.
6290
+ */
6291
+ function sanitizeMathMl(markup) {
6292
+ const sanitized = sanitizeMarkupOrEmpty(markup, { USE_PROFILES: { mathMl: true, svg: true } });
6293
+ // DOMPurify's HTML parser can retain MathML descendants while dropping the
6294
+ // outer namespace-bearing <math> node. Restore that generated, constant
6295
+ // wrapper so browsers keep the fragment in the MathML rendering context.
6296
+ if (/<math(?:\s|>)/iu.test(markup) && !/<math(?:\s|>)/iu.test(sanitized) && sanitized) {
6297
+ return `<math xmlns="http://www.w3.org/1998/Math/MathML" display="inline">${sanitized}</math>`;
6298
+ }
6299
+ return sanitized;
6300
+ }
6301
+
6302
+ /**
6303
+ * `equation-compile` - the LaTeX -> OMML -> sanitised MathML pipeline that backs
6304
+ * every binding's Insert > Equation dialog.
6305
+ *
6306
+ * The three steps it chains already lived in shared
6307
+ * ({@link ./latex-to-omml}, {@link ./omml-to-mathml}, {@link ./mathml-sanitize}),
6308
+ * but each of the five bindings hand-rolled the glue that joins them, and the
6309
+ * copies had drifted: one skipped sanitisation entirely and one carried its own
6310
+ * fail-open DOMPurify wrapper. Chaining them here means the security posture and
6311
+ * the failure behaviour are decided once.
6312
+ *
6313
+ * WHY every failure collapses to an empty result instead of throwing: the editor
6314
+ * recompiles on every keystroke, so most intermediate strings are invalid LaTeX
6315
+ * (`\fra`, `\frac{`, ...). Returning `{ mathml: '', omml: {} }` is what lets the
6316
+ * dialog fall back to its "preview will appear here" placeholder and keep the
6317
+ * Insert button disabled while the user is mid-expression, with no error path.
6318
+ *
6319
+ * WHY the MathML is sanitised here rather than at each injection site: the
6320
+ * markup is fed to `dangerouslySetInnerHTML` / `v-html` / `{@html}` / raw
6321
+ * `innerHTML`, and OMML can arrive from an untrusted deck (edit mode seeds the
6322
+ * textarea from an existing equation). Sanitising at the source means a binding
6323
+ * cannot forget. {@link sanitizeMathMl} fails closed (empty) outside a DOM.
6324
+ *
6325
+ * @module render/equation-compile
6326
+ */
6327
+ /**
6328
+ * The result every failure path collapses to. Built fresh per call rather than
6329
+ * shared from a module constant: callers hand the `omml` object straight to the
6330
+ * editor as an insert payload, and a shared `{}` would let one dialog's mutation
6331
+ * leak into the next.
6332
+ */
6333
+ function emptyResult() {
6334
+ return { mathml: '', omml: {} };
6335
+ }
6336
+ /**
6337
+ * Compile a LaTeX source string into `{ mathml, omml }`.
6338
+ *
6339
+ * Never throws: empty, whitespace-only and unparseable input all yield the empty
6340
+ * result, so callers can gate their preview on `Object.keys(omml).length > 0`.
6341
+ */
6342
+ function compileLatexEquation(source) {
6343
+ const trimmed = source.trim();
6344
+ if (!trimmed) {
6345
+ return emptyResult();
6346
+ }
6347
+ try {
6348
+ const omml = convertLatexToOmml(trimmed);
6349
+ const raw = convertOmmlToMathMl(omml);
6350
+ return { mathml: raw ? sanitizeMathMl(raw) : '', omml };
6351
+ }
6352
+ catch {
6353
+ return emptyResult();
6354
+ }
6355
+ }
6356
+ /**
6357
+ * Convert a LaTeX string straight to sanitised MathML; `''` on empty input or
6358
+ * any failure. The preview-only half of {@link compileLatexEquation}, used by
6359
+ * the template tiles which never need the OMML.
6360
+ */
6361
+ function latexToMathMl(source) {
6362
+ return compileLatexEquation(source).mathml;
6363
+ }
6364
+ /**
6365
+ * Compile the shared {@link EQUATION_TEMPLATES} catalogue to MathML, index for
6366
+ * index, for the dialog's starter-formula tiles.
6367
+ *
6368
+ * Deliberately NOT memoised: `sanitizeMathMl` fails closed without a DOM, so a
6369
+ * cached result computed during SSR / module evaluation would freeze an array of
6370
+ * empty strings into a page that later hydrates in a real browser. Bindings that
6371
+ * want it computed once do so at their own component scope.
6372
+ */
6373
+ function compileEquationTemplateMathMl() {
6374
+ return EQUATION_TEMPLATES.map((tmpl) => latexToMathMl(tmpl.latex));
6375
+ }
6376
+
6229
6377
  /**
6230
6378
  * Framework-agnostic chart helpers, a focused Vue port of the React package's
6231
6379
  * `viewer/utils/chart-helpers.ts`, `chart-layout.ts`, and
@@ -17928,6 +18076,138 @@ class PresentationAnimationController {
17928
18076
  }
17929
18077
  }
17930
18078
 
18079
+ /**
18080
+ * `animation-media-playback` - the DOM half of OOXML `p:cmd` media commands.
18081
+ *
18082
+ * {@link ./animation-media-commands} recognises and parses a `p:cmd` node into a
18083
+ * {@link ParsedMediaCommand}; this module applies that verb to a real
18084
+ * `<video>` / `<audio>` node during slide-show playback.
18085
+ *
18086
+ * WHY it is shared even though it touches the DOM: only the *lookup* of the
18087
+ * target node is per-binding (React keeps a shapeId -> node registry populated
18088
+ * by its media renderer; the other four query the live stage by
18089
+ * `data-element-id`). The verb mapping itself (play / pause / stop / seek, plus
18090
+ * swallowing the promise rejection from a blocked autoplay and the
18091
+ * `InvalidStateError` from seeking a not-yet-seekable element) is identical
18092
+ * everywhere, and was copied five times before this module existed. Callers
18093
+ * inject their lookup via {@link runMediaCommand}; the common `data-element-id`
18094
+ * lookup is provided here as {@link findMediaElementByElementId}.
18095
+ *
18096
+ * @module render/animation-media-playback
18097
+ */
18098
+ /**
18099
+ * Apply a parsed media verb to a media element.
18100
+ *
18101
+ * Both side effects are deliberately guarded: `play()` returns a promise that
18102
+ * rejects when autoplay policy blocks it or the element is not ready, and
18103
+ * assigning `currentTime` throws while the element has no seekable range. A
18104
+ * slide show must not surface either as an unhandled error, so both degrade to
18105
+ * a no-op.
18106
+ *
18107
+ * @returns `true` when the verb was applied.
18108
+ */
18109
+ function applyMediaCommandVerb(el, parsed) {
18110
+ const safePlay = () => {
18111
+ void el.play().catch(() => {
18112
+ /* autoplay blocked or not ready: ignore */
18113
+ });
18114
+ };
18115
+ const safeSeek = (seconds) => {
18116
+ try {
18117
+ el.currentTime = seconds;
18118
+ }
18119
+ catch {
18120
+ /* not seekable yet: ignore */
18121
+ }
18122
+ };
18123
+ switch (parsed.verb) {
18124
+ case 'playFrom':
18125
+ safeSeek(parsed.seekSeconds ?? 0);
18126
+ safePlay();
18127
+ return true;
18128
+ case 'play':
18129
+ safePlay();
18130
+ return true;
18131
+ case 'pause':
18132
+ el.pause();
18133
+ return true;
18134
+ case 'stop':
18135
+ el.pause();
18136
+ safeSeek(0);
18137
+ return true;
18138
+ case 'togglePlay':
18139
+ if (el.paused) {
18140
+ safePlay();
18141
+ }
18142
+ else {
18143
+ el.pause();
18144
+ }
18145
+ return true;
18146
+ default:
18147
+ return false;
18148
+ }
18149
+ }
18150
+ /**
18151
+ * Find the `<video>` / `<audio>` for an element id by walking `data-element-id`
18152
+ * wrappers under `root`.
18153
+ *
18154
+ * The id may sit on the media node itself or on the wrapper a binding renders
18155
+ * around it, so both shapes are accepted. Pass the slide stage as `root` where
18156
+ * possible: the thumbnail rail and the off-screen export stage carry the same
18157
+ * element ids, and a document-wide lookup can therefore hit the wrong copy.
18158
+ *
18159
+ * Returns `undefined` outside a DOM (SSR / node tests) rather than throwing.
18160
+ */
18161
+ function findMediaElementByElementId(targetId, root) {
18162
+ if (typeof HTMLMediaElement === 'undefined') {
18163
+ return undefined;
18164
+ }
18165
+ const scope = root ?? (typeof document === 'undefined' ? null : document);
18166
+ if (!scope) {
18167
+ return undefined;
18168
+ }
18169
+ for (const wrapper of scope.querySelectorAll('[data-element-id]')) {
18170
+ if (wrapper.dataset['elementId'] !== targetId) {
18171
+ continue;
18172
+ }
18173
+ if (wrapper instanceof HTMLMediaElement) {
18174
+ return wrapper;
18175
+ }
18176
+ const media = wrapper.querySelector('video, audio');
18177
+ if (media instanceof HTMLMediaElement) {
18178
+ return media;
18179
+ }
18180
+ }
18181
+ return undefined;
18182
+ }
18183
+ /**
18184
+ * Run a timeline media command against whatever node `resolve` hands back.
18185
+ *
18186
+ * @returns `false` when the target cannot be resolved or the command string has
18187
+ * no browser mapping, so the caller can treat the step as a no-op.
18188
+ */
18189
+ function runMediaCommand(command, resolve) {
18190
+ const el = resolve(command.targetId);
18191
+ if (!el) {
18192
+ return false;
18193
+ }
18194
+ const parsed = parseMediaCommand(command.command);
18195
+ if (!parsed) {
18196
+ return false;
18197
+ }
18198
+ return applyMediaCommandVerb(el, parsed);
18199
+ }
18200
+ /**
18201
+ * Run a timeline media command against the live DOM, resolving the target by
18202
+ * `data-element-id`. The default for bindings without an element registry.
18203
+ *
18204
+ * @param frameRoot - Lazily resolves the slide stage to scope the lookup to;
18205
+ * omit to search the whole document.
18206
+ */
18207
+ function executeMediaCommandInDom(command, frameRoot) {
18208
+ return runMediaCommand(command, (targetId) => findMediaElementByElementId(targetId, frameRoot?.() ?? null));
18209
+ }
18210
+
17931
18211
  /**
17932
18212
  * `animation-preview` — pure preview-descriptor construction for the editor's
17933
18213
  * animation panel: map an editor preset (+ direction / timing) to a CSS
@@ -20836,6 +21116,200 @@ function setCellText(element, rowIndex, colIndex, text) {
20836
21116
  return { ...element, tableData: { ...tableData, rows } };
20837
21117
  }
20838
21118
 
21119
+ /**
21120
+ * Build the render model for a table element's inspector data grid.
21121
+ *
21122
+ * Rows are normalised to `colCount` cells, so a deck with ragged rows renders a
21123
+ * rectangular grid instead of dropping cells off the right-hand edge.
21124
+ *
21125
+ * @param element - The table element being inspected (not mutated).
21126
+ * @returns A fully normalised, render-ready grid model.
21127
+ *
21128
+ * @example
21129
+ * ```ts
21130
+ * const grid = buildTableDataGrid(tableElement);
21131
+ * for (const row of grid.rows) {
21132
+ * for (const cell of row.cells) {
21133
+ * // cell.rowIndex / cell.colIndex / cell.text
21134
+ * }
21135
+ * }
21136
+ * ```
21137
+ */
21138
+ function buildTableDataGrid(element) {
21139
+ const tableData = element.tableData;
21140
+ const sourceRows = tableData?.rows ?? [];
21141
+ const colCount = tableData?.columnWidths.length ?? 0;
21142
+ const colIndices = Array.from({ length: colCount }, (_unused, index) => index);
21143
+ const rows = sourceRows.map((row, rowIndex) => ({
21144
+ rowIndex,
21145
+ cells: colIndices.map((colIndex) => ({
21146
+ rowIndex,
21147
+ colIndex,
21148
+ text: row.cells[colIndex]?.text ?? '',
21149
+ })),
21150
+ }));
21151
+ return {
21152
+ rowCount: sourceRows.length,
21153
+ colCount,
21154
+ colIndices,
21155
+ rows,
21156
+ canRemoveRow: sourceRows.length > 1,
21157
+ canRemoveColumn: colCount > 1,
21158
+ };
21159
+ }
21160
+
21161
+ /**
21162
+ * Apply a pure `PptxTableData` transform to an element, returning a new element.
21163
+ *
21164
+ * Returns the element unchanged when it carries no table data or the transform
21165
+ * was a no-op (returned the same reference), so a rejected edit does not push a
21166
+ * pointless history entry.
21167
+ *
21168
+ * CRITICAL: a table parsed from a real `.pptx` keeps its graphic-frame markup in
21169
+ * `rawXml`, and BOTH the renderers and the save writer read that markup in
21170
+ * preference to `tableData` (`tableData` is only the fallback for tables created
21171
+ * programmatically via Insert > Table). So a `tableData`-only patch is invisible:
21172
+ * the canvas keeps painting the old text and the edit is dropped on save. Every
21173
+ * structural edit therefore rebuilds `rawXml` alongside it, exactly as the
21174
+ * on-canvas cell editor does.
21175
+ */
21176
+ function withTableData$1(element, transform) {
21177
+ const tableData = element.tableData;
21178
+ if (!tableData) {
21179
+ return element;
21180
+ }
21181
+ const next = transform(tableData);
21182
+ if (next === tableData) {
21183
+ return element;
21184
+ }
21185
+ const updated = { ...element, tableData: next };
21186
+ if (element.rawXml) {
21187
+ const rawXml = rebuildTableStructureInRawXml(element, next);
21188
+ if (rawXml) {
21189
+ updated.rawXml = rawXml;
21190
+ }
21191
+ }
21192
+ return updated;
21193
+ }
21194
+ /**
21195
+ * Set one cell's text, keeping `rawXml` in sync so the edit actually paints and
21196
+ * survives a save. Prefer this over the bare `setCellText` whenever the edit
21197
+ * originates from a UI surface: see the note on {@link withTableData}.
21198
+ *
21199
+ * @param element - The source table element (not mutated).
21200
+ * @param rowIndex - Zero-based row index of the cell.
21201
+ * @param colIndex - Zero-based column index of the cell.
21202
+ * @param text - New plain-text content for the cell.
21203
+ * @returns A new element with the cell text applied to both representations.
21204
+ */
21205
+ function setTableElementCellText(element, rowIndex, colIndex, text) {
21206
+ const updated = setCellText(element, rowIndex, colIndex, text);
21207
+ if (updated === element || !element.rawXml) {
21208
+ return updated;
21209
+ }
21210
+ const rawXml = updateCellTextInRawXml(element, rowIndex, colIndex, text);
21211
+ return rawXml ? { ...updated, rawXml } : updated;
21212
+ }
21213
+ /**
21214
+ * Insert a blank row above or below `rowIdx`, preserving merge spans.
21215
+ *
21216
+ * @param element - The source table element (not mutated).
21217
+ * @param rowIdx - Zero-based reference row.
21218
+ * @param position - Whether the new row goes above or below the reference row.
21219
+ * @returns A new element with the row inserted.
21220
+ */
21221
+ function insertTableElementRow(element, rowIdx, position) {
21222
+ return withTableData$1(element, (data) => insertTableRow(data, rowIdx, position));
21223
+ }
21224
+ /**
21225
+ * Remove the row at `rowIdx`, preserving merge spans. No-op on the last row.
21226
+ *
21227
+ * @param element - The source table element (not mutated).
21228
+ * @param rowIdx - Zero-based row to remove.
21229
+ * @returns A new element with the row removed.
21230
+ */
21231
+ function removeTableElementRow(element, rowIdx) {
21232
+ return withTableData$1(element, (data) => deleteTableRow(data, rowIdx));
21233
+ }
21234
+ /**
21235
+ * Insert a blank column left or right of `colIdx`, preserving merge spans.
21236
+ *
21237
+ * @param element - The source table element (not mutated).
21238
+ * @param colIdx - Zero-based reference column.
21239
+ * @param position - Whether the new column goes left or right of the reference.
21240
+ * @returns A new element with the column inserted.
21241
+ */
21242
+ function insertTableElementColumn(element, colIdx, position) {
21243
+ return withTableData$1(element, (data) => insertTableColumn(data, colIdx, position));
21244
+ }
21245
+ /**
21246
+ * Remove the column at `colIdx`, preserving merge spans. No-op on the last one.
21247
+ *
21248
+ * @param element - The source table element (not mutated).
21249
+ * @param colIdx - Zero-based column to remove.
21250
+ * @returns A new element with the column removed.
21251
+ */
21252
+ function removeTableElementColumn(element, colIdx) {
21253
+ return withTableData$1(element, (data) => deleteTableColumn(data, colIdx));
21254
+ }
21255
+ /**
21256
+ * Append a blank row after the last one.
21257
+ *
21258
+ * Clamped to index 0 so an element whose table data is empty is a no-op rather
21259
+ * than an insert at index -1.
21260
+ *
21261
+ * @param element - The source table element (not mutated).
21262
+ * @returns A new element with a trailing row.
21263
+ */
21264
+ function appendTableElementRow(element) {
21265
+ const rowCount = element.tableData?.rows.length ?? 0;
21266
+ if (rowCount === 0) {
21267
+ return element;
21268
+ }
21269
+ return insertTableElementRow(element, rowCount - 1, 'below');
21270
+ }
21271
+ /**
21272
+ * Remove the trailing row. No-op when the table has one row or none.
21273
+ *
21274
+ * @param element - The source table element (not mutated).
21275
+ * @returns A new element with the last row removed.
21276
+ */
21277
+ function removeLastTableElementRow(element) {
21278
+ const rowCount = element.tableData?.rows.length ?? 0;
21279
+ if (rowCount === 0) {
21280
+ return element;
21281
+ }
21282
+ return removeTableElementRow(element, rowCount - 1);
21283
+ }
21284
+ /**
21285
+ * Append a blank column after the last one.
21286
+ *
21287
+ * Clamped to index 0 for the same reason as {@link appendTableElementRow}.
21288
+ *
21289
+ * @param element - The source table element (not mutated).
21290
+ * @returns A new element with a trailing column.
21291
+ */
21292
+ function appendTableElementColumn(element) {
21293
+ const colCount = element.tableData?.columnWidths.length ?? 0;
21294
+ if (colCount === 0) {
21295
+ return element;
21296
+ }
21297
+ return insertTableElementColumn(element, colCount - 1, 'right');
21298
+ }
21299
+ /**
21300
+ * Remove the trailing column. No-op when the table has one column or none.
21301
+ *
21302
+ * @param element - The source table element (not mutated).
21303
+ * @returns A new element with the last column removed.
21304
+ */
21305
+ function removeLastTableElementColumn(element) {
21306
+ const colCount = element.tableData?.columnWidths.length ?? 0;
21307
+ if (colCount === 0) {
21308
+ return element;
21309
+ }
21310
+ return removeTableElementColumn(element, colCount - 1);
21311
+ }
21312
+
20839
21313
  /**
20840
21314
  * Merge the cell at `(rowIndex, columnIndex)` with the next cell to its right.
20841
21315
  * Returns the new `rows` array, or `null` when there is no mergeable neighbour.
@@ -25302,12 +25776,73 @@ function computeAutoFitTextStyle(input) {
25302
25776
  * computing which text segments should render in each box of a linked text box
25303
25777
  * chain. Framework-agnostic.
25304
25778
  */
25779
+ /**
25780
+ * Depth cap for the group walk below.
25781
+ *
25782
+ * Mirrors the loader's own `MAX_GROUP_DEPTH`: a deck can nest `p:grpSp` far
25783
+ * deeper than any human authors, and a cyclic tree assembled in memory (an
25784
+ * editor bug, a malformed collaboration patch) would otherwise recurse forever
25785
+ * during a render pass.
25786
+ */
25787
+ const MAX_GROUP_DEPTH = 64;
25305
25788
  /**
25306
25789
  * Determine whether an element participates in a linked text box chain.
25307
25790
  */
25308
25791
  function isLinkedTextBox(element) {
25309
25792
  return hasTextProperties(element) && element.linkedTxbxId !== undefined;
25310
25793
  }
25794
+ /**
25795
+ * Flatten a slide's element list so a chain's members can be found wherever
25796
+ * they sit in the shape tree.
25797
+ *
25798
+ * `a:linkedTxbx` carries an `id` that is scoped to the SLIDE PART, not to a
25799
+ * branch of the shape tree: nothing in ECMA-376 ties a chain to a single
25800
+ * `p:grpSp`, and grouping is a manipulation construct with no bearing on how
25801
+ * text flows. So chain resolution walks the whole tree, in document order, and
25802
+ * a chain works identically whether its boxes are top level, inside one group,
25803
+ * inside a nested group, or split across a group boundary. Before this walk the
25804
+ * chain builder only ever saw the top-level list, so a chain authored inside a
25805
+ * group resolved to nothing and its head painted the whole chain's text.
25806
+ *
25807
+ * Coordinate space deliberately needs no correction here. A group's children
25808
+ * are parsed with the group scale (`a:ext / a:chExt`) ALREADY baked into their
25809
+ * `width`/`height`; only `x`/`y` are rebased to be group-relative, and the
25810
+ * capacity estimate that drives the split reads size alone. Passing children
25811
+ * through untouched therefore splits a grouped chain at the same character
25812
+ * PowerPoint does, and rebasing them into slide space here would be wrong.
25813
+ *
25814
+ * Returns the input array unchanged when the slide holds no group, so the
25815
+ * common case allocates nothing.
25816
+ */
25817
+ function flattenForChainResolution(elements) {
25818
+ if (!elements.some((el) => el.type === 'group')) {
25819
+ return elements;
25820
+ }
25821
+ const flat = [];
25822
+ // Visiting each group at most once makes a cyclic tree terminate exactly,
25823
+ // and keeps a member from being collected twice: the distribution map is
25824
+ // keyed by element ID, so a duplicate would overwrite that box's slice with
25825
+ // a later one and hand it the wrong text.
25826
+ const seen = new Set();
25827
+ const walk = (list, depth) => {
25828
+ for (const el of list) {
25829
+ if (el.type !== 'group') {
25830
+ flat.push(el);
25831
+ continue;
25832
+ }
25833
+ if (seen.has(el)) {
25834
+ continue;
25835
+ }
25836
+ seen.add(el);
25837
+ flat.push(el);
25838
+ if (depth < MAX_GROUP_DEPTH) {
25839
+ walk(el.children ?? [], depth + 1);
25840
+ }
25841
+ }
25842
+ };
25843
+ walk(elements, 0);
25844
+ return flat;
25845
+ }
25311
25846
  /**
25312
25847
  * Determine whether an element is the head (seq 0) of a linked text box chain.
25313
25848
  */
@@ -25328,30 +25863,41 @@ function isLinkedTextBoxHead(element) {
25328
25863
  * its text-render site: a surface that does not (yet) thread the sibling list
25329
25864
  * down, or renders an element outside any slide, degrades to the element's own
25330
25865
  * authored segments instead of forcing a guard into each view layer.
25866
+ *
25867
+ * `slideElements` is the slide's TOP-LEVEL list in every binding, including at
25868
+ * a group child's render site, so the chain lookup flattens it first. The
25869
+ * not-a-chain guard runs before the flatten because this is a per-element,
25870
+ * per-render call and all but a handful of elements exit here.
25331
25871
  */
25332
25872
  function getOverflowSegments(element, slideElements) {
25333
25873
  if (!slideElements || slideElements.length === 0) {
25334
25874
  return undefined;
25335
25875
  }
25336
- return getLinkedTextBoxSegments(element, slideElements);
25876
+ if (!isLinkedTextBox(element)) {
25877
+ return undefined;
25878
+ }
25879
+ return getLinkedTextBoxSegments(element, flattenForChainResolution(slideElements));
25337
25880
  }
25338
25881
  /**
25339
25882
  * Build a complete segment distribution map for all linked text box chains on a
25340
25883
  * slide.
25341
25884
  *
25342
25885
  * Returns a map from element ID to the text segments that element should
25343
- * render. Elements not in any chain are not included.
25886
+ * render. Elements not in any chain are not included. Group children are
25887
+ * included: the map is keyed by element ID, which is unique slide-wide, so a
25888
+ * caller can look up a nested box without knowing where it sits.
25344
25889
  */
25345
25890
  function buildSlideOverflowMap(slideElements) {
25346
25891
  const result = new Map();
25347
- if (!slideElements.some((el) => isLinkedTextBox(el))) {
25892
+ const flat = flattenForChainResolution(slideElements);
25893
+ if (!flat.some((el) => isLinkedTextBox(el))) {
25348
25894
  return result;
25349
25895
  }
25350
- for (const el of slideElements) {
25896
+ for (const el of flat) {
25351
25897
  if (!isLinkedTextBox(el)) {
25352
25898
  continue;
25353
25899
  }
25354
- const segments = getLinkedTextBoxSegments(el, slideElements);
25900
+ const segments = getLinkedTextBoxSegments(el, flat);
25355
25901
  if (segments !== undefined) {
25356
25902
  result.set(el.id, segments);
25357
25903
  }
@@ -26417,76 +26963,6 @@ function buildRunEffectStyle(style) {
26417
26963
  return css;
26418
26964
  }
26419
26965
 
26420
- /**
26421
- * DOMPurify wrappers shared by every markup-sanitising call site (MathML/SVG
26422
- * equation rendering, print-document/SVG assembly). DOMPurify's factory has
26423
- * no working `sanitize` until handed a `window`, so in non-DOM contexts
26424
- * (node-based tests, SSR without jsdom) these degrade rather than throw.
26425
- *
26426
- * Two degradation strategies, picked per call site by how the sanitised
26427
- * output is used:
26428
- * - {@link sanitizeMarkupOrRaw}: returns the untouched input outside a DOM.
26429
- * Safe when the caller only ever renders the result in the browser (e.g.
26430
- * `dangerouslySetInnerHTML` / `v-html`), so the fallback path never
26431
- * reaches a real sink.
26432
- * - {@link sanitizeMarkupOrEmpty}: returns `''` outside a DOM (fail closed).
26433
- * Used where the sanitised string is unconditionally spliced into a
26434
- * larger assembled document (print HTML/SVG) with no further gate, so a
26435
- * silent pass-through of the raw, unsanitised input would defeat the
26436
- * sanitisation entirely.
26437
- */
26438
- function purifyFn() {
26439
- const purify = DOMPurify;
26440
- return typeof purify.sanitize === 'function' ? purify.sanitize : undefined;
26441
- }
26442
- /** Sanitise `markup`; outside a DOM, returns the raw input unchanged. */
26443
- function sanitizeMarkupOrRaw(markup, config) {
26444
- const sanitize = purifyFn();
26445
- return sanitize ? sanitize(markup, config) : markup;
26446
- }
26447
- /** Sanitise `markup`; outside a DOM, returns `''` (fail closed). */
26448
- function sanitizeMarkupOrEmpty(markup, config) {
26449
- const sanitize = purifyFn();
26450
- return sanitize ? sanitize(markup, config) : '';
26451
- }
26452
-
26453
- /**
26454
- * MathML / SVG markup sanitisation, shared by every binding's equation
26455
- * renderer.
26456
- *
26457
- * Equations are converted from OOXML OMML to a MathML markup string (see
26458
- * {@link ./omml-to-mathml}) and then injected into the DOM via the binding's
26459
- * raw-HTML mechanism (`dangerouslySetInnerHTML` / `v-html`). To keep that
26460
- * injection safe we run the markup through DOMPurify with the MathML + SVG
26461
- * profiles enabled, so `<math>` / `<mfrac>` / `<msqrt>` / `<svg>` survive while
26462
- * scriptable content is stripped.
26463
- *
26464
- * (Angular renders equations through its own `DomSanitizer`, so it does not
26465
- * consume this helper.)
26466
- */
26467
- /**
26468
- * Safely sanitise a MathML/SVG markup string.
26469
- *
26470
- * In browser environments DOMPurify ships with `sanitize` ready to go. In
26471
- * non-DOM contexts (node-based tests, SSR without jsdom) there is no
26472
- * sanitizer to run, and the markup can originate from an untrusted OOXML
26473
- * equation, so this fails closed (empty string) rather than passing raw,
26474
- * unsanitised markup through to a caller that injects it as HTML.
26475
- *
26476
- * @param markup - MathML (optionally with embedded SVG) markup to sanitise.
26477
- * @returns The sanitised markup, or `''` when no DOM sanitizer is available.
26478
- */
26479
- function sanitizeMathMl(markup) {
26480
- const sanitized = sanitizeMarkupOrEmpty(markup, { USE_PROFILES: { mathMl: true, svg: true } });
26481
- // DOMPurify's HTML parser can retain MathML descendants while dropping the
26482
- // outer namespace-bearing <math> node. Restore that generated, constant
26483
- // wrapper so browsers keep the fragment in the MathML rendering context.
26484
- if (/<math(?:\s|>)/iu.test(markup) && !/<math(?:\s|>)/iu.test(sanitized) && sanitized) {
26485
- return `<math xmlns="http://www.w3.org/1998/Math/MathML" display="inline">${sanitized}</math>`;
26486
- }
26487
- return sanitized;
26488
- }
26489
-
26490
26966
  /**
26491
26967
  * Font size (px) that a paragraph's CSS line box should be built from, or
26492
26968
  * `undefined` when the paragraph declares nothing of its own.
@@ -40607,6 +41083,191 @@ function isNavigationAction(action) {
40607
41083
  action.action === 'goto');
40608
41084
  }
40609
41085
 
41086
+ /**
41087
+ * PowerPoint's Reading View, as a framework-agnostic state machine.
41088
+ *
41089
+ * Reading View is the third of PowerPoint's presentation views, and it is the
41090
+ * one this viewer never shipped: every binding rendered the ribbon button
41091
+ * permanently disabled. It is NOT a second slide show. The distinction the
41092
+ * bindings have to preserve is:
41093
+ *
41094
+ * Normal the editor: ribbon, thumbnails, inspector, canvas chrome
41095
+ * Reading View the deck at full WINDOW size, chrome reduced to a nav bar,
41096
+ * still inside the page, no Fullscreen API, no annotation
41097
+ * tools, no presenter console
41098
+ * Slide Show the deck at full SCREEN size via the Fullscreen API, with
41099
+ * the pointer tools, blackout, rehearsal and presenter console
41100
+ *
41101
+ * Reading View therefore deliberately does not reuse the presentation-session
41102
+ * machinery. Reusing it would drag fullscreen, blackout, ink and the audience
41103
+ * window in with it, which is precisely the weight a reader asked to escape.
41104
+ * What it DOES reuse is {@link mapPresentationKey}: PowerPoint honours the same
41105
+ * navigation keys in both views, and duplicating that table per binding is how
41106
+ * five viewers drift apart.
41107
+ *
41108
+ * Everything here is pure. The bindings own the markup and the event
41109
+ * listeners; they own no navigation rules.
41110
+ *
41111
+ * @module render/reading-view
41112
+ */
41113
+ // ---------------------------------------------------------------------------
41114
+ // DOM contract
41115
+ // ---------------------------------------------------------------------------
41116
+ /**
41117
+ * Marks the reading-view root in every binding.
41118
+ *
41119
+ * A neutral data attribute rather than a class or a test id: `e2e/` addresses
41120
+ * all five viewers through one selector, and a class name is a styling decision
41121
+ * each binding is entitled to make differently.
41122
+ */
41123
+ const READING_VIEW_ATTR = 'data-pptx-reading-view';
41124
+ /** Marks the "3 / 12" slide counter inside the reading-view nav bar. */
41125
+ const READING_VIEW_COUNTER_ATTR = 'data-pptx-reading-view-counter';
41126
+ /** Marks the scaled slide surface inside the reading view. */
41127
+ const READING_VIEW_STAGE_ATTR = 'data-pptx-reading-view-stage';
41128
+ /** The reading view closed, showing nothing. */
41129
+ const CLOSED_READING_VIEW = { open: false, slideIndex: 0 };
41130
+ /**
41131
+ * Open the reading view on `slideIndex`.
41132
+ *
41133
+ * Clamped rather than validated: entering from the ribbon while the deck is
41134
+ * empty, or on a stale index after a slide was deleted, should show the first
41135
+ * slide, not throw at the user.
41136
+ */
41137
+ function openReadingView(slideIndex, slideCount) {
41138
+ return { open: true, slideIndex: clampIndex$1(slideIndex, slideCount) };
41139
+ }
41140
+ /** The reading view closed, discarding its position. */
41141
+ function closeReadingView() {
41142
+ return CLOSED_READING_VIEW;
41143
+ }
41144
+ /**
41145
+ * Translate a key press into a reading-view command.
41146
+ *
41147
+ * Delegates to the slide-show key table so the two views cannot disagree about
41148
+ * what Page Down does, then drops everything Reading View has no surface for.
41149
+ * The slide-show-only keys (pen, laser, blackout, rehearsal, "All Slides") are
41150
+ * mapped to `none` rather than silently falling through to navigation: a reader
41151
+ * pressing Ctrl+P wants their browser's print dialog, and swallowing the chord
41152
+ * to activate a pen that this view does not draw would be worse than ignoring
41153
+ * it.
41154
+ *
41155
+ * `buffer` carries PowerPoint's "type a slide number, then Enter" jump. Pass
41156
+ * one buffer for as long as the view stays open.
41157
+ */
41158
+ function mapReadingViewKey(input, buffer) {
41159
+ const mapped = mapPresentationKey(input, buffer);
41160
+ switch (mapped.action) {
41161
+ case 'next':
41162
+ return { command: 'next' };
41163
+ case 'previous':
41164
+ return { command: 'previous' };
41165
+ case 'first':
41166
+ return { command: 'first' };
41167
+ case 'last':
41168
+ return { command: 'last' };
41169
+ case 'goto':
41170
+ // The key table speaks in 1-based slide numbers, the state in indexes.
41171
+ return { command: 'goto', slideIndex: mapped.slideNumber - 1 };
41172
+ case 'end':
41173
+ return { command: 'exit' };
41174
+ default:
41175
+ return { command: 'none' };
41176
+ }
41177
+ }
41178
+ /**
41179
+ * Decide how to treat one key press while the reading view is open.
41180
+ *
41181
+ * Modifier chords are deliberately let through untouched: Ctrl+P must still
41182
+ * reach the browser's print dialog and F12 its dev tools. Everything else is
41183
+ * swallowed, because Reading View is modal over the editor and a bare Delete
41184
+ * arriving at the canvas underneath would destroy a shape the reader cannot
41185
+ * even see.
41186
+ */
41187
+ function handleReadingViewKey(input, buffer) {
41188
+ const command = mapReadingViewKey(input, buffer);
41189
+ if (command.command !== 'none') {
41190
+ return { command, swallow: true, preventDefault: true };
41191
+ }
41192
+ const isChord = Boolean(input.ctrlKey || input.metaKey || input.altKey);
41193
+ // Swallowed but not cancelled: the editor must not see it, yet nothing
41194
+ // browser-native (IME, accessibility) needs to be broken to achieve that.
41195
+ return { command, swallow: !isChord, preventDefault: false };
41196
+ }
41197
+ /**
41198
+ * Apply a command, returning the next state.
41199
+ *
41200
+ * Advancing past the last slide closes the view, which is what PowerPoint does:
41201
+ * Reading View has no "end of slide show" screen, it simply hands the reader
41202
+ * back to Normal. Going back from the first slide holds instead of closing, so
41203
+ * an over-eager Page Up cannot lose someone's place.
41204
+ */
41205
+ function applyReadingViewCommand(state, command, slideCount) {
41206
+ if (!state.open || slideCount <= 0) {
41207
+ return state.open ? CLOSED_READING_VIEW : state;
41208
+ }
41209
+ const last = slideCount - 1;
41210
+ switch (command.command) {
41211
+ case 'next':
41212
+ return state.slideIndex >= last
41213
+ ? CLOSED_READING_VIEW
41214
+ : { open: true, slideIndex: state.slideIndex + 1 };
41215
+ case 'previous':
41216
+ return { open: true, slideIndex: Math.max(0, state.slideIndex - 1) };
41217
+ case 'first':
41218
+ return { open: true, slideIndex: 0 };
41219
+ case 'last':
41220
+ return { open: true, slideIndex: last };
41221
+ case 'goto':
41222
+ return { open: true, slideIndex: clampIndex$1(command.slideIndex, slideCount) };
41223
+ case 'exit':
41224
+ return CLOSED_READING_VIEW;
41225
+ default:
41226
+ return state;
41227
+ }
41228
+ }
41229
+ /** Whether the "previous" control should be available. */
41230
+ function canGoPrevious(state) {
41231
+ return state.open && state.slideIndex > 0;
41232
+ }
41233
+ /**
41234
+ * Whether the "next" control should be available.
41235
+ *
41236
+ * True on the last slide too: there, next means "leave", and PowerPoint keeps
41237
+ * the arrow live for exactly that.
41238
+ */
41239
+ function canGoNext(state, slideCount) {
41240
+ return state.open && slideCount > 0;
41241
+ }
41242
+ /**
41243
+ * Scale that fits `canvas` inside `viewport` without cropping it.
41244
+ *
41245
+ * Reading View letterboxes rather than fills: a 16:9 deck read in a 4:3 window
41246
+ * must not have its edges cut off, because unlike a slide show there is no
41247
+ * second monitor to blame and the reader cannot scroll. Returns 0 for a
41248
+ * degenerate box so a binding rendering before its first layout pass draws
41249
+ * nothing instead of an element scaled by Infinity.
41250
+ */
41251
+ function readingViewFitScale(canvas, viewport, padding = 0) {
41252
+ const available = {
41253
+ width: viewport.width - padding * 2,
41254
+ height: viewport.height - padding * 2,
41255
+ };
41256
+ if (canvas.width <= 0 || canvas.height <= 0 || available.width <= 0 || available.height <= 0) {
41257
+ return 0;
41258
+ }
41259
+ return Math.min(available.width / canvas.width, available.height / canvas.height);
41260
+ }
41261
+ // ---------------------------------------------------------------------------
41262
+ // Internals
41263
+ // ---------------------------------------------------------------------------
41264
+ function clampIndex$1(index, slideCount) {
41265
+ if (!Number.isFinite(index) || slideCount <= 0) {
41266
+ return 0;
41267
+ }
41268
+ return Math.min(Math.max(Math.trunc(index), 0), slideCount - 1);
41269
+ }
41270
+
40610
41271
  /**
40611
41272
  * The editor keymap: one source of truth for "what does this key do".
40612
41273
  *
@@ -53127,6 +53788,7 @@ const translationsEn = {
53127
53788
  'pptx.tableDataEditor.addRowLabel': '+ Row',
53128
53789
  'pptx.tableDataEditor.addRowTitle': 'Add row below last',
53129
53790
  'pptx.tableDataEditor.ariaLabel': 'Table data editor',
53791
+ 'pptx.tableDataEditor.cellAriaLabel': 'Row {{row}}, column {{column}}',
53130
53792
  'pptx.tableDataEditor.removeColumnLabel': '- Col',
53131
53793
  'pptx.tableDataEditor.removeColumnN': 'Remove column {{number}}',
53132
53794
  'pptx.tableDataEditor.removeColumnTitle': 'Remove last column',
@@ -55608,7 +56270,7 @@ function createLocalStorageBackend(namespace) {
55608
56270
  /** Try IndexedDB first; fall back to localStorage on any failure. */
55609
56271
  async function resolveBackend(dbName, namespace) {
55610
56272
  try {
55611
- const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-_aHj4bRh.mjs');
56273
+ const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-BqhL79Dq.mjs');
55612
56274
  const db = await openChatDb(dbName);
55613
56275
  return createIdbBackend(db);
55614
56276
  }
@@ -59409,37 +60071,6 @@ function withTableData(element, transform) {
59409
60071
  return { ...element, tableData: next };
59410
60072
  }
59411
60073
  // ---------------------------------------------------------------------------
59412
- // Structural row / column operations (merge-aware)
59413
- // ---------------------------------------------------------------------------
59414
- /**
59415
- * Insert a blank row above or below `rowIdx`, growing any vertical merge spans
59416
- * that straddle the insertion point (delegates to the shared `insertTableRow`).
59417
- */
59418
- function insertRow(element, rowIdx, position) {
59419
- return withTableData(element, (td) => insertTableRow(td, rowIdx, position));
59420
- }
59421
- /**
59422
- * Delete the row at `rowIdx`, adjusting vertical merge spans. No-op (element
59423
- * returned unchanged) when the table has a single row.
59424
- */
59425
- function removeRow(element, rowIdx) {
59426
- return withTableData(element, (td) => deleteTableRow(td, rowIdx));
59427
- }
59428
- /**
59429
- * Insert a blank column left or right of `colIdx`, splitting the source column's
59430
- * width and growing horizontal merge spans (delegates to `insertTableColumn`).
59431
- */
59432
- function insertColumn(element, colIdx, position) {
59433
- return withTableData(element, (td) => insertTableColumn(td, colIdx, position));
59434
- }
59435
- /**
59436
- * Delete the column at `colIdx`, adjusting horizontal merge spans and
59437
- * renormalising widths. No-op when the table has a single column.
59438
- */
59439
- function removeColumn(element, colIdx) {
59440
- return withTableData(element, (td) => deleteTableColumn(td, colIdx));
59441
- }
59442
- // ---------------------------------------------------------------------------
59443
60074
  // Merge / split operations
59444
60075
  // ---------------------------------------------------------------------------
59445
60076
  /** Merge a rectangular selection of cells into their top-left anchor. */
@@ -59506,12 +60137,12 @@ function patchTableData(element, patch) {
59506
60137
  * new table out) and one commit path in the component.
59507
60138
  */
59508
60139
  const TABLE_OPS = {
59509
- 'table-insert-row-above': (el, sel) => insertRow(el, sel.rowIndex, 'above'),
59510
- 'table-insert-row-below': (el, sel) => insertRow(el, sel.rowIndex, 'below'),
59511
- 'table-delete-row': (el, sel) => removeRow(el, sel.rowIndex),
59512
- 'table-insert-col-left': (el, sel) => insertColumn(el, sel.columnIndex, 'left'),
59513
- 'table-insert-col-right': (el, sel) => insertColumn(el, sel.columnIndex, 'right'),
59514
- 'table-delete-col': (el, sel) => removeColumn(el, sel.columnIndex),
60140
+ 'table-insert-row-above': (el, sel) => insertTableElementRow(el, sel.rowIndex, 'above'),
60141
+ 'table-insert-row-below': (el, sel) => insertTableElementRow(el, sel.rowIndex, 'below'),
60142
+ 'table-delete-row': (el, sel) => removeTableElementRow(el, sel.rowIndex),
60143
+ 'table-insert-col-left': (el, sel) => insertTableElementColumn(el, sel.columnIndex, 'left'),
60144
+ 'table-insert-col-right': (el, sel) => insertTableElementColumn(el, sel.columnIndex, 'right'),
60145
+ 'table-delete-col': (el, sel) => removeTableElementColumn(el, sel.columnIndex),
59515
60146
  'table-merge-selected': (el, sel) => sel.selectedCells ? mergeSelection(el, sel.selectedCells) : el,
59516
60147
  'table-merge-right': (el, sel) => mergeRight(el, sel.rowIndex, sel.columnIndex),
59517
60148
  'table-merge-down': (el, sel) => mergeDown(el, sel.rowIndex, sel.columnIndex),
@@ -64867,80 +65498,6 @@ function stopAnimationSound() {
64867
65498
  * @module viewer/presentation-playback-helpers
64868
65499
  */
64869
65500
  // ---------------------------------------------------------------------------
64870
- // Media commands (p:cmd) - DOM lookup by data-element-id (no registry in Angular)
64871
- // ---------------------------------------------------------------------------
64872
- function findMediaElement(targetId, frameRoot) {
64873
- if (typeof HTMLMediaElement === 'undefined') {
64874
- return undefined;
64875
- }
64876
- const root = frameRoot?.() ?? (typeof document === 'undefined' ? null : document);
64877
- if (!root) {
64878
- return undefined;
64879
- }
64880
- for (const wrapper of root.querySelectorAll('[data-element-id]')) {
64881
- if (wrapper.dataset['elementId'] !== targetId) {
64882
- continue;
64883
- }
64884
- if (wrapper instanceof HTMLMediaElement) {
64885
- return wrapper;
64886
- }
64887
- const media = wrapper.querySelector('video, audio');
64888
- if (media instanceof HTMLMediaElement) {
64889
- return media;
64890
- }
64891
- }
64892
- return undefined;
64893
- }
64894
- /** Apply a parsed `p:cmd` media verb to the target's `<video>` / `<audio>`. */
64895
- function executeMediaCommand(command, frameRoot) {
64896
- const el = findMediaElement(command.targetId, frameRoot);
64897
- if (!el) {
64898
- return;
64899
- }
64900
- const parsed = parseMediaCommand(command.command);
64901
- if (!parsed) {
64902
- return;
64903
- }
64904
- const safePlay = () => {
64905
- void el.play().catch(() => {
64906
- /* autoplay blocked or not ready: ignore */
64907
- });
64908
- };
64909
- const safeSeek = (seconds) => {
64910
- try {
64911
- el.currentTime = seconds;
64912
- }
64913
- catch {
64914
- /* not seekable yet: ignore */
64915
- }
64916
- };
64917
- switch (parsed.verb) {
64918
- case 'playFrom':
64919
- safeSeek(parsed.seekSeconds ?? 0);
64920
- safePlay();
64921
- return;
64922
- case 'play':
64923
- safePlay();
64924
- return;
64925
- case 'pause':
64926
- el.pause();
64927
- return;
64928
- case 'stop':
64929
- el.pause();
64930
- safeSeek(0);
64931
- return;
64932
- case 'togglePlay':
64933
- if (el.paused) {
64934
- safePlay();
64935
- }
64936
- else {
64937
- el.pause();
64938
- }
64939
- break;
64940
- default:
64941
- }
64942
- }
64943
- // ---------------------------------------------------------------------------
64944
65501
  // Click-group step application
64945
65502
  // ---------------------------------------------------------------------------
64946
65503
  /**
@@ -64955,7 +65512,7 @@ function applyAnimationGroupSteps(group, ctx) {
64955
65512
  if (step.command) {
64956
65513
  const command = step.command;
64957
65514
  const timer = window.setTimeout(() => {
64958
- executeMediaCommand(command, ctx.frameRoot);
65515
+ executeMediaCommandInDom(command, ctx.frameRoot);
64959
65516
  }, Math.max(0, step.delayMs));
64960
65517
  ctx.timers.push(timer);
64961
65518
  continue;
@@ -67665,11 +68222,16 @@ class EquationRendererComponent {
67665
68222
  * Converts the OMML input to MathML and wraps it in a `SafeHtml` value so
67666
68223
  * Angular's `[innerHTML]` binding renders the `<math>` markup instead of
67667
68224
  * stripping it.
68225
+ *
68226
+ * `bypassSecurityTrustHtml` switches Angular's own sanitiser off, and the
68227
+ * OMML comes from an arbitrary deck, so the markup is run through the shared
68228
+ * `sanitizeMathMl` (DOMPurify, MathML + SVG profiles) first. That is the same
68229
+ * guarantee the other four bindings apply at their raw-HTML sinks.
67668
68230
  */
67669
68231
  safeMathml = computed(() =>
67670
68232
  // `equationXml` is typed `Record<string, unknown>` on the core segment; the
67671
68233
  // shared converter walks it as an `OmmlNode` (core's recursive `XmlObject`).
67672
- this.sanitizer.bypassSecurityTrustHtml(ommlToMathml(this.equationXml())), /* @ts-ignore */
68234
+ this.sanitizer.bypassSecurityTrustHtml(sanitizeMathMl(ommlToMathml(this.equationXml()))), /* @ts-ignore */
67673
68235
  ...(ngDevMode ? [{ debugName: "safeMathml" }] : /* istanbul ignore next */ []));
67674
68236
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: EquationRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
67675
68237
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: EquationRendererComponent, isStandalone: true, selector: "pptx-equation-renderer", inputs: { equationXml: { classPropertyName: "equationXml", publicName: "equationXml", isSignal: true, isRequired: true, transformFunction: null }, equationNumber: { classPropertyName: "equationNumber", publicName: "equationNumber", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
@@ -85365,6 +85927,375 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
85365
85927
  `, styles: [".pptx-ng-props-form{display:flex;flex-direction:column;gap:.75rem}.pptx-ng-props-field{display:flex;flex-direction:column;gap:.375rem}.pptx-ng-props-label{font-size:.75rem;font-weight:500;color:var(--pptx-foreground, #e5e5e5)}.pptx-ng-props-input{width:100%;padding:.375rem .75rem;border-radius:.375rem;border:1px solid var(--pptx-border, #2a2a2a);background:var(--pptx-background, #111);color:var(--pptx-foreground, #e5e5e5);font-size:.8125rem}.pptx-ng-props-input:focus{outline:none;border-color:var(--pptx-primary, #6366f1);box-shadow:0 0 0 1px var(--pptx-primary, #6366f1)}.pptx-ng-props-meta{display:flex;flex-direction:column;gap:.375rem;padding-top:.5rem;border-top:1px solid var(--pptx-border, #2a2a2a)}.pptx-ng-props-meta-row{display:flex;justify-content:space-between;font-size:.75rem}.pptx-ng-props-meta-label{color:var(--pptx-muted-foreground, #9a9a9a)}.pptx-ng-props-meta-value{color:var(--pptx-foreground, #e5e5e5)}.pptx-ng-props-btn{padding:.375rem .75rem;border:none;border-radius:.375rem;background:var(--pptx-muted, #2a2a2a);color:var(--pptx-foreground, #e5e5e5);font-size:.75rem;cursor:pointer}.pptx-ng-props-btn-primary{background:var(--pptx-primary, #6366f1);color:var(--pptx-primary-foreground, #fff)}\n"] }]
85366
85928
  }], ctorParameters: () => [], propDecorators: { open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }], properties: [{ type: i0.Input, args: [{ isSignal: true, alias: "properties", required: true }] }], save: [{ type: i0.Output, args: ["save"] }], close: [{ type: i0.Output, args: ["close"] }] } });
85367
85929
 
85930
+ /**
85931
+ * reading-view-overlay.styles.ts: CSS for PowerPoint's Reading View.
85932
+ *
85933
+ * Lifted out of the component (as `editor-context-menu.styles.ts` was) so that
85934
+ * file stays a template plus its wiring and keeps under this repo's 300-LOC
85935
+ * cap. A plain exported const still compiles AOT: ng-packagr statically
85936
+ * evaluates the imported string.
85937
+ *
85938
+ * @module angular-viewer/reading-view-overlay.styles
85939
+ */
85940
+ /**
85941
+ * Styles for `pptx-reading-view-overlay`.
85942
+ *
85943
+ * `position: fixed; inset: 0` is the whole point: Reading View fills the
85944
+ * browser WINDOW without the Fullscreen API, which is what separates it from
85945
+ * the slide show.
85946
+ */
85947
+ const READING_VIEW_OVERLAY_STYLES = `
85948
+ .pptx-ng-reading-root {
85949
+ position: fixed;
85950
+ inset: 0;
85951
+ z-index: 1300;
85952
+ display: flex;
85953
+ flex-direction: column;
85954
+ background: #171717;
85955
+ }
85956
+
85957
+ .pptx-ng-reading-viewport {
85958
+ display: flex;
85959
+ flex: 1 1 0%;
85960
+ min-height: 0;
85961
+ align-items: center;
85962
+ justify-content: center;
85963
+ }
85964
+
85965
+ .pptx-ng-reading-stage {
85966
+ position: relative;
85967
+ overflow: hidden;
85968
+ }
85969
+
85970
+ /*
85971
+ * SlideCanvasComponent centres its stage with a 1rem gutter, which would push
85972
+ * the slide out of the box measured by readingViewFitScale. The sorter
85973
+ * overlay strips the same margin for the same reason.
85974
+ */
85975
+ .pptx-ng-reading-stage ::ng-deep .pptx-ng-canvas-wrapper {
85976
+ margin: 0 !important;
85977
+ }
85978
+
85979
+ .pptx-ng-reading-nav {
85980
+ display: flex;
85981
+ flex-shrink: 0;
85982
+ align-items: center;
85983
+ justify-content: center;
85984
+ gap: 0.75rem;
85985
+ padding: 0.5rem 1rem;
85986
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
85987
+ }
85988
+
85989
+ .pptx-ng-reading-btn {
85990
+ display: inline-flex;
85991
+ align-items: center;
85992
+ justify-content: center;
85993
+ width: 2rem;
85994
+ height: 2rem;
85995
+ padding: 0;
85996
+ border: none;
85997
+ border-radius: 0.25rem;
85998
+ background: transparent;
85999
+ color: rgba(255, 255, 255, 0.8);
86000
+ cursor: pointer;
86001
+ transition:
86002
+ background 0.15s,
86003
+ color 0.15s;
86004
+ }
86005
+
86006
+ .pptx-ng-reading-btn:hover:not(:disabled) {
86007
+ background: rgba(255, 255, 255, 0.15);
86008
+ color: #ffffff;
86009
+ }
86010
+
86011
+ .pptx-ng-reading-btn:disabled {
86012
+ cursor: default;
86013
+ opacity: 0.3;
86014
+ }
86015
+
86016
+ .pptx-ng-reading-counter {
86017
+ min-width: 4rem;
86018
+ text-align: center;
86019
+ font-size: 0.75rem;
86020
+ font-variant-numeric: tabular-nums;
86021
+ color: rgba(255, 255, 255, 0.7);
86022
+ }
86023
+ `;
86024
+
86025
+ /**
86026
+ * reading-view-overlay.component.ts: PowerPoint's Reading View, Angular binding.
86027
+ *
86028
+ * Deliberately NOT built on {@link PresentationOverlayComponent}. Reading View
86029
+ * is the deck at full WINDOW size with the editor chrome cut back to a nav bar:
86030
+ * reusing the slide-show overlay would drag the Fullscreen API, the pointer
86031
+ * tools, blackout and the presenter console in with it, which is exactly the
86032
+ * weight a reader asked to escape. `position: fixed; inset: 0` fills the browser
86033
+ * window without requesting fullscreen, matching PowerPoint and the sibling
86034
+ * {@link SlideSorterOverlayComponent}.
86035
+ *
86036
+ * Every navigation rule (what Page Down does, when advancing past the last
86037
+ * slide closes the view, whether Previous is live) comes from
86038
+ * `render/reading-view` in `pptx-viewer-shared`, so the five bindings cannot
86039
+ * drift apart. Nothing in this file decides which slide comes next.
86040
+ *
86041
+ * Reference binding: packages/react/src/viewer/components/ReadingViewOverlay.tsx
86042
+ */
86043
+ /** Breathing room between the slide and the window edge, in CSS pixels. */
86044
+ const READING_VIEW_PADDING = 24;
86045
+ class ReadingViewOverlayComponent {
86046
+ /**
86047
+ * The deck to read, template (master/layout) elements already merged in. The
86048
+ * host passes its merged display deck rather than a separate template layer:
86049
+ * the reader navigates inside this overlay, so a single "active slide's
86050
+ * template elements" array would paint slide 1's master over slide 2.
86051
+ */
86052
+ slides = input([], /* @ts-ignore */
86053
+ ...(ngDevMode ? [{ debugName: "slides" }] : /* istanbul ignore next */ []));
86054
+ canvasSize = input.required(/* @ts-ignore */
86055
+ ...(ngDevMode ? [{ debugName: "canvasSize" }] : /* istanbul ignore next */ []));
86056
+ mediaDataUrls = input(new Map(), /* @ts-ignore */
86057
+ ...(ngDevMode ? [{ debugName: "mediaDataUrls" }] : /* istanbul ignore next */ []));
86058
+ /** Slide the editor was on when Reading View was entered. */
86059
+ activeSlideIndex = input(0, /* @ts-ignore */
86060
+ ...(ngDevMode ? [{ debugName: "activeSlideIndex" }] : /* istanbul ignore next */ []));
86061
+ /** Emits the slide the reader ended on, so the editor lands there. */
86062
+ exit = output();
86063
+ /** Whether the view is on screen and which slide it shows (shared state). */
86064
+ state = signal(CLOSED_READING_VIEW, /* @ts-ignore */
86065
+ ...(ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []));
86066
+ viewportRef = viewChild('viewport', /* @ts-ignore */
86067
+ ...(ngDevMode ? [{ debugName: "viewportRef" }] : /* istanbul ignore next */ []));
86068
+ /** Measured size of the area the slide is fitted into, in CSS pixels. */
86069
+ viewport = signal({ width: 0, height: 0 }, /* @ts-ignore */
86070
+ ...(ngDevMode ? [{ debugName: "viewport" }] : /* istanbul ignore next */ []));
86071
+ /**
86072
+ * PowerPoint's "type a slide number, then Enter" jump. One buffer per open
86073
+ * session, and every key mapped through it EXACTLY once: mapping mutates the
86074
+ * buffer, so a second call would swallow the digit it just accumulated.
86075
+ */
86076
+ keyBuffer = createPresentationKeyBuffer();
86077
+ /** Bound once so the capture-phase listener can be removed again. */
86078
+ keyListener = (event) => this.onKeyDown(event);
86079
+ resizeObserver = null;
86080
+ ngOnInit() {
86081
+ // Inputs are only bound by now, so the opening slide cannot be read in a
86082
+ // field initializer. Clamping lives in the shared opener.
86083
+ this.state.set(openReadingView(this.activeSlideIndex(), this.slides().length));
86084
+ // Capture phase on `window`, which is why this cannot be a @HostListener
86085
+ // (those can only register in the bubble phase). The editor is still mounted
86086
+ // and still listening underneath this overlay, and until the reader's keys
86087
+ // were swallowed first an arrow key both turned the page AND nudged the
86088
+ // selected shape behind it, so merely reading a deck edited it.
86089
+ window.addEventListener('keydown', this.keyListener, true);
86090
+ }
86091
+ ngAfterViewInit() {
86092
+ const element = this.viewportRef()?.nativeElement;
86093
+ if (!element || typeof ResizeObserver === 'undefined') {
86094
+ return;
86095
+ }
86096
+ this.resizeObserver = new ResizeObserver((entries) => {
86097
+ const rect = entries[0]?.contentRect;
86098
+ if (rect) {
86099
+ this.viewport.set({ width: rect.width, height: rect.height });
86100
+ }
86101
+ });
86102
+ this.resizeObserver.observe(element);
86103
+ }
86104
+ ngOnDestroy() {
86105
+ window.removeEventListener('keydown', this.keyListener, true);
86106
+ this.resizeObserver?.disconnect();
86107
+ this.resizeObserver = null;
86108
+ }
86109
+ /** The slide on screen, or undefined when closed or the deck is empty. */
86110
+ visibleSlide = computed(() => {
86111
+ const state = this.state();
86112
+ return state.open ? this.slides()[state.slideIndex] : undefined;
86113
+ }, /* @ts-ignore */
86114
+ ...(ngDevMode ? [{ debugName: "visibleSlide" }] : /* istanbul ignore next */ []));
86115
+ /** Fit scale for the slide; 0 before the first layout pass. */
86116
+ scale = computed(() => readingViewFitScale(this.canvasSize(), this.viewport(), READING_VIEW_PADDING), /* @ts-ignore */
86117
+ ...(ngDevMode ? [{ debugName: "scale" }] : /* istanbul ignore next */ []));
86118
+ stageWidth = computed(() => this.canvasSize().width * this.scale(), /* @ts-ignore */
86119
+ ...(ngDevMode ? [{ debugName: "stageWidth" }] : /* istanbul ignore next */ []));
86120
+ stageHeight = computed(() => this.canvasSize().height * this.scale(), /* @ts-ignore */
86121
+ ...(ngDevMode ? [{ debugName: "stageHeight" }] : /* istanbul ignore next */ []));
86122
+ counter = computed(() => formatSlideCounter(this.state().slideIndex, this.slides().length), /* @ts-ignore */
86123
+ ...(ngDevMode ? [{ debugName: "counter" }] : /* istanbul ignore next */ []));
86124
+ canPrevious = computed(() => canGoPrevious(this.state()), /* @ts-ignore */
86125
+ ...(ngDevMode ? [{ debugName: "canPrevious" }] : /* istanbul ignore next */ []));
86126
+ canNext = computed(() => canGoNext(this.state(), this.slides().length), /* @ts-ignore */
86127
+ ...(ngDevMode ? [{ debugName: "canNext" }] : /* istanbul ignore next */ []));
86128
+ /** Apply a navigation intent, handing the reader back to the editor on close. */
86129
+ run(command) {
86130
+ const previous = this.state();
86131
+ const next = applyReadingViewCommand(previous, command, this.slides().length);
86132
+ this.state.set(next);
86133
+ if (previous.open && !next.open) {
86134
+ // Leaving a PowerPoint view returns the editor to the slide that was on
86135
+ // screen, not the one it was on before.
86136
+ this.exit.emit(previous.slideIndex);
86137
+ }
86138
+ }
86139
+ /**
86140
+ * Window-level so no element has to hold focus, matching the slide show.
86141
+ * Writing {@link state} marks this `OnPush` view dirty and notifies Angular's
86142
+ * change-detection scheduler, so no manual `markForCheck` is needed even
86143
+ * though the listener is not a host binding.
86144
+ */
86145
+ onKeyDown(event) {
86146
+ if (!this.state().open) {
86147
+ return;
86148
+ }
86149
+ // Handled exactly once: the call mutates `keyBuffer` to accumulate a typed
86150
+ // slide number, so handling twice would swallow every digit.
86151
+ const { command, swallow, preventDefault } = handleReadingViewKey(event, this.keyBuffer);
86152
+ if (swallow) {
86153
+ event.stopPropagation();
86154
+ }
86155
+ if (preventDefault) {
86156
+ // Space and the arrows would otherwise scroll the editor underneath.
86157
+ event.preventDefault();
86158
+ }
86159
+ if (command.command !== 'none') {
86160
+ this.run(command);
86161
+ }
86162
+ }
86163
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ReadingViewOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
86164
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: ReadingViewOverlayComponent, isStandalone: true, selector: "pptx-reading-view-overlay", inputs: { slides: { classPropertyName: "slides", publicName: "slides", isSignal: true, isRequired: false, transformFunction: null }, canvasSize: { classPropertyName: "canvasSize", publicName: "canvasSize", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, activeSlideIndex: { classPropertyName: "activeSlideIndex", publicName: "activeSlideIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { exit: "exit" }, viewQueries: [{ propertyName: "viewportRef", first: true, predicate: ["viewport"], descendants: true, isSignal: true }], ngImport: i0, template: `
86165
+ @if (visibleSlide(); as slide) {
86166
+ <div
86167
+ class="pptx-ng-reading-root"
86168
+ data-pptx-reading-view="true"
86169
+ role="region"
86170
+ [attr.aria-label]="'pptx.view.readingView' | translate"
86171
+ >
86172
+ <div #viewport class="pptx-ng-reading-viewport">
86173
+ @if (scale() > 0) {
86174
+ <div
86175
+ class="pptx-ng-reading-stage"
86176
+ data-pptx-reading-view-stage="true"
86177
+ aria-roledescription="slide"
86178
+ [style.width.px]="stageWidth()"
86179
+ [style.height.px]="stageHeight()"
86180
+ >
86181
+ <pptx-slide-canvas
86182
+ [slide]="slide"
86183
+ [canvasSize]="canvasSize()"
86184
+ [mediaDataUrls]="mediaDataUrls()"
86185
+ [zoom]="scale()"
86186
+ [autoFit]="false"
86187
+ [interactive]="false"
86188
+ />
86189
+ </div>
86190
+ }
86191
+ </div>
86192
+ <div class="pptx-ng-reading-nav">
86193
+ <button
86194
+ type="button"
86195
+ class="pptx-ng-reading-btn"
86196
+ [attr.aria-label]="'pptx.common.previous' | translate"
86197
+ [title]="'pptx.common.previous' | translate"
86198
+ [disabled]="!canPrevious()"
86199
+ (click)="run({ command: 'previous' })"
86200
+ >
86201
+ <svg lucideChevronLeft class="h-4 w-4"></svg>
86202
+ </button>
86203
+ <span class="pptx-ng-reading-counter" data-pptx-reading-view-counter="true">{{
86204
+ counter()
86205
+ }}</span>
86206
+ <button
86207
+ type="button"
86208
+ class="pptx-ng-reading-btn"
86209
+ [attr.aria-label]="'pptx.common.next' | translate"
86210
+ [title]="'pptx.common.next' | translate"
86211
+ [disabled]="!canNext()"
86212
+ (click)="run({ command: 'next' })"
86213
+ >
86214
+ <svg lucideChevronRight class="h-4 w-4"></svg>
86215
+ </button>
86216
+ <button
86217
+ type="button"
86218
+ class="pptx-ng-reading-btn"
86219
+ [attr.aria-label]="'pptx.statusBar.normalView' | translate"
86220
+ [title]="'pptx.statusBar.normalView' | translate"
86221
+ (click)="run({ command: 'exit' })"
86222
+ >
86223
+ <svg lucideX class="h-4 w-4"></svg>
86224
+ </button>
86225
+ </div>
86226
+ </div>
86227
+ }
86228
+ `, isInline: true, styles: [".pptx-ng-reading-root{position:fixed;inset:0;z-index:1300;display:flex;flex-direction:column;background:#171717}.pptx-ng-reading-viewport{display:flex;flex:1 1 0%;min-height:0;align-items:center;justify-content:center}.pptx-ng-reading-stage{position:relative;overflow:hidden}.pptx-ng-reading-stage ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}.pptx-ng-reading-nav{display:flex;flex-shrink:0;align-items:center;justify-content:center;gap:.75rem;padding:.5rem 1rem;border-top:1px solid rgba(255,255,255,.1)}.pptx-ng-reading-btn{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;border:none;border-radius:.25rem;background:transparent;color:#fffc;cursor:pointer;transition:background .15s,color .15s}.pptx-ng-reading-btn:hover:not(:disabled){background:#ffffff26;color:#fff}.pptx-ng-reading-btn:disabled{cursor:default;opacity:.3}.pptx-ng-reading-counter{min-width:4rem;text-align:center;font-size:.75rem;font-variant-numeric:tabular-nums;color:#ffffffb3}\n"], dependencies: [{ kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: LucideChevronLeft, selector: "svg[lucideChevronLeft]" }, { kind: "component", type: LucideChevronRight, selector: "svg[lucideChevronRight]" }, { kind: "component", type: LucideX, selector: "svg[lucideX]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
86229
+ }
86230
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ReadingViewOverlayComponent, decorators: [{
86231
+ type: Component,
86232
+ args: [{ selector: 'pptx-reading-view-overlay', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [SlideCanvasComponent, TranslatePipe, LucideChevronLeft, LucideChevronRight, LucideX], template: `
86233
+ @if (visibleSlide(); as slide) {
86234
+ <div
86235
+ class="pptx-ng-reading-root"
86236
+ data-pptx-reading-view="true"
86237
+ role="region"
86238
+ [attr.aria-label]="'pptx.view.readingView' | translate"
86239
+ >
86240
+ <div #viewport class="pptx-ng-reading-viewport">
86241
+ @if (scale() > 0) {
86242
+ <div
86243
+ class="pptx-ng-reading-stage"
86244
+ data-pptx-reading-view-stage="true"
86245
+ aria-roledescription="slide"
86246
+ [style.width.px]="stageWidth()"
86247
+ [style.height.px]="stageHeight()"
86248
+ >
86249
+ <pptx-slide-canvas
86250
+ [slide]="slide"
86251
+ [canvasSize]="canvasSize()"
86252
+ [mediaDataUrls]="mediaDataUrls()"
86253
+ [zoom]="scale()"
86254
+ [autoFit]="false"
86255
+ [interactive]="false"
86256
+ />
86257
+ </div>
86258
+ }
86259
+ </div>
86260
+ <div class="pptx-ng-reading-nav">
86261
+ <button
86262
+ type="button"
86263
+ class="pptx-ng-reading-btn"
86264
+ [attr.aria-label]="'pptx.common.previous' | translate"
86265
+ [title]="'pptx.common.previous' | translate"
86266
+ [disabled]="!canPrevious()"
86267
+ (click)="run({ command: 'previous' })"
86268
+ >
86269
+ <svg lucideChevronLeft class="h-4 w-4"></svg>
86270
+ </button>
86271
+ <span class="pptx-ng-reading-counter" data-pptx-reading-view-counter="true">{{
86272
+ counter()
86273
+ }}</span>
86274
+ <button
86275
+ type="button"
86276
+ class="pptx-ng-reading-btn"
86277
+ [attr.aria-label]="'pptx.common.next' | translate"
86278
+ [title]="'pptx.common.next' | translate"
86279
+ [disabled]="!canNext()"
86280
+ (click)="run({ command: 'next' })"
86281
+ >
86282
+ <svg lucideChevronRight class="h-4 w-4"></svg>
86283
+ </button>
86284
+ <button
86285
+ type="button"
86286
+ class="pptx-ng-reading-btn"
86287
+ [attr.aria-label]="'pptx.statusBar.normalView' | translate"
86288
+ [title]="'pptx.statusBar.normalView' | translate"
86289
+ (click)="run({ command: 'exit' })"
86290
+ >
86291
+ <svg lucideX class="h-4 w-4"></svg>
86292
+ </button>
86293
+ </div>
86294
+ </div>
86295
+ }
86296
+ `, styles: [".pptx-ng-reading-root{position:fixed;inset:0;z-index:1300;display:flex;flex-direction:column;background:#171717}.pptx-ng-reading-viewport{display:flex;flex:1 1 0%;min-height:0;align-items:center;justify-content:center}.pptx-ng-reading-stage{position:relative;overflow:hidden}.pptx-ng-reading-stage ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}.pptx-ng-reading-nav{display:flex;flex-shrink:0;align-items:center;justify-content:center;gap:.75rem;padding:.5rem 1rem;border-top:1px solid rgba(255,255,255,.1)}.pptx-ng-reading-btn{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;border:none;border-radius:.25rem;background:transparent;color:#fffc;cursor:pointer;transition:background .15s,color .15s}.pptx-ng-reading-btn:hover:not(:disabled){background:#ffffff26;color:#fff}.pptx-ng-reading-btn:disabled{cursor:default;opacity:.3}.pptx-ng-reading-counter{min-width:4rem;text-align:center;font-size:.75rem;font-variant-numeric:tabular-nums;color:#ffffffb3}\n"] }]
86297
+ }], propDecorators: { slides: [{ type: i0.Input, args: [{ isSignal: true, alias: "slides", required: false }] }], canvasSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasSize", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], activeSlideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeSlideIndex", required: false }] }], exit: [{ type: i0.Output, args: ["exit"] }], viewportRef: [{ type: i0.ViewChild, args: ['viewport', { isSignal: true }] }] } });
86298
+
85368
86299
  function formatMs(ms) {
85369
86300
  const seconds = Math.max(0, Math.floor(ms / 1000));
85370
86301
  return `${Math.floor(seconds / 60)}:${String(seconds % 60).padStart(2, '0')}`;
@@ -87518,8 +88449,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
87518
88449
  * renders it: a tab whose controls are in a different order, or under
87519
88450
  * different names, cannot be scripted or documented once for all five.
87520
88451
  *
87521
- * Reading View, Handout Master, Notes Master, Zoom and Macros render disabled:
87522
- * each is a view or setting this viewer does not implement yet. Print,
88452
+ * Handout Master, Notes Master, Zoom and Macros render disabled: each is a view
88453
+ * or setting this viewer does not implement yet. Reading View used to sit in
88454
+ * that list; it is now a real view (see {@link ReadingViewOverlayComponent}),
88455
+ * so its pill opens the deck full-window with the chrome cut to a nav bar. Print,
87523
88456
  * Shortcuts and the Notes-pane toggle deliberately do NOT live here (PowerPoint
87524
88457
  * has none of them on View); they stay reachable from the File tab / overflow
87525
88458
  * menu, the Help tab, and the status bar respectively.
@@ -87549,6 +88482,8 @@ class RibbonViewSectionComponent {
87549
88482
  eyedropperActive = input(false, /* @ts-ignore */
87550
88483
  ...(ngDevMode ? [{ debugName: "eyedropperActive" }] : /* istanbul ignore next */ []));
87551
88484
  openSorter = output();
88485
+ /** Enter Reading View: the deck full-window, NOT the fullscreen slide show. */
88486
+ openReadingView = output();
87552
88487
  openMasterView = output();
87553
88488
  toggleGrid = output();
87554
88489
  toggleRulers = output();
@@ -87560,7 +88495,7 @@ class RibbonViewSectionComponent {
87560
88495
  zoomToFit = output();
87561
88496
  toggleEyedropper = output();
87562
88497
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: RibbonViewSectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
87563
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.8", type: RibbonViewSectionComponent, isStandalone: true, selector: "pptx-ribbon-view-section", inputs: { canEdit: { classPropertyName: "canEdit", publicName: "canEdit", isSignal: true, isRequired: false, transformFunction: null }, showGrid: { classPropertyName: "showGrid", publicName: "showGrid", isSignal: true, isRequired: false, transformFunction: null }, showRulers: { classPropertyName: "showRulers", publicName: "showRulers", isSignal: true, isRequired: false, transformFunction: null }, showGuides: { classPropertyName: "showGuides", publicName: "showGuides", isSignal: true, isRequired: false, transformFunction: null }, snapToGrid: { classPropertyName: "snapToGrid", publicName: "snapToGrid", isSignal: true, isRequired: false, transformFunction: null }, snapToShape: { classPropertyName: "snapToShape", publicName: "snapToShape", isSignal: true, isRequired: false, transformFunction: null }, eyedropperActive: { classPropertyName: "eyedropperActive", publicName: "eyedropperActive", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openSorter: "openSorter", openMasterView: "openMasterView", toggleGrid: "toggleGrid", toggleRulers: "toggleRulers", toggleGuides: "toggleGuides", toggleSelectionPane: "toggleSelectionPane", toggleSnapToGrid: "toggleSnapToGrid", toggleSnapToShape: "toggleSnapToShape", addGuide: "addGuide", zoomToFit: "zoomToFit", toggleEyedropper: "toggleEyedropper" }, host: { classAttribute: "contents" }, ngImport: i0, template: `
88498
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.8", type: RibbonViewSectionComponent, isStandalone: true, selector: "pptx-ribbon-view-section", inputs: { canEdit: { classPropertyName: "canEdit", publicName: "canEdit", isSignal: true, isRequired: false, transformFunction: null }, showGrid: { classPropertyName: "showGrid", publicName: "showGrid", isSignal: true, isRequired: false, transformFunction: null }, showRulers: { classPropertyName: "showRulers", publicName: "showRulers", isSignal: true, isRequired: false, transformFunction: null }, showGuides: { classPropertyName: "showGuides", publicName: "showGuides", isSignal: true, isRequired: false, transformFunction: null }, snapToGrid: { classPropertyName: "snapToGrid", publicName: "snapToGrid", isSignal: true, isRequired: false, transformFunction: null }, snapToShape: { classPropertyName: "snapToShape", publicName: "snapToShape", isSignal: true, isRequired: false, transformFunction: null }, eyedropperActive: { classPropertyName: "eyedropperActive", publicName: "eyedropperActive", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { openSorter: "openSorter", openReadingView: "openReadingView", openMasterView: "openMasterView", toggleGrid: "toggleGrid", toggleRulers: "toggleRulers", toggleGuides: "toggleGuides", toggleSelectionPane: "toggleSelectionPane", toggleSnapToGrid: "toggleSnapToGrid", toggleSnapToShape: "toggleSnapToShape", addGuide: "addGuide", zoomToFit: "zoomToFit", toggleEyedropper: "toggleEyedropper" }, host: { classAttribute: "contents" }, ngImport: i0, template: `
87564
88499
  <!-- Presentation views -->
87565
88500
  <button type="button" class="pptx-rb-pill" [title]="'pptx.view.normal' | translate">
87566
88501
  {{ 'pptx.view.normal' | translate }}
@@ -87573,7 +88508,12 @@ class RibbonViewSectionComponent {
87573
88508
  >
87574
88509
  {{ 'pptx.slideSorter.title' | translate }}
87575
88510
  </button>
87576
- <button type="button" class="pptx-rb-pill" disabled>
88511
+ <button
88512
+ type="button"
88513
+ class="pptx-rb-pill"
88514
+ [title]="'pptx.view.readingView' | translate"
88515
+ (click)="openReadingView.emit()"
88516
+ >
87577
88517
  {{ 'pptx.view.readingView' | translate }}
87578
88518
  </button>
87579
88519
  <span class="pptx-rb-sep"></span>
@@ -87729,7 +88669,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
87729
88669
  >
87730
88670
  {{ 'pptx.slideSorter.title' | translate }}
87731
88671
  </button>
87732
- <button type="button" class="pptx-rb-pill" disabled>
88672
+ <button
88673
+ type="button"
88674
+ class="pptx-rb-pill"
88675
+ [title]="'pptx.view.readingView' | translate"
88676
+ (click)="openReadingView.emit()"
88677
+ >
87733
88678
  {{ 'pptx.view.readingView' | translate }}
87734
88679
  </button>
87735
88680
  <span class="pptx-rb-sep"></span>
@@ -87864,7 +88809,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
87864
88809
  </button>
87865
88810
  `,
87866
88811
  }]
87867
- }], propDecorators: { canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], showGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGrid", required: false }] }], showRulers: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRulers", required: false }] }], showGuides: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGuides", required: false }] }], snapToGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToGrid", required: false }] }], snapToShape: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToShape", required: false }] }], eyedropperActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "eyedropperActive", required: false }] }], openSorter: [{ type: i0.Output, args: ["openSorter"] }], openMasterView: [{ type: i0.Output, args: ["openMasterView"] }], toggleGrid: [{ type: i0.Output, args: ["toggleGrid"] }], toggleRulers: [{ type: i0.Output, args: ["toggleRulers"] }], toggleGuides: [{ type: i0.Output, args: ["toggleGuides"] }], toggleSelectionPane: [{ type: i0.Output, args: ["toggleSelectionPane"] }], toggleSnapToGrid: [{ type: i0.Output, args: ["toggleSnapToGrid"] }], toggleSnapToShape: [{ type: i0.Output, args: ["toggleSnapToShape"] }], addGuide: [{ type: i0.Output, args: ["addGuide"] }], zoomToFit: [{ type: i0.Output, args: ["zoomToFit"] }], toggleEyedropper: [{ type: i0.Output, args: ["toggleEyedropper"] }] } });
88812
+ }], propDecorators: { canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], showGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGrid", required: false }] }], showRulers: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRulers", required: false }] }], showGuides: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGuides", required: false }] }], snapToGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToGrid", required: false }] }], snapToShape: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToShape", required: false }] }], eyedropperActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "eyedropperActive", required: false }] }], openSorter: [{ type: i0.Output, args: ["openSorter"] }], openReadingView: [{ type: i0.Output, args: ["openReadingView"] }], openMasterView: [{ type: i0.Output, args: ["openMasterView"] }], toggleGrid: [{ type: i0.Output, args: ["toggleGrid"] }], toggleRulers: [{ type: i0.Output, args: ["toggleRulers"] }], toggleGuides: [{ type: i0.Output, args: ["toggleGuides"] }], toggleSelectionPane: [{ type: i0.Output, args: ["toggleSelectionPane"] }], toggleSnapToGrid: [{ type: i0.Output, args: ["toggleSnapToGrid"] }], toggleSnapToShape: [{ type: i0.Output, args: ["toggleSnapToShape"] }], addGuide: [{ type: i0.Output, args: ["addGuide"] }], zoomToFit: [{ type: i0.Output, args: ["zoomToFit"] }], toggleEyedropper: [{ type: i0.Output, args: ["toggleEyedropper"] }] } });
87868
88813
 
87869
88814
  /**
87870
88815
  * ribbon-content-secondary.component.ts: the ribbon's Slide Show/Review/View/
@@ -87933,6 +88878,8 @@ class RibbonContentSecondaryComponent {
87933
88878
  a11y = output();
87934
88879
  link = output();
87935
88880
  openSorter = output();
88881
+ /** View tab > Reading View: the deck full-window, not the slide show. */
88882
+ openReadingView = output();
87936
88883
  openMasterView = output();
87937
88884
  toggleNotes = output();
87938
88885
  toggleInspector = output();
@@ -87971,7 +88918,7 @@ class RibbonContentSecondaryComponent {
87971
88918
  this.drawToolChange.emit(state);
87972
88919
  }
87973
88920
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: RibbonContentSecondaryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
87974
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: RibbonContentSecondaryComponent, isStandalone: true, selector: "pptx-ribbon-content-secondary", inputs: { activeTab: { classPropertyName: "activeTab", publicName: "activeTab", isSignal: true, isRequired: true, transformFunction: null }, slideIndex: { classPropertyName: "slideIndex", publicName: "slideIndex", isSignal: true, isRequired: false, transformFunction: null }, slideCount: { classPropertyName: "slideCount", publicName: "slideCount", isSignal: true, isRequired: false, transformFunction: null }, canEdit: { classPropertyName: "canEdit", publicName: "canEdit", isSignal: true, isRequired: false, transformFunction: null }, selectedElement: { classPropertyName: "selectedElement", publicName: "selectedElement", isSignal: true, isRequired: false, transformFunction: null }, showGrid: { classPropertyName: "showGrid", publicName: "showGrid", isSignal: true, isRequired: false, transformFunction: null }, showRulers: { classPropertyName: "showRulers", publicName: "showRulers", isSignal: true, isRequired: false, transformFunction: null }, showGuides: { classPropertyName: "showGuides", publicName: "showGuides", isSignal: true, isRequired: false, transformFunction: null }, snapToGrid: { classPropertyName: "snapToGrid", publicName: "snapToGrid", isSignal: true, isRequired: false, transformFunction: null }, snapToShape: { classPropertyName: "snapToShape", publicName: "snapToShape", isSignal: true, isRequired: false, transformFunction: null }, eyedropperActive: { classPropertyName: "eyedropperActive", publicName: "eyedropperActive", isSignal: true, isRequired: false, transformFunction: null }, themeGalleryOpen: { classPropertyName: "themeGalleryOpen", publicName: "themeGalleryOpen", isSignal: true, isRequired: false, transformFunction: null }, spellCheckEnabled: { classPropertyName: "spellCheckEnabled", publicName: "spellCheckEnabled", isSignal: true, isRequired: false, transformFunction: null }, showSubtitles: { classPropertyName: "showSubtitles", publicName: "showSubtitles", isSignal: true, isRequired: false, transformFunction: null }, hiddenActions: { classPropertyName: "hiddenActions", publicName: "hiddenActions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { present: "present", presenter: "presenter", record: "record", presentFromBeginning: "presentFromBeginning", rehearseTimings: "rehearseTimings", toggleSubtitles: "toggleSubtitles", openSubtitleSettings: "openSubtitleSettings", recordFromBeginning: "recordFromBeginning", recordFromCurrent: "recordFromCurrent", spellCheckChange: "spellCheckChange", broadcast: "broadcast", info: "info", print: "print", comments: "comments", a11y: "a11y", link: "link", openSorter: "openSorter", openMasterView: "openMasterView", toggleNotes: "toggleNotes", toggleInspector: "toggleInspector", drawToolChange: "drawToolChange", toggleThemeGallery: "toggleThemeGallery", toggleGrid: "toggleGrid", toggleRulers: "toggleRulers", toggleGuides: "toggleGuides", toggleSelectionPane: "toggleSelectionPane", openCustomShows: "openCustomShows", toggleSnapToGrid: "toggleSnapToGrid", toggleSnapToShape: "toggleSnapToShape", addGuide: "addGuide", zoomToFit: "zoomToFit", toggleEyedropper: "toggleEyedropper", openSetUpSlideShow: "openSetUpSlideShow", openCompare: "openCompare", openShortcuts: "openShortcuts", openSettings: "openSettings" }, host: { classAttribute: "contents" }, ngImport: i0, template: `
88921
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: RibbonContentSecondaryComponent, isStandalone: true, selector: "pptx-ribbon-content-secondary", inputs: { activeTab: { classPropertyName: "activeTab", publicName: "activeTab", isSignal: true, isRequired: true, transformFunction: null }, slideIndex: { classPropertyName: "slideIndex", publicName: "slideIndex", isSignal: true, isRequired: false, transformFunction: null }, slideCount: { classPropertyName: "slideCount", publicName: "slideCount", isSignal: true, isRequired: false, transformFunction: null }, canEdit: { classPropertyName: "canEdit", publicName: "canEdit", isSignal: true, isRequired: false, transformFunction: null }, selectedElement: { classPropertyName: "selectedElement", publicName: "selectedElement", isSignal: true, isRequired: false, transformFunction: null }, showGrid: { classPropertyName: "showGrid", publicName: "showGrid", isSignal: true, isRequired: false, transformFunction: null }, showRulers: { classPropertyName: "showRulers", publicName: "showRulers", isSignal: true, isRequired: false, transformFunction: null }, showGuides: { classPropertyName: "showGuides", publicName: "showGuides", isSignal: true, isRequired: false, transformFunction: null }, snapToGrid: { classPropertyName: "snapToGrid", publicName: "snapToGrid", isSignal: true, isRequired: false, transformFunction: null }, snapToShape: { classPropertyName: "snapToShape", publicName: "snapToShape", isSignal: true, isRequired: false, transformFunction: null }, eyedropperActive: { classPropertyName: "eyedropperActive", publicName: "eyedropperActive", isSignal: true, isRequired: false, transformFunction: null }, themeGalleryOpen: { classPropertyName: "themeGalleryOpen", publicName: "themeGalleryOpen", isSignal: true, isRequired: false, transformFunction: null }, spellCheckEnabled: { classPropertyName: "spellCheckEnabled", publicName: "spellCheckEnabled", isSignal: true, isRequired: false, transformFunction: null }, showSubtitles: { classPropertyName: "showSubtitles", publicName: "showSubtitles", isSignal: true, isRequired: false, transformFunction: null }, hiddenActions: { classPropertyName: "hiddenActions", publicName: "hiddenActions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { present: "present", presenter: "presenter", record: "record", presentFromBeginning: "presentFromBeginning", rehearseTimings: "rehearseTimings", toggleSubtitles: "toggleSubtitles", openSubtitleSettings: "openSubtitleSettings", recordFromBeginning: "recordFromBeginning", recordFromCurrent: "recordFromCurrent", spellCheckChange: "spellCheckChange", broadcast: "broadcast", info: "info", print: "print", comments: "comments", a11y: "a11y", link: "link", openSorter: "openSorter", openReadingView: "openReadingView", openMasterView: "openMasterView", toggleNotes: "toggleNotes", toggleInspector: "toggleInspector", drawToolChange: "drawToolChange", toggleThemeGallery: "toggleThemeGallery", toggleGrid: "toggleGrid", toggleRulers: "toggleRulers", toggleGuides: "toggleGuides", toggleSelectionPane: "toggleSelectionPane", openCustomShows: "openCustomShows", toggleSnapToGrid: "toggleSnapToGrid", toggleSnapToShape: "toggleSnapToShape", addGuide: "addGuide", zoomToFit: "zoomToFit", toggleEyedropper: "toggleEyedropper", openSetUpSlideShow: "openSetUpSlideShow", openCompare: "openCompare", openShortcuts: "openShortcuts", openSettings: "openSettings" }, host: { classAttribute: "contents" }, ngImport: i0, template: `
87975
88922
  @switch (activeTab()) {
87976
88923
  @case ('slideShow') {
87977
88924
  <pptx-ribbon-slideshow-section
@@ -88012,6 +88959,7 @@ class RibbonContentSecondaryComponent {
88012
88959
  [snapToShape]="snapToShape()"
88013
88960
  [eyedropperActive]="eyedropperActive()"
88014
88961
  (openSorter)="openSorter.emit()"
88962
+ (openReadingView)="openReadingView.emit()"
88015
88963
  (openMasterView)="openMasterView.emit()"
88016
88964
  (toggleGrid)="toggleGrid.emit()"
88017
88965
  (toggleRulers)="toggleRulers.emit()"
@@ -88078,7 +89026,7 @@ class RibbonContentSecondaryComponent {
88078
89026
  />
88079
89027
  }
88080
89028
  }
88081
- `, isInline: true, dependencies: [{ kind: "component", type: RibbonSlideshowSectionComponent, selector: "pptx-ribbon-slideshow-section", inputs: ["slideCount", "showSubtitles", "hiddenActions"], outputs: ["presentFromBeginning", "presentFromCurrent", "presenter", "broadcast", "openCustomShows", "openSetUpSlideShow", "rehearseTimings", "record", "toggleSubtitles", "openSubtitleSettings"] }, { kind: "component", type: RibbonReviewSectionComponent, selector: "pptx-ribbon-review-section", inputs: ["spellCheckEnabled", "canEdit"], outputs: ["comments", "spellCheckChange", "a11y", "openCompare", "language", "link"] }, { kind: "component", type: RibbonViewSectionComponent, selector: "pptx-ribbon-view-section", inputs: ["canEdit", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToShape", "eyedropperActive"], outputs: ["openSorter", "openMasterView", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "toggleSnapToGrid", "toggleSnapToShape", "addGuide", "zoomToFit", "toggleEyedropper"] }, { kind: "component", type: RibbonDrawSectionComponent, selector: "pptx-ribbon-draw-section", inputs: ["activeTool", "drawingColor", "drawingWidth"], outputs: ["drawToolChange"] }, { kind: "component", type: RibbonDesignSectionComponent, selector: "pptx-ribbon-design-section", inputs: ["themeGalleryOpen"], outputs: ["toggleThemeGallery", "info", "toggleInspector"] }, { kind: "component", type: RibbonTransitionsSectionComponent, selector: "pptx-ribbon-transitions-section", inputs: ["slideIndex", "selectedTransition", "transitionDurationSec"], outputs: ["present", "toggleInspector", "transitionChange", "durationChange"] }, { kind: "component", type: RibbonAnimationsSectionComponent, selector: "pptx-ribbon-animations-section", inputs: ["slideIndex", "selectedElement", "canEdit"], outputs: ["present", "toggleInspector"] }, { kind: "component", type: RibbonRecordSectionComponent, selector: "pptx-ribbon-record-section", outputs: ["recordFromBeginning", "recordFromCurrent"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
89029
+ `, isInline: true, dependencies: [{ kind: "component", type: RibbonSlideshowSectionComponent, selector: "pptx-ribbon-slideshow-section", inputs: ["slideCount", "showSubtitles", "hiddenActions"], outputs: ["presentFromBeginning", "presentFromCurrent", "presenter", "broadcast", "openCustomShows", "openSetUpSlideShow", "rehearseTimings", "record", "toggleSubtitles", "openSubtitleSettings"] }, { kind: "component", type: RibbonReviewSectionComponent, selector: "pptx-ribbon-review-section", inputs: ["spellCheckEnabled", "canEdit"], outputs: ["comments", "spellCheckChange", "a11y", "openCompare", "language", "link"] }, { kind: "component", type: RibbonViewSectionComponent, selector: "pptx-ribbon-view-section", inputs: ["canEdit", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToShape", "eyedropperActive"], outputs: ["openSorter", "openReadingView", "openMasterView", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "toggleSnapToGrid", "toggleSnapToShape", "addGuide", "zoomToFit", "toggleEyedropper"] }, { kind: "component", type: RibbonDrawSectionComponent, selector: "pptx-ribbon-draw-section", inputs: ["activeTool", "drawingColor", "drawingWidth"], outputs: ["drawToolChange"] }, { kind: "component", type: RibbonDesignSectionComponent, selector: "pptx-ribbon-design-section", inputs: ["themeGalleryOpen"], outputs: ["toggleThemeGallery", "info", "toggleInspector"] }, { kind: "component", type: RibbonTransitionsSectionComponent, selector: "pptx-ribbon-transitions-section", inputs: ["slideIndex", "selectedTransition", "transitionDurationSec"], outputs: ["present", "toggleInspector", "transitionChange", "durationChange"] }, { kind: "component", type: RibbonAnimationsSectionComponent, selector: "pptx-ribbon-animations-section", inputs: ["slideIndex", "selectedElement", "canEdit"], outputs: ["present", "toggleInspector"] }, { kind: "component", type: RibbonRecordSectionComponent, selector: "pptx-ribbon-record-section", outputs: ["recordFromBeginning", "recordFromCurrent"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
88082
89030
  }
88083
89031
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: RibbonContentSecondaryComponent, decorators: [{
88084
89032
  type: Component,
@@ -88139,6 +89087,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
88139
89087
  [snapToShape]="snapToShape()"
88140
89088
  [eyedropperActive]="eyedropperActive()"
88141
89089
  (openSorter)="openSorter.emit()"
89090
+ (openReadingView)="openReadingView.emit()"
88142
89091
  (openMasterView)="openMasterView.emit()"
88143
89092
  (toggleGrid)="toggleGrid.emit()"
88144
89093
  (toggleRulers)="toggleRulers.emit()"
@@ -88207,7 +89156,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
88207
89156
  }
88208
89157
  `,
88209
89158
  }]
88210
- }], propDecorators: { activeTab: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeTab", required: true }] }], slideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideIndex", required: false }] }], slideCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideCount", required: false }] }], canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], selectedElement: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedElement", required: false }] }], showGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGrid", required: false }] }], showRulers: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRulers", required: false }] }], showGuides: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGuides", required: false }] }], snapToGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToGrid", required: false }] }], snapToShape: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToShape", required: false }] }], eyedropperActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "eyedropperActive", required: false }] }], themeGalleryOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "themeGalleryOpen", required: false }] }], spellCheckEnabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "spellCheckEnabled", required: false }] }], showSubtitles: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSubtitles", required: false }] }], hiddenActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "hiddenActions", required: false }] }], present: [{ type: i0.Output, args: ["present"] }], presenter: [{ type: i0.Output, args: ["presenter"] }], record: [{ type: i0.Output, args: ["record"] }], presentFromBeginning: [{ type: i0.Output, args: ["presentFromBeginning"] }], rehearseTimings: [{ type: i0.Output, args: ["rehearseTimings"] }], toggleSubtitles: [{ type: i0.Output, args: ["toggleSubtitles"] }], openSubtitleSettings: [{ type: i0.Output, args: ["openSubtitleSettings"] }], recordFromBeginning: [{ type: i0.Output, args: ["recordFromBeginning"] }], recordFromCurrent: [{ type: i0.Output, args: ["recordFromCurrent"] }], spellCheckChange: [{ type: i0.Output, args: ["spellCheckChange"] }], broadcast: [{ type: i0.Output, args: ["broadcast"] }], info: [{ type: i0.Output, args: ["info"] }], print: [{ type: i0.Output, args: ["print"] }], comments: [{ type: i0.Output, args: ["comments"] }], a11y: [{ type: i0.Output, args: ["a11y"] }], link: [{ type: i0.Output, args: ["link"] }], openSorter: [{ type: i0.Output, args: ["openSorter"] }], openMasterView: [{ type: i0.Output, args: ["openMasterView"] }], toggleNotes: [{ type: i0.Output, args: ["toggleNotes"] }], toggleInspector: [{ type: i0.Output, args: ["toggleInspector"] }], drawToolChange: [{ type: i0.Output, args: ["drawToolChange"] }], toggleThemeGallery: [{ type: i0.Output, args: ["toggleThemeGallery"] }], toggleGrid: [{ type: i0.Output, args: ["toggleGrid"] }], toggleRulers: [{ type: i0.Output, args: ["toggleRulers"] }], toggleGuides: [{ type: i0.Output, args: ["toggleGuides"] }], toggleSelectionPane: [{ type: i0.Output, args: ["toggleSelectionPane"] }], openCustomShows: [{ type: i0.Output, args: ["openCustomShows"] }], toggleSnapToGrid: [{ type: i0.Output, args: ["toggleSnapToGrid"] }], toggleSnapToShape: [{ type: i0.Output, args: ["toggleSnapToShape"] }], addGuide: [{ type: i0.Output, args: ["addGuide"] }], zoomToFit: [{ type: i0.Output, args: ["zoomToFit"] }], toggleEyedropper: [{ type: i0.Output, args: ["toggleEyedropper"] }], openSetUpSlideShow: [{ type: i0.Output, args: ["openSetUpSlideShow"] }], openCompare: [{ type: i0.Output, args: ["openCompare"] }], openShortcuts: [{ type: i0.Output, args: ["openShortcuts"] }], openSettings: [{ type: i0.Output, args: ["openSettings"] }] } });
89159
+ }], propDecorators: { activeTab: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeTab", required: true }] }], slideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideIndex", required: false }] }], slideCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideCount", required: false }] }], canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], selectedElement: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedElement", required: false }] }], showGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGrid", required: false }] }], showRulers: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRulers", required: false }] }], showGuides: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGuides", required: false }] }], snapToGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToGrid", required: false }] }], snapToShape: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToShape", required: false }] }], eyedropperActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "eyedropperActive", required: false }] }], themeGalleryOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "themeGalleryOpen", required: false }] }], spellCheckEnabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "spellCheckEnabled", required: false }] }], showSubtitles: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSubtitles", required: false }] }], hiddenActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "hiddenActions", required: false }] }], present: [{ type: i0.Output, args: ["present"] }], presenter: [{ type: i0.Output, args: ["presenter"] }], record: [{ type: i0.Output, args: ["record"] }], presentFromBeginning: [{ type: i0.Output, args: ["presentFromBeginning"] }], rehearseTimings: [{ type: i0.Output, args: ["rehearseTimings"] }], toggleSubtitles: [{ type: i0.Output, args: ["toggleSubtitles"] }], openSubtitleSettings: [{ type: i0.Output, args: ["openSubtitleSettings"] }], recordFromBeginning: [{ type: i0.Output, args: ["recordFromBeginning"] }], recordFromCurrent: [{ type: i0.Output, args: ["recordFromCurrent"] }], spellCheckChange: [{ type: i0.Output, args: ["spellCheckChange"] }], broadcast: [{ type: i0.Output, args: ["broadcast"] }], info: [{ type: i0.Output, args: ["info"] }], print: [{ type: i0.Output, args: ["print"] }], comments: [{ type: i0.Output, args: ["comments"] }], a11y: [{ type: i0.Output, args: ["a11y"] }], link: [{ type: i0.Output, args: ["link"] }], openSorter: [{ type: i0.Output, args: ["openSorter"] }], openReadingView: [{ type: i0.Output, args: ["openReadingView"] }], openMasterView: [{ type: i0.Output, args: ["openMasterView"] }], toggleNotes: [{ type: i0.Output, args: ["toggleNotes"] }], toggleInspector: [{ type: i0.Output, args: ["toggleInspector"] }], drawToolChange: [{ type: i0.Output, args: ["drawToolChange"] }], toggleThemeGallery: [{ type: i0.Output, args: ["toggleThemeGallery"] }], toggleGrid: [{ type: i0.Output, args: ["toggleGrid"] }], toggleRulers: [{ type: i0.Output, args: ["toggleRulers"] }], toggleGuides: [{ type: i0.Output, args: ["toggleGuides"] }], toggleSelectionPane: [{ type: i0.Output, args: ["toggleSelectionPane"] }], openCustomShows: [{ type: i0.Output, args: ["openCustomShows"] }], toggleSnapToGrid: [{ type: i0.Output, args: ["toggleSnapToGrid"] }], toggleSnapToShape: [{ type: i0.Output, args: ["toggleSnapToShape"] }], addGuide: [{ type: i0.Output, args: ["addGuide"] }], zoomToFit: [{ type: i0.Output, args: ["zoomToFit"] }], toggleEyedropper: [{ type: i0.Output, args: ["toggleEyedropper"] }], openSetUpSlideShow: [{ type: i0.Output, args: ["openSetUpSlideShow"] }], openCompare: [{ type: i0.Output, args: ["openCompare"] }], openShortcuts: [{ type: i0.Output, args: ["openShortcuts"] }], openSettings: [{ type: i0.Output, args: ["openSettings"] }] } });
88211
89160
 
88212
89161
  /**
88213
89162
  * ribbon-shape-extras.component.ts: the Arrange group's shape-level extras
@@ -89120,7 +90069,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
89120
90069
  }], propDecorators: { canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], slideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideIndex", required: false }] }] } });
89121
90070
 
89122
90071
  // Generated by scripts/inline-shared.mjs from package.json. Do not edit.
89123
- const PPTX_ANGULAR_VIEWER_VERSION = "2.8.0";
90072
+ const PPTX_ANGULAR_VIEWER_VERSION = "2.9.0";
89124
90073
 
89125
90074
  /**
89126
90075
  * account-page.component.ts: File > Account content.
@@ -93181,6 +94130,8 @@ class RibbonComponent {
93181
94130
  a11y = output();
93182
94131
  link = output();
93183
94132
  openSorter = output();
94133
+ /** View tab > Reading View: the deck full-window, not the slide show. */
94134
+ openReadingView = output();
93184
94135
  openMasterView = output();
93185
94136
  toggleNotes = output();
93186
94137
  toggleFormatPainter = output();
@@ -93245,7 +94196,7 @@ class RibbonComponent {
93245
94196
  this.spellCheckChange.emit(enabled);
93246
94197
  }
93247
94198
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: RibbonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
93248
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.8", type: RibbonComponent, isStandalone: true, selector: "pptx-ribbon", inputs: { slideIndex: { classPropertyName: "slideIndex", publicName: "slideIndex", isSignal: true, isRequired: false, transformFunction: null }, slideCount: { classPropertyName: "slideCount", publicName: "slideCount", isSignal: true, isRequired: false, transformFunction: null }, canEdit: { classPropertyName: "canEdit", publicName: "canEdit", isSignal: true, isRequired: false, transformFunction: null }, selectedElement: { classPropertyName: "selectedElement", publicName: "selectedElement", isSignal: true, isRequired: false, transformFunction: null }, zoomPercent: { classPropertyName: "zoomPercent", publicName: "zoomPercent", isSignal: true, isRequired: false, transformFunction: null }, formatPainterActive: { classPropertyName: "formatPainterActive", publicName: "formatPainterActive", isSignal: true, isRequired: false, transformFunction: null }, canActivateFormatPainter: { classPropertyName: "canActivateFormatPainter", publicName: "canActivateFormatPainter", isSignal: true, isRequired: false, transformFunction: null }, exporting: { classPropertyName: "exporting", publicName: "exporting", isSignal: true, isRequired: false, transformFunction: null }, hasMacros: { classPropertyName: "hasMacros", publicName: "hasMacros", isSignal: true, isRequired: false, transformFunction: null }, showGrid: { classPropertyName: "showGrid", publicName: "showGrid", isSignal: true, isRequired: false, transformFunction: null }, showRulers: { classPropertyName: "showRulers", publicName: "showRulers", isSignal: true, isRequired: false, transformFunction: null }, showGuides: { classPropertyName: "showGuides", publicName: "showGuides", isSignal: true, isRequired: false, transformFunction: null }, snapToGrid: { classPropertyName: "snapToGrid", publicName: "snapToGrid", isSignal: true, isRequired: false, transformFunction: null }, snapToShape: { classPropertyName: "snapToShape", publicName: "snapToShape", isSignal: true, isRequired: false, transformFunction: null }, eyedropperActive: { classPropertyName: "eyedropperActive", publicName: "eyedropperActive", isSignal: true, isRequired: false, transformFunction: null }, themeGalleryOpen: { classPropertyName: "themeGalleryOpen", publicName: "themeGalleryOpen", isSignal: true, isRequired: false, transformFunction: null }, sidebarCollapsed: { classPropertyName: "sidebarCollapsed", publicName: "sidebarCollapsed", isSignal: true, isRequired: false, transformFunction: null }, inspectorOpen: { classPropertyName: "inspectorOpen", publicName: "inspectorOpen", isSignal: true, isRequired: false, transformFunction: null }, commentsOpen: { classPropertyName: "commentsOpen", publicName: "commentsOpen", isSignal: true, isRequired: false, transformFunction: null }, commentCount: { classPropertyName: "commentCount", publicName: "commentCount", isSignal: true, isRequired: false, transformFunction: null }, findOpen: { classPropertyName: "findOpen", publicName: "findOpen", isSignal: true, isRequired: false, transformFunction: null }, collabConnected: { classPropertyName: "collabConnected", publicName: "collabConnected", isSignal: true, isRequired: false, transformFunction: null }, connectedCount: { classPropertyName: "connectedCount", publicName: "connectedCount", isSignal: true, isRequired: false, transformFunction: null }, spellCheckEnabled: { classPropertyName: "spellCheckEnabled", publicName: "spellCheckEnabled", isSignal: true, isRequired: false, transformFunction: null }, showSubtitles: { classPropertyName: "showSubtitles", publicName: "showSubtitles", isSignal: true, isRequired: false, transformFunction: null }, hiddenActions: { classPropertyName: "hiddenActions", publicName: "hiddenActions", isSignal: true, isRequired: false, transformFunction: null }, aiEnabled: { classPropertyName: "aiEnabled", publicName: "aiEnabled", isSignal: true, isRequired: false, transformFunction: null }, aiPanelOpen: { classPropertyName: "aiPanelOpen", publicName: "aiPanelOpen", isSignal: true, isRequired: false, transformFunction: null }, accountAuth: { classPropertyName: "accountAuth", publicName: "accountAuth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { prev: "prev", next: "next", zoomIn: "zoomIn", zoomOut: "zoomOut", zoomReset: "zoomReset", find: "find", present: "present", presenter: "presenter", record: "record", presentFromBeginning: "presentFromBeginning", rehearseTimings: "rehearseTimings", toggleSubtitles: "toggleSubtitles", openSubtitleSettings: "openSubtitleSettings", recordFromBeginning: "recordFromBeginning", recordFromCurrent: "recordFromCurrent", spellCheckChange: "spellCheckChange", share: "share", broadcast: "broadcast", openFile: "openFile", openRecentFile: "openRecentFile", createPresentation: "createPresentation", save: "save", savePpsx: "savePpsx", savePptm: "savePptm", packageForSharing: "packageForSharing", toggleSidebar: "toggleSidebar", toggleAiPanel: "toggleAiPanel", signatures: "signatures", info: "info", print: "print", comments: "comments", a11y: "a11y", link: "link", openSorter: "openSorter", openMasterView: "openMasterView", toggleNotes: "toggleNotes", toggleFormatPainter: "toggleFormatPainter", exportPng: "exportPng", exportPdf: "exportPdf", exportGif: "exportGif", exportVideo: "exportVideo", copySlideAsImage: "copySlideAsImage", replace: "replace", toggleInspector: "toggleInspector", drawToolChange: "drawToolChange", toggleThemeGallery: "toggleThemeGallery", toggleGrid: "toggleGrid", toggleRulers: "toggleRulers", toggleGuides: "toggleGuides", toggleSelectionPane: "toggleSelectionPane", openCustomShows: "openCustomShows", toggleSnapToGrid: "toggleSnapToGrid", toggleSnapToShape: "toggleSnapToShape", addGuide: "addGuide", zoomToFit: "zoomToFit", toggleEyedropper: "toggleEyedropper", openSmartArtDialog: "openSmartArtDialog", openEquationDialog: "openEquationDialog", openSetUpSlideShow: "openSetUpSlideShow", openCompare: "openCompare", openPassword: "openPassword", openFontEmbedding: "openFontEmbedding", openVersionHistory: "openVersionHistory", openShortcuts: "openShortcuts", openSettings: "openSettings" }, ngImport: i0, template: `
94199
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.8", type: RibbonComponent, isStandalone: true, selector: "pptx-ribbon", inputs: { slideIndex: { classPropertyName: "slideIndex", publicName: "slideIndex", isSignal: true, isRequired: false, transformFunction: null }, slideCount: { classPropertyName: "slideCount", publicName: "slideCount", isSignal: true, isRequired: false, transformFunction: null }, canEdit: { classPropertyName: "canEdit", publicName: "canEdit", isSignal: true, isRequired: false, transformFunction: null }, selectedElement: { classPropertyName: "selectedElement", publicName: "selectedElement", isSignal: true, isRequired: false, transformFunction: null }, zoomPercent: { classPropertyName: "zoomPercent", publicName: "zoomPercent", isSignal: true, isRequired: false, transformFunction: null }, formatPainterActive: { classPropertyName: "formatPainterActive", publicName: "formatPainterActive", isSignal: true, isRequired: false, transformFunction: null }, canActivateFormatPainter: { classPropertyName: "canActivateFormatPainter", publicName: "canActivateFormatPainter", isSignal: true, isRequired: false, transformFunction: null }, exporting: { classPropertyName: "exporting", publicName: "exporting", isSignal: true, isRequired: false, transformFunction: null }, hasMacros: { classPropertyName: "hasMacros", publicName: "hasMacros", isSignal: true, isRequired: false, transformFunction: null }, showGrid: { classPropertyName: "showGrid", publicName: "showGrid", isSignal: true, isRequired: false, transformFunction: null }, showRulers: { classPropertyName: "showRulers", publicName: "showRulers", isSignal: true, isRequired: false, transformFunction: null }, showGuides: { classPropertyName: "showGuides", publicName: "showGuides", isSignal: true, isRequired: false, transformFunction: null }, snapToGrid: { classPropertyName: "snapToGrid", publicName: "snapToGrid", isSignal: true, isRequired: false, transformFunction: null }, snapToShape: { classPropertyName: "snapToShape", publicName: "snapToShape", isSignal: true, isRequired: false, transformFunction: null }, eyedropperActive: { classPropertyName: "eyedropperActive", publicName: "eyedropperActive", isSignal: true, isRequired: false, transformFunction: null }, themeGalleryOpen: { classPropertyName: "themeGalleryOpen", publicName: "themeGalleryOpen", isSignal: true, isRequired: false, transformFunction: null }, sidebarCollapsed: { classPropertyName: "sidebarCollapsed", publicName: "sidebarCollapsed", isSignal: true, isRequired: false, transformFunction: null }, inspectorOpen: { classPropertyName: "inspectorOpen", publicName: "inspectorOpen", isSignal: true, isRequired: false, transformFunction: null }, commentsOpen: { classPropertyName: "commentsOpen", publicName: "commentsOpen", isSignal: true, isRequired: false, transformFunction: null }, commentCount: { classPropertyName: "commentCount", publicName: "commentCount", isSignal: true, isRequired: false, transformFunction: null }, findOpen: { classPropertyName: "findOpen", publicName: "findOpen", isSignal: true, isRequired: false, transformFunction: null }, collabConnected: { classPropertyName: "collabConnected", publicName: "collabConnected", isSignal: true, isRequired: false, transformFunction: null }, connectedCount: { classPropertyName: "connectedCount", publicName: "connectedCount", isSignal: true, isRequired: false, transformFunction: null }, spellCheckEnabled: { classPropertyName: "spellCheckEnabled", publicName: "spellCheckEnabled", isSignal: true, isRequired: false, transformFunction: null }, showSubtitles: { classPropertyName: "showSubtitles", publicName: "showSubtitles", isSignal: true, isRequired: false, transformFunction: null }, hiddenActions: { classPropertyName: "hiddenActions", publicName: "hiddenActions", isSignal: true, isRequired: false, transformFunction: null }, aiEnabled: { classPropertyName: "aiEnabled", publicName: "aiEnabled", isSignal: true, isRequired: false, transformFunction: null }, aiPanelOpen: { classPropertyName: "aiPanelOpen", publicName: "aiPanelOpen", isSignal: true, isRequired: false, transformFunction: null }, accountAuth: { classPropertyName: "accountAuth", publicName: "accountAuth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { prev: "prev", next: "next", zoomIn: "zoomIn", zoomOut: "zoomOut", zoomReset: "zoomReset", find: "find", present: "present", presenter: "presenter", record: "record", presentFromBeginning: "presentFromBeginning", rehearseTimings: "rehearseTimings", toggleSubtitles: "toggleSubtitles", openSubtitleSettings: "openSubtitleSettings", recordFromBeginning: "recordFromBeginning", recordFromCurrent: "recordFromCurrent", spellCheckChange: "spellCheckChange", share: "share", broadcast: "broadcast", openFile: "openFile", openRecentFile: "openRecentFile", createPresentation: "createPresentation", save: "save", savePpsx: "savePpsx", savePptm: "savePptm", packageForSharing: "packageForSharing", toggleSidebar: "toggleSidebar", toggleAiPanel: "toggleAiPanel", signatures: "signatures", info: "info", print: "print", comments: "comments", a11y: "a11y", link: "link", openSorter: "openSorter", openReadingView: "openReadingView", openMasterView: "openMasterView", toggleNotes: "toggleNotes", toggleFormatPainter: "toggleFormatPainter", exportPng: "exportPng", exportPdf: "exportPdf", exportGif: "exportGif", exportVideo: "exportVideo", copySlideAsImage: "copySlideAsImage", replace: "replace", toggleInspector: "toggleInspector", drawToolChange: "drawToolChange", toggleThemeGallery: "toggleThemeGallery", toggleGrid: "toggleGrid", toggleRulers: "toggleRulers", toggleGuides: "toggleGuides", toggleSelectionPane: "toggleSelectionPane", openCustomShows: "openCustomShows", toggleSnapToGrid: "toggleSnapToGrid", toggleSnapToShape: "toggleSnapToShape", addGuide: "addGuide", zoomToFit: "zoomToFit", toggleEyedropper: "toggleEyedropper", openSmartArtDialog: "openSmartArtDialog", openEquationDialog: "openEquationDialog", openSetUpSlideShow: "openSetUpSlideShow", openCompare: "openCompare", openPassword: "openPassword", openFontEmbedding: "openFontEmbedding", openVersionHistory: "openVersionHistory", openShortcuts: "openShortcuts", openSettings: "openSettings" }, ngImport: i0, template: `
93249
94200
  <div
93250
94201
  role="toolbar"
93251
94202
  [attr.aria-label]="'pptx.toolbar.presentationToolbarAria' | translate"
@@ -93369,6 +94320,7 @@ class RibbonComponent {
93369
94320
  (a11y)="a11y.emit()"
93370
94321
  (link)="link.emit()"
93371
94322
  (openSorter)="openSorter.emit()"
94323
+ (openReadingView)="openReadingView.emit()"
93372
94324
  (openMasterView)="openMasterView.emit()"
93373
94325
  (toggleNotes)="toggleNotes.emit()"
93374
94326
  (toggleInspector)="toggleInspector.emit()"
@@ -93391,7 +94343,7 @@ class RibbonComponent {
93391
94343
  />
93392
94344
  </div>
93393
94345
  </div>
93394
- `, isInline: true, dependencies: [{ kind: "component", type: RibbonPrimaryRowComponent, selector: "pptx-ribbon-primary-row", inputs: ["slideCount", "sidebarCollapsed", "inspectorOpen", "commentsOpen", "commentCount", "hiddenActions", "aiEnabled", "aiPanelOpen"], outputs: ["toggleSidebar", "toggleAiPanel", "toggleComments", "present", "presenter", "broadcast", "openCustomShows", "toggleInspector", "openSettings", "exportPng", "exportPdf", "exportGif", "exportVideo", "print", "info", "a11y", "save"] }, { kind: "component", type: RibbonTabListComponent, selector: "pptx-ribbon-tab-list", inputs: ["activeTab", "canEdit", "collabConnected", "connectedCount", "ribbonExpanded", "hiddenActions"], outputs: ["selectTab", "record", "share", "toggleRibbonExpanded"] }, { kind: "component", type: RibbonContentComponent, selector: "pptx-ribbon-content", inputs: ["activeTab", "slideIndex", "slideCount", "canEdit", "selectedElement", "formatPainterActive", "canActivateFormatPainter", "exporting", "hasMacros", "hiddenActions", "accountAuth"], outputs: ["selectTab", "find", "share", "openFile", "openRecentFile", "createPresentation", "save", "savePpsx", "savePptm", "packageForSharing", "signatures", "info", "print", "toggleFormatPainter", "exportPng", "exportPdf", "exportGif", "exportVideo", "copySlideAsImage", "replace", "openSmartArtDialog", "openEquationDialog", "link", "openPassword", "openFontEmbedding", "openVersionHistory", "openSettings"] }, { kind: "component", type: RibbonContentSecondaryComponent, selector: "pptx-ribbon-content-secondary", inputs: ["activeTab", "slideIndex", "slideCount", "canEdit", "selectedElement", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToShape", "eyedropperActive", "themeGalleryOpen", "spellCheckEnabled", "showSubtitles", "hiddenActions"], outputs: ["present", "presenter", "record", "presentFromBeginning", "rehearseTimings", "toggleSubtitles", "openSubtitleSettings", "recordFromBeginning", "recordFromCurrent", "spellCheckChange", "broadcast", "info", "print", "comments", "a11y", "link", "openSorter", "openMasterView", "toggleNotes", "toggleInspector", "drawToolChange", "toggleThemeGallery", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "openCustomShows", "toggleSnapToGrid", "toggleSnapToShape", "addGuide", "zoomToFit", "toggleEyedropper", "openSetUpSlideShow", "openCompare", "openShortcuts", "openSettings"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
94346
+ `, isInline: true, dependencies: [{ kind: "component", type: RibbonPrimaryRowComponent, selector: "pptx-ribbon-primary-row", inputs: ["slideCount", "sidebarCollapsed", "inspectorOpen", "commentsOpen", "commentCount", "hiddenActions", "aiEnabled", "aiPanelOpen"], outputs: ["toggleSidebar", "toggleAiPanel", "toggleComments", "present", "presenter", "broadcast", "openCustomShows", "toggleInspector", "openSettings", "exportPng", "exportPdf", "exportGif", "exportVideo", "print", "info", "a11y", "save"] }, { kind: "component", type: RibbonTabListComponent, selector: "pptx-ribbon-tab-list", inputs: ["activeTab", "canEdit", "collabConnected", "connectedCount", "ribbonExpanded", "hiddenActions"], outputs: ["selectTab", "record", "share", "toggleRibbonExpanded"] }, { kind: "component", type: RibbonContentComponent, selector: "pptx-ribbon-content", inputs: ["activeTab", "slideIndex", "slideCount", "canEdit", "selectedElement", "formatPainterActive", "canActivateFormatPainter", "exporting", "hasMacros", "hiddenActions", "accountAuth"], outputs: ["selectTab", "find", "share", "openFile", "openRecentFile", "createPresentation", "save", "savePpsx", "savePptm", "packageForSharing", "signatures", "info", "print", "toggleFormatPainter", "exportPng", "exportPdf", "exportGif", "exportVideo", "copySlideAsImage", "replace", "openSmartArtDialog", "openEquationDialog", "link", "openPassword", "openFontEmbedding", "openVersionHistory", "openSettings"] }, { kind: "component", type: RibbonContentSecondaryComponent, selector: "pptx-ribbon-content-secondary", inputs: ["activeTab", "slideIndex", "slideCount", "canEdit", "selectedElement", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToShape", "eyedropperActive", "themeGalleryOpen", "spellCheckEnabled", "showSubtitles", "hiddenActions"], outputs: ["present", "presenter", "record", "presentFromBeginning", "rehearseTimings", "toggleSubtitles", "openSubtitleSettings", "recordFromBeginning", "recordFromCurrent", "spellCheckChange", "broadcast", "info", "print", "comments", "a11y", "link", "openSorter", "openReadingView", "openMasterView", "toggleNotes", "toggleInspector", "drawToolChange", "toggleThemeGallery", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "openCustomShows", "toggleSnapToGrid", "toggleSnapToShape", "addGuide", "zoomToFit", "toggleEyedropper", "openSetUpSlideShow", "openCompare", "openShortcuts", "openSettings"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
93395
94347
  }
93396
94348
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: RibbonComponent, decorators: [{
93397
94349
  type: Component,
@@ -93530,6 +94482,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
93530
94482
  (a11y)="a11y.emit()"
93531
94483
  (link)="link.emit()"
93532
94484
  (openSorter)="openSorter.emit()"
94485
+ (openReadingView)="openReadingView.emit()"
93533
94486
  (openMasterView)="openMasterView.emit()"
93534
94487
  (toggleNotes)="toggleNotes.emit()"
93535
94488
  (toggleInspector)="toggleInspector.emit()"
@@ -93554,7 +94507,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
93554
94507
  </div>
93555
94508
  `,
93556
94509
  }]
93557
- }], propDecorators: { slideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideIndex", required: false }] }], slideCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideCount", required: false }] }], canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], selectedElement: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedElement", required: false }] }], zoomPercent: [{ type: i0.Input, args: [{ isSignal: true, alias: "zoomPercent", required: false }] }], formatPainterActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "formatPainterActive", required: false }] }], canActivateFormatPainter: [{ type: i0.Input, args: [{ isSignal: true, alias: "canActivateFormatPainter", required: false }] }], exporting: [{ type: i0.Input, args: [{ isSignal: true, alias: "exporting", required: false }] }], hasMacros: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasMacros", required: false }] }], showGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGrid", required: false }] }], showRulers: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRulers", required: false }] }], showGuides: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGuides", required: false }] }], snapToGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToGrid", required: false }] }], snapToShape: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToShape", required: false }] }], eyedropperActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "eyedropperActive", required: false }] }], themeGalleryOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "themeGalleryOpen", required: false }] }], sidebarCollapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "sidebarCollapsed", required: false }] }], inspectorOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "inspectorOpen", required: false }] }], commentsOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "commentsOpen", required: false }] }], commentCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "commentCount", required: false }] }], findOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "findOpen", required: false }] }], collabConnected: [{ type: i0.Input, args: [{ isSignal: true, alias: "collabConnected", required: false }] }], connectedCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "connectedCount", required: false }] }], spellCheckEnabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "spellCheckEnabled", required: false }] }], showSubtitles: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSubtitles", required: false }] }], hiddenActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "hiddenActions", required: false }] }], aiEnabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "aiEnabled", required: false }] }], aiPanelOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "aiPanelOpen", required: false }] }], accountAuth: [{ type: i0.Input, args: [{ isSignal: true, alias: "accountAuth", required: false }] }], prev: [{ type: i0.Output, args: ["prev"] }], next: [{ type: i0.Output, args: ["next"] }], zoomIn: [{ type: i0.Output, args: ["zoomIn"] }], zoomOut: [{ type: i0.Output, args: ["zoomOut"] }], zoomReset: [{ type: i0.Output, args: ["zoomReset"] }], find: [{ type: i0.Output, args: ["find"] }], present: [{ type: i0.Output, args: ["present"] }], presenter: [{ type: i0.Output, args: ["presenter"] }], record: [{ type: i0.Output, args: ["record"] }], presentFromBeginning: [{ type: i0.Output, args: ["presentFromBeginning"] }], rehearseTimings: [{ type: i0.Output, args: ["rehearseTimings"] }], toggleSubtitles: [{ type: i0.Output, args: ["toggleSubtitles"] }], openSubtitleSettings: [{ type: i0.Output, args: ["openSubtitleSettings"] }], recordFromBeginning: [{ type: i0.Output, args: ["recordFromBeginning"] }], recordFromCurrent: [{ type: i0.Output, args: ["recordFromCurrent"] }], spellCheckChange: [{ type: i0.Output, args: ["spellCheckChange"] }], share: [{ type: i0.Output, args: ["share"] }], broadcast: [{ type: i0.Output, args: ["broadcast"] }], openFile: [{ type: i0.Output, args: ["openFile"] }], openRecentFile: [{ type: i0.Output, args: ["openRecentFile"] }], createPresentation: [{ type: i0.Output, args: ["createPresentation"] }], save: [{ type: i0.Output, args: ["save"] }], savePpsx: [{ type: i0.Output, args: ["savePpsx"] }], savePptm: [{ type: i0.Output, args: ["savePptm"] }], packageForSharing: [{ type: i0.Output, args: ["packageForSharing"] }], toggleSidebar: [{ type: i0.Output, args: ["toggleSidebar"] }], toggleAiPanel: [{ type: i0.Output, args: ["toggleAiPanel"] }], signatures: [{ type: i0.Output, args: ["signatures"] }], info: [{ type: i0.Output, args: ["info"] }], print: [{ type: i0.Output, args: ["print"] }], comments: [{ type: i0.Output, args: ["comments"] }], a11y: [{ type: i0.Output, args: ["a11y"] }], link: [{ type: i0.Output, args: ["link"] }], openSorter: [{ type: i0.Output, args: ["openSorter"] }], openMasterView: [{ type: i0.Output, args: ["openMasterView"] }], toggleNotes: [{ type: i0.Output, args: ["toggleNotes"] }], toggleFormatPainter: [{ type: i0.Output, args: ["toggleFormatPainter"] }], exportPng: [{ type: i0.Output, args: ["exportPng"] }], exportPdf: [{ type: i0.Output, args: ["exportPdf"] }], exportGif: [{ type: i0.Output, args: ["exportGif"] }], exportVideo: [{ type: i0.Output, args: ["exportVideo"] }], copySlideAsImage: [{ type: i0.Output, args: ["copySlideAsImage"] }], replace: [{ type: i0.Output, args: ["replace"] }], toggleInspector: [{ type: i0.Output, args: ["toggleInspector"] }], drawToolChange: [{ type: i0.Output, args: ["drawToolChange"] }], toggleThemeGallery: [{ type: i0.Output, args: ["toggleThemeGallery"] }], toggleGrid: [{ type: i0.Output, args: ["toggleGrid"] }], toggleRulers: [{ type: i0.Output, args: ["toggleRulers"] }], toggleGuides: [{ type: i0.Output, args: ["toggleGuides"] }], toggleSelectionPane: [{ type: i0.Output, args: ["toggleSelectionPane"] }], openCustomShows: [{ type: i0.Output, args: ["openCustomShows"] }], toggleSnapToGrid: [{ type: i0.Output, args: ["toggleSnapToGrid"] }], toggleSnapToShape: [{ type: i0.Output, args: ["toggleSnapToShape"] }], addGuide: [{ type: i0.Output, args: ["addGuide"] }], zoomToFit: [{ type: i0.Output, args: ["zoomToFit"] }], toggleEyedropper: [{ type: i0.Output, args: ["toggleEyedropper"] }], openSmartArtDialog: [{ type: i0.Output, args: ["openSmartArtDialog"] }], openEquationDialog: [{ type: i0.Output, args: ["openEquationDialog"] }], openSetUpSlideShow: [{ type: i0.Output, args: ["openSetUpSlideShow"] }], openCompare: [{ type: i0.Output, args: ["openCompare"] }], openPassword: [{ type: i0.Output, args: ["openPassword"] }], openFontEmbedding: [{ type: i0.Output, args: ["openFontEmbedding"] }], openVersionHistory: [{ type: i0.Output, args: ["openVersionHistory"] }], openShortcuts: [{ type: i0.Output, args: ["openShortcuts"] }], openSettings: [{ type: i0.Output, args: ["openSettings"] }] } });
94510
+ }], propDecorators: { slideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideIndex", required: false }] }], slideCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideCount", required: false }] }], canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], selectedElement: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedElement", required: false }] }], zoomPercent: [{ type: i0.Input, args: [{ isSignal: true, alias: "zoomPercent", required: false }] }], formatPainterActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "formatPainterActive", required: false }] }], canActivateFormatPainter: [{ type: i0.Input, args: [{ isSignal: true, alias: "canActivateFormatPainter", required: false }] }], exporting: [{ type: i0.Input, args: [{ isSignal: true, alias: "exporting", required: false }] }], hasMacros: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasMacros", required: false }] }], showGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGrid", required: false }] }], showRulers: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRulers", required: false }] }], showGuides: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGuides", required: false }] }], snapToGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToGrid", required: false }] }], snapToShape: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToShape", required: false }] }], eyedropperActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "eyedropperActive", required: false }] }], themeGalleryOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "themeGalleryOpen", required: false }] }], sidebarCollapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "sidebarCollapsed", required: false }] }], inspectorOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "inspectorOpen", required: false }] }], commentsOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "commentsOpen", required: false }] }], commentCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "commentCount", required: false }] }], findOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "findOpen", required: false }] }], collabConnected: [{ type: i0.Input, args: [{ isSignal: true, alias: "collabConnected", required: false }] }], connectedCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "connectedCount", required: false }] }], spellCheckEnabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "spellCheckEnabled", required: false }] }], showSubtitles: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSubtitles", required: false }] }], hiddenActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "hiddenActions", required: false }] }], aiEnabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "aiEnabled", required: false }] }], aiPanelOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "aiPanelOpen", required: false }] }], accountAuth: [{ type: i0.Input, args: [{ isSignal: true, alias: "accountAuth", required: false }] }], prev: [{ type: i0.Output, args: ["prev"] }], next: [{ type: i0.Output, args: ["next"] }], zoomIn: [{ type: i0.Output, args: ["zoomIn"] }], zoomOut: [{ type: i0.Output, args: ["zoomOut"] }], zoomReset: [{ type: i0.Output, args: ["zoomReset"] }], find: [{ type: i0.Output, args: ["find"] }], present: [{ type: i0.Output, args: ["present"] }], presenter: [{ type: i0.Output, args: ["presenter"] }], record: [{ type: i0.Output, args: ["record"] }], presentFromBeginning: [{ type: i0.Output, args: ["presentFromBeginning"] }], rehearseTimings: [{ type: i0.Output, args: ["rehearseTimings"] }], toggleSubtitles: [{ type: i0.Output, args: ["toggleSubtitles"] }], openSubtitleSettings: [{ type: i0.Output, args: ["openSubtitleSettings"] }], recordFromBeginning: [{ type: i0.Output, args: ["recordFromBeginning"] }], recordFromCurrent: [{ type: i0.Output, args: ["recordFromCurrent"] }], spellCheckChange: [{ type: i0.Output, args: ["spellCheckChange"] }], share: [{ type: i0.Output, args: ["share"] }], broadcast: [{ type: i0.Output, args: ["broadcast"] }], openFile: [{ type: i0.Output, args: ["openFile"] }], openRecentFile: [{ type: i0.Output, args: ["openRecentFile"] }], createPresentation: [{ type: i0.Output, args: ["createPresentation"] }], save: [{ type: i0.Output, args: ["save"] }], savePpsx: [{ type: i0.Output, args: ["savePpsx"] }], savePptm: [{ type: i0.Output, args: ["savePptm"] }], packageForSharing: [{ type: i0.Output, args: ["packageForSharing"] }], toggleSidebar: [{ type: i0.Output, args: ["toggleSidebar"] }], toggleAiPanel: [{ type: i0.Output, args: ["toggleAiPanel"] }], signatures: [{ type: i0.Output, args: ["signatures"] }], info: [{ type: i0.Output, args: ["info"] }], print: [{ type: i0.Output, args: ["print"] }], comments: [{ type: i0.Output, args: ["comments"] }], a11y: [{ type: i0.Output, args: ["a11y"] }], link: [{ type: i0.Output, args: ["link"] }], openSorter: [{ type: i0.Output, args: ["openSorter"] }], openReadingView: [{ type: i0.Output, args: ["openReadingView"] }], openMasterView: [{ type: i0.Output, args: ["openMasterView"] }], toggleNotes: [{ type: i0.Output, args: ["toggleNotes"] }], toggleFormatPainter: [{ type: i0.Output, args: ["toggleFormatPainter"] }], exportPng: [{ type: i0.Output, args: ["exportPng"] }], exportPdf: [{ type: i0.Output, args: ["exportPdf"] }], exportGif: [{ type: i0.Output, args: ["exportGif"] }], exportVideo: [{ type: i0.Output, args: ["exportVideo"] }], copySlideAsImage: [{ type: i0.Output, args: ["copySlideAsImage"] }], replace: [{ type: i0.Output, args: ["replace"] }], toggleInspector: [{ type: i0.Output, args: ["toggleInspector"] }], drawToolChange: [{ type: i0.Output, args: ["drawToolChange"] }], toggleThemeGallery: [{ type: i0.Output, args: ["toggleThemeGallery"] }], toggleGrid: [{ type: i0.Output, args: ["toggleGrid"] }], toggleRulers: [{ type: i0.Output, args: ["toggleRulers"] }], toggleGuides: [{ type: i0.Output, args: ["toggleGuides"] }], toggleSelectionPane: [{ type: i0.Output, args: ["toggleSelectionPane"] }], openCustomShows: [{ type: i0.Output, args: ["openCustomShows"] }], toggleSnapToGrid: [{ type: i0.Output, args: ["toggleSnapToGrid"] }], toggleSnapToShape: [{ type: i0.Output, args: ["toggleSnapToShape"] }], addGuide: [{ type: i0.Output, args: ["addGuide"] }], zoomToFit: [{ type: i0.Output, args: ["zoomToFit"] }], toggleEyedropper: [{ type: i0.Output, args: ["toggleEyedropper"] }], openSmartArtDialog: [{ type: i0.Output, args: ["openSmartArtDialog"] }], openEquationDialog: [{ type: i0.Output, args: ["openEquationDialog"] }], openSetUpSlideShow: [{ type: i0.Output, args: ["openSetUpSlideShow"] }], openCompare: [{ type: i0.Output, args: ["openCompare"] }], openPassword: [{ type: i0.Output, args: ["openPassword"] }], openFontEmbedding: [{ type: i0.Output, args: ["openFontEmbedding"] }], openVersionHistory: [{ type: i0.Output, args: ["openVersionHistory"] }], openShortcuts: [{ type: i0.Output, args: ["openShortcuts"] }], openSettings: [{ type: i0.Output, args: ["openSettings"] }] } });
93558
94511
 
93559
94512
  /**
93560
94513
  * selection-pane.component.ts: Side panel listing all elements on the active slide.
@@ -103115,6 +104068,153 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
103115
104068
  `, styles: [".pptx-tcf{display:flex;flex-direction:column;gap:.35rem}.pptx-tcf__heading{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--pptx-inspector-muted, #888)}.pptx-tcf__field{display:flex;align-items:center;gap:.35rem}.pptx-tcf__grid2{display:grid;grid-template-columns:1fr 1fr;gap:.3rem}.pptx-tcf__lbl{font-size:10px;color:var(--pptx-inspector-muted, #888)}.pptx-tcf__num{flex:1;min-width:0;background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;padding:2px 4px;font-size:11px}.pptx-tcf__color{width:28px;height:22px;padding:0;border:1px solid var(--pptx-inspector-border, #444);border-radius:3px;background:transparent;cursor:pointer}.pptx-tcf__btns{display:flex;flex-wrap:wrap;gap:.25rem}.pptx-tcf__toggle,.pptx-tcf__btn{padding:2px 8px;font-size:11px;background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;cursor:pointer}.pptx-tcf__toggle.is-active{background:var(--pptx-inspector-accent, #2563eb);color:#fff;border-color:var(--pptx-inspector-accent, #2563eb)}.pptx-tcf__toggle:disabled,.pptx-tcf__btn:disabled{opacity:.4;cursor:not-allowed}\n"] }]
103116
104069
  }], propDecorators: { element: [{ type: i0.Input, args: [{ isSignal: true, alias: "element", required: true }] }], canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], elementChange: [{ type: i0.Output, args: ["elementChange"] }] } });
103117
104070
 
104071
+ /**
104072
+ * table-data-editor-styles.ts: CSS string for the inspector's table data editor.
104073
+ *
104074
+ * Extracted from `table-data-editor.component.ts` for the same reason as
104075
+ * `chart-editor-styles.ts`: an inline `styles` block pushed that component well
104076
+ * past the repo's 300 LOC ceiling, and the styling is presentation-only, so it
104077
+ * reads better as its own module than as 120 lines wedged between the template
104078
+ * and the class.
104079
+ *
104080
+ * @module angular-viewer/table-data-editor-styles
104081
+ */
104082
+ /** Styles for the inspector table data editor grid. */
104083
+ const TABLE_DATA_EDITOR_STYLES = `
104084
+ .pptx-tbl-editor {
104085
+ display: flex;
104086
+ flex-direction: column;
104087
+ gap: 0.35rem;
104088
+ padding: 0.5rem 0;
104089
+ border-bottom: 1px solid var(--pptx-inspector-border, #333);
104090
+ }
104091
+
104092
+ .pptx-tbl-editor__header {
104093
+ display: flex;
104094
+ align-items: center;
104095
+ justify-content: space-between;
104096
+ gap: 0.35rem;
104097
+ }
104098
+
104099
+ .pptx-tbl-editor__heading {
104100
+ font-size: 10px;
104101
+ font-weight: 600;
104102
+ text-transform: uppercase;
104103
+ letter-spacing: 0.05em;
104104
+ color: var(--pptx-inspector-muted, #888);
104105
+ margin: 0;
104106
+ }
104107
+
104108
+ .pptx-tbl-editor__actions {
104109
+ display: flex;
104110
+ gap: 0.2rem;
104111
+ flex-wrap: wrap;
104112
+ }
104113
+
104114
+ .pptx-tbl-editor__btn {
104115
+ padding: 2px 5px;
104116
+ font-size: 10px;
104117
+ background: var(--pptx-inspector-input-bg, #2d2d2d);
104118
+ border: 1px solid var(--pptx-inspector-border, #444);
104119
+ color: inherit;
104120
+ border-radius: 3px;
104121
+ cursor: pointer;
104122
+ white-space: nowrap;
104123
+ }
104124
+
104125
+ .pptx-tbl-editor__btn:disabled {
104126
+ opacity: 0.4;
104127
+ cursor: not-allowed;
104128
+ }
104129
+
104130
+ .pptx-tbl-editor__btn--danger {
104131
+ color: var(--pptx-inspector-danger, #f47c7c);
104132
+ border-color: var(--pptx-inspector-danger-border, #6b2a2a);
104133
+ }
104134
+
104135
+ .pptx-tbl-editor__scroll {
104136
+ overflow-x: auto;
104137
+ }
104138
+
104139
+ .pptx-tbl-editor__grid {
104140
+ display: flex;
104141
+ flex-direction: column;
104142
+ font-size: 11px;
104143
+ min-width: 100%;
104144
+ width: max-content;
104145
+ }
104146
+
104147
+ .pptx-tbl-editor__row {
104148
+ display: flex;
104149
+ }
104150
+
104151
+ .pptx-tbl-editor__corner,
104152
+ .pptx-tbl-editor__col-header,
104153
+ .pptx-tbl-editor__row-header {
104154
+ display: flex;
104155
+ align-items: center;
104156
+ justify-content: center;
104157
+ background: var(--pptx-inspector-input-bg, #2d2d2d);
104158
+ color: var(--pptx-inspector-muted, #888);
104159
+ font-weight: 400;
104160
+ padding: 2px 4px;
104161
+ border: 1px solid var(--pptx-inspector-border, #333);
104162
+ margin: -0.5px;
104163
+ white-space: nowrap;
104164
+ }
104165
+
104166
+ .pptx-tbl-editor__col-header {
104167
+ flex: 1 0 60px;
104168
+ }
104169
+
104170
+ .pptx-tbl-editor__corner,
104171
+ .pptx-tbl-editor__row-header {
104172
+ flex: 0 0 40px;
104173
+ }
104174
+
104175
+ .pptx-tbl-editor__col-label,
104176
+ .pptx-tbl-editor__row-label {
104177
+ margin-right: 2px;
104178
+ }
104179
+
104180
+ .pptx-tbl-editor__remove-btn {
104181
+ padding: 0 2px;
104182
+ font-size: 11px;
104183
+ line-height: 1;
104184
+ background: none;
104185
+ border: none;
104186
+ color: var(--pptx-inspector-danger, #f47c7c);
104187
+ cursor: pointer;
104188
+ }
104189
+
104190
+ .pptx-tbl-editor__cell {
104191
+ display: flex;
104192
+ flex: 1 0 60px;
104193
+ padding: 1px;
104194
+ border: 1px solid var(--pptx-inspector-border, #333);
104195
+ margin: -0.5px;
104196
+ }
104197
+
104198
+ .pptx-tbl-editor__input {
104199
+ width: 100%;
104200
+ box-sizing: border-box;
104201
+ padding: 2px 4px;
104202
+ font-size: 11px;
104203
+ background: var(--pptx-inspector-input-bg, #2d2d2d);
104204
+ color: inherit;
104205
+ border: none;
104206
+ outline: none;
104207
+ }
104208
+
104209
+ .pptx-tbl-editor__input:focus {
104210
+ background: var(--pptx-inspector-active-bg, #1a3a5c);
104211
+ }
104212
+
104213
+ .pptx-tbl-editor__input:disabled {
104214
+ opacity: 0.6;
104215
+ }
104216
+ `;
104217
+
103118
104218
  /**
103119
104219
  * table-data-editor.component.ts: Presentational table data editor panel.
103120
104220
  *
@@ -103156,53 +104256,55 @@ class TableDataEditorComponent {
103156
104256
  /** Shared cell selection (drives the cell-formatting panel + context menu). */
103157
104257
  selection = inject(TableSelectionService, { optional: true });
103158
104258
  // ── Computed helpers ────────────────────────────────────────────────────
103159
- rows = computed(() => this.element().tableData?.rows ?? [], /* @ts-ignore */
104259
+ /**
104260
+ * Normalised render model from `pptx-viewer-shared`. Using it (rather than
104261
+ * iterating `tableData.rows` directly) is what keeps ragged rows, which real
104262
+ * decks do contain, from rendering a lopsided grid with cells missing off the
104263
+ * right-hand edge.
104264
+ */
104265
+ grid = computed(() => buildTableDataGrid(this.element()), /* @ts-ignore */
104266
+ ...(ngDevMode ? [{ debugName: "grid" }] : /* istanbul ignore next */ []));
104267
+ rows = computed(() => this.grid().rows, /* @ts-ignore */
103160
104268
  ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
103161
- rowCount = computed(() => this.rows().length, /* @ts-ignore */
104269
+ rowCount = computed(() => this.grid().rowCount, /* @ts-ignore */
103162
104270
  ...(ngDevMode ? [{ debugName: "rowCount" }] : /* istanbul ignore next */ []));
103163
- colCount = computed(() => this.element().tableData?.columnWidths.length ?? 0, /* @ts-ignore */
104271
+ colCount = computed(() => this.grid().colCount, /* @ts-ignore */
103164
104272
  ...(ngDevMode ? [{ debugName: "colCount" }] : /* istanbul ignore next */ []));
103165
- colIndices = computed(() => Array.from({ length: this.colCount() }, (_, i) => i), /* @ts-ignore */
104273
+ colIndices = computed(() => this.grid().colIndices, /* @ts-ignore */
103166
104274
  ...(ngDevMode ? [{ debugName: "colIndices" }] : /* istanbul ignore next */ []));
104275
+ canRemoveRow = computed(() => this.grid().canRemoveRow, /* @ts-ignore */
104276
+ ...(ngDevMode ? [{ debugName: "canRemoveRow" }] : /* istanbul ignore next */ []));
104277
+ canRemoveColumn = computed(() => this.grid().canRemoveColumn, /* @ts-ignore */
104278
+ ...(ngDevMode ? [{ debugName: "canRemoveColumn" }] : /* istanbul ignore next */ []));
103167
104279
  // ── Event handlers ──────────────────────────────────────────────────────
103168
104280
  onCellChange(event, rowIndex, colIndex) {
103169
104281
  const text = stringFromEvent$1(event);
103170
104282
  if (text === null) {
103171
104283
  return;
103172
104284
  }
103173
- this.elementChange.emit(setCellText(this.element(), rowIndex, colIndex, text));
104285
+ this.elementChange.emit(setTableElementCellText(this.element(), rowIndex, colIndex, text));
103174
104286
  }
103175
104287
  /** Focusing a cell selects it so the cell-formatting panel targets it. */
103176
104288
  onCellFocus(rowIndex, colIndex) {
103177
104289
  this.selection?.selectCell(this.element().id, rowIndex, colIndex);
103178
104290
  }
103179
104291
  onAddRow() {
103180
- const last = this.rowCount() - 1;
103181
- this.elementChange.emit(insertRow(this.element(), Math.max(0, last), 'below'));
104292
+ this.elementChange.emit(appendTableElementRow(this.element()));
103182
104293
  }
103183
104294
  onRemoveLastRow() {
103184
- const last = this.rowCount() - 1;
103185
- if (last < 0) {
103186
- return;
103187
- }
103188
- this.elementChange.emit(removeRow(this.element(), last));
104295
+ this.elementChange.emit(removeLastTableElementRow(this.element()));
103189
104296
  }
103190
104297
  onRemoveRow(rowIndex) {
103191
- this.elementChange.emit(removeRow(this.element(), rowIndex));
104298
+ this.elementChange.emit(removeTableElementRow(this.element(), rowIndex));
103192
104299
  }
103193
104300
  onAddColumn() {
103194
- const last = this.colCount() - 1;
103195
- this.elementChange.emit(insertColumn(this.element(), Math.max(0, last), 'right'));
104301
+ this.elementChange.emit(appendTableElementColumn(this.element()));
103196
104302
  }
103197
104303
  onRemoveLastColumn() {
103198
- const last = this.colCount() - 1;
103199
- if (last < 0) {
103200
- return;
103201
- }
103202
- this.elementChange.emit(removeColumn(this.element(), last));
104304
+ this.elementChange.emit(removeLastTableElementColumn(this.element()));
103203
104305
  }
103204
104306
  onRemoveColumn(colIndex) {
103205
- this.elementChange.emit(removeColumn(this.element(), colIndex));
104307
+ this.elementChange.emit(removeTableElementColumn(this.element(), colIndex));
103206
104308
  }
103207
104309
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: TableDataEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
103208
104310
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: TableDataEditorComponent, isStandalone: true, selector: "pptx-table-data-editor", inputs: { element: { classPropertyName: "element", publicName: "element", isSignal: true, isRequired: true, transformFunction: null }, canEdit: { classPropertyName: "canEdit", publicName: "canEdit", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { elementChange: "elementChange" }, ngImport: i0, template: `
@@ -103227,7 +104329,7 @@ class TableDataEditorComponent {
103227
104329
  <button
103228
104330
  type="button"
103229
104331
  class="pptx-tbl-editor__btn pptx-tbl-editor__btn--danger"
103230
- [disabled]="rowCount() <= 1"
104332
+ [disabled]="!canRemoveRow()"
103231
104333
  [title]="'pptx.tableDataEditor.removeRowTitle' | translate"
103232
104334
  (click)="onRemoveLastRow()"
103233
104335
  >
@@ -103245,7 +104347,7 @@ class TableDataEditorComponent {
103245
104347
  <button
103246
104348
  type="button"
103247
104349
  class="pptx-tbl-editor__btn pptx-tbl-editor__btn--danger"
103248
- [disabled]="colCount() <= 1"
104350
+ [disabled]="!canRemoveColumn()"
103249
104351
  [title]="'pptx.tableDataEditor.removeColumnTitle' | translate"
103250
104352
  (click)="onRemoveLastColumn()"
103251
104353
  >
@@ -103267,10 +104369,13 @@ class TableDataEditorComponent {
103267
104369
  @for (colIdx of colIndices(); track colIdx) {
103268
104370
  <div class="pptx-tbl-editor__col-header" role="columnheader">
103269
104371
  <span class="pptx-tbl-editor__col-label">{{ colIdx + 1 }}</span>
103270
- @if (canEdit() && colCount() > 1) {
104372
+ @if (canEdit() && canRemoveColumn()) {
103271
104373
  <button
103272
104374
  type="button"
103273
104375
  class="pptx-tbl-editor__remove-btn"
104376
+ [attr.aria-label]="
104377
+ 'pptx.tableDataEditor.removeColumnN' | translate: { number: colIdx + 1 }
104378
+ "
103274
104379
  [title]="
103275
104380
  'pptx.tableDataEditor.removeColumnN' | translate: { number: colIdx + 1 }
103276
104381
  "
@@ -103282,31 +104387,40 @@ class TableDataEditorComponent {
103282
104387
  </div>
103283
104388
  }
103284
104389
  </div>
103285
- @for (row of rows(); track $index; let ri = $index) {
104390
+ @for (row of rows(); track row.rowIndex) {
103286
104391
  <div class="pptx-tbl-editor__row" role="row">
103287
104392
  <!-- Row label + remove button -->
103288
104393
  <div class="pptx-tbl-editor__row-header" role="rowheader">
103289
- <span class="pptx-tbl-editor__row-label">{{ ri + 1 }}</span>
103290
- @if (canEdit() && rowCount() > 1) {
104394
+ <span class="pptx-tbl-editor__row-label">{{ row.rowIndex + 1 }}</span>
104395
+ @if (canEdit() && canRemoveRow()) {
103291
104396
  <button
103292
104397
  type="button"
103293
104398
  class="pptx-tbl-editor__remove-btn"
103294
- [title]="'pptx.tableDataEditor.removeRowN' | translate: { number: ri + 1 }"
103295
- (click)="onRemoveRow(ri)"
104399
+ [attr.aria-label]="
104400
+ 'pptx.tableDataEditor.removeRowN' | translate: { number: row.rowIndex + 1 }
104401
+ "
104402
+ [title]="
104403
+ 'pptx.tableDataEditor.removeRowN' | translate: { number: row.rowIndex + 1 }
104404
+ "
104405
+ (click)="onRemoveRow(row.rowIndex)"
103296
104406
  >
103297
104407
  ×
103298
104408
  </button>
103299
104409
  }
103300
104410
  </div>
103301
- @for (cell of row.cells; track $index; let ci = $index) {
104411
+ @for (cell of row.cells; track cell.colIndex) {
103302
104412
  <div class="pptx-tbl-editor__cell" role="gridcell">
103303
104413
  <input
103304
104414
  type="text"
103305
104415
  class="pptx-tbl-editor__input"
103306
104416
  [disabled]="!canEdit()"
103307
104417
  [value]="cell.text"
103308
- (focus)="onCellFocus(ri, ci)"
103309
- (change)="onCellChange($event, ri, ci)"
104418
+ [attr.aria-label]="
104419
+ 'pptx.tableDataEditor.cellAriaLabel'
104420
+ | translate: { row: cell.rowIndex + 1, column: cell.colIndex + 1 }
104421
+ "
104422
+ (focus)="onCellFocus(cell.rowIndex, cell.colIndex)"
104423
+ (change)="onCellChange($event, cell.rowIndex, cell.colIndex)"
103310
104424
  />
103311
104425
  </div>
103312
104426
  }
@@ -103341,7 +104455,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
103341
104455
  <button
103342
104456
  type="button"
103343
104457
  class="pptx-tbl-editor__btn pptx-tbl-editor__btn--danger"
103344
- [disabled]="rowCount() <= 1"
104458
+ [disabled]="!canRemoveRow()"
103345
104459
  [title]="'pptx.tableDataEditor.removeRowTitle' | translate"
103346
104460
  (click)="onRemoveLastRow()"
103347
104461
  >
@@ -103359,7 +104473,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
103359
104473
  <button
103360
104474
  type="button"
103361
104475
  class="pptx-tbl-editor__btn pptx-tbl-editor__btn--danger"
103362
- [disabled]="colCount() <= 1"
104476
+ [disabled]="!canRemoveColumn()"
103363
104477
  [title]="'pptx.tableDataEditor.removeColumnTitle' | translate"
103364
104478
  (click)="onRemoveLastColumn()"
103365
104479
  >
@@ -103381,10 +104495,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
103381
104495
  @for (colIdx of colIndices(); track colIdx) {
103382
104496
  <div class="pptx-tbl-editor__col-header" role="columnheader">
103383
104497
  <span class="pptx-tbl-editor__col-label">{{ colIdx + 1 }}</span>
103384
- @if (canEdit() && colCount() > 1) {
104498
+ @if (canEdit() && canRemoveColumn()) {
103385
104499
  <button
103386
104500
  type="button"
103387
104501
  class="pptx-tbl-editor__remove-btn"
104502
+ [attr.aria-label]="
104503
+ 'pptx.tableDataEditor.removeColumnN' | translate: { number: colIdx + 1 }
104504
+ "
103388
104505
  [title]="
103389
104506
  'pptx.tableDataEditor.removeColumnN' | translate: { number: colIdx + 1 }
103390
104507
  "
@@ -103396,31 +104513,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
103396
104513
  </div>
103397
104514
  }
103398
104515
  </div>
103399
- @for (row of rows(); track $index; let ri = $index) {
104516
+ @for (row of rows(); track row.rowIndex) {
103400
104517
  <div class="pptx-tbl-editor__row" role="row">
103401
104518
  <!-- Row label + remove button -->
103402
104519
  <div class="pptx-tbl-editor__row-header" role="rowheader">
103403
- <span class="pptx-tbl-editor__row-label">{{ ri + 1 }}</span>
103404
- @if (canEdit() && rowCount() > 1) {
104520
+ <span class="pptx-tbl-editor__row-label">{{ row.rowIndex + 1 }}</span>
104521
+ @if (canEdit() && canRemoveRow()) {
103405
104522
  <button
103406
104523
  type="button"
103407
104524
  class="pptx-tbl-editor__remove-btn"
103408
- [title]="'pptx.tableDataEditor.removeRowN' | translate: { number: ri + 1 }"
103409
- (click)="onRemoveRow(ri)"
104525
+ [attr.aria-label]="
104526
+ 'pptx.tableDataEditor.removeRowN' | translate: { number: row.rowIndex + 1 }
104527
+ "
104528
+ [title]="
104529
+ 'pptx.tableDataEditor.removeRowN' | translate: { number: row.rowIndex + 1 }
104530
+ "
104531
+ (click)="onRemoveRow(row.rowIndex)"
103410
104532
  >
103411
104533
  ×
103412
104534
  </button>
103413
104535
  }
103414
104536
  </div>
103415
- @for (cell of row.cells; track $index; let ci = $index) {
104537
+ @for (cell of row.cells; track cell.colIndex) {
103416
104538
  <div class="pptx-tbl-editor__cell" role="gridcell">
103417
104539
  <input
103418
104540
  type="text"
103419
104541
  class="pptx-tbl-editor__input"
103420
104542
  [disabled]="!canEdit()"
103421
104543
  [value]="cell.text"
103422
- (focus)="onCellFocus(ri, ci)"
103423
- (change)="onCellChange($event, ri, ci)"
104544
+ [attr.aria-label]="
104545
+ 'pptx.tableDataEditor.cellAriaLabel'
104546
+ | translate: { row: cell.rowIndex + 1, column: cell.colIndex + 1 }
104547
+ "
104548
+ (focus)="onCellFocus(cell.rowIndex, cell.colIndex)"
104549
+ (change)="onCellChange($event, cell.rowIndex, cell.colIndex)"
103424
104550
  />
103425
104551
  </div>
103426
104552
  }
@@ -110663,24 +111789,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
110663
111789
  * and its template gallery. Kept framework-free (no Angular / DOM) so the
110664
111790
  * LaTeX -> MathML conversion and the template catalogue are unit testable in
110665
111791
  * isolation.
111792
+ *
111793
+ * The conversion pipeline itself now lives in `pptx-viewer-shared`
111794
+ * (`render/equation-compile`), which every binding shares. This module stays as
111795
+ * a name shim: `latexToMathml` is part of this package's published surface
111796
+ * (re-exported from `viewer/index.ts`), so the spelling is preserved even though
111797
+ * shared uses `latexToMathMl`.
110666
111798
  */
110667
111799
  /**
110668
111800
  * Pre-defined equation templates covering common mathematical formulas
110669
111801
  * (the shared catalogue every binding's equation dialog renders).
110670
111802
  */
110671
111803
  const TEMPLATES = EQUATION_TEMPLATES;
110672
- /** Convert a LaTeX string to a MathML markup string, empty on any failure. */
111804
+ /**
111805
+ * Convert a LaTeX string to a MathML markup string, empty on any failure.
111806
+ *
111807
+ * The result is DOMPurify-sanitised (MathML + SVG profiles) by shared before it
111808
+ * is returned. That matters here specifically: the Angular dialog and gallery
111809
+ * hand this string to `DomSanitizer.bypassSecurityTrustHtml`, which disables
111810
+ * Angular's own sanitiser, so this was previously the one binding injecting
111811
+ * unsanitised equation markup.
111812
+ */
110673
111813
  function latexToMathml(latex) {
110674
- if (!latex.trim()) {
110675
- return '';
110676
- }
110677
- try {
110678
- const omml = convertLatexToOmml(latex);
110679
- return ommlToMathml(omml);
110680
- }
110681
- catch {
110682
- return '';
110683
- }
111814
+ return latexToMathMl(latex);
110684
111815
  }
110685
111816
 
110686
111817
  /**
@@ -115302,6 +116433,13 @@ class PowerPointViewerComponent {
115302
116433
  /** Slide-sorter grid overlay visibility. */
115303
116434
  showSorter = signal(false, /* @ts-ignore */
115304
116435
  ...(ngDevMode ? [{ debugName: "showSorter" }] : /* istanbul ignore next */ []));
116436
+ /**
116437
+ * Reading View visibility: the deck at full window size with the editor
116438
+ * chrome cut back to a nav bar. Not the slide show (no fullscreen, no
116439
+ * pointer tools, no presenter console).
116440
+ */
116441
+ showReadingView = signal(false, /* @ts-ignore */
116442
+ ...(ngDevMode ? [{ debugName: "showReadingView" }] : /* istanbul ignore next */ []));
115305
116443
  /** Full-canvas master editor visibility and active target. */
115306
116444
  showMasterView = signal(false, /* @ts-ignore */
115307
116445
  ...(ngDevMode ? [{ debugName: "showMasterView" }] : /* istanbul ignore next */ []));
@@ -115964,6 +117102,15 @@ class PowerPointViewerComponent {
115964
117102
  }
115965
117103
  this.activeSlideIndex.set(index);
115966
117104
  }
117105
+ /**
117106
+ * Leave Reading View on the slide the reader ended on, which is what leaving
117107
+ * any PowerPoint view does: the editor should not snap back to wherever it
117108
+ * was when the reader entered.
117109
+ */
117110
+ closeReadingView(slideIndex) {
117111
+ this.showReadingView.set(false);
117112
+ this.goTo(slideIndex);
117113
+ }
115967
117114
  goPrev() {
115968
117115
  this.goTo(this.activeSlideIndex() - 1);
115969
117116
  }
@@ -116582,6 +117729,7 @@ class PowerPointViewerComponent {
116582
117729
  (a11y)="inspectorPanel.togglePanel('accessibility')"
116583
117730
  (link)="docProperties.showHyperlink.set(true)"
116584
117731
  (openSorter)="showSorter.set(true)"
117732
+ (openReadingView)="showReadingView.set(true)"
116585
117733
  (toggleNotes)="mobileSheetSvc.toggleNotes()"
116586
117734
  (toggleFormatPainter)="formatPainter.toggle()"
116587
117735
  (exportPng)="xport.exportPng()"
@@ -116937,6 +118085,22 @@ class PowerPointViewerComponent {
116937
118085
  />
116938
118086
  }
116939
118087
 
118088
+ @if (showReadingView()) {
118089
+ <!--
118090
+ The merged deck, so each slide carries its own inherited template
118091
+ elements: the reader pages through the deck inside the overlay, and
118092
+ a single active-slide template layer would paint one slide's master
118093
+ over another's.
118094
+ -->
118095
+ <pptx-reading-view-overlay
118096
+ [slides]="displaySlidesMut()"
118097
+ [canvasSize]="loader.canvasSize()"
118098
+ [mediaDataUrls]="loader.mediaDataUrls()"
118099
+ [activeSlideIndex]="activeSlideIndex()"
118100
+ (exit)="closeReadingView($event)"
118101
+ />
118102
+ }
118103
+
116940
118104
  @if (presentationMode.presenting()) {
116941
118105
  <pptx-presentation-overlay
116942
118106
  [slides]="customShowsCtl.presentationSlides()"
@@ -117227,7 +118391,7 @@ class PowerPointViewerComponent {
117227
118391
  />
117228
118392
  }
117229
118393
  </div>
117230
- `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresentationOverlayComponent, selector: "pptx-presentation-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "startIndex", "showWithAnimation", "useTimings", "subtitlesVisible", "sessionEnded"], outputs: ["indexChange", "closed", "subtitlesChange", "annotationsExit"] }, { kind: "component", type: PresenterViewComponent, selector: "pptx-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime", "isAudienceWindowOpen"], outputs: ["movePresentationSlide", "exit", "openAudienceWindow", "closeAudienceWindow", "navigateToSlide"] }, { kind: "component", type: MobilePresenterViewComponent, selector: "pptx-mobile-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime"], outputs: ["movePresentationSlide", "exit"] }, { kind: "component", type: SlideSorterOverlayComponent, selector: "pptx-slide-sorter-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select", "closed"] }, { kind: "component", type: SlideDefaultInspectorComponent, selector: "pptx-slide-default-inspector", inputs: ["slideIndex", "canEdit", "selectedElement", "comments"], outputs: ["commentAdd", "commentRemove", "commentResolve"] }, { kind: "component", type: FindBarComponent, selector: "pptx-find-bar", inputs: ["slides"], outputs: ["navigate", "closed"] }, { kind: "component", type: FindReplaceBarComponent, selector: "pptx-find-replace-bar", inputs: ["matchCount", "matchIndex"], outputs: ["find", "navigate", "replaceOne", "replaceAll", "close"] }, { kind: "component", type: SlidesPanelComponent, selector: "pptx-slides-panel", inputs: ["canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select"] }, { kind: "component", type: StatusBarComponent, selector: "pptx-status-bar", inputs: ["slideIndex", "slideCount", "canEdit", "dirty", "autosaveStatus", "notesOpen", "zoomPercent", "sorterActive", "presenting", "hiddenActions"], outputs: ["toggleNotes", "normalView", "openSorter", "slideShow", "zoomIn", "zoomOut", "zoomReset"] }, { kind: "component", type: EditorContextMenuComponent, selector: "pptx-editor-context-menu", inputs: ["x", "y", "slideIndex", "showAiActions"], outputs: ["closed", "askAi", "fixAi", "editHyperlink", "addComment"] }, { kind: "component", type: ExportProgressModalComponent, selector: "pptx-export-progress-modal", inputs: ["open", "title", "progress", "statusMessage"], outputs: ["cancel"] }, { kind: "component", type: CommentsPanelComponent, selector: "pptx-comments-panel", inputs: ["comments", "authorName"], outputs: ["add", "remove", "resolve"] }, { kind: "component", type: SignaturesPanelComponent, selector: "pptx-signatures-panel", inputs: ["signatures"] }, { kind: "component", type: AccessibilityPanelComponent, selector: "pptx-accessibility-panel", inputs: ["issues"], outputs: ["selectSlide"] }, { kind: "component", type: CollaborationCursorsComponent, selector: "pptx-collaboration-cursors", inputs: ["cursors", "zoom"] }, { kind: "component", type: RemoteSelectionOverlayComponent, selector: "pptx-remote-selection-overlay", inputs: ["presences", "elements", "activeSlideIndex", "zoom"] }, { kind: "component", type: FollowModeBarComponent, selector: "pptx-follow-mode-bar", inputs: ["presences", "followedClientId"], outputs: ["follow"] }, { kind: "component", type: PropertiesDialogComponent, selector: "pptx-properties-dialog", inputs: ["open", "properties"], outputs: ["save", "close"] }, { kind: "component", type: HyperlinkDialogComponent, selector: "pptx-hyperlink-dialog", inputs: ["open", "element"], outputs: ["save", "close"] }, { kind: "component", type: PrintDialogComponent, selector: "pptx-print-dialog", inputs: ["slides", "activeSlideIndex", "defaultSlidesPerPage", "defaultFrameSlides"], outputs: ["print", "cancel"] }, { kind: "component", type: ShareDialogComponent, selector: "pptx-share-dialog", inputs: ["open", "defaults", "active", "connected", "userCount", "shareUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: BroadcastDialogComponent, selector: "pptx-broadcast-dialog", inputs: ["open", "defaults", "active", "connected", "viewerCount", "viewerUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: MobileBottomBarComponent, selector: "pptx-mobile-bottom-bar", inputs: ["slideCount", "commentCount", "activeSheet"], outputs: ["openSlides", "insert", "openFormat", "openComments", "notes"] }, { kind: "component", type: MobileMenuSheetComponent, selector: "pptx-mobile-menu-sheet", inputs: ["open", "slideCount", "exporting", "showNotes", "canEdit", "hiddenActions"], outputs: ["closed", "openFind", "openSorter", "toggleNotes", "insertText", "present", "openFile", "savePptx", "exportPng", "exportPdf", "exportGif", "exportVideo", "print"] }, { kind: "component", type: MobileSlidesSheetComponent, selector: "pptx-mobile-slides-sheet", inputs: ["open", "slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["closed", "jumpToSlide"] }, { kind: "component", type: MobileToolbarComponent, selector: "pptx-mobile-toolbar", inputs: ["canUndo", "canRedo", "canPresent", "canEdit", "menuOpen", "aiEnabled", "aiPanelOpen", "hiddenActions"], outputs: ["toggleMenu", "toggleAiPanel", "undo", "redo", "share", "save", "present"] }, { kind: "component", type: MasterViewCanvasComponent, selector: "pptx-master-view-canvas", inputs: ["tab", "slideMasters", "activeMasterIndex", "activeLayoutIndex", "notesMaster", "handoutMaster", "canvasSize", "notesCanvasSize", "mediaDataUrls", "editable"], outputs: ["notesMasterChange", "handoutMasterChange"] }, { kind: "component", type: MasterViewSidebarComponent, selector: "pptx-master-view-sidebar", inputs: ["tab", "slideMasters", "notesMaster", "handoutMaster", "activeMasterIndex", "activeLayoutIndex", "handoutSlidesPerPage"], outputs: ["tabChange", "selectMaster", "selectLayout", "slidesPerPageChange", "backgroundChange", "close"] }, { kind: "component", type: NotesPanelComponent, selector: "pptx-notes-panel", inputs: ["slide", "expanded"], outputs: ["update", "notesToggle"] }, { kind: "component", type: RibbonComponent, selector: "pptx-ribbon", inputs: ["slideIndex", "slideCount", "canEdit", "selectedElement", "zoomPercent", "formatPainterActive", "canActivateFormatPainter", "exporting", "hasMacros", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToShape", "eyedropperActive", "themeGalleryOpen", "sidebarCollapsed", "inspectorOpen", "commentsOpen", "commentCount", "findOpen", "collabConnected", "connectedCount", "spellCheckEnabled", "showSubtitles", "hiddenActions", "aiEnabled", "aiPanelOpen", "accountAuth"], outputs: ["prev", "next", "zoomIn", "zoomOut", "zoomReset", "find", "present", "presenter", "record", "presentFromBeginning", "rehearseTimings", "toggleSubtitles", "openSubtitleSettings", "recordFromBeginning", "recordFromCurrent", "spellCheckChange", "share", "broadcast", "openFile", "openRecentFile", "createPresentation", "save", "savePpsx", "savePptm", "packageForSharing", "toggleSidebar", "toggleAiPanel", "signatures", "info", "print", "comments", "a11y", "link", "openSorter", "openMasterView", "toggleNotes", "toggleFormatPainter", "exportPng", "exportPdf", "exportGif", "exportVideo", "copySlideAsImage", "replace", "toggleInspector", "drawToolChange", "toggleThemeGallery", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "openCustomShows", "toggleSnapToGrid", "toggleSnapToShape", "addGuide", "zoomToFit", "toggleEyedropper", "openSmartArtDialog", "openEquationDialog", "openSetUpSlideShow", "openCompare", "openPassword", "openFontEmbedding", "openVersionHistory", "openShortcuts", "openSettings"] }, { kind: "component", type: TitleBarComponent, selector: "pptx-title-bar", inputs: ["canEdit", "fileName", "isDirty", "autosaveStatus", "autosaveEnabled", "canUndo", "canRedo", "undoLabel", "redoLabel", "findReplaceOpen", "hiddenActions", "quickAccess"], outputs: ["toggleAutosave", "save", "undo", "redo", "quickCommand", "toggleFindReplace", "commandSearch"] }, { kind: "component", type: ThemeGalleryComponent, selector: "pptx-theme-gallery", inputs: ["open", "activeName", "theme"], outputs: ["applyTheme", "applyCustomTheme", "close"] }, { kind: "component", type: SelectionPaneComponent, selector: "pptx-selection-pane", inputs: ["elements", "selectedIds"], outputs: ["selectElement", "bringForward", "sendBackward", "toggleHidden"] }, { kind: "component", type: CustomShowsComponent, selector: "pptx-custom-shows", inputs: ["open", "slides", "customShows", "activeCustomShowId"], outputs: ["create", "remove", "update", "setActive", "close"] }, { kind: "component", type: InsertSmartArtDialogComponent, selector: "pptx-insert-smart-art-dialog", inputs: ["open"], outputs: ["close", "insert"] }, { kind: "component", type: ViewerExtraDialogsComponent, selector: "pptx-viewer-extra-dialogs", inputs: ["activeSlideIndex", "selectedElementId", "filePath", "customShows", "themeKey", "availableThemes", "localeCode", "availableLocales", "aiExportVisible"], outputs: ["restoreContent", "themeKeySelect", "localeSelect"] }, { kind: "component", type: RehearseTimingsComponent, selector: "pptx-rehearse-timings", inputs: ["summary", "paused", "slideStartedAt", "presentationStartedAt", "timings"], outputs: ["togglePause", "save", "discard"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [/* @ts-ignore */
118394
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresentationOverlayComponent, selector: "pptx-presentation-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "startIndex", "showWithAnimation", "useTimings", "subtitlesVisible", "sessionEnded"], outputs: ["indexChange", "closed", "subtitlesChange", "annotationsExit"] }, { kind: "component", type: PresenterViewComponent, selector: "pptx-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime", "isAudienceWindowOpen"], outputs: ["movePresentationSlide", "exit", "openAudienceWindow", "closeAudienceWindow", "navigateToSlide"] }, { kind: "component", type: MobilePresenterViewComponent, selector: "pptx-mobile-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime"], outputs: ["movePresentationSlide", "exit"] }, { kind: "component", type: SlideSorterOverlayComponent, selector: "pptx-slide-sorter-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select", "closed"] }, { kind: "component", type: ReadingViewOverlayComponent, selector: "pptx-reading-view-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "activeSlideIndex"], outputs: ["exit"] }, { kind: "component", type: SlideDefaultInspectorComponent, selector: "pptx-slide-default-inspector", inputs: ["slideIndex", "canEdit", "selectedElement", "comments"], outputs: ["commentAdd", "commentRemove", "commentResolve"] }, { kind: "component", type: FindBarComponent, selector: "pptx-find-bar", inputs: ["slides"], outputs: ["navigate", "closed"] }, { kind: "component", type: FindReplaceBarComponent, selector: "pptx-find-replace-bar", inputs: ["matchCount", "matchIndex"], outputs: ["find", "navigate", "replaceOne", "replaceAll", "close"] }, { kind: "component", type: SlidesPanelComponent, selector: "pptx-slides-panel", inputs: ["canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select"] }, { kind: "component", type: StatusBarComponent, selector: "pptx-status-bar", inputs: ["slideIndex", "slideCount", "canEdit", "dirty", "autosaveStatus", "notesOpen", "zoomPercent", "sorterActive", "presenting", "hiddenActions"], outputs: ["toggleNotes", "normalView", "openSorter", "slideShow", "zoomIn", "zoomOut", "zoomReset"] }, { kind: "component", type: EditorContextMenuComponent, selector: "pptx-editor-context-menu", inputs: ["x", "y", "slideIndex", "showAiActions"], outputs: ["closed", "askAi", "fixAi", "editHyperlink", "addComment"] }, { kind: "component", type: ExportProgressModalComponent, selector: "pptx-export-progress-modal", inputs: ["open", "title", "progress", "statusMessage"], outputs: ["cancel"] }, { kind: "component", type: CommentsPanelComponent, selector: "pptx-comments-panel", inputs: ["comments", "authorName"], outputs: ["add", "remove", "resolve"] }, { kind: "component", type: SignaturesPanelComponent, selector: "pptx-signatures-panel", inputs: ["signatures"] }, { kind: "component", type: AccessibilityPanelComponent, selector: "pptx-accessibility-panel", inputs: ["issues"], outputs: ["selectSlide"] }, { kind: "component", type: CollaborationCursorsComponent, selector: "pptx-collaboration-cursors", inputs: ["cursors", "zoom"] }, { kind: "component", type: RemoteSelectionOverlayComponent, selector: "pptx-remote-selection-overlay", inputs: ["presences", "elements", "activeSlideIndex", "zoom"] }, { kind: "component", type: FollowModeBarComponent, selector: "pptx-follow-mode-bar", inputs: ["presences", "followedClientId"], outputs: ["follow"] }, { kind: "component", type: PropertiesDialogComponent, selector: "pptx-properties-dialog", inputs: ["open", "properties"], outputs: ["save", "close"] }, { kind: "component", type: HyperlinkDialogComponent, selector: "pptx-hyperlink-dialog", inputs: ["open", "element"], outputs: ["save", "close"] }, { kind: "component", type: PrintDialogComponent, selector: "pptx-print-dialog", inputs: ["slides", "activeSlideIndex", "defaultSlidesPerPage", "defaultFrameSlides"], outputs: ["print", "cancel"] }, { kind: "component", type: ShareDialogComponent, selector: "pptx-share-dialog", inputs: ["open", "defaults", "active", "connected", "userCount", "shareUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: BroadcastDialogComponent, selector: "pptx-broadcast-dialog", inputs: ["open", "defaults", "active", "connected", "viewerCount", "viewerUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: MobileBottomBarComponent, selector: "pptx-mobile-bottom-bar", inputs: ["slideCount", "commentCount", "activeSheet"], outputs: ["openSlides", "insert", "openFormat", "openComments", "notes"] }, { kind: "component", type: MobileMenuSheetComponent, selector: "pptx-mobile-menu-sheet", inputs: ["open", "slideCount", "exporting", "showNotes", "canEdit", "hiddenActions"], outputs: ["closed", "openFind", "openSorter", "toggleNotes", "insertText", "present", "openFile", "savePptx", "exportPng", "exportPdf", "exportGif", "exportVideo", "print"] }, { kind: "component", type: MobileSlidesSheetComponent, selector: "pptx-mobile-slides-sheet", inputs: ["open", "slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["closed", "jumpToSlide"] }, { kind: "component", type: MobileToolbarComponent, selector: "pptx-mobile-toolbar", inputs: ["canUndo", "canRedo", "canPresent", "canEdit", "menuOpen", "aiEnabled", "aiPanelOpen", "hiddenActions"], outputs: ["toggleMenu", "toggleAiPanel", "undo", "redo", "share", "save", "present"] }, { kind: "component", type: MasterViewCanvasComponent, selector: "pptx-master-view-canvas", inputs: ["tab", "slideMasters", "activeMasterIndex", "activeLayoutIndex", "notesMaster", "handoutMaster", "canvasSize", "notesCanvasSize", "mediaDataUrls", "editable"], outputs: ["notesMasterChange", "handoutMasterChange"] }, { kind: "component", type: MasterViewSidebarComponent, selector: "pptx-master-view-sidebar", inputs: ["tab", "slideMasters", "notesMaster", "handoutMaster", "activeMasterIndex", "activeLayoutIndex", "handoutSlidesPerPage"], outputs: ["tabChange", "selectMaster", "selectLayout", "slidesPerPageChange", "backgroundChange", "close"] }, { kind: "component", type: NotesPanelComponent, selector: "pptx-notes-panel", inputs: ["slide", "expanded"], outputs: ["update", "notesToggle"] }, { kind: "component", type: RibbonComponent, selector: "pptx-ribbon", inputs: ["slideIndex", "slideCount", "canEdit", "selectedElement", "zoomPercent", "formatPainterActive", "canActivateFormatPainter", "exporting", "hasMacros", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToShape", "eyedropperActive", "themeGalleryOpen", "sidebarCollapsed", "inspectorOpen", "commentsOpen", "commentCount", "findOpen", "collabConnected", "connectedCount", "spellCheckEnabled", "showSubtitles", "hiddenActions", "aiEnabled", "aiPanelOpen", "accountAuth"], outputs: ["prev", "next", "zoomIn", "zoomOut", "zoomReset", "find", "present", "presenter", "record", "presentFromBeginning", "rehearseTimings", "toggleSubtitles", "openSubtitleSettings", "recordFromBeginning", "recordFromCurrent", "spellCheckChange", "share", "broadcast", "openFile", "openRecentFile", "createPresentation", "save", "savePpsx", "savePptm", "packageForSharing", "toggleSidebar", "toggleAiPanel", "signatures", "info", "print", "comments", "a11y", "link", "openSorter", "openReadingView", "openMasterView", "toggleNotes", "toggleFormatPainter", "exportPng", "exportPdf", "exportGif", "exportVideo", "copySlideAsImage", "replace", "toggleInspector", "drawToolChange", "toggleThemeGallery", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "openCustomShows", "toggleSnapToGrid", "toggleSnapToShape", "addGuide", "zoomToFit", "toggleEyedropper", "openSmartArtDialog", "openEquationDialog", "openSetUpSlideShow", "openCompare", "openPassword", "openFontEmbedding", "openVersionHistory", "openShortcuts", "openSettings"] }, { kind: "component", type: TitleBarComponent, selector: "pptx-title-bar", inputs: ["canEdit", "fileName", "isDirty", "autosaveStatus", "autosaveEnabled", "canUndo", "canRedo", "undoLabel", "redoLabel", "findReplaceOpen", "hiddenActions", "quickAccess"], outputs: ["toggleAutosave", "save", "undo", "redo", "quickCommand", "toggleFindReplace", "commandSearch"] }, { kind: "component", type: ThemeGalleryComponent, selector: "pptx-theme-gallery", inputs: ["open", "activeName", "theme"], outputs: ["applyTheme", "applyCustomTheme", "close"] }, { kind: "component", type: SelectionPaneComponent, selector: "pptx-selection-pane", inputs: ["elements", "selectedIds"], outputs: ["selectElement", "bringForward", "sendBackward", "toggleHidden"] }, { kind: "component", type: CustomShowsComponent, selector: "pptx-custom-shows", inputs: ["open", "slides", "customShows", "activeCustomShowId"], outputs: ["create", "remove", "update", "setActive", "close"] }, { kind: "component", type: InsertSmartArtDialogComponent, selector: "pptx-insert-smart-art-dialog", inputs: ["open"], outputs: ["close", "insert"] }, { kind: "component", type: ViewerExtraDialogsComponent, selector: "pptx-viewer-extra-dialogs", inputs: ["activeSlideIndex", "selectedElementId", "filePath", "customShows", "themeKey", "availableThemes", "localeCode", "availableLocales", "aiExportVisible"], outputs: ["restoreContent", "themeKeySelect", "localeSelect"] }, { kind: "component", type: RehearseTimingsComponent, selector: "pptx-rehearse-timings", inputs: ["summary", "paused", "slideStartedAt", "presentationStartedAt", "timings"], outputs: ["togglePause", "save", "discard"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [/* @ts-ignore */
117231
118395
  Promise.resolve().then(function () { return aiChatPanel_component; }).then(m => m.AiChatPanelComponent)]] });
117232
118396
  }
117233
118397
  i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.0.8", ngImport: i0, type: PowerPointViewerComponent, resolveDeferredDeps: () => [/* @ts-ignore */
@@ -117246,6 +118410,7 @@ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.0.8", ng
117246
118410
  PresenterViewComponent,
117247
118411
  MobilePresenterViewComponent,
117248
118412
  SlideSorterOverlayComponent,
118413
+ ReadingViewOverlayComponent,
117249
118414
  SlideDefaultInspectorComponent,
117250
118415
  FindBarComponent,
117251
118416
  FindReplaceBarComponent,
@@ -117380,6 +118545,7 @@ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.0.8", ng
117380
118545
  (a11y)="inspectorPanel.togglePanel('accessibility')"
117381
118546
  (link)="docProperties.showHyperlink.set(true)"
117382
118547
  (openSorter)="showSorter.set(true)"
118548
+ (openReadingView)="showReadingView.set(true)"
117383
118549
  (toggleNotes)="mobileSheetSvc.toggleNotes()"
117384
118550
  (toggleFormatPainter)="formatPainter.toggle()"
117385
118551
  (exportPng)="xport.exportPng()"
@@ -117735,6 +118901,22 @@ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.0.8", ng
117735
118901
  />
117736
118902
  }
117737
118903
 
118904
+ @if (showReadingView()) {
118905
+ <!--
118906
+ The merged deck, so each slide carries its own inherited template
118907
+ elements: the reader pages through the deck inside the overlay, and
118908
+ a single active-slide template layer would paint one slide's master
118909
+ over another's.
118910
+ -->
118911
+ <pptx-reading-view-overlay
118912
+ [slides]="displaySlidesMut()"
118913
+ [canvasSize]="loader.canvasSize()"
118914
+ [mediaDataUrls]="loader.mediaDataUrls()"
118915
+ [activeSlideIndex]="activeSlideIndex()"
118916
+ (exit)="closeReadingView($event)"
118917
+ />
118918
+ }
118919
+
117738
118920
  @if (presentationMode.presenting()) {
117739
118921
  <pptx-presentation-overlay
117740
118922
  [slides]="customShowsCtl.presentationSlides()"
@@ -119918,5 +121100,5 @@ function cn(...values) {
119918
121100
  * Generated bundle index. Do not edit.
119919
121101
  */
119920
121102
 
119921
- export { DATA_TABLE_HEADER_H as $, ALIGN_OPTIONS as A, BroadcastDialogComponent as B, CHART_EDITOR_STYLES as C, CanvasFitService as D, ChartAxisOptionsComponent as E, ChartAxisStyleOptionsComponent as F, ChartComboTypeOptionsComponent as G, ChartDataEditorComponent as H, ChartDataLabelOptionsComponent as I, ChartDatapointOptionsComponent as J, ChartDisplayOptionsComponent as K, ChartElementViewComponent as L, ChartErrorBarOptionsComponent as M, ChartMarkerOptionsComponent as N, ChartPartSelectionService as O, ChartPrimitivesComponent as P, ChartRendererComponent as Q, ChartTrendlineOptionsComponent as R, CollaborationCursorsComponent as S, CollaborationService as T, ColorChangedImageComponent as U, CommentsPanelComponent as V, CommentsService as W, ComparePanelComponent as X, ConnectorRendererComponent as Y, ConnectorTextOverlayComponent as Z, CustomShowsComponent as _, ANIMATION_PRESET_CATEGORIES as a, MAX_ZOOM_SCALE as a$, DATA_TABLE_KEY_W as a0, DATA_TABLE_PADDING as a1, DATA_TABLE_ROW_H as a2, DEFAULT_BOUNDS as a3, DEFAULT_BROADCAST_SERVER_URL as a4, DEFAULT_CANVAS_HEIGHT as a5, DEFAULT_CANVAS_WIDTH as a6, DEFAULT_COLOR_SCHEME as a7, DEFAULT_FILL_COLOR as a8, DEFAULT_LAYOUT as a9, EquationTemplateGalleryComponent as aA, ExportProgressModalComponent as aB, ExportService as aC, FieldContextService as aD, FindBarComponent as aE, FindReplaceBarComponent as aF, FollowModeBarComponent as aG, FontEmbeddingListComponent as aH, FontEmbeddingPanelComponent as aI, GALLERY_THEME_PRESETS as aJ, GradientPickerComponent as aK, HANDOUT_OPTIONS as aL, HeaderFooterDialogComponent as aM, HyperlinkDialogComponent as aN, ImagePropertiesPanelComponent as aO, InkDrawingService as aP, InkRendererComponent as aQ, InsertSmartArtDialogComponent as aR, InspectorPaneHeaderComponent as aS, InspectorPanelComponent as aT, IsMobileService as aU, KeepAnnotationsDialogComponent as aV, LOCALE_CATALOG as aW, LONG_PRESS_DURATION_MS as aX, LONG_PRESS_MOVE_TOLERANCE_PX as aY, LoadContentService as aZ, LocalPresencePublisher as a_, DEFAULT_PALETTE$1 as aa, DEFAULT_PRINT_SETTINGS as ab, DEFAULT_SLIDE_BACKGROUND as ac, DEFAULT_STROKE_COLOR as ad, DEFAULT_STYLE as ae, DEFAULT_TABLE_ROW_HEIGHT as af, DEFAULT_TEXT_COLOR$1 as ag, DEFAULT_VIEWER_PROFILE as ah, DIRECTIONAL_PRESETS as ai, DIRECTION_OPTIONS as aj, DocumentPropertiesCardComponent as ak, EMBEDDED_FONTS_STYLE_ID as al, EMPHASIS_PRESETS as am, ENTRANCE_PRESETS as an, TEMPLATES as ao, EXIT_PRESETS as ap, EditorContextMenuComponent as aq, EditorHistory as ar, EditorStateService as as, EditorToolbarComponent as at, EffectsPanelComponent as au, ElementRendererComponent as av, EmbeddedFontsService as aw, EncryptedFileDialogComponent as ax, EquationEditorDialogComponent as ay, EquationRendererComponent as az, AUDIENCE_HASH as b, RibbonTransitionsSectionComponent as b$, MIN_ZOOM_SCALE as b0, MediaPreviewComponent as b1, MediaPropertiesPanelComponent as b2, MediaRendererComponent as b3, MediaTrimTimelineComponent as b4, MobileBottomBarComponent as b5, MobileMenuSheetComponent as b6, MobilePresenterViewComponent as b7, MobileSheetComponent as b8, MobileSlidesSheetComponent as b9, PrintSettingsPanelComponent as bA, PropertiesDialogComponent as bB, REPEAT_MODE_OPTIONS as bC, RESIZE_HANDLES as bD, RULER_FONT_SIZE as bE, RULER_THICKNESS as bF, RemoteSelectionOverlayComponent as bG, RibbonAnimationGalleryComponent as bH, RibbonAnimationsSectionComponent as bI, RibbonArrangeSectionComponent as bJ, RibbonColorPopoverComponent as bK, RibbonComponent as bL, RibbonDesignSectionComponent as bM, RibbonDrawSectionComponent as bN, RibbonDrawingGroupComponent as bO, RibbonEditingSectionComponent as bP, RibbonFileSectionComponent as bQ, RibbonFontControlsComponent as bR, RibbonHomeSectionComponent as bS, RibbonHyperlinkButtonComponent as bT, RibbonInsertFieldsComponent as bU, RibbonInsertSectionComponent as bV, RibbonParagraphControlsComponent as bW, RibbonPrimaryRowComponent as bX, RibbonReviewSectionComponent as bY, RibbonShapeExtrasComponent as bZ, RibbonSlideshowSectionComponent as b_, MobileToolbarComponent as ba, ModalDialogComponent as bb, Model3DRendererComponent as bc, NotesHandoutCardComponent as bd, NotesPanelComponent as be, NotesToolbarComponent as bf, OleRendererComponent as bg, POWER_POINT_VIEWER_PROVIDERS as bh, PRESENTER_CHANNEL_NAME as bi, PRESENTER_MSG_ORIGIN as bj, PX_PER_CM as bk, PX_PER_INCH as bl, PasswordProtectionDialogComponent as bm, PasswordStrengthMeterComponent as bn, PowerPointViewerComponent as bo, PresentationAnnotationOverlayComponent as bp, PresentationAnnotationsService as bq, PresentationOverlayComponent as br, PresentationPropertiesPanelComponent as bs, PresentationSettingsCardComponent as bt, PresentationSubtitleBarComponent as bu, PresentationTransitionOverlayComponent as bv, PresenterViewComponent as bw, PresenterWindowService as bx, PrintDialogComponent as by, PrintService as bz, AUDIENCE_NONCE_KEY as c, ThemeEditorFieldsComponent as c$, RibbonViewSectionComponent as c0, RulerGuidesService as c1, SEQUENCE_OPTIONS as c2, SEVERITY_GROUPS as c3, SEVERITY_LABELS as c4, SHORTCUT_REFERENCE_ITEMS as c5, SLIDE_TRANSITION_KEYFRAMES as c6, DEFAULT_PALETTE as c7, PALETTES$1 as c8, SMART_ART_COLOR_SCHEMES as c9, SlideTransitionCardComponent as cA, SlidesPanelComponent as cB, SmartArt3DRendererComponent as cC, SmartArt3DService as cD, SmartArtPreviewComponent as cE, SmartArtPropertiesComponent as cF, SmartArtRendererComponent as cG, StatusBarComponent as cH, TABLE_STRUCTURE_TOGGLES as cI, TEXT_3D_BOTTOM_BEVEL_KEYS as cJ, TEXT_3D_TOP_BEVEL_KEYS as cK, TEXT_DIRECTION_OPTIONS$1 as cL, THEME_CATALOG as cM, TIMING_CURVE_OPTIONS as cN, TRIGGER_OPTIONS as cO, TYPE_LABELS as cP, TableCellAdvancedFillComponent as cQ, TableCellFormattingComponent as cR, TableDataEditorComponent as cS, TablePropertiesComponent as cT, TableRendererComponent as cU, TableResizeOverlayComponent as cV, TableSelectionService as cW, TagsCardComponent as cX, Text3DBevelSectionComponent as cY, Text3DPanelComponent as cZ, TextAdvancedPanelComponent as c_, SMART_ART_STYLE_OPTIONS as ca, SUB_ITEM_LABEL as cb, SVG_WARP_PRESETS as cc, SWIPE_MAX_VERTICAL_PX as cd, SWIPE_THRESHOLD_PX as ce, SelectionPaneComponent as cf, SetUpSlideShowDialogComponent as cg, SettingsAppearanceTabComponent as ch, SettingsDialogComponent as ci, SettingsLanguageTabComponent as cj, ShareDialogComponent as ck, ShortcutPanelComponent as cl, ShowOptionsFieldsetComponent as cm, ShowSlidesFieldsetComponent as cn, SignatureStrippedDialogComponent as co, SignaturesPanelComponent as cp, SignaturesService as cq, SlideBackgroundCardComponent as cr, SlideCanvasComponent as cs, SlideDefaultInspectorComponent as ct, SlideDiffChangesComponent as cu, SlideDiffRowComponent as cv, SlideDiffThumbnailsComponent as cw, SlideSizeCardComponent as cx, SlideSorterOverlayComponent as cy, SlideThemeOverridePanelComponent as cz, AVATAR_COLOR_SWATCHES as d, buildCategoryLabels as d$, ThemeGalleryComponent as d0, ThemeSelectorCardComponent as d1, TitleBarComponent as d2, TransitionDirectionPickerComponent as d3, TransitionPreviewComponent as d4, VALIGN_OPTIONS as d5, VIEWER_THEME as d6, VersionHistoryPanelComponent as d7, ViewerCanvasEditingService as d8, ViewerCollabCursorService as d9, addItem as dA, addSeries as dB, addSubItem as dC, advanceStep as dD, aiToggleVisible as dE, alignPatch as dF, animationFor as dG, animationPresetLabelKey as dH, annotationMapToInkInserts as dI, applyAcceptedDiff as dJ, applyAnimationPreset as dK, applyFindReplacements as dL, applyFormatToElement as dM, applyMove as dN, applyResize as dO, applyTableStylePreset as dP, asMediaElement as dQ, assignUserColor as dR, attachTouchGestures as dS, beginNodeEdit as dT, bevelSizePatch as dU, boolFromEvent as dV, bringForward as dW, bringToFront as dX, buildBarActions as dY, buildBroadcastConfig as dZ, buildBroadcastViewerUrl as d_, ViewerCollaborationSessionService as da, ViewerCompareService as db, ViewerCustomShowsService as dc, ViewerDialogsService as dd, ViewerDocumentPropertiesService as de, ViewerExportService as df, ViewerExtraDialogsComponent as dg, ViewerFileIOService as dh, ViewerFindReplaceService as di, ViewerFormatPainterService as dj, ViewerInspectorPanelService as dk, ViewerKeyboardService as dl, ViewerMobileSheetService as dm, ViewerPresentationModeService as dn, ViewerThemeGalleryService as dp, ViewerTouchGesturesService as dq, ViewerZoomService as dr, WEBM_MIME_CANDIDATES as ds, WriteBackScheduler as dt, ZoomNavigationService as du, ZoomRendererComponent as dv, ZoomTargetService as dw, addCategory as dx, addCommentToList as dy, addGradientStopPatch as dz, AccessibilityPanelComponent as e, clampGifDimensions as e$, buildCellParagraphs as e0, buildChartViewModel as e1, buildChatLogExport as e2, buildChatLogMarkdown as e3, buildChromeStyle as e4, buildClearHyperlinkPatch as e5, buildClickGroups as e6, buildColStyles as e7, buildCollaborationConfig as e8, buildComboViewModel as e9, buildStockViewModel as eA, buildSurfaceViewModel as eB, buildTableViewModel as eC, buildTreemapViewModel as eD, buildTrimFragment as eE, buildWaterfallViewModel as eF, buildZeroLine as eG, buildZoomContainerStyle as eH, buildZoomViewModel as eI, bulletIndentPx as eJ, canAddTopLevelNode as eK, canGroupSelection as eL, canRemoveTopLevelNode as eM, canSetStrokeWidth as eN, canStartBroadcast as eO, canStartShare as eP, canUngroupSelection as eQ, canUseClipboard as eR, captionDisplayText as eS, cellRunStyle as eT, cellStyleToStyleMap as eU, cellTdStyle as eV, changeCountLabel as eW, changeIcon as eX, characterSpacingPatch as eY, checkFontAvailable as eZ, clampCursorPosition as e_, buildCssGradientFromShapeStyle as ea, buildDuotoneFilter as eb, buildDuotoneFilterId as ec, buildEmbeddedFontStyles as ed, buildEquationElement as ee, buildEquationSegment as ef, buildFallbackViewModel as eg, buildFontFaceRule as eh, buildGradientFillCss as ei, buildGridlinesAndLabels as ej, buildHyperlinkPatch as ek, buildInkContainerStyle as el, buildInkStrokes as em, buildLegend as en, buildModel3DContainerStyle as eo, buildModel3DViewModel as ep, buildOleActionModel as eq, buildOleInfoRows as er, buildPatternFillCss as es, buildPrintHtmlDocument as et, buildPropertiesPatch as eu, buildRegionMapViewModel as ev, buildSaveSlides as ew, buildShareUrl as ex, buildSmartArtInsertElement as ey, buildSmartArtNodes as ez, AccessibilityService as f, defaultThemeColors as f$, clampIndex as f0, clampNotesFontSize as f1, clampScale as f2, clampStep as f3, clearAllLocalViewerData as f4, clearAudienceContent as f5, cn as f6, collectAccessibilityIssues as f7, collectElementText as f8, collectSlideText as f9, computeRadarPoints as fA, computeScatterDots as fB, computeSelectionBoxes as fC, computeSingleSelected as fD, computeSlideIndices as fE, computeSnap as fF, computeStackedBarRects as fG, computeStackedValueRange as fH, computeTextLines as fI, computeTimerProgress as fJ, computeTrendlinePrimitives as fK, computeValueRange as fL, convertOmmlToMathMl as fM, copyFormatFromElement as fN, countAccessibilityIssues as fO, countAnnotationStrokes as fP, createAngularAiBridge as fQ, createCustomShow as fR, createSwipeDismissDrag as fS, createWebrtcBundle as fT, createWebsocketBundle as fU, cssObjectToStyleMap as fV, currentColorScheme as fW, currentLayout as fX, currentStyle as fY, defaultCssVars as fZ, defaultRadius as f_, collectStoredChats as fa, collectUsedFontFamilies as fb, columnWidthStyle as fc, commitNodeText as fd, computeAlign as fe, computeAxisTitlePrimitives as ff, computeBarRects as fg, computeBubbleRadius as fh, computeCornerHandle as fi, computeDataTablePrimitives as fj, computeDistribute as fk, computeDrawingViewBox as fl, computeErrorBarPrimitives as fm, computeFocusTargets as fn, computeHandleBoxes as fo, computeHandoutLayout as fp, computeIsMobile as fq, computeIsTablet as fr, computeLinePoints as fs, computeLinearRegression as ft, computePageCount as fu, computePieLayout as fv, computePieSlicePath as fw, computePieSlices as fx, computePlotLayout as fy, computeRSquared as fz, AccountPageComponent as g, getPlaceholderStyle as g$, deleteElementsByIds as g0, deleteVersion as g1, demoteNode as g2, deriveModel3DBlobUrl as g3, derivePresenceList as g4, describeSmartArtBounds as g5, disableGlowPatch as g6, disableInnerShadowPatch as g7, disableOuterShadowPatch as g8, disableReflectionPatch as g9, formatAutoNumber as gA, formatAxisValue as gB, formatBytes as gC, formatCursorLabel as gD, formatElapsed as gE, formatFileSize as gF, formatPropertyDate as gG, formatTime as gH, fpsToFrameIntervalMs as gI, generateBroadcastRoomId as gJ, generateCommentId as gK, generateCustomShowId as gL, generatePressureCircles as gM, generateTicks as gN, getClrChangeParams as gO, getContainerStyle as gP, getDuotoneFilterDef as gQ, getImageSrc as gR, getLocalStorageUsageSummary as gS, getOleAriaLabel as gT, getOleBadgeLabel as gU, getOleDisplayName as gV, getOleDownloadFileName as gW, getOleTypeColor as gX, getOleTypeLabel as gY, getPasswordStrength as gZ, getPatternSvg as g_, disableSoftEdgePatch as ga, duplicateElementById as gb, durationOf as gc, effectsStateOf as gd, enableGlowPatch as ge, enableInnerShadowPatch as gf, enableOuterShadowPatch as gg, enableReflectionPatch as gh, enableSoftEdgePatch as gi, encodeGif as gj, estimatePageCount as gk, evenColumnWidths as gl, evenRowHeights as gm, exitPresentationFullscreen as gn, exportAiChatLogs as go, extractPathPoints as gp, eyedropperAvailable as gq, fillColorOf as gr, findInSlides as gs, findOwningSlideIndex as gt, findSlideIndexByElementId as gu, fitPolynomial as gv, fitZoom as gw, focusTargetChips as gx, fontMimeForFormat as gy, fontSizeOf as gz, ActionSettingsPanelComponent as h, msToFrameDelayCs as h$, getVersions as h0, getResolvedShapeClipPath as h1, getResolvedShapeClipPathFor as h2, getShapeFillStrokeStyle as h3, getSlideBackgroundStyle as h4, getSlideTransitionAnimations as h5, getSmartArtNodeBounds as h6, getSpeechRecognitionCtor as h7, getTextBlockStyle as h8, getTextWarp as h9, isElementInteractive as hA, isInjectableUrl as hB, isItalic as hC, isPpactionUrl as hD, isPresenterMessage as hE, isSigned as hF, isTextElement as hG, isTwoTableFocus as hH, isUnderline as hI, isUrlSafe as hJ, isValidRoomId as hK, isViewportBackgroundPressTarget as hL, isZoomActivationKey as hM, issueTrackKey as hN, issueTypeLabel as hO, keyToLabel as hP, latexToMathml as hQ, linePointsToSvgString as hR, lineSpacingPatch as hS, loadAudienceContent as hT, mergeCaptionResults as hU, mergeDown as hV, mergeRight as hW, mergeSelection as hX, moveElementBy as hY, moveNodeDown as hZ, moveNodeUp as h_, getTouchDistance as ha, getWarpCategory as hb, getWarpPath as hc, gradientStateFromStyle as hd, gradientStateOf as he, gradientStatePatch as hf, gridColumns as hg, groupElements as hh, groupIssuesBySeverity as hi, hasAnimation as hj, hasCopyableFormat as hk, hasExistingLink as hl, hasExitedFullscreen as hm, hasGradientFill as hn, hasPressureVariation as ho, hasVisibleSlideAfter as hp, headerLabel as hq, imageDimensions as hr, inkViewBox as hs, insertColumn as ht, insertRow as hu, interpolateWidth as hv, isAudienceTab as hw, isBold as hx, isBrowserOpenableMime as hy, isChildNode as hz, AdvancedChartEditorComponent as i, removeRow as i$, narrowToCircle as i0, narrowToPolygon as i1, narrowToRect as i2, newChartElement as i3, newEquationElement as i4, newPresetShapeElement as i5, newShapeElement as i6, newSmartArtElement as i7, newTableElement as i8, newTextElement as i9, pendingElementStyles as iA, pickColorByClickFallback as iB, pickFile as iC, pickSupportedMimeType as iD, planGifFrames as iE, planVideoSegments as iF, pointsToSvgPathD as iG, presenceToCursors as iH, presetByLayout as iI, presetsForCategory as iJ, pressuresToWidths as iK, prevVisibleIndex as iL, projectDrawingShapes as iM, promoteNode as iN, provideViewerTheme as iO, radarAngle as iP, radarRingPoints as iQ, readAsDataUrl as iR, recordWebm as iS, redistributeColumnWidth as iT, removeAnimation as iU, removeCategory as iV, removeColumn as iW, removeCommentFromList as iX, removeElementAnimation as iY, removeGradientStopPatch as iZ, removeNode as i_, nextVisibleIndex as ia, nodeBold as ib, nodeEditBox as ic, nodeFillColor as id, nodeFontColor as ie, nodeIdFromKey as ig, nodeItalic as ih, nodeStyle as ii, normalizeFontFormat as ij, normalizeSlidesPerPage as ik, normalizeValue as il, numFromEvent as im, ommlToMathml as io, ooxmlDashToCssBorderStyle as ip, openNativeEyeDropper as iq, overallStatus as ir, paletteColor as is, parseAudienceNonce as it, parseNodeTextarea as iu, partitionSlides as iv, patchChartData as iw, patchChartStyle as ix, patchTableData as iy, patchTextStyle as iz, AiChangeOverlayComponent as j, setElementPosition as j$, removeSeries as j0, renderToCanvas as j1, reorderAnimationDown as j2, reorderAnimationUp as j3, replaceInSlides as j4, replaceMatch as j5, requestPresentationFullscreen as j6, resizeElement as j7, resolveCaptionTracks as j8, resolveChartKind as j9, seedBroadcastFields as jA, seedHyperlinkDraft as jB, seedPropertiesDraft as jC, seedShareFields as jD, segmentFrameCount as jE, selectValue$2 as jF, sendBackward as jG, sendToBack as jH, sequentialColorScale as jI, serializeWriteBack as jJ, seriesColor as jK, setAnimationEmphasis as jL, setAnimationEntrance as jM, setAnimationExit as jN, setAxis as jO, setAxisLogScale as jP, setAxisTitleStyle as jQ, setCategoryLabel as jR, setCellText as jS, setColorScheme as jT, setDataLabels as jU, setDataPointExplosion as jV, setDataPointFill as jW, setDataPointLabel as jX, setDelay as jY, setDirection as jZ, setDuration as j_, resolveFontVariant as ja, resolveHyperlinkHref as jb, resolveInteractiveElementId as jc, resolveMediaSrc as jd, resolveOleType as je, resolveParagraphBullet as jf, resolvePresenterNotes as jg, resolveProfileInitial as jh, resolveRegionCode as ji, resolveSlideAutoAdvanceMs as jj, resolvePalette as jk, resolveThemeCatalogEntry as jl, resolveTransitionDuration as jm, revealedElementStyles as jn, routeOrthogonalConnector as jo, rowStyle as jp, rulerDragToGuidePosition as jq, rulerHighlight as jr, rulerStripTicks as js, sampleColorFromSlide as jt, sanitizeColor as ju, sanitizeSlideIndex as jv, sanitizeUserName as jw, saveViewerProfile as jx, scanAvailableFonts as jy, searchSlides as jz, AiChatPanelComponent as k, ungroupElements as k$, setGridlineStyle as k0, setLayout as k1, setLegend as k2, setNodeStyle as k3, setNodeText as k4, setRepeatCount as k5, setRepeatMode as k6, setSequence as k7, setSeriesChartType as k8, setSeriesColor as k9, splitMergedCell as kA, statusKind as kB, statusLabel$1 as kC, storeAudienceContent as kD, stringFromEvent$5 as kE, strokeColorOf as kF, strokeToInkElement as kG, strokeWidthOf as kH, styleShadowFilter as kI, textAdvancedPatch as kJ, textAdvancedStateFromStyle as kK, textAdvancedStateOf as kL, textColorOf as kM, textDirectionPatch as kN, textStyleOf as kO, textStylePatch as kP, themeStyle as kQ, themeToCssVars as kR, thumbnailHeight as kS, thumbnailZoom as kT, toggleCommentResolvedInList as kU, toggleNodeBold as kV, toggleNodeItalic as kW, toggleSheet as kX, topLevelNodeCount as kY, transformSelectedTextCase as kZ, translationsEn as k_, setSeriesErrorBars as ka, setSeriesMarker as kb, setSeriesName as kc, setSeriesTrendline as kd, setSeriesValue as ke, setStyle as kf, setTimingCurve as kg, setTitle as kh, setTrigger as ki, setTriggerShapeId as kj, shapeStylePatch as kk, sheetAfterNavigate as kl, shouldBlockClickAdvance as km, shouldUseSvgWarp as kn, showDirectionPicker as ko, showsTemplateAffordance as kp, signatureCountLabel as kq, signatureKey as kr, signatureTimestamp as ks, signerName as kt, statusLabel as ku, slideNumberOf as kv, smartArtNodes as kw, paletteColour as kx, snapToGridStep as ky, splitCursorCell as kz, AiChatService as l, updateElementById as l0, updateGlowPatch as l1, updateGradientStopPatch as l2, updateInnerShadowPatch as l3, updateOuterShadowPatch as l4, updateReflectionPatch as l5, vAlignPatch as l6, validatePassword as l7, validatePrintSettings as l8, validateRoomId as l9, valueToY as la, vermilionDarkColors as lb, vermilionDarkTheme as lc, vermilionLightColors as ld, vermilionLightTheme as le, vermilionRadius as lf, waypointsToPathD as lg, worstStatus as lh, zoomTargetSlideIndex as li, AiComposerComponent as m, AiFocusBarComponent as n, AiFocusHighlightOverlayComponent as o, AiMessageListComponent as p, AiPanelStore as q, AiProposalCardComponent as r, AiSettingsSectionComponent as s, toChatSummary as t, AiToolCallCardComponent as u, AnimationAuthorPanelComponent as v, AnimationPanelComponent as w, AnimationPlaybackService as x, AutosaveService as y, CURSOR_PALETTE as z };
119922
- //# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-DxH15bh-.mjs.map
121103
+ export { DATA_TABLE_HEADER_H as $, ALIGN_OPTIONS as A, BroadcastDialogComponent as B, CHART_EDITOR_STYLES as C, CanvasFitService as D, ChartAxisOptionsComponent as E, ChartAxisStyleOptionsComponent as F, ChartComboTypeOptionsComponent as G, ChartDataEditorComponent as H, ChartDataLabelOptionsComponent as I, ChartDatapointOptionsComponent as J, ChartDisplayOptionsComponent as K, ChartElementViewComponent as L, ChartErrorBarOptionsComponent as M, ChartMarkerOptionsComponent as N, ChartPartSelectionService as O, ChartPrimitivesComponent as P, ChartRendererComponent as Q, ChartTrendlineOptionsComponent as R, CollaborationCursorsComponent as S, CollaborationService as T, ColorChangedImageComponent as U, CommentsPanelComponent as V, CommentsService as W, ComparePanelComponent as X, ConnectorRendererComponent as Y, ConnectorTextOverlayComponent as Z, CustomShowsComponent as _, ANIMATION_PRESET_CATEGORIES as a, MAX_ZOOM_SCALE as a$, DATA_TABLE_KEY_W as a0, DATA_TABLE_PADDING as a1, DATA_TABLE_ROW_H as a2, DEFAULT_BOUNDS as a3, DEFAULT_BROADCAST_SERVER_URL as a4, DEFAULT_CANVAS_HEIGHT as a5, DEFAULT_CANVAS_WIDTH as a6, DEFAULT_COLOR_SCHEME as a7, DEFAULT_FILL_COLOR as a8, DEFAULT_LAYOUT as a9, EquationTemplateGalleryComponent as aA, ExportProgressModalComponent as aB, ExportService as aC, FieldContextService as aD, FindBarComponent as aE, FindReplaceBarComponent as aF, FollowModeBarComponent as aG, FontEmbeddingListComponent as aH, FontEmbeddingPanelComponent as aI, GALLERY_THEME_PRESETS as aJ, GradientPickerComponent as aK, HANDOUT_OPTIONS as aL, HeaderFooterDialogComponent as aM, HyperlinkDialogComponent as aN, ImagePropertiesPanelComponent as aO, InkDrawingService as aP, InkRendererComponent as aQ, InsertSmartArtDialogComponent as aR, InspectorPaneHeaderComponent as aS, InspectorPanelComponent as aT, IsMobileService as aU, KeepAnnotationsDialogComponent as aV, LOCALE_CATALOG as aW, LONG_PRESS_DURATION_MS as aX, LONG_PRESS_MOVE_TOLERANCE_PX as aY, LoadContentService as aZ, LocalPresencePublisher as a_, DEFAULT_PALETTE$1 as aa, DEFAULT_PRINT_SETTINGS as ab, DEFAULT_SLIDE_BACKGROUND as ac, DEFAULT_STROKE_COLOR as ad, DEFAULT_STYLE as ae, DEFAULT_TABLE_ROW_HEIGHT as af, DEFAULT_TEXT_COLOR$1 as ag, DEFAULT_VIEWER_PROFILE as ah, DIRECTIONAL_PRESETS as ai, DIRECTION_OPTIONS as aj, DocumentPropertiesCardComponent as ak, EMBEDDED_FONTS_STYLE_ID as al, EMPHASIS_PRESETS as am, ENTRANCE_PRESETS as an, TEMPLATES as ao, EXIT_PRESETS as ap, EditorContextMenuComponent as aq, EditorHistory as ar, EditorStateService as as, EditorToolbarComponent as at, EffectsPanelComponent as au, ElementRendererComponent as av, EmbeddedFontsService as aw, EncryptedFileDialogComponent as ax, EquationEditorDialogComponent as ay, EquationRendererComponent as az, AUDIENCE_HASH as b, RibbonSlideshowSectionComponent as b$, MIN_ZOOM_SCALE as b0, MediaPreviewComponent as b1, MediaPropertiesPanelComponent as b2, MediaRendererComponent as b3, MediaTrimTimelineComponent as b4, MobileBottomBarComponent as b5, MobileMenuSheetComponent as b6, MobilePresenterViewComponent as b7, MobileSheetComponent as b8, MobileSlidesSheetComponent as b9, PrintSettingsPanelComponent as bA, PropertiesDialogComponent as bB, REPEAT_MODE_OPTIONS as bC, RESIZE_HANDLES as bD, RULER_FONT_SIZE as bE, RULER_THICKNESS as bF, ReadingViewOverlayComponent as bG, RemoteSelectionOverlayComponent as bH, RibbonAnimationGalleryComponent as bI, RibbonAnimationsSectionComponent as bJ, RibbonArrangeSectionComponent as bK, RibbonColorPopoverComponent as bL, RibbonComponent as bM, RibbonDesignSectionComponent as bN, RibbonDrawSectionComponent as bO, RibbonDrawingGroupComponent as bP, RibbonEditingSectionComponent as bQ, RibbonFileSectionComponent as bR, RibbonFontControlsComponent as bS, RibbonHomeSectionComponent as bT, RibbonHyperlinkButtonComponent as bU, RibbonInsertFieldsComponent as bV, RibbonInsertSectionComponent as bW, RibbonParagraphControlsComponent as bX, RibbonPrimaryRowComponent as bY, RibbonReviewSectionComponent as bZ, RibbonShapeExtrasComponent as b_, MobileToolbarComponent as ba, ModalDialogComponent as bb, Model3DRendererComponent as bc, NotesHandoutCardComponent as bd, NotesPanelComponent as be, NotesToolbarComponent as bf, OleRendererComponent as bg, POWER_POINT_VIEWER_PROVIDERS as bh, PRESENTER_CHANNEL_NAME as bi, PRESENTER_MSG_ORIGIN as bj, PX_PER_CM as bk, PX_PER_INCH as bl, PasswordProtectionDialogComponent as bm, PasswordStrengthMeterComponent as bn, PowerPointViewerComponent as bo, PresentationAnnotationOverlayComponent as bp, PresentationAnnotationsService as bq, PresentationOverlayComponent as br, PresentationPropertiesPanelComponent as bs, PresentationSettingsCardComponent as bt, PresentationSubtitleBarComponent as bu, PresentationTransitionOverlayComponent as bv, PresenterViewComponent as bw, PresenterWindowService as bx, PrintDialogComponent as by, PrintService as bz, AUDIENCE_NONCE_KEY as c, TextAdvancedPanelComponent as c$, RibbonTransitionsSectionComponent as c0, RibbonViewSectionComponent as c1, RulerGuidesService as c2, SEQUENCE_OPTIONS as c3, SEVERITY_GROUPS as c4, SEVERITY_LABELS as c5, SHORTCUT_REFERENCE_ITEMS as c6, SLIDE_TRANSITION_KEYFRAMES as c7, DEFAULT_PALETTE as c8, PALETTES$1 as c9, SlideThemeOverridePanelComponent as cA, SlideTransitionCardComponent as cB, SlidesPanelComponent as cC, SmartArt3DRendererComponent as cD, SmartArt3DService as cE, SmartArtPreviewComponent as cF, SmartArtPropertiesComponent as cG, SmartArtRendererComponent as cH, StatusBarComponent as cI, TABLE_STRUCTURE_TOGGLES as cJ, TEXT_3D_BOTTOM_BEVEL_KEYS as cK, TEXT_3D_TOP_BEVEL_KEYS as cL, TEXT_DIRECTION_OPTIONS$1 as cM, THEME_CATALOG as cN, TIMING_CURVE_OPTIONS as cO, TRIGGER_OPTIONS as cP, TYPE_LABELS as cQ, TableCellAdvancedFillComponent as cR, TableCellFormattingComponent as cS, TableDataEditorComponent as cT, TablePropertiesComponent as cU, TableRendererComponent as cV, TableResizeOverlayComponent as cW, TableSelectionService as cX, TagsCardComponent as cY, Text3DBevelSectionComponent as cZ, Text3DPanelComponent as c_, SMART_ART_COLOR_SCHEMES as ca, SMART_ART_STYLE_OPTIONS as cb, SUB_ITEM_LABEL as cc, SVG_WARP_PRESETS as cd, SWIPE_MAX_VERTICAL_PX as ce, SWIPE_THRESHOLD_PX as cf, SelectionPaneComponent as cg, SetUpSlideShowDialogComponent as ch, SettingsAppearanceTabComponent as ci, SettingsDialogComponent as cj, SettingsLanguageTabComponent as ck, ShareDialogComponent as cl, ShortcutPanelComponent as cm, ShowOptionsFieldsetComponent as cn, ShowSlidesFieldsetComponent as co, SignatureStrippedDialogComponent as cp, SignaturesPanelComponent as cq, SignaturesService as cr, SlideBackgroundCardComponent as cs, SlideCanvasComponent as ct, SlideDefaultInspectorComponent as cu, SlideDiffChangesComponent as cv, SlideDiffRowComponent as cw, SlideDiffThumbnailsComponent as cx, SlideSizeCardComponent as cy, SlideSorterOverlayComponent as cz, AVATAR_COLOR_SWATCHES as d, buildBroadcastViewerUrl as d$, ThemeEditorFieldsComponent as d0, ThemeGalleryComponent as d1, ThemeSelectorCardComponent as d2, TitleBarComponent as d3, TransitionDirectionPickerComponent as d4, TransitionPreviewComponent as d5, VALIGN_OPTIONS as d6, VIEWER_THEME as d7, VersionHistoryPanelComponent as d8, ViewerCanvasEditingService as d9, addGradientStopPatch as dA, addItem as dB, addSeries as dC, addSubItem as dD, advanceStep as dE, aiToggleVisible as dF, alignPatch as dG, animationFor as dH, animationPresetLabelKey as dI, annotationMapToInkInserts as dJ, applyAcceptedDiff as dK, applyAnimationPreset as dL, applyFindReplacements as dM, applyFormatToElement as dN, applyMove as dO, applyResize as dP, applyTableStylePreset as dQ, asMediaElement as dR, assignUserColor as dS, attachTouchGestures as dT, beginNodeEdit as dU, bevelSizePatch as dV, boolFromEvent as dW, bringForward as dX, bringToFront as dY, buildBarActions as dZ, buildBroadcastConfig as d_, ViewerCollabCursorService as da, ViewerCollaborationSessionService as db, ViewerCompareService as dc, ViewerCustomShowsService as dd, ViewerDialogsService as de, ViewerDocumentPropertiesService as df, ViewerExportService as dg, ViewerExtraDialogsComponent as dh, ViewerFileIOService as di, ViewerFindReplaceService as dj, ViewerFormatPainterService as dk, ViewerInspectorPanelService as dl, ViewerKeyboardService as dm, ViewerMobileSheetService as dn, ViewerPresentationModeService as dp, ViewerThemeGalleryService as dq, ViewerTouchGesturesService as dr, ViewerZoomService as ds, WEBM_MIME_CANDIDATES as dt, WriteBackScheduler as du, ZoomNavigationService as dv, ZoomRendererComponent as dw, ZoomTargetService as dx, addCategory as dy, addCommentToList as dz, AccessibilityPanelComponent as e, clampCursorPosition as e$, buildCategoryLabels as e0, buildCellParagraphs as e1, buildChartViewModel as e2, buildChatLogExport as e3, buildChatLogMarkdown as e4, buildChromeStyle as e5, buildClearHyperlinkPatch as e6, buildClickGroups as e7, buildColStyles as e8, buildCollaborationConfig as e9, buildSmartArtNodes as eA, buildStockViewModel as eB, buildSurfaceViewModel as eC, buildTableViewModel as eD, buildTreemapViewModel as eE, buildTrimFragment as eF, buildWaterfallViewModel as eG, buildZeroLine as eH, buildZoomContainerStyle as eI, buildZoomViewModel as eJ, bulletIndentPx as eK, canAddTopLevelNode as eL, canGroupSelection as eM, canRemoveTopLevelNode as eN, canSetStrokeWidth as eO, canStartBroadcast as eP, canStartShare as eQ, canUngroupSelection as eR, canUseClipboard as eS, captionDisplayText as eT, cellRunStyle as eU, cellStyleToStyleMap as eV, cellTdStyle as eW, changeCountLabel as eX, changeIcon as eY, characterSpacingPatch as eZ, checkFontAvailable as e_, buildComboViewModel as ea, buildCssGradientFromShapeStyle as eb, buildDuotoneFilter as ec, buildDuotoneFilterId as ed, buildEmbeddedFontStyles as ee, buildEquationElement as ef, buildEquationSegment as eg, buildFallbackViewModel as eh, buildFontFaceRule as ei, buildGradientFillCss as ej, buildGridlinesAndLabels as ek, buildHyperlinkPatch as el, buildInkContainerStyle as em, buildInkStrokes as en, buildLegend as eo, buildModel3DContainerStyle as ep, buildModel3DViewModel as eq, buildOleActionModel as er, buildOleInfoRows as es, buildPatternFillCss as et, buildPrintHtmlDocument as eu, buildPropertiesPatch as ev, buildRegionMapViewModel as ew, buildSaveSlides as ex, buildShareUrl as ey, buildSmartArtInsertElement as ez, AccessibilityService as f, defaultRadius as f$, clampGifDimensions as f0, clampIndex as f1, clampNotesFontSize as f2, clampScale as f3, clampStep as f4, clearAllLocalViewerData as f5, clearAudienceContent as f6, cn as f7, collectAccessibilityIssues as f8, collectElementText as f9, computeRSquared as fA, computeRadarPoints as fB, computeScatterDots as fC, computeSelectionBoxes as fD, computeSingleSelected as fE, computeSlideIndices as fF, computeSnap as fG, computeStackedBarRects as fH, computeStackedValueRange as fI, computeTextLines as fJ, computeTimerProgress as fK, computeTrendlinePrimitives as fL, computeValueRange as fM, convertOmmlToMathMl as fN, copyFormatFromElement as fO, countAccessibilityIssues as fP, countAnnotationStrokes as fQ, createAngularAiBridge as fR, createCustomShow as fS, createSwipeDismissDrag as fT, createWebrtcBundle as fU, createWebsocketBundle as fV, cssObjectToStyleMap as fW, currentColorScheme as fX, currentLayout as fY, currentStyle as fZ, defaultCssVars as f_, collectSlideText as fa, collectStoredChats as fb, collectUsedFontFamilies as fc, columnWidthStyle as fd, commitNodeText as fe, computeAlign as ff, computeAxisTitlePrimitives as fg, computeBarRects as fh, computeBubbleRadius as fi, computeCornerHandle as fj, computeDataTablePrimitives as fk, computeDistribute as fl, computeDrawingViewBox as fm, computeErrorBarPrimitives as fn, computeFocusTargets as fo, computeHandleBoxes as fp, computeHandoutLayout as fq, computeIsMobile as fr, computeIsTablet as fs, computeLinePoints as ft, computeLinearRegression as fu, computePageCount as fv, computePieLayout as fw, computePieSlicePath as fx, computePieSlices as fy, computePlotLayout as fz, AccountPageComponent as g, getPatternSvg as g$, defaultThemeColors as g0, deleteElementsByIds as g1, deleteVersion as g2, demoteNode as g3, deriveModel3DBlobUrl as g4, derivePresenceList as g5, describeSmartArtBounds as g6, disableGlowPatch as g7, disableInnerShadowPatch as g8, disableOuterShadowPatch as g9, fontSizeOf as gA, formatAutoNumber as gB, formatAxisValue as gC, formatBytes as gD, formatCursorLabel as gE, formatElapsed as gF, formatFileSize as gG, formatPropertyDate as gH, formatTime as gI, fpsToFrameIntervalMs as gJ, generateBroadcastRoomId as gK, generateCommentId as gL, generateCustomShowId as gM, generatePressureCircles as gN, generateTicks as gO, getClrChangeParams as gP, getContainerStyle as gQ, getDuotoneFilterDef as gR, getImageSrc as gS, getLocalStorageUsageSummary as gT, getOleAriaLabel as gU, getOleBadgeLabel as gV, getOleDisplayName as gW, getOleDownloadFileName as gX, getOleTypeColor as gY, getOleTypeLabel as gZ, getPasswordStrength as g_, disableReflectionPatch as ga, disableSoftEdgePatch as gb, duplicateElementById as gc, durationOf as gd, effectsStateOf as ge, enableGlowPatch as gf, enableInnerShadowPatch as gg, enableOuterShadowPatch as gh, enableReflectionPatch as gi, enableSoftEdgePatch as gj, encodeGif as gk, estimatePageCount as gl, evenColumnWidths as gm, evenRowHeights as gn, exitPresentationFullscreen as go, exportAiChatLogs as gp, extractPathPoints as gq, eyedropperAvailable as gr, fillColorOf as gs, findInSlides as gt, findOwningSlideIndex as gu, findSlideIndexByElementId as gv, fitPolynomial as gw, fitZoom as gx, focusTargetChips as gy, fontMimeForFormat as gz, ActionSettingsPanelComponent as h, moveNodeUp as h$, getPlaceholderStyle as h0, getVersions as h1, getResolvedShapeClipPath as h2, getResolvedShapeClipPathFor as h3, getShapeFillStrokeStyle as h4, getSlideBackgroundStyle as h5, getSlideTransitionAnimations as h6, getSmartArtNodeBounds as h7, getSpeechRecognitionCtor as h8, getTextBlockStyle as h9, isChildNode as hA, isElementInteractive as hB, isInjectableUrl as hC, isItalic as hD, isPpactionUrl as hE, isPresenterMessage as hF, isSigned as hG, isTextElement as hH, isTwoTableFocus as hI, isUnderline as hJ, isUrlSafe as hK, isValidRoomId as hL, isViewportBackgroundPressTarget as hM, isZoomActivationKey as hN, issueTrackKey as hO, issueTypeLabel as hP, keyToLabel as hQ, latexToMathml as hR, linePointsToSvgString as hS, lineSpacingPatch as hT, loadAudienceContent as hU, mergeCaptionResults as hV, mergeDown as hW, mergeRight as hX, mergeSelection as hY, moveElementBy as hZ, moveNodeDown as h_, getTextWarp as ha, getTouchDistance as hb, getWarpCategory as hc, getWarpPath as hd, gradientStateFromStyle as he, gradientStateOf as hf, gradientStatePatch as hg, gridColumns as hh, groupElements as hi, groupIssuesBySeverity as hj, hasAnimation as hk, hasCopyableFormat as hl, hasExistingLink as hm, hasExitedFullscreen as hn, hasGradientFill as ho, hasPressureVariation as hp, hasVisibleSlideAfter as hq, headerLabel as hr, imageDimensions as hs, inkViewBox as ht, insertTableElementColumn as hu, insertTableElementRow as hv, interpolateWidth as hw, isAudienceTab as hx, isBold as hy, isBrowserOpenableMime as hz, AdvancedChartEditorComponent as i, removeNode as i$, msToFrameDelayCs as i0, narrowToCircle as i1, narrowToPolygon as i2, narrowToRect as i3, newChartElement as i4, newEquationElement as i5, newPresetShapeElement as i6, newShapeElement as i7, newSmartArtElement as i8, newTableElement as i9, patchTextStyle as iA, pendingElementStyles as iB, pickColorByClickFallback as iC, pickFile as iD, pickSupportedMimeType as iE, planGifFrames as iF, planVideoSegments as iG, pointsToSvgPathD as iH, presenceToCursors as iI, presetByLayout as iJ, presetsForCategory as iK, pressuresToWidths as iL, prevVisibleIndex as iM, projectDrawingShapes as iN, promoteNode as iO, provideViewerTheme as iP, radarAngle as iQ, radarRingPoints as iR, readAsDataUrl as iS, recordWebm as iT, redistributeColumnWidth as iU, removeAnimation as iV, removeCategory as iW, removeTableElementColumn as iX, removeCommentFromList as iY, removeElementAnimation as iZ, removeGradientStopPatch as i_, newTextElement as ia, nextVisibleIndex as ib, nodeBold as ic, nodeEditBox as id, nodeFillColor as ie, nodeFontColor as ig, nodeIdFromKey as ih, nodeItalic as ii, nodeStyle as ij, normalizeFontFormat as ik, normalizeSlidesPerPage as il, normalizeValue as im, numFromEvent as io, ommlToMathml as ip, ooxmlDashToCssBorderStyle as iq, openNativeEyeDropper as ir, overallStatus as is, paletteColor as it, parseAudienceNonce as iu, parseNodeTextarea as iv, partitionSlides as iw, patchChartData as ix, patchChartStyle as iy, patchTableData as iz, AiChangeOverlayComponent as j, setDuration as j$, removeTableElementRow as j0, removeSeries as j1, renderToCanvas as j2, reorderAnimationDown as j3, reorderAnimationUp as j4, replaceInSlides as j5, replaceMatch as j6, requestPresentationFullscreen as j7, resizeElement as j8, resolveCaptionTracks as j9, searchSlides as jA, seedBroadcastFields as jB, seedHyperlinkDraft as jC, seedPropertiesDraft as jD, seedShareFields as jE, segmentFrameCount as jF, selectValue$2 as jG, sendBackward as jH, sendToBack as jI, sequentialColorScale as jJ, serializeWriteBack as jK, seriesColor as jL, setAnimationEmphasis as jM, setAnimationEntrance as jN, setAnimationExit as jO, setAxis as jP, setAxisLogScale as jQ, setAxisTitleStyle as jR, setCategoryLabel as jS, setCellText as jT, setColorScheme as jU, setDataLabels as jV, setDataPointExplosion as jW, setDataPointFill as jX, setDataPointLabel as jY, setDelay as jZ, setDirection as j_, resolveChartKind as ja, resolveFontVariant as jb, resolveHyperlinkHref as jc, resolveInteractiveElementId as jd, resolveMediaSrc as je, resolveOleType as jf, resolveParagraphBullet as jg, resolvePresenterNotes as jh, resolveProfileInitial as ji, resolveRegionCode as jj, resolveSlideAutoAdvanceMs as jk, resolvePalette as jl, resolveThemeCatalogEntry as jm, resolveTransitionDuration as jn, revealedElementStyles as jo, routeOrthogonalConnector as jp, rowStyle as jq, rulerDragToGuidePosition as jr, rulerHighlight as js, rulerStripTicks as jt, sampleColorFromSlide as ju, sanitizeColor as jv, sanitizeSlideIndex as jw, sanitizeUserName as jx, saveViewerProfile as jy, scanAvailableFonts as jz, AiChatPanelComponent as k, translationsEn as k$, setElementPosition as k0, setGridlineStyle as k1, setLayout as k2, setLegend as k3, setNodeStyle as k4, setNodeText as k5, setRepeatCount as k6, setRepeatMode as k7, setSequence as k8, setSeriesChartType as k9, splitCursorCell as kA, splitMergedCell as kB, statusKind as kC, statusLabel$1 as kD, storeAudienceContent as kE, stringFromEvent$5 as kF, strokeColorOf as kG, strokeToInkElement as kH, strokeWidthOf as kI, styleShadowFilter as kJ, textAdvancedPatch as kK, textAdvancedStateFromStyle as kL, textAdvancedStateOf as kM, textColorOf as kN, textDirectionPatch as kO, textStyleOf as kP, textStylePatch as kQ, themeStyle as kR, themeToCssVars as kS, thumbnailHeight as kT, thumbnailZoom as kU, toggleCommentResolvedInList as kV, toggleNodeBold as kW, toggleNodeItalic as kX, toggleSheet as kY, topLevelNodeCount as kZ, transformSelectedTextCase as k_, setSeriesColor as ka, setSeriesErrorBars as kb, setSeriesMarker as kc, setSeriesName as kd, setSeriesTrendline as ke, setSeriesValue as kf, setStyle as kg, setTimingCurve as kh, setTitle as ki, setTrigger as kj, setTriggerShapeId as kk, shapeStylePatch as kl, sheetAfterNavigate as km, shouldBlockClickAdvance as kn, shouldUseSvgWarp as ko, showDirectionPicker as kp, showsTemplateAffordance as kq, signatureCountLabel as kr, signatureKey as ks, signatureTimestamp as kt, signerName as ku, statusLabel as kv, slideNumberOf as kw, smartArtNodes as kx, paletteColour as ky, snapToGridStep as kz, AiChatService as l, ungroupElements as l0, updateElementById as l1, updateGlowPatch as l2, updateGradientStopPatch as l3, updateInnerShadowPatch as l4, updateOuterShadowPatch as l5, updateReflectionPatch as l6, vAlignPatch as l7, validatePassword as l8, validatePrintSettings as l9, validateRoomId as la, valueToY as lb, vermilionDarkColors as lc, vermilionDarkTheme as ld, vermilionLightColors as le, vermilionLightTheme as lf, vermilionRadius as lg, waypointsToPathD as lh, worstStatus as li, zoomTargetSlideIndex as lj, AiComposerComponent as m, AiFocusBarComponent as n, AiFocusHighlightOverlayComponent as o, AiMessageListComponent as p, AiPanelStore as q, AiProposalCardComponent as r, AiSettingsSectionComponent as s, toChatSummary as t, AiToolCallCardComponent as u, AnimationAuthorPanelComponent as v, AnimationPanelComponent as w, AnimationPlaybackService as x, AutosaveService as y, CURSOR_PALETTE as z };
121104
+ //# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-C20L99Zu.mjs.map