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.
- package/CHANGELOG.md +12 -0
- package/README.md +12 -0
- package/fesm2022/pptx-angular-viewer.mjs +718 -75
- package/fesm2022/pptx-angular-viewer.mjs.map +1 -1
- package/package.json +2 -2
- package/types/pptx-angular-viewer.d.ts +172 -11
|
@@ -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({
|
|
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
|
-
|
|
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({
|
|
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({
|
|
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(
|
|
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.
|
|
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(
|
|
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(
|
|
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.
|
|
37856
|
-
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 =
|
|
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 { ...
|
|
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 = { ...
|
|
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
|
-
<
|
|
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
|
-
</
|
|
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
|
-
<
|
|
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
|
-
</
|
|
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]="
|
|
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]="
|
|
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
|
-
/**
|
|
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 }] }],
|
|
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
|
-
/**
|
|
75815
|
-
|
|
75816
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
/**
|
|
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
|
|
80561
|
-
|
|
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.
|
|
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
|
|
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.
|
|
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
|
|
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
|