pptx-angular-viewer 3.16.6 → 3.17.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 +33 -0
- package/README.md +17 -1
- package/fesm2022/{pptx-angular-viewer-chat-history-idb-qknGvJeP.mjs → pptx-angular-viewer-chat-history-idb-DjOCNjw-.mjs} +2 -2
- package/fesm2022/{pptx-angular-viewer-chat-history-idb-qknGvJeP.mjs.map → pptx-angular-viewer-chat-history-idb-DjOCNjw-.mjs.map} +1 -1
- package/fesm2022/{pptx-angular-viewer-pptx-angular-viewer-BcbAkuRd.mjs → pptx-angular-viewer-pptx-angular-viewer-CY2-kaW3.mjs} +1329 -791
- package/fesm2022/{pptx-angular-viewer-pptx-angular-viewer-BcbAkuRd.mjs.map → pptx-angular-viewer-pptx-angular-viewer-CY2-kaW3.mjs.map} +1 -1
- package/fesm2022/pptx-angular-viewer.mjs +1 -1
- package/package.json +2 -2
- package/types/pptx-angular-viewer.d.ts +51 -8
- package/types/pptx-angular-viewer.d.ts.map +1 -1
|
@@ -2,7 +2,7 @@ import { NgStyle, NgTemplateOutlet, NgClass } from '@angular/common';
|
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { InjectionToken, input, output, inject, computed, ChangeDetectionStrategy, Component, signal, Injectable, DestroyRef, viewChild, effect, Injector, untracked, ElementRef, HostListener, afterNextRender, Renderer2, ViewEncapsulation, forwardRef, Directive, linkedSignal } from '@angular/core';
|
|
4
4
|
import { TranslateService, TranslatePipe, translate } from '@ngx-translate/core';
|
|
5
|
-
import { THEME_PRESETS, guideEmuToPx, evaluateCustomGeometryPathData, getShapeClipPath, getAdjustmentAwareClipPath, getShapeClipPathFromPreset, getCloudPathForRendering, MIN_ELEMENT_SIZE as MIN_ELEMENT_SIZE$1, evaluateCustomGeometryPaths, customGeometryPathsToSvgSubpaths, evaluatePresetShape, hasShapeProperties, ooxmlGradientAngleToCssDegrees, getShapeType, isImageLikeElement, getElementTextContent, getRoundRectRadiusPx as getRoundRectRadiusPx$1, applyDrawingColorTransforms as applyDrawingColorTransforms$1, hslToRgb as hslToRgb$1, PRESET_COLOR_MAP, getSubstituteFontFamily, parsePanoseString, hasTextProperties, evaluateGuides, deobfuscateFont, detectFontFormat, stripXmlOrderSuffix, orderedXmlKey, parseDataUrlToBytes, sampleFirstPixelColorFromBytes, flattenChartUserShapes, chartDataChangeType, isParetoChartData, resolveDisplayedChartTypeName, chartDataAddSeries, chartDataRemoveSeries, chartDataAddCategory, chartDataRemoveCategory, chartDataUpdatePoint, resolveThemeColorRef, rebuildTableStructureInRawXml, updateCellTextInRawXml, deepCloneData, cloneTemplateElementsBySlideId, cloneSlide, EMU_PER_PX as EMU_PER_PX$2, DEFAULT_POWERPOINT_TABLE_STYLE_ID, DEFAULT_SCHEME_COLOR_MAP as DEFAULT_SCHEME_COLOR_MAP$1, formatAutoNumberMarker, getLinkedTextBoxSegments, deriveSlideTitle, svgPathToPolygons, THEME_COLOR_SCHEME_KEYS, createBuiltinVariables, resolveCoordinate, getPresetConnectionSites, resolveCustomGeometryToken, resolveCustomGeometryGuideContext, lookupPresetShape, normalizeStShapeType, PptxHandler, styleStroke, strokeFor, fitFontSize, nodeTextStyle, truncate, nodeOpacity, nodeStroke, nodeFill, styleShadow, buildTree, treeWidth, treeDepth, gearPoints, flattenNodes, interpretSmartArtLayout, addSmartArtNode, removeSmartArtNode, demoteSmartArtNode, promoteSmartArtNode, reorderSmartArtNode, createEditorId, makeStoreAwareId, reassignDescendantIds, checkMissingAltText, checkMissingSlideTitle, checkLowContrast, checkComplexTables, checkBlankSlide, checkDuplicateTitles, createChartElement, THEME_COLOR_PALETTE_COLUMNS, hexToRgbChannels as hexToRgbChannels$2, rgbToHsl as rgbToHsl$1, renameSlideMaster, deleteSlideMaster, duplicateSlideMaster, insertSlideMaster, renameLayout, deleteLayout, duplicateLayout, insertLayout, detectFileFormat, cloneElement, duplicateElement, resolveModifyVerifierAlgorithmName, verifyModifyPassword, TABLE_STYLE_PART_SEQUENCE, serializePptxToJson, PPTX_JSON_MIME_TYPE, PptxMarkdownConverter, ThemePresets, formatCommentTimestamp as formatCommentTimestamp$1, EncryptedFileError, decodeXmlEntities, parseSignatureXml, groupElements, ungroupElements, updateSmartArtNodeText, setSmartArtNodeStyle, isInkElement, isZoomElement, SvgExporter, applyThemeToData, reResolveElementColors, pptxActionToElementAction, elementActionToPptxAction, setChartTitle, setChartLegend, setChartDataLabels, setChartAxis, setChartSeriesTrendline, setChartSeriesErrorBars, setChartDataPointLabel, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointMarker, setChartDataPointExplosion, getOleSheetGrid, getOleDocumentParagraphs, getOleNestedDeckDetail, applyOleSheetCellEdit, applyOleDocumentParagraphEdit, applyOleNestedDeckElementTextEdit, replaceOleFile, getOleObjectTypeLabel, addSmartArtNodeAsChild, switchSmartArtLayout, SWITCHABLE_LAYOUT_TYPES, normalizeTableStyleGuid, createTableStyleEntry, addTableStyleToMap, deleteTableStyleFromMap, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, applyThemeOverrideToSlide, TRANSITION_VALID_DIRECTIONS } from 'pptx-viewer-core';
|
|
5
|
+
import { THEME_PRESETS, guideEmuToPx, evaluateCustomGeometryPathData, getShapeClipPath, getAdjustmentAwareClipPath, getShapeClipPathFromPreset, getCloudPathForRendering, MIN_ELEMENT_SIZE as MIN_ELEMENT_SIZE$1, evaluateCustomGeometryPaths, customGeometryPathsToSvgSubpaths, evaluatePresetShape, hasShapeProperties, ooxmlGradientAngleToCssDegrees, getShapeType, isImageLikeElement, getElementTextContent, getRoundRectRadiusPx as getRoundRectRadiusPx$1, applyDrawingColorTransforms as applyDrawingColorTransforms$1, hslToRgb as hslToRgb$1, PRESET_COLOR_MAP, getSubstituteFontFamily, parsePanoseString, hasTextProperties, evaluateGuides, deobfuscateFont, detectFontFormat, stripXmlOrderSuffix, orderedXmlKey, parseDataUrlToBytes, sampleFirstPixelColorFromBytes, flattenChartUserShapes, chartDataChangeType, isParetoChartData, resolveDisplayedChartTypeName, chartDataAddSeries, chartDataRemoveSeries, chartDataAddCategory, chartDataRemoveCategory, chartDataUpdatePoint, resolveThemeColorRef, rebuildTableStructureInRawXml, updateCellTextInRawXml, deepCloneData, cloneTemplateElementsBySlideId, cloneSlide, EMU_PER_PX as EMU_PER_PX$2, DEFAULT_POWERPOINT_TABLE_STYLE_ID, DEFAULT_SCHEME_COLOR_MAP as DEFAULT_SCHEME_COLOR_MAP$1, formatAutoNumberMarker, createAutoNumberSequence, nextAutoNumber, breakAutoNumberRun, getLinkedTextBoxSegments, deriveSlideTitle, svgPathToPolygons, THEME_COLOR_SCHEME_KEYS, createBuiltinVariables, resolveCoordinate, getPresetConnectionSites, resolveCustomGeometryToken, resolveCustomGeometryGuideContext, lookupPresetShape, normalizeStShapeType, PptxHandler, styleStroke, strokeFor, fitFontSize, nodeTextStyle, truncate, nodeOpacity, nodeStroke, nodeFill, styleShadow, buildTree, treeWidth, treeDepth, gearPoints, flattenNodes, interpretSmartArtLayout, addSmartArtNode, removeSmartArtNode, demoteSmartArtNode, promoteSmartArtNode, reorderSmartArtNode, createEditorId, makeStoreAwareId, reassignDescendantIds, checkMissingAltText, checkMissingSlideTitle, checkLowContrast, checkComplexTables, checkBlankSlide, checkDuplicateTitles, createChartElement, THEME_COLOR_PALETTE_COLUMNS, hexToRgbChannels as hexToRgbChannels$2, rgbToHsl as rgbToHsl$1, renameSlideMaster, deleteSlideMaster, duplicateSlideMaster, insertSlideMaster, renameLayout, deleteLayout, duplicateLayout, insertLayout, detectFileFormat, cloneElement, duplicateElement, resolveModifyVerifierAlgorithmName, verifyModifyPassword, TABLE_STYLE_PART_SEQUENCE, serializePptxToJson, PPTX_JSON_MIME_TYPE, PptxMarkdownConverter, ThemePresets, formatCommentTimestamp as formatCommentTimestamp$1, EncryptedFileError, decodeXmlEntities, parseSignatureXml, groupElements, ungroupElements, updateSmartArtNodeText, setSmartArtNodeStyle, isInkElement, isZoomElement, SvgExporter, applyThemeToData, reResolveElementColors, pptxActionToElementAction, elementActionToPptxAction, setChartTitle, setChartLegend, setChartDataLabels, setChartAxis, setChartSeriesTrendline, setChartSeriesErrorBars, setChartDataPointLabel, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointMarker, setChartDataPointExplosion, getOleSheetGrid, getOleDocumentParagraphs, getOleNestedDeckDetail, applyOleSheetCellEdit, applyOleDocumentParagraphEdit, applyOleNestedDeckElementTextEdit, replaceOleFile, getOleObjectTypeLabel, addSmartArtNodeAsChild, switchSmartArtLayout, SWITCHABLE_LAYOUT_TYPES, normalizeTableStyleGuid, createTableStyleEntry, addTableStyleToMap, deleteTableStyleFromMap, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, applyThemeOverrideToSlide, TRANSITION_VALID_DIRECTIONS } from 'pptx-viewer-core';
|
|
6
6
|
import { parse } from 'opentype.js';
|
|
7
7
|
import DOMPurify from 'dompurify';
|
|
8
8
|
import { z } from 'zod';
|
|
@@ -52371,218 +52371,676 @@ function resolveParagraphIndent(paraIndent, paragraphLevel) {
|
|
|
52371
52371
|
return { marginLeftPx: marginLeft, textIndentPx: textIndent };
|
|
52372
52372
|
}
|
|
52373
52373
|
|
|
52374
|
-
/**
|
|
52375
|
-
* Bullet / numbered-list toggling for the ribbon's paragraph buttons.
|
|
52376
|
-
*
|
|
52377
|
-
* The renderer (`resolveParagraphBullet`) and the save writer
|
|
52378
|
-
* (`applyBulletProperties`) both read a paragraph's list state from the
|
|
52379
|
-
* `bulletInfo` of its FIRST segment; `TextStyle.listType` is consulted for
|
|
52380
|
-
* nothing but the `'none'` suppression. Every binding's Bullets / Numbering
|
|
52381
|
-
* button used to write `listType: 'bullet' | 'numbered'` onto the element's
|
|
52382
|
-
* `textStyle`, a field nothing downstream reads, so the buttons were dead.
|
|
52383
|
-
*
|
|
52384
|
-
* These helpers author the real thing: a `BulletInfo` on each paragraph's
|
|
52385
|
-
* first segment (`a:buChar` / `a:buAutoNum` / `a:buNone` on save), with the
|
|
52386
|
-
* inert `listType` cleared so a stale `'none'` cannot suppress the new marker.
|
|
52387
|
-
*
|
|
52388
|
-
* On load core prefixes a display-only marker segment (text "• " / "1.") to a
|
|
52389
|
-
* listed paragraph; the renderer drops it when its text matches the marker it
|
|
52390
|
-
* would draw, and the save writer drops it because the paragraph properties
|
|
52391
|
-
* already express it. Switching a bullet to a number (or off) would leave the
|
|
52392
|
-
* old glyph behind as literal text, so the previous marker is removed and a
|
|
52393
|
-
* fresh one authored in the same shape core uses.
|
|
52394
|
-
*/
|
|
52395
|
-
/** The default character bullet PowerPoint inserts (`a:buChar char="•"`). */
|
|
52396
52374
|
const DEFAULT_BULLET_CHAR = '•';
|
|
52397
|
-
/** The default numbering scheme PowerPoint inserts (`a:buAutoNum type="arabicPeriod"`). */
|
|
52398
52375
|
const DEFAULT_AUTONUM_TYPE = 'arabicPeriod';
|
|
52399
|
-
/**
|
|
52400
|
-
* The `BulletInfo` that authors `kind`.
|
|
52401
|
-
*
|
|
52402
|
-
* @param ordinal - Zero-based position of the paragraph within its numbered
|
|
52403
|
-
* run, published as `paragraphIndex` so the renderer counts "1. 2. 3." (see
|
|
52404
|
-
* `BulletInfo.paragraphIndex`). Ignored for the other kinds.
|
|
52405
|
-
*/
|
|
52406
52376
|
function bulletInfoForKind(kind, ordinal = 0) {
|
|
52407
|
-
|
|
52408
|
-
|
|
52409
|
-
|
|
52410
|
-
|
|
52411
|
-
|
|
52412
|
-
case 'none':
|
|
52413
|
-
return { none: true };
|
|
52377
|
+
if (kind === 'none') {
|
|
52378
|
+
return { none: true };
|
|
52379
|
+
}
|
|
52380
|
+
if (kind === 'bullet') {
|
|
52381
|
+
return { char: DEFAULT_BULLET_CHAR };
|
|
52414
52382
|
}
|
|
52383
|
+
return { autoNumType: DEFAULT_AUTONUM_TYPE, autoNumStartAt: 1, paragraphIndex: ordinal };
|
|
52415
52384
|
}
|
|
52416
|
-
/**
|
|
52417
|
-
* Whether a segment is the display-only marker core inserts on load (mirrors
|
|
52418
|
-
* the save writer's `isRenderedBulletMarker`): it carries `bulletInfo` and its
|
|
52419
|
-
* text is exactly the glyph the renderer would draw for that info.
|
|
52420
|
-
*/
|
|
52385
|
+
/** Matches core's synthetic prefix, including picture and suppressed markers. */
|
|
52421
52386
|
function isBulletMarkerSegment(segment) {
|
|
52422
|
-
const
|
|
52423
|
-
if (!
|
|
52387
|
+
const info = segment.bulletInfo;
|
|
52388
|
+
if (!info || info.none || segment.fieldType || segment.isLineBreak) {
|
|
52424
52389
|
return false;
|
|
52425
52390
|
}
|
|
52426
|
-
|
|
52427
|
-
|
|
52391
|
+
if (!info.char &&
|
|
52392
|
+
!info.autoNumType &&
|
|
52393
|
+
!info.imageRelId &&
|
|
52394
|
+
!info.imageDataUrl &&
|
|
52395
|
+
!info.imageBlipFillXml) {
|
|
52428
52396
|
return false;
|
|
52429
52397
|
}
|
|
52430
|
-
|
|
52398
|
+
if (info.autoNumType) {
|
|
52399
|
+
// Without this runtime field, a literal "1." is authored content (PR 204).
|
|
52400
|
+
if (info.paragraphIndex === undefined) {
|
|
52401
|
+
return false;
|
|
52402
|
+
}
|
|
52403
|
+
const marker = markerText(info);
|
|
52404
|
+
return segment.text === marker || segment.text === `${marker} `;
|
|
52405
|
+
}
|
|
52406
|
+
return segment.text === markerText(info);
|
|
52431
52407
|
}
|
|
52432
|
-
/**
|
|
52433
|
-
* The current list state of one paragraph (its segments, separators excluded),
|
|
52434
|
-
* derived from the resolved bullet of its first segment so an inherited
|
|
52435
|
-
* (master / layout) bullet that core resolved on load counts as `'bullet'`.
|
|
52436
|
-
*/
|
|
52437
52408
|
function paragraphBulletKind(paragraph) {
|
|
52438
52409
|
const resolved = resolveParagraphBullet(paragraph[0]);
|
|
52439
|
-
|
|
52440
|
-
return 'none';
|
|
52441
|
-
}
|
|
52442
|
-
return resolved.isNumbered ? 'numbered' : 'bullet';
|
|
52410
|
+
return resolved ? (resolved.isNumbered ? 'numbered' : 'bullet') : 'none';
|
|
52443
52411
|
}
|
|
52444
|
-
/** Copy of `style` without the inert `listType` flag. */
|
|
52445
52412
|
function withoutListType(style) {
|
|
52446
|
-
const next = { ...
|
|
52413
|
+
const next = { ...style };
|
|
52447
52414
|
delete next.listType;
|
|
52448
52415
|
return next;
|
|
52449
52416
|
}
|
|
52450
|
-
function
|
|
52451
|
-
|
|
52452
|
-
|
|
52453
|
-
meta.paragraphLevel = segment.paragraphLevel;
|
|
52454
|
-
}
|
|
52455
|
-
if (segment?.paragraphProperties !== undefined) {
|
|
52456
|
-
meta.paragraphProperties = segment.paragraphProperties;
|
|
52417
|
+
function markerText(info) {
|
|
52418
|
+
if (info.imageRelId || info.imageDataUrl || info.imageBlipFillXml) {
|
|
52419
|
+
return '📎 ';
|
|
52457
52420
|
}
|
|
52458
|
-
if (
|
|
52459
|
-
|
|
52421
|
+
if (info.autoNumType) {
|
|
52422
|
+
return formatAutoNumberMarker(info.autoNumType, Math.max(1, (info.autoNumStartAt ?? 1) + (info.paragraphIndex ?? 0)));
|
|
52460
52423
|
}
|
|
52461
|
-
return
|
|
52424
|
+
return `${info.char ?? DEFAULT_BULLET_CHAR} `;
|
|
52462
52425
|
}
|
|
52463
|
-
|
|
52464
|
-
|
|
52465
|
-
|
|
52466
|
-
|
|
52426
|
+
function infoForParagraph(previous, kind, ordinal) {
|
|
52427
|
+
if (kind === 'none') {
|
|
52428
|
+
return { ...previous, none: true };
|
|
52429
|
+
}
|
|
52430
|
+
const sameKind = previous &&
|
|
52431
|
+
(kind === 'numbered'
|
|
52432
|
+
? Boolean(previous.autoNumType)
|
|
52433
|
+
: Boolean(previous.char ||
|
|
52434
|
+
previous.imageRelId ||
|
|
52435
|
+
previous.imageDataUrl ||
|
|
52436
|
+
previous.imageBlipFillXml) && !previous.autoNumType);
|
|
52437
|
+
const info = sameKind ? { ...previous } : bulletInfoForKind(kind, ordinal);
|
|
52438
|
+
delete info.none;
|
|
52439
|
+
if (kind === 'numbered' && ordinal !== undefined) {
|
|
52440
|
+
info.paragraphIndex = ordinal;
|
|
52467
52441
|
}
|
|
52468
|
-
|
|
52469
|
-
return formatAutoNumberMarker(info.autoNumType ?? DEFAULT_AUTONUM_TYPE, ordinal);
|
|
52442
|
+
return info;
|
|
52470
52443
|
}
|
|
52471
|
-
/**
|
|
52472
|
-
|
|
52473
|
-
|
|
52474
|
-
|
|
52475
|
-
|
|
52476
|
-
* the save writer treat an authored list exactly like a parsed one: for
|
|
52477
|
-
* `'bullet'` / `'numbered'` a display-only marker segment carrying the new
|
|
52478
|
-
* `bulletInfo` (and the paragraph-level fields) is placed first, followed by
|
|
52479
|
-
* the content runs with any previous marker removed; for `'none'` the marker
|
|
52480
|
-
* is dropped and the first content segment carries `{ none: true }`. The
|
|
52481
|
-
* inert `style.listType` is cleared on the touched segments. An empty
|
|
52482
|
-
* paragraph is returned unchanged since there is no run to carry the state.
|
|
52483
|
-
*
|
|
52484
|
-
* @param ordinal - Zero-based position within a numbered run; see
|
|
52485
|
-
* {@link bulletInfoForKind}.
|
|
52486
|
-
*/
|
|
52487
|
-
function toggleParagraphBullet(paragraph, kind, ordinal = 0) {
|
|
52488
|
-
const content = paragraph.filter((segment) => !isBulletMarkerSegment(segment));
|
|
52489
|
-
const first = content[0];
|
|
52490
|
-
if (!first) {
|
|
52491
|
-
return [...paragraph];
|
|
52492
|
-
}
|
|
52493
|
-
const meta = paragraphMeta(paragraph[0]);
|
|
52494
|
-
const info = bulletInfoForKind(kind, ordinal);
|
|
52495
|
-
const rest = content.slice(1);
|
|
52496
|
-
if (kind === 'none') {
|
|
52497
|
-
return [{ ...first, ...meta, style: withoutListType(first.style), bulletInfo: info }, ...rest];
|
|
52444
|
+
/** Explicit set, despite the historical name. Only the leading marker is removed. */
|
|
52445
|
+
function toggleParagraphBullet(paragraph, kind, ordinal) {
|
|
52446
|
+
const source = paragraph[0];
|
|
52447
|
+
if (!source) {
|
|
52448
|
+
return [];
|
|
52498
52449
|
}
|
|
52499
|
-
|
|
52500
|
-
|
|
52501
|
-
|
|
52502
|
-
|
|
52503
|
-
|
|
52450
|
+
if (paragraph.length === 1 &&
|
|
52451
|
+
source.paragraphInsertionStyle &&
|
|
52452
|
+
(source.text === '' || isBulletMarkerSegment(source))) {
|
|
52453
|
+
const info = infoForParagraph(source.bulletInfo, kind, ordinal);
|
|
52454
|
+
const picture = info.imageRelId || info.imageDataUrl || info.imageBlipFillXml;
|
|
52455
|
+
return [
|
|
52456
|
+
{
|
|
52457
|
+
...source,
|
|
52458
|
+
text: kind === 'none' || picture ? '' : markerText(info),
|
|
52459
|
+
style: withoutListType(source.style),
|
|
52460
|
+
bulletInfo: info,
|
|
52461
|
+
},
|
|
52462
|
+
];
|
|
52463
|
+
}
|
|
52464
|
+
const content = isBulletMarkerSegment(source) ? paragraph.slice(1) : [...paragraph];
|
|
52465
|
+
const first = content[0] ?? { text: '', style: source.style };
|
|
52466
|
+
const meta = {
|
|
52467
|
+
...(source.paragraphLevel !== undefined ? { paragraphLevel: source.paragraphLevel } : {}),
|
|
52468
|
+
...(source.paragraphProperties ? { paragraphProperties: source.paragraphProperties } : {}),
|
|
52469
|
+
...(source.endParaRunProperties ? { endParaRunProperties: source.endParaRunProperties } : {}),
|
|
52470
|
+
...(source.paragraphInsertionStyle
|
|
52471
|
+
? { paragraphInsertionStyle: source.paragraphInsertionStyle }
|
|
52472
|
+
: {}),
|
|
52504
52473
|
};
|
|
52505
|
-
const
|
|
52474
|
+
const info = infoForParagraph(source.bulletInfo, kind, ordinal);
|
|
52475
|
+
const body = { ...first, ...meta, style: withoutListType(first.style) };
|
|
52476
|
+
const rest = content.slice(1).map((segment) => {
|
|
52477
|
+
if (!segment.bulletInfo) {
|
|
52478
|
+
return segment;
|
|
52479
|
+
}
|
|
52480
|
+
const run = { ...segment };
|
|
52481
|
+
delete run.bulletInfo;
|
|
52482
|
+
return run;
|
|
52483
|
+
});
|
|
52484
|
+
// Picture markers render separately; never insert their textual fallback as body.
|
|
52485
|
+
if (kind === 'none' || info.imageRelId || info.imageDataUrl || info.imageBlipFillXml) {
|
|
52486
|
+
return [{ ...body, bulletInfo: info }, ...rest];
|
|
52487
|
+
}
|
|
52506
52488
|
delete body.bulletInfo;
|
|
52507
|
-
|
|
52489
|
+
delete body.paragraphInsertionStyle;
|
|
52490
|
+
const markerStyle = isBulletMarkerSegment(source) && paragraphBulletKind([source]) === kind
|
|
52491
|
+
? source.style
|
|
52492
|
+
: first.style;
|
|
52493
|
+
return [
|
|
52494
|
+
{ text: markerText(info), style: withoutListType(markerStyle), ...meta, bulletInfo: info },
|
|
52495
|
+
body,
|
|
52496
|
+
...rest,
|
|
52497
|
+
];
|
|
52508
52498
|
}
|
|
52509
|
-
function
|
|
52510
|
-
|
|
52499
|
+
function elementSegments(element) {
|
|
52500
|
+
if (!hasTextProperties(element)) {
|
|
52501
|
+
return [];
|
|
52502
|
+
}
|
|
52503
|
+
if (element.textSegments?.length) {
|
|
52504
|
+
return element.textSegments;
|
|
52505
|
+
}
|
|
52506
|
+
return (element.text ?? '')
|
|
52507
|
+
.split('\n')
|
|
52508
|
+
.flatMap((text, index) => [
|
|
52509
|
+
...(index ? [{ text: '\n', style: { ...element.textStyle }, isParagraphBreak: true }] : []),
|
|
52510
|
+
{ text, style: { ...element.textStyle } },
|
|
52511
|
+
]);
|
|
52511
52512
|
}
|
|
52512
|
-
/** Split a segment list into paragraphs, keeping each paragraph's terminator. */
|
|
52513
52513
|
function splitParagraphs(segments) {
|
|
52514
52514
|
const paragraphs = [
|
|
52515
52515
|
{ segments: [] },
|
|
52516
52516
|
];
|
|
52517
52517
|
for (const segment of segments) {
|
|
52518
|
-
if (
|
|
52518
|
+
if (isParagraphSeparatorSegment(segment)) {
|
|
52519
52519
|
paragraphs[paragraphs.length - 1].terminator = segment;
|
|
52520
52520
|
paragraphs.push({ segments: [] });
|
|
52521
|
-
continue;
|
|
52522
52521
|
}
|
|
52523
|
-
|
|
52522
|
+
else {
|
|
52523
|
+
paragraphs[paragraphs.length - 1].segments.push(segment);
|
|
52524
|
+
}
|
|
52524
52525
|
}
|
|
52525
52526
|
return paragraphs;
|
|
52526
52527
|
}
|
|
52527
|
-
/**
|
|
52528
|
-
function
|
|
52528
|
+
/** Existing element-wide toggle convention: use its first nonempty paragraph. */
|
|
52529
|
+
function elementBulletKind(element) {
|
|
52530
|
+
for (const paragraph of splitParagraphs(elementSegments(element))) {
|
|
52531
|
+
if (paragraph.segments.length) {
|
|
52532
|
+
return paragraphBulletKind(paragraph.segments);
|
|
52533
|
+
}
|
|
52534
|
+
}
|
|
52535
|
+
return 'none';
|
|
52536
|
+
}
|
|
52537
|
+
/**
|
|
52538
|
+
* Explicitly set the touched paragraphs. Existing same-kind definitions survive;
|
|
52539
|
+
* defaults are only for new lists. Retained buNone metadata supports live off/on,
|
|
52540
|
+
* not restoration of a deleted definition after a save/reload.
|
|
52541
|
+
*/
|
|
52542
|
+
function setElementBullets(element, kind, range) {
|
|
52529
52543
|
if (!hasTextProperties(element)) {
|
|
52530
|
-
return
|
|
52544
|
+
return {};
|
|
52531
52545
|
}
|
|
52532
|
-
if (
|
|
52533
|
-
|
|
52546
|
+
if (range &&
|
|
52547
|
+
(!Number.isInteger(range.startParagraph) ||
|
|
52548
|
+
!Number.isInteger(range.endParagraph) ||
|
|
52549
|
+
range.startParagraph < 0 ||
|
|
52550
|
+
range.endParagraph < range.startParagraph)) {
|
|
52551
|
+
return {};
|
|
52534
52552
|
}
|
|
52535
|
-
const
|
|
52536
|
-
|
|
52537
|
-
|
|
52538
|
-
|
|
52539
|
-
|
|
52553
|
+
const paragraphs = splitParagraphs(elementSegments(element));
|
|
52554
|
+
if (range && range.startParagraph >= paragraphs.length) {
|
|
52555
|
+
return {};
|
|
52556
|
+
}
|
|
52557
|
+
const next = [];
|
|
52558
|
+
const sequence = createAutoNumberSequence();
|
|
52559
|
+
for (const [index, paragraph] of paragraphs.entries()) {
|
|
52560
|
+
const selected = !range || (index >= range.startParagraph && index <= range.endParagraph);
|
|
52561
|
+
let segments = paragraph.segments;
|
|
52562
|
+
if (selected) {
|
|
52563
|
+
const empty = {
|
|
52564
|
+
...paragraph.terminator,
|
|
52565
|
+
text: '',
|
|
52566
|
+
style: { ...paragraph.terminator?.style },
|
|
52567
|
+
};
|
|
52568
|
+
delete empty.isParagraphBreak;
|
|
52569
|
+
delete empty.isLineBreak;
|
|
52570
|
+
segments = toggleParagraphBullet(segments.length ? segments : [empty], kind);
|
|
52571
|
+
}
|
|
52572
|
+
const first = segments[0] ?? paragraph.terminator;
|
|
52573
|
+
const info = first?.bulletInfo;
|
|
52574
|
+
const level = first?.paragraphLevel ?? 0;
|
|
52575
|
+
if (info?.autoNumType && paragraphBulletKind(segments) === 'numbered') {
|
|
52576
|
+
const startAt = info.autoNumStartAt ?? 1;
|
|
52577
|
+
const ordinal = nextAutoNumber(sequence, level, info.autoNumType, startAt) - startAt;
|
|
52578
|
+
// List membership changes also renumber following items. Only this
|
|
52579
|
+
// derived ordinal changes outside the selected paragraphs.
|
|
52580
|
+
if (info.paragraphIndex !== ordinal) {
|
|
52581
|
+
segments = toggleParagraphBullet(segments, 'numbered', ordinal);
|
|
52582
|
+
}
|
|
52583
|
+
}
|
|
52584
|
+
else {
|
|
52585
|
+
breakAutoNumberRun(sequence, level);
|
|
52586
|
+
}
|
|
52587
|
+
next.push(...segments);
|
|
52588
|
+
if (paragraph.terminator) {
|
|
52589
|
+
next.push(paragraph.terminator);
|
|
52540
52590
|
}
|
|
52541
|
-
segments.push({ text: line, style: { ...style } });
|
|
52542
52591
|
}
|
|
52543
|
-
return
|
|
52592
|
+
return {
|
|
52593
|
+
textSegments: next,
|
|
52594
|
+
textStyle: withoutListType(element.textStyle),
|
|
52595
|
+
};
|
|
52596
|
+
}
|
|
52597
|
+
/** Button intent, unlike the explicit style setter above. */
|
|
52598
|
+
function toggleElementBullets(element, kind) {
|
|
52599
|
+
return setElementBullets(element, elementBulletKind(element) === kind ? 'none' : kind);
|
|
52544
52600
|
}
|
|
52601
|
+
|
|
52602
|
+
/** Keep a runless paragraph's future body formatting in the same style edit. */
|
|
52603
|
+
function updateTextSegmentStyle(segment, updates, options = {}) {
|
|
52604
|
+
return {
|
|
52605
|
+
...segment,
|
|
52606
|
+
...(options.updateBodyStyle === false ? {} : { style: { ...segment.style, ...updates } }),
|
|
52607
|
+
...(segment.paragraphInsertionStyle
|
|
52608
|
+
? { paragraphInsertionStyle: { ...segment.paragraphInsertionStyle, ...updates } }
|
|
52609
|
+
: {}),
|
|
52610
|
+
};
|
|
52611
|
+
}
|
|
52612
|
+
|
|
52545
52613
|
/**
|
|
52546
|
-
*
|
|
52547
|
-
*
|
|
52614
|
+
* Read the current browser selection and, if it falls within an
|
|
52615
|
+
* `[data-inline-editor]` element, return the segment-level range.
|
|
52616
|
+
*
|
|
52617
|
+
* Returns `null` when there is no editable text selected, the selection is
|
|
52618
|
+
* collapsed (just a cursor), or the selection is outside the inline editor.
|
|
52548
52619
|
*/
|
|
52549
|
-
function
|
|
52550
|
-
|
|
52551
|
-
|
|
52552
|
-
|
|
52620
|
+
function getInlineEditorSelection(segments) {
|
|
52621
|
+
if (!segments?.length) {
|
|
52622
|
+
return null;
|
|
52623
|
+
}
|
|
52624
|
+
const selection = window.getSelection();
|
|
52625
|
+
if (!selection || selection.rangeCount === 0 || selection.isCollapsed) {
|
|
52626
|
+
return null;
|
|
52627
|
+
}
|
|
52628
|
+
// A Range is always in document order, including for a backwards selection.
|
|
52629
|
+
const range = selection.getRangeAt(0);
|
|
52630
|
+
const editor = findEditorContainer(range.startContainer);
|
|
52631
|
+
if (!editor || !editor.contains(range.endContainer) || range.toString().length === 0) {
|
|
52632
|
+
return null;
|
|
52633
|
+
}
|
|
52634
|
+
const start = getSegmentPosition(editor, range.startContainer, range.startOffset, segments);
|
|
52635
|
+
const end = getSegmentPosition(editor, range.endContainer, range.endOffset, segments);
|
|
52636
|
+
if (!start || !end) {
|
|
52637
|
+
return null;
|
|
52638
|
+
}
|
|
52639
|
+
const renderedSpans = Array.from(editor.querySelectorAll('[data-seg-idx]'));
|
|
52640
|
+
const startSpanIndex = renderedSpans.indexOf(start.span);
|
|
52641
|
+
const endSpanIndex = renderedSpans.indexOf(end.span);
|
|
52642
|
+
if (startSpanIndex < 0 || endSpanIndex < startSpanIndex) {
|
|
52643
|
+
return null;
|
|
52644
|
+
}
|
|
52645
|
+
const selectedSpans = renderedSpans.slice(startSpanIndex, endSpanIndex + 1);
|
|
52646
|
+
const first = selectedSpans.find((span) => isEditableSpan(span, segments) && (span !== start.span || start.offset < start.textLength));
|
|
52647
|
+
const last = [...selectedSpans]
|
|
52648
|
+
.reverse()
|
|
52649
|
+
.find((span) => isEditableSpan(span, segments) && (span !== end.span || end.offset > 0));
|
|
52650
|
+
if (!first || !last) {
|
|
52651
|
+
return null;
|
|
52652
|
+
}
|
|
52653
|
+
return {
|
|
52654
|
+
startSegIdx: getSegmentIndex(first),
|
|
52655
|
+
startOffset: first === start.span ? start.offset : 0,
|
|
52656
|
+
endSegIdx: getSegmentIndex(last),
|
|
52657
|
+
endOffset: last === end.span ? end.offset : (last.textContent?.length ?? 0),
|
|
52658
|
+
};
|
|
52659
|
+
}
|
|
52660
|
+
function isEditableSpan(span, segments) {
|
|
52661
|
+
const segment = segments[getSegmentIndex(span)];
|
|
52662
|
+
return Boolean(segment &&
|
|
52663
|
+
!segment.isParagraphBreak &&
|
|
52664
|
+
segment.text !== '\n' &&
|
|
52665
|
+
!isBulletMarkerSegment(segment) &&
|
|
52666
|
+
(span.textContent?.length ?? 0) > 0);
|
|
52667
|
+
}
|
|
52668
|
+
function getSegmentIndex(span) {
|
|
52669
|
+
return Number(span.getAttribute('data-seg-idx'));
|
|
52670
|
+
}
|
|
52671
|
+
function findEditorContainer(node) {
|
|
52672
|
+
const element = node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement;
|
|
52673
|
+
return element?.closest('[data-inline-editor]') ?? null;
|
|
52674
|
+
}
|
|
52675
|
+
function getSegmentPosition(editor, node, offset, segments) {
|
|
52676
|
+
const element = node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement;
|
|
52677
|
+
const span = element?.closest('[data-seg-idx]');
|
|
52678
|
+
if (!span || !editor.contains(span)) {
|
|
52679
|
+
return null;
|
|
52680
|
+
}
|
|
52681
|
+
const segIdx = getSegmentIndex(span);
|
|
52682
|
+
if (!Number.isInteger(segIdx) || segIdx < 0 || segIdx >= segments.length) {
|
|
52683
|
+
return null;
|
|
52684
|
+
}
|
|
52685
|
+
return {
|
|
52686
|
+
segIdx,
|
|
52687
|
+
offset: getTextOffsetWithin(span, node, offset),
|
|
52688
|
+
span,
|
|
52689
|
+
textLength: span.textContent?.length ?? 0,
|
|
52690
|
+
};
|
|
52691
|
+
}
|
|
52692
|
+
function getTextOffsetWithin(container, targetNode, targetOffset) {
|
|
52693
|
+
if (targetNode === container || targetNode.nodeType === Node.ELEMENT_NODE) {
|
|
52694
|
+
const parent = targetNode === container ? container : targetNode;
|
|
52695
|
+
let count = 0;
|
|
52696
|
+
for (let index = 0; index < targetOffset && index < parent.childNodes.length; index++) {
|
|
52697
|
+
count += parent.childNodes[index].textContent?.length ?? 0;
|
|
52553
52698
|
}
|
|
52699
|
+
return count;
|
|
52700
|
+
}
|
|
52701
|
+
const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT);
|
|
52702
|
+
let charCount = 0;
|
|
52703
|
+
let node;
|
|
52704
|
+
while ((node = walker.nextNode())) {
|
|
52705
|
+
if (node === targetNode) {
|
|
52706
|
+
return charCount + targetOffset;
|
|
52707
|
+
}
|
|
52708
|
+
charCount += node.length;
|
|
52709
|
+
}
|
|
52710
|
+
return charCount;
|
|
52711
|
+
}
|
|
52712
|
+
|
|
52713
|
+
let pendingRestore = null;
|
|
52714
|
+
function setPendingSelectionRestore(sel) {
|
|
52715
|
+
pendingRestore = sel;
|
|
52716
|
+
}
|
|
52717
|
+
/** Read-once: clears the stored value after returning it. */
|
|
52718
|
+
function getPendingSelectionRestore() {
|
|
52719
|
+
const sel = pendingRestore;
|
|
52720
|
+
pendingRestore = null;
|
|
52721
|
+
return sel;
|
|
52722
|
+
}
|
|
52723
|
+
/**
|
|
52724
|
+
* Apply `updates` only to the characters within the selection range. Segments
|
|
52725
|
+
* at the boundaries are split; segments outside the range are copied unchanged.
|
|
52726
|
+
* Paragraph-break segments (`\n`) are always passed through unchanged.
|
|
52727
|
+
*
|
|
52728
|
+
* Returns the new segments array AND the selection coordinates mapped to the
|
|
52729
|
+
* new segment indices (for cursor restoration).
|
|
52730
|
+
*/
|
|
52731
|
+
function applyStyleToSelectedSegments(segments, selection, updates) {
|
|
52732
|
+
const { startSegIdx, startOffset, endSegIdx, endOffset } = selection;
|
|
52733
|
+
const result = [];
|
|
52734
|
+
// Track new indices for the start/end of the selected text in the new array.
|
|
52735
|
+
let newStartSegIdx = -1;
|
|
52736
|
+
let newStartOffset = 0;
|
|
52737
|
+
let newEndSegIdx = -1;
|
|
52738
|
+
let newEndOffset = 0;
|
|
52739
|
+
for (let i = 0; i < segments.length; i++) {
|
|
52740
|
+
const seg = i >= startSegIdx && i <= endSegIdx
|
|
52741
|
+
? updateTextSegmentStyle(segments[i], updates, { updateBodyStyle: false })
|
|
52742
|
+
: segments[i];
|
|
52743
|
+
// Paragraph-break segments always pass through.
|
|
52744
|
+
if (seg.isParagraphBreak || seg.text === '\n') {
|
|
52745
|
+
result.push({ ...seg, style: { ...seg.style } });
|
|
52746
|
+
continue;
|
|
52747
|
+
}
|
|
52748
|
+
// Before selection range.
|
|
52749
|
+
if (i < startSegIdx) {
|
|
52750
|
+
result.push({ ...seg, style: { ...seg.style } });
|
|
52751
|
+
continue;
|
|
52752
|
+
}
|
|
52753
|
+
// After selection range.
|
|
52754
|
+
if (i > endSegIdx) {
|
|
52755
|
+
result.push({ ...seg, style: { ...seg.style } });
|
|
52756
|
+
continue;
|
|
52757
|
+
}
|
|
52758
|
+
// Single-segment selection (start and end in the same segment).
|
|
52759
|
+
if (seg.paragraphInsertionStyle && (seg.text === '' || isBulletMarkerSegment(seg))) {
|
|
52760
|
+
newStartSegIdx = newStartSegIdx < 0 ? result.length : newStartSegIdx;
|
|
52761
|
+
newEndSegIdx = result.length;
|
|
52762
|
+
result.push(seg);
|
|
52763
|
+
continue;
|
|
52764
|
+
}
|
|
52765
|
+
if (i === startSegIdx && i === endSegIdx) {
|
|
52766
|
+
splitSingle(seg, startOffset, endOffset, updates, result);
|
|
52767
|
+
// Track the new selection: the selected part is at `result.length - 1`
|
|
52768
|
+
// (or `result.length - 2` if there's an after part).
|
|
52769
|
+
const partsAdded = (startOffset > 0 ? 1 : 0) + 1 + (endOffset < seg.text.length ? 1 : 0);
|
|
52770
|
+
const selectedPartIdx = result.length - partsAdded + (startOffset > 0 ? 1 : 0);
|
|
52771
|
+
newStartSegIdx = selectedPartIdx;
|
|
52772
|
+
newStartOffset = 0;
|
|
52773
|
+
newEndSegIdx = selectedPartIdx;
|
|
52774
|
+
newEndOffset = endOffset - startOffset;
|
|
52775
|
+
continue;
|
|
52776
|
+
}
|
|
52777
|
+
// Start segment of multi-segment selection.
|
|
52778
|
+
if (i === startSegIdx) {
|
|
52779
|
+
if (startOffset === 0) {
|
|
52780
|
+
newStartSegIdx = result.length;
|
|
52781
|
+
newStartOffset = 0;
|
|
52782
|
+
result.push({ ...seg, style: { ...seg.style, ...updates } });
|
|
52783
|
+
}
|
|
52784
|
+
else {
|
|
52785
|
+
// Before-selection part.
|
|
52786
|
+
const beforeSeg = {
|
|
52787
|
+
text: seg.text.slice(0, startOffset),
|
|
52788
|
+
style: { ...seg.style },
|
|
52789
|
+
};
|
|
52790
|
+
if (seg.bulletInfo) {
|
|
52791
|
+
beforeSeg.bulletInfo = seg.bulletInfo;
|
|
52792
|
+
}
|
|
52793
|
+
result.push(beforeSeg);
|
|
52794
|
+
// Selected part.
|
|
52795
|
+
newStartSegIdx = result.length;
|
|
52796
|
+
newStartOffset = 0;
|
|
52797
|
+
result.push({
|
|
52798
|
+
text: seg.text.slice(startOffset),
|
|
52799
|
+
style: { ...seg.style, ...updates },
|
|
52800
|
+
});
|
|
52801
|
+
}
|
|
52802
|
+
continue;
|
|
52803
|
+
}
|
|
52804
|
+
// End segment of multi-segment selection.
|
|
52805
|
+
if (i === endSegIdx) {
|
|
52806
|
+
if (endOffset >= seg.text.length) {
|
|
52807
|
+
result.push({ ...seg, style: { ...seg.style, ...updates } });
|
|
52808
|
+
newEndSegIdx = result.length - 1;
|
|
52809
|
+
newEndOffset = seg.text.length;
|
|
52810
|
+
}
|
|
52811
|
+
else {
|
|
52812
|
+
// Selected part.
|
|
52813
|
+
result.push({
|
|
52814
|
+
text: seg.text.slice(0, endOffset),
|
|
52815
|
+
style: { ...seg.style, ...updates },
|
|
52816
|
+
});
|
|
52817
|
+
newEndSegIdx = result.length - 1;
|
|
52818
|
+
newEndOffset = endOffset;
|
|
52819
|
+
// After-selection part.
|
|
52820
|
+
result.push({
|
|
52821
|
+
text: seg.text.slice(endOffset),
|
|
52822
|
+
style: { ...seg.style },
|
|
52823
|
+
});
|
|
52824
|
+
}
|
|
52825
|
+
continue;
|
|
52826
|
+
}
|
|
52827
|
+
// Middle segment: entirely within selection.
|
|
52828
|
+
result.push({ ...seg, style: { ...seg.style, ...updates } });
|
|
52829
|
+
}
|
|
52830
|
+
return {
|
|
52831
|
+
newSegments: result,
|
|
52832
|
+
newSelection: {
|
|
52833
|
+
startSegIdx: newStartSegIdx,
|
|
52834
|
+
startOffset: newStartOffset,
|
|
52835
|
+
endSegIdx: newEndSegIdx,
|
|
52836
|
+
endOffset: newEndOffset,
|
|
52837
|
+
},
|
|
52838
|
+
};
|
|
52839
|
+
}
|
|
52840
|
+
function splitSingle(seg, startOffset, endOffset, updates, result) {
|
|
52841
|
+
// Entire segment selected.
|
|
52842
|
+
if (startOffset === 0 && endOffset >= seg.text.length) {
|
|
52843
|
+
result.push({ ...seg, style: { ...seg.style, ...updates } });
|
|
52844
|
+
return;
|
|
52845
|
+
}
|
|
52846
|
+
// Before-selection part.
|
|
52847
|
+
if (startOffset > 0) {
|
|
52848
|
+
const beforeSeg = {
|
|
52849
|
+
text: seg.text.slice(0, startOffset),
|
|
52850
|
+
style: { ...seg.style },
|
|
52851
|
+
};
|
|
52852
|
+
if (seg.bulletInfo) {
|
|
52853
|
+
beforeSeg.bulletInfo = seg.bulletInfo;
|
|
52854
|
+
}
|
|
52855
|
+
result.push(beforeSeg);
|
|
52856
|
+
}
|
|
52857
|
+
// Selected part.
|
|
52858
|
+
result.push({
|
|
52859
|
+
text: seg.text.slice(startOffset, endOffset),
|
|
52860
|
+
style: { ...seg.style, ...updates },
|
|
52861
|
+
});
|
|
52862
|
+
// After-selection part.
|
|
52863
|
+
if (endOffset < seg.text.length) {
|
|
52864
|
+
result.push({
|
|
52865
|
+
text: seg.text.slice(endOffset),
|
|
52866
|
+
style: { ...seg.style },
|
|
52867
|
+
});
|
|
52554
52868
|
}
|
|
52555
|
-
return 'none';
|
|
52556
52869
|
}
|
|
52557
52870
|
/**
|
|
52558
|
-
* Set
|
|
52559
|
-
*
|
|
52560
|
-
*
|
|
52561
|
-
* counted consecutively so the renderer shows "1. 2. 3.".
|
|
52871
|
+
* Set the DOM selection inside the inline editor using segment-level
|
|
52872
|
+
* coordinates. Finds `[data-seg-idx]` spans and navigates to the correct
|
|
52873
|
+
* text-node offsets.
|
|
52562
52874
|
*/
|
|
52563
|
-
function
|
|
52564
|
-
const
|
|
52565
|
-
|
|
52566
|
-
|
|
52567
|
-
|
|
52568
|
-
|
|
52569
|
-
|
|
52570
|
-
|
|
52875
|
+
function restoreSegmentSelection(editor, startSegIdx, startOffset, endSegIdx, endOffset) {
|
|
52876
|
+
const sel = window.getSelection();
|
|
52877
|
+
if (!sel) {
|
|
52878
|
+
return;
|
|
52879
|
+
}
|
|
52880
|
+
const startPos = findTextPositionInSegment(editor, startSegIdx, startOffset);
|
|
52881
|
+
const endPos = findTextPositionInSegment(editor, endSegIdx, endOffset);
|
|
52882
|
+
if (!startPos || !endPos) {
|
|
52883
|
+
return;
|
|
52884
|
+
}
|
|
52885
|
+
const range = document.createRange();
|
|
52886
|
+
range.setStart(startPos.node, startPos.offset);
|
|
52887
|
+
range.setEnd(endPos.node, endPos.offset);
|
|
52888
|
+
sel.removeAllRanges();
|
|
52889
|
+
sel.addRange(range);
|
|
52890
|
+
}
|
|
52891
|
+
function findTextPositionInSegment(editor, segIdx, charOffset) {
|
|
52892
|
+
const segSpan = editor.querySelector(`[data-seg-idx="${segIdx}"]`);
|
|
52893
|
+
if (!segSpan) {
|
|
52894
|
+
return null;
|
|
52895
|
+
}
|
|
52896
|
+
const walker = document.createTreeWalker(segSpan, NodeFilter.SHOW_TEXT);
|
|
52897
|
+
let charCount = 0;
|
|
52898
|
+
let node;
|
|
52899
|
+
while ((node = walker.nextNode())) {
|
|
52900
|
+
const textLen = node.length;
|
|
52901
|
+
if (charCount + textLen >= charOffset) {
|
|
52902
|
+
return { node, offset: charOffset - charCount };
|
|
52571
52903
|
}
|
|
52572
|
-
|
|
52573
|
-
|
|
52904
|
+
charCount += textLen;
|
|
52905
|
+
}
|
|
52906
|
+
// If exact position not found, place at end of last text node.
|
|
52907
|
+
const lastTextNode = segSpan.querySelector('*') ? null : segSpan.firstChild;
|
|
52908
|
+
if (lastTextNode && lastTextNode.nodeType === Node.TEXT_NODE) {
|
|
52909
|
+
return { node: lastTextNode, offset: lastTextNode.length };
|
|
52910
|
+
}
|
|
52911
|
+
return null;
|
|
52912
|
+
}
|
|
52913
|
+
|
|
52914
|
+
/** Body offsets ignore only the leading display marker of each paragraph. */
|
|
52915
|
+
function positions(segments) {
|
|
52916
|
+
let offset = 0;
|
|
52917
|
+
let paragraph = 0;
|
|
52918
|
+
let first = true;
|
|
52919
|
+
return segments.map((segment) => {
|
|
52920
|
+
const marker = first && isBulletMarkerSegment(segment);
|
|
52921
|
+
const start = offset;
|
|
52922
|
+
if (!marker) {
|
|
52923
|
+
offset += segment.text.length;
|
|
52924
|
+
}
|
|
52925
|
+
const entry = {
|
|
52926
|
+
start,
|
|
52927
|
+
end: offset,
|
|
52928
|
+
paragraph,
|
|
52929
|
+
editable: !marker && !isParagraphSeparatorSegment(segment),
|
|
52930
|
+
};
|
|
52931
|
+
first = isParagraphSeparatorSegment(segment);
|
|
52932
|
+
if (first) {
|
|
52933
|
+
paragraph += 1;
|
|
52934
|
+
}
|
|
52935
|
+
return entry;
|
|
52936
|
+
});
|
|
52937
|
+
}
|
|
52938
|
+
function restorePoint(segments, offset, end) {
|
|
52939
|
+
const entries = positions(segments);
|
|
52940
|
+
let fallback = { index: 0, offset: 0 };
|
|
52941
|
+
for (const [index, entry] of entries.entries()) {
|
|
52942
|
+
if (!entry.editable) {
|
|
52943
|
+
continue;
|
|
52944
|
+
}
|
|
52945
|
+
fallback = { index, offset: segments[index].text.length };
|
|
52946
|
+
if (end ? offset <= entry.end : offset < entry.end) {
|
|
52947
|
+
return { index, offset: Math.max(0, offset - entry.start) };
|
|
52948
|
+
}
|
|
52949
|
+
}
|
|
52950
|
+
return fallback;
|
|
52951
|
+
}
|
|
52952
|
+
/** Keep paragraph metadata on the first run when character styling splits it. */
|
|
52953
|
+
function restoreParagraphMetadata$1(original, updated) {
|
|
52954
|
+
const firstRuns = original.filter((_, index) => index === 0 || isParagraphSeparatorSegment(original[index - 1]));
|
|
52955
|
+
let paragraph = 0;
|
|
52956
|
+
return updated.map((segment, index) => {
|
|
52957
|
+
const first = index === 0 || isParagraphSeparatorSegment(updated[index - 1]);
|
|
52958
|
+
if (!first) {
|
|
52959
|
+
return segment;
|
|
52960
|
+
}
|
|
52961
|
+
const source = firstRuns[paragraph++];
|
|
52962
|
+
if (!source) {
|
|
52963
|
+
return segment;
|
|
52574
52964
|
}
|
|
52965
|
+
return {
|
|
52966
|
+
...segment,
|
|
52967
|
+
bulletInfo: source.bulletInfo,
|
|
52968
|
+
paragraphLevel: source.paragraphLevel,
|
|
52969
|
+
paragraphProperties: source.paragraphProperties,
|
|
52970
|
+
endParaRunProperties: source.endParaRunProperties,
|
|
52971
|
+
};
|
|
52972
|
+
});
|
|
52973
|
+
}
|
|
52974
|
+
/** Current kind at the first selected paragraph; otherwise the element default. */
|
|
52975
|
+
function selectedParagraphBulletKind(element, selection) {
|
|
52976
|
+
if (!selection || !hasTextProperties(element) || !element.textSegments) {
|
|
52977
|
+
return elementBulletKind(element);
|
|
52978
|
+
}
|
|
52979
|
+
let first = selection.startSegIdx;
|
|
52980
|
+
while (first > 0 && !isParagraphSeparatorSegment(element.textSegments[first - 1])) {
|
|
52981
|
+
first -= 1;
|
|
52575
52982
|
}
|
|
52576
|
-
return
|
|
52983
|
+
return paragraphBulletKind(element.textSegments.slice(first));
|
|
52577
52984
|
}
|
|
52578
52985
|
/**
|
|
52579
|
-
*
|
|
52580
|
-
*
|
|
52581
|
-
*
|
|
52582
|
-
* binding's update-element operation.
|
|
52986
|
+
* Apply a list request to touched paragraphs, while accompanying character
|
|
52987
|
+
* styles retain their existing selection scope. A null selection means the
|
|
52988
|
+
* whole element, matching the existing editor contract.
|
|
52583
52989
|
*/
|
|
52584
|
-
function
|
|
52585
|
-
|
|
52990
|
+
function applyListStyleUpdate(element, updates, selection) {
|
|
52991
|
+
if (!hasTextProperties(element) || !updates.listType) {
|
|
52992
|
+
return { patch: {}, selection };
|
|
52993
|
+
}
|
|
52994
|
+
const { listType, ...characterStyle } = updates;
|
|
52995
|
+
let segments = element.textSegments;
|
|
52996
|
+
let workingSelection = selection;
|
|
52997
|
+
if (segments && Object.keys(characterStyle).length > 0) {
|
|
52998
|
+
if (selection) {
|
|
52999
|
+
const styled = applyStyleToSelectedSegments(segments, selection, characterStyle);
|
|
53000
|
+
segments = restoreParagraphMetadata$1(segments, styled.newSegments);
|
|
53001
|
+
workingSelection = styled.newSelection;
|
|
53002
|
+
}
|
|
53003
|
+
else {
|
|
53004
|
+
segments = segments.map((segment) => updateTextSegmentStyle(segment, characterStyle));
|
|
53005
|
+
}
|
|
53006
|
+
}
|
|
53007
|
+
const working = {
|
|
53008
|
+
...element,
|
|
53009
|
+
textSegments: segments,
|
|
53010
|
+
textStyle: selection ? element.textStyle : { ...element.textStyle, ...characterStyle },
|
|
53011
|
+
};
|
|
53012
|
+
if (!workingSelection || !segments) {
|
|
53013
|
+
return { patch: setElementBullets(working, listType), selection: null };
|
|
53014
|
+
}
|
|
53015
|
+
const entries = positions(segments);
|
|
53016
|
+
const startEntry = entries[workingSelection.startSegIdx];
|
|
53017
|
+
const endEntry = entries[workingSelection.endSegIdx];
|
|
53018
|
+
if (!startEntry || !endEntry) {
|
|
53019
|
+
return { patch: {}, selection: null };
|
|
53020
|
+
}
|
|
53021
|
+
const startOffset = startEntry.start + workingSelection.startOffset;
|
|
53022
|
+
const endOffset = endEntry.start + workingSelection.endOffset;
|
|
53023
|
+
const lastSelected = [...entries].reverse().find((entry) => entry.start < endOffset);
|
|
53024
|
+
const patch = setElementBullets(working, listType, {
|
|
53025
|
+
startParagraph: startEntry.paragraph,
|
|
53026
|
+
endParagraph: lastSelected?.paragraph ?? endEntry.paragraph,
|
|
53027
|
+
});
|
|
53028
|
+
const next = { ...working, ...patch };
|
|
53029
|
+
const nextSegments = hasTextProperties(next) ? next.textSegments : undefined;
|
|
53030
|
+
if (!nextSegments) {
|
|
53031
|
+
return { patch, selection: null };
|
|
53032
|
+
}
|
|
53033
|
+
const start = restorePoint(nextSegments, startOffset, false);
|
|
53034
|
+
const end = restorePoint(nextSegments, endOffset, true);
|
|
53035
|
+
return {
|
|
53036
|
+
patch,
|
|
53037
|
+
selection: {
|
|
53038
|
+
startSegIdx: start.index,
|
|
53039
|
+
startOffset: start.offset,
|
|
53040
|
+
endSegIdx: end.index,
|
|
53041
|
+
endOffset: end.offset,
|
|
53042
|
+
},
|
|
53043
|
+
};
|
|
52586
53044
|
}
|
|
52587
53045
|
|
|
52588
53046
|
/**
|
|
@@ -61984,299 +62442,6 @@ function buildLeaderString(leader, widthPx, fontSizePx = 16) {
|
|
|
61984
62442
|
return char.repeat(count);
|
|
61985
62443
|
}
|
|
61986
62444
|
|
|
61987
|
-
/**
|
|
61988
|
-
* Read the current browser selection and, if it falls within an
|
|
61989
|
-
* `[data-inline-editor]` element, return the segment-level range.
|
|
61990
|
-
*
|
|
61991
|
-
* Returns `null` when there is no editable text selected, the selection is
|
|
61992
|
-
* collapsed (just a cursor), or the selection is outside the inline editor.
|
|
61993
|
-
*/
|
|
61994
|
-
function getInlineEditorSelection(segments) {
|
|
61995
|
-
if (!segments?.length) {
|
|
61996
|
-
return null;
|
|
61997
|
-
}
|
|
61998
|
-
const selection = window.getSelection();
|
|
61999
|
-
if (!selection || selection.rangeCount === 0 || selection.isCollapsed) {
|
|
62000
|
-
return null;
|
|
62001
|
-
}
|
|
62002
|
-
// A Range is always in document order, including for a backwards selection.
|
|
62003
|
-
const range = selection.getRangeAt(0);
|
|
62004
|
-
const editor = findEditorContainer(range.startContainer);
|
|
62005
|
-
if (!editor || !editor.contains(range.endContainer) || range.toString().length === 0) {
|
|
62006
|
-
return null;
|
|
62007
|
-
}
|
|
62008
|
-
const start = getSegmentPosition(editor, range.startContainer, range.startOffset, segments);
|
|
62009
|
-
const end = getSegmentPosition(editor, range.endContainer, range.endOffset, segments);
|
|
62010
|
-
if (!start || !end) {
|
|
62011
|
-
return null;
|
|
62012
|
-
}
|
|
62013
|
-
const renderedSpans = Array.from(editor.querySelectorAll('[data-seg-idx]'));
|
|
62014
|
-
const startSpanIndex = renderedSpans.indexOf(start.span);
|
|
62015
|
-
const endSpanIndex = renderedSpans.indexOf(end.span);
|
|
62016
|
-
if (startSpanIndex < 0 || endSpanIndex < startSpanIndex) {
|
|
62017
|
-
return null;
|
|
62018
|
-
}
|
|
62019
|
-
const selectedSpans = renderedSpans.slice(startSpanIndex, endSpanIndex + 1);
|
|
62020
|
-
const first = selectedSpans.find((span) => isEditableSpan(span, segments) && (span !== start.span || start.offset < start.textLength));
|
|
62021
|
-
const last = [...selectedSpans]
|
|
62022
|
-
.reverse()
|
|
62023
|
-
.find((span) => isEditableSpan(span, segments) && (span !== end.span || end.offset > 0));
|
|
62024
|
-
if (!first || !last) {
|
|
62025
|
-
return null;
|
|
62026
|
-
}
|
|
62027
|
-
return {
|
|
62028
|
-
startSegIdx: getSegmentIndex(first),
|
|
62029
|
-
startOffset: first === start.span ? start.offset : 0,
|
|
62030
|
-
endSegIdx: getSegmentIndex(last),
|
|
62031
|
-
endOffset: last === end.span ? end.offset : (last.textContent?.length ?? 0),
|
|
62032
|
-
};
|
|
62033
|
-
}
|
|
62034
|
-
function isEditableSpan(span, segments) {
|
|
62035
|
-
const segment = segments[getSegmentIndex(span)];
|
|
62036
|
-
return Boolean(segment &&
|
|
62037
|
-
!segment.isParagraphBreak &&
|
|
62038
|
-
segment.text !== '\n' &&
|
|
62039
|
-
!isBulletMarkerSegment(segment) &&
|
|
62040
|
-
(span.textContent?.length ?? 0) > 0);
|
|
62041
|
-
}
|
|
62042
|
-
function getSegmentIndex(span) {
|
|
62043
|
-
return Number(span.getAttribute('data-seg-idx'));
|
|
62044
|
-
}
|
|
62045
|
-
function findEditorContainer(node) {
|
|
62046
|
-
const element = node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement;
|
|
62047
|
-
return element?.closest('[data-inline-editor]') ?? null;
|
|
62048
|
-
}
|
|
62049
|
-
function getSegmentPosition(editor, node, offset, segments) {
|
|
62050
|
-
const element = node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement;
|
|
62051
|
-
const span = element?.closest('[data-seg-idx]');
|
|
62052
|
-
if (!span || !editor.contains(span)) {
|
|
62053
|
-
return null;
|
|
62054
|
-
}
|
|
62055
|
-
const segIdx = getSegmentIndex(span);
|
|
62056
|
-
if (!Number.isInteger(segIdx) || segIdx < 0 || segIdx >= segments.length) {
|
|
62057
|
-
return null;
|
|
62058
|
-
}
|
|
62059
|
-
return {
|
|
62060
|
-
segIdx,
|
|
62061
|
-
offset: getTextOffsetWithin(span, node, offset),
|
|
62062
|
-
span,
|
|
62063
|
-
textLength: span.textContent?.length ?? 0,
|
|
62064
|
-
};
|
|
62065
|
-
}
|
|
62066
|
-
function getTextOffsetWithin(container, targetNode, targetOffset) {
|
|
62067
|
-
if (targetNode === container || targetNode.nodeType === Node.ELEMENT_NODE) {
|
|
62068
|
-
const parent = targetNode === container ? container : targetNode;
|
|
62069
|
-
let count = 0;
|
|
62070
|
-
for (let index = 0; index < targetOffset && index < parent.childNodes.length; index++) {
|
|
62071
|
-
count += parent.childNodes[index].textContent?.length ?? 0;
|
|
62072
|
-
}
|
|
62073
|
-
return count;
|
|
62074
|
-
}
|
|
62075
|
-
const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT);
|
|
62076
|
-
let charCount = 0;
|
|
62077
|
-
let node;
|
|
62078
|
-
while ((node = walker.nextNode())) {
|
|
62079
|
-
if (node === targetNode) {
|
|
62080
|
-
return charCount + targetOffset;
|
|
62081
|
-
}
|
|
62082
|
-
charCount += node.length;
|
|
62083
|
-
}
|
|
62084
|
-
return charCount;
|
|
62085
|
-
}
|
|
62086
|
-
|
|
62087
|
-
let pendingRestore = null;
|
|
62088
|
-
function setPendingSelectionRestore(sel) {
|
|
62089
|
-
pendingRestore = sel;
|
|
62090
|
-
}
|
|
62091
|
-
/** Read-once: clears the stored value after returning it. */
|
|
62092
|
-
function getPendingSelectionRestore() {
|
|
62093
|
-
const sel = pendingRestore;
|
|
62094
|
-
pendingRestore = null;
|
|
62095
|
-
return sel;
|
|
62096
|
-
}
|
|
62097
|
-
/**
|
|
62098
|
-
* Apply `updates` only to the characters within the selection range. Segments
|
|
62099
|
-
* at the boundaries are split; segments outside the range are copied unchanged.
|
|
62100
|
-
* Paragraph-break segments (`\n`) are always passed through unchanged.
|
|
62101
|
-
*
|
|
62102
|
-
* Returns the new segments array AND the selection coordinates mapped to the
|
|
62103
|
-
* new segment indices (for cursor restoration).
|
|
62104
|
-
*/
|
|
62105
|
-
function applyStyleToSelectedSegments(segments, selection, updates) {
|
|
62106
|
-
const { startSegIdx, startOffset, endSegIdx, endOffset } = selection;
|
|
62107
|
-
const result = [];
|
|
62108
|
-
// Track new indices for the start/end of the selected text in the new array.
|
|
62109
|
-
let newStartSegIdx = -1;
|
|
62110
|
-
let newStartOffset = 0;
|
|
62111
|
-
let newEndSegIdx = -1;
|
|
62112
|
-
let newEndOffset = 0;
|
|
62113
|
-
for (let i = 0; i < segments.length; i++) {
|
|
62114
|
-
const seg = segments[i];
|
|
62115
|
-
// Paragraph-break segments always pass through.
|
|
62116
|
-
if (seg.isParagraphBreak || seg.text === '\n') {
|
|
62117
|
-
result.push({ ...seg, style: { ...seg.style } });
|
|
62118
|
-
continue;
|
|
62119
|
-
}
|
|
62120
|
-
// Before selection range.
|
|
62121
|
-
if (i < startSegIdx) {
|
|
62122
|
-
result.push({ ...seg, style: { ...seg.style } });
|
|
62123
|
-
continue;
|
|
62124
|
-
}
|
|
62125
|
-
// After selection range.
|
|
62126
|
-
if (i > endSegIdx) {
|
|
62127
|
-
result.push({ ...seg, style: { ...seg.style } });
|
|
62128
|
-
continue;
|
|
62129
|
-
}
|
|
62130
|
-
// Single-segment selection (start and end in the same segment).
|
|
62131
|
-
if (i === startSegIdx && i === endSegIdx) {
|
|
62132
|
-
splitSingle(seg, startOffset, endOffset, updates, result);
|
|
62133
|
-
// Track the new selection: the selected part is at `result.length - 1`
|
|
62134
|
-
// (or `result.length - 2` if there's an after part).
|
|
62135
|
-
const partsAdded = (startOffset > 0 ? 1 : 0) + 1 + (endOffset < seg.text.length ? 1 : 0);
|
|
62136
|
-
const selectedPartIdx = result.length - partsAdded + (startOffset > 0 ? 1 : 0);
|
|
62137
|
-
newStartSegIdx = selectedPartIdx;
|
|
62138
|
-
newStartOffset = 0;
|
|
62139
|
-
newEndSegIdx = selectedPartIdx;
|
|
62140
|
-
newEndOffset = endOffset - startOffset;
|
|
62141
|
-
continue;
|
|
62142
|
-
}
|
|
62143
|
-
// Start segment of multi-segment selection.
|
|
62144
|
-
if (i === startSegIdx) {
|
|
62145
|
-
if (startOffset === 0) {
|
|
62146
|
-
newStartSegIdx = result.length;
|
|
62147
|
-
newStartOffset = 0;
|
|
62148
|
-
result.push({ ...seg, style: { ...seg.style, ...updates } });
|
|
62149
|
-
}
|
|
62150
|
-
else {
|
|
62151
|
-
// Before-selection part.
|
|
62152
|
-
const beforeSeg = {
|
|
62153
|
-
text: seg.text.slice(0, startOffset),
|
|
62154
|
-
style: { ...seg.style },
|
|
62155
|
-
};
|
|
62156
|
-
if (seg.bulletInfo) {
|
|
62157
|
-
beforeSeg.bulletInfo = seg.bulletInfo;
|
|
62158
|
-
}
|
|
62159
|
-
result.push(beforeSeg);
|
|
62160
|
-
// Selected part.
|
|
62161
|
-
newStartSegIdx = result.length;
|
|
62162
|
-
newStartOffset = 0;
|
|
62163
|
-
result.push({
|
|
62164
|
-
text: seg.text.slice(startOffset),
|
|
62165
|
-
style: { ...seg.style, ...updates },
|
|
62166
|
-
});
|
|
62167
|
-
}
|
|
62168
|
-
continue;
|
|
62169
|
-
}
|
|
62170
|
-
// End segment of multi-segment selection.
|
|
62171
|
-
if (i === endSegIdx) {
|
|
62172
|
-
if (endOffset >= seg.text.length) {
|
|
62173
|
-
result.push({ ...seg, style: { ...seg.style, ...updates } });
|
|
62174
|
-
newEndSegIdx = result.length - 1;
|
|
62175
|
-
newEndOffset = seg.text.length;
|
|
62176
|
-
}
|
|
62177
|
-
else {
|
|
62178
|
-
// Selected part.
|
|
62179
|
-
result.push({
|
|
62180
|
-
text: seg.text.slice(0, endOffset),
|
|
62181
|
-
style: { ...seg.style, ...updates },
|
|
62182
|
-
});
|
|
62183
|
-
newEndSegIdx = result.length - 1;
|
|
62184
|
-
newEndOffset = endOffset;
|
|
62185
|
-
// After-selection part.
|
|
62186
|
-
result.push({
|
|
62187
|
-
text: seg.text.slice(endOffset),
|
|
62188
|
-
style: { ...seg.style },
|
|
62189
|
-
});
|
|
62190
|
-
}
|
|
62191
|
-
continue;
|
|
62192
|
-
}
|
|
62193
|
-
// Middle segment: entirely within selection.
|
|
62194
|
-
result.push({ ...seg, style: { ...seg.style, ...updates } });
|
|
62195
|
-
}
|
|
62196
|
-
return {
|
|
62197
|
-
newSegments: result,
|
|
62198
|
-
newSelection: {
|
|
62199
|
-
startSegIdx: newStartSegIdx,
|
|
62200
|
-
startOffset: newStartOffset,
|
|
62201
|
-
endSegIdx: newEndSegIdx,
|
|
62202
|
-
endOffset: newEndOffset,
|
|
62203
|
-
},
|
|
62204
|
-
};
|
|
62205
|
-
}
|
|
62206
|
-
function splitSingle(seg, startOffset, endOffset, updates, result) {
|
|
62207
|
-
// Entire segment selected.
|
|
62208
|
-
if (startOffset === 0 && endOffset >= seg.text.length) {
|
|
62209
|
-
result.push({ ...seg, style: { ...seg.style, ...updates } });
|
|
62210
|
-
return;
|
|
62211
|
-
}
|
|
62212
|
-
// Before-selection part.
|
|
62213
|
-
if (startOffset > 0) {
|
|
62214
|
-
const beforeSeg = {
|
|
62215
|
-
text: seg.text.slice(0, startOffset),
|
|
62216
|
-
style: { ...seg.style },
|
|
62217
|
-
};
|
|
62218
|
-
if (seg.bulletInfo) {
|
|
62219
|
-
beforeSeg.bulletInfo = seg.bulletInfo;
|
|
62220
|
-
}
|
|
62221
|
-
result.push(beforeSeg);
|
|
62222
|
-
}
|
|
62223
|
-
// Selected part.
|
|
62224
|
-
result.push({
|
|
62225
|
-
text: seg.text.slice(startOffset, endOffset),
|
|
62226
|
-
style: { ...seg.style, ...updates },
|
|
62227
|
-
});
|
|
62228
|
-
// After-selection part.
|
|
62229
|
-
if (endOffset < seg.text.length) {
|
|
62230
|
-
result.push({
|
|
62231
|
-
text: seg.text.slice(endOffset),
|
|
62232
|
-
style: { ...seg.style },
|
|
62233
|
-
});
|
|
62234
|
-
}
|
|
62235
|
-
}
|
|
62236
|
-
/**
|
|
62237
|
-
* Set the DOM selection inside the inline editor using segment-level
|
|
62238
|
-
* coordinates. Finds `[data-seg-idx]` spans and navigates to the correct
|
|
62239
|
-
* text-node offsets.
|
|
62240
|
-
*/
|
|
62241
|
-
function restoreSegmentSelection(editor, startSegIdx, startOffset, endSegIdx, endOffset) {
|
|
62242
|
-
const sel = window.getSelection();
|
|
62243
|
-
if (!sel) {
|
|
62244
|
-
return;
|
|
62245
|
-
}
|
|
62246
|
-
const startPos = findTextPositionInSegment(editor, startSegIdx, startOffset);
|
|
62247
|
-
const endPos = findTextPositionInSegment(editor, endSegIdx, endOffset);
|
|
62248
|
-
if (!startPos || !endPos) {
|
|
62249
|
-
return;
|
|
62250
|
-
}
|
|
62251
|
-
const range = document.createRange();
|
|
62252
|
-
range.setStart(startPos.node, startPos.offset);
|
|
62253
|
-
range.setEnd(endPos.node, endPos.offset);
|
|
62254
|
-
sel.removeAllRanges();
|
|
62255
|
-
sel.addRange(range);
|
|
62256
|
-
}
|
|
62257
|
-
function findTextPositionInSegment(editor, segIdx, charOffset) {
|
|
62258
|
-
const segSpan = editor.querySelector(`[data-seg-idx="${segIdx}"]`);
|
|
62259
|
-
if (!segSpan) {
|
|
62260
|
-
return null;
|
|
62261
|
-
}
|
|
62262
|
-
const walker = document.createTreeWalker(segSpan, NodeFilter.SHOW_TEXT);
|
|
62263
|
-
let charCount = 0;
|
|
62264
|
-
let node;
|
|
62265
|
-
while ((node = walker.nextNode())) {
|
|
62266
|
-
const textLen = node.length;
|
|
62267
|
-
if (charCount + textLen >= charOffset) {
|
|
62268
|
-
return { node, offset: charOffset - charCount };
|
|
62269
|
-
}
|
|
62270
|
-
charCount += textLen;
|
|
62271
|
-
}
|
|
62272
|
-
// If exact position not found, place at end of last text node.
|
|
62273
|
-
const lastTextNode = segSpan.querySelector('*') ? null : segSpan.firstChild;
|
|
62274
|
-
if (lastTextNode && lastTextNode.nodeType === Node.TEXT_NODE) {
|
|
62275
|
-
return { node: lastTextNode, offset: lastTextNode.length };
|
|
62276
|
-
}
|
|
62277
|
-
return null;
|
|
62278
|
-
}
|
|
62279
|
-
|
|
62280
62445
|
/**
|
|
62281
62446
|
* Caret placement for the inline text editors.
|
|
62282
62447
|
*
|
|
@@ -63987,6 +64152,231 @@ function connectorArrowPatch(control, raw) {
|
|
|
63987
64152
|
return { [control.styleKey]: raw };
|
|
63988
64153
|
}
|
|
63989
64154
|
|
|
64155
|
+
/**
|
|
64156
|
+
* Regular-text font sizes are stored in slide/CSS pixels in the shared model,
|
|
64157
|
+
* while PowerPoint's font controls and the preset list below use points.
|
|
64158
|
+
*/
|
|
64159
|
+
function textFontSizePxToPt(fontSizePx) {
|
|
64160
|
+
// DrawingML stores regular text sizes in hundredths of a point. Normalising
|
|
64161
|
+
// to that precision removes binary floating-point noise without discarding
|
|
64162
|
+
// valid authored values such as 10.5 pt or 48.1 pt.
|
|
64163
|
+
return Math.round(fontSizePx * (72 / 96) * 100) / 100;
|
|
64164
|
+
}
|
|
64165
|
+
/** Convert a PowerPoint font-control value in points to the model's pixels. */
|
|
64166
|
+
function textFontSizePtToPx(fontSizePt) {
|
|
64167
|
+
return fontSizePt * (96 / 72);
|
|
64168
|
+
}
|
|
64169
|
+
/**
|
|
64170
|
+
* Font families offered by the Home-tab font dropdown, alphabetically.
|
|
64171
|
+
*
|
|
64172
|
+
* Covers the families PowerPoint's own list leads with (the Office UI faces,
|
|
64173
|
+
* the Aptos family that replaced Calibri as the default theme font, and the
|
|
64174
|
+
* classic Windows/Mac core fonts) plus the handful of web faces decks
|
|
64175
|
+
* routinely arrive with. Entries the host cannot resolve simply fall back
|
|
64176
|
+
* through the CSS font stack, so listing a family costs nothing but gives the
|
|
64177
|
+
* user a name to pick when the deck already references it.
|
|
64178
|
+
*/
|
|
64179
|
+
const COMMON_FONT_FAMILIES = [
|
|
64180
|
+
'Abadi',
|
|
64181
|
+
'Aptos',
|
|
64182
|
+
'Aptos Display',
|
|
64183
|
+
'Arial',
|
|
64184
|
+
'Arial Black',
|
|
64185
|
+
'Arial Narrow',
|
|
64186
|
+
'Bahnschrift',
|
|
64187
|
+
'Book Antiqua',
|
|
64188
|
+
'Bookman Old Style',
|
|
64189
|
+
'Calibri',
|
|
64190
|
+
'Calibri Light',
|
|
64191
|
+
'Cambria',
|
|
64192
|
+
'Candara',
|
|
64193
|
+
'Century Gothic',
|
|
64194
|
+
'Comic Sans MS',
|
|
64195
|
+
'Consolas',
|
|
64196
|
+
'Corbel',
|
|
64197
|
+
'Courier New',
|
|
64198
|
+
'Franklin Gothic Book',
|
|
64199
|
+
'Franklin Gothic Medium',
|
|
64200
|
+
'Garamond',
|
|
64201
|
+
'Georgia',
|
|
64202
|
+
'Gill Sans MT',
|
|
64203
|
+
'Helvetica',
|
|
64204
|
+
'Impact',
|
|
64205
|
+
'Inter',
|
|
64206
|
+
'Lucida Console',
|
|
64207
|
+
'Lucida Sans Unicode',
|
|
64208
|
+
'Microsoft Sans Serif',
|
|
64209
|
+
'Montserrat',
|
|
64210
|
+
'Noto Sans',
|
|
64211
|
+
'Open Sans',
|
|
64212
|
+
'Palatino Linotype',
|
|
64213
|
+
'Poppins',
|
|
64214
|
+
'Roboto',
|
|
64215
|
+
'Rockwell',
|
|
64216
|
+
'Segoe UI',
|
|
64217
|
+
'Source Sans Pro',
|
|
64218
|
+
'Tahoma',
|
|
64219
|
+
'Times New Roman',
|
|
64220
|
+
'Trebuchet MS',
|
|
64221
|
+
'Tw Cen MT',
|
|
64222
|
+
'Verdana',
|
|
64223
|
+
];
|
|
64224
|
+
/** Font sizes (pt) offered by the Home-tab size dropdown. */
|
|
64225
|
+
const COMMON_FONT_SIZES = [
|
|
64226
|
+
8, 9, 10, 11, 12, 14, 16, 18, 20, 24, 28, 32, 36, 40, 44, 48, 54, 60, 72, 96,
|
|
64227
|
+
];
|
|
64228
|
+
/** Character-spacing presets for the toolbar dropdown. */
|
|
64229
|
+
const CHARACTER_SPACING_OPTIONS = [
|
|
64230
|
+
{ label: 'Very Tight', i18nKey: 'pptx.text.characterSpacingVeryTight', value: -150 },
|
|
64231
|
+
{ label: 'Tight', i18nKey: 'pptx.text.characterSpacingTight', value: -75 },
|
|
64232
|
+
{ label: 'Normal', i18nKey: 'pptx.text.characterSpacingNormal', value: 0 },
|
|
64233
|
+
{ label: 'Loose', i18nKey: 'pptx.text.characterSpacingLoose', value: 75 },
|
|
64234
|
+
{ label: 'Very Loose', i18nKey: 'pptx.text.characterSpacingVeryLoose', value: 150 },
|
|
64235
|
+
];
|
|
64236
|
+
/** Line-spacing presets for the paragraph dropdown. */
|
|
64237
|
+
const LINE_SPACING_OPTIONS$1 = [
|
|
64238
|
+
{ label: '1.0', value: 1.0 },
|
|
64239
|
+
{ label: '1.15', value: 1.15 },
|
|
64240
|
+
{ label: '1.5', value: 1.5 },
|
|
64241
|
+
{ label: '2.0', value: 2.0 },
|
|
64242
|
+
{ label: '2.5', value: 2.5 },
|
|
64243
|
+
{ label: '3.0', value: 3.0 },
|
|
64244
|
+
];
|
|
64245
|
+
/** Change-case options in menu order (matches PowerPoint's ordering). */
|
|
64246
|
+
const CHANGE_CASE_OPTIONS$1 = [
|
|
64247
|
+
{ value: 'sentence', i18nKey: 'pptx.text.changeCaseSentence' },
|
|
64248
|
+
{ value: 'lower', i18nKey: 'pptx.text.changeCaseLower' },
|
|
64249
|
+
{ value: 'upper', i18nKey: 'pptx.text.changeCaseUpper' },
|
|
64250
|
+
{ value: 'capitalize', i18nKey: 'pptx.text.changeCaseCapitalize' },
|
|
64251
|
+
{ value: 'toggle', i18nKey: 'pptx.text.changeCaseToggle' },
|
|
64252
|
+
];
|
|
64253
|
+
|
|
64254
|
+
/**
|
|
64255
|
+
* inspector-helpers.ts: Pure (no framework) helpers for the inspector panel.
|
|
64256
|
+
*
|
|
64257
|
+
* Readers extract display values from a PptxElement (with sensible defaults),
|
|
64258
|
+
* and patch builders produce shallow-merge-ready Partial<PptxElement> objects
|
|
64259
|
+
* for the binding's element-update path. Shared across React, Vue, and Angular.
|
|
64260
|
+
*/
|
|
64261
|
+
const DEFAULT_FILL = '#ffffff';
|
|
64262
|
+
const DEFAULT_STROKE = '#000000';
|
|
64263
|
+
const DEFAULT_TEXT_COLOR = '#000000';
|
|
64264
|
+
/**
|
|
64265
|
+
* PowerPoint's own presentation-level default text style (`p:defaultTextStyle
|
|
64266
|
+
* /a:lvl1pPr/a:defRPr@sz`) is 1800 (18pt), so a shape with no explicit font
|
|
64267
|
+
* size renders at 18pt in real PowerPoint, not 12pt. Kept as the last-resort
|
|
64268
|
+
* fallback below the deck's actual default when {@link fontSizeOf} is given one.
|
|
64269
|
+
*/
|
|
64270
|
+
const DEFAULT_FONT_SIZE$2 = 18;
|
|
64271
|
+
/**
|
|
64272
|
+
* Returns the fill colour of the element's shapeStyle, or a white default.
|
|
64273
|
+
* Only meaningful for elements that pass `hasShapeProperties`.
|
|
64274
|
+
*/
|
|
64275
|
+
function fillColorOf$1(el) {
|
|
64276
|
+
if (hasShapeProperties(el)) {
|
|
64277
|
+
return el.shapeStyle?.fillColor ?? DEFAULT_FILL;
|
|
64278
|
+
}
|
|
64279
|
+
return DEFAULT_FILL;
|
|
64280
|
+
}
|
|
64281
|
+
/**
|
|
64282
|
+
* Returns the stroke colour of the element's shapeStyle, or a black default.
|
|
64283
|
+
* Only meaningful for elements that pass `hasShapeProperties`.
|
|
64284
|
+
*/
|
|
64285
|
+
function strokeColorOf(el) {
|
|
64286
|
+
if (hasShapeProperties(el)) {
|
|
64287
|
+
return el.shapeStyle?.strokeColor ?? DEFAULT_STROKE;
|
|
64288
|
+
}
|
|
64289
|
+
return DEFAULT_STROKE;
|
|
64290
|
+
}
|
|
64291
|
+
/**
|
|
64292
|
+
* Returns the text colour from the element's textStyle, or a black default.
|
|
64293
|
+
* Only meaningful for elements that pass `hasTextProperties`.
|
|
64294
|
+
*/
|
|
64295
|
+
function textColorOf(el) {
|
|
64296
|
+
if (hasTextProperties(el)) {
|
|
64297
|
+
return el.textStyle?.color ?? DEFAULT_TEXT_COLOR;
|
|
64298
|
+
}
|
|
64299
|
+
return DEFAULT_TEXT_COLOR;
|
|
64300
|
+
}
|
|
64301
|
+
/**
|
|
64302
|
+
* Returns the font size (in points) from the element's textStyle.
|
|
64303
|
+
*
|
|
64304
|
+
* Falls back, in order, to: the deck's presentation-level default text style
|
|
64305
|
+
* (`p:defaultTextStyle`, passed as `presentationDefault` when the caller has
|
|
64306
|
+
* one), then `DEFAULT_FONT_SIZE` (18pt, matching PowerPoint's own
|
|
64307
|
+
* `a:lvl1pPr/a:defRPr@sz="1800"` when neither is available).
|
|
64308
|
+
*/
|
|
64309
|
+
function fontSizeOf(el, presentationDefault) {
|
|
64310
|
+
if (hasTextProperties(el) && el.textStyle?.fontSize !== undefined) {
|
|
64311
|
+
return textFontSizePxToPt(el.textStyle.fontSize);
|
|
64312
|
+
}
|
|
64313
|
+
const deckDefault = presentationDefault?.levelStyles?.[0]?.fontSize;
|
|
64314
|
+
return deckDefault === undefined ? DEFAULT_FONT_SIZE$2 : textFontSizePxToPt(deckDefault);
|
|
64315
|
+
}
|
|
64316
|
+
/** Returns whether the element's text is bold (false when absent). */
|
|
64317
|
+
function isBold(el) {
|
|
64318
|
+
if (hasTextProperties(el)) {
|
|
64319
|
+
return el.textStyle?.bold ?? false;
|
|
64320
|
+
}
|
|
64321
|
+
return false;
|
|
64322
|
+
}
|
|
64323
|
+
/** Returns whether the element's text is italic (false when absent). */
|
|
64324
|
+
function isItalic(el) {
|
|
64325
|
+
if (hasTextProperties(el)) {
|
|
64326
|
+
return el.textStyle?.italic ?? false;
|
|
64327
|
+
}
|
|
64328
|
+
return false;
|
|
64329
|
+
}
|
|
64330
|
+
/** Returns whether the element's text has underline (false when absent). */
|
|
64331
|
+
function isUnderline(el) {
|
|
64332
|
+
if (hasTextProperties(el)) {
|
|
64333
|
+
return el.textStyle?.underline ?? false;
|
|
64334
|
+
}
|
|
64335
|
+
return false;
|
|
64336
|
+
}
|
|
64337
|
+
/**
|
|
64338
|
+
* Builds a Partial<PptxElement> patch that merges the given changes into the
|
|
64339
|
+
* element's existing shapeStyle without dropping any other shapeStyle fields.
|
|
64340
|
+
*/
|
|
64341
|
+
function shapeStylePatch$1(el, changes) {
|
|
64342
|
+
const base = hasShapeProperties(el) ? (el.shapeStyle ?? {}) : {};
|
|
64343
|
+
return {
|
|
64344
|
+
shapeStyle: {
|
|
64345
|
+
...base,
|
|
64346
|
+
...changes,
|
|
64347
|
+
},
|
|
64348
|
+
};
|
|
64349
|
+
}
|
|
64350
|
+
/**
|
|
64351
|
+
* Builds a Partial<PptxElement> patch that merges the given changes into the
|
|
64352
|
+
* element's existing textStyle without dropping any other textStyle fields.
|
|
64353
|
+
*/
|
|
64354
|
+
function textStylePatch(el, changes) {
|
|
64355
|
+
const base = hasTextProperties(el) ? (el.textStyle ?? {}) : {};
|
|
64356
|
+
return {
|
|
64357
|
+
...(hasTextProperties(el) && el.textSegments?.some((segment) => segment.paragraphInsertionStyle)
|
|
64358
|
+
? {
|
|
64359
|
+
textSegments: el.textSegments.map((segment) => updateTextSegmentStyle(segment, changes, { updateBodyStyle: false })),
|
|
64360
|
+
}
|
|
64361
|
+
: {}),
|
|
64362
|
+
textStyle: {
|
|
64363
|
+
...base,
|
|
64364
|
+
...changes,
|
|
64365
|
+
},
|
|
64366
|
+
};
|
|
64367
|
+
}
|
|
64368
|
+
/** Apply an ordinary-text model pixel size to the element and all of its runs. */
|
|
64369
|
+
function textFontSizePatch(el, fontSize) {
|
|
64370
|
+
const patch = textStylePatch(el, { fontSize });
|
|
64371
|
+
if (!hasTextProperties(el) || !el.textSegments) {
|
|
64372
|
+
return patch;
|
|
64373
|
+
}
|
|
64374
|
+
return {
|
|
64375
|
+
...patch,
|
|
64376
|
+
textSegments: el.textSegments.map((segment) => updateTextSegmentStyle(segment, { fontSize })),
|
|
64377
|
+
};
|
|
64378
|
+
}
|
|
64379
|
+
|
|
63990
64380
|
/** Copy the paintable shape + text style off an element. */
|
|
63991
64381
|
function copyFormatFromElement(element) {
|
|
63992
64382
|
const result = {};
|
|
@@ -64063,10 +64453,7 @@ function applyFormatToElement(element, format) {
|
|
|
64063
64453
|
if (format.textStyle && hasTextProperties(updated)) {
|
|
64064
64454
|
updated = {
|
|
64065
64455
|
...updated,
|
|
64066
|
-
textStyle
|
|
64067
|
-
...updated.textStyle,
|
|
64068
|
-
...definedEntries(format.textStyle),
|
|
64069
|
-
},
|
|
64456
|
+
...textStylePatch(updated, definedEntries(format.textStyle)),
|
|
64070
64457
|
};
|
|
64071
64458
|
}
|
|
64072
64459
|
return updated;
|
|
@@ -64079,6 +64466,61 @@ function hasCopyableFormat(element) {
|
|
|
64079
64466
|
return hasShapeProperties(element) || hasTextProperties(element);
|
|
64080
64467
|
}
|
|
64081
64468
|
|
|
64469
|
+
/** Materialize typed body text without borrowing a display marker's style. */
|
|
64470
|
+
function remapEmptyParagraph(text, segments, terminator) {
|
|
64471
|
+
const source = segments[0] ?? terminator;
|
|
64472
|
+
const insertionStyle = source?.paragraphInsertionStyle;
|
|
64473
|
+
if (!source ||
|
|
64474
|
+
!insertionStyle ||
|
|
64475
|
+
segments.length > 1 ||
|
|
64476
|
+
(segments.length > 0 && source.text !== '' && !isBulletMarkerSegment(source))) {
|
|
64477
|
+
return undefined;
|
|
64478
|
+
}
|
|
64479
|
+
if (text.length === 0) {
|
|
64480
|
+
return segments.map((segment) => ({ ...segment }));
|
|
64481
|
+
}
|
|
64482
|
+
const first = { ...source };
|
|
64483
|
+
delete first.paragraphInsertionStyle;
|
|
64484
|
+
const bullet = first.bulletInfo;
|
|
64485
|
+
if (bullet && !bullet.none && segments.length > 0) {
|
|
64486
|
+
return [first, { text, style: { ...insertionStyle } }];
|
|
64487
|
+
}
|
|
64488
|
+
delete first.isParagraphBreak;
|
|
64489
|
+
return [{ ...first, text, style: { ...insertionStyle } }];
|
|
64490
|
+
}
|
|
64491
|
+
|
|
64492
|
+
/** Refresh only derived ordinals after existing paragraphs have moved. */
|
|
64493
|
+
function renumberRemappedParagraphs(segments) {
|
|
64494
|
+
const sequence = createAutoNumberSequence();
|
|
64495
|
+
let first = true;
|
|
64496
|
+
return segments.map((segment) => {
|
|
64497
|
+
const paragraphStart = first;
|
|
64498
|
+
first = isParagraphSeparatorSegment(segment);
|
|
64499
|
+
if (!paragraphStart) {
|
|
64500
|
+
return segment;
|
|
64501
|
+
}
|
|
64502
|
+
const info = segment.bulletInfo;
|
|
64503
|
+
const level = segment.paragraphLevel ?? 0;
|
|
64504
|
+
if (!info?.autoNumType || !resolveParagraphBullet(segment)?.isNumbered) {
|
|
64505
|
+
breakAutoNumberRun(sequence, level);
|
|
64506
|
+
return segment;
|
|
64507
|
+
}
|
|
64508
|
+
const ordinal = nextAutoNumber(sequence, level, info.autoNumType, info.autoNumStartAt ?? 1) -
|
|
64509
|
+
(info.autoNumStartAt ?? 1);
|
|
64510
|
+
// An unknown runtime index may accompany literal marker-like body text.
|
|
64511
|
+
if (info.paragraphIndex === undefined || info.paragraphIndex === ordinal) {
|
|
64512
|
+
return segment;
|
|
64513
|
+
}
|
|
64514
|
+
const updated = { ...segment, bulletInfo: { ...info, paragraphIndex: ordinal } };
|
|
64515
|
+
if (isBulletMarkerSegment(segment)) {
|
|
64516
|
+
const resolved = resolveParagraphBullet(updated);
|
|
64517
|
+
if (resolved) {
|
|
64518
|
+
updated.text = resolved.marker + (segment.text.match(/\s+$/u)?.[0] ?? '');
|
|
64519
|
+
}
|
|
64520
|
+
}
|
|
64521
|
+
return updated;
|
|
64522
|
+
});
|
|
64523
|
+
}
|
|
64082
64524
|
/** Remove a display-only marker from editor text before remapping its content. */
|
|
64083
64525
|
function withoutRenderedBulletPrefix(text, originalSegments, dedicatedMarker) {
|
|
64084
64526
|
if (!dedicatedMarker) {
|
|
@@ -64106,21 +64548,23 @@ function withoutRenderedBulletPrefix(text, originalSegments, dedicatedMarker) {
|
|
|
64106
64548
|
return withoutMarker;
|
|
64107
64549
|
}
|
|
64108
64550
|
/**
|
|
64109
|
-
*
|
|
64551
|
+
* Continue an inserted paragraph from the immediately preceding list item.
|
|
64110
64552
|
* Core stores the list-relative ordinal as `paragraphIndex`; copying the final
|
|
64111
64553
|
* item unchanged would render every paragraph added with Enter as the same
|
|
64112
64554
|
* number. The literal marker is refreshed only when core supplied a dedicated
|
|
64113
64555
|
* display-marker segment. The donor's list level is retained because core
|
|
64114
64556
|
* sequences each level independently when the deck is reloaded. Other bullet
|
|
64115
|
-
* kinds
|
|
64557
|
+
* kinds retain their definition and level; unknown auto-number indices stay unknown.
|
|
64116
64558
|
*/
|
|
64117
|
-
function
|
|
64559
|
+
function continueListParagraph(segments, donorSegments) {
|
|
64118
64560
|
const donor = donorSegments[0];
|
|
64119
64561
|
const paragraphIndex = donor?.bulletInfo?.paragraphIndex;
|
|
64120
|
-
|
|
64121
|
-
|
|
64122
|
-
|
|
64123
|
-
|
|
64562
|
+
const bullet = resolveParagraphBullet(donor);
|
|
64563
|
+
if (segments.length === 0 || !bullet) {
|
|
64564
|
+
return segments;
|
|
64565
|
+
}
|
|
64566
|
+
if (bullet.isNumbered &&
|
|
64567
|
+
(typeof paragraphIndex !== 'number' || !Number.isFinite(paragraphIndex))) {
|
|
64124
64568
|
return segments;
|
|
64125
64569
|
}
|
|
64126
64570
|
const [first, ...rest] = segments;
|
|
@@ -64128,13 +64572,18 @@ function continueAutoNumberedParagraph(segments, donorSegments, offset) {
|
|
|
64128
64572
|
...first,
|
|
64129
64573
|
bulletInfo: {
|
|
64130
64574
|
...donor.bulletInfo,
|
|
64131
|
-
|
|
64575
|
+
...(bullet.isNumbered && typeof paragraphIndex === 'number' && Number.isFinite(paragraphIndex)
|
|
64576
|
+
? { paragraphIndex: paragraphIndex + 1 }
|
|
64577
|
+
: {}),
|
|
64132
64578
|
},
|
|
64133
64579
|
};
|
|
64134
64580
|
if (donor.paragraphLevel !== undefined) {
|
|
64135
64581
|
continued.paragraphLevel = donor.paragraphLevel;
|
|
64136
64582
|
}
|
|
64137
|
-
if (
|
|
64583
|
+
if (bullet.isNumbered &&
|
|
64584
|
+
typeof paragraphIndex === 'number' &&
|
|
64585
|
+
Number.isFinite(paragraphIndex) &&
|
|
64586
|
+
isBulletMarkerSegment(donor)) {
|
|
64138
64587
|
const resolved = resolveParagraphBullet(continued);
|
|
64139
64588
|
if (resolved) {
|
|
64140
64589
|
const trailingWhitespace = donor.text.match(/\s+$/u)?.[0] ?? '';
|
|
@@ -64144,6 +64593,115 @@ function continueAutoNumberedParagraph(segments, donorSegments, offset) {
|
|
|
64144
64593
|
return [continued, ...rest];
|
|
64145
64594
|
}
|
|
64146
64595
|
|
|
64596
|
+
/**
|
|
64597
|
+
* Restore paragraph-scoped metadata on the first remapped run. Core and the
|
|
64598
|
+
* save writer deliberately carry these values on that run only; remapping the
|
|
64599
|
+
* characters must not turn an authored paragraph back into a default one.
|
|
64600
|
+
*/
|
|
64601
|
+
function restoreParagraphMetadata(from, segments) {
|
|
64602
|
+
if (segments.length === 0) {
|
|
64603
|
+
return segments;
|
|
64604
|
+
}
|
|
64605
|
+
const [first, ...rest] = segments;
|
|
64606
|
+
const restored = { ...first };
|
|
64607
|
+
// `remapParagraph` may itself return a donor segment. Clear its paragraph
|
|
64608
|
+
// fields first so an extra paragraph cannot accidentally inherit metadata
|
|
64609
|
+
// merely because it reused the final paragraph for run styling.
|
|
64610
|
+
delete restored.paragraphLevel;
|
|
64611
|
+
delete restored.paragraphProperties;
|
|
64612
|
+
delete restored.endParaRunProperties;
|
|
64613
|
+
if (!from) {
|
|
64614
|
+
delete restored.paragraphInsertionStyle;
|
|
64615
|
+
}
|
|
64616
|
+
if (from?.paragraphLevel !== undefined) {
|
|
64617
|
+
restored.paragraphLevel = from.paragraphLevel;
|
|
64618
|
+
}
|
|
64619
|
+
if (from?.paragraphProperties !== undefined) {
|
|
64620
|
+
restored.paragraphProperties = from.paragraphProperties;
|
|
64621
|
+
}
|
|
64622
|
+
if (from?.endParaRunProperties !== undefined) {
|
|
64623
|
+
restored.endParaRunProperties = from.endParaRunProperties;
|
|
64624
|
+
}
|
|
64625
|
+
return [restored, ...rest];
|
|
64626
|
+
}
|
|
64627
|
+
function matches(text, paragraph) {
|
|
64628
|
+
const first = paragraph.segments[0];
|
|
64629
|
+
const marker = first &&
|
|
64630
|
+
isBulletMarkerSegment(first) &&
|
|
64631
|
+
(!first.bulletInfo?.autoNumType || first.bulletInfo.paragraphIndex !== undefined)
|
|
64632
|
+
? first
|
|
64633
|
+
: undefined;
|
|
64634
|
+
const body = paragraph.segments
|
|
64635
|
+
.slice(marker ? 1 : 0)
|
|
64636
|
+
.map((segment) => segment.text)
|
|
64637
|
+
.join('');
|
|
64638
|
+
return text === body || withoutRenderedBulletPrefix(text, paragraph.segments, marker) === body;
|
|
64639
|
+
}
|
|
64640
|
+
/**
|
|
64641
|
+
* Preserve exact ordered paragraphs, matching duplicates from the ends first.
|
|
64642
|
+
* Interior anchors also survive when AutoCorrect changes a separate paragraph.
|
|
64643
|
+
* Gaps keep positional donors; extra paragraphs have no original metadata source.
|
|
64644
|
+
* This infers no moves or case equivalence from plain editor text.
|
|
64645
|
+
*/
|
|
64646
|
+
function alignParagraphSources(texts, original) {
|
|
64647
|
+
const sources = Array.from({ length: texts.length });
|
|
64648
|
+
let prefix = 0;
|
|
64649
|
+
while (prefix < texts.length &&
|
|
64650
|
+
prefix < original.length &&
|
|
64651
|
+
matches(texts[prefix], original[prefix])) {
|
|
64652
|
+
sources[prefix] = prefix;
|
|
64653
|
+
prefix += 1;
|
|
64654
|
+
}
|
|
64655
|
+
let oldEnd = original.length;
|
|
64656
|
+
let newEnd = texts.length;
|
|
64657
|
+
while (oldEnd > prefix && newEnd > prefix && matches(texts[newEnd - 1], original[oldEnd - 1])) {
|
|
64658
|
+
sources[--newEnd] = --oldEnd;
|
|
64659
|
+
}
|
|
64660
|
+
const anchors = [];
|
|
64661
|
+
const oldCount = oldEnd - prefix;
|
|
64662
|
+
const newCount = newEnd - prefix;
|
|
64663
|
+
// Bound quadratic work for unusually large text bodies. Their ambiguous
|
|
64664
|
+
// middle retains positional behavior while exact prefix/suffix still work.
|
|
64665
|
+
if (oldCount * newCount <= 10_000) {
|
|
64666
|
+
const lengths = Array.from({ length: oldCount + 1 }, () => new Uint16Array(newCount + 1));
|
|
64667
|
+
for (let old = oldCount - 1; old >= 0; old--) {
|
|
64668
|
+
for (let next = newCount - 1; next >= 0; next--) {
|
|
64669
|
+
lengths[old][next] = matches(texts[prefix + next], original[prefix + old])
|
|
64670
|
+
? lengths[old + 1][next + 1] + 1
|
|
64671
|
+
: Math.max(lengths[old + 1][next], lengths[old][next + 1]);
|
|
64672
|
+
}
|
|
64673
|
+
}
|
|
64674
|
+
let old = 0;
|
|
64675
|
+
let next = 0;
|
|
64676
|
+
while (old < oldCount && next < newCount) {
|
|
64677
|
+
if (matches(texts[prefix + next], original[prefix + old])) {
|
|
64678
|
+
anchors.push([prefix + next++, prefix + old++]);
|
|
64679
|
+
}
|
|
64680
|
+
else if (lengths[old + 1][next] >= lengths[old][next + 1]) {
|
|
64681
|
+
// Ties discard the old candidate first, consistently with token diff.
|
|
64682
|
+
old++;
|
|
64683
|
+
}
|
|
64684
|
+
else {
|
|
64685
|
+
next++;
|
|
64686
|
+
}
|
|
64687
|
+
}
|
|
64688
|
+
}
|
|
64689
|
+
anchors.push([newEnd, oldEnd]);
|
|
64690
|
+
let oldCursor = prefix;
|
|
64691
|
+
let newCursor = prefix;
|
|
64692
|
+
for (const [newAnchor, oldAnchor] of anchors) {
|
|
64693
|
+
while (oldCursor < oldAnchor && newCursor < newAnchor) {
|
|
64694
|
+
sources[newCursor++] = oldCursor++;
|
|
64695
|
+
}
|
|
64696
|
+
if (newAnchor < newEnd) {
|
|
64697
|
+
sources[newAnchor] = oldAnchor;
|
|
64698
|
+
}
|
|
64699
|
+
oldCursor = oldAnchor + 1;
|
|
64700
|
+
newCursor = newAnchor + 1;
|
|
64701
|
+
}
|
|
64702
|
+
return sources;
|
|
64703
|
+
}
|
|
64704
|
+
|
|
64147
64705
|
/**
|
|
64148
64706
|
* Whether an original segment is ATOMIC: its rendered text is not what is
|
|
64149
64707
|
* literally stored (a field re-substitutes its live value at render, from
|
|
@@ -64173,6 +64731,9 @@ function isAtomicOriginalSegment(seg) {
|
|
|
64173
64731
|
* style-level properties already survive via the copied `style` object.
|
|
64174
64732
|
*/
|
|
64175
64733
|
function copySegmentMetadata(from, to) {
|
|
64734
|
+
if (!from) {
|
|
64735
|
+
return to;
|
|
64736
|
+
}
|
|
64176
64737
|
if (from.equationXml !== undefined) {
|
|
64177
64738
|
to.equationXml = from.equationXml;
|
|
64178
64739
|
}
|
|
@@ -64193,39 +64754,11 @@ function copySegmentMetadata(from, to) {
|
|
|
64193
64754
|
}
|
|
64194
64755
|
return to;
|
|
64195
64756
|
}
|
|
64196
|
-
/**
|
|
64197
|
-
* Restore paragraph-scoped metadata on the first remapped run. Core and the
|
|
64198
|
-
* save writer deliberately carry these values on that run only; remapping the
|
|
64199
|
-
* characters must not turn an authored paragraph back into a default one.
|
|
64200
|
-
*/
|
|
64201
|
-
function restoreParagraphMetadata(from, segments) {
|
|
64202
|
-
if (segments.length === 0) {
|
|
64203
|
-
return segments;
|
|
64204
|
-
}
|
|
64205
|
-
const [first, ...rest] = segments;
|
|
64206
|
-
const restored = { ...first };
|
|
64207
|
-
// `remapParagraph` may itself return a donor segment. Clear its paragraph
|
|
64208
|
-
// fields first so an extra paragraph cannot accidentally inherit metadata
|
|
64209
|
-
// merely because it reused the final paragraph for run styling.
|
|
64210
|
-
delete restored.paragraphLevel;
|
|
64211
|
-
delete restored.paragraphProperties;
|
|
64212
|
-
delete restored.endParaRunProperties;
|
|
64213
|
-
if (from?.paragraphLevel !== undefined) {
|
|
64214
|
-
restored.paragraphLevel = from.paragraphLevel;
|
|
64215
|
-
}
|
|
64216
|
-
if (from?.paragraphProperties !== undefined) {
|
|
64217
|
-
restored.paragraphProperties = from.paragraphProperties;
|
|
64218
|
-
}
|
|
64219
|
-
if (from?.endParaRunProperties !== undefined) {
|
|
64220
|
-
restored.endParaRunProperties = from.endParaRunProperties;
|
|
64221
|
-
}
|
|
64222
|
-
return [restored, ...rest];
|
|
64223
|
-
}
|
|
64224
64757
|
/**
|
|
64225
64758
|
* Strategy:
|
|
64226
64759
|
* 1. Split both original segments and new text into paragraphs by "\n".
|
|
64227
64760
|
* 2. Distribute new characters proportionally across segments.
|
|
64228
|
-
* 3. Extra chars go to last segment
|
|
64761
|
+
* 3. Extra chars go to the last segment; new paragraphs use their preceding context.
|
|
64229
64762
|
* 4. Re-insert paragraph-break markers between paragraphs.
|
|
64230
64763
|
*/
|
|
64231
64764
|
function remapTextToSegments(newText, originalSegments, elementTextStyle) {
|
|
@@ -64249,13 +64782,14 @@ function remapTextToSegments(newText, originalSegments, elementTextStyle) {
|
|
|
64249
64782
|
}
|
|
64250
64783
|
}
|
|
64251
64784
|
const newParagraphTexts = newText.split('\n');
|
|
64785
|
+
const paragraphSources = alignParagraphSources(newParagraphTexts, originalParagraphs);
|
|
64252
64786
|
const firstContentSeg = originalParagraphs
|
|
64253
64787
|
.flatMap((paragraph) => paragraph.segments)
|
|
64254
64788
|
.find((s) => s.text.trim().length > 0);
|
|
64255
64789
|
const baseFallbackStyle = firstContentSeg?.style
|
|
64256
64790
|
? { ...firstContentSeg.style }
|
|
64257
64791
|
: fallbackStyle;
|
|
64258
|
-
function remapParagraph(paraNewText, paraOrigSegments) {
|
|
64792
|
+
function remapParagraph(paraNewText, paraOrigSegments, isOriginalParagraph = true) {
|
|
64259
64793
|
if (paraOrigSegments.length === 0) {
|
|
64260
64794
|
return paraNewText.length > 0
|
|
64261
64795
|
? [{ text: paraNewText, style: { ...baseFallbackStyle } }]
|
|
@@ -64269,9 +64803,12 @@ function remapTextToSegments(newText, originalSegments, elementTextStyle) {
|
|
|
64269
64803
|
: undefined;
|
|
64270
64804
|
if (dedicatedMarker) {
|
|
64271
64805
|
const contentSegments = paraOrigSegments.slice(1);
|
|
64272
|
-
|
|
64806
|
+
// A new paragraph has no prior display marker to strip from authored text.
|
|
64807
|
+
const contentText = isOriginalParagraph
|
|
64808
|
+
? withoutRenderedBulletPrefix(paraNewText, paraOrigSegments, dedicatedMarker)
|
|
64809
|
+
: paraNewText;
|
|
64273
64810
|
const content = contentSegments.length > 0
|
|
64274
|
-
? remapParagraph(contentText, contentSegments)
|
|
64811
|
+
? remapParagraph(contentText, contentSegments, isOriginalParagraph)
|
|
64275
64812
|
: [{ text: contentText, style: { ...dedicatedMarker.style } }];
|
|
64276
64813
|
return [dedicatedMarker, ...content];
|
|
64277
64814
|
}
|
|
@@ -64287,7 +64824,7 @@ function remapTextToSegments(newText, originalSegments, elementTextStyle) {
|
|
|
64287
64824
|
const totalOrigLen = paraOrigSegments.reduce((sum, s) => sum + s.text.length, 0);
|
|
64288
64825
|
if (totalOrigLen === 0) {
|
|
64289
64826
|
const result = [
|
|
64290
|
-
copySegmentMetadata(paraOrigSegments[0], {
|
|
64827
|
+
copySegmentMetadata(isOriginalParagraph ? paraOrigSegments[0] : undefined, {
|
|
64291
64828
|
text: paraNewText,
|
|
64292
64829
|
style: { ...paraOrigSegments[0].style },
|
|
64293
64830
|
}),
|
|
@@ -64304,7 +64841,8 @@ function remapTextToSegments(newText, originalSegments, elementTextStyle) {
|
|
|
64304
64841
|
// An atomic (field/equation) segment never gets the "last segment
|
|
64305
64842
|
// absorbs everything left over" treatment, even when it IS the last
|
|
64306
64843
|
// segment - see `isAtomicOriginalSegment`.
|
|
64307
|
-
const isLastSeg = i === paraOrigSegments.length - 1 &&
|
|
64844
|
+
const isLastSeg = i === paraOrigSegments.length - 1 &&
|
|
64845
|
+
(!isOriginalParagraph || !isAtomicOriginalSegment(origSeg));
|
|
64308
64846
|
const origLen = origSeg.text.length;
|
|
64309
64847
|
if (newPos >= paraNewText.length) {
|
|
64310
64848
|
break;
|
|
@@ -64317,7 +64855,7 @@ function remapTextToSegments(newText, originalSegments, elementTextStyle) {
|
|
|
64317
64855
|
segText = paraNewText.slice(newPos, newPos + origLen);
|
|
64318
64856
|
}
|
|
64319
64857
|
if (segText.length > 0) {
|
|
64320
|
-
const outSeg = copySegmentMetadata(origSeg, {
|
|
64858
|
+
const outSeg = copySegmentMetadata(isOriginalParagraph ? origSeg : undefined, {
|
|
64321
64859
|
text: segText,
|
|
64322
64860
|
style: { ...origSeg.style },
|
|
64323
64861
|
});
|
|
@@ -64341,7 +64879,7 @@ function remapTextToSegments(newText, originalSegments, elementTextStyle) {
|
|
|
64341
64879
|
});
|
|
64342
64880
|
}
|
|
64343
64881
|
if (remapped.length === 0) {
|
|
64344
|
-
const fallback = copySegmentMetadata(paraOrigSegments[0], {
|
|
64882
|
+
const fallback = copySegmentMetadata(isOriginalParagraph ? paraOrigSegments[0] : undefined, {
|
|
64345
64883
|
text: paraNewText,
|
|
64346
64884
|
style: { ...paraOrigSegments[0].style },
|
|
64347
64885
|
});
|
|
@@ -64354,21 +64892,33 @@ function remapTextToSegments(newText, originalSegments, elementTextStyle) {
|
|
|
64354
64892
|
}
|
|
64355
64893
|
const output = [];
|
|
64356
64894
|
const lastOrigPara = originalParagraphs[originalParagraphs.length - 1]?.segments;
|
|
64895
|
+
let precedingParagraph;
|
|
64357
64896
|
for (let pi = 0; pi < newParagraphTexts.length; pi++) {
|
|
64358
64897
|
if (pi > 0) {
|
|
64359
|
-
const precedingOrigPara = originalParagraphs[pi - 1]?.segments ?? [];
|
|
64898
|
+
const precedingOrigPara = originalParagraphs[paragraphSources[pi - 1] ?? -1]?.segments ?? [];
|
|
64360
64899
|
const breakStyle = precedingOrigPara[0]?.style
|
|
64361
64900
|
? { ...precedingOrigPara[0].style }
|
|
64362
64901
|
: { ...baseFallbackStyle };
|
|
64363
|
-
|
|
64364
|
-
|
|
64365
|
-
|
|
64366
|
-
|
|
64367
|
-
|
|
64368
|
-
|
|
64369
|
-
|
|
64902
|
+
const terminator = originalParagraphs[paragraphSources[pi - 1] ?? -1]?.terminator;
|
|
64903
|
+
output.push(terminator?.paragraphInsertionStyle && newParagraphTexts[pi - 1] === ''
|
|
64904
|
+
? { ...terminator, text: '\n', isParagraphBreak: true }
|
|
64905
|
+
: { text: '\n', style: breakStyle, isParagraphBreak: true });
|
|
64906
|
+
}
|
|
64907
|
+
const originalParagraph = originalParagraphs[paragraphSources[pi] ?? -1];
|
|
64908
|
+
const origPara = originalParagraph?.segments ?? precedingParagraph ?? lastOrigPara ?? [];
|
|
64909
|
+
let paraSegments = restoreParagraphMetadata(originalParagraph?.segments[0] ?? originalParagraph?.terminator, (originalParagraph &&
|
|
64910
|
+
remapEmptyParagraph(newParagraphTexts[pi], origPara, originalParagraph.terminator)) ??
|
|
64911
|
+
remapParagraph(newParagraphTexts[pi], origPara, originalParagraph !== undefined));
|
|
64912
|
+
// New items follow their local list, without inheriting paragraph spacing
|
|
64913
|
+
// or end-run properties reserved for an aligned original paragraph.
|
|
64914
|
+
if (!originalParagraph && precedingParagraph) {
|
|
64915
|
+
paraSegments = continueListParagraph(paraSegments, precedingParagraph);
|
|
64370
64916
|
}
|
|
64371
64917
|
output.push(...paraSegments);
|
|
64918
|
+
precedingParagraph = paraSegments;
|
|
64919
|
+
}
|
|
64920
|
+
if (paragraphSources.some((source, index) => source !== undefined && source !== index)) {
|
|
64921
|
+
return renumberRemappedParagraphs(output);
|
|
64372
64922
|
}
|
|
64373
64923
|
return output.length > 0 ? output : [{ text: '', style: { ...baseFallbackStyle } }];
|
|
64374
64924
|
}
|
|
@@ -66023,6 +66573,9 @@ function buildSegmentAttrs(seg) {
|
|
|
66023
66573
|
if (seg.endParaRunProperties) {
|
|
66024
66574
|
a.pr = JSON.stringify(seg.endParaRunProperties);
|
|
66025
66575
|
}
|
|
66576
|
+
if (seg.paragraphInsertionStyle) {
|
|
66577
|
+
a.pi = JSON.stringify(seg.paragraphInsertionStyle);
|
|
66578
|
+
}
|
|
66026
66579
|
if (typeof seg.fieldType === 'string') {
|
|
66027
66580
|
a.ft = seg.fieldType;
|
|
66028
66581
|
}
|
|
@@ -66148,6 +66701,14 @@ function decodeDelta(delta) {
|
|
|
66148
66701
|
/* skip */
|
|
66149
66702
|
}
|
|
66150
66703
|
}
|
|
66704
|
+
if (a.pi) {
|
|
66705
|
+
try {
|
|
66706
|
+
seg.paragraphInsertionStyle = JSON.parse(a.pi);
|
|
66707
|
+
}
|
|
66708
|
+
catch {
|
|
66709
|
+
/* skip */
|
|
66710
|
+
}
|
|
66711
|
+
}
|
|
66151
66712
|
if (a.ft) {
|
|
66152
66713
|
seg.fieldType = a.ft;
|
|
66153
66714
|
}
|
|
@@ -66381,6 +66942,7 @@ const COMPLEX_ELEMENT_FIELDS = {
|
|
|
66381
66942
|
children: '_ch',
|
|
66382
66943
|
paragraphIndents: '_pi',
|
|
66383
66944
|
rawXml: '_rx',
|
|
66945
|
+
inheritedTransform: '_it',
|
|
66384
66946
|
extLstXml: '_elx',
|
|
66385
66947
|
actionClick: '_ac',
|
|
66386
66948
|
actionHover: '_av',
|
|
@@ -77436,229 +77998,6 @@ function smartArtNodeLabel(node) {
|
|
|
77436
77998
|
};
|
|
77437
77999
|
}
|
|
77438
78000
|
|
|
77439
|
-
/**
|
|
77440
|
-
* Regular-text font sizes are stored in slide/CSS pixels in the shared model,
|
|
77441
|
-
* while PowerPoint's font controls and the preset list below use points.
|
|
77442
|
-
*/
|
|
77443
|
-
function textFontSizePxToPt(fontSizePx) {
|
|
77444
|
-
// DrawingML stores regular text sizes in hundredths of a point. Normalising
|
|
77445
|
-
// to that precision removes binary floating-point noise without discarding
|
|
77446
|
-
// valid authored values such as 10.5 pt or 48.1 pt.
|
|
77447
|
-
return Math.round(fontSizePx * (72 / 96) * 100) / 100;
|
|
77448
|
-
}
|
|
77449
|
-
/** Convert a PowerPoint font-control value in points to the model's pixels. */
|
|
77450
|
-
function textFontSizePtToPx(fontSizePt) {
|
|
77451
|
-
return fontSizePt * (96 / 72);
|
|
77452
|
-
}
|
|
77453
|
-
/**
|
|
77454
|
-
* Font families offered by the Home-tab font dropdown, alphabetically.
|
|
77455
|
-
*
|
|
77456
|
-
* Covers the families PowerPoint's own list leads with (the Office UI faces,
|
|
77457
|
-
* the Aptos family that replaced Calibri as the default theme font, and the
|
|
77458
|
-
* classic Windows/Mac core fonts) plus the handful of web faces decks
|
|
77459
|
-
* routinely arrive with. Entries the host cannot resolve simply fall back
|
|
77460
|
-
* through the CSS font stack, so listing a family costs nothing but gives the
|
|
77461
|
-
* user a name to pick when the deck already references it.
|
|
77462
|
-
*/
|
|
77463
|
-
const COMMON_FONT_FAMILIES = [
|
|
77464
|
-
'Abadi',
|
|
77465
|
-
'Aptos',
|
|
77466
|
-
'Aptos Display',
|
|
77467
|
-
'Arial',
|
|
77468
|
-
'Arial Black',
|
|
77469
|
-
'Arial Narrow',
|
|
77470
|
-
'Bahnschrift',
|
|
77471
|
-
'Book Antiqua',
|
|
77472
|
-
'Bookman Old Style',
|
|
77473
|
-
'Calibri',
|
|
77474
|
-
'Calibri Light',
|
|
77475
|
-
'Cambria',
|
|
77476
|
-
'Candara',
|
|
77477
|
-
'Century Gothic',
|
|
77478
|
-
'Comic Sans MS',
|
|
77479
|
-
'Consolas',
|
|
77480
|
-
'Corbel',
|
|
77481
|
-
'Courier New',
|
|
77482
|
-
'Franklin Gothic Book',
|
|
77483
|
-
'Franklin Gothic Medium',
|
|
77484
|
-
'Garamond',
|
|
77485
|
-
'Georgia',
|
|
77486
|
-
'Gill Sans MT',
|
|
77487
|
-
'Helvetica',
|
|
77488
|
-
'Impact',
|
|
77489
|
-
'Inter',
|
|
77490
|
-
'Lucida Console',
|
|
77491
|
-
'Lucida Sans Unicode',
|
|
77492
|
-
'Microsoft Sans Serif',
|
|
77493
|
-
'Montserrat',
|
|
77494
|
-
'Noto Sans',
|
|
77495
|
-
'Open Sans',
|
|
77496
|
-
'Palatino Linotype',
|
|
77497
|
-
'Poppins',
|
|
77498
|
-
'Roboto',
|
|
77499
|
-
'Rockwell',
|
|
77500
|
-
'Segoe UI',
|
|
77501
|
-
'Source Sans Pro',
|
|
77502
|
-
'Tahoma',
|
|
77503
|
-
'Times New Roman',
|
|
77504
|
-
'Trebuchet MS',
|
|
77505
|
-
'Tw Cen MT',
|
|
77506
|
-
'Verdana',
|
|
77507
|
-
];
|
|
77508
|
-
/** Font sizes (pt) offered by the Home-tab size dropdown. */
|
|
77509
|
-
const COMMON_FONT_SIZES = [
|
|
77510
|
-
8, 9, 10, 11, 12, 14, 16, 18, 20, 24, 28, 32, 36, 40, 44, 48, 54, 60, 72, 96,
|
|
77511
|
-
];
|
|
77512
|
-
/** Character-spacing presets for the toolbar dropdown. */
|
|
77513
|
-
const CHARACTER_SPACING_OPTIONS = [
|
|
77514
|
-
{ label: 'Very Tight', i18nKey: 'pptx.text.characterSpacingVeryTight', value: -150 },
|
|
77515
|
-
{ label: 'Tight', i18nKey: 'pptx.text.characterSpacingTight', value: -75 },
|
|
77516
|
-
{ label: 'Normal', i18nKey: 'pptx.text.characterSpacingNormal', value: 0 },
|
|
77517
|
-
{ label: 'Loose', i18nKey: 'pptx.text.characterSpacingLoose', value: 75 },
|
|
77518
|
-
{ label: 'Very Loose', i18nKey: 'pptx.text.characterSpacingVeryLoose', value: 150 },
|
|
77519
|
-
];
|
|
77520
|
-
/** Line-spacing presets for the paragraph dropdown. */
|
|
77521
|
-
const LINE_SPACING_OPTIONS$1 = [
|
|
77522
|
-
{ label: '1.0', value: 1.0 },
|
|
77523
|
-
{ label: '1.15', value: 1.15 },
|
|
77524
|
-
{ label: '1.5', value: 1.5 },
|
|
77525
|
-
{ label: '2.0', value: 2.0 },
|
|
77526
|
-
{ label: '2.5', value: 2.5 },
|
|
77527
|
-
{ label: '3.0', value: 3.0 },
|
|
77528
|
-
];
|
|
77529
|
-
/** Change-case options in menu order (matches PowerPoint's ordering). */
|
|
77530
|
-
const CHANGE_CASE_OPTIONS$1 = [
|
|
77531
|
-
{ value: 'sentence', i18nKey: 'pptx.text.changeCaseSentence' },
|
|
77532
|
-
{ value: 'lower', i18nKey: 'pptx.text.changeCaseLower' },
|
|
77533
|
-
{ value: 'upper', i18nKey: 'pptx.text.changeCaseUpper' },
|
|
77534
|
-
{ value: 'capitalize', i18nKey: 'pptx.text.changeCaseCapitalize' },
|
|
77535
|
-
{ value: 'toggle', i18nKey: 'pptx.text.changeCaseToggle' },
|
|
77536
|
-
];
|
|
77537
|
-
|
|
77538
|
-
/**
|
|
77539
|
-
* inspector-helpers.ts: Pure (no framework) helpers for the inspector panel.
|
|
77540
|
-
*
|
|
77541
|
-
* Readers extract display values from a PptxElement (with sensible defaults),
|
|
77542
|
-
* and patch builders produce shallow-merge-ready Partial<PptxElement> objects
|
|
77543
|
-
* for the binding's element-update path. Shared across React, Vue, and Angular.
|
|
77544
|
-
*/
|
|
77545
|
-
const DEFAULT_FILL = '#ffffff';
|
|
77546
|
-
const DEFAULT_STROKE = '#000000';
|
|
77547
|
-
const DEFAULT_TEXT_COLOR = '#000000';
|
|
77548
|
-
/**
|
|
77549
|
-
* PowerPoint's own presentation-level default text style (`p:defaultTextStyle
|
|
77550
|
-
* /a:lvl1pPr/a:defRPr@sz`) is 1800 (18pt), so a shape with no explicit font
|
|
77551
|
-
* size renders at 18pt in real PowerPoint, not 12pt. Kept as the last-resort
|
|
77552
|
-
* fallback below the deck's actual default when {@link fontSizeOf} is given one.
|
|
77553
|
-
*/
|
|
77554
|
-
const DEFAULT_FONT_SIZE$2 = 18;
|
|
77555
|
-
/**
|
|
77556
|
-
* Returns the fill colour of the element's shapeStyle, or a white default.
|
|
77557
|
-
* Only meaningful for elements that pass `hasShapeProperties`.
|
|
77558
|
-
*/
|
|
77559
|
-
function fillColorOf$1(el) {
|
|
77560
|
-
if (hasShapeProperties(el)) {
|
|
77561
|
-
return el.shapeStyle?.fillColor ?? DEFAULT_FILL;
|
|
77562
|
-
}
|
|
77563
|
-
return DEFAULT_FILL;
|
|
77564
|
-
}
|
|
77565
|
-
/**
|
|
77566
|
-
* Returns the stroke colour of the element's shapeStyle, or a black default.
|
|
77567
|
-
* Only meaningful for elements that pass `hasShapeProperties`.
|
|
77568
|
-
*/
|
|
77569
|
-
function strokeColorOf(el) {
|
|
77570
|
-
if (hasShapeProperties(el)) {
|
|
77571
|
-
return el.shapeStyle?.strokeColor ?? DEFAULT_STROKE;
|
|
77572
|
-
}
|
|
77573
|
-
return DEFAULT_STROKE;
|
|
77574
|
-
}
|
|
77575
|
-
/**
|
|
77576
|
-
* Returns the text colour from the element's textStyle, or a black default.
|
|
77577
|
-
* Only meaningful for elements that pass `hasTextProperties`.
|
|
77578
|
-
*/
|
|
77579
|
-
function textColorOf(el) {
|
|
77580
|
-
if (hasTextProperties(el)) {
|
|
77581
|
-
return el.textStyle?.color ?? DEFAULT_TEXT_COLOR;
|
|
77582
|
-
}
|
|
77583
|
-
return DEFAULT_TEXT_COLOR;
|
|
77584
|
-
}
|
|
77585
|
-
/**
|
|
77586
|
-
* Returns the font size (in points) from the element's textStyle.
|
|
77587
|
-
*
|
|
77588
|
-
* Falls back, in order, to: the deck's presentation-level default text style
|
|
77589
|
-
* (`p:defaultTextStyle`, passed as `presentationDefault` when the caller has
|
|
77590
|
-
* one), then `DEFAULT_FONT_SIZE` (18pt, matching PowerPoint's own
|
|
77591
|
-
* `a:lvl1pPr/a:defRPr@sz="1800"` when neither is available).
|
|
77592
|
-
*/
|
|
77593
|
-
function fontSizeOf(el, presentationDefault) {
|
|
77594
|
-
if (hasTextProperties(el) && el.textStyle?.fontSize !== undefined) {
|
|
77595
|
-
return textFontSizePxToPt(el.textStyle.fontSize);
|
|
77596
|
-
}
|
|
77597
|
-
const deckDefault = presentationDefault?.levelStyles?.[0]?.fontSize;
|
|
77598
|
-
return deckDefault === undefined ? DEFAULT_FONT_SIZE$2 : textFontSizePxToPt(deckDefault);
|
|
77599
|
-
}
|
|
77600
|
-
/** Returns whether the element's text is bold (false when absent). */
|
|
77601
|
-
function isBold(el) {
|
|
77602
|
-
if (hasTextProperties(el)) {
|
|
77603
|
-
return el.textStyle?.bold ?? false;
|
|
77604
|
-
}
|
|
77605
|
-
return false;
|
|
77606
|
-
}
|
|
77607
|
-
/** Returns whether the element's text is italic (false when absent). */
|
|
77608
|
-
function isItalic(el) {
|
|
77609
|
-
if (hasTextProperties(el)) {
|
|
77610
|
-
return el.textStyle?.italic ?? false;
|
|
77611
|
-
}
|
|
77612
|
-
return false;
|
|
77613
|
-
}
|
|
77614
|
-
/** Returns whether the element's text has underline (false when absent). */
|
|
77615
|
-
function isUnderline(el) {
|
|
77616
|
-
if (hasTextProperties(el)) {
|
|
77617
|
-
return el.textStyle?.underline ?? false;
|
|
77618
|
-
}
|
|
77619
|
-
return false;
|
|
77620
|
-
}
|
|
77621
|
-
/**
|
|
77622
|
-
* Builds a Partial<PptxElement> patch that merges the given changes into the
|
|
77623
|
-
* element's existing shapeStyle without dropping any other shapeStyle fields.
|
|
77624
|
-
*/
|
|
77625
|
-
function shapeStylePatch$1(el, changes) {
|
|
77626
|
-
const base = hasShapeProperties(el) ? (el.shapeStyle ?? {}) : {};
|
|
77627
|
-
return {
|
|
77628
|
-
shapeStyle: {
|
|
77629
|
-
...base,
|
|
77630
|
-
...changes,
|
|
77631
|
-
},
|
|
77632
|
-
};
|
|
77633
|
-
}
|
|
77634
|
-
/**
|
|
77635
|
-
* Builds a Partial<PptxElement> patch that merges the given changes into the
|
|
77636
|
-
* element's existing textStyle without dropping any other textStyle fields.
|
|
77637
|
-
*/
|
|
77638
|
-
function textStylePatch(el, changes) {
|
|
77639
|
-
const base = hasTextProperties(el) ? (el.textStyle ?? {}) : {};
|
|
77640
|
-
return {
|
|
77641
|
-
textStyle: {
|
|
77642
|
-
...base,
|
|
77643
|
-
...changes,
|
|
77644
|
-
},
|
|
77645
|
-
};
|
|
77646
|
-
}
|
|
77647
|
-
/** Apply an ordinary-text model pixel size to the element and all of its runs. */
|
|
77648
|
-
function textFontSizePatch(el, fontSize) {
|
|
77649
|
-
const patch = textStylePatch(el, { fontSize });
|
|
77650
|
-
if (!hasTextProperties(el) || !el.textSegments) {
|
|
77651
|
-
return patch;
|
|
77652
|
-
}
|
|
77653
|
-
return {
|
|
77654
|
-
...patch,
|
|
77655
|
-
textSegments: el.textSegments.map((segment) => ({
|
|
77656
|
-
...segment,
|
|
77657
|
-
style: { ...segment.style, fontSize },
|
|
77658
|
-
})),
|
|
77659
|
-
};
|
|
77660
|
-
}
|
|
77661
|
-
|
|
77662
78001
|
/**
|
|
77663
78002
|
* effects-shadow-helpers.ts: Pure (no framework) outer/inner shadow helpers
|
|
77664
78003
|
* for the effects panel.
|
|
@@ -80798,7 +81137,7 @@ function zoomOutPercent(percent) {
|
|
|
80798
81137
|
*
|
|
80799
81138
|
* The model here is one thing:
|
|
80800
81139
|
* - `zoom` is the USER's factor, where 1 means "whatever fits".
|
|
80801
|
-
* - `fitScale` is the viewport measurement the binding feeds in
|
|
81140
|
+
* - `fitScale` is the positive viewport measurement the binding feeds in.
|
|
80802
81141
|
* - `manual` records whether the user has taken control, which is what
|
|
80803
81142
|
* separates "reset to 100%" from "fit to viewport" without needing a
|
|
80804
81143
|
* sentinel value smuggled into the number.
|
|
@@ -82822,10 +83161,40 @@ function buildElementClipboardPayload(element, isTemplate) {
|
|
|
82822
83161
|
function cloneElementForPaste(element, options = {}) {
|
|
82823
83162
|
const clone = structuredClone(element);
|
|
82824
83163
|
const intoTemplate = options.intoTemplate ?? false;
|
|
82825
|
-
|
|
83164
|
+
const modelIds = new Map();
|
|
83165
|
+
const nativeIds = new Map();
|
|
83166
|
+
const mintId = (node) => {
|
|
83167
|
+
const id = makeCloneId(intoTemplate, element.id);
|
|
83168
|
+
modelIds.set(node.id, id);
|
|
83169
|
+
if (node.shapeId !== undefined) {
|
|
83170
|
+
nativeIds.set(node.shapeId, id);
|
|
83171
|
+
}
|
|
83172
|
+
// A clone is a new native shape too; save allocates IDs for its targets.
|
|
83173
|
+
delete node.shapeId;
|
|
83174
|
+
return id;
|
|
83175
|
+
};
|
|
83176
|
+
clone.id = mintId(clone);
|
|
82826
83177
|
// The root's ORIGINAL id decides the template store for the whole subtree,
|
|
82827
83178
|
// so a descendant that carries no prefix of its own cannot vote it elsewhere.
|
|
82828
|
-
reassignDescendantIds(clone,
|
|
83179
|
+
reassignDescendantIds(clone, mintId);
|
|
83180
|
+
const remapConnections = (node) => {
|
|
83181
|
+
if (node.type === 'group') {
|
|
83182
|
+
node.children.forEach(remapConnections);
|
|
83183
|
+
}
|
|
83184
|
+
if (node.type !== 'connector') {
|
|
83185
|
+
return;
|
|
83186
|
+
}
|
|
83187
|
+
for (const ref of [
|
|
83188
|
+
node.shapeStyle?.connectorStartConnection,
|
|
83189
|
+
node.shapeStyle?.connectorEndConnection,
|
|
83190
|
+
]) {
|
|
83191
|
+
if (!ref?.shapeId) {
|
|
83192
|
+
continue;
|
|
83193
|
+
}
|
|
83194
|
+
ref.shapeId = modelIds.get(ref.shapeId) ?? nativeIds.get(ref.shapeId) ?? ref.shapeId;
|
|
83195
|
+
}
|
|
83196
|
+
};
|
|
83197
|
+
remapConnections(clone);
|
|
82829
83198
|
clone.x += options.offsetX ?? PASTE_OFFSET_PX;
|
|
82830
83199
|
clone.y += options.offsetY ?? PASTE_OFFSET_PX;
|
|
82831
83200
|
return clone;
|
|
@@ -83278,6 +83647,7 @@ const GUARD_DEFAULTS$1 = {
|
|
|
83278
83647
|
canEdit: true,
|
|
83279
83648
|
isPresenting: false,
|
|
83280
83649
|
hasSelection: false,
|
|
83650
|
+
canPaste: true,
|
|
83281
83651
|
isEditingText: false,
|
|
83282
83652
|
isDrawing: false,
|
|
83283
83653
|
isTextInputTarget: false,
|
|
@@ -83379,6 +83749,9 @@ function mapEditorKey(input, guard = {}) {
|
|
|
83379
83749
|
if (mod && !alt) {
|
|
83380
83750
|
const chord = resolveChord(key, Boolean(input.shiftKey), state.hasSelection);
|
|
83381
83751
|
if (chord) {
|
|
83752
|
+
if (chord.action === 'paste' && state.canPaste === false) {
|
|
83753
|
+
return NO_ACTION$1;
|
|
83754
|
+
}
|
|
83382
83755
|
return chord;
|
|
83383
83756
|
}
|
|
83384
83757
|
}
|
|
@@ -89865,6 +90238,17 @@ const COMMON_FONTS = [
|
|
|
89865
90238
|
'Verdana',
|
|
89866
90239
|
];
|
|
89867
90240
|
|
|
90241
|
+
/** Prepare a caller-owned model for insertion into an ordinary editable slide. */
|
|
90242
|
+
function prepareElementForInsertion(element, target) {
|
|
90243
|
+
if (!target.canEdit ||
|
|
90244
|
+
target.mode !== 'edit' ||
|
|
90245
|
+
!target.hasActiveSlide ||
|
|
90246
|
+
target.editTemplateMode) {
|
|
90247
|
+
return undefined;
|
|
90248
|
+
}
|
|
90249
|
+
return cloneElementForPaste(element, { offsetX: 0, offsetY: 0 });
|
|
90250
|
+
}
|
|
90251
|
+
|
|
89868
90252
|
/**
|
|
89869
90253
|
* Clone a `PptxHeaderFooter` into a fresh draft object for the Header & Footer
|
|
89870
90254
|
* dialog to mutate locally, without touching the committed value until the
|
|
@@ -95968,10 +96352,19 @@ function resolveSlideSizeRescaleTransform(oldSize, newSize, mode) {
|
|
|
95968
96352
|
}
|
|
95969
96353
|
/** Scale every font size an element's own text style carries, in place on a shallow copy. */
|
|
95970
96354
|
function scaleTextSegment(segment, scale) {
|
|
95971
|
-
|
|
96355
|
+
const insertion = segment.paragraphInsertionStyle;
|
|
96356
|
+
if (typeof segment.style.fontSize !== 'number' && typeof insertion?.fontSize !== 'number') {
|
|
95972
96357
|
return segment;
|
|
95973
96358
|
}
|
|
95974
|
-
return {
|
|
96359
|
+
return {
|
|
96360
|
+
...segment,
|
|
96361
|
+
...(typeof segment.style.fontSize === 'number'
|
|
96362
|
+
? { style: { ...segment.style, fontSize: segment.style.fontSize * scale } }
|
|
96363
|
+
: {}),
|
|
96364
|
+
...(typeof insertion?.fontSize === 'number'
|
|
96365
|
+
? { paragraphInsertionStyle: { ...insertion, fontSize: insertion.fontSize * scale } }
|
|
96366
|
+
: {}),
|
|
96367
|
+
};
|
|
95975
96368
|
}
|
|
95976
96369
|
/**
|
|
95977
96370
|
* Scale an element's font sizes (its own `textStyle.fontSize` and every
|
|
@@ -97344,6 +97737,62 @@ function wrapForeignObjectSvg(bodyMarkup, tile) {
|
|
|
97344
97737
|
`viewBox="${viewBoxX} ${viewBoxY} ${viewBoxWidth} ${viewBoxHeight}">${bodyMarkup}</svg>`);
|
|
97345
97738
|
}
|
|
97346
97739
|
|
|
97740
|
+
const DEFAULTS$1 = {
|
|
97741
|
+
fitPadding: { horizontal: 0, vertical: 0 },
|
|
97742
|
+
maxFitScale: null,
|
|
97743
|
+
};
|
|
97744
|
+
function validPadding(value, fallback) {
|
|
97745
|
+
return Number.isFinite(value) && value >= 0 ? value : fallback;
|
|
97746
|
+
}
|
|
97747
|
+
/** Normalize once for both fit measurement and a binding's physical viewport CSS. */
|
|
97748
|
+
function resolveViewportFitOptions(options = {}, defaults = DEFAULTS$1) {
|
|
97749
|
+
const base = typeof defaults.fitPadding === 'number'
|
|
97750
|
+
? { horizontal: defaults.fitPadding, vertical: defaults.fitPadding }
|
|
97751
|
+
: defaults.fitPadding;
|
|
97752
|
+
const padding = options.fitPadding ?? base;
|
|
97753
|
+
const horizontal = typeof padding === 'number' ? padding : padding.horizontal;
|
|
97754
|
+
const vertical = typeof padding === 'number' ? padding : padding.vertical;
|
|
97755
|
+
const cap = options.maxFitScale;
|
|
97756
|
+
return {
|
|
97757
|
+
fitPadding: {
|
|
97758
|
+
horizontal: validPadding(horizontal, base.horizontal),
|
|
97759
|
+
vertical: validPadding(vertical, base.vertical),
|
|
97760
|
+
},
|
|
97761
|
+
maxFitScale: cap === null
|
|
97762
|
+
? null
|
|
97763
|
+
: typeof cap === 'number' && Number.isFinite(cap) && cap > 0
|
|
97764
|
+
? cap
|
|
97765
|
+
: defaults.maxFitScale,
|
|
97766
|
+
};
|
|
97767
|
+
}
|
|
97768
|
+
/** Calculate fit only: the user's zoom factor is applied separately by the viewer. */
|
|
97769
|
+
function calculateViewportFit(input, defaults = DEFAULTS$1) {
|
|
97770
|
+
const { fitPadding, maxFitScale } = resolveViewportFitOptions(input, defaults);
|
|
97771
|
+
const availableWidth = Math.max(0, validPadding(input.viewportWidth, 0) -
|
|
97772
|
+
2 * fitPadding.horizontal -
|
|
97773
|
+
validPadding(input.horizontalGutter ?? 0, 0));
|
|
97774
|
+
const availableHeight = Math.max(0, validPadding(input.viewportHeight, 0) -
|
|
97775
|
+
2 * fitPadding.vertical -
|
|
97776
|
+
validPadding(input.verticalGutter ?? 0, 0));
|
|
97777
|
+
const fallback = typeof input.fallbackScale === 'number' &&
|
|
97778
|
+
Number.isFinite(input.fallbackScale) &&
|
|
97779
|
+
input.fallbackScale > 0
|
|
97780
|
+
? input.fallbackScale
|
|
97781
|
+
: 1;
|
|
97782
|
+
const validCanvas = Number.isFinite(input.canvasWidth) &&
|
|
97783
|
+
input.canvasWidth > 0 &&
|
|
97784
|
+
Number.isFinite(input.canvasHeight) &&
|
|
97785
|
+
input.canvasHeight > 0;
|
|
97786
|
+
const scale = availableWidth > 0 && availableHeight > 0 && validCanvas
|
|
97787
|
+
? Math.min(availableWidth / input.canvasWidth, availableHeight / input.canvasHeight, maxFitScale ?? Number.POSITIVE_INFINITY)
|
|
97788
|
+
: fallback;
|
|
97789
|
+
return {
|
|
97790
|
+
scale: Number.isFinite(scale) && scale > 0 ? scale : fallback,
|
|
97791
|
+
availableWidth,
|
|
97792
|
+
availableHeight,
|
|
97793
|
+
};
|
|
97794
|
+
}
|
|
97795
|
+
|
|
97347
97796
|
/**
|
|
97348
97797
|
* Framework-agnostic rendering & editing helpers shared by the React, Vue, and
|
|
97349
97798
|
* Angular `pptx-viewer` bindings. Pure TypeScript (no framework imports) — each
|
|
@@ -103564,7 +104013,7 @@ function createLocalStorageBackend(namespace) {
|
|
|
103564
104013
|
/** Try IndexedDB first; fall back to localStorage on any failure. */
|
|
103565
104014
|
async function resolveBackend(dbName, namespace) {
|
|
103566
104015
|
try {
|
|
103567
|
-
const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-
|
|
104016
|
+
const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-DjOCNjw-.mjs');
|
|
103568
104017
|
const db = await openChatDb(dbName);
|
|
103569
104018
|
return createIdbBackend(db);
|
|
103570
104019
|
}
|
|
@@ -104301,10 +104750,7 @@ function applyTextUpdate(el, u) {
|
|
|
104301
104750
|
// visibly restyles instead of only the (unused) element-level fallback.
|
|
104302
104751
|
textEl.textStyle = { ...textEl.textStyle, ...textStyle };
|
|
104303
104752
|
if (textEl.textSegments) {
|
|
104304
|
-
textEl.textSegments = textEl.textSegments.map((seg) => (
|
|
104305
|
-
...seg,
|
|
104306
|
-
style: { ...seg.style, ...textStyle },
|
|
104307
|
-
}));
|
|
104753
|
+
textEl.textSegments = textEl.textSegments.map((seg) => updateTextSegmentStyle(seg, textStyle));
|
|
104308
104754
|
}
|
|
104309
104755
|
}
|
|
104310
104756
|
/** Apply fill/stroke updates when the element carries a shape style. */
|
|
@@ -113964,8 +114410,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
113964
114410
|
|
|
113965
114411
|
/**
|
|
113966
114412
|
* canvas-fit.service.ts: Auto-fit scale measurement for `SlideCanvasComponent`.
|
|
113967
|
-
* Computes the largest scale (
|
|
113968
|
-
* viewport, reserving
|
|
114413
|
+
* Computes the largest scale (capped at 1 by default) fitting its scroll
|
|
114414
|
+
* viewport, reserving host-configurable decorative padding, so the parent's `zoom`
|
|
113969
114415
|
* input means "100% of fit" rather than "100% of the authored slide size".
|
|
113970
114416
|
* Thumbnail consumers (slides panel, slide sorter) set `autoFit` false and
|
|
113971
114417
|
* manage their own scale via `zoom` instead.
|
|
@@ -113981,7 +114427,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
113981
114427
|
class CanvasFitService {
|
|
113982
114428
|
constructor() {
|
|
113983
114429
|
/**
|
|
113984
|
-
* Auto-fit scale (
|
|
114430
|
+
* Auto-fit scale (capped at 1 by default): how the fixed-size slide fits
|
|
113985
114431
|
* the scroll viewport. The authored slide is e.g. 1280x720, which overflows
|
|
113986
114432
|
* a phone; without this it renders off-screen at `zoom=1`.
|
|
113987
114433
|
*/
|
|
@@ -114014,14 +114460,14 @@ class CanvasFitService {
|
|
|
114014
114460
|
this.fitScale.set(1);
|
|
114015
114461
|
return;
|
|
114016
114462
|
}
|
|
114017
|
-
const
|
|
114018
|
-
|
|
114019
|
-
|
|
114020
|
-
|
|
114021
|
-
|
|
114022
|
-
|
|
114023
|
-
|
|
114024
|
-
this.fitScale.set(fit
|
|
114463
|
+
const fit = calculateViewportFit({
|
|
114464
|
+
viewportWidth: el.clientWidth,
|
|
114465
|
+
viewportHeight: el.clientHeight,
|
|
114466
|
+
canvasWidth: size.width,
|
|
114467
|
+
canvasHeight: size.height,
|
|
114468
|
+
...this.host.fitOptions?.(),
|
|
114469
|
+
}, { fitPadding: { horizontal: 8, vertical: 16 }, maxFitScale: 1 });
|
|
114470
|
+
this.fitScale.set(fit.scale);
|
|
114025
114471
|
}
|
|
114026
114472
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CanvasFitService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
114027
114473
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: CanvasFitService }); }
|
|
@@ -123638,6 +124084,12 @@ class SlideCanvasComponent {
|
|
|
123638
124084
|
...(ngDevMode ? [{ debugName: "mediaDataUrls" }] : /* istanbul ignore next */ []));
|
|
123639
124085
|
this.zoom = input(1, /* @ts-ignore */
|
|
123640
124086
|
...(ngDevMode ? [{ debugName: "zoom" }] : /* istanbul ignore next */ []));
|
|
124087
|
+
/** Unscaled padding on each side; omission keeps the existing fit allowance. */
|
|
124088
|
+
this.fitPadding = input(undefined, /* @ts-ignore */
|
|
124089
|
+
...(ngDevMode ? [{ debugName: "fitPadding" }] : /* istanbul ignore next */ []));
|
|
124090
|
+
/** Fit-factor ceiling, independent of user zoom; null permits enlargement. */
|
|
124091
|
+
this.maxFitScale = input(undefined, /* @ts-ignore */
|
|
124092
|
+
...(ngDevMode ? [{ debugName: "maxFitScale" }] : /* istanbul ignore next */ []));
|
|
123641
124093
|
/** When true, elements are selectable and drag/resize handles are shown. */
|
|
123642
124094
|
this.editable = input(false, /* @ts-ignore */
|
|
123643
124095
|
...(ngDevMode ? [{ debugName: "editable" }] : /* istanbul ignore next */ []));
|
|
@@ -124187,10 +124639,13 @@ class SlideCanvasComponent {
|
|
|
124187
124639
|
autoFit: () => this.autoFit(),
|
|
124188
124640
|
viewportElement: () => this.viewportRef()?.nativeElement,
|
|
124189
124641
|
canvasSize: () => this.canvasSize(),
|
|
124642
|
+
fitOptions: () => ({ fitPadding: this.fitPadding(), maxFitScale: this.maxFitScale() }),
|
|
124190
124643
|
});
|
|
124191
124644
|
// Re-fit whenever the authored slide size changes (e.g. switching decks).
|
|
124192
124645
|
effect(() => {
|
|
124193
124646
|
this.canvasSize();
|
|
124647
|
+
this.fitPadding();
|
|
124648
|
+
this.maxFitScale();
|
|
124194
124649
|
this.canvasFit.recompute();
|
|
124195
124650
|
});
|
|
124196
124651
|
// Keep every delegated element renderer aligned with the shared role/name
|
|
@@ -124870,7 +125325,7 @@ class SlideCanvasComponent {
|
|
|
124870
125325
|
}
|
|
124871
125326
|
}
|
|
124872
125327
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SlideCanvasComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
124873
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", 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 }, rulerUnit: { classPropertyName: "rulerUnit", publicName: "rulerUnit", 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 }, gridSpacing: { classPropertyName: "gridSpacing", publicName: "gridSpacing", isSignal: true, isRequired: false, transformFunction: null }, snapToShape: { classPropertyName: "snapToShape", publicName: "snapToShape", isSignal: true, isRequired: false, transformFunction: null }, guideCommand: { classPropertyName: "guideCommand", publicName: "guideCommand", isSignal: true, isRequired: false, transformFunction: null }, spellCheck: { classPropertyName: "spellCheck", publicName: "spellCheck", 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 }, transparentBackground: { classPropertyName: "transparentBackground", publicName: "transparentBackground", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, exposeElementIds: { classPropertyName: "exposeElementIds", publicName: "exposeElementIds", 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 }, aiHighlights: { classPropertyName: "aiHighlights", publicName: "aiHighlights", isSignal: true, isRequired: false, transformFunction: null }, aiActive: { classPropertyName: "aiActive", publicName: "aiActive", isSignal: true, isRequired: false, transformFunction: null }, aiActiveSlideIndex: { classPropertyName: "aiActiveSlideIndex", publicName: "aiActiveSlideIndex", isSignal: true, isRequired: false, transformFunction: null }, aiChangeBatch: { classPropertyName: "aiChangeBatch", publicName: "aiChangeBatch", isSignal: true, isRequired: false, transformFunction: null }, aiPickMode: { classPropertyName: "aiPickMode", publicName: "aiPickMode", 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", transformEnd: "transformEnd", adjustUpdate: "adjustUpdate", connectorEndpointUpdate: "connectorEndpointUpdate", contextMenu: "contextMenu", textEditStart: "textEditStart", textCommit: "textCommit", textInput: "textInput", 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: [
|
|
125328
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", 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 }, fitPadding: { classPropertyName: "fitPadding", publicName: "fitPadding", isSignal: true, isRequired: false, transformFunction: null }, maxFitScale: { classPropertyName: "maxFitScale", publicName: "maxFitScale", 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 }, rulerUnit: { classPropertyName: "rulerUnit", publicName: "rulerUnit", 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 }, gridSpacing: { classPropertyName: "gridSpacing", publicName: "gridSpacing", isSignal: true, isRequired: false, transformFunction: null }, snapToShape: { classPropertyName: "snapToShape", publicName: "snapToShape", isSignal: true, isRequired: false, transformFunction: null }, guideCommand: { classPropertyName: "guideCommand", publicName: "guideCommand", isSignal: true, isRequired: false, transformFunction: null }, spellCheck: { classPropertyName: "spellCheck", publicName: "spellCheck", 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 }, transparentBackground: { classPropertyName: "transparentBackground", publicName: "transparentBackground", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, exposeElementIds: { classPropertyName: "exposeElementIds", publicName: "exposeElementIds", 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 }, aiHighlights: { classPropertyName: "aiHighlights", publicName: "aiHighlights", isSignal: true, isRequired: false, transformFunction: null }, aiActive: { classPropertyName: "aiActive", publicName: "aiActive", isSignal: true, isRequired: false, transformFunction: null }, aiActiveSlideIndex: { classPropertyName: "aiActiveSlideIndex", publicName: "aiActiveSlideIndex", isSignal: true, isRequired: false, transformFunction: null }, aiChangeBatch: { classPropertyName: "aiChangeBatch", publicName: "aiChangeBatch", isSignal: true, isRequired: false, transformFunction: null }, aiPickMode: { classPropertyName: "aiPickMode", publicName: "aiPickMode", 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", transformEnd: "transformEnd", adjustUpdate: "adjustUpdate", connectorEndpointUpdate: "connectorEndpointUpdate", contextMenu: "contextMenu", textEditStart: "textEditStart", textCommit: "textCommit", textInput: "textInput", 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: [
|
|
124874
125329
|
CanvasFitService,
|
|
124875
125330
|
InkDrawingService,
|
|
124876
125331
|
RulerGuidesService,
|
|
@@ -124898,7 +125353,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
124898
125353
|
AiChangeOverlayComponent,
|
|
124899
125354
|
ActiveXControlsOverlayComponent,
|
|
124900
125355
|
], template: "<div\n\t#viewport\n\tclass=\"pptx-ng-canvas-viewport\"\n\t[attr.data-pptx-viewport]=\"interactive() ? '' : null\"\n\t(pointerdown)=\"onViewportPointerDown($event)\"\n>\n\t<div class=\"pptx-ng-canvas-wrapper\" [ngStyle]=\"wrapperStyle()\">\n\t\t<div\n\t\t\t#stage\n\t\t\tclass=\"pptx-ng-canvas-stage\"\n\t\t\t[class.is-editable]=\"editable()\"\n\t\t\trole=\"region\"\n\t\t\t[attr.aria-roledescription]=\"interactive() || presenting() ? 'slide' : null\"\n\t\t\t[attr.data-pptx-ai-active]=\"aiActive() ? 'true' : null\"\n\t\t\t[ngStyle]=\"stageStyle()\"\n\t\t\t(pointerdown)=\"onStagePointerDown($event)\"\n\t\t\t(contextmenu)=\"onContextMenu($event)\"\n\t\t\t(dblclick)=\"onDblClick($event)\"\n\t\t>\n\t\t\t<!--\n\t\t\t\tTemplate layer: inherited master/layout elements, rendered BEHIND\n\t\t\t\tthe slide's own elements (lower z-index). Interactive + given the\n\t\t\t\tamber editable affordance only while editTemplateMode is on; when\n\t\t\t\toff they render inertly with no affordance, exactly as core\n\t\t\t\tdelivered them. `marked` keeps the data-pptx-element contract on\n\t\t\t\tthem even while locked: the marker means \"rendered slide element\",\n\t\t\t\tnot \"editable right now\".\n\t\t\t-->\n\t\t\t@for (element of visibleTemplateElements(); track element.id; let i = $index) {\n\t\t\t\t<pptx-element-renderer\n\t\t\t\t\t[element]=\"element\"\n\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t[zIndex]=\"i\"\n\t\t\t\t\t[obstacles]=\"connectorObstacles()\"\n\t\t\t\t\t[canvasWidth]=\"canvasSize().width\"\n\t\t\t\t\t[canvasHeight]=\"canvasSize().height\"\n\t\t\t\t\t[interactive]=\"interactive() && editTemplateMode()\"\n\t\t\t\t\t[marked]=\"interactive()\"\n\t\t\t\t\t[exposeElementId]=\"exposeElementIds()\"\n\t\t\t\t\t[editable]=\"editable() && editTemplateMode()\"\n\t\t\t\t\t[fieldContext]=\"fieldContext()\"\n\t\t\t\t\t[slideElements]=\"allElements()\"\n\t\t\t\t\t[editTemplateMode]=\"editTemplateMode()\"\n\t\t\t\t\t[editingElementId]=\"editingId()\"\n\t\t\t\t\t(cellCommit)=\"cellCommit.emit($event)\"\n\t\t\t\t\t(tableChange)=\"tableChange.emit($event)\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@for (element of elements(); track element.id; let i = $index) {\n\t\t\t\t<pptx-element-renderer\n\t\t\t\t\t[element]=\"element\"\n\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t[zIndex]=\"visibleTemplateElements().length + i\"\n\t\t\t\t\t[obstacles]=\"connectorObstacles()\"\n\t\t\t\t\t[canvasWidth]=\"canvasSize().width\"\n\t\t\t\t\t[canvasHeight]=\"canvasSize().height\"\n\t\t\t\t\t[interactive]=\"interactive()\"\n\t\t\t\t\t[exposeElementId]=\"exposeElementIds()\"\n\t\t\t\t\t[presenting]=\"presenting()\"\n\t\t\t\t\t[editable]=\"editable()\"\n\t\t\t\t\t[fieldContext]=\"fieldContext()\"\n\t\t\t\t\t[slideElements]=\"allElements()\"\n\t\t\t\t\t[editTemplateMode]=\"false\"\n\t\t\t\t\t[editingElementId]=\"editingId()\"\n\t\t\t\t\t(cellCommit)=\"cellCommit.emit($event)\"\n\t\t\t\t\t(tableChange)=\"tableChange.emit($event)\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t<pptx-activex-controls-overlay\n\t\t\t\t[controls]=\"slide()?.activeXControls ?? []\"\n\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t/>\n\t\t\t@if (aiHighlights().length > 0 || aiActive()) {\n\t\t\t\t<pptx-ai-focus-highlight-overlay\n\t\t\t\t\t[highlights]=\"aiHighlights()\"\n\t\t\t\t\t[elements]=\"elements()\"\n\t\t\t\t\t[activeSlideIndex]=\"aiActiveSlideIndex()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@if (aiChangeBatch(); as batch) {\n\t\t\t\t<pptx-ai-change-overlay [batch]=\"batch\" [activeSlideIndex]=\"aiActiveSlideIndex()\" />\n\t\t\t}\n\t\t\t@for (box of selectionBoxes(); track box.id) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-selection\"\n\t\t\t\t\t[style.left.px]=\"box.x\"\n\t\t\t\t\t[style.top.px]=\"box.y\"\n\t\t\t\t\t[style.width.px]=\"box.width\"\n\t\t\t\t\t[style.height.px]=\"box.height\"\n\t\t\t\t></div>\n\t\t\t}\n\t\t\t@for (h of handleBoxes(); track h.handle) {\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-handle\"\n\t\t\t\t\t[attr.aria-label]=\"'pptx.selectionOverlay.resize' | translate: { handle: h.handle }\"\n\t\t\t\t\t[style.left.px]=\"h.left\"\n\t\t\t\t\t[style.top.px]=\"h.top\"\n\t\t\t\t\t[style.width.px]=\"h.size\"\n\t\t\t\t\t[style.height.px]=\"h.size\"\n\t\t\t\t\t[style.cursor]=\"h.cursor\"\n\t\t\t\t\t(pointerdown)=\"onHandlePointerDown($event, h.handle)\"\n\t\t\t\t\t(keydown)=\"onResizeHandleKeydown($event, h.handle)\"\n\t\t\t\t></button>\n\t\t\t}\n\t\t\t@if (marqueeRect(); as mr) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-marquee\"\n\t\t\t\t\t[style.left.px]=\"mr.x\"\n\t\t\t\t\t[style.top.px]=\"mr.y\"\n\t\t\t\t\t[style.width.px]=\"mr.width\"\n\t\t\t\t\t[style.height.px]=\"mr.height\"\n\t\t\t\t></div>\n\t\t\t}\n\t\t\t@for (g of snapGuides(); track $index) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-snap-guide\"\n\t\t\t\t\t[style.left.px]=\"g.axis === 'x' ? g.pos : g.start\"\n\t\t\t\t\t[style.top.px]=\"g.axis === 'x' ? g.start : g.pos\"\n\t\t\t\t\t[style.width.px]=\"g.axis === 'x' ? 0 : g.end - g.start\"\n\t\t\t\t\t[style.height.px]=\"g.axis === 'x' ? g.end - g.start : 0\"\n\t\t\t\t></div>\n\t\t\t}\n\t\t\t@if (rotateHandle(); as rh) {\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-rotate-handle\"\n\t\t\t\t\t[attr.aria-label]=\"'pptx.selectionOverlay.rotate' | translate\"\n\t\t\t\t\t[style.left.px]=\"rh.left\"\n\t\t\t\t\t[style.top.px]=\"rh.top\"\n\t\t\t\t\t[style.width.px]=\"rh.size\"\n\t\t\t\t\t[style.height.px]=\"rh.size\"\n\t\t\t\t\t(pointerdown)=\"onRotatePointerDown($event)\"\n\t\t\t\t\t(keydown)=\"onRotateHandleKeydown($event)\"\n\t\t\t\t></button>\n\t\t\t}\n\t\t\t<!--\n\t\t\t\tShape-adjustment affordances (amber diamonds), ONE per `a:avLst`\n\t\t\t\tguide. Existence, position and cursor all come from the SHARED\n\t\t\t\t`getShapeAdjustmentHandleDescriptors`, so they appear only for a\n\t\t\t\tgeometry with an adjustable parameter, sit where the other four\n\t\t\t\tbindings put them, and are absent for a shape locked with\n\t\t\t\t`noAdjustHandles`. Dragging one writes `shapeAdjustments`; it does\n\t\t\t\tNOT resize the element.\n\t\t\t-->\n\t\t\t@for (ah of adjustHandles(); track ah.key) {\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-adjust-handle\"\n\t\t\t\t\t[attr.data-pptx-adjust-key]=\"ah.key\"\n\t\t\t\t\t[attr.aria-label]=\"'pptx.selectionOverlay.adjust' | translate\"\n\t\t\t\t\t[style.left.px]=\"ah.left\"\n\t\t\t\t\t[style.top.px]=\"ah.top\"\n\t\t\t\t\t[style.width.px]=\"ah.size\"\n\t\t\t\t\t[style.height.px]=\"ah.size\"\n\t\t\t\t\t[style.cursor]=\"ah.cursor\"\n\t\t\t\t\t(pointerdown)=\"onAdjustPointerDown($event, ah)\"\n\t\t\t\t></button>\n\t\t\t}\n\t\t\t<!--\n\t\t\t\tConnector endpoint authoring: drag an end onto a shape's connection\n\t\t\t\tpoint to bind it (`a:stCxn` / `a:endCxn`), or off one to detach.\n\t\t\t\tCandidate sites are revealed only while an end is in flight so they\n\t\t\t\tnever obscure the deck at rest.\n\t\t\t-->\n\t\t\t@for (site of connectorSiteCandidates(); track site.key) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-connection-site\"\n\t\t\t\t\t[class.is-snapped]=\"site.snapped\"\n\t\t\t\t\tdata-pptx-connection-site\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t[style.left.px]=\"site.left\"\n\t\t\t\t\t[style.top.px]=\"site.top\"\n\t\t\t\t\t[style.width.px]=\"site.size\"\n\t\t\t\t\t[style.height.px]=\"site.size\"\n\t\t\t\t></div>\n\t\t\t}\n\t\t\t@for (ep of connectorEndpoints(); track ep.kind) {\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-connector-endpoint\"\n\t\t\t\t\t[class.is-attached]=\"ep.attached\"\n\t\t\t\t\t[attr.data-pptx-connector-endpoint]=\"ep.kind\"\n\t\t\t\t\t[attr.data-pptx-connector-attached]=\"ep.attached\"\n\t\t\t\t\t[attr.aria-label]=\"\n\t\t\t\t\t\t(ep.kind === 'start'\n\t\t\t\t\t\t\t? 'pptx.canvas.connectorEndpointStart'\n\t\t\t\t\t\t\t: 'pptx.canvas.connectorEndpointEnd'\n\t\t\t\t\t\t) | translate\n\t\t\t\t\t\"\n\t\t\t\t\t[style.left.px]=\"ep.left\"\n\t\t\t\t\t[style.top.px]=\"ep.top\"\n\t\t\t\t\t[style.width.px]=\"ep.size\"\n\t\t\t\t\t[style.height.px]=\"ep.size\"\n\t\t\t\t\t(pointerdown)=\"onConnectorEndpointPointerDown($event, ep.kind)\"\n\t\t\t\t></button>\n\t\t\t}\n\t\t\t@if (editingBox(); as eb) {\n\t\t\t\t<textarea\n\t\t\t\t\t#textEditor\n\t\t\t\t\tdata-inline-editor\n\t\t\t\t\tclass=\"pptx-ng-text-editor\"\n\t\t\t\t\taria-label=\"Edit slide text\"\n\t\t\t\t\t[spellcheck]=\"spellCheck()\"\n\t\t\t\t\t[style.left.px]=\"eb.x\"\n\t\t\t\t\t[style.top.px]=\"eb.y\"\n\t\t\t\t\t[style.width.px]=\"eb.width\"\n\t\t\t\t\t[style.height.px]=\"eb.height\"\n\t\t\t\t\t(pointerdown)=\"$event.stopPropagation()\"\n\t\t\t\t\t(input)=\"onTextInput($event, eb.id)\"\n\t\t\t\t\t(blur)=\"commitText($event, eb.id)\"\n\t\t\t\t\t(keydown)=\"onEditorKeydown($event)\"\n\t\t\t\t></textarea>\n\t\t\t}\n\n\t\t\t<!--\n\t\t\t\tView overlays: editor aids only, never on thumbnails/preview/presentation.\n\t\t\t\tAll are pointer-events:none so they never break selection/drag.\n\t\t\t\tNone carry data-pptx-element / aria-roledescription / data-pptx-viewport.\n\t\t\t-->\n\t\t\t@if (interactive() && showGrid()) {\n\t\t\t\t<svg\n\t\t\t\t\tclass=\"pptx-ng-overlay-grid\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t[attr.width]=\"canvasSize().width\"\n\t\t\t\t\t[attr.height]=\"canvasSize().height\"\n\t\t\t\t>\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t<pattern\n\t\t\t\t\t\t\t[attr.id]=\"gridPatternId\"\n\t\t\t\t\t\t\t[attr.width]=\"gridSpacingPx()\"\n\t\t\t\t\t\t\t[attr.height]=\"gridSpacingPx()\"\n\t\t\t\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t\t[attr.cx]=\"gridSpacingPx() / 2\"\n\t\t\t\t\t\t\t\t[attr.cy]=\"gridSpacingPx() / 2\"\n\t\t\t\t\t\t\t\tr=\"0.6\"\n\t\t\t\t\t\t\t\tfill=\"rgba(156,163,175,0.55)\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</pattern>\n\t\t\t\t\t</defs>\n\t\t\t\t\t<rect\n\t\t\t\t\t\t[attr.width]=\"canvasSize().width\"\n\t\t\t\t\t\t[attr.height]=\"canvasSize().height\"\n\t\t\t\t\t\t[attr.fill]=\"'url(#' + gridPatternId + ')'\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t}\n\n\t\t\t@if (interactive() && showGuides()) {\n\t\t\t\t<!--\n\t\t\t\t\tCenter crosshair: one horizontal line and one vertical line\n\t\t\t\t\tthrough the midpoint of the slide. Static; draggable guides\n\t\t\t\t\tare a follow-up.\n\t\t\t\t-->\n\t\t\t\t<svg\n\t\t\t\t\tclass=\"pptx-ng-overlay-guides\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t[attr.width]=\"canvasSize().width\"\n\t\t\t\t\t[attr.height]=\"canvasSize().height\"\n\t\t\t\t>\n\t\t\t\t\t<!-- Horizontal center guide -->\n\t\t\t\t\t<line\n\t\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t\t[attr.y1]=\"canvasSize().height / 2\"\n\t\t\t\t\t\t[attr.x2]=\"canvasSize().width\"\n\t\t\t\t\t\t[attr.y2]=\"canvasSize().height / 2\"\n\t\t\t\t\t\tstroke=\"rgba(99,102,241,0.7)\"\n\t\t\t\t\t\tstroke-width=\"1\"\n\t\t\t\t\t\tstroke-dasharray=\"6 3\"\n\t\t\t\t\t/>\n\t\t\t\t\t<!-- Vertical center guide -->\n\t\t\t\t\t<line\n\t\t\t\t\t\t[attr.x1]=\"canvasSize().width / 2\"\n\t\t\t\t\t\ty1=\"0\"\n\t\t\t\t\t\t[attr.x2]=\"canvasSize().width / 2\"\n\t\t\t\t\t\t[attr.y2]=\"canvasSize().height\"\n\t\t\t\t\t\tstroke=\"rgba(99,102,241,0.7)\"\n\t\t\t\t\t\tstroke-width=\"1\"\n\t\t\t\t\t\tstroke-dasharray=\"6 3\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t}\n\n\t\t\t<!--\n\t\t\t\tUser-created ruler guides.\n\t\t\t\tEach guide has a non-interactive line body and an interactive\n\t\t\t\tdrag handle. Double-click the handle to delete the guide.\n\n\t\t\t\tDeliberately OUTSIDE the showGuides() gate above (which owns the\n\t\t\t\tstatic centre crosshair): a guide the user just dragged off a ruler\n\t\t\t\tstrip must be visible immediately, as it is in Vue and Vanilla.\n\t\t\t\tWhile it lived under that gate, the drag-out gesture silently\n\t\t\t\tproduced an invisible guide unless View > Guides happened to be on.\n\t\t\t-->\n\t\t\t@if (interactive()) {\n\t\t\t\t@for (g of rulerGuidesSvc.rulerGuides(); track g.id) {\n\t\t\t\t\t<!-- Guide line body: pointer-events:none -->\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"pptx-ng-ruler-guide-line\"\n\t\t\t\t\t\t[style.left.px]=\"g.axis === 'x' ? g.pos : 0\"\n\t\t\t\t\t\t[style.top.px]=\"g.axis === 'y' ? g.pos : 0\"\n\t\t\t\t\t\t[style.width]=\"g.axis === 'x' ? '1px' : '100%'\"\n\t\t\t\t\t\t[style.height]=\"g.axis === 'y' ? '1px' : '100%'\"\n\t\t\t\t\t></div>\n\t\t\t\t\t<!-- Drag handle: pointer-events:auto -->\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"pptx-ng-ruler-guide-handle\"\n\t\t\t\t\t\t[style.left.px]=\"g.axis === 'x' ? g.pos - 4 : 0\"\n\t\t\t\t\t\t[style.top.px]=\"g.axis === 'y' ? g.pos - 4 : 0\"\n\t\t\t\t\t\t[style.width]=\"g.axis === 'x' ? '9px' : '100%'\"\n\t\t\t\t\t\t[style.height]=\"g.axis === 'y' ? '9px' : '100%'\"\n\t\t\t\t\t\t[style.cursor]=\"g.axis === 'x' ? 'col-resize' : 'row-resize'\"\n\t\t\t\t\t\t(pointerdown)=\"rulerGuidesSvc.onGuidePointerDown($event, g.id, g.axis)\"\n\t\t\t\t\t\t(dblclick)=\"rulerGuidesSvc.onGuideDoubleClick($event, g.id)\"\n\t\t\t\t\t\t[title]=\"'pptx.canvas.guideTooltip' | translate\"\n\t\t\t\t\t></div>\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t<!--\n\t\t\t\tLive ink stroke preview: shown while the user is drawing.\n\t\t\t\tpointer-events:none so it never intercepts element gestures.\n\t\t\t\tNo data-pptx-element / aria-roledescription / data-pptx-viewport.\n\n\t\t\t\tRenders `inkDrawing.liveStrokeView()`: the same plain-path /\n\t\t\t\tpressure-circle / tilt-nib decision `InkRendererComponent` makes for\n\t\t\t\ta committed stroke, so a calligraphic lean or pressure-variable\n\t\t\t\twidth shows up while the pointer is still down, not only after\n\t\t\t\trelease.\n\t\t\t-->\n\t\t\t@if (inkDrawing.active() && inkDrawing.liveStrokeView() && drawTool() !== 'select') {\n\t\t\t\t<svg\n\t\t\t\t\tclass=\"pptx-ng-ink-preview\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t[attr.width]=\"canvasSize().width\"\n\t\t\t\t\t[attr.height]=\"canvasSize().height\"\n\t\t\t\t\tstyle=\"position: absolute; inset: 0; pointer-events: none; z-index: 70\"\n\t\t\t\t>\n\t\t\t\t\t@if (inkDrawing.liveStrokeView()?.nibMarks; as nibMarks) {\n\t\t\t\t\t\t<g [attr.opacity]=\"inkDrawing.liveStrokeView()?.opacity\">\n\t\t\t\t\t\t\t@for (m of nibMarks; track $index) {\n\t\t\t\t\t\t\t\t<ellipse\n\t\t\t\t\t\t\t\t\t[attr.cx]=\"m.cx\"\n\t\t\t\t\t\t\t\t\t[attr.cy]=\"m.cy\"\n\t\t\t\t\t\t\t\t\t[attr.rx]=\"m.rPerp\"\n\t\t\t\t\t\t\t\t\t[attr.ry]=\"m.rTilt\"\n\t\t\t\t\t\t\t\t\t[attr.transform]=\"'rotate(' + m.rotationDeg + ' ' + m.cx + ' ' + m.cy + ')'\"\n\t\t\t\t\t\t\t\t\t[attr.fill]=\"inkDrawing.liveStrokeView()?.color\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</g>\n\t\t\t\t\t} @else if (inkDrawing.liveStrokeView()?.circles; as circles) {\n\t\t\t\t\t\t<g [attr.opacity]=\"inkDrawing.liveStrokeView()?.opacity\">\n\t\t\t\t\t\t\t@for (c of circles; track $index) {\n\t\t\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t\t\t[attr.cx]=\"c.cx\"\n\t\t\t\t\t\t\t\t\t[attr.cy]=\"c.cy\"\n\t\t\t\t\t\t\t\t\t[attr.r]=\"c.r\"\n\t\t\t\t\t\t\t\t\t[attr.fill]=\"inkDrawing.liveStrokeView()?.color\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</g>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t[attr.d]=\"inkDrawing.liveStrokeView()?.d\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t[attr.stroke]=\"inkDrawing.liveStrokeView()?.color\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"inkDrawing.liveStrokeView()?.width\"\n\t\t\t\t\t\t\t[attr.stroke-opacity]=\"inkDrawing.liveStrokeView()?.opacity\"\n\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t</svg>\n\t\t\t}\n\n\t\t\t<!--\n\t\t\t\tProjected overlays (collaboration cursors + remote selections).\n\t\t\t\tThey live INSIDE the scaled stage so the stage's CSS\n\t\t\t\ttransform:scale() applies the on-screen scale exactly once and\n\t\t\t\tthey can be authored in raw, unscaled slide coordinates, exactly\n\t\t\t\tlike the React/Vue overlays.\n\t\t\t-->\n\t\t\t<ng-content />\n\t\t</div>\n\n\t\t<!--\n\t\t\tRuler strips: siblings to the scaled stage inside the wrapper div,\n\t\t\tabsolutely positioned at top:0/left:0 within the wrapper's padding area.\n\t\t\tThe wrapper's padding (RULER_THICKNESS px top+left) reserves space for\n\t\t\tthese strips so the stage content starts below/right of them.\n\t\t\tpointer-events:none so they never intercept element gestures.\n\t\t-->\n\t\t@if (interactive() && showRulers()) {\n\t\t\t<!-- Corner square at the intersection of the two ruler strips -->\n\t\t\t<div class=\"pptx-ng-ruler-corner\" aria-hidden=\"true\"></div>\n\n\t\t\t<!--\n\t\t\t\tHorizontal ruler: spans the top padding row of the wrapper.\n\t\t\t\tA guide is dropped on pointer-UP (not down), resolved by the shared\n\t\t\t\trulerDragToGuidePosition, so a stray click on the strip cannot\n\t\t\t\tdrop a guide the user never dragged out - the rule React, Vue,\n\t\t\t\tSvelte and Vanilla all follow.\n\t\t\t-->\n\t\t\t<svg\n\t\t\t\tclass=\"pptx-ng-ruler-h\"\n\t\t\t\tdata-pptx-ruler=\"h\"\n\t\t\t\trole=\"presentation\"\n\t\t\t\t[attr.width]=\"canvasSize().width * effectiveScalePublic()\"\n\t\t\t\t[attr.height]=\"rulerThickness\"\n\t\t\t\t[style.cursor]=\"editable() ? 'row-resize' : null\"\n\t\t\t\t(pointerdown)=\"rulerGuidesSvc.onRulerPointerDown('h', $event)\"\n\t\t\t\t(pointerup)=\"rulerGuidesSvc.onRulerPointerUp('h', $event)\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\t[attr.width]=\"canvasSize().width * effectiveScalePublic()\"\n\t\t\t\t\t[attr.height]=\"rulerThickness\"\n\t\t\t\t\tfill=\"#1e293b\"\n\t\t\t\t/>\n\t\t\t\t@if (hRulerHighlight(); as highlight) {\n\t\t\t\t\t<rect\n\t\t\t\t\t\t[attr.x]=\"highlight.start\"\n\t\t\t\t\t\ty=\"0\"\n\t\t\t\t\t\t[attr.width]=\"highlight.span\"\n\t\t\t\t\t\t[attr.height]=\"rulerThickness\"\n\t\t\t\t\t\tfill=\"rgba(96,165,250,0.25)\"\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t\t<line\n\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t[attr.y1]=\"rulerThickness - 0.5\"\n\t\t\t\t\t[attr.x2]=\"canvasSize().width * effectiveScalePublic()\"\n\t\t\t\t\t[attr.y2]=\"rulerThickness - 0.5\"\n\t\t\t\t\tstroke=\"rgba(255,255,255,0.15)\"\n\t\t\t\t\tstroke-width=\"1\"\n\t\t\t\t/>\n\t\t\t\t@for (tick of hRulerTicks(); track $index) {\n\t\t\t\t\t<line\n\t\t\t\t\t\t[attr.x1]=\"tick.position\"\n\t\t\t\t\t\t[attr.y1]=\"rulerThickness\"\n\t\t\t\t\t\t[attr.x2]=\"tick.position\"\n\t\t\t\t\t\t[attr.y2]=\"rulerThickness - rulerThickness * (tick.isMajor ? 0.6 : 0.3)\"\n\t\t\t\t\t\tstroke=\"rgba(156,163,175,0.7)\"\n\t\t\t\t\t\t[attr.stroke-width]=\"tick.isMajor ? 1 : 0.5\"\n\t\t\t\t\t/>\n\t\t\t\t\t@if (tick.label) {\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t[attr.x]=\"tick.position + 2\"\n\t\t\t\t\t\t\t[attr.y]=\"rulerFontSize + 1\"\n\t\t\t\t\t\t\t[attr.font-size]=\"rulerFontSize\"\n\t\t\t\t\t\t\tfill=\"rgba(156,163,175,0.9)\"\n\t\t\t\t\t\t\tstyle=\"font-family: system-ui, sans-serif\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ tick.label }}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t</svg>\n\n\t\t\t<!-- Vertical ruler: spans the left padding column of the wrapper -->\n\t\t\t<svg\n\t\t\t\tclass=\"pptx-ng-ruler-v\"\n\t\t\t\tdata-pptx-ruler=\"v\"\n\t\t\t\trole=\"presentation\"\n\t\t\t\t[attr.width]=\"rulerThickness\"\n\t\t\t\t[attr.height]=\"canvasSize().height * effectiveScalePublic()\"\n\t\t\t\t[style.cursor]=\"editable() ? 'col-resize' : null\"\n\t\t\t\t(pointerdown)=\"rulerGuidesSvc.onRulerPointerDown('v', $event)\"\n\t\t\t\t(pointerup)=\"rulerGuidesSvc.onRulerPointerUp('v', $event)\"\n\t\t\t>\n\t\t\t\t<rect\n\t\t\t\t\t[attr.width]=\"rulerThickness\"\n\t\t\t\t\t[attr.height]=\"canvasSize().height * effectiveScalePublic()\"\n\t\t\t\t\tfill=\"#1e293b\"\n\t\t\t\t/>\n\t\t\t\t@if (vRulerHighlight(); as highlight) {\n\t\t\t\t\t<rect\n\t\t\t\t\t\tx=\"0\"\n\t\t\t\t\t\t[attr.y]=\"highlight.start\"\n\t\t\t\t\t\t[attr.width]=\"rulerThickness\"\n\t\t\t\t\t\t[attr.height]=\"highlight.span\"\n\t\t\t\t\t\tfill=\"rgba(96,165,250,0.25)\"\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t\t<line\n\t\t\t\t\t[attr.x1]=\"rulerThickness - 0.5\"\n\t\t\t\t\ty1=\"0\"\n\t\t\t\t\t[attr.x2]=\"rulerThickness - 0.5\"\n\t\t\t\t\t[attr.y2]=\"canvasSize().height * effectiveScalePublic()\"\n\t\t\t\t\tstroke=\"rgba(255,255,255,0.15)\"\n\t\t\t\t\tstroke-width=\"1\"\n\t\t\t\t/>\n\t\t\t\t@for (tick of vRulerTicks(); track $index) {\n\t\t\t\t\t<line\n\t\t\t\t\t\t[attr.x1]=\"rulerThickness\"\n\t\t\t\t\t\t[attr.y1]=\"tick.position\"\n\t\t\t\t\t\t[attr.x2]=\"rulerThickness - rulerThickness * (tick.isMajor ? 0.6 : 0.3)\"\n\t\t\t\t\t\t[attr.y2]=\"tick.position\"\n\t\t\t\t\t\tstroke=\"rgba(156,163,175,0.7)\"\n\t\t\t\t\t\t[attr.stroke-width]=\"tick.isMajor ? 1 : 0.5\"\n\t\t\t\t\t/>\n\t\t\t\t\t@if (tick.label) {\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\tx=\"2\"\n\t\t\t\t\t\t\t[attr.y]=\"tick.position + rulerFontSize + 2\"\n\t\t\t\t\t\t\t[attr.font-size]=\"rulerFontSize\"\n\t\t\t\t\t\t\tfill=\"rgba(156,163,175,0.9)\"\n\t\t\t\t\t\t\tstyle=\"font-family: system-ui, sans-serif\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ tick.label }}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t</svg>\n\t\t}\n\t</div>\n</div>\n", styles: [".pptx-ng-canvas-stage.is-editable{touch-action:none}\n"] }]
|
|
124901
|
-
}], 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 }] }], rulerUnit: [{ type: i0.Input, args: [{ isSignal: true, alias: "rulerUnit", required: false }] }], showGuides: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGuides", required: false }] }], snapToGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToGrid", required: false }] }], gridSpacing: [{ type: i0.Input, args: [{ isSignal: true, alias: "gridSpacing", required: false }] }], snapToShape: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToShape", required: false }] }], guideCommand: [{ type: i0.Input, args: [{ isSignal: true, alias: "guideCommand", required: false }] }], spellCheck: [{ type: i0.Input, args: [{ isSignal: true, alias: "spellCheck", required: false }] }], snapToGuides: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToGuides", required: false }] }], autoFit: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoFit", required: false }] }], transparentBackground: [{ type: i0.Input, args: [{ isSignal: true, alias: "transparentBackground", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], exposeElementIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "exposeElementIds", 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 }] }], aiHighlights: [{ type: i0.Input, args: [{ isSignal: true, alias: "aiHighlights", required: false }] }], aiActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "aiActive", required: false }] }], aiActiveSlideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "aiActiveSlideIndex", required: false }] }], aiChangeBatch: [{ type: i0.Input, args: [{ isSignal: true, alias: "aiChangeBatch", required: false }] }], aiPickMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "aiPickMode", 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"] }], transformEnd: [{ type: i0.Output, args: ["transformEnd"] }], adjustUpdate: [{ type: i0.Output, args: ["adjustUpdate"] }], connectorEndpointUpdate: [{ type: i0.Output, args: ["connectorEndpointUpdate"] }], contextMenu: [{ type: i0.Output, args: ["contextMenu"] }], textEditStart: [{ type: i0.Output, args: ["textEditStart"] }], textCommit: [{ type: i0.Output, args: ["textCommit"] }], textInput: [{ type: i0.Output, args: ["textInput"] }], 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: [{
|
|
125356
|
+
}], 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 }] }], fitPadding: [{ type: i0.Input, args: [{ isSignal: true, alias: "fitPadding", required: false }] }], maxFitScale: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFitScale", 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 }] }], rulerUnit: [{ type: i0.Input, args: [{ isSignal: true, alias: "rulerUnit", required: false }] }], showGuides: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGuides", required: false }] }], snapToGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToGrid", required: false }] }], gridSpacing: [{ type: i0.Input, args: [{ isSignal: true, alias: "gridSpacing", required: false }] }], snapToShape: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToShape", required: false }] }], guideCommand: [{ type: i0.Input, args: [{ isSignal: true, alias: "guideCommand", required: false }] }], spellCheck: [{ type: i0.Input, args: [{ isSignal: true, alias: "spellCheck", required: false }] }], snapToGuides: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToGuides", required: false }] }], autoFit: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoFit", required: false }] }], transparentBackground: [{ type: i0.Input, args: [{ isSignal: true, alias: "transparentBackground", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], exposeElementIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "exposeElementIds", 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 }] }], aiHighlights: [{ type: i0.Input, args: [{ isSignal: true, alias: "aiHighlights", required: false }] }], aiActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "aiActive", required: false }] }], aiActiveSlideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "aiActiveSlideIndex", required: false }] }], aiChangeBatch: [{ type: i0.Input, args: [{ isSignal: true, alias: "aiChangeBatch", required: false }] }], aiPickMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "aiPickMode", 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"] }], transformEnd: [{ type: i0.Output, args: ["transformEnd"] }], adjustUpdate: [{ type: i0.Output, args: ["adjustUpdate"] }], connectorEndpointUpdate: [{ type: i0.Output, args: ["connectorEndpointUpdate"] }], contextMenu: [{ type: i0.Output, args: ["contextMenu"] }], textEditStart: [{ type: i0.Output, args: ["textEditStart"] }], textCommit: [{ type: i0.Output, args: ["textCommit"] }], textInput: [{ type: i0.Output, args: ["textInput"] }], 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: [{
|
|
124902
125357
|
type: HostListener,
|
|
124903
125358
|
args: ['document:pointermove', ['$event']]
|
|
124904
125359
|
}], onPointerUp: [{
|
|
@@ -125064,7 +125519,7 @@ class MasterViewCanvasComponent {
|
|
|
125064
125519
|
<p class="empty">No master is available.</p>
|
|
125065
125520
|
}
|
|
125066
125521
|
</main>
|
|
125067
|
-
`, isInline: true, styles: [":host{display:flex;min-width:0;min-height:0;flex:1}.master-canvas{display:flex;min-width:0;min-height:0;flex:1;overflow:hidden;background:var(--pptx-background, #11111b)}pptx-slide-canvas{display:flex;min-width:0;min-height:0;flex:1}.empty{margin:auto;color:var(--pptx-muted-foreground, #a5a5b5)}\n"], dependencies: [{ kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
125522
|
+
`, isInline: true, styles: [":host{display:flex;min-width:0;min-height:0;flex:1}.master-canvas{display:flex;min-width:0;min-height:0;flex:1;overflow:hidden;background:var(--pptx-background, #11111b)}pptx-slide-canvas{display:flex;min-width:0;min-height:0;flex:1}.empty{margin:auto;color:var(--pptx-muted-foreground, #a5a5b5)}\n"], dependencies: [{ kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "fitPadding", "maxFitScale", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
125068
125523
|
}
|
|
125069
125524
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: MasterViewCanvasComponent, decorators: [{
|
|
125070
125525
|
type: Component,
|
|
@@ -126321,7 +126776,7 @@ class MobilePresenterViewComponent {
|
|
|
126321
126776
|
return { ...slide, elements: [...template, ...slide.elements] };
|
|
126322
126777
|
}
|
|
126323
126778
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: MobilePresenterViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
126324
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: MobilePresenterViewComponent, isStandalone: true, selector: "pptx-mobile-presenter-view", inputs: { slides: { classPropertyName: "slides", publicName: "slides", isSignal: true, isRequired: true, transformFunction: null }, currentSlideIndex: { classPropertyName: "currentSlideIndex", publicName: "currentSlideIndex", isSignal: true, isRequired: true, transformFunction: null }, activeCustomShow: { classPropertyName: "activeCustomShow", publicName: "activeCustomShow", isSignal: true, isRequired: false, transformFunction: null }, authoredRange: { classPropertyName: "authoredRange", publicName: "authoredRange", isSignal: true, isRequired: false, transformFunction: null }, canvasSize: { classPropertyName: "canvasSize", publicName: "canvasSize", isSignal: true, isRequired: true, transformFunction: null }, templateElements: { classPropertyName: "templateElements", publicName: "templateElements", isSignal: true, isRequired: false, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, presentationStartTime: { classPropertyName: "presentationStartTime", publicName: "presentationStartTime", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { movePresentationSlide: "movePresentationSlide", exit: "exit" }, ngImport: i0, template: "@if (currentSlide(); as current) {\n\t<!-- Header: elapsed + counter + exit -->\n\t<div class=\"pptx-ng-mpresenter-header\">\n\t\t<div>\n\t\t\t<div class=\"pptx-ng-mpresenter-label\">{{ 'pptx.presenter.elapsed' | translate }}</div>\n\t\t\t<div class=\"pptx-ng-mpresenter-elapsed\">{{ elapsedLabel() }}</div>\n\t\t</div>\n\t\t<span class=\"pptx-ng-mpresenter-counter\">{{ counterLabel() }}</span>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"pptx-ng-mpresenter-exit\"\n\t\t\t(click)=\"exit.emit()\"\n\t\t\t[attr.aria-label]=\"'pptx.presenter.endPresentation' | translate\"\n\t\t\t[title]=\"'pptx.presenter.endPresentation' | translate\"\n\t\t>\n\t\t\t✕\n\t\t</button>\n\t</div>\n\n\t<!-- Current slide (large) -->\n\t<div class=\"pptx-ng-mpresenter-main\">\n\t\t<div class=\"pptx-ng-mpresenter-main-stage\">\n\t\t\t<pptx-slide-canvas\n\t\t\t\t[slide]=\"currentPreviewSlide()\"\n\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t[zoom]=\"1\"\n\t\t\t\t[interactive]=\"false\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n\n\t<!-- Next thumbnail -->\n\t<div class=\"pptx-ng-mpresenter-next\">\n\t\t<span class=\"pptx-ng-mpresenter-label\">{{\n\t\t\t'pptx.presenter.nextSlidePreview' | translate\n\t\t}}</span>\n\t\t@if (nextPreviewSlide(); as next) {\n\t\t\t<div class=\"pptx-ng-mpresenter-thumb\" [ngStyle]=\"thumbStyle()\">\n\t\t\t\t<pptx-slide-canvas\n\t\t\t\t\t[slide]=\"next\"\n\t\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t[zoom]=\"1\"\n\t\t\t\t\t[interactive]=\"false\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t} @else {\n\t\t\t<div class=\"pptx-ng-mpresenter-next-empty\">\n\t\t\t\t{{ 'pptx.presenter.endOfPresentation' | translate }}\n\t\t\t</div>\n\t\t}\n\t</div>\n\n\t<!-- Speaker notes (scrollable) -->\n\t<div class=\"pptx-ng-mpresenter-notes\">\n\t\t<div class=\"pptx-ng-mpresenter-label\">{{ 'pptx.presenter.speakerNotes' | translate }}</div>\n\t\t<div class=\"pptx-ng-mpresenter-notes-body\">\n\t\t\t@if (notes().hasRichNotes) {\n\t\t\t\t@for (seg of notes().segments; track seg.key) {\n\t\t\t\t\t@if (seg.isBreak) {\n\t\t\t\t\t\t<br />\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<span [ngStyle]=\"seg.style\">{{ seg.text }}</span>\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} @else if (notes().hasAnyNotes) {\n\t\t\t\t{{ notes().plainText }}\n\t\t\t} @else {\n\t\t\t\t<span class=\"pptx-ng-mpresenter-notes-empty\">{{\n\t\t\t\t\t'pptx.presenter.noNotes' | translate\n\t\t\t\t}}</span>\n\t\t\t}\n\t\t</div>\n\t</div>\n\n\t<!-- Prev / Next controls -->\n\t<div class=\"pptx-ng-mpresenter-ctl\">\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"pptx-ng-mpresenter-navbtn\"\n\t\t\tdata-pptx-presenter-control=\"prev\"\n\t\t\t(click)=\"movePresentationSlide.emit(-1)\"\n\t\t\t[disabled]=\"prevDisabled()\"\n\t\t\t[attr.aria-label]=\"'pptx.presenter.previousSlide' | translate\"\n\t\t\t[title]=\"'pptx.presenter.previousSlide' | translate\"\n\t\t>\n\t\t\t‹ {{ 'pptx.presenter.prev' | translate }}\n\t\t</button>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"pptx-ng-mpresenter-navbtn\"\n\t\t\tdata-pptx-presenter-control=\"next\"\n\t\t\t(click)=\"movePresentationSlide.emit(1)\"\n\t\t\t[disabled]=\"nextDisabled()\"\n\t\t\t[attr.aria-label]=\"'pptx.presenter.nextSlide' | translate\"\n\t\t\t[title]=\"'pptx.presenter.nextSlide' | translate\"\n\t\t>\n\t\t\t{{ 'pptx.presenter.next' | translate }} ›\n\t\t</button>\n\t</div>\n} @else {\n\t<div class=\"pptx-ng-mpresenter-empty\">{{ 'pptx.presenter.noSlides' | translate }}</div>\n}\n", 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", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
126779
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: MobilePresenterViewComponent, isStandalone: true, selector: "pptx-mobile-presenter-view", inputs: { slides: { classPropertyName: "slides", publicName: "slides", isSignal: true, isRequired: true, transformFunction: null }, currentSlideIndex: { classPropertyName: "currentSlideIndex", publicName: "currentSlideIndex", isSignal: true, isRequired: true, transformFunction: null }, activeCustomShow: { classPropertyName: "activeCustomShow", publicName: "activeCustomShow", isSignal: true, isRequired: false, transformFunction: null }, authoredRange: { classPropertyName: "authoredRange", publicName: "authoredRange", isSignal: true, isRequired: false, transformFunction: null }, canvasSize: { classPropertyName: "canvasSize", publicName: "canvasSize", isSignal: true, isRequired: true, transformFunction: null }, templateElements: { classPropertyName: "templateElements", publicName: "templateElements", isSignal: true, isRequired: false, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, presentationStartTime: { classPropertyName: "presentationStartTime", publicName: "presentationStartTime", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { movePresentationSlide: "movePresentationSlide", exit: "exit" }, ngImport: i0, template: "@if (currentSlide(); as current) {\n\t<!-- Header: elapsed + counter + exit -->\n\t<div class=\"pptx-ng-mpresenter-header\">\n\t\t<div>\n\t\t\t<div class=\"pptx-ng-mpresenter-label\">{{ 'pptx.presenter.elapsed' | translate }}</div>\n\t\t\t<div class=\"pptx-ng-mpresenter-elapsed\">{{ elapsedLabel() }}</div>\n\t\t</div>\n\t\t<span class=\"pptx-ng-mpresenter-counter\">{{ counterLabel() }}</span>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"pptx-ng-mpresenter-exit\"\n\t\t\t(click)=\"exit.emit()\"\n\t\t\t[attr.aria-label]=\"'pptx.presenter.endPresentation' | translate\"\n\t\t\t[title]=\"'pptx.presenter.endPresentation' | translate\"\n\t\t>\n\t\t\t✕\n\t\t</button>\n\t</div>\n\n\t<!-- Current slide (large) -->\n\t<div class=\"pptx-ng-mpresenter-main\">\n\t\t<div class=\"pptx-ng-mpresenter-main-stage\">\n\t\t\t<pptx-slide-canvas\n\t\t\t\t[slide]=\"currentPreviewSlide()\"\n\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t[zoom]=\"1\"\n\t\t\t\t[interactive]=\"false\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n\n\t<!-- Next thumbnail -->\n\t<div class=\"pptx-ng-mpresenter-next\">\n\t\t<span class=\"pptx-ng-mpresenter-label\">{{\n\t\t\t'pptx.presenter.nextSlidePreview' | translate\n\t\t}}</span>\n\t\t@if (nextPreviewSlide(); as next) {\n\t\t\t<div class=\"pptx-ng-mpresenter-thumb\" [ngStyle]=\"thumbStyle()\">\n\t\t\t\t<pptx-slide-canvas\n\t\t\t\t\t[slide]=\"next\"\n\t\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t[zoom]=\"1\"\n\t\t\t\t\t[interactive]=\"false\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t} @else {\n\t\t\t<div class=\"pptx-ng-mpresenter-next-empty\">\n\t\t\t\t{{ 'pptx.presenter.endOfPresentation' | translate }}\n\t\t\t</div>\n\t\t}\n\t</div>\n\n\t<!-- Speaker notes (scrollable) -->\n\t<div class=\"pptx-ng-mpresenter-notes\">\n\t\t<div class=\"pptx-ng-mpresenter-label\">{{ 'pptx.presenter.speakerNotes' | translate }}</div>\n\t\t<div class=\"pptx-ng-mpresenter-notes-body\">\n\t\t\t@if (notes().hasRichNotes) {\n\t\t\t\t@for (seg of notes().segments; track seg.key) {\n\t\t\t\t\t@if (seg.isBreak) {\n\t\t\t\t\t\t<br />\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<span [ngStyle]=\"seg.style\">{{ seg.text }}</span>\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} @else if (notes().hasAnyNotes) {\n\t\t\t\t{{ notes().plainText }}\n\t\t\t} @else {\n\t\t\t\t<span class=\"pptx-ng-mpresenter-notes-empty\">{{\n\t\t\t\t\t'pptx.presenter.noNotes' | translate\n\t\t\t\t}}</span>\n\t\t\t}\n\t\t</div>\n\t</div>\n\n\t<!-- Prev / Next controls -->\n\t<div class=\"pptx-ng-mpresenter-ctl\">\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"pptx-ng-mpresenter-navbtn\"\n\t\t\tdata-pptx-presenter-control=\"prev\"\n\t\t\t(click)=\"movePresentationSlide.emit(-1)\"\n\t\t\t[disabled]=\"prevDisabled()\"\n\t\t\t[attr.aria-label]=\"'pptx.presenter.previousSlide' | translate\"\n\t\t\t[title]=\"'pptx.presenter.previousSlide' | translate\"\n\t\t>\n\t\t\t‹ {{ 'pptx.presenter.prev' | translate }}\n\t\t</button>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"pptx-ng-mpresenter-navbtn\"\n\t\t\tdata-pptx-presenter-control=\"next\"\n\t\t\t(click)=\"movePresentationSlide.emit(1)\"\n\t\t\t[disabled]=\"nextDisabled()\"\n\t\t\t[attr.aria-label]=\"'pptx.presenter.nextSlide' | translate\"\n\t\t\t[title]=\"'pptx.presenter.nextSlide' | translate\"\n\t\t>\n\t\t\t{{ 'pptx.presenter.next' | translate }} ›\n\t\t</button>\n\t</div>\n} @else {\n\t<div class=\"pptx-ng-mpresenter-empty\">{{ 'pptx.presenter.noSlides' | translate }}</div>\n}\n", 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", "fitPadding", "maxFitScale", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
126325
126780
|
}
|
|
126326
126781
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: MobilePresenterViewComponent, decorators: [{
|
|
126327
126782
|
type: Component,
|
|
@@ -126497,7 +126952,7 @@ class MobileSlidesSheetComponent {
|
|
|
126497
126952
|
}
|
|
126498
126953
|
</div>
|
|
126499
126954
|
</pptx-mobile-sheet>
|
|
126500
|
-
`, 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", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
126955
|
+
`, 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", "fitPadding", "maxFitScale", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
126501
126956
|
}
|
|
126502
126957
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: MobileSlidesSheetComponent, decorators: [{
|
|
126503
126958
|
type: Component,
|
|
@@ -131548,6 +132003,7 @@ class ViewerKeyboardService {
|
|
|
131548
132003
|
}
|
|
131549
132004
|
const { action, dx, dy } = mapEditorKey(event, {
|
|
131550
132005
|
canEdit: host.canEdit(),
|
|
132006
|
+
canPaste: this.editor.hasClipboard(),
|
|
131551
132007
|
isPresenting: host.presenting(),
|
|
131552
132008
|
hasSelection: this.editor.hasSelection(),
|
|
131553
132009
|
isDrawing: host.isDrawing?.() ?? false,
|
|
@@ -134472,7 +134928,7 @@ class FragmentedTransitionLayerComponent {
|
|
|
134472
134928
|
</div>
|
|
134473
134929
|
}
|
|
134474
134930
|
</div>
|
|
134475
|
-
`, isInline: true, styles: [":host{display:block}.pptx-ng-transition-layer{position:absolute;inset:0}.pptx-ng-transition-fragment{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;pointer-events: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", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
134931
|
+
`, isInline: true, styles: [":host{display:block}.pptx-ng-transition-layer{position:absolute;inset:0}.pptx-ng-transition-fragment{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;pointer-events:none}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "fitPadding", "maxFitScale", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
134476
134932
|
}
|
|
134477
134933
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: FragmentedTransitionLayerComponent, decorators: [{
|
|
134478
134934
|
type: Component,
|
|
@@ -134604,7 +135060,7 @@ class MorphExtraLayersComponent {
|
|
|
134604
135060
|
</div>
|
|
134605
135061
|
</div>
|
|
134606
135062
|
}
|
|
134607
|
-
`, isInline: true, styles: [".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", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
135063
|
+
`, isInline: true, styles: [".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", "fitPadding", "maxFitScale", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
134608
135064
|
}
|
|
134609
135065
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: MorphExtraLayersComponent, decorators: [{
|
|
134610
135066
|
type: Component,
|
|
@@ -135165,7 +135621,7 @@ class PresentationTransitionOverlayComponent {
|
|
|
135165
135621
|
});
|
|
135166
135622
|
}
|
|
135167
135623
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: PresentationTransitionOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
135168
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: PresentationTransitionOverlayComponent, isStandalone: true, selector: "pptx-presentation-transition-overlay", inputs: { outgoingSlide: { classPropertyName: "outgoingSlide", publicName: "outgoingSlide", isSignal: true, isRequired: true, transformFunction: null }, canvasSize: { classPropertyName: "canvasSize", publicName: "canvasSize", isSignal: true, isRequired: true, transformFunction: null }, transition: { classPropertyName: "transition", publicName: "transition", isSignal: true, isRequired: true, transformFunction: null }, templateElements: { classPropertyName: "templateElements", publicName: "templateElements", isSignal: true, isRequired: false, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, durationMs: { classPropertyName: "durationMs", publicName: "durationMs", isSignal: true, isRequired: false, transformFunction: null }, zoom: { classPropertyName: "zoom", publicName: "zoom", isSignal: true, isRequired: false, transformFunction: null }, incomingSlide: { classPropertyName: "incomingSlide", publicName: "incomingSlide", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { complete: "complete" }, host: { attributes: { "data-pptx-transition-overlay": "" } }, ngImport: i0, template: "<!-- The seven multi-fragment cinematic transitions (vortex, honeycomb,\n glitter, shred, fracture, curtains, airplane) replace whichever\n layer(s) 'getFragmentedTransitionDescriptor' names with N clipped\n copies of the slide instead of one animated block. Morph never sets\n 'fragmented' (it is its own transition type), so the two never race. -->\n@if (fragmentedIncoming(); as fragIncoming) {\n\t<pptx-fragmented-transition-layer\n\t\t[layer]=\"fragIncoming\"\n\t\t[slide]=\"incomingFragmentSlide()!\"\n\t\t[canvasSize]=\"canvasSize()\"\n\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t[zoom]=\"zoom()\"\n\t\tlayerName=\"incoming\"\n\t\t[zIndex]=\"fragmentedIncomingZIndex()\"\n\t/>\n} @else if (incomingLayerSlide(); as incoming) {\n\t<div\n\t\tclass=\"pptx-ng-transition-layer\"\n\t\tdata-pptx-transition-layer=\"incoming\"\n\t\t[ngStyle]=\"incomingLayerStyle()\"\n\t>\n\t\t<div [ngStyle]=\"slideBoxStyle()\">\n\t\t\t<pptx-slide-canvas\n\t\t\t\t[slide]=\"incoming\"\n\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t[zoom]=\"zoom()\"\n\t\t\t\t[autoFit]=\"false\"\n\t\t\t\t[interactive]=\"false\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n}\n\n@if (fragmentedOutgoing(); as fragOutgoing) {\n\t<pptx-fragmented-transition-layer\n\t\t[layer]=\"fragOutgoing\"\n\t\t[slide]=\"layerSlide()\"\n\t\t[canvasSize]=\"canvasSize()\"\n\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t[zoom]=\"zoom()\"\n\t\tlayerName=\"outgoing\"\n\t\t[zIndex]=\"fragmentedOutgoingZIndex()\"\n\t/>\n} @else {\n\t<div\n\t\tclass=\"pptx-ng-transition-layer\"\n\t\tdata-pptx-transition-layer=\"outgoing\"\n\t\t[attr.data-pptx-morph-outgoing]=\"morphPlan() ? 'true' : null\"\n\t\t[ngStyle]=\"layerStyle()\"\n\t>\n\t\t<div [ngStyle]=\"slideBoxStyle()\">\n\t\t\t<pptx-slide-canvas\n\t\t\t\t[slide]=\"layerSlide()\"\n\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t[zoom]=\"zoom()\"\n\t\t\t\t[autoFit]=\"false\"\n\t\t\t\t[interactive]=\"false\"\n\t\t\t\t[transparentBackground]=\"isMorph()\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n}\n\n<!-- The two morph-only extra layers (arriving-above-departing \"lifted\"\n shapes, and same-pair crossfade groups) - see\n `MorphExtraLayersComponent`. -->\n<pptx-morph-extra-layers\n\t[liftedSlide]=\"liftedSlide()\"\n\t[crossfadeGroups]=\"crossfadeGroups()\"\n\t[canvasSize]=\"canvasSize()\"\n\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t[zoom]=\"zoom()\"\n\t[slideBoxStyle]=\"slideBoxStyle()\"\n/>\n", 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", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: FragmentedTransitionLayerComponent, selector: "pptx-fragmented-transition-layer", inputs: ["layer", "slide", "canvasSize", "mediaDataUrls", "zoom", "layerName", "zIndex"] }, { kind: "component", type: MorphExtraLayersComponent, selector: "pptx-morph-extra-layers", inputs: ["liftedSlide", "crossfadeGroups", "canvasSize", "mediaDataUrls", "zoom", "slideBoxStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
135624
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: PresentationTransitionOverlayComponent, isStandalone: true, selector: "pptx-presentation-transition-overlay", inputs: { outgoingSlide: { classPropertyName: "outgoingSlide", publicName: "outgoingSlide", isSignal: true, isRequired: true, transformFunction: null }, canvasSize: { classPropertyName: "canvasSize", publicName: "canvasSize", isSignal: true, isRequired: true, transformFunction: null }, transition: { classPropertyName: "transition", publicName: "transition", isSignal: true, isRequired: true, transformFunction: null }, templateElements: { classPropertyName: "templateElements", publicName: "templateElements", isSignal: true, isRequired: false, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, durationMs: { classPropertyName: "durationMs", publicName: "durationMs", isSignal: true, isRequired: false, transformFunction: null }, zoom: { classPropertyName: "zoom", publicName: "zoom", isSignal: true, isRequired: false, transformFunction: null }, incomingSlide: { classPropertyName: "incomingSlide", publicName: "incomingSlide", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { complete: "complete" }, host: { attributes: { "data-pptx-transition-overlay": "" } }, ngImport: i0, template: "<!-- The seven multi-fragment cinematic transitions (vortex, honeycomb,\n glitter, shred, fracture, curtains, airplane) replace whichever\n layer(s) 'getFragmentedTransitionDescriptor' names with N clipped\n copies of the slide instead of one animated block. Morph never sets\n 'fragmented' (it is its own transition type), so the two never race. -->\n@if (fragmentedIncoming(); as fragIncoming) {\n\t<pptx-fragmented-transition-layer\n\t\t[layer]=\"fragIncoming\"\n\t\t[slide]=\"incomingFragmentSlide()!\"\n\t\t[canvasSize]=\"canvasSize()\"\n\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t[zoom]=\"zoom()\"\n\t\tlayerName=\"incoming\"\n\t\t[zIndex]=\"fragmentedIncomingZIndex()\"\n\t/>\n} @else if (incomingLayerSlide(); as incoming) {\n\t<div\n\t\tclass=\"pptx-ng-transition-layer\"\n\t\tdata-pptx-transition-layer=\"incoming\"\n\t\t[ngStyle]=\"incomingLayerStyle()\"\n\t>\n\t\t<div [ngStyle]=\"slideBoxStyle()\">\n\t\t\t<pptx-slide-canvas\n\t\t\t\t[slide]=\"incoming\"\n\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t[zoom]=\"zoom()\"\n\t\t\t\t[autoFit]=\"false\"\n\t\t\t\t[interactive]=\"false\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n}\n\n@if (fragmentedOutgoing(); as fragOutgoing) {\n\t<pptx-fragmented-transition-layer\n\t\t[layer]=\"fragOutgoing\"\n\t\t[slide]=\"layerSlide()\"\n\t\t[canvasSize]=\"canvasSize()\"\n\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t[zoom]=\"zoom()\"\n\t\tlayerName=\"outgoing\"\n\t\t[zIndex]=\"fragmentedOutgoingZIndex()\"\n\t/>\n} @else {\n\t<div\n\t\tclass=\"pptx-ng-transition-layer\"\n\t\tdata-pptx-transition-layer=\"outgoing\"\n\t\t[attr.data-pptx-morph-outgoing]=\"morphPlan() ? 'true' : null\"\n\t\t[ngStyle]=\"layerStyle()\"\n\t>\n\t\t<div [ngStyle]=\"slideBoxStyle()\">\n\t\t\t<pptx-slide-canvas\n\t\t\t\t[slide]=\"layerSlide()\"\n\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t[zoom]=\"zoom()\"\n\t\t\t\t[autoFit]=\"false\"\n\t\t\t\t[interactive]=\"false\"\n\t\t\t\t[transparentBackground]=\"isMorph()\"\n\t\t\t/>\n\t\t</div>\n\t</div>\n}\n\n<!-- The two morph-only extra layers (arriving-above-departing \"lifted\"\n shapes, and same-pair crossfade groups) - see\n `MorphExtraLayersComponent`. -->\n<pptx-morph-extra-layers\n\t[liftedSlide]=\"liftedSlide()\"\n\t[crossfadeGroups]=\"crossfadeGroups()\"\n\t[canvasSize]=\"canvasSize()\"\n\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t[zoom]=\"zoom()\"\n\t[slideBoxStyle]=\"slideBoxStyle()\"\n/>\n", 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", "fitPadding", "maxFitScale", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: FragmentedTransitionLayerComponent, selector: "pptx-fragmented-transition-layer", inputs: ["layer", "slide", "canvasSize", "mediaDataUrls", "zoom", "layerName", "zIndex"] }, { kind: "component", type: MorphExtraLayersComponent, selector: "pptx-morph-extra-layers", inputs: ["liftedSlide", "crossfadeGroups", "canvasSize", "mediaDataUrls", "zoom", "slideBoxStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
135169
135625
|
}
|
|
135170
135626
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: PresentationTransitionOverlayComponent, decorators: [{
|
|
135171
135627
|
type: Component,
|
|
@@ -135285,7 +135741,7 @@ class PresenterSlideNavigatorComponent {
|
|
|
135285
135741
|
}
|
|
135286
135742
|
</div>
|
|
135287
135743
|
</div>
|
|
135288
|
-
`, isInline: true, dependencies: [{ kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
135744
|
+
`, isInline: true, dependencies: [{ kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "fitPadding", "maxFitScale", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
135289
135745
|
}
|
|
135290
135746
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: PresenterSlideNavigatorComponent, decorators: [{
|
|
135291
135747
|
type: Component,
|
|
@@ -136183,7 +136639,7 @@ class PresentationOverlayComponent {
|
|
|
136183
136639
|
this.closed.emit();
|
|
136184
136640
|
}
|
|
136185
136641
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: PresentationOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
136186
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", 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 }, activeCustomShow: { classPropertyName: "activeCustomShow", publicName: "activeCustomShow", isSignal: true, isRequired: false, transformFunction: null }, authoredRange: { classPropertyName: "authoredRange", publicName: "authoredRange", isSignal: true, isRequired: false, transformFunction: null }, loopContinuously: { classPropertyName: "loopContinuously", publicName: "loopContinuously", isSignal: true, isRequired: false, transformFunction: null }, showWithAnimation: { classPropertyName: "showWithAnimation", publicName: "showWithAnimation", isSignal: true, isRequired: false, transformFunction: null }, useTimings: { classPropertyName: "useTimings", publicName: "useTimings", isSignal: true, isRequired: false, transformFunction: null }, subtitlesVisible: { classPropertyName: "subtitlesVisible", publicName: "subtitlesVisible", isSignal: true, isRequired: false, transformFunction: null }, sessionEnded: { classPropertyName: "sessionEnded", publicName: "sessionEnded", isSignal: true, isRequired: false, transformFunction: null }, endWithBlackSlide: { classPropertyName: "endWithBlackSlide", publicName: "endWithBlackSlide", isSignal: true, isRequired: false, transformFunction: null }, pixelateMosaicAnimation: { classPropertyName: "pixelateMosaicAnimation", publicName: "pixelateMosaicAnimation", isSignal: true, isRequired: false, transformFunction: null }, presenterMode: { classPropertyName: "presenterMode", publicName: "presenterMode", isSignal: true, isRequired: false, transformFunction: null }, showMenuOnRightClick: { classPropertyName: "showMenuOnRightClick", publicName: "showMenuOnRightClick", isSignal: true, isRequired: false, transformFunction: null }, showPopupToolbar: { classPropertyName: "showPopupToolbar", publicName: "showPopupToolbar", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { indexChange: "indexChange", closed: "closed", subtitlesChange: "subtitlesChange", presenterViewToggle: "presenterViewToggle", annotationsExit: "annotationsExit", customShowRequest: "customShowRequest", endOfShowChange: "endOfShowChange" }, host: { listeners: { "document:wheel": "onWheel($event)", "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 }, { propertyName: "toolbarRef", first: true, predicate: PresentationToolbarComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div #root class=\"pptx-ng-presentation-root\">\n\t<!--\n\t\tSlide counter, rendered first in DOM (before slide content) so a\n\t\tgeneric \"N / M\" text query resolves to it rather than to any slide-text\n\t\trun that happens to read like \"24 / 7\". Position is fixed, so DOM order\n\t\tdoes not affect its on-screen placement.\n\t-->\n\t<span class=\"pptx-ng-presentation-counter\" [ngStyle]=\"counterStyle\">\n\t\t{{ counterLabel() }}\n\t</span>\n\n\t<!-- Black \"End of slide show\" screen: the show has run past its last\n\t slide. It MUST be visible - while it is up the next input either\n\t goes nowhere (backward) or ends the show (forward), so a deck that\n\t kept painting the last slide looked stuck and swallowed advances. -->\n\t@if (endOfShow()) {\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"pptx-ng-presentation-end\"\n\t\t\tdata-pptx-end-of-show\n\t\t\t(click)=\"onEndScreenClick($event)\"\n\t\t>\n\t\t\t<span>{{ 'pptx.presentation.endOfSlideShow' | translate }}</span>\n\t\t</button>\n\t}\n\n\t<div\n\t\t#stage\n\t\tclass=\"pptx-ng-presentation-stage\"\n\t\t[ngStyle]=\"stageContainerStyle()\"\n\t\t(click)=\"onBodyClick($event)\"\n\t\t(mouseover)=\"onStageHover($event)\"\n\t\t(mouseout)=\"onStageHoverEnd($event)\"\n\t\t(contextmenu)=\"onStageContextMenu($event)\"\n\t>\n\t\t<pptx-slide-canvas\n\t\t\t[slide]=\"currentSlide()\"\n\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[zoom]=\"zoom()\"\n\t\t\t[autoFit]=\"false\"\n\t\t\t[interactive]=\"false\"\n\t\t\t[presenting]=\"true\"\n\t\t/>\n\n\t\t@if (activeTransition(); as t) {\n\t\t\t<pptx-presentation-transition-overlay\n\t\t\t\t[outgoingSlide]=\"t.outgoing\"\n\t\t\t\t[incomingSlide]=\"currentSlide()\"\n\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t[transition]=\"t.transition\"\n\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t[zoom]=\"zoom()\"\n\t\t\t\t(complete)=\"activeTransition.set(null)\"\n\t\t\t/>\n\t\t}\n\n\t\t<!-- Ink annotation overlay (pen/highlighter/eraser/laser). Ctrl+M\n\t\t hides the markup without discarding the strokes. The host carries\n\t\t the shared blackboard z-index so strokes stay visible ABOVE the\n\t\t blackout sheet while the screen is blanked (the stage no longer\n\t\t creates a stacking context, see stageContainerStyle). -->\n\t\t@if (inkMarkupVisible()) {\n\t\t\t<pptx-presentation-annotation-overlay\n\t\t\t\tdata-pptx-annotation-overlay\n\t\t\t\t[style.z-index]=\"annotationOverlayZ()\"\n\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t[zoom]=\"zoom()\"\n\t\t\t/>\n\t\t}\n\t</div>\n\t@if (presenterWindow.snapshot().blackout !== 'none') {\n\t\t<div\n\t\t\tclass=\"presenter-blank\"\n\t\t\tdata-pptx-blackout\n\t\t\t[style.background]=\"presenterWindow.snapshot().blackout\"\n\t\t></div>\n\t}\n\t@if (presenterWindow.snapshot().pointer?.tool === 'laser') {\n\t\t<div\n\t\t\tclass=\"presenter-laser\"\n\t\t\t[style.left.%]=\"(presenterWindow.snapshot().pointer?.x ?? 0.5) * 100\"\n\t\t\t[style.top.%]=\"(presenterWindow.snapshot().pointer?.y ?? 0.5) * 100\"\n\t\t></div>\n\t}\n\t@if (presenterWindow.snapshot().subtitlesVisible && presenterWindow.snapshot().caption) {\n\t\t<div class=\"presenter-caption\">{{ presenterWindow.snapshot().caption }}</div>\n\t}\n\n\t<!-- Live-caption (subtitle) bar. -->\n\t<pptx-presentation-subtitle-bar [visible]=\"subtitlesVisible()\" />\n\n\t<!--\n\t\tTouch-only chrome (close button, edge arrows, counter pill). The\n\t\tcomponent stylesheet hides all three unless the device has a coarse\n\t\tpointer, matching React's `PresentationTouchControls`: on a desktop they\n\t\tduplicate the toolbar above and put a SECOND slide counter on screen.\n\n\t\tRendered BEFORE the show toolbar, as React renders its touch controls,\n\t\tbecause both carry the same accessible names (\"Next Slide\", \"Previous\n\t\tSlide\", \"End Presentation\"). On a coarse pointer the toolbar's copies are\n\t\tstill in the DOM but inert (`pointer-events: none`), so whichever comes\n\t\tfirst is what a by-name lookup - a screen reader's, or a spec's `.first()`\n\t\t- resolves to. With the toolbar first, every such lookup landed on a\n\t\tbutton no user could press: it reported itself visible and enabled, and\n\t\tthe tap was swallowed by the overlay. Position is fixed on all of these,\n\t\tso moving them in the DOM does not move them on screen.\n\t-->\n\t<!-- Always-visible close button (top-right, safe-area aware). -->\n\t<button\n\t\ttype=\"button\"\n\t\tclass=\"pptx-ng-presentation-close\"\n\t\t[ngStyle]=\"closeButtonStyle\"\n\t\t(click)=\"onChromeButton($event, 'close')\"\n\t\t(touchend)=\"onChromeButtonTouch($event, 'close')\"\n\t\t[attr.aria-label]=\"'pptx.presenter.endPresentation' | translate\"\n\t>\n\t\t<svg lucideX class=\"h-5 w-5\"></svg>\n\t</button>\n\n\t<!-- Edge navigation buttons (vertically centred, touch-friendly). -->\n\t<button\n\t\ttype=\"button\"\n\t\tclass=\"pptx-ng-presentation-nav pptx-ng-presentation-prev\"\n\t\t[ngStyle]=\"prevButtonStyle\"\n\t\t(click)=\"onChromeButton($event, 'prev')\"\n\t\t(touchend)=\"onChromeButtonTouch($event, 'prev')\"\n\t\t[attr.aria-label]=\"'pptx.presenter.previousSlide' | translate\"\n\t>\n\t\t<svg lucideChevronLeft class=\"h-6 w-6\"></svg>\n\t</button>\n\t<button\n\t\ttype=\"button\"\n\t\tclass=\"pptx-ng-presentation-nav pptx-ng-presentation-next\"\n\t\t[ngStyle]=\"nextButtonStyle\"\n\t\t(click)=\"onChromeButton($event, 'next')\"\n\t\t(touchend)=\"onChromeButtonTouch($event, 'next')\"\n\t\t[attr.aria-label]=\"'pptx.presenter.nextSlide' | translate\"\n\t>\n\t\t<svg lucideChevronRight class=\"h-6 w-6\"></svg>\n\t</button>\n\n\t<!--\n\t\tThe show toolbar (bottom-centre, auto-hiding): navigation, counter,\n\t\telapsed time, annotation tools, presenter view and end-show, per\n\t\t`PRESENT_TOOLBAR_CONTROLS` in pptx-viewer-shared.\n\t-->\n\t<pptx-presentation-toolbar\n\t\t#toolbar\n\t\t[currentSlideIndex]=\"currentIndex()\"\n\t\t[totalSlides]=\"slides().length\"\n\t\t[presentationStartTime]=\"showStartedAt\"\n\t\t[presenterMode]=\"presenterMode()\"\n\t\t[popupToolbarEnabled]=\"showPopupToolbar()\"\n\t\t(move)=\"navigator.navigate($event === 1 ? 'next' : 'prev')\"\n\t\t(presenterViewToggle)=\"presenterViewToggle.emit()\"\n\t\t(endPresentation)=\"onToolbarEnd()\"\n\t/>\n\n\t<!--\n\t\tPowerPoint's \"See All Slides\" (Ctrl+S during a show). The same navigator\n\t\tthe presenter console uses, laid over the show itself: the shortcut exists\n\t\tso a presenter can reach a backup slide WITHOUT leaving the show, so it\n\t\tmust not be a door into presenter view.\n\t-->\n\t@if (allSlidesOpen()) {\n\t\t<pptx-presenter-slide-navigator\n\t\t\t[slides]=\"slides()\"\n\t\t\t[current]=\"currentIndex()\"\n\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t(select)=\"onNavigatorSelect($event)\"\n\t\t\t(close)=\"allSlidesOpen.set(false)\"\n\t\t/>\n\t}\n\n\t<!-- Slide-show right-click menu. -->\n\t@if (contextMenuState(); as pos) {\n\t\t<pptx-presentation-context-menu\n\t\t\t[x]=\"pos.x\"\n\t\t\t[y]=\"pos.y\"\n\t\t\t(action)=\"onContextMenuAction($event)\"\n\t\t\t(closed)=\"contextMenuState.set(null)\"\n\t\t/>\n\t}\n\n\t<!-- `ppaction://program` (\"Run program\") notices: see run-program-notices.component.ts. -->\n\t<pptx-run-program-notices\n\t\t[notices]=\"runProgramNotices.notices()\"\n\t\t(dismiss)=\"runProgramNotices.dismiss($event)\"\n\t/>\n</div>\n", styles: [":host{display:block;position:fixed;inset:0;z-index:10000;background:#000;cursor:pointer;-webkit-user-select:none;user-select:none;overflow:hidden}.pptx-ng-presentation-root{position:absolute;inset:0;touch-action:pan-y;overflow:hidden}.pptx-ng-presentation-close:hover,.pptx-ng-presentation-nav:hover{background:#000000bf}@media not all and (any-pointer:coarse){.pptx-ng-presentation-close,.pptx-ng-presentation-nav,.pptx-ng-presentation-counter{display:none!important}}.presenter-blank{position:absolute;inset:0;z-index:75;pointer-events:none}.pptx-ng-presentation-end{position:absolute;inset:0;z-index:90;display:flex;align-items:flex-start;border:0;padding:0;background:#000;text-align:left;cursor:default}.pptx-ng-presentation-end span{padding:.75rem 1rem;color:#ffffffb3;font-size:12px}.presenter-laser{position:absolute;z-index:76;width:20px;height:20px;transform:translate(-50%,-50%);border-radius:50%;background:#ef4444;box-shadow:0 0 20px 8px #ef444488;pointer-events:none}.presenter-caption{position:absolute;z-index:77;left:10%;right:10%;bottom:2rem;padding:.75rem 1.5rem;border-radius:.5rem;background:#000c;color:#fff;text-align:center;font-size:1.25rem;pointer-events: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", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresentationTransitionOverlayComponent, selector: "pptx-presentation-transition-overlay", inputs: ["outgoingSlide", "canvasSize", "transition", "templateElements", "mediaDataUrls", "durationMs", "zoom", "incomingSlide"], 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: PresentationToolbarComponent, selector: "pptx-presentation-toolbar", inputs: ["currentSlideIndex", "totalSlides", "presentationStartTime", "presenterMode", "popupToolbarEnabled"], outputs: ["move", "endPresentation", "presenterViewToggle"] }, { kind: "component", type: PresentationContextMenuComponent, selector: "pptx-presentation-context-menu", inputs: ["x", "y"], outputs: ["closed", "action"] }, { kind: "component", type: PresenterSlideNavigatorComponent, selector: "pptx-presenter-slide-navigator", inputs: ["slides", "current", "canvasSize", "mediaDataUrls", "templateElements"], outputs: ["select", "close"] }, { kind: "component", type: RunProgramNoticesComponent, selector: "pptx-run-program-notices", inputs: ["notices"], outputs: ["dismiss"] }, { 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 }); }
|
|
136642
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", 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 }, activeCustomShow: { classPropertyName: "activeCustomShow", publicName: "activeCustomShow", isSignal: true, isRequired: false, transformFunction: null }, authoredRange: { classPropertyName: "authoredRange", publicName: "authoredRange", isSignal: true, isRequired: false, transformFunction: null }, loopContinuously: { classPropertyName: "loopContinuously", publicName: "loopContinuously", isSignal: true, isRequired: false, transformFunction: null }, showWithAnimation: { classPropertyName: "showWithAnimation", publicName: "showWithAnimation", isSignal: true, isRequired: false, transformFunction: null }, useTimings: { classPropertyName: "useTimings", publicName: "useTimings", isSignal: true, isRequired: false, transformFunction: null }, subtitlesVisible: { classPropertyName: "subtitlesVisible", publicName: "subtitlesVisible", isSignal: true, isRequired: false, transformFunction: null }, sessionEnded: { classPropertyName: "sessionEnded", publicName: "sessionEnded", isSignal: true, isRequired: false, transformFunction: null }, endWithBlackSlide: { classPropertyName: "endWithBlackSlide", publicName: "endWithBlackSlide", isSignal: true, isRequired: false, transformFunction: null }, pixelateMosaicAnimation: { classPropertyName: "pixelateMosaicAnimation", publicName: "pixelateMosaicAnimation", isSignal: true, isRequired: false, transformFunction: null }, presenterMode: { classPropertyName: "presenterMode", publicName: "presenterMode", isSignal: true, isRequired: false, transformFunction: null }, showMenuOnRightClick: { classPropertyName: "showMenuOnRightClick", publicName: "showMenuOnRightClick", isSignal: true, isRequired: false, transformFunction: null }, showPopupToolbar: { classPropertyName: "showPopupToolbar", publicName: "showPopupToolbar", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { indexChange: "indexChange", closed: "closed", subtitlesChange: "subtitlesChange", presenterViewToggle: "presenterViewToggle", annotationsExit: "annotationsExit", customShowRequest: "customShowRequest", endOfShowChange: "endOfShowChange" }, host: { listeners: { "document:wheel": "onWheel($event)", "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 }, { propertyName: "toolbarRef", first: true, predicate: PresentationToolbarComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div #root class=\"pptx-ng-presentation-root\">\n\t<!--\n\t\tSlide counter, rendered first in DOM (before slide content) so a\n\t\tgeneric \"N / M\" text query resolves to it rather than to any slide-text\n\t\trun that happens to read like \"24 / 7\". Position is fixed, so DOM order\n\t\tdoes not affect its on-screen placement.\n\t-->\n\t<span class=\"pptx-ng-presentation-counter\" [ngStyle]=\"counterStyle\">\n\t\t{{ counterLabel() }}\n\t</span>\n\n\t<!-- Black \"End of slide show\" screen: the show has run past its last\n\t slide. It MUST be visible - while it is up the next input either\n\t goes nowhere (backward) or ends the show (forward), so a deck that\n\t kept painting the last slide looked stuck and swallowed advances. -->\n\t@if (endOfShow()) {\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"pptx-ng-presentation-end\"\n\t\t\tdata-pptx-end-of-show\n\t\t\t(click)=\"onEndScreenClick($event)\"\n\t\t>\n\t\t\t<span>{{ 'pptx.presentation.endOfSlideShow' | translate }}</span>\n\t\t</button>\n\t}\n\n\t<div\n\t\t#stage\n\t\tclass=\"pptx-ng-presentation-stage\"\n\t\t[ngStyle]=\"stageContainerStyle()\"\n\t\t(click)=\"onBodyClick($event)\"\n\t\t(mouseover)=\"onStageHover($event)\"\n\t\t(mouseout)=\"onStageHoverEnd($event)\"\n\t\t(contextmenu)=\"onStageContextMenu($event)\"\n\t>\n\t\t<pptx-slide-canvas\n\t\t\t[slide]=\"currentSlide()\"\n\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[zoom]=\"zoom()\"\n\t\t\t[autoFit]=\"false\"\n\t\t\t[interactive]=\"false\"\n\t\t\t[presenting]=\"true\"\n\t\t/>\n\n\t\t@if (activeTransition(); as t) {\n\t\t\t<pptx-presentation-transition-overlay\n\t\t\t\t[outgoingSlide]=\"t.outgoing\"\n\t\t\t\t[incomingSlide]=\"currentSlide()\"\n\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t[transition]=\"t.transition\"\n\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t[zoom]=\"zoom()\"\n\t\t\t\t(complete)=\"activeTransition.set(null)\"\n\t\t\t/>\n\t\t}\n\n\t\t<!-- Ink annotation overlay (pen/highlighter/eraser/laser). Ctrl+M\n\t\t hides the markup without discarding the strokes. The host carries\n\t\t the shared blackboard z-index so strokes stay visible ABOVE the\n\t\t blackout sheet while the screen is blanked (the stage no longer\n\t\t creates a stacking context, see stageContainerStyle). -->\n\t\t@if (inkMarkupVisible()) {\n\t\t\t<pptx-presentation-annotation-overlay\n\t\t\t\tdata-pptx-annotation-overlay\n\t\t\t\t[style.z-index]=\"annotationOverlayZ()\"\n\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t[zoom]=\"zoom()\"\n\t\t\t/>\n\t\t}\n\t</div>\n\t@if (presenterWindow.snapshot().blackout !== 'none') {\n\t\t<div\n\t\t\tclass=\"presenter-blank\"\n\t\t\tdata-pptx-blackout\n\t\t\t[style.background]=\"presenterWindow.snapshot().blackout\"\n\t\t></div>\n\t}\n\t@if (presenterWindow.snapshot().pointer?.tool === 'laser') {\n\t\t<div\n\t\t\tclass=\"presenter-laser\"\n\t\t\t[style.left.%]=\"(presenterWindow.snapshot().pointer?.x ?? 0.5) * 100\"\n\t\t\t[style.top.%]=\"(presenterWindow.snapshot().pointer?.y ?? 0.5) * 100\"\n\t\t></div>\n\t}\n\t@if (presenterWindow.snapshot().subtitlesVisible && presenterWindow.snapshot().caption) {\n\t\t<div class=\"presenter-caption\">{{ presenterWindow.snapshot().caption }}</div>\n\t}\n\n\t<!-- Live-caption (subtitle) bar. -->\n\t<pptx-presentation-subtitle-bar [visible]=\"subtitlesVisible()\" />\n\n\t<!--\n\t\tTouch-only chrome (close button, edge arrows, counter pill). The\n\t\tcomponent stylesheet hides all three unless the device has a coarse\n\t\tpointer, matching React's `PresentationTouchControls`: on a desktop they\n\t\tduplicate the toolbar above and put a SECOND slide counter on screen.\n\n\t\tRendered BEFORE the show toolbar, as React renders its touch controls,\n\t\tbecause both carry the same accessible names (\"Next Slide\", \"Previous\n\t\tSlide\", \"End Presentation\"). On a coarse pointer the toolbar's copies are\n\t\tstill in the DOM but inert (`pointer-events: none`), so whichever comes\n\t\tfirst is what a by-name lookup - a screen reader's, or a spec's `.first()`\n\t\t- resolves to. With the toolbar first, every such lookup landed on a\n\t\tbutton no user could press: it reported itself visible and enabled, and\n\t\tthe tap was swallowed by the overlay. Position is fixed on all of these,\n\t\tso moving them in the DOM does not move them on screen.\n\t-->\n\t<!-- Always-visible close button (top-right, safe-area aware). -->\n\t<button\n\t\ttype=\"button\"\n\t\tclass=\"pptx-ng-presentation-close\"\n\t\t[ngStyle]=\"closeButtonStyle\"\n\t\t(click)=\"onChromeButton($event, 'close')\"\n\t\t(touchend)=\"onChromeButtonTouch($event, 'close')\"\n\t\t[attr.aria-label]=\"'pptx.presenter.endPresentation' | translate\"\n\t>\n\t\t<svg lucideX class=\"h-5 w-5\"></svg>\n\t</button>\n\n\t<!-- Edge navigation buttons (vertically centred, touch-friendly). -->\n\t<button\n\t\ttype=\"button\"\n\t\tclass=\"pptx-ng-presentation-nav pptx-ng-presentation-prev\"\n\t\t[ngStyle]=\"prevButtonStyle\"\n\t\t(click)=\"onChromeButton($event, 'prev')\"\n\t\t(touchend)=\"onChromeButtonTouch($event, 'prev')\"\n\t\t[attr.aria-label]=\"'pptx.presenter.previousSlide' | translate\"\n\t>\n\t\t<svg lucideChevronLeft class=\"h-6 w-6\"></svg>\n\t</button>\n\t<button\n\t\ttype=\"button\"\n\t\tclass=\"pptx-ng-presentation-nav pptx-ng-presentation-next\"\n\t\t[ngStyle]=\"nextButtonStyle\"\n\t\t(click)=\"onChromeButton($event, 'next')\"\n\t\t(touchend)=\"onChromeButtonTouch($event, 'next')\"\n\t\t[attr.aria-label]=\"'pptx.presenter.nextSlide' | translate\"\n\t>\n\t\t<svg lucideChevronRight class=\"h-6 w-6\"></svg>\n\t</button>\n\n\t<!--\n\t\tThe show toolbar (bottom-centre, auto-hiding): navigation, counter,\n\t\telapsed time, annotation tools, presenter view and end-show, per\n\t\t`PRESENT_TOOLBAR_CONTROLS` in pptx-viewer-shared.\n\t-->\n\t<pptx-presentation-toolbar\n\t\t#toolbar\n\t\t[currentSlideIndex]=\"currentIndex()\"\n\t\t[totalSlides]=\"slides().length\"\n\t\t[presentationStartTime]=\"showStartedAt\"\n\t\t[presenterMode]=\"presenterMode()\"\n\t\t[popupToolbarEnabled]=\"showPopupToolbar()\"\n\t\t(move)=\"navigator.navigate($event === 1 ? 'next' : 'prev')\"\n\t\t(presenterViewToggle)=\"presenterViewToggle.emit()\"\n\t\t(endPresentation)=\"onToolbarEnd()\"\n\t/>\n\n\t<!--\n\t\tPowerPoint's \"See All Slides\" (Ctrl+S during a show). The same navigator\n\t\tthe presenter console uses, laid over the show itself: the shortcut exists\n\t\tso a presenter can reach a backup slide WITHOUT leaving the show, so it\n\t\tmust not be a door into presenter view.\n\t-->\n\t@if (allSlidesOpen()) {\n\t\t<pptx-presenter-slide-navigator\n\t\t\t[slides]=\"slides()\"\n\t\t\t[current]=\"currentIndex()\"\n\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t(select)=\"onNavigatorSelect($event)\"\n\t\t\t(close)=\"allSlidesOpen.set(false)\"\n\t\t/>\n\t}\n\n\t<!-- Slide-show right-click menu. -->\n\t@if (contextMenuState(); as pos) {\n\t\t<pptx-presentation-context-menu\n\t\t\t[x]=\"pos.x\"\n\t\t\t[y]=\"pos.y\"\n\t\t\t(action)=\"onContextMenuAction($event)\"\n\t\t\t(closed)=\"contextMenuState.set(null)\"\n\t\t/>\n\t}\n\n\t<!-- `ppaction://program` (\"Run program\") notices: see run-program-notices.component.ts. -->\n\t<pptx-run-program-notices\n\t\t[notices]=\"runProgramNotices.notices()\"\n\t\t(dismiss)=\"runProgramNotices.dismiss($event)\"\n\t/>\n</div>\n", styles: [":host{display:block;position:fixed;inset:0;z-index:10000;background:#000;cursor:pointer;-webkit-user-select:none;user-select:none;overflow:hidden}.pptx-ng-presentation-root{position:absolute;inset:0;touch-action:pan-y;overflow:hidden}.pptx-ng-presentation-close:hover,.pptx-ng-presentation-nav:hover{background:#000000bf}@media not all and (any-pointer:coarse){.pptx-ng-presentation-close,.pptx-ng-presentation-nav,.pptx-ng-presentation-counter{display:none!important}}.presenter-blank{position:absolute;inset:0;z-index:75;pointer-events:none}.pptx-ng-presentation-end{position:absolute;inset:0;z-index:90;display:flex;align-items:flex-start;border:0;padding:0;background:#000;text-align:left;cursor:default}.pptx-ng-presentation-end span{padding:.75rem 1rem;color:#ffffffb3;font-size:12px}.presenter-laser{position:absolute;z-index:76;width:20px;height:20px;transform:translate(-50%,-50%);border-radius:50%;background:#ef4444;box-shadow:0 0 20px 8px #ef444488;pointer-events:none}.presenter-caption{position:absolute;z-index:77;left:10%;right:10%;bottom:2rem;padding:.75rem 1.5rem;border-radius:.5rem;background:#000c;color:#fff;text-align:center;font-size:1.25rem;pointer-events:none}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "fitPadding", "maxFitScale", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresentationTransitionOverlayComponent, selector: "pptx-presentation-transition-overlay", inputs: ["outgoingSlide", "canvasSize", "transition", "templateElements", "mediaDataUrls", "durationMs", "zoom", "incomingSlide"], 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: PresentationToolbarComponent, selector: "pptx-presentation-toolbar", inputs: ["currentSlideIndex", "totalSlides", "presentationStartTime", "presenterMode", "popupToolbarEnabled"], outputs: ["move", "endPresentation", "presenterViewToggle"] }, { kind: "component", type: PresentationContextMenuComponent, selector: "pptx-presentation-context-menu", inputs: ["x", "y"], outputs: ["closed", "action"] }, { kind: "component", type: PresenterSlideNavigatorComponent, selector: "pptx-presenter-slide-navigator", inputs: ["slides", "current", "canvasSize", "mediaDataUrls", "templateElements"], outputs: ["select", "close"] }, { kind: "component", type: RunProgramNoticesComponent, selector: "pptx-run-program-notices", inputs: ["notices"], outputs: ["dismiss"] }, { 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 }); }
|
|
136187
136643
|
}
|
|
136188
136644
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: PresentationOverlayComponent, decorators: [{
|
|
136189
136645
|
type: Component,
|
|
@@ -136888,7 +137344,7 @@ class PresenterViewComponent {
|
|
|
136888
137344
|
return { ...slide, elements: [...template, ...slide.elements] };
|
|
136889
137345
|
}
|
|
136890
137346
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: PresenterViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
136891
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: PresenterViewComponent, isStandalone: true, selector: "pptx-presenter-view", inputs: { slides: { classPropertyName: "slides", publicName: "slides", isSignal: true, isRequired: true, transformFunction: null }, currentSlideIndex: { classPropertyName: "currentSlideIndex", publicName: "currentSlideIndex", isSignal: true, isRequired: true, transformFunction: null }, activeCustomShow: { classPropertyName: "activeCustomShow", publicName: "activeCustomShow", isSignal: true, isRequired: false, transformFunction: null }, authoredRange: { classPropertyName: "authoredRange", publicName: "authoredRange", isSignal: true, isRequired: false, transformFunction: null }, canvasSize: { classPropertyName: "canvasSize", publicName: "canvasSize", isSignal: true, isRequired: true, transformFunction: null }, templateElements: { classPropertyName: "templateElements", publicName: "templateElements", isSignal: true, isRequired: false, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, presentationStartTime: { classPropertyName: "presentationStartTime", publicName: "presentationStartTime", isSignal: true, isRequired: false, transformFunction: null }, isAudienceWindowOpen: { classPropertyName: "isAudienceWindowOpen", publicName: "isAudienceWindowOpen", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { movePresentationSlide: "movePresentationSlide", exit: "exit", openAudienceWindow: "openAudienceWindow", closeAudienceWindow: "closeAudienceWindow", navigateToSlide: "navigateToSlide" }, ngImport: i0, template: "@if (currentSlide(); as current) {\n\t<pptx-presenter-controls\n\t\t[snapshot]=\"presenterWindow.snapshot()\"\n\t\t[audienceOpen]=\"isAudienceWindowOpen()\"\n\t\t[slides]=\"slides()\"\n\t\t[current]=\"currentSlideIndex()\"\n\t\t[canvasSize]=\"canvasSize()\"\n\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t[templateElements]=\"templateElements()\"\n\t\t(patch)=\"presenterWindow.updateSnapshot($event)\"\n\t\t(navigate)=\"navigateToSlide.emit($event)\"\n\t\t(audience)=\"onToggleAudienceWindow()\"\n\t\t(swapDisplays)=\"onSwapDisplays()\"\n\t\t(end)=\"exit.emit()\"\n\t/>\n\t<div class=\"pptx-ng-presenter-body\">\n\t\t<!-- Current slide (\u224870%) -->\n\t\t<div\n\t\t\tclass=\"pptx-ng-presenter-current\"\n\t\t\t[class.pptx-ng-presenter-current--advances]=\"paneAdvancesOnClick()\"\n\t\t\trole=\"presentation\"\n\t\t\tdata-pptx-presenter-slide\n\t\t\t(click)=\"onSlidePaneClick()\"\n\t\t>\n\t\t\t<div class=\"pptx-ng-presenter-preview-stage\" [ngStyle]=\"previewStageStyle()\">\n\t\t\t\t<pptx-slide-canvas\n\t\t\t\t\t[slide]=\"currentPreviewSlide()\"\n\t\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t[zoom]=\"1\"\n\t\t\t\t\t[interactive]=\"false\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div class=\"pptx-ng-presenter-slide-badge\">{{ slideBadge() }}</div>\n\t\t</div>\n\n\t\t<!-- Controls (\u224830%) -->\n\t\t<div class=\"pptx-ng-presenter-side\">\n\t\t\t<!-- Header: clock + elapsed + window/exit -->\n\t\t\t<div class=\"pptx-ng-presenter-header\">\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"pptx-ng-presenter-label\">\n\t\t\t\t\t\t{{ 'pptx.presenter.currentTime' | translate }}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"pptx-ng-presenter-clock\">{{ clockLabel() }}</div>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"pptx-ng-presenter-label\">{{ 'pptx.presenter.elapsed' | translate }}</div>\n\t\t\t\t\t<div class=\"pptx-ng-presenter-clock pptx-ng-presenter-elapsed\">\n\t\t\t\t\t\t{{ elapsedLabel() }}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div style=\"display: flex; align-items: center; gap: 0.25rem\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"pptx-ng-presenter-iconbtn\"\n\t\t\t\t\t\t(click)=\"onToggleAudienceWindow()\"\n\t\t\t\t\t\t[attr.aria-label]=\"\n\t\t\t\t\t\t\t(isAudienceWindowOpen()\n\t\t\t\t\t\t\t\t? 'pptx.presenter.closeAudienceWindow'\n\t\t\t\t\t\t\t\t: 'pptx.presenter.openAudienceWindow'\n\t\t\t\t\t\t\t) | translate\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t[title]=\"\n\t\t\t\t\t\t\t(isAudienceWindowOpen()\n\t\t\t\t\t\t\t\t? 'pptx.presenter.closeAudienceWindow'\n\t\t\t\t\t\t\t\t: 'pptx.presenter.openAudienceWindow'\n\t\t\t\t\t\t\t) | translate\n\t\t\t\t\t\t\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ isAudienceWindowOpen() ? '\u25A3' : '\u25A1' }}\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"pptx-ng-presenter-iconbtn\"\n\t\t\t\t\t\t(click)=\"exit.emit()\"\n\t\t\t\t\t\t[attr.aria-label]=\"'pptx.presenter.endPresentation' | translate\"\n\t\t\t\t\t\t[title]=\"'pptx.presenter.endPresentation' | translate\"\n\t\t\t\t\t>\n\t\t\t\t\t\t✕\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<!-- Navigation -->\n\t\t\t<div class=\"pptx-ng-presenter-nav\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-presenter-navbtn\"\n\t\t\t\t\t(click)=\"movePresentationSlide.emit(-1)\"\n\t\t\t\t\t[disabled]=\"prevDisabled()\"\n\t\t\t\t\tdata-pptx-presenter-control=\"prev\"\n\t\t\t\t\t[attr.aria-label]=\"'pptx.presenter.prev' | translate\"\n\t\t\t\t\t[title]=\"'pptx.presenter.prev' | translate\"\n\t\t\t\t>\n\t\t\t\t\t‹ {{ 'pptx.presenter.prev' | translate }}\n\t\t\t\t</button>\n\t\t\t\t<span class=\"pptx-ng-presenter-counter\">{{ counterLabel() }}</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-presenter-navbtn\"\n\t\t\t\t\t(click)=\"movePresentationSlide.emit(1)\"\n\t\t\t\t\t[disabled]=\"nextDisabled()\"\n\t\t\t\t\tdata-pptx-presenter-control=\"next\"\n\t\t\t\t\t[attr.aria-label]=\"'pptx.presenter.next' | translate\"\n\t\t\t\t\t[title]=\"'pptx.presenter.next' | translate\"\n\t\t\t\t>\n\t\t\t\t\t{{ 'pptx.presenter.next' | translate }} ›\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<!-- Next slide preview -->\n\t\t\t<div class=\"pptx-ng-presenter-next\" data-pptx-presenter-next-preview>\n\t\t\t\t<div class=\"pptx-ng-presenter-label\" style=\"margin-bottom: 0.5rem\">\n\t\t\t\t\t{{ 'pptx.presenter.nextSlidePreview' | translate }}\n\t\t\t\t</div>\n\t\t\t\t@if (nextPreviewSlide(); as next) {\n\t\t\t\t\t<pptx-slide-canvas\n\t\t\t\t\t\t[slide]=\"next\"\n\t\t\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t\t[zoom]=\"1\"\n\t\t\t\t\t\t[interactive]=\"false\"\n\t\t\t\t\t/>\n\t\t\t\t} @else {\n\t\t\t\t\t<div class=\"pptx-ng-presenter-next-empty\">\n\t\t\t\t\t\t{{ 'pptx.presenter.endOfPresentation' | translate }}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</div>\n\n\t\t\t<!-- Speaker notes -->\n\t\t\t<div class=\"pptx-ng-presenter-notes\" data-pptx-presenter-notes>\n\t\t\t\t<div class=\"pptx-ng-presenter-notes-head\">\n\t\t\t\t\t<div class=\"pptx-ng-presenter-label\">\n\t\t\t\t\t\t{{ 'pptx.presenter.speakerNotes' | translate }}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"pptx-ng-presenter-notes-size\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"pptx-ng-presenter-iconbtn\"\n\t\t\t\t\t\t\t(click)=\"decreaseNotesFontSize()\"\n\t\t\t\t\t\t\t[disabled]=\"notesFontSize() <= NOTES_FONT_SIZE_MIN\"\n\t\t\t\t\t\t\tdata-pptx-presenter-control=\"notes-font-decrease\"\n\t\t\t\t\t\t\t[attr.aria-label]=\"'pptx.presenter.decreaseFontSize' | translate\"\n\t\t\t\t\t\t\t[title]=\"'pptx.presenter.decreaseFontSize' | translate\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t−\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<span class=\"pptx-ng-presenter-notes-size-value\">{{ notesFontSize() }}px</span>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"pptx-ng-presenter-iconbtn\"\n\t\t\t\t\t\t\t(click)=\"increaseNotesFontSize()\"\n\t\t\t\t\t\t\t[disabled]=\"notesFontSize() >= NOTES_FONT_SIZE_MAX\"\n\t\t\t\t\t\t\tdata-pptx-presenter-control=\"notes-font-increase\"\n\t\t\t\t\t\t\t[attr.aria-label]=\"'pptx.presenter.increaseFontSize' | translate\"\n\t\t\t\t\t\t\t[title]=\"'pptx.presenter.increaseFontSize' | translate\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t+\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"pptx-ng-presenter-notes-body\" [ngStyle]=\"notesBodyStyle()\">\n\t\t\t\t\t@if (notes().hasRichNotes) {\n\t\t\t\t\t\t@for (seg of notes().segments; track seg.key) {\n\t\t\t\t\t\t\t@if (seg.isBreak) {\n\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t<span [ngStyle]=\"seg.style\">{{ seg.text }}</span>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} @else if (notes().hasAnyNotes) {\n\t\t\t\t\t\t{{ notes().plainText }}\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<span class=\"pptx-ng-presenter-notes-empty\">\n\t\t\t\t\t\t\t{{ 'pptx.presenter.noNotes' | translate }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<!-- Timer progress bar -->\n\t<div\n\t\tclass=\"pptx-ng-presenter-progress\"\n\t\trole=\"progressbar\"\n\t\t[attr.aria-valuenow]=\"progressValue()\"\n\t\taria-valuemin=\"0\"\n\t\taria-valuemax=\"100\"\n\t\t[attr.aria-label]=\"'pptx.presenter.timerProgress' | translate\"\n\t>\n\t\t<div class=\"pptx-ng-presenter-progress-fill\" [style.width.%]=\"timerPercent()\"></div>\n\t</div>\n} @else {\n\t<div class=\"pptx-ng-presenter-empty\">{{ 'pptx.presenter.noSlides' | translate }}</div>\n}\n", styles: [":host{position:absolute;inset:0;z-index:50;display:flex;flex-direction:column;background:var(--pptx-card, #0b0b0c);color:var(--pptx-foreground, #f5f5f5);font-family:system-ui,sans-serif}.pptx-ng-presenter-body{display:flex;flex:1 1 auto;min-height:0}.pptx-ng-presenter-current--advances{cursor:pointer}.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;overflow:hidden}.pptx-ng-presenter-preview-stage{width:100%;max-width:100%;min-height:0;transition:transform .2s ease}.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:var(--pptx-background, #18181b);border-left:1px solid var(--pptx-border, 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 var(--pptx-border, rgba(255, 255, 255, .12))}.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:var(--pptx-muted-foreground, rgba(255, 255, 255, .55))}.pptx-ng-presenter-clock{font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:1.125rem}.pptx-ng-presenter-elapsed{color:var(--pptx-primary, #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:var(--pptx-foreground, rgba(255, 255, 255, .7));cursor:pointer;font-size:1rem;line-height:1}.pptx-ng-presenter-iconbtn:hover{background:var(--pptx-secondary, rgba(255, 255, 255, .1));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:var(--pptx-secondary, rgba(255, 255, 255, .08));color:var(--pptx-foreground, #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 var(--pptx-border, rgba(255, 255, 255, .12));border-radius:6px;background:var(--pptx-muted, rgba(255, 255, 255, .04));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:var(--pptx-muted-foreground, rgba(255, 255, 255, .55));-webkit-user-select:none;user-select:none}.pptx-ng-presenter-notes-body{flex:1 1 auto;overflow-y:auto;border:1px solid var(--pptx-border, rgba(255, 255, 255, .12));border-radius:6px;background:var(--pptx-muted, rgba(255, 255, 255, .04));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", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresenterControlsComponent, selector: "pptx-presenter-controls", inputs: ["snapshot", "audienceOpen", "slides", "current", "canvasSize", "mediaDataUrls", "templateElements"], outputs: ["patch", "navigate", "audience", "swapDisplays", "end"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
137347
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: PresenterViewComponent, isStandalone: true, selector: "pptx-presenter-view", inputs: { slides: { classPropertyName: "slides", publicName: "slides", isSignal: true, isRequired: true, transformFunction: null }, currentSlideIndex: { classPropertyName: "currentSlideIndex", publicName: "currentSlideIndex", isSignal: true, isRequired: true, transformFunction: null }, activeCustomShow: { classPropertyName: "activeCustomShow", publicName: "activeCustomShow", isSignal: true, isRequired: false, transformFunction: null }, authoredRange: { classPropertyName: "authoredRange", publicName: "authoredRange", isSignal: true, isRequired: false, transformFunction: null }, canvasSize: { classPropertyName: "canvasSize", publicName: "canvasSize", isSignal: true, isRequired: true, transformFunction: null }, templateElements: { classPropertyName: "templateElements", publicName: "templateElements", isSignal: true, isRequired: false, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, presentationStartTime: { classPropertyName: "presentationStartTime", publicName: "presentationStartTime", isSignal: true, isRequired: false, transformFunction: null }, isAudienceWindowOpen: { classPropertyName: "isAudienceWindowOpen", publicName: "isAudienceWindowOpen", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { movePresentationSlide: "movePresentationSlide", exit: "exit", openAudienceWindow: "openAudienceWindow", closeAudienceWindow: "closeAudienceWindow", navigateToSlide: "navigateToSlide" }, ngImport: i0, template: "@if (currentSlide(); as current) {\n\t<pptx-presenter-controls\n\t\t[snapshot]=\"presenterWindow.snapshot()\"\n\t\t[audienceOpen]=\"isAudienceWindowOpen()\"\n\t\t[slides]=\"slides()\"\n\t\t[current]=\"currentSlideIndex()\"\n\t\t[canvasSize]=\"canvasSize()\"\n\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t[templateElements]=\"templateElements()\"\n\t\t(patch)=\"presenterWindow.updateSnapshot($event)\"\n\t\t(navigate)=\"navigateToSlide.emit($event)\"\n\t\t(audience)=\"onToggleAudienceWindow()\"\n\t\t(swapDisplays)=\"onSwapDisplays()\"\n\t\t(end)=\"exit.emit()\"\n\t/>\n\t<div class=\"pptx-ng-presenter-body\">\n\t\t<!-- Current slide (\u224870%) -->\n\t\t<div\n\t\t\tclass=\"pptx-ng-presenter-current\"\n\t\t\t[class.pptx-ng-presenter-current--advances]=\"paneAdvancesOnClick()\"\n\t\t\trole=\"presentation\"\n\t\t\tdata-pptx-presenter-slide\n\t\t\t(click)=\"onSlidePaneClick()\"\n\t\t>\n\t\t\t<div class=\"pptx-ng-presenter-preview-stage\" [ngStyle]=\"previewStageStyle()\">\n\t\t\t\t<pptx-slide-canvas\n\t\t\t\t\t[slide]=\"currentPreviewSlide()\"\n\t\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t[zoom]=\"1\"\n\t\t\t\t\t[interactive]=\"false\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div class=\"pptx-ng-presenter-slide-badge\">{{ slideBadge() }}</div>\n\t\t</div>\n\n\t\t<!-- Controls (\u224830%) -->\n\t\t<div class=\"pptx-ng-presenter-side\">\n\t\t\t<!-- Header: clock + elapsed + window/exit -->\n\t\t\t<div class=\"pptx-ng-presenter-header\">\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"pptx-ng-presenter-label\">\n\t\t\t\t\t\t{{ 'pptx.presenter.currentTime' | translate }}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"pptx-ng-presenter-clock\">{{ clockLabel() }}</div>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"pptx-ng-presenter-label\">{{ 'pptx.presenter.elapsed' | translate }}</div>\n\t\t\t\t\t<div class=\"pptx-ng-presenter-clock pptx-ng-presenter-elapsed\">\n\t\t\t\t\t\t{{ elapsedLabel() }}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div style=\"display: flex; align-items: center; gap: 0.25rem\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"pptx-ng-presenter-iconbtn\"\n\t\t\t\t\t\t(click)=\"onToggleAudienceWindow()\"\n\t\t\t\t\t\t[attr.aria-label]=\"\n\t\t\t\t\t\t\t(isAudienceWindowOpen()\n\t\t\t\t\t\t\t\t? 'pptx.presenter.closeAudienceWindow'\n\t\t\t\t\t\t\t\t: 'pptx.presenter.openAudienceWindow'\n\t\t\t\t\t\t\t) | translate\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t[title]=\"\n\t\t\t\t\t\t\t(isAudienceWindowOpen()\n\t\t\t\t\t\t\t\t? 'pptx.presenter.closeAudienceWindow'\n\t\t\t\t\t\t\t\t: 'pptx.presenter.openAudienceWindow'\n\t\t\t\t\t\t\t) | translate\n\t\t\t\t\t\t\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ isAudienceWindowOpen() ? '\u25A3' : '\u25A1' }}\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"pptx-ng-presenter-iconbtn\"\n\t\t\t\t\t\t(click)=\"exit.emit()\"\n\t\t\t\t\t\t[attr.aria-label]=\"'pptx.presenter.endPresentation' | translate\"\n\t\t\t\t\t\t[title]=\"'pptx.presenter.endPresentation' | translate\"\n\t\t\t\t\t>\n\t\t\t\t\t\t✕\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<!-- Navigation -->\n\t\t\t<div class=\"pptx-ng-presenter-nav\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-presenter-navbtn\"\n\t\t\t\t\t(click)=\"movePresentationSlide.emit(-1)\"\n\t\t\t\t\t[disabled]=\"prevDisabled()\"\n\t\t\t\t\tdata-pptx-presenter-control=\"prev\"\n\t\t\t\t\t[attr.aria-label]=\"'pptx.presenter.prev' | translate\"\n\t\t\t\t\t[title]=\"'pptx.presenter.prev' | translate\"\n\t\t\t\t>\n\t\t\t\t\t‹ {{ 'pptx.presenter.prev' | translate }}\n\t\t\t\t</button>\n\t\t\t\t<span class=\"pptx-ng-presenter-counter\">{{ counterLabel() }}</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-presenter-navbtn\"\n\t\t\t\t\t(click)=\"movePresentationSlide.emit(1)\"\n\t\t\t\t\t[disabled]=\"nextDisabled()\"\n\t\t\t\t\tdata-pptx-presenter-control=\"next\"\n\t\t\t\t\t[attr.aria-label]=\"'pptx.presenter.next' | translate\"\n\t\t\t\t\t[title]=\"'pptx.presenter.next' | translate\"\n\t\t\t\t>\n\t\t\t\t\t{{ 'pptx.presenter.next' | translate }} ›\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<!-- Next slide preview -->\n\t\t\t<div class=\"pptx-ng-presenter-next\" data-pptx-presenter-next-preview>\n\t\t\t\t<div class=\"pptx-ng-presenter-label\" style=\"margin-bottom: 0.5rem\">\n\t\t\t\t\t{{ 'pptx.presenter.nextSlidePreview' | translate }}\n\t\t\t\t</div>\n\t\t\t\t@if (nextPreviewSlide(); as next) {\n\t\t\t\t\t<pptx-slide-canvas\n\t\t\t\t\t\t[slide]=\"next\"\n\t\t\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t\t[zoom]=\"1\"\n\t\t\t\t\t\t[interactive]=\"false\"\n\t\t\t\t\t/>\n\t\t\t\t} @else {\n\t\t\t\t\t<div class=\"pptx-ng-presenter-next-empty\">\n\t\t\t\t\t\t{{ 'pptx.presenter.endOfPresentation' | translate }}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</div>\n\n\t\t\t<!-- Speaker notes -->\n\t\t\t<div class=\"pptx-ng-presenter-notes\" data-pptx-presenter-notes>\n\t\t\t\t<div class=\"pptx-ng-presenter-notes-head\">\n\t\t\t\t\t<div class=\"pptx-ng-presenter-label\">\n\t\t\t\t\t\t{{ 'pptx.presenter.speakerNotes' | translate }}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"pptx-ng-presenter-notes-size\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"pptx-ng-presenter-iconbtn\"\n\t\t\t\t\t\t\t(click)=\"decreaseNotesFontSize()\"\n\t\t\t\t\t\t\t[disabled]=\"notesFontSize() <= NOTES_FONT_SIZE_MIN\"\n\t\t\t\t\t\t\tdata-pptx-presenter-control=\"notes-font-decrease\"\n\t\t\t\t\t\t\t[attr.aria-label]=\"'pptx.presenter.decreaseFontSize' | translate\"\n\t\t\t\t\t\t\t[title]=\"'pptx.presenter.decreaseFontSize' | translate\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t−\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<span class=\"pptx-ng-presenter-notes-size-value\">{{ notesFontSize() }}px</span>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"pptx-ng-presenter-iconbtn\"\n\t\t\t\t\t\t\t(click)=\"increaseNotesFontSize()\"\n\t\t\t\t\t\t\t[disabled]=\"notesFontSize() >= NOTES_FONT_SIZE_MAX\"\n\t\t\t\t\t\t\tdata-pptx-presenter-control=\"notes-font-increase\"\n\t\t\t\t\t\t\t[attr.aria-label]=\"'pptx.presenter.increaseFontSize' | translate\"\n\t\t\t\t\t\t\t[title]=\"'pptx.presenter.increaseFontSize' | translate\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t+\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"pptx-ng-presenter-notes-body\" [ngStyle]=\"notesBodyStyle()\">\n\t\t\t\t\t@if (notes().hasRichNotes) {\n\t\t\t\t\t\t@for (seg of notes().segments; track seg.key) {\n\t\t\t\t\t\t\t@if (seg.isBreak) {\n\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t<span [ngStyle]=\"seg.style\">{{ seg.text }}</span>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} @else if (notes().hasAnyNotes) {\n\t\t\t\t\t\t{{ notes().plainText }}\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<span class=\"pptx-ng-presenter-notes-empty\">\n\t\t\t\t\t\t\t{{ 'pptx.presenter.noNotes' | translate }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<!-- Timer progress bar -->\n\t<div\n\t\tclass=\"pptx-ng-presenter-progress\"\n\t\trole=\"progressbar\"\n\t\t[attr.aria-valuenow]=\"progressValue()\"\n\t\taria-valuemin=\"0\"\n\t\taria-valuemax=\"100\"\n\t\t[attr.aria-label]=\"'pptx.presenter.timerProgress' | translate\"\n\t>\n\t\t<div class=\"pptx-ng-presenter-progress-fill\" [style.width.%]=\"timerPercent()\"></div>\n\t</div>\n} @else {\n\t<div class=\"pptx-ng-presenter-empty\">{{ 'pptx.presenter.noSlides' | translate }}</div>\n}\n", styles: [":host{position:absolute;inset:0;z-index:50;display:flex;flex-direction:column;background:var(--pptx-card, #0b0b0c);color:var(--pptx-foreground, #f5f5f5);font-family:system-ui,sans-serif}.pptx-ng-presenter-body{display:flex;flex:1 1 auto;min-height:0}.pptx-ng-presenter-current--advances{cursor:pointer}.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;overflow:hidden}.pptx-ng-presenter-preview-stage{width:100%;max-width:100%;min-height:0;transition:transform .2s ease}.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:var(--pptx-background, #18181b);border-left:1px solid var(--pptx-border, 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 var(--pptx-border, rgba(255, 255, 255, .12))}.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:var(--pptx-muted-foreground, rgba(255, 255, 255, .55))}.pptx-ng-presenter-clock{font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:1.125rem}.pptx-ng-presenter-elapsed{color:var(--pptx-primary, #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:var(--pptx-foreground, rgba(255, 255, 255, .7));cursor:pointer;font-size:1rem;line-height:1}.pptx-ng-presenter-iconbtn:hover{background:var(--pptx-secondary, rgba(255, 255, 255, .1));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:var(--pptx-secondary, rgba(255, 255, 255, .08));color:var(--pptx-foreground, #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 var(--pptx-border, rgba(255, 255, 255, .12));border-radius:6px;background:var(--pptx-muted, rgba(255, 255, 255, .04));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:var(--pptx-muted-foreground, rgba(255, 255, 255, .55));-webkit-user-select:none;user-select:none}.pptx-ng-presenter-notes-body{flex:1 1 auto;overflow-y:auto;border:1px solid var(--pptx-border, rgba(255, 255, 255, .12));border-radius:6px;background:var(--pptx-muted, rgba(255, 255, 255, .04));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", "fitPadding", "maxFitScale", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresenterControlsComponent, selector: "pptx-presenter-controls", inputs: ["snapshot", "audienceOpen", "slides", "current", "canvasSize", "mediaDataUrls", "templateElements"], outputs: ["patch", "navigate", "audience", "swapDisplays", "end"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
136892
137348
|
}
|
|
136893
137349
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: PresenterViewComponent, decorators: [{
|
|
136894
137350
|
type: Component,
|
|
@@ -138297,7 +138753,7 @@ class ReadingViewOverlayComponent {
|
|
|
138297
138753
|
</div>
|
|
138298
138754
|
</div>
|
|
138299
138755
|
}
|
|
138300
|
-
`, isInline: true, styles: [".pptx-ng-reading-root{position:fixed;inset:0;z-index:1300;display:flex;flex-direction:column;background:#171717}.pptx-ng-reading-viewport{display:flex;flex:1 1 0%;min-height:0;align-items:center;justify-content:center}.pptx-ng-reading-stage{position:relative;overflow:hidden}.pptx-ng-reading-stage ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}.pptx-ng-reading-nav{display:flex;flex-shrink:0;align-items:center;justify-content:center;gap:.75rem;padding:.5rem 1rem;border-top:1px solid rgba(255,255,255,.1)}.pptx-ng-reading-btn{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;border:none;border-radius:.25rem;background:transparent;color:#fffc;cursor:pointer;transition:background .15s,color .15s}.pptx-ng-reading-btn:hover:not(:disabled){background:#ffffff26;color:#fff}.pptx-ng-reading-btn:disabled{cursor:default;opacity:.3}.pptx-ng-reading-counter{min-width:4rem;text-align:center;font-size:.75rem;font-variant-numeric:tabular-nums;color:#ffffffb3}\n"], dependencies: [{ kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: LucideChevronLeft, selector: "svg[lucideChevronLeft]" }, { kind: "component", type: LucideChevronRight, selector: "svg[lucideChevronRight]" }, { kind: "component", type: LucideX, selector: "svg[lucideX]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
138756
|
+
`, isInline: true, styles: [".pptx-ng-reading-root{position:fixed;inset:0;z-index:1300;display:flex;flex-direction:column;background:#171717}.pptx-ng-reading-viewport{display:flex;flex:1 1 0%;min-height:0;align-items:center;justify-content:center}.pptx-ng-reading-stage{position:relative;overflow:hidden}.pptx-ng-reading-stage ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}.pptx-ng-reading-nav{display:flex;flex-shrink:0;align-items:center;justify-content:center;gap:.75rem;padding:.5rem 1rem;border-top:1px solid rgba(255,255,255,.1)}.pptx-ng-reading-btn{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;border:none;border-radius:.25rem;background:transparent;color:#fffc;cursor:pointer;transition:background .15s,color .15s}.pptx-ng-reading-btn:hover:not(:disabled){background:#ffffff26;color:#fff}.pptx-ng-reading-btn:disabled{cursor:default;opacity:.3}.pptx-ng-reading-counter{min-width:4rem;text-align:center;font-size:.75rem;font-variant-numeric:tabular-nums;color:#ffffffb3}\n"], dependencies: [{ kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "fitPadding", "maxFitScale", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: LucideChevronLeft, selector: "svg[lucideChevronLeft]" }, { kind: "component", type: LucideChevronRight, selector: "svg[lucideChevronRight]" }, { kind: "component", type: LucideX, selector: "svg[lucideX]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
138301
138757
|
}
|
|
138302
138758
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ReadingViewOverlayComponent, decorators: [{
|
|
138303
138759
|
type: Component,
|
|
@@ -138951,9 +139407,30 @@ function patchTextStyle(editor, slideIndex, el, patch) {
|
|
|
138951
139407
|
if (!el || !hasTextProperties(el)) {
|
|
138952
139408
|
return;
|
|
138953
139409
|
}
|
|
138954
|
-
|
|
138955
|
-
|
|
138956
|
-
|
|
139410
|
+
const { listType, ...stylePatch } = patch;
|
|
139411
|
+
if (listType !== undefined) {
|
|
139412
|
+
const liveText = currentInlineEditorText();
|
|
139413
|
+
const base = liveText === undefined
|
|
139414
|
+
? el
|
|
139415
|
+
: {
|
|
139416
|
+
...el,
|
|
139417
|
+
text: liveText,
|
|
139418
|
+
textSegments: el.textSegments
|
|
139419
|
+
? remapTextToSegments(liveText, el.textSegments, el.textStyle)
|
|
139420
|
+
: undefined,
|
|
139421
|
+
};
|
|
139422
|
+
const listed = { ...base, ...setElementBullets(base, listType) };
|
|
139423
|
+
if (!hasTextProperties(listed)) {
|
|
139424
|
+
return;
|
|
139425
|
+
}
|
|
139426
|
+
editor.updateElement(slideIndex, el.id, {
|
|
139427
|
+
...(liveText !== undefined ? { text: liveText } : {}),
|
|
139428
|
+
textSegments: listed.textSegments,
|
|
139429
|
+
...textStylePatch(listed, stylePatch),
|
|
139430
|
+
});
|
|
139431
|
+
return;
|
|
139432
|
+
}
|
|
139433
|
+
editor.updateElement(slideIndex, el.id, textStylePatch(el, patch));
|
|
138957
139434
|
}
|
|
138958
139435
|
/**
|
|
138959
139436
|
* Rewrite the selection's text characters (ribbon Aa "Change Case" dropdown).
|
|
@@ -143558,7 +144035,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
143558
144035
|
}], propDecorators: { canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], slideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideIndex", required: false }] }], selectedElement: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedElement", required: false }] }] } });
|
|
143559
144036
|
|
|
143560
144037
|
// Generated by scripts/inline-shared.mjs from package.json. Do not edit.
|
|
143561
|
-
const PPTX_ANGULAR_VIEWER_VERSION = "3.16.
|
|
144038
|
+
const PPTX_ANGULAR_VIEWER_VERSION = "3.16.7";
|
|
143562
144039
|
|
|
143563
144040
|
/**
|
|
143564
144041
|
* account-page.component.ts: File > Account content.
|
|
@@ -144863,12 +145340,19 @@ class RibbonParagraphControlsComponent {
|
|
|
144863
145340
|
...(ngDevMode ? [{ debugName: "slideIndex" }] : /* istanbul ignore next */ []));
|
|
144864
145341
|
this.selectedElement = input(null, /* @ts-ignore */
|
|
144865
145342
|
...(ngDevMode ? [{ debugName: "selectedElement" }] : /* istanbul ignore next */ []));
|
|
145343
|
+
this.canEdit = input(false, /* @ts-ignore */
|
|
145344
|
+
...(ngDevMode ? [{ debugName: "canEdit" }] : /* istanbul ignore next */ []));
|
|
144866
145345
|
this.lineSpacingOptions = LINE_SPACING_OPTIONS;
|
|
144867
145346
|
this.textDirectionOptions = TEXT_DIRECTION_OPTIONS;
|
|
144868
145347
|
this.columnOptions = COLUMN_OPTIONS;
|
|
144869
145348
|
/** Current text style of the selection (for active-state highlighting). */
|
|
144870
145349
|
this.curStyle = computed(() => textStyleOf(this.selectedElement()), /* @ts-ignore */
|
|
144871
145350
|
...(ngDevMode ? [{ debugName: "curStyle" }] : /* istanbul ignore next */ []));
|
|
145351
|
+
this.listKind = computed(() => {
|
|
145352
|
+
const element = this.selectedElement();
|
|
145353
|
+
return element ? elementBulletKind(element) : 'none';
|
|
145354
|
+
}, /* @ts-ignore */
|
|
145355
|
+
...(ngDevMode ? [{ debugName: "listKind" }] : /* istanbul ignore next */ []));
|
|
144872
145356
|
}
|
|
144873
145357
|
isText() {
|
|
144874
145358
|
return isTextElement(this.selectedElement());
|
|
@@ -144887,7 +145371,10 @@ class RibbonParagraphControlsComponent {
|
|
|
144887
145371
|
}
|
|
144888
145372
|
/** Toggle the paragraph list style (bullet / numbered) off when already set. */
|
|
144889
145373
|
toggleList(kind) {
|
|
144890
|
-
|
|
145374
|
+
if (!this.canEdit()) {
|
|
145375
|
+
return;
|
|
145376
|
+
}
|
|
145377
|
+
this.patch({ listType: this.listKind() === kind ? 'none' : kind });
|
|
144891
145378
|
}
|
|
144892
145379
|
/** Step the paragraph left-indent by `deltaPx` (clamped at 0). */
|
|
144893
145380
|
changeIndent(deltaPx) {
|
|
@@ -144910,14 +145397,15 @@ class RibbonParagraphControlsComponent {
|
|
|
144910
145397
|
patchTextStyle(this.editor, this.slideIndex(), this.selectedElement(), patch);
|
|
144911
145398
|
}
|
|
144912
145399
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RibbonParagraphControlsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
144913
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RibbonParagraphControlsComponent, isStandalone: true, selector: "pptx-ribbon-paragraph-controls", inputs: { slideIndex: { classPropertyName: "slideIndex", publicName: "slideIndex", isSignal: true, isRequired: false, transformFunction: null }, selectedElement: { classPropertyName: "selectedElement", publicName: "selectedElement", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "contents" }, ngImport: i0, template: `
|
|
145400
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: RibbonParagraphControlsComponent, isStandalone: true, selector: "pptx-ribbon-paragraph-controls", inputs: { slideIndex: { classPropertyName: "slideIndex", publicName: "slideIndex", isSignal: true, isRequired: false, transformFunction: null }, selectedElement: { classPropertyName: "selectedElement", publicName: "selectedElement", isSignal: true, isRequired: false, transformFunction: null }, canEdit: { classPropertyName: "canEdit", publicName: "canEdit", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "contents" }, ngImport: i0, template: `
|
|
144914
145401
|
<!-- List style: bullets + numbering -->
|
|
144915
145402
|
<div class="pptx-rb-grp">
|
|
144916
145403
|
<button
|
|
144917
145404
|
type="button"
|
|
144918
145405
|
class="pptx-rb-gb"
|
|
144919
|
-
[disabled]="!isText()"
|
|
144920
|
-
[ngClass]="
|
|
145406
|
+
[disabled]="!canEdit() || !isText()"
|
|
145407
|
+
[ngClass]="listKind() === 'bullet' ? 'bg-accent' : ''"
|
|
145408
|
+
[attr.aria-pressed]="listKind() === 'bullet'"
|
|
144921
145409
|
[title]="'pptx.ribbon.bulletList' | translate"
|
|
144922
145410
|
(click)="toggleList('bullet')"
|
|
144923
145411
|
>
|
|
@@ -144926,8 +145414,9 @@ class RibbonParagraphControlsComponent {
|
|
|
144926
145414
|
<button
|
|
144927
145415
|
type="button"
|
|
144928
145416
|
class="pptx-rb-gl"
|
|
144929
|
-
[disabled]="!isText()"
|
|
144930
|
-
[ngClass]="
|
|
145417
|
+
[disabled]="!canEdit() || !isText()"
|
|
145418
|
+
[ngClass]="listKind() === 'numbered' ? 'bg-accent' : ''"
|
|
145419
|
+
[attr.aria-pressed]="listKind() === 'numbered'"
|
|
144931
145420
|
[title]="'pptx.notes.numberedList' | translate"
|
|
144932
145421
|
(click)="toggleList('numbered')"
|
|
144933
145422
|
>
|
|
@@ -145060,8 +145549,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
145060
145549
|
<button
|
|
145061
145550
|
type="button"
|
|
145062
145551
|
class="pptx-rb-gb"
|
|
145063
|
-
[disabled]="!isText()"
|
|
145064
|
-
[ngClass]="
|
|
145552
|
+
[disabled]="!canEdit() || !isText()"
|
|
145553
|
+
[ngClass]="listKind() === 'bullet' ? 'bg-accent' : ''"
|
|
145554
|
+
[attr.aria-pressed]="listKind() === 'bullet'"
|
|
145065
145555
|
[title]="'pptx.ribbon.bulletList' | translate"
|
|
145066
145556
|
(click)="toggleList('bullet')"
|
|
145067
145557
|
>
|
|
@@ -145070,8 +145560,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
145070
145560
|
<button
|
|
145071
145561
|
type="button"
|
|
145072
145562
|
class="pptx-rb-gl"
|
|
145073
|
-
[disabled]="!isText()"
|
|
145074
|
-
[ngClass]="
|
|
145563
|
+
[disabled]="!canEdit() || !isText()"
|
|
145564
|
+
[ngClass]="listKind() === 'numbered' ? 'bg-accent' : ''"
|
|
145565
|
+
[attr.aria-pressed]="listKind() === 'numbered'"
|
|
145075
145566
|
[title]="'pptx.notes.numberedList' | translate"
|
|
145076
145567
|
(click)="toggleList('numbered')"
|
|
145077
145568
|
>
|
|
@@ -145179,7 +145670,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
145179
145670
|
</select>
|
|
145180
145671
|
`,
|
|
145181
145672
|
}]
|
|
145182
|
-
}], propDecorators: { slideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideIndex", required: false }] }], selectedElement: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedElement", required: false }] }] } });
|
|
145673
|
+
}], propDecorators: { slideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideIndex", required: false }] }], selectedElement: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedElement", required: false }] }], canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }] } });
|
|
145183
145674
|
|
|
145184
145675
|
/**
|
|
145185
145676
|
* ribbon-home-section.component.ts: the Home ribbon tab (Clipboard, Slides, Font
|
|
@@ -145476,6 +145967,7 @@ class RibbonHomeSectionComponent {
|
|
|
145476
145967
|
<div class="flex flex-col items-center gap-0.5">
|
|
145477
145968
|
<div class="flex items-center gap-1">
|
|
145478
145969
|
<pptx-ribbon-paragraph-controls
|
|
145970
|
+
[canEdit]="canEdit()"
|
|
145479
145971
|
[slideIndex]="slideIndex()"
|
|
145480
145972
|
[selectedElement]="selectedElement()"
|
|
145481
145973
|
/>
|
|
@@ -145495,7 +145987,7 @@ class RibbonHomeSectionComponent {
|
|
|
145495
145987
|
{{ 'pptx.shortcuts.group.editing' | translate }}
|
|
145496
145988
|
</span>
|
|
145497
145989
|
</div>
|
|
145498
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: RibbonLayoutGalleryComponent, selector: "pptx-ribbon-layout-gallery", inputs: ["layoutOptions", "previews", "currentLayoutPath", "disabled"], outputs: ["select"] }, { kind: "component", type: LucidePlus, selector: "svg[lucidePlus]" }, { kind: "component", type: LucideChevronDown, selector: "svg[lucideChevronDown]" }, { kind: "component", type: LucideClipboardPaste, selector: "svg[lucideClipboardPaste]" }, { kind: "component", type: LucideCopy, selector: "svg[lucideCopy]" }, { kind: "component", type: LucideFolderPlus, selector: "svg[lucideFolderPlus]" }, { kind: "component", type: LucideLayoutGrid, selector: "svg[lucideLayoutGrid]" }, { kind: "component", type: LucideLayoutTemplate, selector: "svg[lucideLayoutTemplate]" }, { kind: "component", type: LucidePaintbrush, selector: "svg[lucidePaintbrush]" }, { kind: "component", type: LucideRotateCcw, selector: "svg[lucideRotateCcw]" }, { kind: "component", type: LucideScissors, selector: "svg[lucideScissors]" }, { kind: "component", type: RibbonFontControlsComponent, selector: "pptx-ribbon-font-controls", inputs: ["slideIndex", "selectedElement"] }, { kind: "component", type: RibbonParagraphControlsComponent, selector: "pptx-ribbon-paragraph-controls", inputs: ["slideIndex", "selectedElement"] }, { kind: "component", type: RibbonEditingSectionComponent, selector: "pptx-ribbon-editing-section", outputs: ["toggleFindReplace", "selectAll"] }, { kind: "directive", type: AnchoredPopupDirective, selector: "[pptxAnchoredPopup]", inputs: ["pptxAnchoredPopup", "pptxAnchoredPopupAlignRight"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
145990
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: RibbonLayoutGalleryComponent, selector: "pptx-ribbon-layout-gallery", inputs: ["layoutOptions", "previews", "currentLayoutPath", "disabled"], outputs: ["select"] }, { kind: "component", type: LucidePlus, selector: "svg[lucidePlus]" }, { kind: "component", type: LucideChevronDown, selector: "svg[lucideChevronDown]" }, { kind: "component", type: LucideClipboardPaste, selector: "svg[lucideClipboardPaste]" }, { kind: "component", type: LucideCopy, selector: "svg[lucideCopy]" }, { kind: "component", type: LucideFolderPlus, selector: "svg[lucideFolderPlus]" }, { kind: "component", type: LucideLayoutGrid, selector: "svg[lucideLayoutGrid]" }, { kind: "component", type: LucideLayoutTemplate, selector: "svg[lucideLayoutTemplate]" }, { kind: "component", type: LucidePaintbrush, selector: "svg[lucidePaintbrush]" }, { kind: "component", type: LucideRotateCcw, selector: "svg[lucideRotateCcw]" }, { kind: "component", type: LucideScissors, selector: "svg[lucideScissors]" }, { kind: "component", type: RibbonFontControlsComponent, selector: "pptx-ribbon-font-controls", inputs: ["slideIndex", "selectedElement"] }, { kind: "component", type: RibbonParagraphControlsComponent, selector: "pptx-ribbon-paragraph-controls", inputs: ["slideIndex", "selectedElement", "canEdit"] }, { kind: "component", type: RibbonEditingSectionComponent, selector: "pptx-ribbon-editing-section", outputs: ["toggleFindReplace", "selectAll"] }, { kind: "directive", type: AnchoredPopupDirective, selector: "[pptxAnchoredPopup]", inputs: ["pptxAnchoredPopup", "pptxAnchoredPopupAlignRight"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
145499
145991
|
}
|
|
145500
145992
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RibbonHomeSectionComponent, decorators: [{
|
|
145501
145993
|
type: Component,
|
|
@@ -145711,6 +146203,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
145711
146203
|
<div class="flex flex-col items-center gap-0.5">
|
|
145712
146204
|
<div class="flex items-center gap-1">
|
|
145713
146205
|
<pptx-ribbon-paragraph-controls
|
|
146206
|
+
[canEdit]="canEdit()"
|
|
145714
146207
|
[slideIndex]="slideIndex()"
|
|
145715
146208
|
[selectedElement]="selectedElement()"
|
|
145716
146209
|
/>
|
|
@@ -146944,6 +147437,7 @@ class RibbonContentComponent {
|
|
|
146944
147437
|
/>
|
|
146945
147438
|
<span class="pptx-rb-sep"></span>
|
|
146946
147439
|
<pptx-ribbon-paragraph-controls
|
|
147440
|
+
[canEdit]="canEdit()"
|
|
146947
147441
|
[slideIndex]="slideIndex()"
|
|
146948
147442
|
[selectedElement]="selectedElement()"
|
|
146949
147443
|
/>
|
|
@@ -146959,7 +147453,7 @@ class RibbonContentComponent {
|
|
|
146959
147453
|
/>
|
|
146960
147454
|
}
|
|
146961
147455
|
}
|
|
146962
|
-
`, isInline: true, dependencies: [{ kind: "component", type: RibbonFileSectionComponent, selector: "pptx-ribbon-file-section", inputs: ["fileName", "slideCount", "exporting", "hasMacros", "hiddenActions", "recentPresentationsCount", "accountAuth"], outputs: ["close", "createPresentation", "openFile", "openRecentFile", "save", "savePpsx", "savePptm", "savePpt", "exportPng", "exportPdf", "exportGif", "exportVideo", "exportJson", "copySlideAsImage", "print", "info", "signatures", "replace", "openPassword", "openFontEmbedding", "openVersionHistory", "share", "options"] }, { kind: "component", type: RibbonHomeSectionComponent, selector: "pptx-ribbon-home-section", inputs: ["slideIndex", "selectedElement", "canEdit", "formatPainterActive", "canActivateFormatPainter"], outputs: ["toggleFormatPainter", "findReplace", "openTemplateGallery", "applyLayout", "resetSlide"] }, { kind: "component", type: RibbonInsertSectionComponent, selector: "pptx-ribbon-insert-section", inputs: ["slideIndex", "newChartType", "newShapeType"], outputs: ["openSmartArtDialog", "openEquationDialog", "openHyperlink", "chartTypeChange", "shapeTypeChange"] }, { kind: "component", type: RibbonFontControlsComponent, selector: "pptx-ribbon-font-controls", inputs: ["slideIndex", "selectedElement"] }, { kind: "component", type: RibbonParagraphControlsComponent, selector: "pptx-ribbon-paragraph-controls", inputs: ["slideIndex", "selectedElement"] }, { kind: "component", type: RibbonArrangeSectionComponent, selector: "pptx-ribbon-arrange-section", inputs: ["slideIndex", "selectedElement", "canEdit", "formatPainterActive", "canActivateFormatPainter"], outputs: ["toggleFormatPainter"] }, { kind: "component", type: RibbonDrawingGroupComponent, selector: "pptx-ribbon-drawing-group", inputs: ["canEdit", "slideIndex", "selectedElement"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
147456
|
+
`, isInline: true, dependencies: [{ kind: "component", type: RibbonFileSectionComponent, selector: "pptx-ribbon-file-section", inputs: ["fileName", "slideCount", "exporting", "hasMacros", "hiddenActions", "recentPresentationsCount", "accountAuth"], outputs: ["close", "createPresentation", "openFile", "openRecentFile", "save", "savePpsx", "savePptm", "savePpt", "exportPng", "exportPdf", "exportGif", "exportVideo", "exportJson", "copySlideAsImage", "print", "info", "signatures", "replace", "openPassword", "openFontEmbedding", "openVersionHistory", "share", "options"] }, { kind: "component", type: RibbonHomeSectionComponent, selector: "pptx-ribbon-home-section", inputs: ["slideIndex", "selectedElement", "canEdit", "formatPainterActive", "canActivateFormatPainter"], outputs: ["toggleFormatPainter", "findReplace", "openTemplateGallery", "applyLayout", "resetSlide"] }, { kind: "component", type: RibbonInsertSectionComponent, selector: "pptx-ribbon-insert-section", inputs: ["slideIndex", "newChartType", "newShapeType"], outputs: ["openSmartArtDialog", "openEquationDialog", "openHyperlink", "chartTypeChange", "shapeTypeChange"] }, { kind: "component", type: RibbonFontControlsComponent, selector: "pptx-ribbon-font-controls", inputs: ["slideIndex", "selectedElement"] }, { kind: "component", type: RibbonParagraphControlsComponent, selector: "pptx-ribbon-paragraph-controls", inputs: ["slideIndex", "selectedElement", "canEdit"] }, { kind: "component", type: RibbonArrangeSectionComponent, selector: "pptx-ribbon-arrange-section", inputs: ["slideIndex", "selectedElement", "canEdit", "formatPainterActive", "canActivateFormatPainter"], outputs: ["toggleFormatPainter"] }, { kind: "component", type: RibbonDrawingGroupComponent, selector: "pptx-ribbon-drawing-group", inputs: ["canEdit", "slideIndex", "selectedElement"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
146963
147457
|
}
|
|
146964
147458
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: RibbonContentComponent, decorators: [{
|
|
146965
147459
|
type: Component,
|
|
@@ -147062,6 +147556,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
147062
147556
|
/>
|
|
147063
147557
|
<span class="pptx-rb-sep"></span>
|
|
147064
147558
|
<pptx-ribbon-paragraph-controls
|
|
147559
|
+
[canEdit]="canEdit()"
|
|
147065
147560
|
[slideIndex]="slideIndex()"
|
|
147066
147561
|
[selectedElement]="selectedElement()"
|
|
147067
147562
|
/>
|
|
@@ -168460,7 +168955,7 @@ class SlideSorterOverlayComponent {
|
|
|
168460
168955
|
return hiddenSlideCue(this.isHiddenSlide(slide), 'sorter', index);
|
|
168461
168956
|
}
|
|
168462
168957
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SlideSorterOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
168463
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: SlideSorterOverlayComponent, isStandalone: true, selector: "pptx-slide-sorter-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 }, activeIndex: { classPropertyName: "activeIndex", publicName: "activeIndex", isSignal: true, isRequired: false, transformFunction: null }, canEdit: { classPropertyName: "canEdit", publicName: "canEdit", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { select: "select", closed: "closed", deleteSlide: "deleteSlide", duplicateSlide: "duplicateSlide", toggleHiddenSlide: "toggleHiddenSlide" }, host: { listeners: { "document:keydown": "onKeydown($event)" } }, ngImport: i0, template: "<!-- Backdrop -->\n<div class=\"pptx-ng-sorter-backdrop\" (click)=\"onBackdropClick($event)\">\n\t<!-- Modal panel -->\n\t<div class=\"pptx-ng-sorter-panel\" (click)=\"$event.stopPropagation()\">\n\t\t<!-- Header -->\n\t\t<header class=\"pptx-ng-sorter-header\">\n\t\t\t<h2 class=\"pptx-ng-sorter-title\">{{ 'pptx.slideSorter.title' | translate }}</h2>\n\t\t\t<span class=\"pptx-ng-sorter-count\">{{\n\t\t\t\t'pptx.slideSorter.slideCount' | translate: { count: slides().length }\n\t\t\t}}</span>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"pptx-ng-sorter-close\"\n\t\t\t\t[attr.aria-label]=\"'pptx.slideSorter.close' | translate\"\n\t\t\t\t(click)=\"closed.emit()\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\twidth=\"16\"\n\t\t\t\t\theight=\"16\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n\t\t\t\t\t<line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n\t\t\t\t</svg>\n\t\t\t</button>\n\t\t</header>\n\n\t\t<!-- Scrollable grid -->\n\t\t<div class=\"pptx-ng-sorter-grid-scroll\">\n\t\t\t<div class=\"pptx-ng-sorter-grid\" [ngStyle]=\"gridStyle()\">\n\t\t\t\t@for (slide of slides(); track slide.id; let i = $index) {\n\t\t\t\t\t@let hidden = hiddenCue(slide, i);\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"pptx-ng-sorter-cell\"\n\t\t\t\t\t\t[class.is-active]=\"i === activeIndex()\"\n\t\t\t\t\t\t[class.is-hidden]=\"hidden.hidden\"\n\t\t\t\t\t\t[attr.data-pptx-slide-hidden]=\"hidden.marker ?? null\"\n\t\t\t\t\t\t[attr.aria-label]=\"'pptx.notes.slideN' | translate: { n: i + 1 }\"\n\t\t\t\t\t\t[attr.aria-describedby]=\"hidden.labelId ?? null\"\n\t\t\t\t\t\t[attr.aria-current]=\"i === activeIndex() ? 'true' : null\"\n\t\t\t\t\t\t(click)=\"onThumbClick(i)\"\n\t\t\t\t\t\t(contextmenu)=\"onThumbContextMenu($event, i)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<!-- Thumbnail clipping wrapper -->\n\t\t\t\t\t\t<div class=\"pptx-ng-sorter-thumb-clip\" [ngStyle]=\"clipStyle()\">\n\t\t\t\t\t\t\t<pptx-slide-canvas\n\t\t\t\t\t\t\t\t[slide]=\"slide\"\n\t\t\t\t\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t\t\t\t[zoom]=\"thumbZoom()\"\n\t\t\t\t\t\t\t\t[autoFit]=\"false\"\n\t\t\t\t\t\t\t\t[interactive]=\"false\"\n\t\t\t\t\t\t\t\t[exposeElementIds]=\"false\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<!-- Slide number badge, struck through with the shared diagonal\n\t\t\t\t\t\t slash when hidden (PowerPoint's own cue). -->\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclass=\"pptx-ng-sorter-index\"\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t[style.background-image]=\"hidden.hidden ? slashGradient : null\"\n\t\t\t\t\t\t\t>{{ i + 1 }}</span\n\t\t\t\t\t\t>\n\t\t\t\t\t\t@if (hidden.hidden) {\n\t\t\t\t\t\t\t<span class=\"pptx-ng-sorter-hidden\" [id]=\"hidden.labelId\">{{\n\t\t\t\t\t\t\t\thiddenLabelKey | translate\n\t\t\t\t\t\t\t}}</span>\n\t\t\t\t\t\t}\n\t\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t@if (contextMenu(); as menu) {\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"pptx-ng-sorter-menu-backdrop\"\n\t\t\t[attr.aria-label]=\"'pptx.overflow.closeMenu' | translate\"\n\t\t\t(click)=\"closeContextMenu()\"\n\t\t\t(contextmenu)=\"$event.preventDefault(); closeContextMenu()\"\n\t\t></button>\n\t\t<div\n\t\t\tclass=\"pptx-ng-sorter-context-menu\"\n\t\t\t[style.left.px]=\"menu.x\"\n\t\t\t[style.top.px]=\"menu.y\"\n\t\t\trole=\"menu\"\n\t\t>\n\t\t\t<button type=\"button\" role=\"menuitem\" (click)=\"menuDuplicate()\">\n\t\t\t\t{{ 'pptx.slideMenu.duplicate' | translate }}\n\t\t\t</button>\n\t\t\t<button type=\"button\" role=\"menuitem\" (click)=\"menuToggleHidden()\">\n\t\t\t\t{{\n\t\t\t\t\t(contextMenuTargetHidden() ? 'pptx.slideMenu.show' : 'pptx.slideMenu.hide') | translate\n\t\t\t\t}}\n\t\t\t</button>\n\t\t\t<div class=\"pptx-ng-sorter-context-menu-sep\"></div>\n\t\t\t<button type=\"button\" role=\"menuitem\" class=\"is-danger\" (click)=\"menuDelete()\">\n\t\t\t\t{{ 'pptx.slideMenu.delete' | translate }}\n\t\t\t</button>\n\t\t</div>\n\t}\n</div>\n", 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{display:inline-block;padding:0 .2rem;font-size:.6875rem;color:#ffffff8c;-webkit-user-select:none;user-select:none}.pptx-ng-sorter-hidden{font-size:.5625rem;text-transform:uppercase;letter-spacing:.05em;color:#ffffff8c;-webkit-user-select:none;user-select:none}.pptx-ng-sorter-menu-backdrop{position:fixed;inset:0;z-index:59;border:none;padding:0;background:transparent;cursor:default}.pptx-ng-sorter-context-menu{position:fixed;z-index:60;min-width:160px;padding:.25rem;border:1px solid rgba(255,255,255,.12);border-radius:.375rem;background:#1a1a1a;color:#e5e5e5;box-shadow:0 8px 24px #00000080}.pptx-ng-sorter-context-menu button{display:block;width:100%;padding:.375rem .625rem;border:none;border-radius:.25rem;background:transparent;color:inherit;text-align:left;font-size:.75rem;cursor:pointer}.pptx-ng-sorter-context-menu button:hover{background:#ffffff14}.pptx-ng-sorter-context-menu button.is-danger{color:#f87171}.pptx-ng-sorter-context-menu-sep{margin:.25rem .125rem;border-top:1px solid rgba(255,255,255,.12)}\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", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
168958
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: SlideSorterOverlayComponent, isStandalone: true, selector: "pptx-slide-sorter-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 }, activeIndex: { classPropertyName: "activeIndex", publicName: "activeIndex", isSignal: true, isRequired: false, transformFunction: null }, canEdit: { classPropertyName: "canEdit", publicName: "canEdit", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { select: "select", closed: "closed", deleteSlide: "deleteSlide", duplicateSlide: "duplicateSlide", toggleHiddenSlide: "toggleHiddenSlide" }, host: { listeners: { "document:keydown": "onKeydown($event)" } }, ngImport: i0, template: "<!-- Backdrop -->\n<div class=\"pptx-ng-sorter-backdrop\" (click)=\"onBackdropClick($event)\">\n\t<!-- Modal panel -->\n\t<div class=\"pptx-ng-sorter-panel\" (click)=\"$event.stopPropagation()\">\n\t\t<!-- Header -->\n\t\t<header class=\"pptx-ng-sorter-header\">\n\t\t\t<h2 class=\"pptx-ng-sorter-title\">{{ 'pptx.slideSorter.title' | translate }}</h2>\n\t\t\t<span class=\"pptx-ng-sorter-count\">{{\n\t\t\t\t'pptx.slideSorter.slideCount' | translate: { count: slides().length }\n\t\t\t}}</span>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"pptx-ng-sorter-close\"\n\t\t\t\t[attr.aria-label]=\"'pptx.slideSorter.close' | translate\"\n\t\t\t\t(click)=\"closed.emit()\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\twidth=\"16\"\n\t\t\t\t\theight=\"16\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n\t\t\t\t\t<line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n\t\t\t\t</svg>\n\t\t\t</button>\n\t\t</header>\n\n\t\t<!-- Scrollable grid -->\n\t\t<div class=\"pptx-ng-sorter-grid-scroll\">\n\t\t\t<div class=\"pptx-ng-sorter-grid\" [ngStyle]=\"gridStyle()\">\n\t\t\t\t@for (slide of slides(); track slide.id; let i = $index) {\n\t\t\t\t\t@let hidden = hiddenCue(slide, i);\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"pptx-ng-sorter-cell\"\n\t\t\t\t\t\t[class.is-active]=\"i === activeIndex()\"\n\t\t\t\t\t\t[class.is-hidden]=\"hidden.hidden\"\n\t\t\t\t\t\t[attr.data-pptx-slide-hidden]=\"hidden.marker ?? null\"\n\t\t\t\t\t\t[attr.aria-label]=\"'pptx.notes.slideN' | translate: { n: i + 1 }\"\n\t\t\t\t\t\t[attr.aria-describedby]=\"hidden.labelId ?? null\"\n\t\t\t\t\t\t[attr.aria-current]=\"i === activeIndex() ? 'true' : null\"\n\t\t\t\t\t\t(click)=\"onThumbClick(i)\"\n\t\t\t\t\t\t(contextmenu)=\"onThumbContextMenu($event, i)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<!-- Thumbnail clipping wrapper -->\n\t\t\t\t\t\t<div class=\"pptx-ng-sorter-thumb-clip\" [ngStyle]=\"clipStyle()\">\n\t\t\t\t\t\t\t<pptx-slide-canvas\n\t\t\t\t\t\t\t\t[slide]=\"slide\"\n\t\t\t\t\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t\t\t\t[zoom]=\"thumbZoom()\"\n\t\t\t\t\t\t\t\t[autoFit]=\"false\"\n\t\t\t\t\t\t\t\t[interactive]=\"false\"\n\t\t\t\t\t\t\t\t[exposeElementIds]=\"false\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<!-- Slide number badge, struck through with the shared diagonal\n\t\t\t\t\t\t slash when hidden (PowerPoint's own cue). -->\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclass=\"pptx-ng-sorter-index\"\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t[style.background-image]=\"hidden.hidden ? slashGradient : null\"\n\t\t\t\t\t\t\t>{{ i + 1 }}</span\n\t\t\t\t\t\t>\n\t\t\t\t\t\t@if (hidden.hidden) {\n\t\t\t\t\t\t\t<span class=\"pptx-ng-sorter-hidden\" [id]=\"hidden.labelId\">{{\n\t\t\t\t\t\t\t\thiddenLabelKey | translate\n\t\t\t\t\t\t\t}}</span>\n\t\t\t\t\t\t}\n\t\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t@if (contextMenu(); as menu) {\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"pptx-ng-sorter-menu-backdrop\"\n\t\t\t[attr.aria-label]=\"'pptx.overflow.closeMenu' | translate\"\n\t\t\t(click)=\"closeContextMenu()\"\n\t\t\t(contextmenu)=\"$event.preventDefault(); closeContextMenu()\"\n\t\t></button>\n\t\t<div\n\t\t\tclass=\"pptx-ng-sorter-context-menu\"\n\t\t\t[style.left.px]=\"menu.x\"\n\t\t\t[style.top.px]=\"menu.y\"\n\t\t\trole=\"menu\"\n\t\t>\n\t\t\t<button type=\"button\" role=\"menuitem\" (click)=\"menuDuplicate()\">\n\t\t\t\t{{ 'pptx.slideMenu.duplicate' | translate }}\n\t\t\t</button>\n\t\t\t<button type=\"button\" role=\"menuitem\" (click)=\"menuToggleHidden()\">\n\t\t\t\t{{\n\t\t\t\t\t(contextMenuTargetHidden() ? 'pptx.slideMenu.show' : 'pptx.slideMenu.hide') | translate\n\t\t\t\t}}\n\t\t\t</button>\n\t\t\t<div class=\"pptx-ng-sorter-context-menu-sep\"></div>\n\t\t\t<button type=\"button\" role=\"menuitem\" class=\"is-danger\" (click)=\"menuDelete()\">\n\t\t\t\t{{ 'pptx.slideMenu.delete' | translate }}\n\t\t\t</button>\n\t\t</div>\n\t}\n</div>\n", 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{display:inline-block;padding:0 .2rem;font-size:.6875rem;color:#ffffff8c;-webkit-user-select:none;user-select:none}.pptx-ng-sorter-hidden{font-size:.5625rem;text-transform:uppercase;letter-spacing:.05em;color:#ffffff8c;-webkit-user-select:none;user-select:none}.pptx-ng-sorter-menu-backdrop{position:fixed;inset:0;z-index:59;border:none;padding:0;background:transparent;cursor:default}.pptx-ng-sorter-context-menu{position:fixed;z-index:60;min-width:160px;padding:.25rem;border:1px solid rgba(255,255,255,.12);border-radius:.375rem;background:#1a1a1a;color:#e5e5e5;box-shadow:0 8px 24px #00000080}.pptx-ng-sorter-context-menu button{display:block;width:100%;padding:.375rem .625rem;border:none;border-radius:.25rem;background:transparent;color:inherit;text-align:left;font-size:.75rem;cursor:pointer}.pptx-ng-sorter-context-menu button:hover{background:#ffffff14}.pptx-ng-sorter-context-menu button.is-danger{color:#f87171}.pptx-ng-sorter-context-menu-sep{margin:.25rem .125rem;border-top:1px solid rgba(255,255,255,.12)}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "fitPadding", "maxFitScale", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
168464
168959
|
}
|
|
168465
168960
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SlideSorterOverlayComponent, decorators: [{
|
|
168466
168961
|
type: Component,
|
|
@@ -168881,7 +169376,7 @@ class SlidesPanelComponent {
|
|
|
168881
169376
|
return hiddenSlideCue(slide.hidden, 'rail', index);
|
|
168882
169377
|
}
|
|
168883
169378
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SlidesPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
168884
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: SlidesPanelComponent, isStandalone: true, selector: "pptx-slides-panel", inputs: { canvasSize: { classPropertyName: "canvasSize", publicName: "canvasSize", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, activeIndex: { classPropertyName: "activeIndex", publicName: "activeIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { select: "select" }, viewQueries: [{ propertyName: "scrollViewport", first: true, predicate: ["scrollViewport"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"pptx-ng-spanel\">\n\t<!-- Scrollable slide list -->\n\t<div\n\t\t#scrollViewport\n\t\tclass=\"pptx-ng-spanel-scroll\"\n\t\trole=\"listbox\"\n\t\t[attr.aria-label]=\"'pptx.sections.slides' | translate\"\n\t\t(scroll)=\"onScroll()\"\n\t>\n\t\t<div\n\t\t\tclass=\"pptx-ng-spanel-space\"\n\t\t\t[attr.data-virtualized]=\"shouldVirtualize() ? 'true' : null\"\n\t\t\t[style.height.px]=\"shouldVirtualize() ? virtualRange().totalHeight : null\"\n\t\t>\n\t\t\t<div\n\t\t\t\tclass=\"pptx-ng-spanel-window\"\n\t\t\t\t[class.is-virtualized]=\"shouldVirtualize()\"\n\t\t\t\t[style.top.px]=\"shouldVirtualize() ? virtualRange().offsetY : null\"\n\t\t\t>\n\t\t\t\t@for (item of renderedSlides(); track item.slide.id) {\n\t\t\t\t\t@let slide = item.slide;\n\t\t\t\t\t@let i = item.index;\n\t\t\t\t\t@let hidden = hiddenCue(slide, i);\n\t\t\t\t\t@if (item.sectionStart) {\n\t\t\t\t\t\t<header class=\"pptx-ng-section-header\" [attr.data-section-id]=\"item.section?.id\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"pptx-ng-section-toggle\"\n\t\t\t\t\t\t\t\t[attr.aria-expanded]=\"!item.section?.collapsed\"\n\t\t\t\t\t\t\t\t(click)=\"item.section && editor.sectionOps.toggle(item.section.id)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span>{{ item.section?.collapsed ? '\u25B8' : '\u25BE' }}</span>\n\t\t\t\t\t\t\t\t<!--\n\t\t\t\t\t\t\t\t\tSection highlight colour (p15:sectionPr/@clr). Core parses and\n\t\t\t\t\t\t\t\t\tround-trips it; only React was drawing it.\n\t\t\t\t\t\t\t\t-->\n\t\t\t\t\t\t\t\t@if (item.section?.color; as sectionColor) {\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-section-swatch\"\n\t\t\t\t\t\t\t\t\t\tdata-pptx-section-color\n\t\t\t\t\t\t\t\t\t\t[style.background-color]=\"sectionColor\"\n\t\t\t\t\t\t\t\t\t></span>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t<strong>{{\n\t\t\t\t\t\t\t\t\titem.section?.name ?? ('pptx.slides.ungroupedSlides' | translate)\n\t\t\t\t\t\t\t\t}}</strong>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t@if (item.section) {\n\t\t\t\t\t\t\t\t<div class=\"pptx-ng-section-actions\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tdata-pptx-compact\n\t\t\t\t\t\t\t\t\t\t(click)=\"onRenameSection(item.section.id, item.section.name)\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\u270E\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tdata-pptx-compact\n\t\t\t\t\t\t\t\t\t\t[disabled]=\"sectionIndex(item.section.id) === 0\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"editor.sectionOps.move(item.section.id, 'up')\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\u2191\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tdata-pptx-compact\n\t\t\t\t\t\t\t\t\t\t[disabled]=\"sectionIndex(item.section.id) === editor.sections().length - 1\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"editor.sectionOps.move(item.section.id, 'down')\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\u2193\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tdata-pptx-compact\n\t\t\t\t\t\t\t\t\t\t(click)=\"editor.sectionOps.delete(item.section.id)\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\u00D7\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</header>\n\t\t\t\t\t}\n\t\t\t\t\t@if (!item.section?.collapsed) {\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-card\"\n\t\t\t\t\t\t\t[class.is-active]=\"i === activeIndex()\"\n\t\t\t\t\t\t\t[attr.data-pptx-slide-hidden]=\"hidden.marker ?? null\"\n\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t[attr.aria-selected]=\"i === activeIndex()\"\n\t\t\t\t\t\t\t[attr.aria-label]=\"'pptx.notes.slideN' | translate: { n: i + 1 }\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<!-- Thumbnail (clickable to select). Slide number sits to the LEFT\n\t\t\t\t\t\t\t of the preview (React SlideItem parity), not below it. -->\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-thumb-btn\"\n\t\t\t\t\t\t\t\t[attr.aria-label]=\"'pptx.slidesPanel.goToSlide' | translate: { n: i + 1 }\"\n\t\t\t\t\t\t\t\t[attr.aria-describedby]=\"hidden.labelId ?? null\"\n\t\t\t\t\t\t\t\t(click)=\"select.emit(i)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<!-- Slide number badge (left column). Struck through with the shared\n\t\t\t\t\t\t\t\t diagonal slash when the slide is hidden, which is PowerPoint's own\n\t\t\t\t\t\t\t\t cue and, unlike the dimming, is not a colour-only signal. -->\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-num\"\n\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t[style.background-image]=\"hidden.hidden ? slashGradient : null\"\n\t\t\t\t\t\t\t\t\t>{{ i + 1 }}</span\n\t\t\t\t\t\t\t\t>\n\n\t\t\t\t\t\t\t\t<!-- Clipping wrapper: neutralises the 1rem auto margin from SlideCanvas -->\n\t\t\t\t\t\t\t\t<div class=\"pptx-ng-spanel-clip\" [ngStyle]=\"clipStyle()\">\n\t\t\t\t\t\t\t\t\t<pptx-slide-canvas\n\t\t\t\t\t\t\t\t\t\t[slide]=\"slide\"\n\t\t\t\t\t\t\t\t\t\t[templateElements]=\"editor.templateElementsBySlideId()[slide.id] ?? []\"\n\t\t\t\t\t\t\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t\t\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t\t\t\t\t\t[zoom]=\"thumbZoom()\"\n\t\t\t\t\t\t\t\t\t\t[editable]=\"false\"\n\t\t\t\t\t\t\t\t\t\t[autoFit]=\"false\"\n\t\t\t\t\t\t\t\t\t\t[interactive]=\"false\"\n\t\t\t\t\t\t\t\t\t\t[exposeElementIds]=\"false\"\n\t\t\t\t\t\t\t\t\t\t[style.opacity]=\"hidden.hidden ? dimOpacity : null\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t@if (hidden.hidden) {\n\t\t\t\t\t\t\t\t\t\t<!-- Announced through aria-describedby, so the accessible name\n\t\t\t\t\t\t\t\t\t\t stays exactly \"Go to slide {{ i + 1 }}\". -->\n\t\t\t\t\t\t\t\t\t\t<span class=\"pptx-ng-spanel-hidden\" [id]=\"hidden.labelId\">\n\t\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\t\td=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\t\td=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t<path d=\"M14.12 14.12a3 3 0 1 1-4.24-4.24\" />\n\t\t\t\t\t\t\t\t\t\t\t\t<path d=\"M1 1l22 22\" />\n\t\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"pptx-ng-sr-only\">{{ hiddenLabelKey | translate }}</span>\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<!-- Per-card action toolbar (visible on hover / focus-within) -->\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-actions\"\n\t\t\t\t\t\t\t\trole=\"toolbar\"\n\t\t\t\t\t\t\t\t[attr.aria-label]=\"'pptx.slideMenu.slideActions' | translate: { n: i + 1 }\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-action\"\n\t\t\t\t\t\t\t\t\tdata-pptx-compact\n\t\t\t\t\t\t\t\t\t[title]=\"'pptx.ribbon.duplicateSlide' | translate\"\n\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"'pptx.arrange.duplicate' | translate\"\n\t\t\t\t\t\t\t\t\t(click)=\"onDuplicate(i)\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg lucideCopy class=\"h-3.5 w-3.5\"></svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-action\"\n\t\t\t\t\t\t\t\t\tdata-pptx-compact\n\t\t\t\t\t\t\t\t\t[title]=\"'pptx.slidesPanel.deleteSlide' | translate\"\n\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"'pptx.arrange.delete' | translate\"\n\t\t\t\t\t\t\t\t\t[disabled]=\"editor.slides().length <= 1\"\n\t\t\t\t\t\t\t\t\t(click)=\"onDelete(i)\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg lucideTrash2 class=\"h-3.5 w-3.5\"></svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-action\"\n\t\t\t\t\t\t\t\t\tdata-pptx-compact\n\t\t\t\t\t\t\t\t\t[title]=\"'pptx.sections.moveUp' | translate\"\n\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"'pptx.sections.moveUp' | translate\"\n\t\t\t\t\t\t\t\t\t[disabled]=\"i === 0\"\n\t\t\t\t\t\t\t\t\t(click)=\"onMoveUp(i)\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg lucideArrowUp class=\"h-3.5 w-3.5\"></svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-action\"\n\t\t\t\t\t\t\t\t\tdata-pptx-compact\n\t\t\t\t\t\t\t\t\t[title]=\"'pptx.sections.moveDown' | translate\"\n\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"'pptx.sections.moveDown' | translate\"\n\t\t\t\t\t\t\t\t\t[disabled]=\"i === editor.slides().length - 1\"\n\t\t\t\t\t\t\t\t\t(click)=\"onMoveDown(i)\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg lucideArrowDown class=\"h-3.5 w-3.5\"></svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<!-- Footer: add new slide -->\n\t<footer class=\"pptx-ng-spanel-footer\">\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"pptx-ng-spanel-add\"\n\t\t\t[attr.aria-label]=\"'pptx.sections.addSlide' | translate\"\n\t\t\t(click)=\"onAddSlide()\"\n\t\t>\n\t\t\t<svg lucidePlus class=\"h-3.5 w-3.5\"></svg> {{ 'pptx.sections.addSlide' | translate }}\n\t\t</button>\n\t</footer>\n</div>\n", styles: [":host{display:flex;flex-direction:column;height:100%;overflow:hidden}.pptx-ng-spanel{display:flex;flex-direction:column;height:100%;background:var(--pptx-secondary, #1e1e1e);color:var(--pptx-foreground, #e5e5e5);border-right:1px solid var(--pptx-border, rgba(255, 255, 255, .08));overflow:hidden}.pptx-ng-spanel-scroll{flex:1;overflow-y:auto;padding:.5rem .375rem}.pptx-ng-spanel-space{position:relative}.pptx-ng-spanel-window{display:flex;flex-direction:column;gap:.375rem}.pptx-ng-spanel-window.is-virtualized{position:absolute;inset-inline:0}.pptx-ng-section-header{display:flex;align-items:center;gap:.2rem;min-height:1.75rem;color:var(--pptx-muted-foreground, rgba(255, 255, 255, .58))}.pptx-ng-section-toggle{display:flex;align-items:center;gap:.35rem;min-width:0;flex:1;border:0;background:transparent;color:inherit;cursor:pointer;text-align:left}.pptx-ng-section-swatch{display:inline-block;flex:0 0 auto;width:.5rem;height:.5rem;border-radius:9999px}.pptx-ng-section-toggle strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.7rem}.pptx-ng-section-actions{display:flex}.pptx-ng-section-actions button{width:1.25rem;height:1.25rem;padding:0;border:0;border-radius:.2rem;background:transparent;color:inherit;cursor:pointer}.pptx-ng-section-actions button:hover:not(:disabled){background:color-mix(in srgb,var(--pptx-primary, #3b82f6) 35%,transparent);color:var(--pptx-foreground, #fff)}.pptx-ng-section-actions button:disabled{opacity:.3}.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:color-mix(in srgb,var(--pptx-foreground, #fff) 5%,transparent);border-color:color-mix(in srgb,var(--pptx-foreground, #fff) 15%,transparent)}.pptx-ng-spanel-card.is-active{border-color:var(--pptx-primary, #3b82f6);background:color-mix(in srgb,var(--pptx-primary, #3b82f6) 10%,transparent)}.pptx-ng-spanel-thumb-btn{display:flex;align-items:center;gap:.25rem;width:100%;padding:.375rem;border:none;background:transparent;cursor:pointer;color:inherit;line-height:0}.pptx-ng-spanel-thumb-btn:focus-visible{outline:2px solid var(--pptx-ring, #3b82f6);outline-offset:2px;border-radius:.25rem}.pptx-ng-spanel-clip{position:relative;overflow:hidden;border-radius:2px}.pptx-ng-spanel-hidden{position:absolute;right:2px;bottom:2px;z-index:10;display:inline-flex;color:var(--pptx-muted-foreground, rgba(255, 255, 255, .45))}.pptx-ng-spanel-hidden svg{width:.75rem;height:.75rem}.pptx-ng-sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}.pptx-ng-spanel-clip ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}.pptx-ng-spanel-num{flex:0 0 auto;width:1.1rem;text-align:right;font-size:.625rem;line-height:1;font-variant-numeric:tabular-nums;color:var(--pptx-muted-foreground, rgba(255, 255, 255, .45));-webkit-user-select:none;user-select:none}.pptx-ng-spanel-card.is-active .pptx-ng-spanel-num{color:var(--pptx-primary, #3b82f6);font-weight:500}.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:color-mix(in srgb,var(--pptx-popover, #1e1e1e) 85%,transparent);color:var(--pptx-popover-foreground, #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:color-mix(in srgb,var(--pptx-primary, #3b82f6) 75%,transparent);color:var(--pptx-primary-foreground, #fff)}.pptx-ng-spanel-action[disabled]{opacity:.3;cursor:not-allowed}.pptx-ng-spanel-footer{flex-shrink:0;padding:.5rem .375rem;border-top:1px solid var(--pptx-border, rgba(255, 255, 255, .08))}.pptx-ng-spanel-add{display:flex;align-items:center;justify-content:center;gap:.25rem;width:100%;padding:.25rem .5rem;border:none;border-radius:.25rem;background:transparent;color:var(--pptx-muted-foreground, rgba(255, 255, 255, .6));font-size:.6875rem;cursor:pointer;transition:background .15s,color .15s}.pptx-ng-spanel-add:hover{background:color-mix(in srgb,var(--pptx-foreground, #fff) 8%,transparent);color:var(--pptx-foreground, #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", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: LucideCopy, selector: "svg[lucideCopy]" }, { kind: "component", type: LucideTrash2, selector: "svg[lucideTrash], 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 }); }
|
|
169379
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: SlidesPanelComponent, isStandalone: true, selector: "pptx-slides-panel", inputs: { canvasSize: { classPropertyName: "canvasSize", publicName: "canvasSize", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, activeIndex: { classPropertyName: "activeIndex", publicName: "activeIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { select: "select" }, viewQueries: [{ propertyName: "scrollViewport", first: true, predicate: ["scrollViewport"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"pptx-ng-spanel\">\n\t<!-- Scrollable slide list -->\n\t<div\n\t\t#scrollViewport\n\t\tclass=\"pptx-ng-spanel-scroll\"\n\t\trole=\"listbox\"\n\t\t[attr.aria-label]=\"'pptx.sections.slides' | translate\"\n\t\t(scroll)=\"onScroll()\"\n\t>\n\t\t<div\n\t\t\tclass=\"pptx-ng-spanel-space\"\n\t\t\t[attr.data-virtualized]=\"shouldVirtualize() ? 'true' : null\"\n\t\t\t[style.height.px]=\"shouldVirtualize() ? virtualRange().totalHeight : null\"\n\t\t>\n\t\t\t<div\n\t\t\t\tclass=\"pptx-ng-spanel-window\"\n\t\t\t\t[class.is-virtualized]=\"shouldVirtualize()\"\n\t\t\t\t[style.top.px]=\"shouldVirtualize() ? virtualRange().offsetY : null\"\n\t\t\t>\n\t\t\t\t@for (item of renderedSlides(); track item.slide.id) {\n\t\t\t\t\t@let slide = item.slide;\n\t\t\t\t\t@let i = item.index;\n\t\t\t\t\t@let hidden = hiddenCue(slide, i);\n\t\t\t\t\t@if (item.sectionStart) {\n\t\t\t\t\t\t<header class=\"pptx-ng-section-header\" [attr.data-section-id]=\"item.section?.id\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"pptx-ng-section-toggle\"\n\t\t\t\t\t\t\t\t[attr.aria-expanded]=\"!item.section?.collapsed\"\n\t\t\t\t\t\t\t\t(click)=\"item.section && editor.sectionOps.toggle(item.section.id)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span>{{ item.section?.collapsed ? '\u25B8' : '\u25BE' }}</span>\n\t\t\t\t\t\t\t\t<!--\n\t\t\t\t\t\t\t\t\tSection highlight colour (p15:sectionPr/@clr). Core parses and\n\t\t\t\t\t\t\t\t\tround-trips it; only React was drawing it.\n\t\t\t\t\t\t\t\t-->\n\t\t\t\t\t\t\t\t@if (item.section?.color; as sectionColor) {\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-section-swatch\"\n\t\t\t\t\t\t\t\t\t\tdata-pptx-section-color\n\t\t\t\t\t\t\t\t\t\t[style.background-color]=\"sectionColor\"\n\t\t\t\t\t\t\t\t\t></span>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t<strong>{{\n\t\t\t\t\t\t\t\t\titem.section?.name ?? ('pptx.slides.ungroupedSlides' | translate)\n\t\t\t\t\t\t\t\t}}</strong>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t@if (item.section) {\n\t\t\t\t\t\t\t\t<div class=\"pptx-ng-section-actions\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tdata-pptx-compact\n\t\t\t\t\t\t\t\t\t\t(click)=\"onRenameSection(item.section.id, item.section.name)\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\u270E\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tdata-pptx-compact\n\t\t\t\t\t\t\t\t\t\t[disabled]=\"sectionIndex(item.section.id) === 0\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"editor.sectionOps.move(item.section.id, 'up')\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\u2191\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tdata-pptx-compact\n\t\t\t\t\t\t\t\t\t\t[disabled]=\"sectionIndex(item.section.id) === editor.sections().length - 1\"\n\t\t\t\t\t\t\t\t\t\t(click)=\"editor.sectionOps.move(item.section.id, 'down')\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\u2193\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tdata-pptx-compact\n\t\t\t\t\t\t\t\t\t\t(click)=\"editor.sectionOps.delete(item.section.id)\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\u00D7\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</header>\n\t\t\t\t\t}\n\t\t\t\t\t@if (!item.section?.collapsed) {\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-card\"\n\t\t\t\t\t\t\t[class.is-active]=\"i === activeIndex()\"\n\t\t\t\t\t\t\t[attr.data-pptx-slide-hidden]=\"hidden.marker ?? null\"\n\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t[attr.aria-selected]=\"i === activeIndex()\"\n\t\t\t\t\t\t\t[attr.aria-label]=\"'pptx.notes.slideN' | translate: { n: i + 1 }\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<!-- Thumbnail (clickable to select). Slide number sits to the LEFT\n\t\t\t\t\t\t\t of the preview (React SlideItem parity), not below it. -->\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-thumb-btn\"\n\t\t\t\t\t\t\t\t[attr.aria-label]=\"'pptx.slidesPanel.goToSlide' | translate: { n: i + 1 }\"\n\t\t\t\t\t\t\t\t[attr.aria-describedby]=\"hidden.labelId ?? null\"\n\t\t\t\t\t\t\t\t(click)=\"select.emit(i)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<!-- Slide number badge (left column). Struck through with the shared\n\t\t\t\t\t\t\t\t diagonal slash when the slide is hidden, which is PowerPoint's own\n\t\t\t\t\t\t\t\t cue and, unlike the dimming, is not a colour-only signal. -->\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-num\"\n\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t[style.background-image]=\"hidden.hidden ? slashGradient : null\"\n\t\t\t\t\t\t\t\t\t>{{ i + 1 }}</span\n\t\t\t\t\t\t\t\t>\n\n\t\t\t\t\t\t\t\t<!-- Clipping wrapper: neutralises the 1rem auto margin from SlideCanvas -->\n\t\t\t\t\t\t\t\t<div class=\"pptx-ng-spanel-clip\" [ngStyle]=\"clipStyle()\">\n\t\t\t\t\t\t\t\t\t<pptx-slide-canvas\n\t\t\t\t\t\t\t\t\t\t[slide]=\"slide\"\n\t\t\t\t\t\t\t\t\t\t[templateElements]=\"editor.templateElementsBySlideId()[slide.id] ?? []\"\n\t\t\t\t\t\t\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t\t\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t\t\t\t\t\t[zoom]=\"thumbZoom()\"\n\t\t\t\t\t\t\t\t\t\t[editable]=\"false\"\n\t\t\t\t\t\t\t\t\t\t[autoFit]=\"false\"\n\t\t\t\t\t\t\t\t\t\t[interactive]=\"false\"\n\t\t\t\t\t\t\t\t\t\t[exposeElementIds]=\"false\"\n\t\t\t\t\t\t\t\t\t\t[style.opacity]=\"hidden.hidden ? dimOpacity : null\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t@if (hidden.hidden) {\n\t\t\t\t\t\t\t\t\t\t<!-- Announced through aria-describedby, so the accessible name\n\t\t\t\t\t\t\t\t\t\t stays exactly \"Go to slide {{ i + 1 }}\". -->\n\t\t\t\t\t\t\t\t\t\t<span class=\"pptx-ng-spanel-hidden\" [id]=\"hidden.labelId\">\n\t\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\t\td=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\t\td=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t<path d=\"M14.12 14.12a3 3 0 1 1-4.24-4.24\" />\n\t\t\t\t\t\t\t\t\t\t\t\t<path d=\"M1 1l22 22\" />\n\t\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"pptx-ng-sr-only\">{{ hiddenLabelKey | translate }}</span>\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<!-- Per-card action toolbar (visible on hover / focus-within) -->\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-actions\"\n\t\t\t\t\t\t\t\trole=\"toolbar\"\n\t\t\t\t\t\t\t\t[attr.aria-label]=\"'pptx.slideMenu.slideActions' | translate: { n: i + 1 }\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-action\"\n\t\t\t\t\t\t\t\t\tdata-pptx-compact\n\t\t\t\t\t\t\t\t\t[title]=\"'pptx.ribbon.duplicateSlide' | translate\"\n\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"'pptx.arrange.duplicate' | translate\"\n\t\t\t\t\t\t\t\t\t(click)=\"onDuplicate(i)\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg lucideCopy class=\"h-3.5 w-3.5\"></svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-action\"\n\t\t\t\t\t\t\t\t\tdata-pptx-compact\n\t\t\t\t\t\t\t\t\t[title]=\"'pptx.slidesPanel.deleteSlide' | translate\"\n\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"'pptx.arrange.delete' | translate\"\n\t\t\t\t\t\t\t\t\t[disabled]=\"editor.slides().length <= 1\"\n\t\t\t\t\t\t\t\t\t(click)=\"onDelete(i)\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg lucideTrash2 class=\"h-3.5 w-3.5\"></svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-action\"\n\t\t\t\t\t\t\t\t\tdata-pptx-compact\n\t\t\t\t\t\t\t\t\t[title]=\"'pptx.sections.moveUp' | translate\"\n\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"'pptx.sections.moveUp' | translate\"\n\t\t\t\t\t\t\t\t\t[disabled]=\"i === 0\"\n\t\t\t\t\t\t\t\t\t(click)=\"onMoveUp(i)\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg lucideArrowUp class=\"h-3.5 w-3.5\"></svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-action\"\n\t\t\t\t\t\t\t\t\tdata-pptx-compact\n\t\t\t\t\t\t\t\t\t[title]=\"'pptx.sections.moveDown' | translate\"\n\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"'pptx.sections.moveDown' | translate\"\n\t\t\t\t\t\t\t\t\t[disabled]=\"i === editor.slides().length - 1\"\n\t\t\t\t\t\t\t\t\t(click)=\"onMoveDown(i)\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg lucideArrowDown class=\"h-3.5 w-3.5\"></svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\n\t<!-- Footer: add new slide -->\n\t<footer class=\"pptx-ng-spanel-footer\">\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclass=\"pptx-ng-spanel-add\"\n\t\t\t[attr.aria-label]=\"'pptx.sections.addSlide' | translate\"\n\t\t\t(click)=\"onAddSlide()\"\n\t\t>\n\t\t\t<svg lucidePlus class=\"h-3.5 w-3.5\"></svg> {{ 'pptx.sections.addSlide' | translate }}\n\t\t</button>\n\t</footer>\n</div>\n", styles: [":host{display:flex;flex-direction:column;height:100%;overflow:hidden}.pptx-ng-spanel{display:flex;flex-direction:column;height:100%;background:var(--pptx-secondary, #1e1e1e);color:var(--pptx-foreground, #e5e5e5);border-right:1px solid var(--pptx-border, rgba(255, 255, 255, .08));overflow:hidden}.pptx-ng-spanel-scroll{flex:1;overflow-y:auto;padding:.5rem .375rem}.pptx-ng-spanel-space{position:relative}.pptx-ng-spanel-window{display:flex;flex-direction:column;gap:.375rem}.pptx-ng-spanel-window.is-virtualized{position:absolute;inset-inline:0}.pptx-ng-section-header{display:flex;align-items:center;gap:.2rem;min-height:1.75rem;color:var(--pptx-muted-foreground, rgba(255, 255, 255, .58))}.pptx-ng-section-toggle{display:flex;align-items:center;gap:.35rem;min-width:0;flex:1;border:0;background:transparent;color:inherit;cursor:pointer;text-align:left}.pptx-ng-section-swatch{display:inline-block;flex:0 0 auto;width:.5rem;height:.5rem;border-radius:9999px}.pptx-ng-section-toggle strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.7rem}.pptx-ng-section-actions{display:flex}.pptx-ng-section-actions button{width:1.25rem;height:1.25rem;padding:0;border:0;border-radius:.2rem;background:transparent;color:inherit;cursor:pointer}.pptx-ng-section-actions button:hover:not(:disabled){background:color-mix(in srgb,var(--pptx-primary, #3b82f6) 35%,transparent);color:var(--pptx-foreground, #fff)}.pptx-ng-section-actions button:disabled{opacity:.3}.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:color-mix(in srgb,var(--pptx-foreground, #fff) 5%,transparent);border-color:color-mix(in srgb,var(--pptx-foreground, #fff) 15%,transparent)}.pptx-ng-spanel-card.is-active{border-color:var(--pptx-primary, #3b82f6);background:color-mix(in srgb,var(--pptx-primary, #3b82f6) 10%,transparent)}.pptx-ng-spanel-thumb-btn{display:flex;align-items:center;gap:.25rem;width:100%;padding:.375rem;border:none;background:transparent;cursor:pointer;color:inherit;line-height:0}.pptx-ng-spanel-thumb-btn:focus-visible{outline:2px solid var(--pptx-ring, #3b82f6);outline-offset:2px;border-radius:.25rem}.pptx-ng-spanel-clip{position:relative;overflow:hidden;border-radius:2px}.pptx-ng-spanel-hidden{position:absolute;right:2px;bottom:2px;z-index:10;display:inline-flex;color:var(--pptx-muted-foreground, rgba(255, 255, 255, .45))}.pptx-ng-spanel-hidden svg{width:.75rem;height:.75rem}.pptx-ng-sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}.pptx-ng-spanel-clip ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}.pptx-ng-spanel-num{flex:0 0 auto;width:1.1rem;text-align:right;font-size:.625rem;line-height:1;font-variant-numeric:tabular-nums;color:var(--pptx-muted-foreground, rgba(255, 255, 255, .45));-webkit-user-select:none;user-select:none}.pptx-ng-spanel-card.is-active .pptx-ng-spanel-num{color:var(--pptx-primary, #3b82f6);font-weight:500}.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:color-mix(in srgb,var(--pptx-popover, #1e1e1e) 85%,transparent);color:var(--pptx-popover-foreground, #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:color-mix(in srgb,var(--pptx-primary, #3b82f6) 75%,transparent);color:var(--pptx-primary-foreground, #fff)}.pptx-ng-spanel-action[disabled]{opacity:.3;cursor:not-allowed}.pptx-ng-spanel-footer{flex-shrink:0;padding:.5rem .375rem;border-top:1px solid var(--pptx-border, rgba(255, 255, 255, .08))}.pptx-ng-spanel-add{display:flex;align-items:center;justify-content:center;gap:.25rem;width:100%;padding:.25rem .5rem;border:none;border-radius:.25rem;background:transparent;color:var(--pptx-muted-foreground, rgba(255, 255, 255, .6));font-size:.6875rem;cursor:pointer;transition:background .15s,color .15s}.pptx-ng-spanel-add:hover{background:color-mix(in srgb,var(--pptx-foreground, #fff) 8%,transparent);color:var(--pptx-foreground, #e5e5e5)}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "fitPadding", "maxFitScale", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: LucideCopy, selector: "svg[lucideCopy]" }, { kind: "component", type: LucideTrash2, selector: "svg[lucideTrash], 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 }); }
|
|
168885
169380
|
}
|
|
168886
169381
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SlidesPanelComponent, decorators: [{
|
|
168887
169382
|
type: Component,
|
|
@@ -170509,7 +171004,7 @@ class SlideDiffThumbnailsComponent {
|
|
|
170509
171004
|
</div>
|
|
170510
171005
|
}
|
|
170511
171006
|
</div>
|
|
170512
|
-
`, 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", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
171007
|
+
`, 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", "fitPadding", "maxFitScale", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
170513
171008
|
}
|
|
170514
171009
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: SlideDiffThumbnailsComponent, decorators: [{
|
|
170515
171010
|
type: Component,
|
|
@@ -175652,6 +176147,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
|
|
|
175652
176147
|
}]
|
|
175653
176148
|
}], ctorParameters: () => [], propDecorators: { activeSlideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeSlideIndex", required: false }] }], selectedElementId: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedElementId", required: false }] }], filePath: [{ type: i0.Input, args: [{ isSignal: true, alias: "filePath", required: false }] }], customShows: [{ type: i0.Input, args: [{ isSignal: true, alias: "customShows", required: false }] }], themeKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "themeKey", required: false }] }], availableThemes: [{ type: i0.Input, args: [{ isSignal: true, alias: "availableThemes", required: false }] }], localeCode: [{ type: i0.Input, args: [{ isSignal: true, alias: "localeCode", required: false }] }], availableLocales: [{ type: i0.Input, args: [{ isSignal: true, alias: "availableLocales", required: false }] }], aiExportVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "aiExportVisible", required: false }] }], restoreContent: [{ type: i0.Output, args: ["restoreContent"] }], themeKeySelect: [{ type: i0.Output, args: ["themeKeySelect"] }], localeSelect: [{ type: i0.Output, args: ["localeSelect"] }] } });
|
|
175654
176149
|
|
|
176150
|
+
/** Public insertion uses the same synchronous commit and editor transaction as the canvas. */
|
|
176151
|
+
function insertPublicElement(element, target, editor, slideIndex, commitPendingText) {
|
|
176152
|
+
const prepared = prepareElementForInsertion(element, target);
|
|
176153
|
+
if (!prepared) {
|
|
176154
|
+
return undefined;
|
|
176155
|
+
}
|
|
176156
|
+
commitPendingText();
|
|
176157
|
+
editor.addElement(slideIndex, prepared);
|
|
176158
|
+
return prepared.id;
|
|
176159
|
+
}
|
|
176160
|
+
|
|
175655
176161
|
/* oxlint-disable eslint/one-var -- pre-existing throughout this file; independent concerns, not one statement */
|
|
175656
176162
|
/**
|
|
175657
176163
|
* PowerPointViewerComponent: Angular port of the React `PowerPointViewer.tsx`
|
|
@@ -175747,6 +176253,12 @@ class PowerPointViewerComponent {
|
|
|
175747
176253
|
*/
|
|
175748
176254
|
this.fileName = input(undefined, /* @ts-ignore */
|
|
175749
176255
|
...(ngDevMode ? [{ debugName: "fileName" }] : /* istanbul ignore next */ []));
|
|
176256
|
+
/** Unscaled decorative viewport padding per side; omission preserves defaults. */
|
|
176257
|
+
this.fitPadding = input(undefined, /* @ts-ignore */
|
|
176258
|
+
...(ngDevMode ? [{ debugName: "fitPadding" }] : /* istanbul ignore next */ []));
|
|
176259
|
+
/** Fit-factor ceiling, independent of user zoom; null permits enlargement. */
|
|
176260
|
+
this.maxFitScale = input(undefined, /* @ts-ignore */
|
|
176261
|
+
...(ngDevMode ? [{ debugName: "maxFitScale" }] : /* istanbul ignore next */ []));
|
|
175750
176262
|
/**
|
|
175751
176263
|
* Recovery autosave: after an edit the deck is re-serialised (always as a
|
|
175752
176264
|
* plain, unencrypted package, because recovery has no password) and stashed
|
|
@@ -175986,9 +176498,13 @@ class PowerPointViewerComponent {
|
|
|
175986
176498
|
* read-only recommendation (`p:modifyVerifier` / "Mark as Final"; lifted by
|
|
175987
176499
|
* the read-only banner's "Edit anyway", see {@link LoadNoticesService}).
|
|
175988
176500
|
*/
|
|
175989
|
-
this.
|
|
176501
|
+
this.hasEditPermission = computed(() => this.canEditInput() &&
|
|
175990
176502
|
(!this.viewerOpts.options().trust.openInProtectedView || this.protectedViewDismissed()) &&
|
|
175991
176503
|
!this.loadNotices.lockActive(), /* @ts-ignore */
|
|
176504
|
+
...(ngDevMode ? [{ debugName: "hasEditPermission" }] : /* istanbul ignore next */ []));
|
|
176505
|
+
this.editingRequested = signal(true, /* @ts-ignore */
|
|
176506
|
+
...(ngDevMode ? [{ debugName: "editingRequested" }] : /* istanbul ignore next */ []));
|
|
176507
|
+
this.canEdit = computed(() => this.hasEditPermission() && this.editingRequested(), /* @ts-ignore */
|
|
175992
176508
|
...(ngDevMode ? [{ debugName: "canEdit" }] : /* istanbul ignore next */ []));
|
|
175993
176509
|
/** Whether the Protected View banner should show: host allows editing, the option still blocks it, and the user hasn't dismissed it yet. */
|
|
175994
176510
|
this.protectedViewActive = computed(() => this.canEditInput() &&
|
|
@@ -176025,8 +176541,8 @@ class PowerPointViewerComponent {
|
|
|
176025
176541
|
*/
|
|
176026
176542
|
this.audienceSessionEnded = signal(false, /* @ts-ignore */
|
|
176027
176543
|
...(ngDevMode ? [{ debugName: "audienceSessionEnded" }] : /* istanbul ignore next */ []));
|
|
176028
|
-
/**
|
|
176029
|
-
this.displaySlides = computed(() => this.
|
|
176544
|
+
/** Preview changes interaction, not which permitted live deck is displayed. */
|
|
176545
|
+
this.displaySlides = computed(() => this.hasEditPermission() ? this.editor.slides() : this.loader.slides(), /* @ts-ignore */
|
|
176030
176546
|
...(ngDevMode ? [{ debugName: "displaySlides" }] : /* istanbul ignore next */ []));
|
|
176031
176547
|
this.slideCount = computed(() => this.displaySlides().length, /* @ts-ignore */
|
|
176032
176548
|
...(ngDevMode ? [{ debugName: "slideCount" }] : /* istanbul ignore next */ []));
|
|
@@ -176036,7 +176552,7 @@ class PowerPointViewerComponent {
|
|
|
176036
176552
|
* consumer that needs the COMPLETE slide (export, print, slide thumbnails,
|
|
176037
176553
|
* accessibility) renders this instead so template elements are not lost.
|
|
176038
176554
|
*/
|
|
176039
|
-
this.mergedSlides = computed(() => this.
|
|
176555
|
+
this.mergedSlides = computed(() => this.hasEditPermission()
|
|
176040
176556
|
? buildSaveSlides(this.editor.slides(), this.editor.templateElementsBySlideId())
|
|
176041
176557
|
: this.loader.slides(), /* @ts-ignore */
|
|
176042
176558
|
...(ngDevMode ? [{ debugName: "mergedSlides" }] : /* istanbul ignore next */ []));
|
|
@@ -176048,7 +176564,7 @@ class PowerPointViewerComponent {
|
|
|
176048
176564
|
/** Inherited template (master/layout) elements for the active slide, when editing. */
|
|
176049
176565
|
this.activeTemplateElements = computed(() => {
|
|
176050
176566
|
const slide = this.activeSlide();
|
|
176051
|
-
if (!this.
|
|
176567
|
+
if (!this.hasEditPermission() || !slide) {
|
|
176052
176568
|
return [];
|
|
176053
176569
|
}
|
|
176054
176570
|
return this.editor.templateElementsBySlideId()[slide.id] ?? [];
|
|
@@ -176846,7 +177362,7 @@ class PowerPointViewerComponent {
|
|
|
176846
177362
|
// component (canEdit, the host `content` input, the File ▸ Open override,
|
|
176847
177363
|
// the editor's slides + template elements, and the contentChange emitter).
|
|
176848
177364
|
this.fileIO.bind({
|
|
176849
|
-
canEdit: () => this.
|
|
177365
|
+
canEdit: () => this.hasEditPermission(),
|
|
176850
177366
|
content: () => this.content(),
|
|
176851
177367
|
onOpenFile: () => this.onOpenFile(),
|
|
176852
177368
|
slides: () => this.editor.slides(),
|
|
@@ -177262,6 +177778,12 @@ class PowerPointViewerComponent {
|
|
|
177262
177778
|
}
|
|
177263
177779
|
/** Switch the viewer mode (e.g. 'edit', 'preview', 'present'). */
|
|
177264
177780
|
setMode(mode) {
|
|
177781
|
+
if (mode === 'preview' && this.canEdit()) {
|
|
177782
|
+
this.mainEl()?.nativeElement.querySelector('[data-inline-editor]')?.blur();
|
|
177783
|
+
}
|
|
177784
|
+
if (mode !== 'present') {
|
|
177785
|
+
this.editingRequested.set(mode !== 'preview');
|
|
177786
|
+
}
|
|
177265
177787
|
if (mode === 'present') {
|
|
177266
177788
|
this.presentationMode.present();
|
|
177267
177789
|
}
|
|
@@ -177411,6 +177933,18 @@ class PowerPointViewerComponent {
|
|
|
177411
177933
|
const s = this.displaySlides()[idx];
|
|
177412
177934
|
return s?.elements.find((e) => e.id === elementId);
|
|
177413
177935
|
}
|
|
177936
|
+
/** Insert a defensive copy into the active ordinary editable slide. */
|
|
177937
|
+
addElement(element) {
|
|
177938
|
+
return insertPublicElement(element, {
|
|
177939
|
+
canEdit: this.canEdit(),
|
|
177940
|
+
mode: this.getMode(),
|
|
177941
|
+
hasActiveSlide: !this.loader.loading() && !this.loader.error() && Boolean(this.activeSlide()),
|
|
177942
|
+
editTemplateMode: this.editor.editTemplateMode(),
|
|
177943
|
+
}, this.editor, this.activeSlideIndex(), () => {
|
|
177944
|
+
// Blur synchronously emits the existing canvas textCommit before insertion.
|
|
177945
|
+
this.mainEl()?.nativeElement.querySelector('[data-inline-editor]')?.blur();
|
|
177946
|
+
});
|
|
177947
|
+
}
|
|
177414
177948
|
/** Update one or more properties of an element by ID. */
|
|
177415
177949
|
updateElement(elementId, updates) {
|
|
177416
177950
|
this.editor.updateElement(this.activeSlideIndex(), elementId, updates);
|
|
@@ -177766,7 +178300,7 @@ class PowerPointViewerComponent {
|
|
|
177766
178300
|
return (this.mainEl()?.nativeElement.querySelector('.pptx-ng-canvas-stage') ?? undefined);
|
|
177767
178301
|
}
|
|
177768
178302
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: PowerPointViewerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
177769
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: PowerPointViewerComponent, isStandalone: true, selector: "pptx-viewer", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, fontsInput: { classPropertyName: "fontsInput", publicName: "fonts", isSignal: true, isRequired: false, transformFunction: null }, canEditInput: { classPropertyName: "canEditInput", publicName: "canEdit", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: true, isRequired: false, transformFunction: null }, defaultThemeKey: { classPropertyName: "defaultThemeKey", publicName: "defaultThemeKey", isSignal: true, isRequired: false, transformFunction: null }, availableThemes: { classPropertyName: "availableThemes", publicName: "availableThemes", isSignal: true, isRequired: false, transformFunction: null }, onThemeChange: { classPropertyName: "onThemeChange", publicName: "onThemeChange", isSignal: true, isRequired: false, transformFunction: null }, defaultLocale: { classPropertyName: "defaultLocale", publicName: "defaultLocale", isSignal: true, isRequired: false, transformFunction: null }, availableLocales: { classPropertyName: "availableLocales", publicName: "availableLocales", isSignal: true, isRequired: false, transformFunction: null }, onLocaleChange: { classPropertyName: "onLocaleChange", publicName: "onLocaleChange", isSignal: true, isRequired: false, transformFunction: null }, accountAuth: { classPropertyName: "accountAuth", publicName: "accountAuth", isSignal: true, isRequired: false, transformFunction: null }, filePath: { classPropertyName: "filePath", publicName: "filePath", isSignal: true, isRequired: false, transformFunction: null }, fileName: { classPropertyName: "fileName", publicName: "fileName", isSignal: true, isRequired: false, transformFunction: null }, autosaveInput: { classPropertyName: "autosaveInput", publicName: "autosave", isSignal: true, isRequired: false, transformFunction: null }, autosaveIntervalMs: { classPropertyName: "autosaveIntervalMs", publicName: "autosaveIntervalMs", isSignal: true, isRequired: false, transformFunction: null }, collaboration: { classPropertyName: "collaboration", publicName: "collaboration", isSignal: true, isRequired: false, transformFunction: null }, authorName: { classPropertyName: "authorName", publicName: "authorName", isSignal: true, isRequired: false, transformFunction: null }, shareDefaults: { classPropertyName: "shareDefaults", publicName: "shareDefaults", isSignal: true, isRequired: false, transformFunction: null }, onOpenFile: { classPropertyName: "onOpenFile", publicName: "onOpenFile", isSignal: true, isRequired: false, transformFunction: null }, smartArt3D: { classPropertyName: "smartArt3D", publicName: "smartArt3D", isSignal: true, isRequired: false, transformFunction: null }, surfaceChart3D: { classPropertyName: "surfaceChart3D", publicName: "surfaceChart3D", isSignal: true, isRequired: false, transformFunction: null }, barChart3D: { classPropertyName: "barChart3D", publicName: "barChart3D", isSignal: true, isRequired: false, transformFunction: null }, lineChart3D: { classPropertyName: "lineChart3D", publicName: "lineChart3D", isSignal: true, isRequired: false, transformFunction: null }, areaChart3D: { classPropertyName: "areaChart3D", publicName: "areaChart3D", isSignal: true, isRequired: false, transformFunction: null }, pieChart3D: { classPropertyName: "pieChart3D", publicName: "pieChart3D", isSignal: true, isRequired: false, transformFunction: null }, hiddenActions: { classPropertyName: "hiddenActions", publicName: "hiddenActions", isSignal: true, isRequired: false, transformFunction: null }, ai: { classPropertyName: "ai", publicName: "ai", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activeSlideChange: "activeSlideChange", dirtyChange: "dirtyChange", contentChange: "contentChange", propertiesChange: "propertiesChange", modeChange: "modeChange", zoomChange: "zoomChange", selectionChange: "selectionChange", slideCountChange: "slideCountChange", startCollaboration: "startCollaboration", stopCollaboration: "stopCollaboration" }, host: { listeners: { "document:keydown": "onKeyDown($event)", "window:beforeunload": "clearCacheOnUnload()" } }, providers: [...POWER_POINT_VIEWER_PROVIDERS], viewQueries: [{ propertyName: "extraDialogs", first: true, predicate: ViewerExtraDialogsComponent, descendants: true, isSignal: true }, { propertyName: "mainEl", first: true, predicate: ["mainEl"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
178303
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.6", type: PowerPointViewerComponent, isStandalone: true, selector: "pptx-viewer", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, fontsInput: { classPropertyName: "fontsInput", publicName: "fonts", isSignal: true, isRequired: false, transformFunction: null }, canEditInput: { classPropertyName: "canEditInput", publicName: "canEdit", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: true, isRequired: false, transformFunction: null }, defaultThemeKey: { classPropertyName: "defaultThemeKey", publicName: "defaultThemeKey", isSignal: true, isRequired: false, transformFunction: null }, availableThemes: { classPropertyName: "availableThemes", publicName: "availableThemes", isSignal: true, isRequired: false, transformFunction: null }, onThemeChange: { classPropertyName: "onThemeChange", publicName: "onThemeChange", isSignal: true, isRequired: false, transformFunction: null }, defaultLocale: { classPropertyName: "defaultLocale", publicName: "defaultLocale", isSignal: true, isRequired: false, transformFunction: null }, availableLocales: { classPropertyName: "availableLocales", publicName: "availableLocales", isSignal: true, isRequired: false, transformFunction: null }, onLocaleChange: { classPropertyName: "onLocaleChange", publicName: "onLocaleChange", isSignal: true, isRequired: false, transformFunction: null }, accountAuth: { classPropertyName: "accountAuth", publicName: "accountAuth", isSignal: true, isRequired: false, transformFunction: null }, filePath: { classPropertyName: "filePath", publicName: "filePath", isSignal: true, isRequired: false, transformFunction: null }, fileName: { classPropertyName: "fileName", publicName: "fileName", isSignal: true, isRequired: false, transformFunction: null }, fitPadding: { classPropertyName: "fitPadding", publicName: "fitPadding", isSignal: true, isRequired: false, transformFunction: null }, maxFitScale: { classPropertyName: "maxFitScale", publicName: "maxFitScale", isSignal: true, isRequired: false, transformFunction: null }, autosaveInput: { classPropertyName: "autosaveInput", publicName: "autosave", isSignal: true, isRequired: false, transformFunction: null }, autosaveIntervalMs: { classPropertyName: "autosaveIntervalMs", publicName: "autosaveIntervalMs", isSignal: true, isRequired: false, transformFunction: null }, collaboration: { classPropertyName: "collaboration", publicName: "collaboration", isSignal: true, isRequired: false, transformFunction: null }, authorName: { classPropertyName: "authorName", publicName: "authorName", isSignal: true, isRequired: false, transformFunction: null }, shareDefaults: { classPropertyName: "shareDefaults", publicName: "shareDefaults", isSignal: true, isRequired: false, transformFunction: null }, onOpenFile: { classPropertyName: "onOpenFile", publicName: "onOpenFile", isSignal: true, isRequired: false, transformFunction: null }, smartArt3D: { classPropertyName: "smartArt3D", publicName: "smartArt3D", isSignal: true, isRequired: false, transformFunction: null }, surfaceChart3D: { classPropertyName: "surfaceChart3D", publicName: "surfaceChart3D", isSignal: true, isRequired: false, transformFunction: null }, barChart3D: { classPropertyName: "barChart3D", publicName: "barChart3D", isSignal: true, isRequired: false, transformFunction: null }, lineChart3D: { classPropertyName: "lineChart3D", publicName: "lineChart3D", isSignal: true, isRequired: false, transformFunction: null }, areaChart3D: { classPropertyName: "areaChart3D", publicName: "areaChart3D", isSignal: true, isRequired: false, transformFunction: null }, pieChart3D: { classPropertyName: "pieChart3D", publicName: "pieChart3D", isSignal: true, isRequired: false, transformFunction: null }, hiddenActions: { classPropertyName: "hiddenActions", publicName: "hiddenActions", isSignal: true, isRequired: false, transformFunction: null }, ai: { classPropertyName: "ai", publicName: "ai", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activeSlideChange: "activeSlideChange", dirtyChange: "dirtyChange", contentChange: "contentChange", propertiesChange: "propertiesChange", modeChange: "modeChange", zoomChange: "zoomChange", selectionChange: "selectionChange", slideCountChange: "slideCountChange", startCollaboration: "startCollaboration", stopCollaboration: "stopCollaboration" }, host: { listeners: { "document:keydown": "onKeyDown($event)", "window:beforeunload": "clearCacheOnUnload()" } }, providers: [...POWER_POINT_VIEWER_PROVIDERS], viewQueries: [{ propertyName: "extraDialogs", first: true, predicate: ViewerExtraDialogsComponent, descendants: true, isSignal: true }, { propertyName: "mainEl", first: true, predicate: ["mainEl"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
177770
178304
|
<div
|
|
177771
178305
|
class="pptx-ng-viewer"
|
|
177772
178306
|
[ngClass]="rootClasses()"
|
|
@@ -178021,6 +178555,8 @@ class PowerPointViewerComponent {
|
|
|
178021
178555
|
[canvasSize]="loader.canvasSize()"
|
|
178022
178556
|
[mediaDataUrls]="loader.mediaDataUrls()"
|
|
178023
178557
|
[zoom]="zoomSvc.zoom()"
|
|
178558
|
+
[fitPadding]="fitPadding()"
|
|
178559
|
+
[maxFitScale]="maxFitScale()"
|
|
178024
178560
|
[editable]="canEdit()"
|
|
178025
178561
|
[selectedIds]="editor.selectedIds()"
|
|
178026
178562
|
[showGrid]="showGrid()"
|
|
@@ -178720,7 +179256,7 @@ class PowerPointViewerComponent {
|
|
|
178720
179256
|
(dismissAll)="loadNotices.dismissAllToasts()"
|
|
178721
179257
|
/>
|
|
178722
179258
|
</div>
|
|
178723
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresentationOverlayComponent, selector: "pptx-presentation-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "startIndex", "activeCustomShow", "authoredRange", "loopContinuously", "showWithAnimation", "useTimings", "subtitlesVisible", "sessionEnded", "endWithBlackSlide", "pixelateMosaicAnimation", "presenterMode", "showMenuOnRightClick", "showPopupToolbar"], outputs: ["indexChange", "closed", "subtitlesChange", "presenterViewToggle", "annotationsExit", "customShowRequest", "endOfShowChange"] }, { kind: "component", type: PresenterViewComponent, selector: "pptx-presenter-view", inputs: ["slides", "currentSlideIndex", "activeCustomShow", "authoredRange", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime", "isAudienceWindowOpen"], outputs: ["movePresentationSlide", "exit", "openAudienceWindow", "closeAudienceWindow", "navigateToSlide"] }, { kind: "component", type: MobilePresenterViewComponent, selector: "pptx-mobile-presenter-view", inputs: ["slides", "currentSlideIndex", "activeCustomShow", "authoredRange", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime"], outputs: ["movePresentationSlide", "exit"] }, { kind: "component", type: SlideSorterOverlayComponent, selector: "pptx-slide-sorter-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "activeIndex", "canEdit"], outputs: ["select", "closed", "deleteSlide", "duplicateSlide", "toggleHiddenSlide"] }, { kind: "component", type: OutlineViewOverlayComponent, selector: "pptx-outline-view-overlay", inputs: ["slides", "canvasSize", "canEdit"], outputs: ["commit", "closed"] }, { kind: "component", type: ReadingViewOverlayComponent, selector: "pptx-reading-view-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "activeSlideIndex"], outputs: ["exit"] }, { kind: "component", type: SlideDefaultInspectorComponent, selector: "pptx-slide-default-inspector", inputs: ["slideIndex", "canEdit", "selectedElement", "comments", "modernCommentAuthors"], outputs: ["commentAdd", "commentRemove", "commentResolve", "commentReply"] }, { kind: "component", type: FindBarComponent, selector: "pptx-find-bar", inputs: ["slides"], outputs: ["navigate", "closed"] }, { kind: "component", type: FindReplaceBarComponent, selector: "pptx-find-replace-bar", inputs: ["matchCount", "matchIndex"], outputs: ["find", "navigate", "replaceOne", "replaceAll", "close"] }, { kind: "component", type: SlidesPanelComponent, selector: "pptx-slides-panel", inputs: ["canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select"] }, { kind: "component", type: StatusBarComponent, selector: "pptx-status-bar", inputs: ["slideIndex", "slideCount", "canEdit", "dirty", "autosaveStatus", "notesOpen", "zoomPercent", "sorterActive", "presenting", "hiddenActions"], outputs: ["toggleNotes", "normalView", "openSorter", "slideShow", "zoomIn", "zoomOut", "zoomReset"] }, { kind: "component", type: EditorContextMenuComponent, selector: "pptx-editor-context-menu", inputs: ["x", "y", "slideIndex", "showAiActions"], outputs: ["closed", "askAi", "fixAi", "editHyperlink", "addComment"] }, { kind: "component", type: ExportProgressModalComponent, selector: "pptx-export-progress-modal", inputs: ["open", "title", "progress", "statusMessage"], outputs: ["cancel"] }, { kind: "component", type: CommentMarkersOverlayComponent, selector: "pptx-comment-markers-overlay", inputs: ["comments", "canvasSize"], outputs: ["markerClick"] }, { kind: "component", type: CommentsPanelComponent, selector: "pptx-comments-panel", inputs: ["comments", "authorName", "modernCommentAuthors"], outputs: ["add", "remove", "resolve", "reply"] }, { kind: "component", type: CompatToastsComponent, selector: "pptx-compat-toasts", inputs: ["toasts"], outputs: ["dismissOne", "dismissAll"] }, { kind: "component", type: ReadOnlyBannerComponent, selector: "pptx-readonly-banner", inputs: ["kind", "messageKey", "passwordPromptOpen", "passwordError", "checkingPassword"], outputs: ["editAnyway", "dismiss", "submitPassword", "cancelPassword"] }, { 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: MotionPathOverlayComponent, selector: "pptx-motion-path-overlay", inputs: ["element", "animations", "canvasSize", "canEdit"], outputs: ["pathChange"] }, { 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", "defaultSettings"], outputs: ["print", "cancel"] }, { kind: "component", type: ShareDialogComponent, selector: "pptx-share-dialog", inputs: ["open", "defaults", "active", "connected", "userCount", "shareUrl", "p2p", "activeRoomId", "activeServerUrl", "users"], outputs: ["start", "stop", "close"] }, { kind: "component", type: BroadcastDialogComponent, selector: "pptx-broadcast-dialog", inputs: ["open", "defaults", "active", "connected", "viewerCount", "viewerUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: MobileBottomBarComponent, selector: "pptx-mobile-bottom-bar", inputs: ["slideCount", "commentCount", "activeSheet"], outputs: ["openSlides", "insert", "openFormat", "openComments", "notes"] }, { kind: "component", type: MobileMenuSheetComponent, selector: "pptx-mobile-menu-sheet", inputs: ["open", "slideCount", "exporting", "showNotes", "canEdit", "hiddenActions"], outputs: ["closed", "openFind", "openSorter", "toggleNotes", "insertText", "present", "openFile", "savePptx", "exportPng", "exportPdf", "exportGif", "exportVideo", "print"] }, { kind: "component", type: MobileSlidesSheetComponent, selector: "pptx-mobile-slides-sheet", inputs: ["open", "slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["closed", "jumpToSlide"] }, { kind: "component", type: MobileToolbarComponent, selector: "pptx-mobile-toolbar", inputs: ["canUndo", "canRedo", "canPresent", "canEdit", "menuOpen", "aiEnabled", "aiPanelOpen", "hiddenActions"], outputs: ["toggleMenu", "toggleAiPanel", "undo", "redo", "share", "save", "present"] }, { kind: "component", type: MasterViewCanvasComponent, selector: "pptx-master-view-canvas", inputs: ["tab", "slideMasters", "activeMasterIndex", "activeLayoutIndex", "notesMaster", "handoutMaster", "canvasSize", "notesCanvasSize", "mediaDataUrls", "editable"], outputs: ["notesMasterChange", "handoutMasterChange", "slideMastersChange"] }, { kind: "component", type: MasterViewSidebarComponent, selector: "pptx-master-view-sidebar", inputs: ["tab", "slideMasters", "notesMaster", "handoutMaster", "activeMasterIndex", "activeLayoutIndex", "handoutSlidesPerPage", "editable", "crudActions"], outputs: ["tabChange", "selectMaster", "selectLayout", "slidesPerPageChange", "backgroundChange", "close", "crudAction"] }, { kind: "component", type: NotesPanelComponent, selector: "pptx-notes-panel", inputs: ["slide", "expanded", "notesStyle"], outputs: ["update", "notesToggle"] }, { kind: "component", type: QuickAccessStripComponent, selector: "pptx-quick-access-strip", inputs: ["quickAccess", "canUndo", "canRedo"], outputs: ["command"] }, { kind: "component", type: RibbonComponent, selector: "pptx-ribbon", inputs: ["slideIndex", "slideCount", "canEdit", "selectedElement", "zoomPercent", "formatPainterActive", "canActivateFormatPainter", "exporting", "hasMacros", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToShape", "eyedropperActive", "themeGalleryOpen", "sidebarCollapsed", "inspectorOpen", "commentsOpen", "commentCount", "findOpen", "collabConnected", "connectedCount", "spellCheckEnabled", "showSubtitles", "hiddenActions", "aiEnabled", "aiPanelOpen", "accountAuth", "activeSlideHidden"], outputs: ["prev", "next", "zoomIn", "zoomOut", "zoomReset", "find", "present", "presenter", "record", "presentFromBeginning", "rehearseTimings", "toggleSubtitles", "openSubtitleSettings", "recordFromBeginning", "recordFromCurrent", "spellCheckChange", "share", "broadcast", "openFile", "openRecentFile", "createPresentation", "save", "savePpsx", "savePptm", "savePpt", "toggleSidebar", "toggleAiPanel", "signatures", "info", "print", "comments", "a11y", "shortcuts", "versionHistory", "passwordProtection", "fontEmbedding", "link", "openSorter", "openReadingView", "openOutlineView", "openMasterView", "toggleNotes", "toggleFormatPainter", "exportPng", "exportPdf", "exportGif", "exportVideo", "exportJson", "copySlideAsImage", "replace", "toggleInspector", "openAnimationPanel", "drawToolChange", "toggleThemeGallery", "editTheme", "openSlideSize", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "openCustomShows", "toggleSnapToGrid", "toggleSnapToShape", "addGuide", "zoomToFit", "toggleEyedropper", "openSmartArtDialog", "openTemplateGallery", "openEquationDialog", "openSetUpSlideShow", "toggleHideSlide", "openCompare", "openPassword", "openFontEmbedding", "openVersionHistory", "openShortcuts", "openSettings"] }, { kind: "component", type: TitleBarComponent, selector: "pptx-title-bar", inputs: ["canEdit", "fileName", "isDirty", "autosaveStatus", "autosaveEnabled", "canUndo", "canRedo", "undoLabel", "redoLabel", "findReplaceOpen", "hiddenActions", "quickAccess"], outputs: ["toggleAutosave", "save", "undo", "redo", "quickCommand", "toggleFindReplace", "commandSearch"] }, { kind: "component", type: ThemeGalleryComponent, selector: "pptx-theme-gallery", inputs: ["open", "activeName", "theme", "startCustomizing"], outputs: ["applyTheme", "applyCustomTheme", "close"] }, { kind: "component", type: SelectionPaneComponent, selector: "pptx-selection-pane", inputs: ["elements", "selectedIds"], outputs: ["selectElement", "bringForward", "sendBackward", "toggleHidden", "renameElement"] }, { 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: SlideTemplateGalleryDialogComponent, selector: "pptx-slide-template-gallery-dialog", inputs: ["open", "scheme"], outputs: ["close", "insert"] }, { kind: "component", type: ViewerExtraDialogsComponent, selector: "pptx-viewer-extra-dialogs", inputs: ["activeSlideIndex", "selectedElementId", "filePath", "customShows", "themeKey", "availableThemes", "localeCode", "availableLocales", "aiExportVisible"], outputs: ["restoreContent", "themeKeySelect", "localeSelect"] }, { kind: "component", type: AutosaveRecoveryDialogComponent, selector: "pptx-autosave-recovery-dialog", inputs: ["prompt"], outputs: ["restore", "discard"] }, { kind: "component", type: RehearseTimingsComponent, selector: "pptx-rehearse-timings", inputs: ["summary", "paused", "slideStartedAt", "presentationStartedAt", "timings"], outputs: ["togglePause", "save", "discard"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [/* @ts-ignore */
|
|
179259
|
+
`, 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", "fitPadding", "maxFitScale", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "gridSpacing", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "exposeElementIds", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "transformEnd", "adjustUpdate", "connectorEndpointUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresentationOverlayComponent, selector: "pptx-presentation-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "startIndex", "activeCustomShow", "authoredRange", "loopContinuously", "showWithAnimation", "useTimings", "subtitlesVisible", "sessionEnded", "endWithBlackSlide", "pixelateMosaicAnimation", "presenterMode", "showMenuOnRightClick", "showPopupToolbar"], outputs: ["indexChange", "closed", "subtitlesChange", "presenterViewToggle", "annotationsExit", "customShowRequest", "endOfShowChange"] }, { kind: "component", type: PresenterViewComponent, selector: "pptx-presenter-view", inputs: ["slides", "currentSlideIndex", "activeCustomShow", "authoredRange", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime", "isAudienceWindowOpen"], outputs: ["movePresentationSlide", "exit", "openAudienceWindow", "closeAudienceWindow", "navigateToSlide"] }, { kind: "component", type: MobilePresenterViewComponent, selector: "pptx-mobile-presenter-view", inputs: ["slides", "currentSlideIndex", "activeCustomShow", "authoredRange", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime"], outputs: ["movePresentationSlide", "exit"] }, { kind: "component", type: SlideSorterOverlayComponent, selector: "pptx-slide-sorter-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "activeIndex", "canEdit"], outputs: ["select", "closed", "deleteSlide", "duplicateSlide", "toggleHiddenSlide"] }, { kind: "component", type: OutlineViewOverlayComponent, selector: "pptx-outline-view-overlay", inputs: ["slides", "canvasSize", "canEdit"], outputs: ["commit", "closed"] }, { kind: "component", type: ReadingViewOverlayComponent, selector: "pptx-reading-view-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "activeSlideIndex"], outputs: ["exit"] }, { kind: "component", type: SlideDefaultInspectorComponent, selector: "pptx-slide-default-inspector", inputs: ["slideIndex", "canEdit", "selectedElement", "comments", "modernCommentAuthors"], outputs: ["commentAdd", "commentRemove", "commentResolve", "commentReply"] }, { kind: "component", type: FindBarComponent, selector: "pptx-find-bar", inputs: ["slides"], outputs: ["navigate", "closed"] }, { kind: "component", type: FindReplaceBarComponent, selector: "pptx-find-replace-bar", inputs: ["matchCount", "matchIndex"], outputs: ["find", "navigate", "replaceOne", "replaceAll", "close"] }, { kind: "component", type: SlidesPanelComponent, selector: "pptx-slides-panel", inputs: ["canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select"] }, { kind: "component", type: StatusBarComponent, selector: "pptx-status-bar", inputs: ["slideIndex", "slideCount", "canEdit", "dirty", "autosaveStatus", "notesOpen", "zoomPercent", "sorterActive", "presenting", "hiddenActions"], outputs: ["toggleNotes", "normalView", "openSorter", "slideShow", "zoomIn", "zoomOut", "zoomReset"] }, { kind: "component", type: EditorContextMenuComponent, selector: "pptx-editor-context-menu", inputs: ["x", "y", "slideIndex", "showAiActions"], outputs: ["closed", "askAi", "fixAi", "editHyperlink", "addComment"] }, { kind: "component", type: ExportProgressModalComponent, selector: "pptx-export-progress-modal", inputs: ["open", "title", "progress", "statusMessage"], outputs: ["cancel"] }, { kind: "component", type: CommentMarkersOverlayComponent, selector: "pptx-comment-markers-overlay", inputs: ["comments", "canvasSize"], outputs: ["markerClick"] }, { kind: "component", type: CommentsPanelComponent, selector: "pptx-comments-panel", inputs: ["comments", "authorName", "modernCommentAuthors"], outputs: ["add", "remove", "resolve", "reply"] }, { kind: "component", type: CompatToastsComponent, selector: "pptx-compat-toasts", inputs: ["toasts"], outputs: ["dismissOne", "dismissAll"] }, { kind: "component", type: ReadOnlyBannerComponent, selector: "pptx-readonly-banner", inputs: ["kind", "messageKey", "passwordPromptOpen", "passwordError", "checkingPassword"], outputs: ["editAnyway", "dismiss", "submitPassword", "cancelPassword"] }, { 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: MotionPathOverlayComponent, selector: "pptx-motion-path-overlay", inputs: ["element", "animations", "canvasSize", "canEdit"], outputs: ["pathChange"] }, { 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", "defaultSettings"], outputs: ["print", "cancel"] }, { kind: "component", type: ShareDialogComponent, selector: "pptx-share-dialog", inputs: ["open", "defaults", "active", "connected", "userCount", "shareUrl", "p2p", "activeRoomId", "activeServerUrl", "users"], outputs: ["start", "stop", "close"] }, { kind: "component", type: BroadcastDialogComponent, selector: "pptx-broadcast-dialog", inputs: ["open", "defaults", "active", "connected", "viewerCount", "viewerUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: MobileBottomBarComponent, selector: "pptx-mobile-bottom-bar", inputs: ["slideCount", "commentCount", "activeSheet"], outputs: ["openSlides", "insert", "openFormat", "openComments", "notes"] }, { kind: "component", type: MobileMenuSheetComponent, selector: "pptx-mobile-menu-sheet", inputs: ["open", "slideCount", "exporting", "showNotes", "canEdit", "hiddenActions"], outputs: ["closed", "openFind", "openSorter", "toggleNotes", "insertText", "present", "openFile", "savePptx", "exportPng", "exportPdf", "exportGif", "exportVideo", "print"] }, { kind: "component", type: MobileSlidesSheetComponent, selector: "pptx-mobile-slides-sheet", inputs: ["open", "slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["closed", "jumpToSlide"] }, { kind: "component", type: MobileToolbarComponent, selector: "pptx-mobile-toolbar", inputs: ["canUndo", "canRedo", "canPresent", "canEdit", "menuOpen", "aiEnabled", "aiPanelOpen", "hiddenActions"], outputs: ["toggleMenu", "toggleAiPanel", "undo", "redo", "share", "save", "present"] }, { kind: "component", type: MasterViewCanvasComponent, selector: "pptx-master-view-canvas", inputs: ["tab", "slideMasters", "activeMasterIndex", "activeLayoutIndex", "notesMaster", "handoutMaster", "canvasSize", "notesCanvasSize", "mediaDataUrls", "editable"], outputs: ["notesMasterChange", "handoutMasterChange", "slideMastersChange"] }, { kind: "component", type: MasterViewSidebarComponent, selector: "pptx-master-view-sidebar", inputs: ["tab", "slideMasters", "notesMaster", "handoutMaster", "activeMasterIndex", "activeLayoutIndex", "handoutSlidesPerPage", "editable", "crudActions"], outputs: ["tabChange", "selectMaster", "selectLayout", "slidesPerPageChange", "backgroundChange", "close", "crudAction"] }, { kind: "component", type: NotesPanelComponent, selector: "pptx-notes-panel", inputs: ["slide", "expanded", "notesStyle"], outputs: ["update", "notesToggle"] }, { kind: "component", type: QuickAccessStripComponent, selector: "pptx-quick-access-strip", inputs: ["quickAccess", "canUndo", "canRedo"], outputs: ["command"] }, { kind: "component", type: RibbonComponent, selector: "pptx-ribbon", inputs: ["slideIndex", "slideCount", "canEdit", "selectedElement", "zoomPercent", "formatPainterActive", "canActivateFormatPainter", "exporting", "hasMacros", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToShape", "eyedropperActive", "themeGalleryOpen", "sidebarCollapsed", "inspectorOpen", "commentsOpen", "commentCount", "findOpen", "collabConnected", "connectedCount", "spellCheckEnabled", "showSubtitles", "hiddenActions", "aiEnabled", "aiPanelOpen", "accountAuth", "activeSlideHidden"], outputs: ["prev", "next", "zoomIn", "zoomOut", "zoomReset", "find", "present", "presenter", "record", "presentFromBeginning", "rehearseTimings", "toggleSubtitles", "openSubtitleSettings", "recordFromBeginning", "recordFromCurrent", "spellCheckChange", "share", "broadcast", "openFile", "openRecentFile", "createPresentation", "save", "savePpsx", "savePptm", "savePpt", "toggleSidebar", "toggleAiPanel", "signatures", "info", "print", "comments", "a11y", "shortcuts", "versionHistory", "passwordProtection", "fontEmbedding", "link", "openSorter", "openReadingView", "openOutlineView", "openMasterView", "toggleNotes", "toggleFormatPainter", "exportPng", "exportPdf", "exportGif", "exportVideo", "exportJson", "copySlideAsImage", "replace", "toggleInspector", "openAnimationPanel", "drawToolChange", "toggleThemeGallery", "editTheme", "openSlideSize", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "openCustomShows", "toggleSnapToGrid", "toggleSnapToShape", "addGuide", "zoomToFit", "toggleEyedropper", "openSmartArtDialog", "openTemplateGallery", "openEquationDialog", "openSetUpSlideShow", "toggleHideSlide", "openCompare", "openPassword", "openFontEmbedding", "openVersionHistory", "openShortcuts", "openSettings"] }, { kind: "component", type: TitleBarComponent, selector: "pptx-title-bar", inputs: ["canEdit", "fileName", "isDirty", "autosaveStatus", "autosaveEnabled", "canUndo", "canRedo", "undoLabel", "redoLabel", "findReplaceOpen", "hiddenActions", "quickAccess"], outputs: ["toggleAutosave", "save", "undo", "redo", "quickCommand", "toggleFindReplace", "commandSearch"] }, { kind: "component", type: ThemeGalleryComponent, selector: "pptx-theme-gallery", inputs: ["open", "activeName", "theme", "startCustomizing"], outputs: ["applyTheme", "applyCustomTheme", "close"] }, { kind: "component", type: SelectionPaneComponent, selector: "pptx-selection-pane", inputs: ["elements", "selectedIds"], outputs: ["selectElement", "bringForward", "sendBackward", "toggleHidden", "renameElement"] }, { 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: SlideTemplateGalleryDialogComponent, selector: "pptx-slide-template-gallery-dialog", inputs: ["open", "scheme"], outputs: ["close", "insert"] }, { kind: "component", type: ViewerExtraDialogsComponent, selector: "pptx-viewer-extra-dialogs", inputs: ["activeSlideIndex", "selectedElementId", "filePath", "customShows", "themeKey", "availableThemes", "localeCode", "availableLocales", "aiExportVisible"], outputs: ["restoreContent", "themeKeySelect", "localeSelect"] }, { kind: "component", type: AutosaveRecoveryDialogComponent, selector: "pptx-autosave-recovery-dialog", inputs: ["prompt"], outputs: ["restore", "discard"] }, { kind: "component", type: RehearseTimingsComponent, selector: "pptx-rehearse-timings", inputs: ["summary", "paused", "slideStartedAt", "presentationStartedAt", "timings"], outputs: ["togglePause", "save", "discard"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [/* @ts-ignore */
|
|
178724
179260
|
Promise.resolve().then(function () { return aiChatPanel_component; }).then(m => m.AiChatPanelComponent)]] }); }
|
|
178725
179261
|
}
|
|
178726
179262
|
i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.1.6", ngImport: i0, type: PowerPointViewerComponent, resolveDeferredDeps: () => [/* @ts-ignore */
|
|
@@ -179040,6 +179576,8 @@ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.1.6", ng
|
|
|
179040
179576
|
[canvasSize]="loader.canvasSize()"
|
|
179041
179577
|
[mediaDataUrls]="loader.mediaDataUrls()"
|
|
179042
179578
|
[zoom]="zoomSvc.zoom()"
|
|
179579
|
+
[fitPadding]="fitPadding()"
|
|
179580
|
+
[maxFitScale]="maxFitScale()"
|
|
179043
179581
|
[editable]="canEdit()"
|
|
179044
179582
|
[selectedIds]="editor.selectedIds()"
|
|
179045
179583
|
[showGrid]="showGrid()"
|
|
@@ -179741,7 +180279,7 @@ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.1.6", ng
|
|
|
179741
180279
|
</div>
|
|
179742
180280
|
`,
|
|
179743
180281
|
}]
|
|
179744
|
-
}], ctorParameters: () => [], propDecorators: { content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: false }] }], fontsInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "fonts", required: false }] }], canEditInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], theme: [{ type: i0.Input, args: [{ isSignal: true, alias: "theme", required: false }] }], defaultThemeKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultThemeKey", required: false }] }], availableThemes: [{ type: i0.Input, args: [{ isSignal: true, alias: "availableThemes", required: false }] }], onThemeChange: [{ type: i0.Input, args: [{ isSignal: true, alias: "onThemeChange", required: false }] }], defaultLocale: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultLocale", required: false }] }], availableLocales: [{ type: i0.Input, args: [{ isSignal: true, alias: "availableLocales", required: false }] }], onLocaleChange: [{ type: i0.Input, args: [{ isSignal: true, alias: "onLocaleChange", required: false }] }], accountAuth: [{ type: i0.Input, args: [{ isSignal: true, alias: "accountAuth", required: false }] }], filePath: [{ type: i0.Input, args: [{ isSignal: true, alias: "filePath", required: false }] }], fileName: [{ type: i0.Input, args: [{ isSignal: true, alias: "fileName", required: false }] }], autosaveInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "autosave", required: false }] }], autosaveIntervalMs: [{ type: i0.Input, args: [{ isSignal: true, alias: "autosaveIntervalMs", required: false }] }], collaboration: [{ type: i0.Input, args: [{ isSignal: true, alias: "collaboration", required: false }] }], authorName: [{ type: i0.Input, args: [{ isSignal: true, alias: "authorName", required: false }] }], shareDefaults: [{ type: i0.Input, args: [{ isSignal: true, alias: "shareDefaults", required: false }] }], onOpenFile: [{ type: i0.Input, args: [{ isSignal: true, alias: "onOpenFile", required: false }] }], smartArt3D: [{ type: i0.Input, args: [{ isSignal: true, alias: "smartArt3D", required: false }] }], surfaceChart3D: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceChart3D", required: false }] }], barChart3D: [{ type: i0.Input, args: [{ isSignal: true, alias: "barChart3D", required: false }] }], lineChart3D: [{ type: i0.Input, args: [{ isSignal: true, alias: "lineChart3D", required: false }] }], areaChart3D: [{ type: i0.Input, args: [{ isSignal: true, alias: "areaChart3D", required: false }] }], pieChart3D: [{ type: i0.Input, args: [{ isSignal: true, alias: "pieChart3D", required: false }] }], hiddenActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "hiddenActions", required: false }] }], ai: [{ type: i0.Input, args: [{ isSignal: true, alias: "ai", required: false }] }], activeSlideChange: [{ type: i0.Output, args: ["activeSlideChange"] }], dirtyChange: [{ type: i0.Output, args: ["dirtyChange"] }], contentChange: [{ type: i0.Output, args: ["contentChange"] }], propertiesChange: [{ type: i0.Output, args: ["propertiesChange"] }], modeChange: [{ type: i0.Output, args: ["modeChange"] }], zoomChange: [{ type: i0.Output, args: ["zoomChange"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], slideCountChange: [{ type: i0.Output, args: ["slideCountChange"] }], startCollaboration: [{ type: i0.Output, args: ["startCollaboration"] }], stopCollaboration: [{ type: i0.Output, args: ["stopCollaboration"] }], extraDialogs: [{ type: i0.ViewChild, args: [i0.forwardRef(() => ViewerExtraDialogsComponent), { isSignal: true }] }], mainEl: [{ type: i0.ViewChild, args: ['mainEl', { isSignal: true }] }], onKeyDown: [{
|
|
180282
|
+
}], ctorParameters: () => [], propDecorators: { content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: false }] }], fontsInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "fonts", required: false }] }], canEditInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], theme: [{ type: i0.Input, args: [{ isSignal: true, alias: "theme", required: false }] }], defaultThemeKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultThemeKey", required: false }] }], availableThemes: [{ type: i0.Input, args: [{ isSignal: true, alias: "availableThemes", required: false }] }], onThemeChange: [{ type: i0.Input, args: [{ isSignal: true, alias: "onThemeChange", required: false }] }], defaultLocale: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultLocale", required: false }] }], availableLocales: [{ type: i0.Input, args: [{ isSignal: true, alias: "availableLocales", required: false }] }], onLocaleChange: [{ type: i0.Input, args: [{ isSignal: true, alias: "onLocaleChange", required: false }] }], accountAuth: [{ type: i0.Input, args: [{ isSignal: true, alias: "accountAuth", required: false }] }], filePath: [{ type: i0.Input, args: [{ isSignal: true, alias: "filePath", required: false }] }], fileName: [{ type: i0.Input, args: [{ isSignal: true, alias: "fileName", required: false }] }], fitPadding: [{ type: i0.Input, args: [{ isSignal: true, alias: "fitPadding", required: false }] }], maxFitScale: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFitScale", required: false }] }], autosaveInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "autosave", required: false }] }], autosaveIntervalMs: [{ type: i0.Input, args: [{ isSignal: true, alias: "autosaveIntervalMs", required: false }] }], collaboration: [{ type: i0.Input, args: [{ isSignal: true, alias: "collaboration", required: false }] }], authorName: [{ type: i0.Input, args: [{ isSignal: true, alias: "authorName", required: false }] }], shareDefaults: [{ type: i0.Input, args: [{ isSignal: true, alias: "shareDefaults", required: false }] }], onOpenFile: [{ type: i0.Input, args: [{ isSignal: true, alias: "onOpenFile", required: false }] }], smartArt3D: [{ type: i0.Input, args: [{ isSignal: true, alias: "smartArt3D", required: false }] }], surfaceChart3D: [{ type: i0.Input, args: [{ isSignal: true, alias: "surfaceChart3D", required: false }] }], barChart3D: [{ type: i0.Input, args: [{ isSignal: true, alias: "barChart3D", required: false }] }], lineChart3D: [{ type: i0.Input, args: [{ isSignal: true, alias: "lineChart3D", required: false }] }], areaChart3D: [{ type: i0.Input, args: [{ isSignal: true, alias: "areaChart3D", required: false }] }], pieChart3D: [{ type: i0.Input, args: [{ isSignal: true, alias: "pieChart3D", required: false }] }], hiddenActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "hiddenActions", required: false }] }], ai: [{ type: i0.Input, args: [{ isSignal: true, alias: "ai", required: false }] }], activeSlideChange: [{ type: i0.Output, args: ["activeSlideChange"] }], dirtyChange: [{ type: i0.Output, args: ["dirtyChange"] }], contentChange: [{ type: i0.Output, args: ["contentChange"] }], propertiesChange: [{ type: i0.Output, args: ["propertiesChange"] }], modeChange: [{ type: i0.Output, args: ["modeChange"] }], zoomChange: [{ type: i0.Output, args: ["zoomChange"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], slideCountChange: [{ type: i0.Output, args: ["slideCountChange"] }], startCollaboration: [{ type: i0.Output, args: ["startCollaboration"] }], stopCollaboration: [{ type: i0.Output, args: ["stopCollaboration"] }], extraDialogs: [{ type: i0.ViewChild, args: [i0.forwardRef(() => ViewerExtraDialogsComponent), { isSignal: true }] }], mainEl: [{ type: i0.ViewChild, args: ['mainEl', { isSignal: true }] }], onKeyDown: [{
|
|
179745
180283
|
type: HostListener,
|
|
179746
180284
|
args: ['document:keydown', ['$event']]
|
|
179747
180285
|
}], clearCacheOnUnload: [{
|
|
@@ -182020,4 +182558,4 @@ function cn(...values) {
|
|
|
182020
182558
|
*/
|
|
182021
182559
|
|
|
182022
182560
|
export { CollaborationService as $, AFTER_ANIMATION_VALUES as A, AnimationAuthorPanelComponent as B, AnimationPanelComponent as C, AnimationPlaybackService as D, AutosaveRecoveryDialogComponent as E, AutosaveService as F, BroadcastDialogComponent as G, CHART_EDITOR_STYLES as H, CURSOR_PALETTE as I, CanvasFitService as J, ChartAxisOptionsComponent as K, ChartAxisStyleOptionsComponent as L, ChartComboTypeOptionsComponent as M, ChartDataEditorComponent as N, ChartDataLabelOptionsComponent as O, ChartDatapointMarkerOptionsComponent as P, ChartDatapointOptionsComponent as Q, ChartDisplayOptionsComponent as R, ChartElementViewComponent as S, ChartErrorBarOptionsComponent as T, ChartMarkerOptionsComponent as U, ChartPartSelectionService as V, ChartPrimitivesComponent as W, ChartRendererComponent as X, ChartTrendlineOptionsComponent as Y, ChartTypeSelectorComponent as Z, CollaborationCursorsComponent as _, ALIGN_OPTIONS as a, InsertSmartArtDialogComponent as a$, ColorChangedImageComponent as a0, CommentMarkersOverlayComponent as a1, CommentsPanelComponent as a2, CommentsService as a3, ComparePanelComponent as a4, ConnectorRendererComponent as a5, ConnectorTextOverlayComponent as a6, CustomShowsComponent as a7, DEFAULT_BOUNDS as a8, DEFAULT_BROADCAST_SERVER_URL as a9, EditorToolbarComponent as aA, EffectsPanelComponent as aB, ElementRendererComponent as aC, EmbeddedFontsService as aD, EncryptedFileDialogComponent as aE, EquationEditorDialogComponent as aF, EquationRendererComponent as aG, EquationTemplateGalleryComponent as aH, ExportProgressModalComponent as aI, ExportService as aJ, FieldContextService as aK, FindBarComponent as aL, FindReplaceBarComponent as aM, FollowModeBarComponent as aN, FontEmbeddingListComponent as aO, FontEmbeddingPanelComponent as aP, GALLERY_THEME_PRESETS as aQ, GOOGLE_WEBFONTS_LINK_ID as aR, GRIDLINE_COLOR$1 as aS, GoogleWebfontsService as aT, GradientPickerComponent as aU, HANDOUT_OPTIONS as aV, HeaderFooterDialogComponent as aW, HyperlinkDialogComponent as aX, ImagePropertiesPanelComponent as aY, InkDrawingService as aZ, InkRendererComponent as a_, DEFAULT_CANVAS_HEIGHT as aa, DEFAULT_CANVAS_WIDTH as ab, DEFAULT_COLOR_SCHEME as ac, DEFAULT_FILL_COLOR$1 as ad, DEFAULT_LAYOUT as ae, DEFAULT_PALETTE$1 as af, DEFAULT_PATTERN_FILL_PRESET as ag, DEFAULT_PRINT_SETTINGS as ah, DEFAULT_SLIDE_BACKGROUND as ai, DEFAULT_STROKE_COLOR as aj, DEFAULT_STYLE as ak, DEFAULT_TABLE_ROW_HEIGHT as al, DEFAULT_TEXT_COLOR$2 as am, DEFAULT_VIEWER_PROFILE as an, DIRECTIONAL_PRESETS as ao, DIRECTION_OPTIONS as ap, DocumentPropertiesCardComponent as aq, EFFECT_SOUND_CATALOGUE as ar, EMBEDDED_FONTS_STYLE_ID as as, EMPHASIS_PRESETS as at, ENTRANCE_PRESETS as au, TEMPLATES as av, EXIT_PRESETS as aw, EditorContextMenuComponent as ax, EditorHistory as ay, EditorStateService as az, ANIMATION_PRESET_CATEGORIES as b, RibbonArrangeSectionComponent as b$, InspectorPaneHeaderComponent as b0, InspectorPanelComponent as b1, IsMobileService as b2, KeepAnnotationsDialogComponent as b3, LOCALE_CATALOG as b4, LONG_PRESS_DURATION_MS as b5, LONG_PRESS_MOVE_TOLERANCE_PX as b6, LoadContentService as b7, LocalPresencePublisher as b8, MAX_ZOOM_SCALE as b9, PX_PER_INCH as bA, PasswordProtectionDialogComponent as bB, PasswordStrengthMeterComponent as bC, PowerPointViewerComponent as bD, PresentToolbarAutoHide as bE, PresentationAnnotationOverlayComponent as bF, PresentationAnnotationsService as bG, PresentationOverlayComponent as bH, PresentationPropertiesPanelComponent as bI, PresentationSettingsCardComponent as bJ, PresentationSubtitleBarComponent as bK, PresentationToolbarComponent as bL, PresentationTransitionOverlayComponent as bM, PresenterViewComponent as bN, PresenterWindowService as bO, PrintDialogComponent as bP, PrintService as bQ, PrintSettingsPanelComponent as bR, PropertiesDialogComponent as bS, REPEAT_MODE_OPTIONS as bT, RESIZE_HANDLES as bU, RULER_FONT_SIZE as bV, RULER_THICKNESS as bW, ReadingViewOverlayComponent as bX, RemoteSelectionOverlayComponent as bY, RibbonAnimationGalleryComponent as bZ, RibbonAnimationsSectionComponent as b_, MIN_ZOOM_SCALE as ba, MOTION_PATH_COLUMNS as bb, MediaPreviewComponent as bc, MediaPropertiesPanelComponent as bd, MediaRendererComponent as be, MediaTrimTimelineComponent as bf, MobileBottomBarComponent as bg, MobileMenuSheetComponent as bh, MobilePresenterViewComponent as bi, MobileSheetComponent as bj, MobileSlidesSheetComponent as bk, MobileToolbarComponent as bl, ModalDialogComponent as bm, Model3DRendererComponent as bn, NotesHandoutCardComponent as bo, NotesPanelComponent as bp, NotesToolbarComponent as bq, OleRendererComponent as br, OutlineViewOverlayComponent as bs, POWER_POINT_VIEWER_PROVIDERS as bt, PPTX_OPEN_ACCEPT as bu, PRESENTATION_OPEN_EXTENSIONS as bv, PRESENTER_CHANNEL_NAME as bw, PRESENTER_MSG_ORIGIN as bx, PRESENTER_TIMER_SEGMENT_MS as by, PX_PER_CM as bz, AUDIENCE_HASH as c, TABLE_STRUCTURE_TOGGLES as c$, RibbonColorPopoverComponent as c0, RibbonComponent as c1, RibbonDesignSectionComponent as c2, RibbonDrawSectionComponent as c3, RibbonDrawingGroupComponent as c4, RibbonEditingSectionComponent as c5, RibbonFileSectionComponent as c6, RibbonFontControlsComponent as c7, RibbonHomeSectionComponent as c8, RibbonHyperlinkButtonComponent as c9, SettingsAppearanceTabComponent as cA, SettingsDialogComponent as cB, SettingsLanguageTabComponent as cC, ShareDialogComponent as cD, ShortcutPanelComponent as cE, ShowOptionsFieldsetComponent as cF, ShowSlidesFieldsetComponent as cG, SignatureStrippedDialogComponent as cH, SignaturesPanelComponent as cI, SignaturesService as cJ, SlideBackgroundCardComponent as cK, SlideCanvasComponent as cL, SlideDefaultInspectorComponent as cM, SlideDiffChangesComponent as cN, SlideDiffRowComponent as cO, SlideDiffThumbnailsComponent as cP, SlideSizeCardComponent as cQ, SlideSorterOverlayComponent as cR, SlideThemeOverridePanelComponent as cS, SlideTransitionCardComponent as cT, SlidesPanelComponent as cU, SmartArt3DRendererComponent as cV, SmartArt3DService as cW, SmartArtPreviewComponent as cX, SmartArtPropertiesComponent as cY, SmartArtRendererComponent as cZ, StatusBarComponent as c_, RibbonInsertFieldsComponent as ca, RibbonInsertSectionComponent as cb, RibbonMotionPathGalleryComponent as cc, RibbonParagraphControlsComponent as cd, RibbonPrimaryRowComponent as ce, RibbonReviewSectionComponent as cf, RibbonShapeExtrasComponent as cg, RibbonSlideshowSectionComponent as ch, RibbonTransitionsSectionComponent as ci, RibbonViewSectionComponent as cj, RulerGuidesService as ck, SEQUENCE_OPTIONS as cl, SEVERITY_GROUPS as cm, SEVERITY_LABELS as cn, SHORTCUT_REFERENCE_ITEMS as co, SLIDE_TRANSITION_KEYFRAMES as cp, DEFAULT_PALETTE as cq, PALETTES$1 as cr, SMART_ART_COLOR_SCHEMES as cs, SMART_ART_STYLE_OPTIONS as ct, SUB_ITEM_LABEL as cu, SVG_WARP_PRESETS as cv, SWIPE_MAX_VERTICAL_PX as cw, SWIPE_THRESHOLD_PX as cx, SelectionPaneComponent as cy, SetUpSlideShowDialogComponent as cz, AUDIENCE_NONCE_KEY as d, alignPatch as d$, TEXT_3D_BOTTOM_BEVEL_KEYS as d0, TEXT_3D_TOP_BEVEL_KEYS as d1, TEXT_DIRECTION_OPTIONS$1 as d2, THEME_CATALOG as d3, TIMING_CURVE_OPTIONS as d4, TRIGGER_OPTIONS as d5, TYPE_LABELS as d6, TableCellAdvancedFillComponent as d7, TableCellFormattingComponent as d8, TableDataEditorComponent as d9, ViewerExportService as dA, ViewerExtraDialogsComponent as dB, ViewerFileIOService as dC, ViewerFindReplaceService as dD, ViewerFormatPainterService as dE, ViewerInspectorPanelService as dF, ViewerKeyboardService as dG, ViewerMobileSheetService as dH, ViewerPresentationModeService as dI, ViewerThemeGalleryService as dJ, ViewerTouchGesturesService as dK, ViewerZoomService as dL, WEBM_MIME_CANDIDATES as dM, WriteBackScheduler as dN, ZERO_LINE_COLOR as dO, ZoomNavigationService as dP, ZoomRendererComponent as dQ, ZoomTargetService as dR, addCategory as dS, addCommentToList as dT, addGradientStopPatch as dU, addItem as dV, addSeries as dW, addSubItem as dX, advanceStep as dY, affordanceElements as dZ, aiToggleVisible as d_, TablePropertiesComponent as da, TableRendererComponent as db, TableResizeOverlayComponent as dc, TableSelectionService as dd, TagsCardComponent as de, Text3DBevelSectionComponent as df, Text3DPanelComponent as dg, TextAdvancedPanelComponent as dh, ThemeEditorFieldsComponent as di, ThemeGalleryComponent as dj, ThemeSelectorCardComponent as dk, TitleBarComponent as dl, TitleBarSearchComponent as dm, TransitionDirectionPickerComponent as dn, TransitionPreviewComponent as dp, VALIGN_OPTIONS as dq, VIEWER_THEME as dr, VersionHistoryPanelComponent as ds, ViewerCanvasEditingService as dt, ViewerCollabCursorService as du, ViewerCollaborationSessionService as dv, ViewerCompareService as dw, ViewerCustomShowsService as dx, ViewerDialogsService as dy, ViewerDocumentPropertiesService as dz, AVATAR_COLOR_SWATCHES as e, buildSmartArtNodes as e$, animationFor as e0, animationPresetLabelKey as e1, annotationMapToInkInserts as e2, applyAcceptedDiff as e3, applyAnimationPreset as e4, applyFindReplacements as e5, applyFormatToElement as e6, applyMove as e7, applyResize as e8, asMediaElement as e9, buildDuotoneFilterId as eA, buildEmbeddedFontStyles as eB, buildEquationElement as eC, buildEquationSegment as eD, buildFallbackViewModel as eE, buildFontFaceRule as eF, buildGradientFillCss as eG, buildGridlinesAndLabels as eH, buildHyperlinkPatch as eI, buildInkContainerStyle as eJ, buildInkStrokes as eK, buildLegend as eL, buildLiveInkStrokeView as eM, buildMarkTooltip as eN, buildModel3DContainerStyle as eO, buildModel3DViewModel as eP, buildOleActionModel as eQ, buildOleInfoRows as eR, buildPatternFillCss as eS, buildPieViewModel as eT, buildPrintHtmlDocument as eU, buildPropertiesPatch as eV, buildRadarViewModel as eW, buildRegionMapViewModel as eX, buildSaveSlides as eY, buildShareUrl as eZ, buildSmartArtInsertElement as e_, assignUserColor as ea, attachShowVisibilityPause as eb, attachTouchGestures as ec, axisTickValues as ed, beginDrawingNodeEdit as ee, beginNodeEdit as ef, bevelSizePatch as eg, boolFromEvent as eh, bringForward as ei, bringToFront as ej, buildBarActions as ek, buildBroadcastConfig as el, buildBroadcastViewerUrl as em, buildCategoryLabels as en, buildCellParagraphs as eo, buildChartViewModel as ep, buildChatLogExport as eq, buildChatLogMarkdown as er, buildChromeStyle as es, buildClearHyperlinkPatch as et, buildClickGroups as eu, buildColStyles as ev, buildCollaborationConfig as ew, buildComboViewModel as ex, buildCssGradientFromShapeStyle as ey, buildDuotoneFilter as ez, AXIS_LABEL_COLOR as f, computePieSlices as f$, buildStockViewModel as f0, buildSurfaceViewModel as f1, buildTableViewModel as f2, buildTreemapViewModel as f3, buildTrimFragment as f4, buildWaterfallViewModel as f5, buildZeroLine as f6, buildZoomContainerStyle as f7, buildZoomViewModel as f8, bulletIndentPx as f9, cn as fA, collectAccessibilityIssues as fB, collectElementText as fC, collectSlideText as fD, collectStoredChats as fE, collectUsedFontFamilies as fF, columnWidthStyle as fG, commitNodeText as fH, computeAlign as fI, computeAxisTitlePrimitives as fJ, computeBarRects as fK, computeBubbleRadius as fL, computeCornerHandle as fM, computeDistribute as fN, computeDrawingViewBox as fO, computeErrorBarPrimitives as fP, computeFocusTargets as fQ, computeGridSpacingPx as fR, computeHandleBoxes as fS, computeHandoutLayout as fT, computeIsMobile as fU, computeIsTablet as fV, computeLinePoints as fW, computeLinearRegression as fX, computePageCount as fY, computePieLayout as fZ, computePieSlicePath as f_, canAddTopLevelNode as fa, canEditSmartArtNodes as fb, canGroupSelection as fc, canRemoveTopLevelNode as fd, canSetStrokeWidth as fe, canStartBroadcast as ff, canStartShare as fg, canUngroupSelection as fh, canUseClipboard as fi, captionDisplayText as fj, cellRunStyle as fk, cellStyleToStyleMap as fl, cellTdStyle as fm, changeCountLabel as fn, changeIcon as fo, characterSpacingPatch as fp, chartPreserveAspectRatio as fq, checkFontAvailable as fr, clampCursorPosition as fs, clampGifDimensions as ft, clampIndex as fu, clampNotesFontSize as fv, clampScale as fw, clampStep as fx, clearAllLocalViewerData as fy, clearAudienceContent as fz, AccessibilityPanelComponent as g, fitZoom as g$, computePlotLayout as g0, computeRSquared as g1, computeRadarPoints as g2, computeResizeHandleBoxes as g3, computeRotateHandleBox as g4, computeScatterDots as g5, computeScatterXDomain as g6, computeSelectionBoxes as g7, computeSingleSelected as g8, computeSlideIndices as g9, describeSmartArtBounds as gA, disableGlowPatch as gB, disableInnerShadowPatch as gC, disableOuterShadowPatch as gD, disableReflectionPatch as gE, disableSoftEdgePatch as gF, duplicateElementById as gG, durationOf as gH, effectsStateOf as gI, enableGlowPatch as gJ, enableInnerShadowPatch as gK, enableOuterShadowPatch as gL, enableReflectionPatch as gM, enableSoftEdgePatch as gN, encodeGif as gO, endShowMediaCleanup as gP, estimatePageCount as gQ, exitPresentationFullscreen as gR, exportAiChatLogs as gS, extractPathPoints as gT, eyedropperAvailable as gU, fillColorOf$1 as gV, findInSlides as gW, findOwningSlideIndex as gX, findSlideIndexByElementId as gY, firstVisibleIndex as gZ, fitPolynomial as g_, computeSnap as ga, computeStackedBarRects as gb, computeStackedValueRange as gc, computeTrendlinePrimitives as gd, computeValueRange as ge, convertOmmlToMathMl as gf, copyFormatFromElement as gg, countAccessibilityIssues as gh, countAnnotationStrokes as gi, createAngularAiBridge as gj, createCustomShow as gk, createSwipeDismissDrag as gl, createWebrtcBundle as gm, createWebsocketBundle as gn, cssObjectToStyleMap as go, currentColorScheme as gp, currentLayout as gq, currentStyle as gr, defaultCssVars as gs, defaultRadius as gt, defaultThemeColors as gu, deleteElementsByIds as gv, deleteVersion as gw, demoteNode as gx, deriveModel3DBlobUrl as gy, derivePresenceList as gz, AccessibilityService as h, insertTableElementColumn as h$, focusTargetChips as h0, fontMimeForFormat as h1, fontSizeOf as h2, forgetSessionDeck as h3, formatAxisValue as h4, formatBytes as h5, formatCursorLabel as h6, formatElapsed as h7, formatFileSize as h8, formatPropertyDate as h9, getSessionTabId as hA, getShapeFillStrokeStyle as hB, getSlideBackgroundStyle as hC, getSlideTransitionAnimations as hD, getSmartArtNodeBounds as hE, getSpeechRecognitionCtor as hF, getTextBlockStyle as hG, getTextWarp as hH, getTouchDistance as hI, getWarpCategory as hJ, getWarpPath as hK, gradientStateFromStyle as hL, gradientStateOf as hM, gradientStatePatch as hN, gradientStopColorCommitPatch as hO, gridColumns as hP, groupIssuesBySeverity as hQ, hasAnimation as hR, hasCopyableFormat as hS, hasExistingLink as hT, hasExitedFullscreen as hU, hasGradientFill as hV, hasPressureVariation as hW, hasVisibleSlideAfter as hX, headerLabel as hY, imageDimensions as hZ, inkViewBox as h_, formatTime as ha, fpsToFrameIntervalMs as hb, generateBroadcastRoomId as hc, generateCommentId as hd, generateCustomShowId as he, generatePressureCircles as hf, generateTicks as hg, getClrChangeParams as hh, getContainerStyle as hi, getDuotoneFilterDef as hj, getEffectSoundAsset as hk, getEffectSoundState as hl, getImageSrc as hm, getLocalStorageUsageSummary as hn, getOleAriaLabel as ho, getOleBadgeLabel as hp, getOleDisplayName as hq, getOleDownloadFileName as hr, getOleTypeColor as hs, getOleTypeLabel as ht, getPasswordStrength as hu, getPatternSvg as hv, getPlaceholderStyle as hw, getVersions as hx, getResolvedShapeClipPath as hy, getResolvedShapeClipPathFor as hz, AccessibilityTextPanelComponent as i, normalizeFontFormat as i$, insertTableElementRow as i0, interpolateWidth as i1, isAudienceTab as i2, isBold as i3, isBrowserOpenableMime as i4, isChildNode as i5, isElementInteractive as i6, isInjectableUrl as i7, isItalic as i8, isLegacyBinaryPresentation as i9, mergeCaptionResults as iA, mergeDown as iB, mergeRight as iC, mergeSelection as iD, mergeTablesDirective as iE, moveElementBy as iF, moveNodeDown as iG, moveNodeUp as iH, msToFrameDelayCs as iI, narrowToCircle as iJ, narrowToPolygon as iK, narrowToRect as iL, newChartElement as iM, newEquationElement as iN, newPresetShapeElement as iO, newShapeElement as iP, newSmartArtElement as iQ, newTableElement as iR, newTextElement as iS, nextVisibleIndex as iT, nodeBold as iU, nodeEditBox as iV, nodeFillColor as iW, nodeFontColor as iX, nodeIdFromKey as iY, nodeItalic as iZ, nodeStyle as i_, isPpactionUrl as ia, isPresenterMessage as ib, isSigned as ic, isSupportedPresentationFile as id, isTextElement as ie, isTwoTableFocus as ig, isUnderline as ih, isUrlSafe as ii, isValidRoomId as ij, isViewportBackgroundPressTarget as ik, isZoomActivationKey as il, issueTrackKey as im, issueTypeLabel as io, keyToLabel as ip, lastVisibleIndex as iq, latexToMathml as ir, layoutConnectorPaints as is, layoutNodeLabels as it, linePointsToSvgString as iu, lineSpacingPatch as iv, loadAudienceContent as iw, loadSessionDeck as ix, mediaFallbackFor as iy, mediaSurfaceFor as iz, AccountPageComponent as j, resolveOleType as j$, normalizeSlidesPerPage as j0, normalizeValue as j1, numFromEvent as j2, ommlToMathml as j3, ooxmlDashToCssBorderStyle as j4, openNativeEyeDropper as j5, overallStatus as j6, paletteColor as j7, parseAudienceNonce as j8, parseNodeTextarea as j9, radarRingPoints as jA, readAsDataUrl as jB, recordWebm as jC, registerCrossSlideAudio as jD, rememberSessionDeck as jE, removeAnimation as jF, removeCategory as jG, removeTableElementColumn as jH, removeCommentFromList as jI, removeElementAnimation as jJ, removeGradientStopPatch as jK, removeNode as jL, removeTableElementRow as jM, removeSeries as jN, renderToCanvas as jO, reorderAnimationDown as jP, reorderAnimationUp as jQ, replaceInSlides as jR, replaceMatch as jS, requestPresentationFullscreen as jT, resizeElement as jU, resolveCaptionTracks as jV, resolveChartKind as jW, resolveFontVariant as jX, resolveHyperlinkHref as jY, resolveInteractiveElementId as jZ, resolveMediaSrc as j_, partitionSlides as ja, patchChartData as jb, patchChartStyle as jc, patchTableData as jd, patchTextStyle as je, patternPresetOptions as jf, pendingElementStyles as jg, pickColorByClickFallback as jh, pickFile as ji, pickSupportedMimeType as jj, planGifFrames as jk, planVideoSegments as jl, pointFromPointerEvent as jm, pointsToSvgPathD as jn, presenceToCursors as jo, presentationBaseName as jp, presentationStageStyle as jq, presenterTimerProgress as jr, presetByLayout as js, presetsForCategory as jt, pressuresToWidths as ju, prevVisibleIndex as jv, projectDrawingShapes as jw, promoteNode as jx, provideViewerTheme as jy, radarAngle as jz, ActionSettingsPanelComponent as k, setRepeatMode as k$, resolveParagraphBullet as k0, resolvePresenterNotes as k1, resolveProfileInitial as k2, resolveRegionCode as k3, resolveRibbonCanGroup as k4, resolveSlideAutoAdvanceMs as k5, resolvePalette as k6, resolveThemeCatalogEntry as k7, resolveTransitionDuration as k8, restoreSessionDeck as k9, setAfterAnimationColor as kA, setAnimationEmphasis as kB, setAnimationEntrance as kC, setAnimationExit as kD, setAxis as kE, setAxisLogScale as kF, setAxisTitleStyle as kG, setCategoryLabel as kH, setCellText as kI, setColorScheme as kJ, setDataLabels as kK, setDataPointExplosion as kL, setDataPointFill as kM, setDataPointLabel as kN, setDataPointMarker as kO, setDelay as kP, setDirection as kQ, setDuration as kR, setEffectSound as kS, setEffectStockSound as kT, setElementPosition as kU, setGridlineStyle as kV, setLayout as kW, setLegend as kX, setNodeStyle as kY, setNodeText as kZ, setRepeatCount as k_, revealedElementStyles as ka, routeOrthogonalConnector as kb, rowStyle as kc, rulerDragToGuidePosition as kd, rulerHighlight as ke, rulerStripTicks as kf, sampleColorFromSlide as kg, sanitizeColor as kh, sanitizeSlideIndex as ki, sanitizeUserName as kj, saveViewerProfile as kk, savedPresentationFileName as kl, scanAvailableFonts as km, searchSlides as kn, seedBroadcastFields as ko, seedHyperlinkDraft as kp, seedPropertiesDraft as kq, seedShareFields as kr, segmentFrameCount as ks, selectValue$3 as kt, sendBackward as ku, sendToBack as kv, sequentialColorScale as kw, serializeWriteBack as kx, seriesColor as ky, setAfterAnimation as kz, AdvancedChartEditorComponent as l, updateOuterShadowPatch as l$, setSequence as l0, setSeriesChartType as l1, setSeriesColor as l2, setSeriesErrorBars as l3, setSeriesMarker as l4, setSeriesName as l5, setSeriesTrendline as l6, setSeriesValue as l7, setStyle as l8, setTimingCurve as l9, strokeToInkElement as lA, strokeWidthOf as lB, styleShadowFilter as lC, surfaceColor as lD, textAdvancedPatch as lE, textAdvancedStateFromStyle as lF, textAdvancedStateOf as lG, textColorOf as lH, textDirectionPatch as lI, textFontSizePatch as lJ, textStyleOf as lK, textStylePatch as lL, themeStyle as lM, themeToCssVars as lN, thumbnailHeight as lO, thumbnailZoom as lP, toggleCommentResolvedInList as lQ, toggleNodeBold as lR, toggleNodeItalic as lS, toggleSheet as lT, topLevelNodeCount as lU, transformSelectedTextCase as lV, translationsEn as lW, updateElementById as lX, updateGlowPatch as lY, updateGradientStopPatch as lZ, updateInnerShadowPatch as l_, setTitle as la, setTrigger as lb, setTriggerShapeId as lc, shapeStylePatch$1 as ld, sheetAfterNavigate as le, shouldBlockClickAdvance as lf, shouldUseSvgWarp as lg, showDirectionPicker as lh, showsTemplateAffordance as li, signatureCountLabel as lj, signatureKey as lk, signatureTimestamp as ll, signerName as lm, statusLabel as ln, slideNumberOf as lo, slidesWithReappliedLayout as lp, smartArtNodes as lq, paletteColour as lr, snapToGridStep as ls, splitCursorCell as lt, splitMergedCell as lu, statusKind as lv, statusLabel$1 as lw, storeAudienceContent as lx, stringFromEvent$5 as ly, strokeColorOf as lz, AiChangeOverlayComponent as m, updateReflectionPatch as m0, vAlignPatch as m1, validatePassword as m2, validatePrintSettings as m3, validateRoomId as m4, valueToY as m5, vermilionDarkColors as m6, vermilionDarkTheme as m7, vermilionLightColors as m8, vermilionLightTheme as m9, vermilionRadius as ma, waypointsToPathD as mb, withManualLayouts as mc, worstStatus as md, zoomTargetSlideIndex as me, AiChatPanelComponent as n, AiChatService as o, AiComposerComponent as p, AiFocusBarComponent as q, AiFocusHighlightOverlayComponent as r, AiHistoryMenuComponent as s, toChatSummary as t, AiHistoryService as u, AiMessageListComponent as v, AiPanelStore as w, AiProposalCardComponent as x, AiSettingsSectionComponent as y, AiToolCallCardComponent as z };
|
|
182023
|
-
//# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-
|
|
182561
|
+
//# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-CY2-kaW3.mjs.map
|