pptx-angular-viewer 1.11.0 → 1.12.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, NgClass } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
3
  import { InjectionToken, input, output, computed, ChangeDetectionStrategy, Component, signal, Injectable, inject, Injector, DestroyRef, effect, HostListener, ElementRef, viewChild, afterNextRender } from '@angular/core';
4
4
  import { TranslatePipe, translate, TranslateService } from '@ngx-translate/core';
5
- import { guideEmuToPx, getShapeClipPath, getAdjustmentAwareShapeClipPath, getShapeClipPathFromPreset, getCloudPathForRendering, hasShapeProperties, applyDrawingColorTransforms as applyDrawingColorTransforms$1, hslToRgb as hslToRgb$1, PRESET_COLOR_MAP, isImageLikeElement, hasTextProperties, MIN_ELEMENT_SIZE as MIN_ELEMENT_SIZE$2, THEME_COLOR_SCHEME_KEYS, getLinkedTextBoxSegments, svgPathToPolygons, deobfuscateFont, detectFontFormat, getSubstituteFontFamily, checkMissingAltText, checkMissingSlideTitle, checkLowContrast, checkComplexTables, checkBlankSlide, checkDuplicateTitles, createChartElement, formatCommentTimestamp as formatCommentTimestamp$1, PptxHandler, EncryptedFileError, parseSignatureXml, updateSmartArtNodeText, setSmartArtNodeStyle, setChartTitle, setChartLegend, setChartDataLabels, setChartAxis, setChartSeriesTrendline, setChartSeriesErrorBars, setChartDataPointLabel, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointExplosion, chartDataAddSeries, chartDataRemoveSeries, chartDataAddCategory, chartDataRemoveCategory, chartDataUpdatePoint, chartDataChangeType, addSmartArtNodeAsChild, removeSmartArtNode, promoteSmartArtNode, demoteSmartArtNode, reorderSmartArtNode, switchSmartArtLayout, SWITCHABLE_LAYOUT_TYPES, isInkElement, parseDataUrlToBytes, isZoomElement, THEME_PRESETS, applyThemeToData, getAnimationPresetInfo } from 'pptx-viewer-core';
5
+ import { guideEmuToPx, getShapeClipPath, getAdjustmentAwareShapeClipPath, getShapeClipPathFromPreset, getCloudPathForRendering, hasShapeProperties, applyDrawingColorTransforms as applyDrawingColorTransforms$1, hslToRgb as hslToRgb$1, PRESET_COLOR_MAP, isImageLikeElement, hasTextProperties, MIN_ELEMENT_SIZE as MIN_ELEMENT_SIZE$2, THEME_COLOR_SCHEME_KEYS, getLinkedTextBoxSegments, svgPathToPolygons, deobfuscateFont, detectFontFormat, getSubstituteFontFamily, checkMissingAltText, checkMissingSlideTitle, checkLowContrast, checkComplexTables, checkBlankSlide, checkDuplicateTitles, createChartElement, formatCommentTimestamp as formatCommentTimestamp$1, cloneSlide as cloneSlide$1, cloneTemplateElementsBySlideId as cloneTemplateElementsBySlideId$1, cloneElement as cloneElement$1, PptxHandler, EncryptedFileError, parseSignatureXml, updateSmartArtNodeText, setSmartArtNodeStyle, setChartTitle, setChartLegend, setChartDataLabels, setChartAxis, setChartSeriesTrendline, setChartSeriesErrorBars, setChartDataPointLabel, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointExplosion, chartDataAddSeries, chartDataRemoveSeries, chartDataAddCategory, chartDataRemoveCategory, chartDataUpdatePoint, chartDataChangeType, addSmartArtNodeAsChild, removeSmartArtNode, promoteSmartArtNode, demoteSmartArtNode, reorderSmartArtNode, switchSmartArtLayout, SWITCHABLE_LAYOUT_TYPES, isInkElement, parseDataUrlToBytes, isZoomElement, THEME_PRESETS, applyThemeToData, getAnimationPresetInfo } from 'pptx-viewer-core';
6
6
  import DOMPurify from 'dompurify';
7
7
  import { LucideX, LucideSquare, LucideCircle, LucideSlash, LucideCopy, LucideTrash2, LucideChevronsUp, LucideChevronsDown, LucideArrowUp, LucideArrowDown, LucideGroup, LucideUngroup, LucideTextAlignStart, LucideTextAlignCenter, LucideTextAlignEnd, LucideChevronUp, LucideChevronDown, LucideAlignHorizontalSpaceAround, LucideAlignVerticalSpaceAround, LucideChevronRight, LucidePenTool, LucideHighlighter, LucideEraser, LucideMousePointer2, LucideChevronLeft, LucidePlay, LucideSparkles, LucidePanelRight, LucideMoveRight, LucidePencil, LucideType, LucideMinus, LucideSpline, LucideAArrowUp, LucideAArrowDown, LucideRemoveFormatting, LucideList, LucideListOrdered, LucideListIndentDecrease, LucideListIndentIncrease, LucideTextAlignJustify, LucidePlus, LucideImage, LucideVideo, LucideDatabase, LucideLayers, LucidePanelLeft, LucideMessageSquare, LucideEllipsis, LucideShare2, LucideEye, LucideEyeOff, LucideStickyNote, LucideMonitor, LucideColumns2, LucidePresentation, LucideCheck, LucideSave, LucideUndo, LucideRedo, LucideSearch } from '@lucide/angular';
8
8
  import { jsPDF } from 'jspdf';
@@ -128,6 +128,72 @@ function defaultCssVars() {
128
128
  return vars;
129
129
  }
130
130
 
131
+ /**
132
+ * Built-in "vermilion" theme presets.
133
+ *
134
+ * These mirror the pptx-viewer brand used on the documentation site:
135
+ * a warm paper canvas in light mode, a dimmed presenter room in dark
136
+ * mode, and the vermilion accent in both. Pass one to the viewer's
137
+ * `theme` prop (React/Vue) or `provideViewerTheme` (Angular), or spread
138
+ * the color objects to derive your own variant.
139
+ */
140
+ /** Light "paper" palette: a projection screen in a bright room. */
141
+ const vermilionLightColors = {
142
+ background: '#fbfaf7',
143
+ foreground: '#1a1d21',
144
+ card: '#ffffff',
145
+ cardForeground: '#1a1d21',
146
+ popover: '#ffffff',
147
+ popoverForeground: '#1a1d21',
148
+ primary: '#c2431f',
149
+ primaryForeground: '#ffffff',
150
+ secondary: '#f2efe8',
151
+ secondaryForeground: '#1a1d21',
152
+ muted: '#f2efe8',
153
+ mutedForeground: '#5a626e',
154
+ accent: 'rgba(194, 67, 31, 0.08)',
155
+ accentForeground: '#1a1d21',
156
+ destructive: '#dc2626',
157
+ destructiveForeground: '#ffffff',
158
+ border: '#e6e2d9',
159
+ input: '#e6e2d9',
160
+ ring: '#c2431f',
161
+ };
162
+ /** Dark "presenter" palette: the presenter room with the lights down. */
163
+ const vermilionDarkColors = {
164
+ background: '#0f1113',
165
+ foreground: '#f0efec',
166
+ card: '#171a1e',
167
+ cardForeground: '#f0efec',
168
+ popover: '#171a1e',
169
+ popoverForeground: '#f0efec',
170
+ primary: '#e86a40',
171
+ primaryForeground: '#ffffff',
172
+ secondary: '#1f242b',
173
+ secondaryForeground: '#f0efec',
174
+ muted: '#1f242b',
175
+ mutedForeground: '#9aa1ab',
176
+ accent: 'rgba(232, 106, 64, 0.1)',
177
+ accentForeground: '#f0efec',
178
+ destructive: '#ef4444',
179
+ destructiveForeground: '#ffffff',
180
+ border: '#272c33',
181
+ input: '#272c33',
182
+ ring: '#e86a40',
183
+ };
184
+ /** Shared border-radius for the vermilion presets (slightly sharper than the default). */
185
+ const vermilionRadius = '0.375rem';
186
+ /** Light vermilion theme, ready for the viewer's `theme` prop. */
187
+ const vermilionLightTheme = {
188
+ colors: vermilionLightColors,
189
+ radius: vermilionRadius,
190
+ };
191
+ /** Dark vermilion theme, ready for the viewer's `theme` prop. */
192
+ const vermilionDarkTheme = {
193
+ colors: vermilionDarkColors,
194
+ radius: vermilionRadius,
195
+ };
196
+
131
197
  /**
132
198
  * Recursively walks an element tree and pushes every media element
133
199
  * into the supplied collector array.
@@ -6292,6 +6358,7 @@ function buildBars(chartData, catCount, layout, primaryRange, secondaryRange, se
6292
6358
  h,
6293
6359
  fill: seriesColor(series[si], si, palette),
6294
6360
  rx: 1,
6361
+ part: { role: 'dataPoint', seriesIndex: si, pointIndex: ci },
6295
6362
  });
6296
6363
  if (showLabels) {
6297
6364
  dataLabels.push({
@@ -6315,7 +6382,18 @@ function buildBars(chartData, catCount, layout, primaryRange, secondaryRange, se
6315
6382
  if (grouping === 'stacked') {
6316
6383
  const rects = computeStackedBarRects(series, catCount, layout, primaryRange, palette);
6317
6384
  for (const r of rects) {
6318
- primitives.push({ kind: 'rect', x: r.x, y: r.y, w: r.w, h: r.h, fill: r.fill, rx: 1 });
6385
+ primitives.push({
6386
+ kind: 'rect',
6387
+ x: r.x,
6388
+ y: r.y,
6389
+ w: r.w,
6390
+ h: r.h,
6391
+ fill: r.fill,
6392
+ rx: 1,
6393
+ part: r.seriesIndex !== undefined && r.pointIndex !== undefined
6394
+ ? { role: 'dataPoint', seriesIndex: r.seriesIndex, pointIndex: r.pointIndex }
6395
+ : undefined,
6396
+ });
6319
6397
  }
6320
6398
  if (showLabels) {
6321
6399
  pushClusteredStackedLabels(series, catCount, layout, primaryRange, dataLabels);
@@ -6349,6 +6427,7 @@ function buildBars(chartData, catCount, layout, primaryRange, secondaryRange, se
6349
6427
  w: barW,
6350
6428
  h,
6351
6429
  fill: seriesColor(series[si], si, palette),
6430
+ part: { role: 'dataPoint', seriesIndex: si, pointIndex: ci },
6352
6431
  });
6353
6432
  if (showLabels && Math.abs(val) > 0) {
6354
6433
  dataLabels.push({
@@ -6426,10 +6505,18 @@ function buildLines(chartData, catCount, layout, primaryRange, secondaryRange, s
6426
6505
  stroke: c,
6427
6506
  strokeWidth: 2.4,
6428
6507
  fill: 'none',
6508
+ part: { role: 'series', seriesIndex: si },
6509
+ });
6510
+ pts.forEach((pt, vi) => {
6511
+ primitives.push({
6512
+ kind: 'circle',
6513
+ cx: pt.x,
6514
+ cy: pt.y,
6515
+ r: 2.5,
6516
+ fill: c,
6517
+ part: { role: 'dataPoint', seriesIndex: si, pointIndex: vi },
6518
+ });
6429
6519
  });
6430
- for (const pt of pts) {
6431
- primitives.push({ kind: 'circle', cx: pt.x, cy: pt.y, r: 2.5, fill: c });
6432
- }
6433
6520
  if (showLabels) {
6434
6521
  series.values.forEach((val, vi) => {
6435
6522
  const pt = pts[vi];
@@ -6474,6 +6561,7 @@ function buildAreas(chartData, catCount, layout, range) {
6474
6561
  strokeWidth: 0,
6475
6562
  fill: c,
6476
6563
  opacity: 0.25,
6564
+ part: { role: 'series', seriesIndex: si },
6477
6565
  });
6478
6566
  }
6479
6567
  primitives.push({
@@ -6482,6 +6570,7 @@ function buildAreas(chartData, catCount, layout, range) {
6482
6570
  stroke: c,
6483
6571
  strokeWidth: 2,
6484
6572
  fill: 'none',
6573
+ part: { role: 'series', seriesIndex: si },
6485
6574
  });
6486
6575
  if (showLabels) {
6487
6576
  series.values.forEach((val, vi) => {
@@ -6514,7 +6603,7 @@ function buildScatter(chartData, layout, range) {
6514
6603
  const series = chartData.series[si];
6515
6604
  const c = seriesColor(series, si, chartData.colorPalette);
6516
6605
  const dots = computeScatterDots(series.values, maxXIndex, layout, range);
6517
- for (const dot of dots) {
6606
+ dots.forEach((dot, vi) => {
6518
6607
  primitives.push({
6519
6608
  kind: 'circle',
6520
6609
  cx: dot.cx,
@@ -6522,8 +6611,9 @@ function buildScatter(chartData, layout, range) {
6522
6611
  r: 4,
6523
6612
  fill: c,
6524
6613
  opacity: 0.85,
6614
+ part: { role: 'dataPoint', seriesIndex: si, pointIndex: vi },
6525
6615
  });
6526
- }
6616
+ });
6527
6617
  if (showLabels) {
6528
6618
  series.values.forEach((val, vi) => {
6529
6619
  const dot = dots[vi];
@@ -6568,6 +6658,7 @@ function buildBubbles(chartData, layout, range) {
6568
6658
  r,
6569
6659
  fill: c,
6570
6660
  opacity: 0.6,
6661
+ part: { role: 'dataPoint', seriesIndex: si, pointIndex: vi },
6571
6662
  });
6572
6663
  });
6573
6664
  if (showLabels) {
@@ -7427,6 +7518,18 @@ function buildCartesianViewModel(element, chartData, categoryLabels, kind) {
7427
7518
  const dataTablePrims = computeDataTablePrimitives(chartData, layout, chartData.colorPalette);
7428
7519
  primitives.push(...overlays, ...dataTablePrims);
7429
7520
  const title = chartData.style?.hasTitle && chartData.title ? chartData.title : undefined;
7521
+ // Vertical drag-to-value only has a single-value meaning for un-stacked marks:
7522
+ // stacked/percentStacked bar segments sit on running sums, so dragging one
7523
+ // would not track the pointer.
7524
+ const valueDrag = isStacked
7525
+ ? undefined
7526
+ : {
7527
+ range: primaryRange,
7528
+ secondaryRange,
7529
+ secondarySeriesIndexes: useSecondary ? [...secondaryIdx] : undefined,
7530
+ plotTop: layout.plotTop,
7531
+ plotBottom: layout.plotBottom,
7532
+ };
7430
7533
  return {
7431
7534
  svgWidth: layout.svgWidth,
7432
7535
  svgHeight: layout.svgHeight,
@@ -7447,6 +7550,7 @@ function buildCartesianViewModel(element, chartData, categoryLabels, kind) {
7447
7550
  secondaryAxisLabels: axisRes.secondaryAxisLabels,
7448
7551
  overlays: overlays.length > 0 ? overlays : undefined,
7449
7552
  dataTable: dataTablePrims.length > 0 ? dataTablePrims : undefined,
7553
+ valueDrag,
7450
7554
  };
7451
7555
  }
7452
7556
 
@@ -9503,12 +9607,28 @@ function computeStackedBarRects(series, catCount, layout, range, colorPalette) {
9503
9607
  valueToY(0, range, layout.plotTop, layout.plotBottom)), 1);
9504
9608
  if (val > 0) {
9505
9609
  const y = posTop - h;
9506
- rects.push({ x, y, w: barW, h, fill: seriesColor(series[si], si, colorPalette) });
9610
+ rects.push({
9611
+ x,
9612
+ y,
9613
+ w: barW,
9614
+ h,
9615
+ fill: seriesColor(series[si], si, colorPalette),
9616
+ seriesIndex: si,
9617
+ pointIndex: ci,
9618
+ });
9507
9619
  posTop = y;
9508
9620
  }
9509
9621
  else {
9510
9622
  const y = negBottom;
9511
- rects.push({ x, y, w: barW, h, fill: seriesColor(series[si], si, colorPalette) });
9623
+ rects.push({
9624
+ x,
9625
+ y,
9626
+ w: barW,
9627
+ h,
9628
+ fill: seriesColor(series[si], si, colorPalette),
9629
+ seriesIndex: si,
9630
+ pointIndex: ci,
9631
+ });
9512
9632
  negBottom = y + h;
9513
9633
  }
9514
9634
  }
@@ -9779,6 +9899,7 @@ function buildPieViewModel(element, chartData, categoryLabels, isDoughnut) {
9779
9899
  fill: chartData.series[0]?.color ?? paletteColor(i, chartData.colorPalette),
9780
9900
  stroke: '#ffffff',
9781
9901
  strokeWidth: 1.5,
9902
+ part: { role: 'dataPoint', seriesIndex: 0, pointIndex: i },
9782
9903
  }));
9783
9904
  const dataLabels = [];
9784
9905
  if (chartData.style?.hasDataLabels) {
@@ -9901,10 +10022,18 @@ function buildRadarViewModel(element, chartData, categoryLabels) {
9901
10022
  opacity: 0.2,
9902
10023
  stroke: c,
9903
10024
  strokeWidth: 1.5,
10025
+ part: { role: 'series', seriesIndex: si },
10026
+ });
10027
+ pts.forEach((p, vi) => {
10028
+ primitives.push({
10029
+ kind: 'circle',
10030
+ cx: p.x,
10031
+ cy: p.y,
10032
+ r: 3,
10033
+ fill: c,
10034
+ part: { role: 'dataPoint', seriesIndex: si, pointIndex: vi },
10035
+ });
9904
10036
  });
9905
- for (const p of pts) {
9906
- primitives.push({ kind: 'circle', cx: p.x, cy: p.y, r: 3, fill: c });
9907
- }
9908
10037
  if (chartData.style?.hasDataLabels) {
9909
10038
  pts.forEach((p, vi) => {
9910
10039
  const val = series.values[vi];
@@ -9945,6 +10074,148 @@ function buildRadarViewModel(element, chartData, categoryLabels) {
9945
10074
  };
9946
10075
  }
9947
10076
 
10077
+ // ─────────────────────────────────────────────────────────────────────────────
10078
+ // DOM data-attribute bridge
10079
+ // ─────────────────────────────────────────────────────────────────────────────
10080
+ /** Attribute carrying the part role ('dataPoint' | 'series' | 'title'). */
10081
+ const CHART_PART_ATTR = 'data-chart-part';
10082
+ /** Attribute carrying the series index of a tagged mark. */
10083
+ const CHART_PART_SERIES_ATTR = 'data-chart-series';
10084
+ /** Attribute carrying the point/category index of a tagged mark. */
10085
+ const CHART_PART_POINT_ATTR = 'data-chart-point';
10086
+ /** Attribute record for a tagged mark, spreadable onto an SVG node. */
10087
+ function chartPartToAttrs(part) {
10088
+ const attrs = {
10089
+ [CHART_PART_ATTR]: part.role,
10090
+ [CHART_PART_SERIES_ATTR]: String(part.seriesIndex),
10091
+ };
10092
+ if (part.pointIndex !== undefined) {
10093
+ attrs[CHART_PART_POINT_ATTR] = String(part.pointIndex);
10094
+ }
10095
+ return attrs;
10096
+ }
10097
+ /** Recover a `ChartPartRef` from a tagged element's attributes. */
10098
+ function chartPartFromElement(el) {
10099
+ if (!el) {
10100
+ return null;
10101
+ }
10102
+ const role = el.getAttribute(CHART_PART_ATTR);
10103
+ if (role !== 'dataPoint' && role !== 'series') {
10104
+ return null;
10105
+ }
10106
+ const seriesIndex = Number.parseInt(el.getAttribute(CHART_PART_SERIES_ATTR) ?? '', 10);
10107
+ if (!Number.isInteger(seriesIndex) || seriesIndex < 0) {
10108
+ return null;
10109
+ }
10110
+ const pointRaw = el.getAttribute(CHART_PART_POINT_ATTR);
10111
+ if (pointRaw === null) {
10112
+ return { role, seriesIndex };
10113
+ }
10114
+ const pointIndex = Number.parseInt(pointRaw, 10);
10115
+ if (!Number.isInteger(pointIndex) || pointIndex < 0) {
10116
+ return { role, seriesIndex };
10117
+ }
10118
+ return { role, seriesIndex, pointIndex };
10119
+ }
10120
+ /**
10121
+ * Resolve the chart part under an event target by walking up to the nearest
10122
+ * tagged ancestor. Accepts the raw `event.target` (unknown) and returns null
10123
+ * for anything that is not an element inside a tagged mark.
10124
+ */
10125
+ function findChartPartTarget(target) {
10126
+ if (!target || typeof target !== 'object') {
10127
+ return null;
10128
+ }
10129
+ const el = target;
10130
+ if (typeof el.closest !== 'function' || typeof el.getAttribute !== 'function') {
10131
+ return null;
10132
+ }
10133
+ return chartPartFromElement(el.closest(`[${CHART_PART_ATTR}]`));
10134
+ }
10135
+ /** Structural equality for (possibly null) part refs. */
10136
+ function isSameChartPart(a, b) {
10137
+ if (!a || !b) {
10138
+ return a === b;
10139
+ }
10140
+ return a.role === b.role && a.seriesIndex === b.seriesIndex && a.pointIndex === b.pointIndex;
10141
+ }
10142
+ // ─────────────────────────────────────────────────────────────────────────────
10143
+ // Drag-to-value math
10144
+ // ─────────────────────────────────────────────────────────────────────────────
10145
+ /**
10146
+ * Inverse of `valueToY`: map a Y coordinate (view-box units) back to a data
10147
+ * value. Mirrors the linear and logarithmic branches of the forward mapping.
10148
+ */
10149
+ function valueFromY(y, range, topY, bottomY) {
10150
+ const usable = bottomY - topY;
10151
+ if (usable === 0) {
10152
+ return range.min;
10153
+ }
10154
+ if (range.logScale && range.logBase) {
10155
+ const base = range.logBase;
10156
+ const logMin = Math.log(range.min) / Math.log(base);
10157
+ const logVal = logMin + ((bottomY - y) / usable) * range.span;
10158
+ return base ** logVal;
10159
+ }
10160
+ return range.min + ((bottomY - y) / usable) * range.span;
10161
+ }
10162
+ /**
10163
+ * Round a dragged value to a step two orders of magnitude below the axis span,
10164
+ * so drags produce human-scale numbers (span 0..500 snaps to whole units,
10165
+ * 0..5 to 0.05) instead of 14-decimal floats.
10166
+ */
10167
+ function roundDragValue(value, range) {
10168
+ if (!Number.isFinite(value) || range.span <= 0) {
10169
+ return value;
10170
+ }
10171
+ const step = 10 ** (Math.floor(Math.log10(range.span)) - 2);
10172
+ const rounded = Math.round(value / step) * step;
10173
+ // Snap away float noise from the multiplication (e.g. 0.30000000000000004).
10174
+ return Number.parseFloat(rounded.toPrecision(12));
10175
+ }
10176
+ /**
10177
+ * Value for a dragged data point at `viewY` (view-box units), using the
10178
+ * secondary range when the part's series is mapped to the secondary axis.
10179
+ */
10180
+ function dragValueForPart(viewY, drag, seriesIndex) {
10181
+ const useSecondary = drag.secondaryRange !== undefined &&
10182
+ (drag.secondarySeriesIndexes?.includes(seriesIndex) ?? false);
10183
+ const range = useSecondary && drag.secondaryRange ? drag.secondaryRange : drag.range;
10184
+ return roundDragValue(valueFromY(viewY, range, drag.plotTop, drag.plotBottom), range);
10185
+ }
10186
+ // ─────────────────────────────────────────────────────────────────────────────
10187
+ // Immutable chart-data edits
10188
+ // ─────────────────────────────────────────────────────────────────────────────
10189
+ /**
10190
+ * Return a copy of `chartData` with one point's value replaced. Returns the
10191
+ * input unchanged when the series or point index is out of range.
10192
+ */
10193
+ function withChartPointValue(chartData, seriesIndex, pointIndex, value) {
10194
+ const series = chartData.series[seriesIndex];
10195
+ if (!series || pointIndex < 0 || pointIndex >= series.values.length) {
10196
+ return chartData;
10197
+ }
10198
+ return {
10199
+ ...chartData,
10200
+ series: chartData.series.map((s, i) => i === seriesIndex
10201
+ ? { ...s, values: s.values.map((v, j) => (j === pointIndex ? value : v)) }
10202
+ : s),
10203
+ };
10204
+ }
10205
+ /**
10206
+ * Return a copy of `chartData` with the title replaced. A non-empty title
10207
+ * turns the title on; an empty one turns it off (matching PowerPoint, where
10208
+ * clearing the title hides it).
10209
+ */
10210
+ function withChartTitle(chartData, title) {
10211
+ const trimmed = title.trim();
10212
+ return {
10213
+ ...chartData,
10214
+ title: trimmed,
10215
+ style: { ...chartData.style, hasTitle: trimmed.length > 0 },
10216
+ };
10217
+ }
10218
+
9948
10219
  /**
9949
10220
  * `animation-css` — pure mapping from a core animation preset to CSS.
9950
10221
  *
@@ -31864,6 +32135,37 @@ function rebuildDrawingShapesIfCleared(smartArtData, layout, palette, style, ele
31864
32135
  };
31865
32136
  }
31866
32137
 
32138
+ /**
32139
+ * Presentation-mode media autoplay.
32140
+ *
32141
+ * When present mode makes a slide the active, visible surface, any media on it
32142
+ * should begin playing without a manual click (matching PowerPoint's slideshow
32143
+ * behaviour). Browsers only honour a fresh `.play()` call, not an `autoplay`
32144
+ * attribute added retroactively to an already-mounted node, so each binding
32145
+ * calls this once the media element is mounted and its slide is live.
32146
+ *
32147
+ * `play()` can reject when the browser blocks autoplay-with-sound without a
32148
+ * prior user gesture; the rejection is swallowed so it never surfaces as an
32149
+ * unhandled promise (the element simply stays paused until the user interacts).
32150
+ */
32151
+ function startMediaAutoplay(el, options) {
32152
+ const trimStartMs = options?.trimStartMs;
32153
+ if (trimStartMs !== undefined && trimStartMs > 0) {
32154
+ try {
32155
+ el.currentTime = trimStartMs / 1000;
32156
+ }
32157
+ catch {
32158
+ /* seeking before metadata is loaded can throw in some browsers; ignore */
32159
+ }
32160
+ }
32161
+ const result = el.play();
32162
+ if (result && typeof result.catch === 'function') {
32163
+ void result.catch(() => {
32164
+ /* autoplay blocked (e.g. sound without a user gesture) */
32165
+ });
32166
+ }
32167
+ }
32168
+
31867
32169
  /**
31868
32170
  * Artistic image-effect presets for the image inspector's "Artistic Effects"
31869
32171
  * gallery. Each entry is a tuple `[effectName, i18nKey, cssFilter]`:
@@ -32699,6 +33001,13 @@ async function saveAutosaveSnapshot(filePath, data) {
32699
33001
  const FALLBACK_DOWNLOAD_NAME = 'presentation.pptx';
32700
33002
  /** Revoke delay (ms) after triggering a download click. */
32701
33003
  const REVOKE_DELAY_MS = 200;
33004
+ /**
33005
+ * Revoke delay (ms) after opening a payload in a new tab. Longer than the
33006
+ * download delay: the new document may still be fetching the object URL (a PDF
33007
+ * viewer, an image) well after the current task finishes, so we keep the URL
33008
+ * alive for a minute before releasing it.
33009
+ */
33010
+ const OPEN_REVOKE_DELAY_MS = 60_000;
32702
33011
  /**
32703
33012
  * Strip control characters, filesystem-reserved characters, and path-traversal
32704
33013
  * sequences from a user-supplied download filename. CR/LF in particular can
@@ -32776,6 +33085,69 @@ function downloadDataUrl(dataUrl, filename) {
32776
33085
  anchor.remove();
32777
33086
  }, REVOKE_DELAY_MS);
32778
33087
  }
33088
+ /**
33089
+ * Convert a `data:` URL into a {@link Blob}, preserving its MIME type. Handles
33090
+ * both base64 and percent-encoded payloads. Returns `undefined` for a non-data
33091
+ * URL or a payload that cannot be decoded, so callers can fall back gracefully.
33092
+ *
33093
+ * @param dataUrl - A `data:` URL string.
33094
+ */
33095
+ function dataUrlToBlob(dataUrl) {
33096
+ const match = /^data:(?<mime>[^;,]*)(?<base64>;base64)?,(?<payload>[\s\S]*)$/u.exec(dataUrl);
33097
+ if (!match?.groups) {
33098
+ return undefined;
33099
+ }
33100
+ const mime = match.groups.mime || 'application/octet-stream';
33101
+ const isBase64 = Boolean(match.groups.base64);
33102
+ const payload = match.groups.payload ?? '';
33103
+ try {
33104
+ if (isBase64) {
33105
+ const binary = atob(payload);
33106
+ const bytes = new Uint8Array(binary.length);
33107
+ for (let i = 0; i < binary.length; i++) {
33108
+ bytes[i] = binary.charCodeAt(i);
33109
+ }
33110
+ return new Blob([bytes], { type: mime });
33111
+ }
33112
+ return new Blob([decodeURIComponent(payload)], { type: mime });
33113
+ }
33114
+ catch {
33115
+ return undefined;
33116
+ }
33117
+ }
33118
+ /**
33119
+ * Open a payload in a new browser tab. Chromium (and other browsers) silently
33120
+ * refuse to navigate a new top-level browsing context straight to a `data:`
33121
+ * URL, so a data URL is first converted to a Blob object URL - which browsers
33122
+ * do allow a new tab to open - and revoked after {@link OPEN_REVOKE_DELAY_MS}
33123
+ * once the new document has had time to fetch it. Non-`data:` URLs (http(s),
33124
+ * blob) are opened as-is.
33125
+ *
33126
+ * @param url - The payload URL (typically a recovered `data:` URL).
33127
+ */
33128
+ function openUrlInNewTab(url) {
33129
+ const blob = url.startsWith('data:') ? dataUrlToBlob(url) : undefined;
33130
+ const target = blob ? URL.createObjectURL(blob) : url;
33131
+ // NB: no `noopener` here. A `blob:` object URL is resolved from the opener's
33132
+ // origin-partitioned blob store, and Chromium refuses to resolve it in the
33133
+ // disconnected browsing context `noopener` creates (the new tab lands on an
33134
+ // empty document). We instead sever the child's back-reference to us
33135
+ // afterwards, which mitigates reverse-tabnabbing without breaking the blob.
33136
+ const opened = window.open(target, '_blank');
33137
+ if (opened) {
33138
+ try {
33139
+ opened.opener = null;
33140
+ }
33141
+ catch {
33142
+ // Some browsers disallow reassigning `opener`; best-effort only.
33143
+ }
33144
+ }
33145
+ if (blob) {
33146
+ setTimeout(() => {
33147
+ URL.revokeObjectURL(target);
33148
+ }, OPEN_REVOKE_DELAY_MS);
33149
+ }
33150
+ }
32779
33151
 
32780
33152
  /**
32781
33153
  * Canvas -> JPEG byte extraction shared by every binding's PDF export. This is
@@ -37815,7 +38187,7 @@ class EditorStateService {
37815
38187
  * layer and re-merged on save.
37816
38188
  */
37817
38189
  setSlides(slides) {
37818
- const partitioned = partitionSlides(this.clone(slides));
38190
+ const partitioned = partitionSlides(slides.map(cloneSlide$1));
37819
38191
  this.slides.set(partitioned.slides);
37820
38192
  this.templateElementsBySlideId.set(partitioned.templateElementsBySlideId);
37821
38193
  this.selectedIds.set([]);
@@ -37825,7 +38197,7 @@ class EditorStateService {
37825
38197
  }
37826
38198
  /** Current editable (template-free) slides as a fresh (cloned) array. */
37827
38199
  snapshot() {
37828
- return this.clone(this.slides());
38200
+ return this.slides().map(cloneSlide$1);
37829
38201
  }
37830
38202
  /**
37831
38203
  * Replace the whole deck with pre-computed slides (e.g. a find/replace
@@ -37834,7 +38206,7 @@ class EditorStateService {
37834
38206
  */
37835
38207
  applyReplacement(newSlides, label = 'Replace') {
37836
38208
  this.history.record(this.captureSnapshot(), label);
37837
- this.slides.set(this.clone(newSlides));
38209
+ this.slides.set(newSlides.map(cloneSlide$1));
37838
38210
  this.dirty.set(true);
37839
38211
  this.syncHistory();
37840
38212
  }
@@ -37845,15 +38217,15 @@ class EditorStateService {
37845
38217
  * steps.
37846
38218
  */
37847
38219
  applyRemoteSlides(slides) {
37848
- this.slides.set(this.clone(slides));
38220
+ this.slides.set(slides.map(cloneSlide$1));
37849
38221
  this.dirty.set(true);
37850
38222
  }
37851
38223
  // ── Snapshot (deck + template store) ─────────────────────────────────────
37852
38224
  /** Capture the current deck + template store as one undo/redo snapshot. */
37853
38225
  captureSnapshot() {
37854
38226
  return {
37855
- slides: this.clone(this.slides()),
37856
- templateElementsBySlideId: this.clone(this.templateElementsBySlideId()),
38227
+ slides: this.slides().map(cloneSlide$1),
38228
+ templateElementsBySlideId: cloneTemplateElementsBySlideId$1(this.templateElementsBySlideId()),
37857
38229
  };
37858
38230
  }
37859
38231
  /** Restore both the deck and the template store from a snapshot. */
@@ -38103,7 +38475,7 @@ class EditorStateService {
38103
38475
  if (picked.length === 0) {
38104
38476
  return;
38105
38477
  }
38106
- this.clipboard = this.clone(picked);
38478
+ this.clipboard = picked.map(cloneElement$1);
38107
38479
  this.hasClipboard.set(true);
38108
38480
  }
38109
38481
  /** Copy then delete the selected elements. */
@@ -38125,7 +38497,7 @@ class EditorStateService {
38125
38497
  const additions = this.clipboard.map((el) => {
38126
38498
  const id = this.newId();
38127
38499
  newIds.push(id);
38128
- return { ...this.clone(el), id, x: el.x + 12, y: el.y + 12 };
38500
+ return { ...cloneElement$1(el), id, x: el.x + 12, y: el.y + 12 };
38129
38501
  });
38130
38502
  this.slides.set(slides.map((slide, i) => i === slideIndex ? { ...slide, elements: [...slide.elements, ...additions] } : slide));
38131
38503
  this.selectedIds.set(newIds);
@@ -38191,7 +38563,7 @@ class EditorStateService {
38191
38563
  }
38192
38564
  this.history.record(this.captureSnapshot(), 'Duplicate slide');
38193
38565
  const id = this.newId();
38194
- const copy = { ...this.clone(slides[index]), id, rId: id };
38566
+ const copy = { ...cloneSlide$1(slides[index]), id, rId: id };
38195
38567
  const next = [...slides];
38196
38568
  next.splice(index + 1, 0, copy);
38197
38569
  this.slides.set(this.renumber(next));
@@ -38250,9 +38622,6 @@ class EditorStateService {
38250
38622
  this.undoLabel.set(this.history.undoLabel);
38251
38623
  this.redoLabel.set(this.history.redoLabel);
38252
38624
  }
38253
- clone(value) {
38254
- return structuredClone(value);
38255
- }
38256
38625
  newId() {
38257
38626
  const c = globalThis.crypto;
38258
38627
  if (c && typeof c.randomUUID === 'function') {
@@ -42634,6 +43003,7 @@ class SmartArtRendererComponent {
42634
43003
  } @else if (hasDrawingShapes()) {
42635
43004
  <svg
42636
43005
  class="pptx-ng-smartart-svg"
43006
+ data-testid="smartart-drawing-shapes"
42637
43007
  [attr.viewBox]="svgViewBox()"
42638
43008
  preserveAspectRatio="xMidYMid meet"
42639
43009
  >
@@ -42690,6 +43060,7 @@ class SmartArtRendererComponent {
42690
43060
  } @else if (hasLayout()) {
42691
43061
  <svg
42692
43062
  class="pptx-ng-smartart-svg"
43063
+ [attr.data-testid]="'smartart-' + layout().family"
42693
43064
  [attr.viewBox]="layout().viewBox"
42694
43065
  preserveAspectRatio="xMidYMid meet"
42695
43066
  [attr.data-layout-family]="layout().family"
@@ -42868,6 +43239,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
42868
43239
  } @else if (hasDrawingShapes()) {
42869
43240
  <svg
42870
43241
  class="pptx-ng-smartart-svg"
43242
+ data-testid="smartart-drawing-shapes"
42871
43243
  [attr.viewBox]="svgViewBox()"
42872
43244
  preserveAspectRatio="xMidYMid meet"
42873
43245
  >
@@ -42924,6 +43296,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
42924
43296
  } @else if (hasLayout()) {
42925
43297
  <svg
42926
43298
  class="pptx-ng-smartart-svg"
43299
+ [attr.data-testid]="'smartart-' + layout().family"
42927
43300
  [attr.viewBox]="layout().viewBox"
42928
43301
  preserveAspectRatio="xMidYMid meet"
42929
43302
  [attr.data-layout-family]="layout().family"
@@ -55019,9 +55392,40 @@ class MediaRendererComponent {
55019
55392
  ...(ngDevMode ? [{ debugName: "zIndex" }] : /* istanbul ignore next */ []));
55020
55393
  interactive = input(true, /* @ts-ignore */
55021
55394
  ...(ngDevMode ? [{ debugName: "interactive" }] : /* istanbul ignore next */ []));
55395
+ /**
55396
+ * True only on the live presentation stage. When set, the media element
55397
+ * starts playing on its own once mounted (as PowerPoint does when a slide
55398
+ * with media becomes active) instead of waiting for a manual click; the
55399
+ * thumbnail / sorter / editor canvases leave it false so their media is quiet.
55400
+ */
55401
+ presenting = input(false, /* @ts-ignore */
55402
+ ...(ngDevMode ? [{ debugName: "presenting" }] : /* istanbul ignore next */ []));
55022
55403
  /** Fallback text shown when neither a source nor a poster is available. */
55023
55404
  placeholderLabel = input('Media', /* @ts-ignore */
55024
55405
  ...(ngDevMode ? [{ debugName: "placeholderLabel" }] : /* istanbul ignore next */ []));
55406
+ /** The live `<video>`/`<audio>` node (only one is mounted at a time). */
55407
+ mediaElRef = viewChild('mediaEl', /* @ts-ignore */
55408
+ ...(ngDevMode ? [{ debugName: "mediaElRef" }] : /* istanbul ignore next */ []));
55409
+ constructor() {
55410
+ // Presentation autoplay: once the media node is in the DOM and this is the
55411
+ // live stage, start playback; pause again if it leaves present mode. Reads
55412
+ // mediaSrc so a source swap re-evaluates. The shared helper owns the
55413
+ // `.play()` + blocked-autoplay handling so all three bindings match.
55414
+ effect(() => {
55415
+ const el = this.mediaElRef()?.nativeElement;
55416
+ const presenting = this.presenting();
55417
+ this.mediaSrc();
55418
+ if (!el) {
55419
+ return;
55420
+ }
55421
+ if (presenting) {
55422
+ startMediaAutoplay(el, { trimStartMs: asMediaElement(this.element())?.trimStartMs });
55423
+ }
55424
+ else if (!el.paused) {
55425
+ el.pause();
55426
+ }
55427
+ });
55428
+ }
55025
55429
  containerStyle = computed(() => getContainerStyle(this.element(), this.zIndex()), /* @ts-ignore */
55026
55430
  ...(ngDevMode ? [{ debugName: "containerStyle" }] : /* istanbul ignore next */ []));
55027
55431
  /** Poster / preview frame data-URL (also used as the `<video poster>`). */
@@ -55047,7 +55451,7 @@ class MediaRendererComponent {
55047
55451
  clrChangeParams = computed(() => getClrChangeParams(this.element()), /* @ts-ignore */
55048
55452
  ...(ngDevMode ? [{ debugName: "clrChangeParams" }] : /* istanbul ignore next */ []));
55049
55453
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MediaRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
55050
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: MediaRendererComponent, isStandalone: true, selector: "pptx-media-renderer", inputs: { element: { classPropertyName: "element", publicName: "element", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, placeholderLabel: { classPropertyName: "placeholderLabel", publicName: "placeholderLabel", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
55454
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: MediaRendererComponent, isStandalone: true, selector: "pptx-media-renderer", inputs: { element: { classPropertyName: "element", publicName: "element", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, presenting: { classPropertyName: "presenting", publicName: "presenting", isSignal: true, isRequired: false, transformFunction: null }, placeholderLabel: { classPropertyName: "placeholderLabel", publicName: "placeholderLabel", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "mediaElRef", first: true, predicate: ["mediaEl"], descendants: true, isSignal: true }], ngImport: i0, template: `
55051
55455
  <div
55052
55456
  class="pptx-ng-element pptx-ng-media"
55053
55457
  [ngStyle]="containerStyle()"
@@ -55057,6 +55461,7 @@ class MediaRendererComponent {
55057
55461
  @if (mediaSrc(); as src) {
55058
55462
  @if (mediaKind() === 'audio') {
55059
55463
  <audio
55464
+ #mediaEl
55060
55465
  class="pptx-ng-media-el pptx-ng-media-audio"
55061
55466
  [class.pptx-ng-media-inert]="interactive()"
55062
55467
  [src]="src + trimFragment()"
@@ -55066,6 +55471,7 @@ class MediaRendererComponent {
55066
55471
  ></audio>
55067
55472
  } @else {
55068
55473
  <video
55474
+ #mediaEl
55069
55475
  class="pptx-ng-media-el pptx-ng-media-video"
55070
55476
  [class.pptx-ng-media-inert]="interactive()"
55071
55477
  [src]="src + trimFragment()"
@@ -55115,6 +55521,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
55115
55521
  @if (mediaSrc(); as src) {
55116
55522
  @if (mediaKind() === 'audio') {
55117
55523
  <audio
55524
+ #mediaEl
55118
55525
  class="pptx-ng-media-el pptx-ng-media-audio"
55119
55526
  [class.pptx-ng-media-inert]="interactive()"
55120
55527
  [src]="src + trimFragment()"
@@ -55124,6 +55531,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
55124
55531
  ></audio>
55125
55532
  } @else {
55126
55533
  <video
55534
+ #mediaEl
55127
55535
  class="pptx-ng-media-el pptx-ng-media-video"
55128
55536
  [class.pptx-ng-media-inert]="interactive()"
55129
55537
  [src]="src + trimFragment()"
@@ -55160,7 +55568,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
55160
55568
  }
55161
55569
  </div>
55162
55570
  `, styles: [".pptx-ng-media-el{display:block;pointer-events:auto}.pptx-ng-media-video{width:100%;height:100%;object-fit:contain}.pptx-ng-media-audio{width:100%}.pptx-ng-media-inert{pointer-events:none}.pptx-ng-img{width:100%;height:100%;object-fit:contain;display:block}\n"] }]
55163
- }], propDecorators: { element: [{ type: i0.Input, args: [{ isSignal: true, alias: "element", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], zIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "zIndex", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], placeholderLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholderLabel", required: false }] }] } });
55571
+ }], ctorParameters: () => [], propDecorators: { element: [{ type: i0.Input, args: [{ isSignal: true, alias: "element", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], zIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "zIndex", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], presenting: [{ type: i0.Input, args: [{ isSignal: true, alias: "presenting", required: false }] }], placeholderLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholderLabel", required: false }] }], mediaElRef: [{ type: i0.ViewChild, args: ['mediaEl', { isSignal: true }] }] } });
55164
55572
 
55165
55573
  /**
55166
55574
  * Pure helpers for `Model3DRendererComponent`.
@@ -55603,6 +56011,18 @@ class OleRendererComponent {
55603
56011
  return rows.map((row) => `${row.label}: ${row.value}`).join(', ');
55604
56012
  }, /* @ts-ignore */
55605
56013
  ...(ngDevMode ? [{ debugName: "infoTitle" }] : /* istanbul ignore next */ []));
56014
+ /**
56015
+ * Open the recovered embedded payload in a new browser tab. Routes through
56016
+ * the shared {@link openUrlInNewTab} helper, which converts the `data:` URL to
56017
+ * a Blob object URL first: browsers silently refuse to navigate a new
56018
+ * top-level tab straight to a `data:` URL.
56019
+ */
56020
+ openEmbedded() {
56021
+ const href = this.actions().downloadHref;
56022
+ if (href) {
56023
+ openUrlInNewTab(href);
56024
+ }
56025
+ }
55606
56026
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: OleRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
55607
56027
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: OleRendererComponent, isStandalone: true, selector: "pptx-ole-renderer", inputs: { element: { classPropertyName: "element", publicName: "element", isSignal: true, isRequired: true, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
55608
56028
  <div
@@ -55880,18 +56300,16 @@ class OleRendererComponent {
55880
56300
  {{ 'pptx.ole.download' | translate }}
55881
56301
  </a>
55882
56302
  @if (actions().canOpen) {
55883
- <a
56303
+ <button
56304
+ type="button"
55884
56305
  class="pptx-ng-ole-action"
55885
- [href]="actions().downloadHref"
55886
- target="_blank"
55887
- rel="noopener noreferrer"
55888
56306
  [attr.aria-label]="
55889
56307
  'pptx.ole.openFileAria' | translate: { file: actions().downloadFileName }
55890
56308
  "
55891
- (click)="$event.stopPropagation()"
56309
+ (click)="$event.stopPropagation(); openEmbedded()"
55892
56310
  >
55893
56311
  {{ 'pptx.ole.open' | translate }}
55894
- </a>
56312
+ </button>
55895
56313
  }
55896
56314
  </div>
55897
56315
  }
@@ -56176,18 +56594,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
56176
56594
  {{ 'pptx.ole.download' | translate }}
56177
56595
  </a>
56178
56596
  @if (actions().canOpen) {
56179
- <a
56597
+ <button
56598
+ type="button"
56180
56599
  class="pptx-ng-ole-action"
56181
- [href]="actions().downloadHref"
56182
- target="_blank"
56183
- rel="noopener noreferrer"
56184
56600
  [attr.aria-label]="
56185
56601
  'pptx.ole.openFileAria' | translate: { file: actions().downloadFileName }
56186
56602
  "
56187
- (click)="$event.stopPropagation()"
56603
+ (click)="$event.stopPropagation(); openEmbedded()"
56188
56604
  >
56189
56605
  {{ 'pptx.ole.open' | translate }}
56190
- </a>
56606
+ </button>
56191
56607
  }
56192
56608
  </div>
56193
56609
  }
@@ -57915,6 +58331,13 @@ class ElementRendererComponent {
57915
58331
  */
57916
58332
  interactive = input(true, /* @ts-ignore */
57917
58333
  ...(ngDevMode ? [{ debugName: "interactive" }] : /* istanbul ignore next */ []));
58334
+ /**
58335
+ * True only on the live presentation stage; threaded to the media renderer so
58336
+ * a slide's media autoplays when the slide becomes active (and to group
58337
+ * children so nested media autoplays too). False everywhere else.
58338
+ */
58339
+ presenting = input(false, /* @ts-ignore */
58340
+ ...(ngDevMode ? [{ debugName: "presenting" }] : /* istanbul ignore next */ []));
57918
58341
  /** Whether inline editing (e.g. table-cell text input) is enabled. */
57919
58342
  editable = input(false, /* @ts-ignore */
57920
58343
  ...(ngDevMode ? [{ debugName: "editable" }] : /* istanbul ignore next */ []));
@@ -58102,7 +58525,7 @@ class ElementRendererComponent {
58102
58525
  }, /* @ts-ignore */
58103
58526
  ...(ngDevMode ? [{ debugName: "placeholderLabel" }] : /* istanbul ignore next */ []));
58104
58527
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: ElementRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
58105
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: ElementRendererComponent, isStandalone: true, selector: "pptx-element-renderer", inputs: { element: { classPropertyName: "element", publicName: "element", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, obstacles: { classPropertyName: "obstacles", publicName: "obstacles", isSignal: true, isRequired: false, transformFunction: null }, canvasWidth: { classPropertyName: "canvasWidth", publicName: "canvasWidth", isSignal: true, isRequired: false, transformFunction: null }, canvasHeight: { classPropertyName: "canvasHeight", publicName: "canvasHeight", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, fieldContext: { classPropertyName: "fieldContext", publicName: "fieldContext", isSignal: true, isRequired: false, transformFunction: null }, editTemplateMode: { classPropertyName: "editTemplateMode", publicName: "editTemplateMode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { cellCommit: "cellCommit", tableChange: "tableChange" }, host: { classAttribute: "contents" }, ngImport: i0, template: `
58528
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: ElementRendererComponent, isStandalone: true, selector: "pptx-element-renderer", inputs: { element: { classPropertyName: "element", publicName: "element", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, obstacles: { classPropertyName: "obstacles", publicName: "obstacles", isSignal: true, isRequired: false, transformFunction: null }, canvasWidth: { classPropertyName: "canvasWidth", publicName: "canvasWidth", isSignal: true, isRequired: false, transformFunction: null }, canvasHeight: { classPropertyName: "canvasHeight", publicName: "canvasHeight", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, presenting: { classPropertyName: "presenting", publicName: "presenting", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, fieldContext: { classPropertyName: "fieldContext", publicName: "fieldContext", isSignal: true, isRequired: false, transformFunction: null }, editTemplateMode: { classPropertyName: "editTemplateMode", publicName: "editTemplateMode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { cellCommit: "cellCommit", tableChange: "tableChange" }, host: { classAttribute: "contents" }, ngImport: i0, template: `
58106
58529
  @switch (true) {
58107
58530
  @case (element().type === 'connector') {
58108
58531
  <pptx-connector-renderer
@@ -58204,6 +58627,7 @@ class ElementRendererComponent {
58204
58627
  [mediaDataUrls]="mediaDataUrls()"
58205
58628
  [zIndex]="$index"
58206
58629
  [interactive]="interactive()"
58630
+ [presenting]="presenting()"
58207
58631
  [fieldContext]="fieldContext()"
58208
58632
  />
58209
58633
  }
@@ -58236,6 +58660,7 @@ class ElementRendererComponent {
58236
58660
  [mediaDataUrls]="mediaDataUrls()"
58237
58661
  [zIndex]="zIndex()"
58238
58662
  [interactive]="interactive()"
58663
+ [presenting]="presenting()"
58239
58664
  [placeholderLabel]="placeholderLabel()"
58240
58665
  />
58241
58666
  }
@@ -58368,7 +58793,7 @@ class ElementRendererComponent {
58368
58793
  </defs>
58369
58794
  </svg>
58370
58795
  }
58371
- `, isInline: true, dependencies: [{ kind: "component", type: ElementRendererComponent, selector: "pptx-element-renderer", inputs: ["element", "mediaDataUrls", "zIndex", "obstacles", "canvasWidth", "canvasHeight", "interactive", "editable", "fieldContext", "editTemplateMode"], outputs: ["cellCommit", "tableChange"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ConnectorRendererComponent, selector: "pptx-connector-renderer", inputs: ["element", "zIndex", "obstacles", "canvasWidth", "canvasHeight", "interactive"] }, { kind: "component", type: TableRendererComponent, selector: "pptx-table-renderer", inputs: ["element", "editable"], outputs: ["cellCommit", "tableChange"] }, { kind: "component", type: ChartRendererComponent, selector: "pptx-chart-renderer", inputs: ["element"] }, { kind: "component", type: SmartArtRendererComponent, selector: "pptx-smart-art-renderer", inputs: ["element", "zIndex", "editable"] }, { kind: "component", type: SmartArt3DRendererComponent, selector: "pptx-smart-art-3d-renderer", inputs: ["element", "zIndex", "canEdit"] }, { kind: "component", type: InkRendererComponent, selector: "pptx-ink-renderer", inputs: ["element", "zIndex", "mediaDataUrls"] }, { kind: "component", type: MediaRendererComponent, selector: "pptx-media-renderer", inputs: ["element", "mediaDataUrls", "zIndex", "interactive", "placeholderLabel"] }, { kind: "component", type: OleRendererComponent, selector: "pptx-ole-renderer", inputs: ["element", "zIndex"] }, { kind: "component", type: Model3DRendererComponent, selector: "pptx-model3d-renderer", inputs: ["element", "zIndex", "mediaDataUrls", "interactive"] }, { kind: "component", type: ZoomRendererComponent, selector: "pptx-zoom-renderer", inputs: ["element", "zIndex", "mediaDataUrls"] }, { kind: "component", type: EquationRendererComponent, selector: "pptx-equation-renderer", inputs: ["equationXml", "equationNumber"] }, { kind: "component", type: ColorChangedImageComponent, selector: "pptx-color-changed-image", inputs: ["src", "clrChange", "alt", "imgClass", "imgStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
58796
+ `, isInline: true, dependencies: [{ kind: "component", type: ElementRendererComponent, selector: "pptx-element-renderer", inputs: ["element", "mediaDataUrls", "zIndex", "obstacles", "canvasWidth", "canvasHeight", "interactive", "presenting", "editable", "fieldContext", "editTemplateMode"], outputs: ["cellCommit", "tableChange"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ConnectorRendererComponent, selector: "pptx-connector-renderer", inputs: ["element", "zIndex", "obstacles", "canvasWidth", "canvasHeight", "interactive"] }, { kind: "component", type: TableRendererComponent, selector: "pptx-table-renderer", inputs: ["element", "editable"], outputs: ["cellCommit", "tableChange"] }, { kind: "component", type: ChartRendererComponent, selector: "pptx-chart-renderer", inputs: ["element"] }, { kind: "component", type: SmartArtRendererComponent, selector: "pptx-smart-art-renderer", inputs: ["element", "zIndex", "editable"] }, { kind: "component", type: SmartArt3DRendererComponent, selector: "pptx-smart-art-3d-renderer", inputs: ["element", "zIndex", "canEdit"] }, { kind: "component", type: InkRendererComponent, selector: "pptx-ink-renderer", inputs: ["element", "zIndex", "mediaDataUrls"] }, { kind: "component", type: MediaRendererComponent, selector: "pptx-media-renderer", inputs: ["element", "mediaDataUrls", "zIndex", "interactive", "presenting", "placeholderLabel"] }, { kind: "component", type: OleRendererComponent, selector: "pptx-ole-renderer", inputs: ["element", "zIndex"] }, { kind: "component", type: Model3DRendererComponent, selector: "pptx-model3d-renderer", inputs: ["element", "zIndex", "mediaDataUrls", "interactive"] }, { kind: "component", type: ZoomRendererComponent, selector: "pptx-zoom-renderer", inputs: ["element", "zIndex", "mediaDataUrls"] }, { kind: "component", type: EquationRendererComponent, selector: "pptx-equation-renderer", inputs: ["equationXml", "equationNumber"] }, { kind: "component", type: ColorChangedImageComponent, selector: "pptx-color-changed-image", inputs: ["src", "clrChange", "alt", "imgClass", "imgStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
58372
58797
  }
58373
58798
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: ElementRendererComponent, decorators: [{
58374
58799
  type: Component,
@@ -58494,6 +58919,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
58494
58919
  [mediaDataUrls]="mediaDataUrls()"
58495
58920
  [zIndex]="$index"
58496
58921
  [interactive]="interactive()"
58922
+ [presenting]="presenting()"
58497
58923
  [fieldContext]="fieldContext()"
58498
58924
  />
58499
58925
  }
@@ -58526,6 +58952,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
58526
58952
  [mediaDataUrls]="mediaDataUrls()"
58527
58953
  [zIndex]="zIndex()"
58528
58954
  [interactive]="interactive()"
58955
+ [presenting]="presenting()"
58529
58956
  [placeholderLabel]="placeholderLabel()"
58530
58957
  />
58531
58958
  }
@@ -58660,7 +59087,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
58660
59087
  }
58661
59088
  `,
58662
59089
  }]
58663
- }], propDecorators: { element: [{ type: i0.Input, args: [{ isSignal: true, alias: "element", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], zIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "zIndex", required: false }] }], obstacles: [{ type: i0.Input, args: [{ isSignal: true, alias: "obstacles", required: false }] }], canvasWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasWidth", required: false }] }], canvasHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasHeight", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], editable: [{ type: i0.Input, args: [{ isSignal: true, alias: "editable", required: false }] }], fieldContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "fieldContext", required: false }] }], editTemplateMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "editTemplateMode", required: false }] }], cellCommit: [{ type: i0.Output, args: ["cellCommit"] }], tableChange: [{ type: i0.Output, args: ["tableChange"] }] } });
59090
+ }], propDecorators: { element: [{ type: i0.Input, args: [{ isSignal: true, alias: "element", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], zIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "zIndex", required: false }] }], obstacles: [{ type: i0.Input, args: [{ isSignal: true, alias: "obstacles", required: false }] }], canvasWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasWidth", required: false }] }], canvasHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasHeight", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], presenting: [{ type: i0.Input, args: [{ isSignal: true, alias: "presenting", required: false }] }], editable: [{ type: i0.Input, args: [{ isSignal: true, alias: "editable", required: false }] }], fieldContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "fieldContext", required: false }] }], editTemplateMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "editTemplateMode", required: false }] }], cellCommit: [{ type: i0.Output, args: ["cellCommit"] }], tableChange: [{ type: i0.Output, args: ["tableChange"] }] } });
58664
59091
 
58665
59092
  /**
58666
59093
  * ink-drawing.service.ts: Pen/highlighter/freeform/eraser drawing state +
@@ -59167,6 +59594,13 @@ class SlideCanvasComponent {
59167
59594
  */
59168
59595
  interactive = input(true, /* @ts-ignore */
59169
59596
  ...(ngDevMode ? [{ debugName: "interactive" }] : /* istanbul ignore next */ []));
59597
+ /**
59598
+ * True only for the live presentation stage: slide-content media autoplays.
59599
+ * Left false for thumbnails, the sorter and the editor canvas so their media
59600
+ * stays quiet (the template layer never autoplays regardless).
59601
+ */
59602
+ presenting = input(false, /* @ts-ignore */
59603
+ ...(ngDevMode ? [{ debugName: "presenting" }] : /* istanbul ignore next */ []));
59170
59604
  /** Ids of currently-selected elements (drawn with a selection outline). */
59171
59605
  selectedIds = input([], /* @ts-ignore */
59172
59606
  ...(ngDevMode ? [{ debugName: "selectedIds" }] : /* istanbul ignore next */ []));
@@ -59832,7 +60266,7 @@ class SlideCanvasComponent {
59832
60266
  }, /* @ts-ignore */
59833
60267
  ...(ngDevMode ? [{ debugName: "stageStyle" }] : /* istanbul ignore next */ []));
59834
60268
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SlideCanvasComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
59835
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: SlideCanvasComponent, isStandalone: true, selector: "pptx-slide-canvas", inputs: { slide: { classPropertyName: "slide", publicName: "slide", 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 }, zoom: { classPropertyName: "zoom", publicName: "zoom", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", 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 }, snapToGuides: { classPropertyName: "snapToGuides", publicName: "snapToGuides", isSignal: true, isRequired: false, transformFunction: null }, autoFit: { classPropertyName: "autoFit", publicName: "autoFit", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, selectedIds: { classPropertyName: "selectedIds", publicName: "selectedIds", isSignal: true, isRequired: false, transformFunction: null }, editingId: { classPropertyName: "editingId", publicName: "editingId", isSignal: true, isRequired: false, transformFunction: null }, editTemplateMode: { classPropertyName: "editTemplateMode", publicName: "editTemplateMode", isSignal: true, isRequired: false, transformFunction: null }, templateElements: { classPropertyName: "templateElements", publicName: "templateElements", isSignal: true, isRequired: false, transformFunction: null }, drawTool: { classPropertyName: "drawTool", publicName: "drawTool", isSignal: true, isRequired: false, transformFunction: null }, drawColor: { classPropertyName: "drawColor", publicName: "drawColor", isSignal: true, isRequired: false, transformFunction: null }, drawWidth: { classPropertyName: "drawWidth", publicName: "drawWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { elementSelect: "elementSelect", backgroundClick: "backgroundClick", transformStart: "transformStart", transformUpdate: "transformUpdate", contextMenu: "contextMenu", textEditStart: "textEditStart", textCommit: "textCommit", textCancel: "textCancel", textFormat: "textFormat", rotateUpdate: "rotateUpdate", marqueeSelect: "marqueeSelect", inkStrokeComplete: "inkStrokeComplete", eraserHit: "eraserHit", cellCommit: "cellCommit", tableChange: "tableChange" }, host: { listeners: { "document:pointermove": "onPointerMove($event)", "document:pointerup": "onPointerUp()" } }, providers: [CanvasFitService, InkDrawingService, RulerGuidesService], viewQueries: [{ propertyName: "textEditor", first: true, predicate: ["textEditor"], descendants: true, isSignal: true }, { propertyName: "stageRef", first: true, predicate: ["stage"], descendants: true, isSignal: true }, { propertyName: "viewportRef", first: true, predicate: ["viewport"], descendants: true, isSignal: true }], ngImport: i0, template: `
60269
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: SlideCanvasComponent, isStandalone: true, selector: "pptx-slide-canvas", inputs: { slide: { classPropertyName: "slide", publicName: "slide", 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 }, zoom: { classPropertyName: "zoom", publicName: "zoom", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", 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 }, snapToGuides: { classPropertyName: "snapToGuides", publicName: "snapToGuides", isSignal: true, isRequired: false, transformFunction: null }, autoFit: { classPropertyName: "autoFit", publicName: "autoFit", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, presenting: { classPropertyName: "presenting", publicName: "presenting", isSignal: true, isRequired: false, transformFunction: null }, selectedIds: { classPropertyName: "selectedIds", publicName: "selectedIds", isSignal: true, isRequired: false, transformFunction: null }, editingId: { classPropertyName: "editingId", publicName: "editingId", isSignal: true, isRequired: false, transformFunction: null }, editTemplateMode: { classPropertyName: "editTemplateMode", publicName: "editTemplateMode", isSignal: true, isRequired: false, transformFunction: null }, templateElements: { classPropertyName: "templateElements", publicName: "templateElements", isSignal: true, isRequired: false, transformFunction: null }, drawTool: { classPropertyName: "drawTool", publicName: "drawTool", isSignal: true, isRequired: false, transformFunction: null }, drawColor: { classPropertyName: "drawColor", publicName: "drawColor", isSignal: true, isRequired: false, transformFunction: null }, drawWidth: { classPropertyName: "drawWidth", publicName: "drawWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { elementSelect: "elementSelect", backgroundClick: "backgroundClick", transformStart: "transformStart", transformUpdate: "transformUpdate", contextMenu: "contextMenu", textEditStart: "textEditStart", textCommit: "textCommit", textCancel: "textCancel", textFormat: "textFormat", rotateUpdate: "rotateUpdate", marqueeSelect: "marqueeSelect", inkStrokeComplete: "inkStrokeComplete", eraserHit: "eraserHit", cellCommit: "cellCommit", tableChange: "tableChange" }, host: { listeners: { "document:pointermove": "onPointerMove($event)", "document:pointerup": "onPointerUp()" } }, providers: [CanvasFitService, InkDrawingService, RulerGuidesService], viewQueries: [{ propertyName: "textEditor", first: true, predicate: ["textEditor"], descendants: true, isSignal: true }, { propertyName: "stageRef", first: true, predicate: ["stage"], descendants: true, isSignal: true }, { propertyName: "viewportRef", first: true, predicate: ["viewport"], descendants: true, isSignal: true }], ngImport: i0, template: `
59836
60270
  <div
59837
60271
  #viewport
59838
60272
  class="pptx-ng-canvas-viewport"
@@ -59883,6 +60317,7 @@ class SlideCanvasComponent {
59883
60317
  [canvasWidth]="canvasSize().width"
59884
60318
  [canvasHeight]="canvasSize().height"
59885
60319
  [interactive]="interactive()"
60320
+ [presenting]="presenting()"
59886
60321
  [editable]="editable()"
59887
60322
  [fieldContext]="fieldContext()"
59888
60323
  [editTemplateMode]="false"
@@ -60202,7 +60637,7 @@ class SlideCanvasComponent {
60202
60637
  }
60203
60638
  </div>
60204
60639
  </div>
60205
- `, isInline: true, styles: [".pptx-ng-canvas-stage.is-editable{touch-action:none}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ElementRendererComponent, selector: "pptx-element-renderer", inputs: ["element", "mediaDataUrls", "zIndex", "obstacles", "canvasWidth", "canvasHeight", "interactive", "editable", "fieldContext", "editTemplateMode"], outputs: ["cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
60640
+ `, isInline: true, styles: [".pptx-ng-canvas-stage.is-editable{touch-action:none}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ElementRendererComponent, selector: "pptx-element-renderer", inputs: ["element", "mediaDataUrls", "zIndex", "obstacles", "canvasWidth", "canvasHeight", "interactive", "presenting", "editable", "fieldContext", "editTemplateMode"], outputs: ["cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
60206
60641
  }
60207
60642
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SlideCanvasComponent, decorators: [{
60208
60643
  type: Component,
@@ -60257,6 +60692,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
60257
60692
  [canvasWidth]="canvasSize().width"
60258
60693
  [canvasHeight]="canvasSize().height"
60259
60694
  [interactive]="interactive()"
60695
+ [presenting]="presenting()"
60260
60696
  [editable]="editable()"
60261
60697
  [fieldContext]="fieldContext()"
60262
60698
  [editTemplateMode]="false"
@@ -60577,7 +61013,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
60577
61013
  </div>
60578
61014
  </div>
60579
61015
  `, styles: [".pptx-ng-canvas-stage.is-editable{touch-action:none}\n"] }]
60580
- }], ctorParameters: () => [], propDecorators: { slide: [{ type: i0.Input, args: [{ isSignal: true, alias: "slide", required: false }] }], canvasSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasSize", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], zoom: [{ type: i0.Input, args: [{ isSignal: true, alias: "zoom", required: false }] }], editable: [{ type: i0.Input, args: [{ isSignal: true, alias: "editable", 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 }] }], snapToGuides: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToGuides", required: false }] }], autoFit: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoFit", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], selectedIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedIds", required: false }] }], editingId: [{ type: i0.Input, args: [{ isSignal: true, alias: "editingId", required: false }] }], editTemplateMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "editTemplateMode", required: false }] }], templateElements: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateElements", required: false }] }], drawTool: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawTool", required: false }] }], drawColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawColor", required: false }] }], drawWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawWidth", required: false }] }], elementSelect: [{ type: i0.Output, args: ["elementSelect"] }], backgroundClick: [{ type: i0.Output, args: ["backgroundClick"] }], transformStart: [{ type: i0.Output, args: ["transformStart"] }], transformUpdate: [{ type: i0.Output, args: ["transformUpdate"] }], contextMenu: [{ type: i0.Output, args: ["contextMenu"] }], textEditStart: [{ type: i0.Output, args: ["textEditStart"] }], textCommit: [{ type: i0.Output, args: ["textCommit"] }], textCancel: [{ type: i0.Output, args: ["textCancel"] }], textFormat: [{ type: i0.Output, args: ["textFormat"] }], rotateUpdate: [{ type: i0.Output, args: ["rotateUpdate"] }], marqueeSelect: [{ type: i0.Output, args: ["marqueeSelect"] }], inkStrokeComplete: [{ type: i0.Output, args: ["inkStrokeComplete"] }], eraserHit: [{ type: i0.Output, args: ["eraserHit"] }], cellCommit: [{ type: i0.Output, args: ["cellCommit"] }], tableChange: [{ type: i0.Output, args: ["tableChange"] }], textEditor: [{ type: i0.ViewChild, args: ['textEditor', { isSignal: true }] }], stageRef: [{ type: i0.ViewChild, args: ['stage', { isSignal: true }] }], viewportRef: [{ type: i0.ViewChild, args: ['viewport', { isSignal: true }] }], onPointerMove: [{
61016
+ }], ctorParameters: () => [], propDecorators: { slide: [{ type: i0.Input, args: [{ isSignal: true, alias: "slide", required: false }] }], canvasSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasSize", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], zoom: [{ type: i0.Input, args: [{ isSignal: true, alias: "zoom", required: false }] }], editable: [{ type: i0.Input, args: [{ isSignal: true, alias: "editable", 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 }] }], snapToGuides: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToGuides", required: false }] }], autoFit: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoFit", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], presenting: [{ type: i0.Input, args: [{ isSignal: true, alias: "presenting", required: false }] }], selectedIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedIds", required: false }] }], editingId: [{ type: i0.Input, args: [{ isSignal: true, alias: "editingId", required: false }] }], editTemplateMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "editTemplateMode", required: false }] }], templateElements: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateElements", required: false }] }], drawTool: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawTool", required: false }] }], drawColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawColor", required: false }] }], drawWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawWidth", required: false }] }], elementSelect: [{ type: i0.Output, args: ["elementSelect"] }], backgroundClick: [{ type: i0.Output, args: ["backgroundClick"] }], transformStart: [{ type: i0.Output, args: ["transformStart"] }], transformUpdate: [{ type: i0.Output, args: ["transformUpdate"] }], contextMenu: [{ type: i0.Output, args: ["contextMenu"] }], textEditStart: [{ type: i0.Output, args: ["textEditStart"] }], textCommit: [{ type: i0.Output, args: ["textCommit"] }], textCancel: [{ type: i0.Output, args: ["textCancel"] }], textFormat: [{ type: i0.Output, args: ["textFormat"] }], rotateUpdate: [{ type: i0.Output, args: ["rotateUpdate"] }], marqueeSelect: [{ type: i0.Output, args: ["marqueeSelect"] }], inkStrokeComplete: [{ type: i0.Output, args: ["inkStrokeComplete"] }], eraserHit: [{ type: i0.Output, args: ["eraserHit"] }], cellCommit: [{ type: i0.Output, args: ["cellCommit"] }], tableChange: [{ type: i0.Output, args: ["tableChange"] }], textEditor: [{ type: i0.ViewChild, args: ['textEditor', { isSignal: true }] }], stageRef: [{ type: i0.ViewChild, args: ['stage', { isSignal: true }] }], viewportRef: [{ type: i0.ViewChild, args: ['viewport', { isSignal: true }] }], onPointerMove: [{
60581
61017
  type: HostListener,
60582
61018
  args: ['document:pointermove', ['$event']]
60583
61019
  }], onPointerUp: [{
@@ -60782,7 +61218,7 @@ class MobilePresenterViewComponent {
60782
61218
  } @else {
60783
61219
  <div class="pptx-ng-mpresenter-empty">{{ 'pptx.presenter.noSlides' | translate }}</div>
60784
61220
  }
60785
- `, isInline: true, styles: [":host{position:absolute;inset:0;z-index:50;display:flex;flex-direction:column;background:#0b0b0c;color:#f5f5f5;font-family:system-ui,sans-serif;padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px);padding-left:env(safe-area-inset-left,0px);padding-right:env(safe-area-inset-right,0px)}.pptx-ng-mpresenter-header,.pptx-ng-mpresenter-next,.pptx-ng-mpresenter-ctl{display:flex;align-items:center;gap:.75rem;padding:.5rem 1rem}.pptx-ng-mpresenter-header{justify-content:space-between;border-bottom:1px solid rgba(255,255,255,.08)}.pptx-ng-mpresenter-label{font-size:.625rem;text-transform:uppercase;letter-spacing:.06em;color:#ffffff8c}.pptx-ng-mpresenter-elapsed{font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:1.125rem;color:#6ea8fe}.pptx-ng-mpresenter-counter{font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:.875rem}.pptx-ng-mpresenter-exit{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;min-width:44px;min-height:44px;border:none;border-radius:6px;background:transparent;color:#ffffffbf;cursor:pointer;font-size:1.25rem;line-height:1}.pptx-ng-mpresenter-exit:hover{background:#ffffff1f;color:#fff}.pptx-ng-mpresenter-main{display:flex;align-items:center;justify-content:center;background:#000;padding:.75rem}.pptx-ng-mpresenter-main-stage{width:100%;max-width:640px}.pptx-ng-mpresenter-next{border-bottom:1px solid rgba(255,255,255,.08)}.pptx-ng-mpresenter-thumb{flex:0 0 auto;overflow:hidden;border:1px solid rgba(255,255,255,.15);border-radius:4px}.pptx-ng-mpresenter-next-empty{display:flex;flex:1 1 auto;align-items:center;justify-content:center;height:3rem;border:1px solid rgba(255,255,255,.15);border-radius:4px;background:#ffffff0a;font-size:.625rem;font-style:italic;color:#ffffff80}.pptx-ng-mpresenter-notes{flex:1 1 auto;display:flex;flex-direction:column;min-height:0;padding:.5rem 1rem}.pptx-ng-mpresenter-notes-body{flex:1 1 auto;overflow-y:auto;margin-top:.25rem;border:1px solid rgba(255,255,255,.15);border-radius:6px;background:#ffffff0a;padding:.5rem .75rem;white-space:pre-wrap;line-height:1.5;font-size:15px}.pptx-ng-mpresenter-notes-empty{font-style:italic;color:#ffffff80}.pptx-ng-mpresenter-ctl{justify-content:space-between;border-top:1px solid rgba(255,255,255,.08)}.pptx-ng-mpresenter-navbtn{flex:1 1 0;display:inline-flex;align-items:center;justify-content:center;gap:.375rem;height:44px;border:none;border-radius:6px;background:#ffffff14;color:#f5f5f5;cursor:pointer;font-size:.9rem}.pptx-ng-mpresenter-navbtn:hover:not(:disabled){background:#ffffff29}.pptx-ng-mpresenter-navbtn:disabled{opacity:.4;cursor:not-allowed}.pptx-ng-mpresenter-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#fff9}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
61221
+ `, isInline: true, styles: [":host{position:absolute;inset:0;z-index:50;display:flex;flex-direction:column;background:#0b0b0c;color:#f5f5f5;font-family:system-ui,sans-serif;padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px);padding-left:env(safe-area-inset-left,0px);padding-right:env(safe-area-inset-right,0px)}.pptx-ng-mpresenter-header,.pptx-ng-mpresenter-next,.pptx-ng-mpresenter-ctl{display:flex;align-items:center;gap:.75rem;padding:.5rem 1rem}.pptx-ng-mpresenter-header{justify-content:space-between;border-bottom:1px solid rgba(255,255,255,.08)}.pptx-ng-mpresenter-label{font-size:.625rem;text-transform:uppercase;letter-spacing:.06em;color:#ffffff8c}.pptx-ng-mpresenter-elapsed{font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:1.125rem;color:#6ea8fe}.pptx-ng-mpresenter-counter{font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:.875rem}.pptx-ng-mpresenter-exit{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;min-width:44px;min-height:44px;border:none;border-radius:6px;background:transparent;color:#ffffffbf;cursor:pointer;font-size:1.25rem;line-height:1}.pptx-ng-mpresenter-exit:hover{background:#ffffff1f;color:#fff}.pptx-ng-mpresenter-main{display:flex;align-items:center;justify-content:center;background:#000;padding:.75rem}.pptx-ng-mpresenter-main-stage{width:100%;max-width:640px}.pptx-ng-mpresenter-next{border-bottom:1px solid rgba(255,255,255,.08)}.pptx-ng-mpresenter-thumb{flex:0 0 auto;overflow:hidden;border:1px solid rgba(255,255,255,.15);border-radius:4px}.pptx-ng-mpresenter-next-empty{display:flex;flex:1 1 auto;align-items:center;justify-content:center;height:3rem;border:1px solid rgba(255,255,255,.15);border-radius:4px;background:#ffffff0a;font-size:.625rem;font-style:italic;color:#ffffff80}.pptx-ng-mpresenter-notes{flex:1 1 auto;display:flex;flex-direction:column;min-height:0;padding:.5rem 1rem}.pptx-ng-mpresenter-notes-body{flex:1 1 auto;overflow-y:auto;margin-top:.25rem;border:1px solid rgba(255,255,255,.15);border-radius:6px;background:#ffffff0a;padding:.5rem .75rem;white-space:pre-wrap;line-height:1.5;font-size:15px}.pptx-ng-mpresenter-notes-empty{font-style:italic;color:#ffffff80}.pptx-ng-mpresenter-ctl{justify-content:space-between;border-top:1px solid rgba(255,255,255,.08)}.pptx-ng-mpresenter-navbtn{flex:1 1 0;display:inline-flex;align-items:center;justify-content:center;gap:.375rem;height:44px;border:none;border-radius:6px;background:#ffffff14;color:#f5f5f5;cursor:pointer;font-size:.9rem}.pptx-ng-mpresenter-navbtn:hover:not(:disabled){background:#ffffff29}.pptx-ng-mpresenter-navbtn:disabled{opacity:.4;cursor:not-allowed}.pptx-ng-mpresenter-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#fff9}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
60786
61222
  }
60787
61223
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MobilePresenterViewComponent, decorators: [{
60788
61224
  type: Component,
@@ -61058,7 +61494,7 @@ class MobileSlidesSheetComponent {
61058
61494
  }
61059
61495
  </div>
61060
61496
  </pptx-mobile-sheet>
61061
- `, isInline: true, styles: [":host{display:contents}.pptx-ng-mslides-count{margin:0;padding:.5rem 1rem .25rem;font-size:.75rem;color:#ffffff73}.pptx-ng-mslides-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:.75rem;padding:.75rem .875rem 1.5rem}.pptx-ng-mslides-cell{display:flex;flex-direction:column;align-items:center;gap:.375rem;padding:.375rem;border:2px solid transparent;border-radius:.5rem;background:transparent;color:inherit;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;transition:border-color .12s,background .12s}.pptx-ng-mslides-cell:hover{background:#ffffff0d;border-color:#ffffff26}.pptx-ng-mslides-cell:active{background:#ffffff1a}.pptx-ng-mslides-cell.is-active{border-color:#3b82f6;background:#3b82f61a}.pptx-ng-mslides-clip{overflow:hidden;border-radius:.25rem;width:100%}.pptx-ng-mslides-clip ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}.pptx-ng-mslides-num{display:block;font-size:.625rem;color:#fff6;line-height:1.4;-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: MobileSheetComponent, selector: "pptx-mobile-sheet", inputs: ["open", "title", "heightFraction", "fullScreen"], outputs: ["closed"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
61497
+ `, isInline: true, styles: [":host{display:contents}.pptx-ng-mslides-count{margin:0;padding:.5rem 1rem .25rem;font-size:.75rem;color:#ffffff73}.pptx-ng-mslides-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:.75rem;padding:.75rem .875rem 1.5rem}.pptx-ng-mslides-cell{display:flex;flex-direction:column;align-items:center;gap:.375rem;padding:.375rem;border:2px solid transparent;border-radius:.5rem;background:transparent;color:inherit;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;transition:border-color .12s,background .12s}.pptx-ng-mslides-cell:hover{background:#ffffff0d;border-color:#ffffff26}.pptx-ng-mslides-cell:active{background:#ffffff1a}.pptx-ng-mslides-cell.is-active{border-color:#3b82f6;background:#3b82f61a}.pptx-ng-mslides-clip{overflow:hidden;border-radius:.25rem;width:100%}.pptx-ng-mslides-clip ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}.pptx-ng-mslides-num{display:block;font-size:.625rem;color:#fff6;line-height:1.4;-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: MobileSheetComponent, selector: "pptx-mobile-sheet", inputs: ["open", "title", "heightFraction", "fullScreen"], outputs: ["closed"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
61062
61498
  }
61063
61499
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MobileSlidesSheetComponent, decorators: [{
61064
61500
  type: Component,
@@ -61987,7 +62423,7 @@ class NotesPanelComponent {
61987
62423
  #richEditor
61988
62424
  class="pptx-ng-notes-rich"
61989
62425
  [hidden]="!showRich()"
61990
- [attr.contenteditable]="slide() ? 'true' : 'false'"
62426
+ [attr.contenteditable]="showRich() ? 'true' : 'false'"
61991
62427
  role="textbox"
61992
62428
  aria-multiline="true"
61993
62429
  [attr.aria-label]="'pptx.notes.speakerNotes' | translate"
@@ -62057,7 +62493,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
62057
62493
  #richEditor
62058
62494
  class="pptx-ng-notes-rich"
62059
62495
  [hidden]="!showRich()"
62060
- [attr.contenteditable]="slide() ? 'true' : 'false'"
62496
+ [attr.contenteditable]="showRich() ? 'true' : 'false'"
62061
62497
  role="textbox"
62062
62498
  aria-multiline="true"
62063
62499
  [attr.aria-label]="'pptx.notes.speakerNotes' | translate"
@@ -63041,6 +63477,78 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
63041
63477
  `, styles: [":host{display:block;position:absolute;inset:0;pointer-events:none}.pptx-ng-anno-wrapper{position:absolute;inset:0}.pptx-ng-anno-svg{position:absolute;top:0;left:0;transform-origin:top left;overflow:visible}.pptx-ng-laser-dot{position:absolute;border-radius:50%;pointer-events:none;background:#ff0000d9;box-shadow:0 0 12px 6px #ff000080,0 0 24px 12px #ff000040;filter:drop-shadow(0 0 8px rgba(255,0,0,.7))}\n"] }]
63042
63478
  }], propDecorators: { canvasSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasSize", required: true }] }], zoom: [{ type: i0.Input, args: [{ isSignal: true, alias: "zoom", required: false }] }], svgRef: [{ type: i0.ViewChild, args: ['svg', { isSignal: true }] }] } });
63043
63479
 
63480
+ /**
63481
+ * presentation-fullscreen.ts
63482
+ *
63483
+ * DOM-only helpers that drive the real browser Fullscreen API for the
63484
+ * presentation overlay. Kept Angular-free so they can be unit-tested without
63485
+ * TestBed (mirrors `presentation-overlay-helpers.ts`).
63486
+ *
63487
+ * Mirrors the React (`usePresentationMode.ts`) and Vue (`PresentationMode.vue`)
63488
+ * implementations: request fullscreen on the overlay's own root element when it
63489
+ * mounts, exit fullscreen when it unmounts, and feature-detect throughout so
63490
+ * browsers/environments without full Fullscreen API support (iOS Safari's
63491
+ * partial support, jsdom in tests, etc.) degrade silently to the CSS-fixed
63492
+ * overlay rather than throwing.
63493
+ */
63494
+ /**
63495
+ * Request fullscreen on `element` if the Fullscreen API is available.
63496
+ * No-ops (rather than throwing) when the element is missing, the API is
63497
+ * unsupported, or the browser rejects the request (no active user gesture,
63498
+ * permission denied, etc.).
63499
+ */
63500
+ function requestPresentationFullscreen(element) {
63501
+ if (!element) {
63502
+ return;
63503
+ }
63504
+ const el = element;
63505
+ if (typeof el.requestFullscreen !== 'function') {
63506
+ return;
63507
+ }
63508
+ try {
63509
+ void el.requestFullscreen().catch(() => {
63510
+ /* ignore: denied, unsupported, or no active user gesture */
63511
+ });
63512
+ }
63513
+ catch {
63514
+ /* ignore: some environments throw synchronously instead of rejecting */
63515
+ }
63516
+ }
63517
+ /**
63518
+ * Exit fullscreen if the given document is currently in it and the Fullscreen
63519
+ * API is available. No-ops otherwise.
63520
+ */
63521
+ function exitPresentationFullscreen(doc) {
63522
+ if (!doc) {
63523
+ return;
63524
+ }
63525
+ const d = doc;
63526
+ if (!d.fullscreenElement || typeof d.exitFullscreen !== 'function') {
63527
+ return;
63528
+ }
63529
+ try {
63530
+ void d.exitFullscreen().catch(() => {
63531
+ /* ignore */
63532
+ });
63533
+ }
63534
+ catch {
63535
+ /* ignore */
63536
+ }
63537
+ }
63538
+ /**
63539
+ * Whether `doc` is currently NOT in fullscreen (i.e. fullscreen was just
63540
+ * exited, or was never entered, e.g. because the API is unsupported).
63541
+ *
63542
+ * Fed a `fullscreenchange` event on `document`; combined with the overlay's
63543
+ * own "did I just cause this?" guard, distinguishes an external exit (Esc
63544
+ * consumed by the browser before reaching the overlay's own keydown handler,
63545
+ * the Android back gesture, swiping away on iOS) from our own close flow.
63546
+ */
63547
+ function hasExitedFullscreen(doc) {
63548
+ const d = doc;
63549
+ return !d?.fullscreenElement;
63550
+ }
63551
+
63044
63552
  /**
63045
63553
  * Clamp `index` to the valid range [0, count - 1].
63046
63554
  * Returns 0 when `count` is 0 to avoid -1 states.
@@ -63558,7 +64066,7 @@ class PresentationTransitionOverlayComponent {
63558
64066
  />
63559
64067
  </div>
63560
64068
  </div>
63561
- `, isInline: true, styles: [":host{display:block;position:absolute;inset:0;overflow:hidden;pointer-events:none}.pptx-ng-transition-layer{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
64069
+ `, isInline: true, styles: [":host{display:block;position:absolute;inset:0;overflow:hidden;pointer-events:none}.pptx-ng-transition-layer{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
63562
64070
  }
63563
64071
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PresentationTransitionOverlayComponent, decorators: [{
63564
64072
  type: Component,
@@ -63667,6 +64175,17 @@ function attachTouchGestures(element, config) {
63667
64175
  * Horizontal swipe → left → next, right → previous
63668
64176
  *
63669
64177
  * Click on the overlay body → advance to next visible slide.
64178
+ *
64179
+ * Fullscreen (mirrors the React `usePresentationMode` / Vue `PresentationMode.vue`
64180
+ * behavior, on top of the CSS-fixed full-viewport overlay above): the real
64181
+ * Fullscreen API is requested on this component's root element once it mounts,
64182
+ * and released again on destroy, so the browser chrome (address bar, etc.) gets
64183
+ * out of the way on mobile the same way it does for React/Vue. A
64184
+ * `fullscreenchange` listener syncs back to `closed` when fullscreen is exited
64185
+ * from outside this component's own close/Escape handling (browser UI, the
64186
+ * Android back gesture, etc.). Environments without Fullscreen API support
64187
+ * (iOS Safari's partial support, `jsdom` in tests) degrade silently to the
64188
+ * plain CSS overlay.
63670
64189
  */
63671
64190
  class PresentationOverlayComponent {
63672
64191
  // ------------------------------------------------------------------
@@ -63718,11 +64237,23 @@ class PresentationOverlayComponent {
63718
64237
  /** The slide stage root; animation styles are applied to its elements. */
63719
64238
  stageRef = viewChild('stage', /* @ts-ignore */
63720
64239
  ...(ngDevMode ? [{ debugName: "stageRef" }] : /* istanbul ignore next */ []));
63721
- /** The overlay root; the shared touch-gesture recogniser attaches here. */
64240
+ /**
64241
+ * The overlay root; the shared touch-gesture recogniser attaches here, and
64242
+ * it is the element the real Fullscreen API is requested on (see
64243
+ * {@link setupFullscreen}).
64244
+ */
63722
64245
  rootRef = viewChild('root', /* @ts-ignore */
63723
64246
  ...(ngDevMode ? [{ debugName: "rootRef" }] : /* istanbul ignore next */ []));
64247
+ /**
64248
+ * Guards against handling the same exit twice: e.g. Escape both reaches our
64249
+ * own `keydown` handler AND causes the browser to natively exit fullscreen
64250
+ * (firing `fullscreenchange`), or the close button's `click` and `touchend`
64251
+ * both fire for one tap.
64252
+ */
64253
+ closing = false;
63724
64254
  constructor() {
63725
64255
  this.setupTouchGestures();
64256
+ this.setupFullscreen();
63726
64257
  // Wire the zoom-navigation context to this overlay's slide navigation so a
63727
64258
  // descendant zoom tile can jump to its target slide on click.
63728
64259
  this.zoomNavigation.setHandler((index) => this.goToSlide(index));
@@ -63920,6 +64451,39 @@ class PresentationOverlayComponent {
63920
64451
  });
63921
64452
  }
63922
64453
  // ------------------------------------------------------------------
64454
+ // Real Fullscreen API (layered on top of the CSS-fixed overlay)
64455
+ // ------------------------------------------------------------------
64456
+ /**
64457
+ * Request real fullscreen on the overlay root once it mounts, and release
64458
+ * it again when the overlay is destroyed (`presenting` flips back to
64459
+ * false, closing this `@if` block). Mirrors Vue's `onMounted` /
64460
+ * `onBeforeUnmount` pair on its own overlay root; feature-detected so
64461
+ * unsupported environments just keep the CSS overlay.
64462
+ */
64463
+ setupFullscreen() {
64464
+ const destroyRef = inject(DestroyRef);
64465
+ afterNextRender(() => {
64466
+ requestPresentationFullscreen(this.rootRef()?.nativeElement);
64467
+ });
64468
+ destroyRef.onDestroy(() => {
64469
+ exitPresentationFullscreen(typeof document === 'undefined' ? null : document);
64470
+ });
64471
+ }
64472
+ /**
64473
+ * Sync back to `closed` when fullscreen is exited from OUTSIDE this
64474
+ * component's own close/Escape handling: the browser's native Esc handling
64475
+ * can beat (or replace) our `keydown` listener, and mobile back
64476
+ * gestures/browser-UI exits never reach it at all. Without this, `presenting`
64477
+ * would stay stuck true while the app has silently fallen back to the plain
64478
+ * CSS overlay. `emitClosed()` is itself guarded against double-firing, so it
64479
+ * is safe if our own close flow *also* triggers this event.
64480
+ */
64481
+ onFullscreenChange() {
64482
+ if (hasExitedFullscreen(typeof document === 'undefined' ? null : document)) {
64483
+ this.emitClosed();
64484
+ }
64485
+ }
64486
+ // ------------------------------------------------------------------
63923
64487
  // Lifecycle
63924
64488
  // ------------------------------------------------------------------
63925
64489
  ngOnInit() {
@@ -64099,13 +64663,17 @@ class PresentationOverlayComponent {
64099
64663
  this.indexChange.emit(next);
64100
64664
  }
64101
64665
  emitClosed() {
64666
+ if (this.closing) {
64667
+ return;
64668
+ }
64669
+ this.closing = true;
64102
64670
  if (this.annotations.hasAnyAnnotations()) {
64103
64671
  this.annotationsExit.emit(this.annotations.getAllSlideAnnotations());
64104
64672
  }
64105
64673
  this.closed.emit();
64106
64674
  }
64107
64675
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PresentationOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
64108
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: PresentationOverlayComponent, isStandalone: true, selector: "pptx-presentation-overlay", inputs: { slides: { classPropertyName: "slides", publicName: "slides", isSignal: true, isRequired: true, transformFunction: null }, canvasSize: { classPropertyName: "canvasSize", publicName: "canvasSize", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, startIndex: { classPropertyName: "startIndex", publicName: "startIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { indexChange: "indexChange", closed: "closed", annotationsExit: "annotationsExit" }, host: { listeners: { "window:resize": "onWindowResize()", "document:keydown": "onKeyDown($event)" } }, providers: [AnimationPlaybackService, PresentationAnnotationsService, ZoomNavigationService], viewQueries: [{ propertyName: "stageRef", first: true, predicate: ["stage"], descendants: true, isSignal: true }, { propertyName: "rootRef", first: true, predicate: ["root"], descendants: true, isSignal: true }], ngImport: i0, template: `
64676
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: PresentationOverlayComponent, isStandalone: true, selector: "pptx-presentation-overlay", inputs: { slides: { classPropertyName: "slides", publicName: "slides", isSignal: true, isRequired: true, transformFunction: null }, canvasSize: { classPropertyName: "canvasSize", publicName: "canvasSize", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, startIndex: { classPropertyName: "startIndex", publicName: "startIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { indexChange: "indexChange", closed: "closed", annotationsExit: "annotationsExit" }, host: { listeners: { "document:fullscreenchange": "onFullscreenChange()", "window:resize": "onWindowResize()", "document:keydown": "onKeyDown($event)" } }, providers: [AnimationPlaybackService, PresentationAnnotationsService, ZoomNavigationService], viewQueries: [{ propertyName: "stageRef", first: true, predicate: ["stage"], descendants: true, isSignal: true }, { propertyName: "rootRef", first: true, predicate: ["root"], descendants: true, isSignal: true }], ngImport: i0, template: `
64109
64677
  <div #root class="pptx-ng-presentation-root">
64110
64678
  <!--
64111
64679
  Slide counter, rendered first in DOM (before slide content) so a
@@ -64131,6 +64699,7 @@ class PresentationOverlayComponent {
64131
64699
  [zoom]="zoom()"
64132
64700
  [autoFit]="false"
64133
64701
  [interactive]="false"
64702
+ [presenting]="true"
64134
64703
  />
64135
64704
 
64136
64705
  @if (activeTransition(); as t) {
@@ -64239,7 +64808,7 @@ class PresentationOverlayComponent {
64239
64808
  <svg lucideChevronRight class="h-6 w-6"></svg>
64240
64809
  </button>
64241
64810
  </div>
64242
- `, isInline: true, styles: [":host{display:block;position:fixed;inset:0;z-index:10000;background:#000;cursor:pointer;-webkit-user-select:none;user-select:none}.pptx-ng-presentation-root{position:absolute;inset:0;touch-action:pan-y}.pptx-ng-presentation-close:hover,.pptx-ng-presentation-nav:hover{background:#000000bf}.pptx-ng-presentation-tools{position:absolute;bottom:max(1rem,env(safe-area-inset-bottom));left:1rem;display:flex;gap:.25rem;padding:.25rem;border-radius:.5rem;background:#0000008c;z-index:80}.pptx-ng-presentation-tools button{width:2rem;height:2rem;border:none;border-radius:.35rem;background:transparent;color:#fff;font-size:1rem;cursor:pointer}.pptx-ng-presentation-tools button:hover{background:#ffffff26}.pptx-ng-presentation-tools button.is-active{background:#ffffff4d}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresentationTransitionOverlayComponent, selector: "pptx-presentation-transition-overlay", inputs: ["outgoingSlide", "canvasSize", "transition", "templateElements", "mediaDataUrls", "durationMs"], outputs: ["complete"] }, { kind: "component", type: PresentationAnnotationOverlayComponent, selector: "pptx-presentation-annotation-overlay", inputs: ["canvasSize", "zoom"] }, { kind: "component", type: PresentationSubtitleBarComponent, selector: "pptx-presentation-subtitle-bar", inputs: ["visible"] }, { kind: "component", type: LucidePenTool, selector: "svg[lucidePenTool]" }, { kind: "component", type: LucideHighlighter, selector: "svg[lucideHighlighter]" }, { kind: "component", type: LucideEraser, selector: "svg[lucideEraser]" }, { kind: "component", type: LucideMousePointer2, selector: "svg[lucideMousePointer2]" }, { kind: "component", type: LucideTrash2, selector: "svg[lucideTrash2]" }, { kind: "component", type: LucideX, selector: "svg[lucideX]" }, { kind: "component", type: LucideChevronLeft, selector: "svg[lucideChevronLeft]" }, { kind: "component", type: LucideChevronRight, selector: "svg[lucideChevronRight]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
64811
+ `, isInline: true, styles: [":host{display:block;position:fixed;inset:0;z-index:10000;background:#000;cursor:pointer;-webkit-user-select:none;user-select:none}.pptx-ng-presentation-root{position:absolute;inset:0;touch-action:pan-y}.pptx-ng-presentation-close:hover,.pptx-ng-presentation-nav:hover{background:#000000bf}.pptx-ng-presentation-tools{position:absolute;bottom:max(1rem,env(safe-area-inset-bottom));left:1rem;display:flex;gap:.25rem;padding:.25rem;border-radius:.5rem;background:#0000008c;z-index:80}.pptx-ng-presentation-tools button{width:2rem;height:2rem;border:none;border-radius:.35rem;background:transparent;color:#fff;font-size:1rem;cursor:pointer}.pptx-ng-presentation-tools button:hover{background:#ffffff26}.pptx-ng-presentation-tools button.is-active{background:#ffffff4d}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresentationTransitionOverlayComponent, selector: "pptx-presentation-transition-overlay", inputs: ["outgoingSlide", "canvasSize", "transition", "templateElements", "mediaDataUrls", "durationMs"], outputs: ["complete"] }, { kind: "component", type: PresentationAnnotationOverlayComponent, selector: "pptx-presentation-annotation-overlay", inputs: ["canvasSize", "zoom"] }, { kind: "component", type: PresentationSubtitleBarComponent, selector: "pptx-presentation-subtitle-bar", inputs: ["visible"] }, { kind: "component", type: LucidePenTool, selector: "svg[lucidePenTool]" }, { kind: "component", type: LucideHighlighter, selector: "svg[lucideHighlighter]" }, { kind: "component", type: LucideEraser, selector: "svg[lucideEraser]" }, { kind: "component", type: LucideMousePointer2, selector: "svg[lucideMousePointer2]" }, { kind: "component", type: LucideTrash2, selector: "svg[lucideTrash2]" }, { kind: "component", type: LucideX, selector: "svg[lucideX]" }, { kind: "component", type: LucideChevronLeft, selector: "svg[lucideChevronLeft]" }, { kind: "component", type: LucideChevronRight, selector: "svg[lucideChevronRight]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
64243
64812
  }
64244
64813
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PresentationOverlayComponent, decorators: [{
64245
64814
  type: Component,
@@ -64284,6 +64853,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
64284
64853
  [zoom]="zoom()"
64285
64854
  [autoFit]="false"
64286
64855
  [interactive]="false"
64856
+ [presenting]="true"
64287
64857
  />
64288
64858
 
64289
64859
  @if (activeTransition(); as t) {
@@ -64393,7 +64963,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
64393
64963
  </button>
64394
64964
  </div>
64395
64965
  `, styles: [":host{display:block;position:fixed;inset:0;z-index:10000;background:#000;cursor:pointer;-webkit-user-select:none;user-select:none}.pptx-ng-presentation-root{position:absolute;inset:0;touch-action:pan-y}.pptx-ng-presentation-close:hover,.pptx-ng-presentation-nav:hover{background:#000000bf}.pptx-ng-presentation-tools{position:absolute;bottom:max(1rem,env(safe-area-inset-bottom));left:1rem;display:flex;gap:.25rem;padding:.25rem;border-radius:.5rem;background:#0000008c;z-index:80}.pptx-ng-presentation-tools button{width:2rem;height:2rem;border:none;border-radius:.35rem;background:transparent;color:#fff;font-size:1rem;cursor:pointer}.pptx-ng-presentation-tools button:hover{background:#ffffff26}.pptx-ng-presentation-tools button.is-active{background:#ffffff4d}\n"] }]
64396
- }], ctorParameters: () => [], propDecorators: { slides: [{ type: i0.Input, args: [{ isSignal: true, alias: "slides", required: true }] }], canvasSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasSize", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], startIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "startIndex", required: false }] }], indexChange: [{ type: i0.Output, args: ["indexChange"] }], closed: [{ type: i0.Output, args: ["closed"] }], annotationsExit: [{ type: i0.Output, args: ["annotationsExit"] }], stageRef: [{ type: i0.ViewChild, args: ['stage', { isSignal: true }] }], rootRef: [{ type: i0.ViewChild, args: ['root', { isSignal: true }] }], onWindowResize: [{
64966
+ }], ctorParameters: () => [], propDecorators: { slides: [{ type: i0.Input, args: [{ isSignal: true, alias: "slides", required: true }] }], canvasSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasSize", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], startIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "startIndex", required: false }] }], indexChange: [{ type: i0.Output, args: ["indexChange"] }], closed: [{ type: i0.Output, args: ["closed"] }], annotationsExit: [{ type: i0.Output, args: ["annotationsExit"] }], stageRef: [{ type: i0.ViewChild, args: ['stage', { isSignal: true }] }], rootRef: [{ type: i0.ViewChild, args: ['root', { isSignal: true }] }], onFullscreenChange: [{
64967
+ type: HostListener,
64968
+ args: ['document:fullscreenchange']
64969
+ }], onWindowResize: [{
64397
64970
  type: HostListener,
64398
64971
  args: ['window:resize']
64399
64972
  }], onKeyDown: [{
@@ -64714,7 +65287,7 @@ class PresenterViewComponent {
64714
65287
  } @else {
64715
65288
  <div class="pptx-ng-presenter-empty">{{ 'pptx.presenter.noSlides' | translate }}</div>
64716
65289
  }
64717
- `, isInline: true, styles: [":host{position:absolute;inset:0;z-index:50;display:flex;flex-direction:column;background:#0b0b0c;color:#f5f5f5;font-family:system-ui,sans-serif}.pptx-ng-presenter-body{display:flex;flex:1 1 auto;min-height:0}.pptx-ng-presenter-current{flex:7 1 0;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#000;padding:1rem;min-width:0}.pptx-ng-presenter-preview-stage{width:100%;max-width:100%;min-height:0}.pptx-ng-presenter-slide-badge{margin-top:.5rem;font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:.75rem;color:#ffffff80;-webkit-user-select:none;user-select:none}.pptx-ng-presenter-side{flex:3 1 0;display:flex;flex-direction:column;background:#18181b;border-left:1px solid rgba(255,255,255,.12);min-width:260px;max-width:440px}.pptx-ng-presenter-header,.pptx-ng-presenter-nav,.pptx-ng-presenter-next{padding:.5rem 1rem;border-bottom:1px solid rgba(255,255,255,.08)}.pptx-ng-presenter-header{display:flex;align-items:center;justify-content:space-between;gap:.5rem}.pptx-ng-presenter-label{font-size:.625rem;text-transform:uppercase;letter-spacing:.06em;color:#ffffff8c}.pptx-ng-presenter-clock{font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:1.125rem}.pptx-ng-presenter-elapsed{color:#6ea8fe}.pptx-ng-presenter-iconbtn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;border-radius:6px;background:transparent;color:#ffffffb3;cursor:pointer;font-size:1rem;line-height:1}.pptx-ng-presenter-iconbtn:hover{background:#ffffff1a;color:#fff}.pptx-ng-presenter-iconbtn:disabled{opacity:.3;cursor:not-allowed}.pptx-ng-presenter-nav{display:flex;align-items:center;justify-content:space-between}.pptx-ng-presenter-navbtn{display:inline-flex;align-items:center;gap:.375rem;padding:.375rem .75rem;border:none;border-radius:6px;background:#ffffff14;color:#f5f5f5;cursor:pointer;font-size:.75rem}.pptx-ng-presenter-navbtn:hover:not(:disabled){background:#ffffff29}.pptx-ng-presenter-navbtn:disabled{opacity:.4;cursor:not-allowed}.pptx-ng-presenter-counter{font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:.875rem}.pptx-ng-presenter-next-empty{display:flex;align-items:center;justify-content:center;height:4rem;border:1px solid rgba(255,255,255,.15);border-radius:6px;background:#ffffff0a;font-size:.75rem;font-style:italic;color:#ffffff80}.pptx-ng-presenter-notes{flex:1 1 auto;display:flex;flex-direction:column;min-height:0;padding:.75rem 1rem}.pptx-ng-presenter-notes-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem}.pptx-ng-presenter-notes-size{display:flex;align-items:center;gap:.25rem}.pptx-ng-presenter-notes-size-value{min-width:28px;text-align:center;font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:.625rem;color:#ffffff8c;-webkit-user-select:none;user-select:none}.pptx-ng-presenter-notes-body{flex:1 1 auto;overflow-y:auto;border:1px solid rgba(255,255,255,.15);border-radius:6px;background:#ffffff0a;padding:.5rem .75rem;white-space:pre-wrap;line-height:1.5}.pptx-ng-presenter-notes-empty{font-style:italic;color:#ffffff80}.pptx-ng-presenter-progress{height:6px;width:100%;background:#ffffff1f;flex:0 0 auto}.pptx-ng-presenter-progress-fill{height:100%;background:#6ea8fe;transition:width 1s linear}.pptx-ng-presenter-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#fff9}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
65290
+ `, isInline: true, styles: [":host{position:absolute;inset:0;z-index:50;display:flex;flex-direction:column;background:#0b0b0c;color:#f5f5f5;font-family:system-ui,sans-serif}.pptx-ng-presenter-body{display:flex;flex:1 1 auto;min-height:0}.pptx-ng-presenter-current{flex:7 1 0;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#000;padding:1rem;min-width:0}.pptx-ng-presenter-preview-stage{width:100%;max-width:100%;min-height:0}.pptx-ng-presenter-slide-badge{margin-top:.5rem;font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:.75rem;color:#ffffff80;-webkit-user-select:none;user-select:none}.pptx-ng-presenter-side{flex:3 1 0;display:flex;flex-direction:column;background:#18181b;border-left:1px solid rgba(255,255,255,.12);min-width:260px;max-width:440px}.pptx-ng-presenter-header,.pptx-ng-presenter-nav,.pptx-ng-presenter-next{padding:.5rem 1rem;border-bottom:1px solid rgba(255,255,255,.08)}.pptx-ng-presenter-header{display:flex;align-items:center;justify-content:space-between;gap:.5rem}.pptx-ng-presenter-label{font-size:.625rem;text-transform:uppercase;letter-spacing:.06em;color:#ffffff8c}.pptx-ng-presenter-clock{font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:1.125rem}.pptx-ng-presenter-elapsed{color:#6ea8fe}.pptx-ng-presenter-iconbtn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;border-radius:6px;background:transparent;color:#ffffffb3;cursor:pointer;font-size:1rem;line-height:1}.pptx-ng-presenter-iconbtn:hover{background:#ffffff1a;color:#fff}.pptx-ng-presenter-iconbtn:disabled{opacity:.3;cursor:not-allowed}.pptx-ng-presenter-nav{display:flex;align-items:center;justify-content:space-between}.pptx-ng-presenter-navbtn{display:inline-flex;align-items:center;gap:.375rem;padding:.375rem .75rem;border:none;border-radius:6px;background:#ffffff14;color:#f5f5f5;cursor:pointer;font-size:.75rem}.pptx-ng-presenter-navbtn:hover:not(:disabled){background:#ffffff29}.pptx-ng-presenter-navbtn:disabled{opacity:.4;cursor:not-allowed}.pptx-ng-presenter-counter{font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:.875rem}.pptx-ng-presenter-next-empty{display:flex;align-items:center;justify-content:center;height:4rem;border:1px solid rgba(255,255,255,.15);border-radius:6px;background:#ffffff0a;font-size:.75rem;font-style:italic;color:#ffffff80}.pptx-ng-presenter-notes{flex:1 1 auto;display:flex;flex-direction:column;min-height:0;padding:.75rem 1rem}.pptx-ng-presenter-notes-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem}.pptx-ng-presenter-notes-size{display:flex;align-items:center;gap:.25rem}.pptx-ng-presenter-notes-size-value{min-width:28px;text-align:center;font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:.625rem;color:#ffffff8c;-webkit-user-select:none;user-select:none}.pptx-ng-presenter-notes-body{flex:1 1 auto;overflow-y:auto;border:1px solid rgba(255,255,255,.15);border-radius:6px;background:#ffffff0a;padding:.5rem .75rem;white-space:pre-wrap;line-height:1.5}.pptx-ng-presenter-notes-empty{font-style:italic;color:#ffffff80}.pptx-ng-presenter-progress{height:6px;width:100%;background:#ffffff1f;flex:0 0 auto}.pptx-ng-presenter-progress-fill{height:100%;background:#6ea8fe;transition:width 1s linear}.pptx-ng-presenter-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#fff9}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
64718
65291
  }
64719
65292
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PresenterViewComponent, decorators: [{
64720
65293
  type: Component,
@@ -73287,7 +73860,7 @@ class SlideSorterOverlayComponent {
73287
73860
  </div>
73288
73861
  </div>
73289
73862
  </div>
73290
- `, isInline: true, styles: [":host{display:contents}.pptx-ng-sorter-backdrop{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;background:#000000b3;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.pptx-ng-sorter-panel{display:flex;flex-direction:column;width:min(96vw,1200px);max-height:90vh;border-radius:.5rem;background:#1a1a1a;color:#e5e5e5;box-shadow:0 24px 64px #0009;overflow:hidden}.pptx-ng-sorter-header{display:flex;align-items:center;gap:.75rem;padding:.75rem 1.25rem;border-bottom:1px solid rgba(255,255,255,.1);flex-shrink:0}.pptx-ng-sorter-title{margin:0;font-size:.875rem;font-weight:500}.pptx-ng-sorter-count{font-size:.75rem;color:#ffffff80;flex:1}.pptx-ng-sorter-close{display:flex;align-items:center;justify-content:center;width:44px;height:44px;min-width:44px;min-height:44px;padding:0;border:none;border-radius:50%;background:#ffffff1a;color:#e5e5e5;cursor:pointer;transition:background .15s;flex-shrink:0;touch-action:manipulation}.pptx-ng-sorter-close:hover{background:#fff3}.pptx-ng-sorter-grid-scroll{flex:1;overflow-y:auto;padding:1.25rem}.pptx-ng-sorter-grid{display:grid;gap:1rem}.pptx-ng-sorter-cell{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:.5rem;border:2px solid transparent;border-radius:.375rem;background:transparent;cursor:pointer;transition:border-color .15s,background .15s;color:inherit}.pptx-ng-sorter-cell:hover{background:#ffffff0f;border-color:#fff3}.pptx-ng-sorter-cell.is-active{border-color:#3b82f6;background:#3b82f61a}.pptx-ng-sorter-cell.is-hidden{opacity:.4}.pptx-ng-sorter-thumb-clip{overflow:hidden;border-radius:2px}.pptx-ng-sorter-thumb-clip ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}.pptx-ng-sorter-index{font-size:.6875rem;color:#ffffff8c;-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
73863
+ `, isInline: true, styles: [":host{display:contents}.pptx-ng-sorter-backdrop{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;background:#000000b3;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.pptx-ng-sorter-panel{display:flex;flex-direction:column;width:min(96vw,1200px);max-height:90vh;border-radius:.5rem;background:#1a1a1a;color:#e5e5e5;box-shadow:0 24px 64px #0009;overflow:hidden}.pptx-ng-sorter-header{display:flex;align-items:center;gap:.75rem;padding:.75rem 1.25rem;border-bottom:1px solid rgba(255,255,255,.1);flex-shrink:0}.pptx-ng-sorter-title{margin:0;font-size:.875rem;font-weight:500}.pptx-ng-sorter-count{font-size:.75rem;color:#ffffff80;flex:1}.pptx-ng-sorter-close{display:flex;align-items:center;justify-content:center;width:44px;height:44px;min-width:44px;min-height:44px;padding:0;border:none;border-radius:50%;background:#ffffff1a;color:#e5e5e5;cursor:pointer;transition:background .15s;flex-shrink:0;touch-action:manipulation}.pptx-ng-sorter-close:hover{background:#fff3}.pptx-ng-sorter-grid-scroll{flex:1;overflow-y:auto;padding:1.25rem}.pptx-ng-sorter-grid{display:grid;gap:1rem}.pptx-ng-sorter-cell{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:.5rem;border:2px solid transparent;border-radius:.375rem;background:transparent;cursor:pointer;transition:border-color .15s,background .15s;color:inherit}.pptx-ng-sorter-cell:hover{background:#ffffff0f;border-color:#fff3}.pptx-ng-sorter-cell.is-active{border-color:#3b82f6;background:#3b82f61a}.pptx-ng-sorter-cell.is-hidden{opacity:.4}.pptx-ng-sorter-thumb-clip{overflow:hidden;border-radius:2px}.pptx-ng-sorter-thumb-clip ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}.pptx-ng-sorter-index{font-size:.6875rem;color:#ffffff8c;-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
73291
73864
  }
73292
73865
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SlideSorterOverlayComponent, decorators: [{
73293
73866
  type: Component,
@@ -73532,7 +74105,7 @@ class SlidesPanelComponent {
73532
74105
  </button>
73533
74106
  </footer>
73534
74107
  </div>
73535
- `, isInline: true, styles: [":host{display:flex;flex-direction:column;height:100%;overflow:hidden}.pptx-ng-spanel{display:flex;flex-direction:column;height:100%;background:#1e1e1e;color:#e5e5e5;border-right:1px solid rgba(255,255,255,.08);overflow:hidden}.pptx-ng-spanel-scroll{flex:1;overflow-y:auto;padding:.5rem .375rem;display:flex;flex-direction:column;gap:.375rem}.pptx-ng-spanel-card{position:relative;border-radius:.375rem;border:2px solid transparent;background:transparent;transition:border-color .15s,background .15s}.pptx-ng-spanel-card:hover,.pptx-ng-spanel-card:focus-within{background:#ffffff0d;border-color:#ffffff26}.pptx-ng-spanel-card.is-active{border-color:#3b82f6;background:#3b82f61a}.pptx-ng-spanel-thumb-btn{display:block;width:100%;padding:.375rem .375rem 0;border:none;background:transparent;cursor:pointer;color:inherit;line-height:0}.pptx-ng-spanel-thumb-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;border-radius:.25rem}.pptx-ng-spanel-clip{overflow:hidden;border-radius:2px}.pptx-ng-spanel-clip ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}.pptx-ng-spanel-num{display:block;text-align:center;font-size:.625rem;line-height:1.6;color:#ffffff73;-webkit-user-select:none;user-select:none;padding-bottom:.25rem}.pptx-ng-spanel-actions{position:absolute;top:.25rem;right:.25rem;display:flex;flex-direction:column;gap:.125rem;opacity:0;pointer-events:none;transition:opacity .12s}.pptx-ng-spanel-card:hover .pptx-ng-spanel-actions,.pptx-ng-spanel-card:focus-within .pptx-ng-spanel-actions{opacity:1;pointer-events:auto}.pptx-ng-spanel-action{display:flex;align-items:center;justify-content:center;width:1.375rem;height:1.375rem;padding:0;border:none;border-radius:.25rem;background:#1e1e1ed9;color:#e5e5e5;font-size:.6875rem;cursor:pointer;transition:background .12s;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.pptx-ng-spanel-action:hover:not([disabled]){background:#3b82f6bf}.pptx-ng-spanel-action[disabled]{opacity:.3;cursor:not-allowed}.pptx-ng-spanel-footer{flex-shrink:0;padding:.5rem .375rem;border-top:1px solid rgba(255,255,255,.08)}.pptx-ng-spanel-add{display:block;width:100%;padding:.4375rem 0;border:1px dashed rgba(255,255,255,.2);border-radius:.375rem;background:transparent;color:#fff9;font-size:.75rem;cursor:pointer;transition:background .15s,border-color .15s,color .15s}.pptx-ng-spanel-add:hover{background:#3b82f626;border-color:#3b82f6;color:#e5e5e5}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: LucideCopy, selector: "svg[lucideCopy]" }, { kind: "component", type: LucideTrash2, selector: "svg[lucideTrash2]" }, { kind: "component", type: LucideArrowUp, selector: "svg[lucideArrowUp]" }, { kind: "component", type: LucideArrowDown, selector: "svg[lucideArrowDown]" }, { kind: "component", type: LucidePlus, selector: "svg[lucidePlus]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
74108
+ `, isInline: true, styles: [":host{display:flex;flex-direction:column;height:100%;overflow:hidden}.pptx-ng-spanel{display:flex;flex-direction:column;height:100%;background:#1e1e1e;color:#e5e5e5;border-right:1px solid rgba(255,255,255,.08);overflow:hidden}.pptx-ng-spanel-scroll{flex:1;overflow-y:auto;padding:.5rem .375rem;display:flex;flex-direction:column;gap:.375rem}.pptx-ng-spanel-card{position:relative;border-radius:.375rem;border:2px solid transparent;background:transparent;transition:border-color .15s,background .15s}.pptx-ng-spanel-card:hover,.pptx-ng-spanel-card:focus-within{background:#ffffff0d;border-color:#ffffff26}.pptx-ng-spanel-card.is-active{border-color:#3b82f6;background:#3b82f61a}.pptx-ng-spanel-thumb-btn{display:block;width:100%;padding:.375rem .375rem 0;border:none;background:transparent;cursor:pointer;color:inherit;line-height:0}.pptx-ng-spanel-thumb-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;border-radius:.25rem}.pptx-ng-spanel-clip{overflow:hidden;border-radius:2px}.pptx-ng-spanel-clip ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}.pptx-ng-spanel-num{display:block;text-align:center;font-size:.625rem;line-height:1.6;color:#ffffff73;-webkit-user-select:none;user-select:none;padding-bottom:.25rem}.pptx-ng-spanel-actions{position:absolute;top:.25rem;right:.25rem;display:flex;flex-direction:column;gap:.125rem;opacity:0;pointer-events:none;transition:opacity .12s}.pptx-ng-spanel-card:hover .pptx-ng-spanel-actions,.pptx-ng-spanel-card:focus-within .pptx-ng-spanel-actions{opacity:1;pointer-events:auto}.pptx-ng-spanel-action{display:flex;align-items:center;justify-content:center;width:1.375rem;height:1.375rem;padding:0;border:none;border-radius:.25rem;background:#1e1e1ed9;color:#e5e5e5;font-size:.6875rem;cursor:pointer;transition:background .12s;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.pptx-ng-spanel-action:hover:not([disabled]){background:#3b82f6bf}.pptx-ng-spanel-action[disabled]{opacity:.3;cursor:not-allowed}.pptx-ng-spanel-footer{flex-shrink:0;padding:.5rem .375rem;border-top:1px solid rgba(255,255,255,.08)}.pptx-ng-spanel-add{display:block;width:100%;padding:.4375rem 0;border:1px dashed rgba(255,255,255,.2);border-radius:.375rem;background:transparent;color:#fff9;font-size:.75rem;cursor:pointer;transition:background .15s,border-color .15s,color .15s}.pptx-ng-spanel-add:hover{background:#3b82f626;border-color:#3b82f6;color:#e5e5e5}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: LucideCopy, selector: "svg[lucideCopy]" }, { kind: "component", type: LucideTrash2, selector: "svg[lucideTrash2]" }, { kind: "component", type: LucideArrowUp, selector: "svg[lucideArrowUp]" }, { kind: "component", type: LucideArrowDown, selector: "svg[lucideArrowDown]" }, { kind: "component", type: LucidePlus, selector: "svg[lucidePlus]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
73536
74109
  }
73537
74110
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SlidesPanelComponent, decorators: [{
73538
74111
  type: Component,
@@ -75811,9 +76384,18 @@ class ViewerCustomShowsService {
75811
76384
  ...(ngDevMode ? [{ debugName: "activeId" }] : /* istanbul ignore next */ []));
75812
76385
  /** Active-slide index of the host viewer (bound from the component). */
75813
76386
  activeSlideIndex = () => 0;
75814
- /** Wire the host's active-slide-index accessor (called once from the constructor). */
75815
- bind(activeSlideIndex) {
75816
- this.activeSlideIndex = activeSlideIndex;
76387
+ /**
76388
+ * The viewer's LIVE (edited) slides accessor, bound from the component. The
76389
+ * presentation overlay must reflect in-session edits (inserted media, moved
76390
+ * shapes, etc.), so it reads these rather than the pristine loaded deck
76391
+ * (`loader.slides()`), mirroring React/Vue where present mode shows the
76392
+ * working set. Defaults to the loaded slides until bound.
76393
+ */
76394
+ liveSlides = () => this.loader.slides();
76395
+ /** Wire the host's active-slide-index + live-slides accessors (called once from the constructor). */
76396
+ bind(accessors) {
76397
+ this.activeSlideIndex = accessors.activeSlideIndex;
76398
+ this.liveSlides = accessors.liveSlides;
75817
76399
  }
75818
76400
  /** Custom shows mapped to the core shape consumed by set-up-slide-show. */
75819
76401
  pptxCustomShows = computed(() => this.shows().map((show) => ({
@@ -75822,8 +76404,8 @@ class ViewerCustomShowsService {
75822
76404
  slideRIds: [...show.slideIds],
75823
76405
  })), /* @ts-ignore */
75824
76406
  ...(ngDevMode ? [{ debugName: "pptxCustomShows" }] : /* istanbul ignore next */ []));
75825
- /** Slides shown in presentation mode: the active custom show, else the full deck. */
75826
- presentationSlides = computed(() => this.resolveActiveShowSlides() ?? [...this.loader.slides()], /* @ts-ignore */
76407
+ /** Slides shown in presentation mode: the active custom show, else the full (live) deck. */
76408
+ presentationSlides = computed(() => this.resolveActiveShowSlides() ?? [...this.liveSlides()], /* @ts-ignore */
75827
76409
  ...(ngDevMode ? [{ debugName: "presentationSlides" }] : /* istanbul ignore next */ []));
75828
76410
  /** Start index into {@link presentationSlides}: first slide of a custom show, else the active slide. */
75829
76411
  presentationStartIndex = computed(() => this.resolveActiveShowSlides() ? 0 : this.activeSlideIndex(), /* @ts-ignore */
@@ -75853,7 +76435,7 @@ class ViewerCustomShowsService {
75853
76435
  if (!show || show.slideIds.length === 0) {
75854
76436
  return null;
75855
76437
  }
75856
- const byId = new Map(this.loader.slides().map((s) => [s.id, s]));
76438
+ const byId = new Map(this.liveSlides().map((s) => [s.id, s]));
75857
76439
  const picked = show.slideIds
75858
76440
  .map((sid) => byId.get(sid))
75859
76441
  .filter((s) => s !== undefined);
@@ -76325,7 +76907,7 @@ class SlideDiffThumbnailsComponent {
76325
76907
  </div>
76326
76908
  }
76327
76909
  </div>
76328
- `, isInline: true, styles: [".pptx-ng-diff-thumbs{display:flex;gap:.5rem}.pptx-ng-diff-thumb-col{flex:1}.pptx-ng-diff-thumb-label{margin-bottom:.25rem;font-size:.625rem;color:var(--pptx-muted-foreground, #9ca3af)}.pptx-ng-diff-thumb-clip{overflow:hidden;border:1px solid var(--pptx-border, #374151);border-radius:.25rem}.pptx-ng-diff-thumb-clip[data-status=added]{border-color:#15803d99}.pptx-ng-diff-thumb-clip[data-status=changed]{border-color:#b4530999}.pptx-ng-diff-thumb-clip ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}\n"], dependencies: [{ kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
76910
+ `, isInline: true, styles: [".pptx-ng-diff-thumbs{display:flex;gap:.5rem}.pptx-ng-diff-thumb-col{flex:1}.pptx-ng-diff-thumb-label{margin-bottom:.25rem;font-size:.625rem;color:var(--pptx-muted-foreground, #9ca3af)}.pptx-ng-diff-thumb-clip{overflow:hidden;border:1px solid var(--pptx-border, #374151);border-radius:.25rem}.pptx-ng-diff-thumb-clip[data-status=added]{border-color:#15803d99}.pptx-ng-diff-thumb-clip[data-status=changed]{border-color:#b4530999}.pptx-ng-diff-thumb-clip ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}\n"], dependencies: [{ kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
76329
76911
  }
76330
76912
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SlideDiffThumbnailsComponent, decorators: [{
76331
76913
  type: Component,
@@ -79596,6 +80178,15 @@ class ViewerInspectorPanelService {
79596
80178
  /** True once the user swiped the inspector away on mobile (until reopened). */
79597
80179
  mobileInspectorHidden = signal(false, /* @ts-ignore */
79598
80180
  ...(ngDevMode ? [{ debugName: "mobileInspectorHidden" }] : /* istanbul ignore next */ []));
80181
+ /**
80182
+ * True once the user has explicitly closed the format (element/slide)
80183
+ * panel via the ribbon toggle - independent of selection, mirroring
80184
+ * React's/Vue's own open/closed toggle state. Never affects the explicit
80185
+ * tool panels (comments/accessibility/signatures/selection), which show
80186
+ * regardless of this flag.
80187
+ */
80188
+ formatPanelClosed = signal(false, /* @ts-ignore */
80189
+ ...(ngDevMode ? [{ debugName: "formatPanelClosed" }] : /* istanbul ignore next */ []));
79599
80190
  /**
79600
80191
  * Swipe-to-dismiss drag for the inspector host. The host docks in-flow below
79601
80192
  * the canvas on mobile (same keyboard-reachability reason as the notes
@@ -79650,17 +80241,30 @@ class ViewerInspectorPanelService {
79650
80241
  return null;
79651
80242
  }, /* @ts-ignore */
79652
80243
  ...(ngDevMode ? [{ debugName: "inspectorContent" }] : /* istanbul ignore next */ []));
80244
+ /**
80245
+ * `inspectorContent`, but the format (element/slide) view collapses to
80246
+ * `null` once the user has explicitly closed it via the ribbon toggle.
80247
+ * Explicit tool panels (comments/accessibility/etc.) are untouched.
80248
+ */
80249
+ formatPanelContent = computed(() => {
80250
+ const content = this.inspectorContent();
80251
+ if ((content === 'element' || content === 'slide') && this.formatPanelClosed()) {
80252
+ return null;
80253
+ }
80254
+ return content;
80255
+ }, /* @ts-ignore */
80256
+ ...(ngDevMode ? [{ debugName: "formatPanelContent" }] : /* istanbul ignore next */ []));
79653
80257
  /**
79654
80258
  * Whether the right-docked inspector is showing the format panel (element or
79655
80259
  * slide properties). Drives the top-bar inspector-toggle active state.
79656
80260
  */
79657
80261
  inspectorPaneOpen = computed(() => {
79658
- const content = this.inspectorContent();
80262
+ const content = this.formatPanelContent();
79659
80263
  return content === 'element' || content === 'slide';
79660
80264
  }, /* @ts-ignore */
79661
80265
  ...(ngDevMode ? [{ debugName: "inspectorPaneOpen" }] : /* istanbul ignore next */ []));
79662
80266
  /** Inspector content, but null on mobile once the user has swiped it away. */
79663
- visibleInspectorKind = computed(() => this.mobile.isMobile() && this.mobileInspectorHidden() ? null : this.inspectorContent(), /* @ts-ignore */
80267
+ visibleInspectorKind = computed(() => this.mobile.isMobile() && this.mobileInspectorHidden() ? null : this.formatPanelContent(), /* @ts-ignore */
79664
80268
  ...(ngDevMode ? [{ debugName: "visibleInspectorKind" }] : /* istanbul ignore next */ []));
79665
80269
  /** Accessible-label translation key for the inspector host, by active content. */
79666
80270
  inspectorLabel = computed(() => {
@@ -79688,6 +80292,21 @@ class ViewerInspectorPanelService {
79688
80292
  // Tapping a panel button re-opens the host even after a swipe-dismiss.
79689
80293
  this.mobileInspectorHidden.set(false);
79690
80294
  }
80295
+ /**
80296
+ * Ribbon "toggle inspector" action: if a tool panel is active, return to
80297
+ * the format (element/slide) view; otherwise toggle the format view's
80298
+ * open/closed state, matching React's and Vue's independent open/close
80299
+ * toggle (closing/opening is not tied to selection changes).
80300
+ */
80301
+ toggleFormatPanel() {
80302
+ if (this.activePanel() !== null) {
80303
+ this.activePanel.set(null);
80304
+ this.formatPanelClosed.set(false);
80305
+ }
80306
+ else {
80307
+ this.formatPanelClosed.update((closed) => !closed);
80308
+ }
80309
+ }
79691
80310
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: ViewerInspectorPanelService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
79692
80311
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: ViewerInspectorPanelService });
79693
80312
  }
@@ -79906,6 +80525,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
79906
80525
  * prompt trigger) via {@link bind}; the template reads the signals / invokes the
79907
80526
  * handlers off the injected instance directly (same pattern as `session`/`xport`).
79908
80527
  *
80528
+ * This service owns no DOM node, so the real browser Fullscreen API request/exit
80529
+ * (mirroring React's `usePresentationMode` / Vue's `PresentationMode.vue`) is
80530
+ * driven by `PresentationOverlayComponent` itself off this `presenting` signal's
80531
+ * mount/unmount, not from here; see that component for the fullscreen wiring.
80532
+ *
79909
80533
  * Provide it once on the viewer component (`providers: [ViewerPresentationModeService]`).
79910
80534
  */
79911
80535
  class ViewerPresentationModeService {
@@ -79932,7 +80556,11 @@ class ViewerPresentationModeService {
79932
80556
  }
79933
80557
  return this.host;
79934
80558
  }
79935
- /** Open the fullscreen presentation overlay from the current slide. */
80559
+ /**
80560
+ * Open the presentation overlay from the current slide. The overlay itself
80561
+ * (`PresentationOverlayComponent`) requests real browser fullscreen once it
80562
+ * mounts as a result of `presenting` flipping true.
80563
+ */
79936
80564
  present() {
79937
80565
  const host = this.requireHost();
79938
80566
  if (host.slideCount() > 0) {
@@ -80556,9 +81184,14 @@ class PowerPointViewerComponent {
80556
81184
  // Hand the find/replace controller a slide-navigation callback so a match
80557
81185
  // can scroll its slide into view.
80558
81186
  this.findReplace.bind((index) => this.goTo(index));
80559
- // Hand the custom-shows controller the active-slide-index accessor so a
80560
- // normal (non-custom) show starts at the current slide.
80561
- this.customShowsCtl.bind(() => this.activeSlideIndex());
81187
+ // Hand the custom-shows controller the active-slide-index accessor (so a
81188
+ // normal show starts at the current slide) and the LIVE edited-slides
81189
+ // accessor (so present mode reflects in-session edits like inserted media,
81190
+ // mirroring React/Vue) rather than the pristine loaded deck.
81191
+ this.customShowsCtl.bind({
81192
+ activeSlideIndex: () => this.activeSlideIndex(),
81193
+ liveSlides: () => this.displaySlidesMut(),
81194
+ });
80562
81195
  // Hand the collaboration-session controller the host inputs it cannot own
80563
81196
  // (author name, share defaults, template-element supplier) and the
80564
81197
  // start/stop output emitters.
@@ -81172,7 +81805,7 @@ class PowerPointViewerComponent {
81172
81805
  (exportGif)="xport.exportGif()"
81173
81806
  (exportVideo)="xport.exportVideo()"
81174
81807
  (replace)="findReplace.openFindReplace()"
81175
- (toggleInspector)="inspectorPanel.activePanel.set(null)"
81808
+ (toggleInspector)="inspectorPanel.toggleFormatPanel()"
81176
81809
  (drawToolChange)="onDrawToolChange($event)"
81177
81810
  [showGrid]="showGrid()"
81178
81811
  [showRulers]="showRulers()"
@@ -81659,7 +82292,12 @@ class PowerPointViewerComponent {
81659
82292
  >
81660
82293
  <div class="pptx-ng-mnotes-handle"></div>
81661
82294
  </div>
81662
- <pptx-notes-panel [slide]="activeSlide()" (update)="canvasEditing.onNotesUpdate($event)" />
82295
+ <pptx-notes-panel
82296
+ [slide]="activeSlide()"
82297
+ [expanded]="true"
82298
+ (update)="canvasEditing.onNotesUpdate($event)"
82299
+ (notesToggle)="mobileSheetSvc.toggleNotes()"
82300
+ />
81663
82301
  </div>
81664
82302
  }
81665
82303
 
@@ -81681,7 +82319,7 @@ class PowerPointViewerComponent {
81681
82319
  />
81682
82320
  }
81683
82321
  </div>
81684
- `, 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", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresentationOverlayComponent, selector: "pptx-presentation-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "startIndex"], outputs: ["indexChange", "closed", "annotationsExit"] }, { kind: "component", type: PresenterViewComponent, selector: "pptx-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime", "isAudienceWindowOpen"], outputs: ["movePresentationSlide", "exit", "openAudienceWindow", "closeAudienceWindow"] }, { 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: 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: InspectorPanelComponent, selector: "pptx-inspector-panel", inputs: ["element", "slideIndex"] }, { 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"], outputs: ["toggleNotes", "normalView", "openSorter", "slideShow", "zoomIn", "zoomOut", "zoomReset"] }, { kind: "component", type: EditorContextMenuComponent, selector: "pptx-editor-context-menu", inputs: ["x", "y", "slideIndex"], outputs: ["closed"] }, { 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"], 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"], outputs: ["toggleMenu", "undo", "redo", "save", "present"] }, { 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", "showGrid", "showRulers", "showGuides", "snapToGrid", "eyedropperActive", "themeGalleryOpen", "sidebarCollapsed", "inspectorOpen", "commentsOpen", "commentCount", "findOpen", "collabConnected", "connectedCount"], outputs: ["prev", "next", "zoomIn", "zoomOut", "zoomReset", "find", "present", "presenter", "record", "share", "broadcast", "openFile", "save", "toggleSidebar", "signatures", "info", "print", "comments", "a11y", "link", "openSorter", "toggleNotes", "toggleFormatPainter", "exportPng", "exportPdf", "exportGif", "exportVideo", "replace", "toggleInspector", "drawToolChange", "toggleThemeGallery", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "openCustomShows", "toggleSnapToGrid", "toggleEyedropper", "openSmartArtDialog", "openEquationDialog", "openSetUpSlideShow", "openCompare", "openPassword", "openFontEmbedding", "openVersionHistory", "openShortcuts", "shapeInsert", "moveLayer", "moveLayerToEdge"] }, { kind: "component", type: TitleBarComponent, selector: "pptx-title-bar", inputs: ["canEdit", "fileName", "isDirty", "autosaveStatus", "autosaveEnabled", "canUndo", "canRedo", "undoLabel", "redoLabel", "findReplaceOpen"], outputs: ["toggleAutosave", "save", "undo", "redo", "toggleFindReplace", "commandSearch"] }, { kind: "component", type: ThemeGalleryComponent, selector: "pptx-theme-gallery", inputs: ["open", "activeName"], outputs: ["applyTheme", "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"], outputs: ["restoreContent"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
82322
+ `, 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", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresentationOverlayComponent, selector: "pptx-presentation-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "startIndex"], outputs: ["indexChange", "closed", "annotationsExit"] }, { kind: "component", type: PresenterViewComponent, selector: "pptx-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime", "isAudienceWindowOpen"], outputs: ["movePresentationSlide", "exit", "openAudienceWindow", "closeAudienceWindow"] }, { 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: 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: InspectorPanelComponent, selector: "pptx-inspector-panel", inputs: ["element", "slideIndex"] }, { 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"], outputs: ["toggleNotes", "normalView", "openSorter", "slideShow", "zoomIn", "zoomOut", "zoomReset"] }, { kind: "component", type: EditorContextMenuComponent, selector: "pptx-editor-context-menu", inputs: ["x", "y", "slideIndex"], outputs: ["closed"] }, { 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"], 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"], outputs: ["toggleMenu", "undo", "redo", "save", "present"] }, { 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", "showGrid", "showRulers", "showGuides", "snapToGrid", "eyedropperActive", "themeGalleryOpen", "sidebarCollapsed", "inspectorOpen", "commentsOpen", "commentCount", "findOpen", "collabConnected", "connectedCount"], outputs: ["prev", "next", "zoomIn", "zoomOut", "zoomReset", "find", "present", "presenter", "record", "share", "broadcast", "openFile", "save", "toggleSidebar", "signatures", "info", "print", "comments", "a11y", "link", "openSorter", "toggleNotes", "toggleFormatPainter", "exportPng", "exportPdf", "exportGif", "exportVideo", "replace", "toggleInspector", "drawToolChange", "toggleThemeGallery", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "openCustomShows", "toggleSnapToGrid", "toggleEyedropper", "openSmartArtDialog", "openEquationDialog", "openSetUpSlideShow", "openCompare", "openPassword", "openFontEmbedding", "openVersionHistory", "openShortcuts", "shapeInsert", "moveLayer", "moveLayerToEdge"] }, { kind: "component", type: TitleBarComponent, selector: "pptx-title-bar", inputs: ["canEdit", "fileName", "isDirty", "autosaveStatus", "autosaveEnabled", "canUndo", "canRedo", "undoLabel", "redoLabel", "findReplaceOpen"], outputs: ["toggleAutosave", "save", "undo", "redo", "toggleFindReplace", "commandSearch"] }, { kind: "component", type: ThemeGalleryComponent, selector: "pptx-theme-gallery", inputs: ["open", "activeName"], outputs: ["applyTheme", "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"], outputs: ["restoreContent"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
81685
82323
  }
81686
82324
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PowerPointViewerComponent, decorators: [{
81687
82325
  type: Component,
@@ -81843,7 +82481,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
81843
82481
  (exportGif)="xport.exportGif()"
81844
82482
  (exportVideo)="xport.exportVideo()"
81845
82483
  (replace)="findReplace.openFindReplace()"
81846
- (toggleInspector)="inspectorPanel.activePanel.set(null)"
82484
+ (toggleInspector)="inspectorPanel.toggleFormatPanel()"
81847
82485
  (drawToolChange)="onDrawToolChange($event)"
81848
82486
  [showGrid]="showGrid()"
81849
82487
  [showRulers]="showRulers()"
@@ -82330,7 +82968,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
82330
82968
  >
82331
82969
  <div class="pptx-ng-mnotes-handle"></div>
82332
82970
  </div>
82333
- <pptx-notes-panel [slide]="activeSlide()" (update)="canvasEditing.onNotesUpdate($event)" />
82971
+ <pptx-notes-panel
82972
+ [slide]="activeSlide()"
82973
+ [expanded]="true"
82974
+ (update)="canvasEditing.onNotesUpdate($event)"
82975
+ (notesToggle)="mobileSheetSvc.toggleNotes()"
82976
+ />
82334
82977
  </div>
82335
82978
  }
82336
82979
 
@@ -84925,5 +85568,5 @@ function keyToLabel(key) {
84925
85568
  * Generated bundle index. Do not edit.
84926
85569
  */
84927
85570
 
84928
- export { AUDIENCE_HASH, AUDIENCE_NONCE_KEY, AccessibilityPanelComponent, AccessibilityService, AdvancedChartEditorComponent, AnimationAuthorPanelComponent, AnimationPanelComponent, AnimationPlaybackService, BroadcastDialogComponent, CURSOR_PALETTE, ChartAxisOptionsComponent, ChartAxisStyleOptionsComponent, ChartComboTypeOptionsComponent, ChartDataEditorComponent, ChartDataLabelOptionsComponent, ChartDatapointOptionsComponent, ChartDisplayOptionsComponent, ChartErrorBarOptionsComponent, ChartMarkerOptionsComponent, ChartRendererComponent, ChartTrendlineOptionsComponent, CollaborationCursorsComponent, CollaborationService, CommentsPanelComponent, CommentsService, ComparePanelComponent, ConnectorRendererComponent, ConnectorTextOverlayComponent, DEFAULT_BROADCAST_SERVER_URL, DEFAULT_CANVAS_HEIGHT, DEFAULT_CANVAS_WIDTH, DEFAULT_FILL_COLOR, DEFAULT_PRINT_SETTINGS, DEFAULT_SLIDE_BACKGROUND, DEFAULT_STROKE_COLOR, DEFAULT_TEXT_COLOR$1 as DEFAULT_TEXT_COLOR, EMBEDDED_FONTS_STYLE_ID, TEMPLATES as EQUATION_TEMPLATES, EditorContextMenuComponent, EditorHistory, EditorStateService, EditorToolbarComponent, EffectsPanelComponent, ElementRendererComponent, EmbeddedFontsService, EncryptedFileDialogComponent, EquationEditorDialogComponent, EquationRendererComponent, EquationTemplateGalleryComponent, ExportService, FindBarComponent, FindReplaceBarComponent, FontEmbeddingListComponent, FontEmbeddingPanelComponent, GradientPickerComponent, HANDOUT_OPTIONS, HyperlinkDialogComponent, InkRendererComponent, InspectorPanelComponent, IsMobileService, KeepAnnotationsDialogComponent, LoadContentService, MobileBottomBarComponent, MobileMenuSheetComponent, MobilePresenterViewComponent, MobileSheetComponent, MobileSlidesSheetComponent, MobileToolbarComponent, ModalDialogComponent, Model3DRendererComponent, NotesPanelComponent, OleRendererComponent, PRESENTER_CHANNEL_NAME, PRESENTER_MSG_ORIGIN, PasswordProtectionDialogComponent, PasswordStrengthMeterComponent, PowerPointViewerComponent, PresentationAnnotationOverlayComponent, PresentationAnnotationsService, PresentationOverlayComponent, PresentationSubtitleBarComponent, PresentationTransitionOverlayComponent, PresenterViewComponent, PresenterWindowService, PrintDialogComponent, PrintService, PrintSettingsPanelComponent, PropertiesDialogComponent, RESIZE_HANDLES, SEVERITY_GROUPS, SEVERITY_LABELS, SLIDE_TRANSITION_KEYFRAMES, SVG_WARP_PRESETS, SetUpSlideShowDialogComponent, ShareDialogComponent, ShortcutPanelComponent, ShowOptionsFieldsetComponent, ShowSlidesFieldsetComponent, SignatureStrippedDialogComponent, SignaturesPanelComponent, SignaturesService, SlideCanvasComponent, SlideDiffChangesComponent, SlideDiffRowComponent, SlideDiffThumbnailsComponent, SlideSorterOverlayComponent, SlidesPanelComponent, SmartArtRendererComponent, StatusBarComponent, TYPE_LABELS, TableCellAdvancedFillComponent, TableCellFormattingComponent, TableDataEditorComponent, TablePropertiesComponent, TableRendererComponent, TableResizeOverlayComponent, TableSelectionService, TextAdvancedPanelComponent, VIEWER_THEME, VersionHistoryPanelComponent, ViewerCompareService, ViewerDialogsService, ViewerExtraDialogsComponent, WEBM_MIME_CANDIDATES, ZoomRendererComponent, addCommentToList, advanceStep, annotationMapToInkInserts, applyAcceptedDiff, applyFindReplacements, applyFormatToElement, applyMove, applyResize, assignUserColor, bringForward, bringToFront, buildBroadcastConfig, buildBroadcastViewerUrl, buildClearHyperlinkPatch, buildClickGroups, buildCollaborationConfig, buildCssGradientFromShapeStyle, buildDuotoneFilter, buildDuotoneFilterId, buildEmbeddedFontStyles, buildEquationElement, buildEquationSegment, buildFontFaceRule, buildHyperlinkPatch, buildPatternFillCss, buildPrintHtmlDocument as buildPrintDocument, buildPropertiesPatch, buildShareUrl, bulletIndentPx, canStartBroadcast, canStartShare, canUseClipboard, changeCountLabel, changeIcon, checkFontAvailable, clampCursorPosition, clampGifDimensions, clampNotesFontSize, clampStep, clearAudienceContent, cn, collectAccessibilityIssues, collectElementText, collectSlideText, collectUsedFontFamilies, computeHandoutLayout, computeIsMobile, computeIsTablet, computePageCount, computeSlideIndices, computeTimerProgress, convertOmmlToMathMl, copyFormatFromElement, countAccessibilityIssues, countAnnotationStrokes, defaultCssVars, defaultRadius, defaultThemeColors, deleteElementsByIds, deleteVersion as deleteRecoveryVersion, derivePresenceList, duplicateElementById, durationOf, encodeGif, estimatePageCount, findInSlides, fontMimeForFormat, formatAutoNumber, formatCursorLabel, formatElapsed, formatFileSize, formatPropertyDate, formatTime, fpsToFrameIntervalMs, generateBroadcastRoomId, generateCommentId, getContainerStyle, getDuotoneFilterDef, getImageSrc, getPasswordStrength, getPatternSvg, getVersions as getRecoveryVersions, getResolvedShapeClipPath, getResolvedShapeClipPathFor, getShapeFillStrokeStyle, getSlideBackgroundStyle, getSlideTransitionAnimations, getTextBlockStyle, getTextWarp, getWarpCategory, getWarpPath, groupIssuesBySeverity, hasCopyableFormat, hasExistingLink, headerLabel, isAudienceTab, isInjectableUrl, isPpactionUrl, isPresenterMessage, isSigned, isUrlSafe, isValidRoomId, issueTrackKey, issueTypeLabel, keyToLabel, latexToMathml, loadAudienceContent, moveElementBy, msToFrameDelayCs, normalizeFontFormat, normalizeSlidesPerPage, ommlToMathml, overallStatus, parseAudienceNonce, pendingElementStyles, pickSupportedMimeType, planGifFrames, planVideoSegments, presenceToCursors, provideViewerTheme, recordWebm, removeCommentFromList, renderToCanvas, replaceInSlides, replaceMatch, resizeElement, resolveFontVariant, resolveHyperlinkHref, resolveParagraphBullet, resolvePresenterNotes, resolveTransitionDuration, revealedElementStyles, routeOrthogonalConnector, sanitizeColor, sanitizeSlideIndex, sanitizeUserName, scanAvailableFonts, searchSlides, seedBroadcastFields, seedHyperlinkDraft, seedPropertiesDraft, seedShareFields, segmentFrameCount, sendBackward, sendToBack, setElementPosition, shouldUseSvgWarp, signatureCountLabel, signatureKey, signatureTimestamp, signerName, statusLabel as slideDiffStatusLabel, slideNumberOf, statusKind, statusLabel$1 as statusLabel, storeAudienceContent, themeStyle, themeToCssVars, toggleCommentResolvedInList, translationsEn, updateElementById, validatePassword, validatePrintSettings, validateRoomId, waypointsToPathD, worstStatus };
85571
+ export { AUDIENCE_HASH, AUDIENCE_NONCE_KEY, AccessibilityPanelComponent, AccessibilityService, AdvancedChartEditorComponent, AnimationAuthorPanelComponent, AnimationPanelComponent, AnimationPlaybackService, BroadcastDialogComponent, CURSOR_PALETTE, ChartAxisOptionsComponent, ChartAxisStyleOptionsComponent, ChartComboTypeOptionsComponent, ChartDataEditorComponent, ChartDataLabelOptionsComponent, ChartDatapointOptionsComponent, ChartDisplayOptionsComponent, ChartErrorBarOptionsComponent, ChartMarkerOptionsComponent, ChartRendererComponent, ChartTrendlineOptionsComponent, CollaborationCursorsComponent, CollaborationService, CommentsPanelComponent, CommentsService, ComparePanelComponent, ConnectorRendererComponent, ConnectorTextOverlayComponent, DEFAULT_BROADCAST_SERVER_URL, DEFAULT_CANVAS_HEIGHT, DEFAULT_CANVAS_WIDTH, DEFAULT_FILL_COLOR, DEFAULT_PRINT_SETTINGS, DEFAULT_SLIDE_BACKGROUND, DEFAULT_STROKE_COLOR, DEFAULT_TEXT_COLOR$1 as DEFAULT_TEXT_COLOR, EMBEDDED_FONTS_STYLE_ID, TEMPLATES as EQUATION_TEMPLATES, EditorContextMenuComponent, EditorHistory, EditorStateService, EditorToolbarComponent, EffectsPanelComponent, ElementRendererComponent, EmbeddedFontsService, EncryptedFileDialogComponent, EquationEditorDialogComponent, EquationRendererComponent, EquationTemplateGalleryComponent, ExportService, FindBarComponent, FindReplaceBarComponent, FontEmbeddingListComponent, FontEmbeddingPanelComponent, GradientPickerComponent, HANDOUT_OPTIONS, HyperlinkDialogComponent, InkRendererComponent, InspectorPanelComponent, IsMobileService, KeepAnnotationsDialogComponent, LoadContentService, MobileBottomBarComponent, MobileMenuSheetComponent, MobilePresenterViewComponent, MobileSheetComponent, MobileSlidesSheetComponent, MobileToolbarComponent, ModalDialogComponent, Model3DRendererComponent, NotesPanelComponent, OleRendererComponent, PRESENTER_CHANNEL_NAME, PRESENTER_MSG_ORIGIN, PasswordProtectionDialogComponent, PasswordStrengthMeterComponent, PowerPointViewerComponent, PresentationAnnotationOverlayComponent, PresentationAnnotationsService, PresentationOverlayComponent, PresentationSubtitleBarComponent, PresentationTransitionOverlayComponent, PresenterViewComponent, PresenterWindowService, PrintDialogComponent, PrintService, PrintSettingsPanelComponent, PropertiesDialogComponent, RESIZE_HANDLES, SEVERITY_GROUPS, SEVERITY_LABELS, SLIDE_TRANSITION_KEYFRAMES, SVG_WARP_PRESETS, SetUpSlideShowDialogComponent, ShareDialogComponent, ShortcutPanelComponent, ShowOptionsFieldsetComponent, ShowSlidesFieldsetComponent, SignatureStrippedDialogComponent, SignaturesPanelComponent, SignaturesService, SlideCanvasComponent, SlideDiffChangesComponent, SlideDiffRowComponent, SlideDiffThumbnailsComponent, SlideSorterOverlayComponent, SlidesPanelComponent, SmartArtRendererComponent, StatusBarComponent, TYPE_LABELS, TableCellAdvancedFillComponent, TableCellFormattingComponent, TableDataEditorComponent, TablePropertiesComponent, TableRendererComponent, TableResizeOverlayComponent, TableSelectionService, TextAdvancedPanelComponent, VIEWER_THEME, VersionHistoryPanelComponent, ViewerCompareService, ViewerDialogsService, ViewerExtraDialogsComponent, WEBM_MIME_CANDIDATES, ZoomRendererComponent, addCommentToList, advanceStep, annotationMapToInkInserts, applyAcceptedDiff, applyFindReplacements, applyFormatToElement, applyMove, applyResize, assignUserColor, bringForward, bringToFront, buildBroadcastConfig, buildBroadcastViewerUrl, buildClearHyperlinkPatch, buildClickGroups, buildCollaborationConfig, buildCssGradientFromShapeStyle, buildDuotoneFilter, buildDuotoneFilterId, buildEmbeddedFontStyles, buildEquationElement, buildEquationSegment, buildFontFaceRule, buildHyperlinkPatch, buildPatternFillCss, buildPrintHtmlDocument as buildPrintDocument, buildPropertiesPatch, buildShareUrl, bulletIndentPx, canStartBroadcast, canStartShare, canUseClipboard, changeCountLabel, changeIcon, checkFontAvailable, clampCursorPosition, clampGifDimensions, clampNotesFontSize, clampStep, clearAudienceContent, cn, collectAccessibilityIssues, collectElementText, collectSlideText, collectUsedFontFamilies, computeHandoutLayout, computeIsMobile, computeIsTablet, computePageCount, computeSlideIndices, computeTimerProgress, convertOmmlToMathMl, copyFormatFromElement, countAccessibilityIssues, countAnnotationStrokes, defaultCssVars, defaultRadius, defaultThemeColors, deleteElementsByIds, deleteVersion as deleteRecoveryVersion, derivePresenceList, duplicateElementById, durationOf, encodeGif, estimatePageCount, findInSlides, fontMimeForFormat, formatAutoNumber, formatCursorLabel, formatElapsed, formatFileSize, formatPropertyDate, formatTime, fpsToFrameIntervalMs, generateBroadcastRoomId, generateCommentId, getContainerStyle, getDuotoneFilterDef, getImageSrc, getPasswordStrength, getPatternSvg, getVersions as getRecoveryVersions, getResolvedShapeClipPath, getResolvedShapeClipPathFor, getShapeFillStrokeStyle, getSlideBackgroundStyle, getSlideTransitionAnimations, getTextBlockStyle, getTextWarp, getWarpCategory, getWarpPath, groupIssuesBySeverity, hasCopyableFormat, hasExistingLink, headerLabel, isAudienceTab, isInjectableUrl, isPpactionUrl, isPresenterMessage, isSigned, isUrlSafe, isValidRoomId, issueTrackKey, issueTypeLabel, keyToLabel, latexToMathml, loadAudienceContent, moveElementBy, msToFrameDelayCs, normalizeFontFormat, normalizeSlidesPerPage, ommlToMathml, overallStatus, parseAudienceNonce, pendingElementStyles, pickSupportedMimeType, planGifFrames, planVideoSegments, presenceToCursors, provideViewerTheme, recordWebm, removeCommentFromList, renderToCanvas, replaceInSlides, replaceMatch, resizeElement, resolveFontVariant, resolveHyperlinkHref, resolveParagraphBullet, resolvePresenterNotes, resolveTransitionDuration, revealedElementStyles, routeOrthogonalConnector, sanitizeColor, sanitizeSlideIndex, sanitizeUserName, scanAvailableFonts, searchSlides, seedBroadcastFields, seedHyperlinkDraft, seedPropertiesDraft, seedShareFields, segmentFrameCount, sendBackward, sendToBack, setElementPosition, shouldUseSvgWarp, signatureCountLabel, signatureKey, signatureTimestamp, signerName, statusLabel as slideDiffStatusLabel, slideNumberOf, statusKind, statusLabel$1 as statusLabel, storeAudienceContent, themeStyle, themeToCssVars, toggleCommentResolvedInList, translationsEn, updateElementById, validatePassword, validatePrintSettings, validateRoomId, vermilionDarkColors, vermilionDarkTheme, vermilionLightColors, vermilionLightTheme, vermilionRadius, waypointsToPathD, worstStatus };
84929
85572
  //# sourceMappingURL=pptx-angular-viewer.mjs.map