pptx-angular-viewer 2.11.1 → 2.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -0
- package/fesm2022/{pptx-angular-viewer-chat-history-idb-DOGPkU6F.mjs → pptx-angular-viewer-chat-history-idb-DdlrIrmU.mjs} +2 -2
- package/fesm2022/{pptx-angular-viewer-chat-history-idb-DOGPkU6F.mjs.map → pptx-angular-viewer-chat-history-idb-DdlrIrmU.mjs.map} +1 -1
- package/fesm2022/{pptx-angular-viewer-pptx-angular-viewer-BLXPLe5x.mjs → pptx-angular-viewer-pptx-angular-viewer-y5x5Ro5v.mjs} +1918 -182
- package/fesm2022/{pptx-angular-viewer-pptx-angular-viewer-BLXPLe5x.mjs.map → pptx-angular-viewer-pptx-angular-viewer-y5x5Ro5v.mjs.map} +1 -1
- package/fesm2022/pptx-angular-viewer.mjs +1 -1
- package/package.json +2 -2
- package/pptx-angular-viewer.css +1 -1
- package/types/pptx-angular-viewer.d.ts +277 -15
|
@@ -2,12 +2,12 @@ import { NgStyle, NgTemplateOutlet, NgClass } from '@angular/common';
|
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { InjectionToken, input, output, computed, ChangeDetectionStrategy, Component, signal, Injectable, inject, DestroyRef, Injector, effect, viewChild, ElementRef, HostListener, afterNextRender, Renderer2, ViewEncapsulation, forwardRef, untracked } from '@angular/core';
|
|
4
4
|
import { TranslatePipe, TranslateService, translate } from '@ngx-translate/core';
|
|
5
|
-
import { THEME_PRESETS, guideEmuToPx, getShapeClipPath, getAdjustmentAwareClipPath, getShapeClipPathFromPreset, getCloudPathForRendering, ooxmlGradientAngleToCssDegrees, hasShapeProperties, applyDrawingColorTransforms as applyDrawingColorTransforms$1, hslToRgb as hslToRgb$1, PRESET_COLOR_MAP, isImageLikeElement, hasTextProperties, stripXmlOrderSuffix, orderedXmlKey, chartDataAddSeries, chartDataRemoveSeries, chartDataAddCategory, chartDataRemoveCategory, chartDataUpdatePoint, rebuildTableStructureInRawXml, updateCellTextInRawXml, MIN_ELEMENT_SIZE as MIN_ELEMENT_SIZE$2, getLinkedTextBoxSegments, deriveSlideTitle, getSubstituteFontFamily, svgPathToPolygons, THEME_COLOR_SCHEME_KEYS, createBuiltinVariables, resolveCoordinate, PptxHandler, deobfuscateFont, detectFontFormat, checkMissingAltText, checkMissingSlideTitle, checkLowContrast, checkComplexTables, checkBlankSlide, checkDuplicateTitles, createChartElement, PptxMarkdownConverter, ThemePresets, formatCommentTimestamp as formatCommentTimestamp$1, EncryptedFileError, parseSignatureXml, cloneSlide as cloneSlide$1, cloneTemplateElementsBySlideId as cloneTemplateElementsBySlideId$1, cloneElement as cloneElement$1, updateSmartArtNodeText, setSmartArtNodeStyle, isInkElement, parseDataUrlToBytes, isZoomElement, SvgExporter, applyThemeToData, pptxActionToElementAction, elementActionToPptxAction, setChartTitle, setChartLegend, setChartDataLabels, setChartAxis, setChartSeriesTrendline, setChartSeriesErrorBars, setChartDataPointLabel, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointMarker, setChartDataPointExplosion, chartDataChangeType, getOleObjectTypeLabel, addSmartArtNodeAsChild, removeSmartArtNode, promoteSmartArtNode, demoteSmartArtNode, reorderSmartArtNode, switchSmartArtLayout, SWITCHABLE_LAYOUT_TYPES, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, applyThemeOverrideToSlide, TRANSITION_VALID_DIRECTIONS
|
|
5
|
+
import { THEME_PRESETS, guideEmuToPx, getShapeClipPath, getAdjustmentAwareClipPath, getShapeClipPathFromPreset, getCloudPathForRendering, ooxmlGradientAngleToCssDegrees, hasShapeProperties, applyDrawingColorTransforms as applyDrawingColorTransforms$1, hslToRgb as hslToRgb$1, PRESET_COLOR_MAP, isImageLikeElement, hasTextProperties, stripXmlOrderSuffix, orderedXmlKey, chartDataAddSeries, chartDataRemoveSeries, chartDataAddCategory, chartDataRemoveCategory, chartDataUpdatePoint, rebuildTableStructureInRawXml, updateCellTextInRawXml, MIN_ELEMENT_SIZE as MIN_ELEMENT_SIZE$2, getLinkedTextBoxSegments, deriveSlideTitle, getSubstituteFontFamily, svgPathToPolygons, THEME_COLOR_SCHEME_KEYS, createBuiltinVariables, resolveCoordinate, PptxHandler, deobfuscateFont, detectFontFormat, checkMissingAltText, checkMissingSlideTitle, checkLowContrast, checkComplexTables, checkBlankSlide, checkDuplicateTitles, createChartElement, PptxMarkdownConverter, ThemePresets, formatCommentTimestamp as formatCommentTimestamp$1, EncryptedFileError, parseSignatureXml, cloneSlide as cloneSlide$1, cloneTemplateElementsBySlideId as cloneTemplateElementsBySlideId$1, cloneElement as cloneElement$1, updateSmartArtNodeText, setSmartArtNodeStyle, isInkElement, parseDataUrlToBytes, isZoomElement, SvgExporter, applyThemeToData, pptxActionToElementAction, elementActionToPptxAction, setChartTitle, setChartLegend, setChartDataLabels, setChartAxis, setChartSeriesTrendline, setChartSeriesErrorBars, setChartDataPointLabel, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointMarker, setChartDataPointExplosion, chartDataChangeType, getOleObjectTypeLabel, addSmartArtNodeAsChild, removeSmartArtNode, promoteSmartArtNode, demoteSmartArtNode, reorderSmartArtNode, switchSmartArtLayout, SWITCHABLE_LAYOUT_TYPES, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, applyThemeOverrideToSlide, TRANSITION_VALID_DIRECTIONS } from 'pptx-viewer-core';
|
|
6
6
|
import DOMPurify from 'dompurify';
|
|
7
7
|
import { z } from 'zod';
|
|
8
8
|
import * as mcp from 'pptx-viewer-mcp';
|
|
9
9
|
import * as mcpSchemas from 'pptx-viewer-mcp/schemas';
|
|
10
|
-
import { LucideX, LucideSquare, LucideCircle, LucideSlash, LucideCopy, LucideTrash2, LucideChevronsUp, LucideChevronsDown, LucideArrowUp, LucideArrowDown, LucideGroup, LucideUngroup, LucideTextAlignStart, LucideTextAlignCenter, LucideTextAlignEnd, LucideChevronUp, LucideChevronDown, LucideAlignHorizontalSpaceAround, LucideAlignVerticalSpaceAround, LucideLayers, LucideMessageSquare, LucidePlus, LucideSettings2, LucideStickyNote, LucideDownload, LucideMenu, LucidePresentation, LucideRedo, LucideShare2, LucideSparkles, LucideUndo, LucideChevronRight,
|
|
10
|
+
import { LucideX, LucideSquare, LucideCircle, LucideSlash, LucideCopy, LucideTrash2, LucideChevronsUp, LucideChevronsDown, LucideArrowUp, LucideArrowDown, LucideGroup, LucideUngroup, LucideTextAlignStart, LucideTextAlignCenter, LucideTextAlignEnd, LucideChevronUp, LucideChevronDown, LucideAlignHorizontalSpaceAround, LucideAlignVerticalSpaceAround, LucideLayers, LucideMessageSquare, LucidePlus, LucideSettings2, LucideStickyNote, LucideDownload, LucideMenu, LucidePresentation, LucideRedo, LucideShare2, LucideSparkles, LucideUndo, LucideChevronRight, LucideChevronLeft, LucideEraser, LucideHighlighter, LucideMousePointer2, LucidePanelRight, LucidePenTool, LucideTimer, LucideStar, LucideMoveRight, LucidePlay, LucideMousePointerClick, LucidePaintbrush, LucideClock3, LucidePencil, LucideType, LucideMinus, LucideSpline, LucideArrowLeft, LucideFilePlus2, LucideFolderOpen, LucideHome, LucideInfo, LucidePrinter, LucideSave, LucideSettings, LucideUpload, LucideUserRound, LucideAArrowUp, LucideAArrowDown, LucideRemoveFormatting, LucideList, LucideListOrdered, LucideListIndentDecrease, LucideListIndentIncrease, LucideTextAlignJustify, LucideClipboardPaste, LucideFolderPlus, LucideLayoutGrid, LucideRotateCcw, LucideScissors, LucideLink, LucideImage, LucideVideo, LucideDatabase, LucidePanelLeft, LucideEllipsis, LucideEye, LucideEyeOff, LucideMonitor, LucideColumns2, LucideCheck, LucideFileDown, LucideSearch, LucideZoomIn, LucideZoomOut, LucideBug, LucideSend, LucideCrosshair, LucideGitMerge, LucidePin, LucidePinOff, LucideWrench, LucideLoaderCircle, LucideTriangleAlert, LucideShapes, LucidePalette, LucideTable, LucideLayoutTemplate, LucideChartColumn, LucideMove, LucideNavigation, LucideFilm, LucideBot, LucideUser } from '@lucide/angular';
|
|
11
11
|
import { XMLParser } from 'fast-xml-parser';
|
|
12
12
|
import JSZip from 'jszip';
|
|
13
13
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
@@ -15226,6 +15226,155 @@ function reindexOrder(anims) {
|
|
|
15226
15226
|
return anims.map((a, i) => ({ ...a, order: i }));
|
|
15227
15227
|
}
|
|
15228
15228
|
|
|
15229
|
+
/**
|
|
15230
|
+
* `animation-preset-labels`: the naming layer over the two animation preset
|
|
15231
|
+
* vocabularies, so no binding ever prints a wire token where an effect name
|
|
15232
|
+
* belongs.
|
|
15233
|
+
*
|
|
15234
|
+
* WHY this module exists: an animation's effect is identified by one of two
|
|
15235
|
+
* different vocabularies, and both of them were reaching the screen verbatim.
|
|
15236
|
+
*
|
|
15237
|
+
* - The **editor vocabulary** (`PptxAnimationPreset`: `fadeIn`, `growTurnIn`,
|
|
15238
|
+
* `boldFlash`, ...) is what `PptxElementAnimation.entrance / emphasis / exit`
|
|
15239
|
+
* actually holds. It is what the ribbon galleries apply and what the parser
|
|
15240
|
+
* normalises a loaded deck's OOXML presets down to. Every timeline in every
|
|
15241
|
+
* binding printed this token raw, so users saw `fadeIn` where "Fade In"
|
|
15242
|
+
* belongs.
|
|
15243
|
+
* - The **OOXML catalogue vocabulary** (`entr.1`, `emph.26`, `path.loop.pretzel`
|
|
15244
|
+
* from `pptx-viewer-core`'s `animation-preset-catalog`) is the full 266-entry
|
|
15245
|
+
* PowerPoint preset library. Its entries carry a hard-coded ENGLISH `label`,
|
|
15246
|
+
* which the Vue "Add animation > Effect" picker rendered directly, so that
|
|
15247
|
+
* control stayed English in every locale.
|
|
15248
|
+
*
|
|
15249
|
+
* Both vocabularies now resolve through i18n keys defined here, which means a
|
|
15250
|
+
* missing name is a dictionary gap that `packages/locales`' coverage tests
|
|
15251
|
+
* catch, not a plausible-looking wrong label produced by `keyToLabel`.
|
|
15252
|
+
*
|
|
15253
|
+
* WHY the catalogue key is a slug and not the preset id: the dictionaries are
|
|
15254
|
+
* flat maps whose keys are dotted paths, and a catalogue id already contains
|
|
15255
|
+
* dots (`path.line.up`). Folding them into one camelCase segment
|
|
15256
|
+
* (`pathLineUp`) keeps every animation key at the same depth as the rest of the
|
|
15257
|
+
* dictionary, so no translation framework has to be trusted to resolve a
|
|
15258
|
+
* five-segment key against a flat map.
|
|
15259
|
+
*
|
|
15260
|
+
* Pure data + pure functions: no framework, no DOM.
|
|
15261
|
+
*
|
|
15262
|
+
* @module render/animation-preset-labels
|
|
15263
|
+
*/
|
|
15264
|
+
/**
|
|
15265
|
+
* Every `PptxAnimationPreset` value except `'none'`, i.e. every effect token
|
|
15266
|
+
* that can end up on a `PptxElementAnimation` and therefore in a timeline row.
|
|
15267
|
+
*
|
|
15268
|
+
* Kept as a runtime array (the type is a bare union) so the dictionary coverage
|
|
15269
|
+
* test can enumerate what the UI can reach instead of trusting a hand-kept list
|
|
15270
|
+
* of "the ones we bothered to name".
|
|
15271
|
+
*/
|
|
15272
|
+
const ANIMATION_PRESET_VALUES = [
|
|
15273
|
+
// Entrance
|
|
15274
|
+
'appear',
|
|
15275
|
+
'fadeIn',
|
|
15276
|
+
'flyIn',
|
|
15277
|
+
'zoomIn',
|
|
15278
|
+
'bounceIn',
|
|
15279
|
+
'wipeIn',
|
|
15280
|
+
'splitIn',
|
|
15281
|
+
'dissolveIn',
|
|
15282
|
+
'wheelIn',
|
|
15283
|
+
'blindsIn',
|
|
15284
|
+
'boxIn',
|
|
15285
|
+
'floatIn',
|
|
15286
|
+
'riseUp',
|
|
15287
|
+
'swivel',
|
|
15288
|
+
'expandIn',
|
|
15289
|
+
'checkerboardIn',
|
|
15290
|
+
'flashIn',
|
|
15291
|
+
'peekIn',
|
|
15292
|
+
'randomBarsIn',
|
|
15293
|
+
'spinnerIn',
|
|
15294
|
+
'growTurnIn',
|
|
15295
|
+
// Exit
|
|
15296
|
+
'fadeOut',
|
|
15297
|
+
'flyOut',
|
|
15298
|
+
'zoomOut',
|
|
15299
|
+
'bounceOut',
|
|
15300
|
+
'wipeOut',
|
|
15301
|
+
'shrinkOut',
|
|
15302
|
+
'dissolveOut',
|
|
15303
|
+
'disappear',
|
|
15304
|
+
// Emphasis
|
|
15305
|
+
'spin',
|
|
15306
|
+
'pulse',
|
|
15307
|
+
'colorWave',
|
|
15308
|
+
'bounce',
|
|
15309
|
+
'flash',
|
|
15310
|
+
'growShrink',
|
|
15311
|
+
'teeter',
|
|
15312
|
+
'transparency',
|
|
15313
|
+
'boldFlash',
|
|
15314
|
+
'wave',
|
|
15315
|
+
];
|
|
15316
|
+
/**
|
|
15317
|
+
* The i18n key naming an editor preset token, shared by every binding's ribbon
|
|
15318
|
+
* gallery, inspector select and timeline row.
|
|
15319
|
+
*/
|
|
15320
|
+
function animationPresetLabelKey(preset) {
|
|
15321
|
+
return `pptx.animation.preset.${preset}`;
|
|
15322
|
+
}
|
|
15323
|
+
/**
|
|
15324
|
+
* Fold a catalogue preset id into one dictionary-key segment:
|
|
15325
|
+
* `entr.1` -> `entr1`, `path.line.upLeft` -> `pathLineUpLeft`.
|
|
15326
|
+
*
|
|
15327
|
+
* Deterministic and collision-free across the whole catalogue, so the key can
|
|
15328
|
+
* be derived at the call site instead of stored per preset.
|
|
15329
|
+
*/
|
|
15330
|
+
function animationCatalogPresetSlug(presetId) {
|
|
15331
|
+
return presetId
|
|
15332
|
+
.split('.')
|
|
15333
|
+
.map((part, index) => (index === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1)))
|
|
15334
|
+
.join('');
|
|
15335
|
+
}
|
|
15336
|
+
/** The i18n key naming an OOXML catalogue preset (`entr.1`, `path.line.up`, ...). */
|
|
15337
|
+
function animationCatalogPresetLabelKey(presetId) {
|
|
15338
|
+
return `pptx.animation.catalogPreset.${animationCatalogPresetSlug(presetId)}`;
|
|
15339
|
+
}
|
|
15340
|
+
/**
|
|
15341
|
+
* `true` when `token` is a catalogue id (`entr.1`) rather than an editor preset
|
|
15342
|
+
* (`fadeIn`). The two vocabularies are told apart by the dot, which no
|
|
15343
|
+
* `PptxAnimationPreset` value contains.
|
|
15344
|
+
*/
|
|
15345
|
+
function isAnimationCatalogPresetId(token) {
|
|
15346
|
+
return token.includes('.');
|
|
15347
|
+
}
|
|
15348
|
+
/**
|
|
15349
|
+
* The i18n key naming whatever effect an animation carries, whichever
|
|
15350
|
+
* vocabulary its token came from. An entry with no preset resolves to "Motion
|
|
15351
|
+
* Path" when it only carries a path, and to the generic "Animation" otherwise
|
|
15352
|
+
* (which is what the bindings used to spell as the literal word `custom`).
|
|
15353
|
+
*
|
|
15354
|
+
* Always a key, never `undefined`, because Angular renders these through the
|
|
15355
|
+
* `translate` pipe: resolving finished text in a component getter would freeze
|
|
15356
|
+
* an `OnPush` view's wording at whatever language was active when it last
|
|
15357
|
+
* rendered.
|
|
15358
|
+
*/
|
|
15359
|
+
function animationEffectLabelKey(anim) {
|
|
15360
|
+
const token = anim.entrance ?? anim.emphasis ?? anim.exit;
|
|
15361
|
+
if (!token || token === 'none') {
|
|
15362
|
+
return anim.motionPath ? 'pptx.animation.motionPath.label' : 'pptx.animation.animation';
|
|
15363
|
+
}
|
|
15364
|
+
return isAnimationCatalogPresetId(token)
|
|
15365
|
+
? animationCatalogPresetLabelKey(token)
|
|
15366
|
+
: animationPresetLabelKey(token);
|
|
15367
|
+
}
|
|
15368
|
+
/**
|
|
15369
|
+
* The display name for an animation's effect.
|
|
15370
|
+
*
|
|
15371
|
+
* This is the single resolver every binding's timeline and effect chip calls,
|
|
15372
|
+
* so all five spell the same animation the same way.
|
|
15373
|
+
*/
|
|
15374
|
+
function animationEffectLabel(anim, translate) {
|
|
15375
|
+
return translate(animationEffectLabelKey(anim));
|
|
15376
|
+
}
|
|
15377
|
+
|
|
15229
15378
|
/**
|
|
15230
15379
|
* `animation-playback` — pure click-stepped playback math for the editor's
|
|
15231
15380
|
* element-animation preset model.
|
|
@@ -23497,16 +23646,106 @@ function getContainerStyle$1(el, zIndex) {
|
|
|
23497
23646
|
}
|
|
23498
23647
|
return style;
|
|
23499
23648
|
}
|
|
23500
|
-
/**
|
|
23649
|
+
/**
|
|
23650
|
+
* Resolve a displayable image source for picture/image/media poster frames.
|
|
23651
|
+
*
|
|
23652
|
+
* The SVG variant is preferred over the raster one, which is not merely a
|
|
23653
|
+
* quality choice: `<a:blip>` can carry an `asvg:svgBlip` extension whose
|
|
23654
|
+
* `r:embed` is the ONLY relationship on the blip, so there is no raster
|
|
23655
|
+
* fallback at all. A resolver that looks solely at `imageData` renders those
|
|
23656
|
+
* pictures as an empty box, and real decks use exactly that shape for icon
|
|
23657
|
+
* artwork. PowerPoint paints the SVG when both are present, so preferring it
|
|
23658
|
+
* is also the higher-fidelity answer when a raster fallback does exist.
|
|
23659
|
+
*/
|
|
23501
23660
|
function getImageSrc$1(el, mediaDataUrls) {
|
|
23502
23661
|
if (el.type === 'picture' || el.type === 'image') {
|
|
23503
|
-
return el.
|
|
23662
|
+
return (el.svgData ??
|
|
23663
|
+
(el.svgPath ? mediaDataUrls.get(el.svgPath) : undefined) ??
|
|
23664
|
+
el.imageData ??
|
|
23665
|
+
(el.imagePath ? mediaDataUrls.get(el.imagePath) : undefined));
|
|
23504
23666
|
}
|
|
23505
23667
|
if (el.type === 'media') {
|
|
23506
23668
|
return (el.posterFrameData ?? (el.posterFramePath ? mediaDataUrls.get(el.posterFramePath) : undefined));
|
|
23507
23669
|
}
|
|
23508
23670
|
return undefined;
|
|
23509
23671
|
}
|
|
23672
|
+
/**
|
|
23673
|
+
* `overflow` for a picture's container box.
|
|
23674
|
+
*
|
|
23675
|
+
* Pictures clip, because {@link getImageFitStyle} renders a crop by
|
|
23676
|
+
* deliberately painting the cropped-away part outside the frame. The one
|
|
23677
|
+
* exception is a blur with `@grow`, whose halo is MEANT to bleed past the
|
|
23678
|
+
* element box (see `getComputedEffectStyle().overflowVisible`); clipping there
|
|
23679
|
+
* would trade one visible defect for another. Mirrors React's container rule.
|
|
23680
|
+
*/
|
|
23681
|
+
function getImageOverflow(el) {
|
|
23682
|
+
const shapeStyle = hasShapeProperties(el) ? el.shapeStyle : undefined;
|
|
23683
|
+
const blurHaloBleeds = Boolean(shapeStyle?.blurGrow) &&
|
|
23684
|
+
typeof shapeStyle?.blurRadius === 'number' &&
|
|
23685
|
+
shapeStyle.blurRadius > 0;
|
|
23686
|
+
return blurHaloBleeds ? 'visible' : 'hidden';
|
|
23687
|
+
}
|
|
23688
|
+
/**
|
|
23689
|
+
* How a picture's `<img>` should fill its frame, including the `<a:srcRect>`
|
|
23690
|
+
* source crop.
|
|
23691
|
+
*
|
|
23692
|
+
* CSS `object-fit` cannot express an OOXML source crop: `contain` and `cover`
|
|
23693
|
+
* pick a region of the FRAME, whereas `srcRect` picks a region of the SOURCE
|
|
23694
|
+
* bitmap which PowerPoint then stretches to fill the frame. The crop is
|
|
23695
|
+
* therefore rendered by scaling the image by the reciprocal of the surviving
|
|
23696
|
+
* region and translating the cropped-away part out of the (overflow-hidden)
|
|
23697
|
+
* frame. Skipping it does not merely mis-scale the picture, it shows the wrong
|
|
23698
|
+
* part of it: a deck that crops one wide composite image into several different
|
|
23699
|
+
* insets otherwise renders the same photo in every one of them.
|
|
23700
|
+
*
|
|
23701
|
+
* Callers must give the containing element `overflow: hidden`, since the
|
|
23702
|
+
* cropped branch deliberately paints outside the frame.
|
|
23703
|
+
*
|
|
23704
|
+
* @returns A neutral CSS map to spread onto the `<img>`; never `undefined`, so
|
|
23705
|
+
* the uncropped case still pins the shared `cover` fit that every
|
|
23706
|
+
* binding must agree on.
|
|
23707
|
+
*/
|
|
23708
|
+
function getImageFitStyle(el) {
|
|
23709
|
+
const uncropped = {
|
|
23710
|
+
width: '100%',
|
|
23711
|
+
height: '100%',
|
|
23712
|
+
objectFit: 'cover',
|
|
23713
|
+
};
|
|
23714
|
+
if (!isImageLikeElement(el)) {
|
|
23715
|
+
return uncropped;
|
|
23716
|
+
}
|
|
23717
|
+
const cropLeft = clampCropValue(el.cropLeft);
|
|
23718
|
+
const cropTop = clampCropValue(el.cropTop);
|
|
23719
|
+
const cropRight = clampCropValue(el.cropRight);
|
|
23720
|
+
const cropBottom = clampCropValue(el.cropBottom);
|
|
23721
|
+
if (cropLeft + cropRight <= 0.0001 && cropTop + cropBottom <= 0.0001) {
|
|
23722
|
+
return uncropped;
|
|
23723
|
+
}
|
|
23724
|
+
// A crop that swallows (almost) the whole source would divide by ~0 below, so
|
|
23725
|
+
// the pair is rescaled to leave a 1% sliver rather than producing Infinity.
|
|
23726
|
+
const horizontalScale = cropLeft + cropRight >= 0.99 ? 0.99 / (cropLeft + cropRight) : 1;
|
|
23727
|
+
const verticalScale = cropTop + cropBottom >= 0.99 ? 0.99 / (cropTop + cropBottom) : 1;
|
|
23728
|
+
const left = clampCropValue(cropLeft * horizontalScale);
|
|
23729
|
+
const right = clampCropValue(cropRight * horizontalScale);
|
|
23730
|
+
const top = clampCropValue(cropTop * verticalScale);
|
|
23731
|
+
const bottom = clampCropValue(cropBottom * verticalScale);
|
|
23732
|
+
const remainingWidth = Math.max(0.01, 1 - left - right);
|
|
23733
|
+
const remainingHeight = Math.max(0.01, 1 - top - bottom);
|
|
23734
|
+
const tx = Math.round((-left / remainingWidth) * 10000) / 100;
|
|
23735
|
+
const ty = Math.round((-top / remainingHeight) * 10000) / 100;
|
|
23736
|
+
const sx = Math.round((1 / remainingWidth) * 1e6) / 1e6;
|
|
23737
|
+
const sy = Math.round((1 / remainingHeight) * 1e6) / 1e6;
|
|
23738
|
+
return {
|
|
23739
|
+
position: 'absolute',
|
|
23740
|
+
width: '100%',
|
|
23741
|
+
height: '100%',
|
|
23742
|
+
maxWidth: 'none',
|
|
23743
|
+
maxHeight: 'none',
|
|
23744
|
+
objectFit: 'fill',
|
|
23745
|
+
transformOrigin: 'top left',
|
|
23746
|
+
transform: `translate(${tx}%, ${ty}%) scale(${sx}, ${sy})`,
|
|
23747
|
+
};
|
|
23748
|
+
}
|
|
23510
23749
|
|
|
23511
23750
|
/**
|
|
23512
23751
|
* group-ops: Pure, immutable group/ungroup operations for the slide element tree.
|
|
@@ -28065,12 +28304,15 @@ function segmentStyleToCss(seg, fontScale = 1) {
|
|
|
28065
28304
|
if (s.color) {
|
|
28066
28305
|
style.color = s.color;
|
|
28067
28306
|
}
|
|
28068
|
-
|
|
28069
|
-
|
|
28070
|
-
|
|
28071
|
-
|
|
28072
|
-
|
|
28073
|
-
|
|
28307
|
+
// Declared unconditionally, exactly as React's `renderSingleSegment` does, and
|
|
28308
|
+
// that is the whole point: the text BLOCK also carries a `font-weight` /
|
|
28309
|
+
// `font-style` derived from the element's resolved text style, so a run that
|
|
28310
|
+
// merely omits `b` / `i` inherits the block's value instead of falling back to
|
|
28311
|
+
// regular. On a real deck a bold heading in the first paragraph therefore
|
|
28312
|
+
// turned every following paragraph of the same shape bold, which reflows the
|
|
28313
|
+
// text and pushes it out of its box.
|
|
28314
|
+
style.fontWeight = s.bold ? 'bold' : 'normal';
|
|
28315
|
+
style.fontStyle = s.italic ? 'italic' : 'normal';
|
|
28074
28316
|
const deco = [];
|
|
28075
28317
|
if (s.underline) {
|
|
28076
28318
|
deco.push('underline');
|
|
@@ -31893,6 +32135,93 @@ function buildWrapperStyle(element, zIndex) {
|
|
|
31893
32135
|
return parts.join(';');
|
|
31894
32136
|
}
|
|
31895
32137
|
|
|
32138
|
+
/**
|
|
32139
|
+
* The six arrowhead tokens, in the order PowerPoint's own arrow gallery lists
|
|
32140
|
+
* them (and the order React's picker has always used). `arrow` is PowerPoint's
|
|
32141
|
+
* "Open Arrow"; the spelling comes from `ARROWHEAD_LABEL_KEYS`, never from the
|
|
32142
|
+
* raw token.
|
|
32143
|
+
*/
|
|
32144
|
+
const CONNECTOR_ARROW_VALUES = [
|
|
32145
|
+
'none',
|
|
32146
|
+
'triangle',
|
|
32147
|
+
'stealth',
|
|
32148
|
+
'diamond',
|
|
32149
|
+
'oval',
|
|
32150
|
+
'arrow',
|
|
32151
|
+
];
|
|
32152
|
+
/** The `a:headEnd/@w` and `@len` steps, smallest first. */
|
|
32153
|
+
const CONNECTOR_ARROW_SIZE_VALUES = ['sm', 'med', 'lg'];
|
|
32154
|
+
/**
|
|
32155
|
+
* The card's controls, in render order: the two head TYPES first (the property
|
|
32156
|
+
* users reach for), then each end's width and length.
|
|
32157
|
+
*/
|
|
32158
|
+
const CONNECTOR_ARROW_CONTROLS = [
|
|
32159
|
+
{
|
|
32160
|
+
styleKey: 'connectorStartArrow',
|
|
32161
|
+
labelKey: 'pptx.connectorArrows.startArrow',
|
|
32162
|
+
values: CONNECTOR_ARROW_VALUES,
|
|
32163
|
+
optionLabelKeys: ARROWHEAD_LABEL_KEYS,
|
|
32164
|
+
fallback: 'none',
|
|
32165
|
+
},
|
|
32166
|
+
{
|
|
32167
|
+
styleKey: 'connectorEndArrow',
|
|
32168
|
+
labelKey: 'pptx.connectorArrows.endArrow',
|
|
32169
|
+
values: CONNECTOR_ARROW_VALUES,
|
|
32170
|
+
optionLabelKeys: ARROWHEAD_LABEL_KEYS,
|
|
32171
|
+
fallback: 'none',
|
|
32172
|
+
},
|
|
32173
|
+
{
|
|
32174
|
+
styleKey: 'connectorStartArrowWidth',
|
|
32175
|
+
labelKey: 'pptx.connectorArrows.startWidth',
|
|
32176
|
+
values: CONNECTOR_ARROW_SIZE_VALUES,
|
|
32177
|
+
optionLabelKeys: ARROW_SIZE_LABEL_KEYS,
|
|
32178
|
+
fallback: 'med',
|
|
32179
|
+
},
|
|
32180
|
+
{
|
|
32181
|
+
styleKey: 'connectorStartArrowLength',
|
|
32182
|
+
labelKey: 'pptx.connectorArrows.startLength',
|
|
32183
|
+
values: CONNECTOR_ARROW_SIZE_VALUES,
|
|
32184
|
+
optionLabelKeys: ARROW_SIZE_LABEL_KEYS,
|
|
32185
|
+
fallback: 'med',
|
|
32186
|
+
},
|
|
32187
|
+
{
|
|
32188
|
+
styleKey: 'connectorEndArrowWidth',
|
|
32189
|
+
labelKey: 'pptx.connectorArrows.endWidth',
|
|
32190
|
+
values: CONNECTOR_ARROW_SIZE_VALUES,
|
|
32191
|
+
optionLabelKeys: ARROW_SIZE_LABEL_KEYS,
|
|
32192
|
+
fallback: 'med',
|
|
32193
|
+
},
|
|
32194
|
+
{
|
|
32195
|
+
styleKey: 'connectorEndArrowLength',
|
|
32196
|
+
labelKey: 'pptx.connectorArrows.endLength',
|
|
32197
|
+
values: CONNECTOR_ARROW_SIZE_VALUES,
|
|
32198
|
+
optionLabelKeys: ARROW_SIZE_LABEL_KEYS,
|
|
32199
|
+
fallback: 'med',
|
|
32200
|
+
},
|
|
32201
|
+
];
|
|
32202
|
+
/** Current token for one control, or its fallback when the style is silent. */
|
|
32203
|
+
function connectorArrowValue(control, style) {
|
|
32204
|
+
const current = style?.[control.styleKey];
|
|
32205
|
+
return typeof current === 'string' && current.length > 0 ? current : control.fallback;
|
|
32206
|
+
}
|
|
32207
|
+
/**
|
|
32208
|
+
* Build the `ShapeStyle` patch for one dropdown change.
|
|
32209
|
+
*
|
|
32210
|
+
* WHY a helper: the six keys hold two different value unions, so writing
|
|
32211
|
+
* `{ [control.styleKey]: raw }` inline forces every binding to widen the value
|
|
32212
|
+
* and cast. Narrowing once here keeps the casts out of the view layer, and
|
|
32213
|
+
* makes an unknown token a no-op rather than a corrupt `shapeStyle`.
|
|
32214
|
+
*/
|
|
32215
|
+
function connectorArrowPatch(control, raw) {
|
|
32216
|
+
if (!control.values.includes(raw)) {
|
|
32217
|
+
return {};
|
|
32218
|
+
}
|
|
32219
|
+
if (control.styleKey === 'connectorStartArrow' || control.styleKey === 'connectorEndArrow') {
|
|
32220
|
+
return { [control.styleKey]: raw };
|
|
32221
|
+
}
|
|
32222
|
+
return { [control.styleKey]: raw };
|
|
32223
|
+
}
|
|
32224
|
+
|
|
31896
32225
|
/** Copy the paintable shape + text style off an element. */
|
|
31897
32226
|
function copyFormatFromElement(element) {
|
|
31898
32227
|
const result = {};
|
|
@@ -41982,6 +42311,255 @@ function formatSlideCounter(currentSlide, totalSlides) {
|
|
|
41982
42311
|
return `${currentSlide + 1} / ${totalSlides}`;
|
|
41983
42312
|
}
|
|
41984
42313
|
|
|
42314
|
+
/**
|
|
42315
|
+
* The slide-show chrome, described once for all five bindings.
|
|
42316
|
+
*
|
|
42317
|
+
* `presentation-toolbar.ts` already shares the toolbar's BEHAVIOUR (trigger
|
|
42318
|
+
* zone, auto-hide delay, colour swatches, counter format). What it never shared
|
|
42319
|
+
* is the toolbar's CONTENT, and that is exactly what drifted: React shipped
|
|
42320
|
+
* prev / counter / next / elapsed / laser / pen+colour / highlighter+colour /
|
|
42321
|
+
* eraser / clear / presenter-view / end, Vue re-labelled half of those from a
|
|
42322
|
+
* different i18n namespace, Angular shipped a bottom-LEFT strip of four tools
|
|
42323
|
+
* plus a captions button and no navigation at all, and Vanilla and Svelte
|
|
42324
|
+
* shipped no show toolbar whatsoever, which on a desktop left a presenter with
|
|
42325
|
+
* no visible way to leave the show.
|
|
42326
|
+
*
|
|
42327
|
+
* So the inventory and the measurements live here, next to `chrome-metrics.ts`
|
|
42328
|
+
* which did the same job for the title and status bars, and every binding
|
|
42329
|
+
* derives its bar from these constants:
|
|
42330
|
+
*
|
|
42331
|
+
* - React, Vue and Angular apply {@link PRESENT_TOOLBAR_CLASSES} (Tailwind).
|
|
42332
|
+
* - Vanilla interpolates {@link PRESENT_TOOLBAR_METRICS} into its CSS-in-TS.
|
|
42333
|
+
* - Svelte reads {@link presentToolbarCssVars} off an inline `style`
|
|
42334
|
+
* attribute, because its scoped `<style>` is compiled and cannot see a
|
|
42335
|
+
* TypeScript value.
|
|
42336
|
+
*
|
|
42337
|
+
* `present-chrome.test.ts` asserts the Tailwind tokens still encode exactly the
|
|
42338
|
+
* numbers below, which is what stops the two representations drifting apart.
|
|
42339
|
+
*
|
|
42340
|
+
* @module render/present-chrome
|
|
42341
|
+
*/
|
|
42342
|
+
/**
|
|
42343
|
+
* The show toolbar, in order.
|
|
42344
|
+
*
|
|
42345
|
+
* The keys are the ones React already renders, so aligning a binding to this
|
|
42346
|
+
* list cannot silently rename a control that a parity spec matches by
|
|
42347
|
+
* accessible name. Two of the five had picked up near-miss duplicates from
|
|
42348
|
+
* other namespaces (`pptx.mobileBar.previousSlide` is "Previous slide", not
|
|
42349
|
+
* "Previous Slide"; `pptx.presentationToolbar.clearAnnotations` is "Clear
|
|
42350
|
+
* annotations", not "Clear Annotations"), which read identically in a
|
|
42351
|
+
* screenshot and differently to a screen reader or a role query.
|
|
42352
|
+
*/
|
|
42353
|
+
const PRESENT_TOOLBAR_CONTROLS = [
|
|
42354
|
+
{
|
|
42355
|
+
id: 'previous',
|
|
42356
|
+
kind: 'button',
|
|
42357
|
+
labelKey: 'pptx.presenter.previousSlide',
|
|
42358
|
+
icon: 'chevron-left',
|
|
42359
|
+
},
|
|
42360
|
+
{ id: 'counter', kind: 'counter' },
|
|
42361
|
+
{ id: 'next', kind: 'button', labelKey: 'pptx.presenter.nextSlide', icon: 'chevron-right' },
|
|
42362
|
+
{ id: 'divider-navigation', kind: 'divider' },
|
|
42363
|
+
{ id: 'timer', kind: 'timer', labelKey: 'pptx.presenter.elapsed', icon: 'timer' },
|
|
42364
|
+
{ id: 'divider-timer', kind: 'divider' },
|
|
42365
|
+
{
|
|
42366
|
+
id: 'laser',
|
|
42367
|
+
kind: 'toggle',
|
|
42368
|
+
labelKey: 'pptx.presentation.laserPointer',
|
|
42369
|
+
icon: 'mouse-pointer-2',
|
|
42370
|
+
},
|
|
42371
|
+
{ id: 'pen', kind: 'toggle', labelKey: 'pptx.presentation.pen', icon: 'pen-tool' },
|
|
42372
|
+
{
|
|
42373
|
+
id: 'pen-color',
|
|
42374
|
+
kind: 'caret',
|
|
42375
|
+
labelKey: 'pptx.presentationToolbar.penColor',
|
|
42376
|
+
icon: 'chevron-down',
|
|
42377
|
+
},
|
|
42378
|
+
{
|
|
42379
|
+
id: 'highlighter',
|
|
42380
|
+
kind: 'toggle',
|
|
42381
|
+
labelKey: 'pptx.presentation.highlighter',
|
|
42382
|
+
icon: 'highlighter',
|
|
42383
|
+
},
|
|
42384
|
+
{
|
|
42385
|
+
id: 'highlighter-color',
|
|
42386
|
+
kind: 'caret',
|
|
42387
|
+
labelKey: 'pptx.presentationToolbar.highlighterColor',
|
|
42388
|
+
icon: 'chevron-down',
|
|
42389
|
+
},
|
|
42390
|
+
{ id: 'eraser', kind: 'toggle', labelKey: 'pptx.presentation.eraser', icon: 'eraser' },
|
|
42391
|
+
{ id: 'clear', kind: 'button', labelKey: 'pptx.presentation.clearAnnotations', icon: 'trash-2' },
|
|
42392
|
+
{ id: 'divider-tools', kind: 'divider' },
|
|
42393
|
+
{
|
|
42394
|
+
id: 'presenter-view',
|
|
42395
|
+
kind: 'toggle',
|
|
42396
|
+
labelKey: 'pptx.presenter.presenterView',
|
|
42397
|
+
icon: 'panel-right',
|
|
42398
|
+
},
|
|
42399
|
+
{ id: 'end', kind: 'button', labelKey: 'pptx.presenter.endPresentation', icon: 'x' },
|
|
42400
|
+
];
|
|
42401
|
+
/** The toolbar's control ids in render order, for tests and parity specs. */
|
|
42402
|
+
const PRESENT_TOOLBAR_ORDER = PRESENT_TOOLBAR_CONTROLS.map((control) => control.id);
|
|
42403
|
+
/**
|
|
42404
|
+
* The accessible-name i18n keys, in order, skipping the slots that have none.
|
|
42405
|
+
* A parity spec resolves these through the dictionary rather than hard-coding
|
|
42406
|
+
* English, so the inventory survives a translation change.
|
|
42407
|
+
*/
|
|
42408
|
+
const PRESENT_TOOLBAR_LABEL_KEYS = PRESENT_TOOLBAR_CONTROLS.flatMap((control) => (control.labelKey === undefined ? [] : [control.labelKey]));
|
|
42409
|
+
/** Show-toolbar measurements, in CSS pixels unless the name says otherwise. */
|
|
42410
|
+
const PRESENT_TOOLBAR_METRICS = {
|
|
42411
|
+
/** Square control edge length (`w-9 h-9`). */
|
|
42412
|
+
buttonSize: 36,
|
|
42413
|
+
/** Colour-caret width; it shares the button height (`w-7 h-9`). */
|
|
42414
|
+
caretWidth: 28,
|
|
42415
|
+
/** Overlap pulling a caret against its tool button (`-ml-1`). */
|
|
42416
|
+
caretOverlap: 4,
|
|
42417
|
+
/** Icon edge length inside a button (`size={18}`). */
|
|
42418
|
+
iconSize: 18,
|
|
42419
|
+
/** Icon edge length inside a colour caret (`size={12}`). */
|
|
42420
|
+
caretIconSize: 12,
|
|
42421
|
+
/** Icon edge length beside the elapsed readout (`size={14}`). */
|
|
42422
|
+
timerIconSize: 14,
|
|
42423
|
+
/** Flex gap between the bar's direct children (`gap-1`). */
|
|
42424
|
+
gap: 4,
|
|
42425
|
+
/** Horizontal padding on the bar (`px-3`). */
|
|
42426
|
+
paddingX: 12,
|
|
42427
|
+
/** Vertical padding on the bar (`py-2`). */
|
|
42428
|
+
paddingY: 8,
|
|
42429
|
+
/** Bar corner radius (`rounded-xl`). */
|
|
42430
|
+
radius: 12,
|
|
42431
|
+
/** Control corner radius (`rounded-md`). */
|
|
42432
|
+
controlRadius: 6,
|
|
42433
|
+
/** Bar background (`bg-neutral-900/90`). */
|
|
42434
|
+
background: 'rgb(23 23 23 / 90%)',
|
|
42435
|
+
/** Bar border colour (`border-white/15`). */
|
|
42436
|
+
borderColor: 'rgb(255 255 255 / 15%)',
|
|
42437
|
+
/** Divider width (`w-px`). */
|
|
42438
|
+
dividerWidth: 1,
|
|
42439
|
+
/** Divider height (`h-6`). */
|
|
42440
|
+
dividerHeight: 24,
|
|
42441
|
+
/** Divider horizontal margin (`mx-1`). */
|
|
42442
|
+
dividerMarginX: 4,
|
|
42443
|
+
/** Divider colour (`bg-white/20`). */
|
|
42444
|
+
dividerColor: 'rgb(255 255 255 / 20%)',
|
|
42445
|
+
/** Counter minimum width, so the bar does not jitter as digits change. */
|
|
42446
|
+
counterMinWidth: 48,
|
|
42447
|
+
/** Counter / timer font size (`text-xs`). */
|
|
42448
|
+
fontSize: 12,
|
|
42449
|
+
/**
|
|
42450
|
+
* Counter / timer line height (`text-xs` is 12px/16px, not 12px/1).
|
|
42451
|
+
*
|
|
42452
|
+
* Spelled out because the hand-ported bindings reach for `font: 12px/1` and
|
|
42453
|
+
* land a 12px-tall readout next to React's 16px one, which shifts the bar's
|
|
42454
|
+
* own height and every baseline in it.
|
|
42455
|
+
*/
|
|
42456
|
+
lineHeight: 16,
|
|
42457
|
+
/** Gap between the timer icon and its readout (`gap-1.5`). */
|
|
42458
|
+
timerGap: 6,
|
|
42459
|
+
/** Distance from the bottom of the show surface to the bar (`bottom-6`). */
|
|
42460
|
+
bottomOffset: 24,
|
|
42461
|
+
/** Stacking order of the bar over the stage (`z-[80]`). */
|
|
42462
|
+
zIndex: 80,
|
|
42463
|
+
/** Fade duration when the bar auto-hides or returns (`duration-300`). */
|
|
42464
|
+
fadeMs: 300,
|
|
42465
|
+
/** Colour-palette swatch edge length. */
|
|
42466
|
+
swatchSize: 36,
|
|
42467
|
+
/** Colour-palette columns (`grid-cols-4`). */
|
|
42468
|
+
paletteColumns: 4,
|
|
42469
|
+
/** Colour-palette gap (`gap-2`) and padding (`p-3`). */
|
|
42470
|
+
paletteGap: 8,
|
|
42471
|
+
palettePadding: 12,
|
|
42472
|
+
/** Underline marking a tool's current colour (`w-3 h-0.5`). */
|
|
42473
|
+
swatchBarWidth: 12,
|
|
42474
|
+
swatchBarHeight: 2,
|
|
42475
|
+
};
|
|
42476
|
+
/**
|
|
42477
|
+
* Tailwind tokens for the show toolbar, applied by React, Vue and Angular.
|
|
42478
|
+
*
|
|
42479
|
+
* Expressed as whole class strings rather than assembled per call site: three
|
|
42480
|
+
* bindings each writing `w-9 h-9 rounded-md ...` by hand is precisely how the
|
|
42481
|
+
* caret ended up 18px wide in one of them and 28px in another.
|
|
42482
|
+
*/
|
|
42483
|
+
const PRESENT_TOOLBAR_CLASSES = {
|
|
42484
|
+
/** The floating bar itself. */
|
|
42485
|
+
container: 'flex items-center gap-1 px-3 py-2 rounded-xl bg-neutral-900/90 backdrop-blur-md border border-white/15 shadow-2xl',
|
|
42486
|
+
/** The auto-hiding positioner the bar sits in. */
|
|
42487
|
+
wrapper: 'absolute bottom-6 left-1/2 -translate-x-1/2 z-[80] transition-opacity duration-300',
|
|
42488
|
+
/** Navigation / action button. */
|
|
42489
|
+
button: 'flex items-center justify-center w-9 h-9 rounded-md transition-colors text-white/70 hover:text-white hover:bg-white/10 disabled:text-white/20 disabled:cursor-not-allowed',
|
|
42490
|
+
/** Annotation-tool toggle, inactive. */
|
|
42491
|
+
toggle: 'relative flex items-center justify-center w-9 h-9 rounded-md transition-colors text-white/70 hover:text-white hover:bg-white/10',
|
|
42492
|
+
/** Annotation-tool toggle, active. */
|
|
42493
|
+
toggleActive: 'relative flex items-center justify-center w-9 h-9 rounded-md transition-colors bg-white/25 text-white',
|
|
42494
|
+
/** Colour caret beside a tool toggle. */
|
|
42495
|
+
caret: 'flex items-center justify-center w-7 h-9 -ml-1 rounded-r-md transition-colors text-white/50 hover:text-white hover:bg-white/10',
|
|
42496
|
+
/** Vertical hairline between groups. */
|
|
42497
|
+
divider: 'w-px h-6 bg-white/20 mx-1',
|
|
42498
|
+
/** Slide counter. */
|
|
42499
|
+
counter: 'text-xs font-mono tabular-nums text-white/80 px-1.5 select-none min-w-[48px] text-center',
|
|
42500
|
+
/** Elapsed-time readout. */
|
|
42501
|
+
timer: 'flex items-center gap-1.5 text-xs font-mono tabular-nums text-white/60 px-1 select-none',
|
|
42502
|
+
/**
|
|
42503
|
+
* Colour palette popover.
|
|
42504
|
+
*
|
|
42505
|
+
* `w-max` is load-bearing. An absolutely positioned grid shrink-to-fits its
|
|
42506
|
+
* positioned ancestor, which here is the 64px tool+caret pair, so without it
|
|
42507
|
+
* the four 36px swatch columns are squeezed into 50px and overlap each other
|
|
42508
|
+
* to the point that a swatch cannot be clicked. React shipped it that way,
|
|
42509
|
+
* and the ports faithfully reproduced the defect.
|
|
42510
|
+
*/
|
|
42511
|
+
palette: 'absolute bottom-full left-1/2 -translate-x-1/2 mb-2 p-3 w-max bg-neutral-800 rounded-lg border border-white/20 shadow-xl grid grid-cols-4 gap-2',
|
|
42512
|
+
/** One colour swatch inside the palette. */
|
|
42513
|
+
swatch: 'w-9 h-9 rounded-full border-2 transition-transform hover:scale-110',
|
|
42514
|
+
/** Underline showing a tool's current colour. */
|
|
42515
|
+
swatchBar: 'absolute bottom-0.5 left-1/2 -translate-x-1/2 w-3 h-0.5 rounded-full',
|
|
42516
|
+
};
|
|
42517
|
+
/**
|
|
42518
|
+
* The show-toolbar metrics as CSS custom properties, for the two bindings that
|
|
42519
|
+
* cannot read a Tailwind class (Vanilla's CSS-in-TS, Svelte's scoped style).
|
|
42520
|
+
*/
|
|
42521
|
+
function presentToolbarCssVars() {
|
|
42522
|
+
const m = PRESENT_TOOLBAR_METRICS;
|
|
42523
|
+
return {
|
|
42524
|
+
'--pptx-pt-button': `${String(m.buttonSize)}px`,
|
|
42525
|
+
'--pptx-pt-caret': `${String(m.caretWidth)}px`,
|
|
42526
|
+
'--pptx-pt-caret-overlap': `${String(m.caretOverlap)}px`,
|
|
42527
|
+
'--pptx-pt-icon': `${String(m.iconSize)}px`,
|
|
42528
|
+
'--pptx-pt-caret-icon': `${String(m.caretIconSize)}px`,
|
|
42529
|
+
'--pptx-pt-timer-icon': `${String(m.timerIconSize)}px`,
|
|
42530
|
+
'--pptx-pt-gap': `${String(m.gap)}px`,
|
|
42531
|
+
'--pptx-pt-pad-x': `${String(m.paddingX)}px`,
|
|
42532
|
+
'--pptx-pt-pad-y': `${String(m.paddingY)}px`,
|
|
42533
|
+
'--pptx-pt-radius': `${String(m.radius)}px`,
|
|
42534
|
+
'--pptx-pt-control-radius': `${String(m.controlRadius)}px`,
|
|
42535
|
+
'--pptx-pt-bg': m.background,
|
|
42536
|
+
'--pptx-pt-border': m.borderColor,
|
|
42537
|
+
'--pptx-pt-divider-w': `${String(m.dividerWidth)}px`,
|
|
42538
|
+
'--pptx-pt-divider-h': `${String(m.dividerHeight)}px`,
|
|
42539
|
+
'--pptx-pt-divider-mx': `${String(m.dividerMarginX)}px`,
|
|
42540
|
+
'--pptx-pt-divider-color': m.dividerColor,
|
|
42541
|
+
'--pptx-pt-counter-min': `${String(m.counterMinWidth)}px`,
|
|
42542
|
+
'--pptx-pt-font-size': `${String(m.fontSize)}px`,
|
|
42543
|
+
'--pptx-pt-line-height': `${String(m.lineHeight)}px`,
|
|
42544
|
+
'--pptx-pt-timer-gap': `${String(m.timerGap)}px`,
|
|
42545
|
+
'--pptx-pt-bottom': `${String(m.bottomOffset)}px`,
|
|
42546
|
+
'--pptx-pt-z': String(m.zIndex),
|
|
42547
|
+
'--pptx-pt-fade': `${String(m.fadeMs)}ms`,
|
|
42548
|
+
'--pptx-pt-swatch': `${String(m.swatchSize)}px`,
|
|
42549
|
+
'--pptx-pt-palette-cols': String(m.paletteColumns),
|
|
42550
|
+
'--pptx-pt-palette-gap': `${String(m.paletteGap)}px`,
|
|
42551
|
+
'--pptx-pt-palette-pad': `${String(m.palettePadding)}px`,
|
|
42552
|
+
'--pptx-pt-swatch-bar-w': `${String(m.swatchBarWidth)}px`,
|
|
42553
|
+
'--pptx-pt-swatch-bar-h': `${String(m.swatchBarHeight)}px`,
|
|
42554
|
+
};
|
|
42555
|
+
}
|
|
42556
|
+
/** {@link presentToolbarCssVars} flattened into an inline `style` attribute. */
|
|
42557
|
+
function presentToolbarStyleAttr() {
|
|
42558
|
+
return Object.entries(presentToolbarCssVars())
|
|
42559
|
+
.map(([name, value]) => `${name}:${value}`)
|
|
42560
|
+
.join(';');
|
|
42561
|
+
}
|
|
42562
|
+
|
|
41985
42563
|
/**
|
|
41986
42564
|
* PowerPoint-accurate slide-show keyboard map.
|
|
41987
42565
|
*
|
|
@@ -44957,6 +45535,317 @@ function getReducedMotionStyles() {
|
|
|
44957
45535
|
};
|
|
44958
45536
|
}
|
|
44959
45537
|
|
|
45538
|
+
function shouldLoopContinuously(input) {
|
|
45539
|
+
return Boolean(input.loopContinuously) || input.showType === 'kiosk';
|
|
45540
|
+
}
|
|
45541
|
+
/**
|
|
45542
|
+
* PowerPoint's "On Mouse Click" advance gate. An on-slide click / tap / swipe
|
|
45543
|
+
* advances the show only when the current slide's transition allows it: a slide
|
|
45544
|
+
* whose transition sets `advanceOnClick` to false is advanced solely by timings
|
|
45545
|
+
* or by explicit navigation (keyboard, on-screen next/prev buttons). An
|
|
45546
|
+
* undefined flag defaults to allowed, preserving the historical
|
|
45547
|
+
* click-to-advance behaviour.
|
|
45548
|
+
*
|
|
45549
|
+
* Only the click / tap / swipe advance may consult this. Keyboard, on-screen
|
|
45550
|
+
* next/prev buttons and timed auto-advance must never be gated by it.
|
|
45551
|
+
*/
|
|
45552
|
+
function isClickAdvanceAllowed(slide) {
|
|
45553
|
+
return slide?.transition?.advanceOnClick !== false;
|
|
45554
|
+
}
|
|
45555
|
+
/**
|
|
45556
|
+
* PowerPoint's "After: <n>" timed advance (`p:transition/@advTm`, milliseconds).
|
|
45557
|
+
*
|
|
45558
|
+
* Returns the delay a slide show must wait before stepping to the next slide on
|
|
45559
|
+
* its own, or `undefined` when the slide waits for input instead. Timings are
|
|
45560
|
+
* honoured unless the show is explicitly set to manual advance
|
|
45561
|
+
* (`PptxPresentationProperties.advanceMode === 'manual'`, surfaced here as
|
|
45562
|
+
* `useTimings: false`); an unset flag keeps them, matching PowerPoint's default
|
|
45563
|
+
* "Using timings, if present".
|
|
45564
|
+
*
|
|
45565
|
+
* This pairs with {@link isClickAdvanceAllowed}: a slide authored with
|
|
45566
|
+
* `advClick="0" advTm="…"` is advanced ONLY by this timer, so a binding that
|
|
45567
|
+
* honours the click gate without also running the timer leaves the show
|
|
45568
|
+
* permanently stuck on that slide with no visible response to input.
|
|
45569
|
+
*/
|
|
45570
|
+
function resolveAutoAdvanceDelayMs(slide, options) {
|
|
45571
|
+
if (options?.useTimings === false) {
|
|
45572
|
+
return undefined;
|
|
45573
|
+
}
|
|
45574
|
+
const advanceAfterMs = slide?.transition?.advanceAfterMs;
|
|
45575
|
+
if (typeof advanceAfterMs !== 'number' ||
|
|
45576
|
+
!Number.isFinite(advanceAfterMs) ||
|
|
45577
|
+
advanceAfterMs < 0) {
|
|
45578
|
+
return undefined;
|
|
45579
|
+
}
|
|
45580
|
+
return advanceAfterMs;
|
|
45581
|
+
}
|
|
45582
|
+
/**
|
|
45583
|
+
* Click targets that own their own click during a running show and must never
|
|
45584
|
+
* also step the slide on: hyperlinks and action buttons (PowerPoint follows the
|
|
45585
|
+
* link instead of advancing), media transport, form controls, and anything
|
|
45586
|
+
* inside a dialog. `[data-pptx-action]` is the attribute every binding stamps
|
|
45587
|
+
* on an element carrying an on-click action.
|
|
45588
|
+
*/
|
|
45589
|
+
const PRESENTATION_INERT_CLICK_SELECTOR = 'a, button, input, select, textarea, video, audio, [data-pptx-action], [role="dialog"]';
|
|
45590
|
+
/**
|
|
45591
|
+
* A media element only owns its click while it exposes native transport: with
|
|
45592
|
+
* no controls there is nothing on it to click, so it is as inert as any other
|
|
45593
|
+
* picture. This matters for a full-bleed background video, which covers the
|
|
45594
|
+
* ENTIRE slide: treating it as interactive would swallow every click on that
|
|
45595
|
+
* slide and leave the presenter unable to advance at all.
|
|
45596
|
+
*/
|
|
45597
|
+
function isInertMedia(node) {
|
|
45598
|
+
return ((node.tagName === 'VIDEO' || node.tagName === 'AUDIO') && !node.controls);
|
|
45599
|
+
}
|
|
45600
|
+
/**
|
|
45601
|
+
* Whether a click on `target` is PowerPoint's "On Mouse Click" advance rather
|
|
45602
|
+
* than an interaction with live slide content or show chrome.
|
|
45603
|
+
*
|
|
45604
|
+
* Only decides whether the click *reaches* the advance; whether the advance is
|
|
45605
|
+
* then allowed is {@link isClickAdvanceAllowed}'s job.
|
|
45606
|
+
*/
|
|
45607
|
+
function isPresentationAdvanceClick(target) {
|
|
45608
|
+
if (typeof Element === 'undefined' || !(target instanceof Element)) {
|
|
45609
|
+
return false;
|
|
45610
|
+
}
|
|
45611
|
+
for (let node = target; node !== null; node = node.parentElement) {
|
|
45612
|
+
if (isInertMedia(node)) {
|
|
45613
|
+
continue;
|
|
45614
|
+
}
|
|
45615
|
+
if (node.matches(PRESENTATION_INERT_CLICK_SELECTOR)) {
|
|
45616
|
+
return false;
|
|
45617
|
+
}
|
|
45618
|
+
}
|
|
45619
|
+
return true;
|
|
45620
|
+
}
|
|
45621
|
+
function applyRehearsalTimings(slides, timings) {
|
|
45622
|
+
return slides.map((slide, index) => {
|
|
45623
|
+
const advanceAfterMs = timings[index];
|
|
45624
|
+
if (typeof advanceAfterMs !== 'number') {
|
|
45625
|
+
return slide;
|
|
45626
|
+
}
|
|
45627
|
+
return {
|
|
45628
|
+
...slide,
|
|
45629
|
+
transition: {
|
|
45630
|
+
...slide.transition,
|
|
45631
|
+
type: slide.transition?.type ?? 'none',
|
|
45632
|
+
advanceAfterMs,
|
|
45633
|
+
},
|
|
45634
|
+
};
|
|
45635
|
+
});
|
|
45636
|
+
}
|
|
45637
|
+
function sortEntranceAnimations(animations) {
|
|
45638
|
+
return [...animations]
|
|
45639
|
+
.filter(({ entrance }) => Boolean(entrance))
|
|
45640
|
+
.sort((left, right) => (left.order ?? Number.MAX_SAFE_INTEGER) - (right.order ?? Number.MAX_SAFE_INTEGER));
|
|
45641
|
+
}
|
|
45642
|
+
function computeEntranceAnimationDelay(delayMs, animationIndex) {
|
|
45643
|
+
return Math.max(0, delayMs || 0) + animationIndex * 60;
|
|
45644
|
+
}
|
|
45645
|
+
|
|
45646
|
+
/**
|
|
45647
|
+
* What a click during a running slide show actually MEANS.
|
|
45648
|
+
*
|
|
45649
|
+
* PowerPoint gives an on-slide click three possible readings, in priority
|
|
45650
|
+
* order:
|
|
45651
|
+
*
|
|
45652
|
+
* 1. The click landed on a shape carrying an Action Setting
|
|
45653
|
+
* (`a:hlinkClick` on `p:cNvPr`, i.e. `PptxElement.actionClick`). The
|
|
45654
|
+
* action runs; the show does NOT step on.
|
|
45655
|
+
* 2. The click landed on live content that owns its own click (a real
|
|
45656
|
+
* hyperlink, media transport, show chrome). Nothing navigates.
|
|
45657
|
+
* 3. Anything else is PowerPoint's "On Mouse Click" advance.
|
|
45658
|
+
*
|
|
45659
|
+
* Only React implemented (1), and it did so inside its own JSX by calling
|
|
45660
|
+
* `stopPropagation` on the element's `onClick`. The other four bindings had no
|
|
45661
|
+
* element-level action handler at all, so on the reporter's deck
|
|
45662
|
+
* (`e2e/fixtures/solution-explorer.pptx`, a wheel of eight
|
|
45663
|
+
* `ppaction://hlinksldjump` slices) clicking ANY slice stepped the show to the
|
|
45664
|
+
* next slide instead of jumping to the slice's own slide: the red arrow in the
|
|
45665
|
+
* hub swept to the wrong position every time, which reads as "clicking the
|
|
45666
|
+
* slices is broken and the arrow does not move properly".
|
|
45667
|
+
*
|
|
45668
|
+
* The rule therefore lives here, keyed off the `data-element-id` attribute all
|
|
45669
|
+
* five bindings already stamp, so a binding wires one call into the handler it
|
|
45670
|
+
* already has instead of re-deriving PowerPoint's precedence.
|
|
45671
|
+
*
|
|
45672
|
+
* @module render/presentation-action
|
|
45673
|
+
*/
|
|
45674
|
+
/**
|
|
45675
|
+
* `ppaction://noaction` is what PowerPoint writes when a shape's Action
|
|
45676
|
+
* Settings carry a highlight or a sound but no navigation ("Action: None").
|
|
45677
|
+
* It is deliberately NOT actionable: the shape does nothing, and the click
|
|
45678
|
+
* falls through to the show's own click-to-advance exactly as it would on any
|
|
45679
|
+
* inert shape. Treating it as an action would make the "Explore solution"
|
|
45680
|
+
* button on the reporter's non-linked slides swallow every click.
|
|
45681
|
+
*/
|
|
45682
|
+
const NO_OP_ACTION = 'ppaction://noaction';
|
|
45683
|
+
/** True when the action is PowerPoint's explicit "do nothing" verb. */
|
|
45684
|
+
function isNoOpPresentationAction(action) {
|
|
45685
|
+
if (!action) {
|
|
45686
|
+
return true;
|
|
45687
|
+
}
|
|
45688
|
+
const verb = (action.action ?? '').trim().toLowerCase();
|
|
45689
|
+
if (verb === NO_OP_ACTION) {
|
|
45690
|
+
return true;
|
|
45691
|
+
}
|
|
45692
|
+
return (verb.length === 0 && typeof action.targetSlideIndex !== 'number' && !(action.url ?? '').trim());
|
|
45693
|
+
}
|
|
45694
|
+
/**
|
|
45695
|
+
* Turn a parsed `PptxAction` into the navigation the show must perform.
|
|
45696
|
+
*
|
|
45697
|
+
* An explicit `targetSlideIndex` wins: core resolves `ppaction://hlinksldjump`
|
|
45698
|
+
* against the slide's relationships at parse time, so by the time it reaches a
|
|
45699
|
+
* viewer the r:id has already become an index. The `hlinkshowjump` verbs
|
|
45700
|
+
* (first / last / next / previous / end show) are matched on the action string,
|
|
45701
|
+
* and anything left carrying a URL opens externally.
|
|
45702
|
+
*/
|
|
45703
|
+
function resolvePresentationAction(action, options) {
|
|
45704
|
+
const soundPath = action?.soundPath;
|
|
45705
|
+
if (!action || isNoOpPresentationAction(action)) {
|
|
45706
|
+
return { intent: { kind: 'none' }, soundPath };
|
|
45707
|
+
}
|
|
45708
|
+
const verb = (action.action ?? '').toLowerCase();
|
|
45709
|
+
if (typeof action.targetSlideIndex === 'number' && Number.isFinite(action.targetSlideIndex)) {
|
|
45710
|
+
if (options.slideCount <= 0) {
|
|
45711
|
+
return { intent: { kind: 'none' }, soundPath };
|
|
45712
|
+
}
|
|
45713
|
+
const slideIndex = Math.max(0, Math.min(options.slideCount - 1, Math.floor(action.targetSlideIndex)));
|
|
45714
|
+
return { intent: { kind: 'goToSlide', slideIndex }, soundPath };
|
|
45715
|
+
}
|
|
45716
|
+
if (verb.includes('hlinkshowjump')) {
|
|
45717
|
+
if (verb.includes('nextslide')) {
|
|
45718
|
+
return { intent: { kind: 'move', direction: 1 }, soundPath };
|
|
45719
|
+
}
|
|
45720
|
+
if (verb.includes('previousslide')) {
|
|
45721
|
+
return { intent: { kind: 'move', direction: -1 }, soundPath };
|
|
45722
|
+
}
|
|
45723
|
+
if (verb.includes('firstslide')) {
|
|
45724
|
+
return { intent: { kind: 'goToSlide', slideIndex: 0 }, soundPath };
|
|
45725
|
+
}
|
|
45726
|
+
if (verb.includes('lastslide')) {
|
|
45727
|
+
return {
|
|
45728
|
+
intent: options.slideCount > 0
|
|
45729
|
+
? { kind: 'goToSlide', slideIndex: options.slideCount - 1 }
|
|
45730
|
+
: { kind: 'none' },
|
|
45731
|
+
soundPath,
|
|
45732
|
+
};
|
|
45733
|
+
}
|
|
45734
|
+
if (verb.includes('endshow')) {
|
|
45735
|
+
return { intent: { kind: 'endShow' }, soundPath };
|
|
45736
|
+
}
|
|
45737
|
+
return { intent: { kind: 'none' }, soundPath };
|
|
45738
|
+
}
|
|
45739
|
+
// An unresolved slide jump (no relationship, or a broken r:id) navigates
|
|
45740
|
+
// nowhere rather than being mistaken for an external link.
|
|
45741
|
+
if (verb.includes('hlinksldjump')) {
|
|
45742
|
+
return { intent: { kind: 'none' }, soundPath };
|
|
45743
|
+
}
|
|
45744
|
+
const url = (action.url ?? '').trim();
|
|
45745
|
+
if (url && isUrlSafe(url)) {
|
|
45746
|
+
return { intent: { kind: 'openUrl', url }, soundPath };
|
|
45747
|
+
}
|
|
45748
|
+
return { intent: { kind: 'none' }, soundPath };
|
|
45749
|
+
}
|
|
45750
|
+
/** Every element on a slide, group children included, in document order. */
|
|
45751
|
+
function flattenSlideElements(elements) {
|
|
45752
|
+
const flat = [];
|
|
45753
|
+
for (const element of elements ?? []) {
|
|
45754
|
+
flat.push(element);
|
|
45755
|
+
if (element.type === 'group' && element.children) {
|
|
45756
|
+
flat.push(...flattenSlideElements(element.children));
|
|
45757
|
+
}
|
|
45758
|
+
}
|
|
45759
|
+
return flat;
|
|
45760
|
+
}
|
|
45761
|
+
/**
|
|
45762
|
+
* Walk up from a click target to the innermost rendered element carrying a
|
|
45763
|
+
* click action.
|
|
45764
|
+
*
|
|
45765
|
+
* The walk continues past an element with no action rather than stopping at
|
|
45766
|
+
* the first `[data-element-id]`: a hyperlinked shape inside a group paints its
|
|
45767
|
+
* children as their own elements, so the deepest node under the pointer is
|
|
45768
|
+
* usually a child of the shape that owns the action.
|
|
45769
|
+
*/
|
|
45770
|
+
function findPresentationActionTarget(target, slide) {
|
|
45771
|
+
if (typeof Element === 'undefined' || !(target instanceof Element) || !slide) {
|
|
45772
|
+
return undefined;
|
|
45773
|
+
}
|
|
45774
|
+
const byId = new Map();
|
|
45775
|
+
for (const element of flattenSlideElements(slide.elements)) {
|
|
45776
|
+
byId.set(element.id, element);
|
|
45777
|
+
}
|
|
45778
|
+
for (let node = target; node !== null; node = node.parentElement) {
|
|
45779
|
+
const id = node.getAttribute('data-element-id');
|
|
45780
|
+
if (!id) {
|
|
45781
|
+
continue;
|
|
45782
|
+
}
|
|
45783
|
+
const action = byId.get(id)?.actionClick;
|
|
45784
|
+
if (action && !isNoOpPresentationAction(action)) {
|
|
45785
|
+
return { elementId: id, action };
|
|
45786
|
+
}
|
|
45787
|
+
}
|
|
45788
|
+
return undefined;
|
|
45789
|
+
}
|
|
45790
|
+
/**
|
|
45791
|
+
* Resolve an action and perform it.
|
|
45792
|
+
*
|
|
45793
|
+
* @returns `true` when the action navigated (or opened a URL), so the caller
|
|
45794
|
+
* knows the click is spent and must not also advance the show.
|
|
45795
|
+
*/
|
|
45796
|
+
function runPresentationAction(action, options, runner) {
|
|
45797
|
+
const { intent, soundPath } = resolvePresentationAction(action, options);
|
|
45798
|
+
if (soundPath && runner.playSound) {
|
|
45799
|
+
runner.playSound(soundPath);
|
|
45800
|
+
}
|
|
45801
|
+
switch (intent.kind) {
|
|
45802
|
+
case 'goToSlide':
|
|
45803
|
+
runner.goToSlide(intent.slideIndex);
|
|
45804
|
+
return true;
|
|
45805
|
+
case 'move':
|
|
45806
|
+
runner.move(intent.direction);
|
|
45807
|
+
return true;
|
|
45808
|
+
case 'endShow':
|
|
45809
|
+
runner.endShow();
|
|
45810
|
+
return true;
|
|
45811
|
+
case 'openUrl':
|
|
45812
|
+
return safeOpenUrl(intent.url);
|
|
45813
|
+
default:
|
|
45814
|
+
return false;
|
|
45815
|
+
}
|
|
45816
|
+
}
|
|
45817
|
+
/**
|
|
45818
|
+
* Classify a click on the slide-show stage.
|
|
45819
|
+
*
|
|
45820
|
+
* `advance` still has to pass the slide's own `advanceOnClick` gate
|
|
45821
|
+
* ({@link isClickAdvanceAllowed}) and any pending animation builds; this only
|
|
45822
|
+
* decides whether the click REACHES the advance at all.
|
|
45823
|
+
*/
|
|
45824
|
+
function resolvePresentationClick(target, slide) {
|
|
45825
|
+
const actionTarget = findPresentationActionTarget(target, slide);
|
|
45826
|
+
if (actionTarget) {
|
|
45827
|
+
return { kind: 'action', elementId: actionTarget.elementId, action: actionTarget.action };
|
|
45828
|
+
}
|
|
45829
|
+
return isPresentationAdvanceClick(target) ? { kind: 'advance' } : { kind: 'inert' };
|
|
45830
|
+
}
|
|
45831
|
+
/**
|
|
45832
|
+
* The one call a binding wires into the click handler it already has.
|
|
45833
|
+
*
|
|
45834
|
+
* Classifies the click, runs any on-slide action itself, and reports what is
|
|
45835
|
+
* left for the caller: only `'advance'` means "now do your click-to-advance"
|
|
45836
|
+
* (still subject to the slide's `advanceOnClick` gate and pending builds).
|
|
45837
|
+
*
|
|
45838
|
+
* @returns The click's classification: `'action'` (consumed here),
|
|
45839
|
+
* `'advance'` (the caller's to handle), or `'inert'`.
|
|
45840
|
+
*/
|
|
45841
|
+
function handlePresentationStageClick(target, slide, options, runner) {
|
|
45842
|
+
const outcome = resolvePresentationClick(target, slide);
|
|
45843
|
+
if (outcome.kind === 'action') {
|
|
45844
|
+
runPresentationAction(outcome.action, options, runner);
|
|
45845
|
+
}
|
|
45846
|
+
return outcome.kind;
|
|
45847
|
+
}
|
|
45848
|
+
|
|
44960
45849
|
/**
|
|
44961
45850
|
* Is a rendered slide element *actionable*: does activating it do something?
|
|
44962
45851
|
*
|
|
@@ -44997,10 +45886,14 @@ function elementHasTextHyperlink(element) {
|
|
|
44997
45886
|
*/
|
|
44998
45887
|
function isElementActionable(element, options = {}) {
|
|
44999
45888
|
const { hasActionHandler = true, hasHyperlinkHandler = true, hasZoomHandler = true } = options;
|
|
45000
|
-
|
|
45889
|
+
// `ppaction://noaction` is PowerPoint's "Action: None" - the shape keeps an
|
|
45890
|
+
// `a:hlinkClick` entry (usually to carry a highlight or a sound) but does
|
|
45891
|
+
// nothing. Announcing it as a button was wrong, and in a slide show it made
|
|
45892
|
+
// the shape swallow the click-to-advance instead of letting it through.
|
|
45893
|
+
if (element.actionClick && hasActionHandler && !isNoOpPresentationAction(element.actionClick)) {
|
|
45001
45894
|
return true;
|
|
45002
45895
|
}
|
|
45003
|
-
if (element.actionHover) {
|
|
45896
|
+
if (element.actionHover && !isNoOpPresentationAction(element.actionHover)) {
|
|
45004
45897
|
return true;
|
|
45005
45898
|
}
|
|
45006
45899
|
if (hasHyperlinkHandler && elementHasTextHyperlink(element)) {
|
|
@@ -45113,6 +46006,51 @@ function addTagToCollections(collections) {
|
|
|
45113
46006
|
return collections.map((col, ci) => ci !== 0 ? col : { ...col, tags: [...col.tags, { name: '', value: '' }] });
|
|
45114
46007
|
}
|
|
45115
46008
|
|
|
46009
|
+
/**
|
|
46010
|
+
* Which rendered elements may be CLICKED while a slide show runs.
|
|
46011
|
+
*
|
|
46012
|
+
* In PowerPoint a running show is not a document you can poke at: only shapes
|
|
46013
|
+
* carrying an Action Setting, live media transport and real hyperlinks accept
|
|
46014
|
+
* the pointer. Everything else is scenery, and a click on it belongs to the
|
|
46015
|
+
* show (click-to-advance).
|
|
46016
|
+
*
|
|
46017
|
+
* React encodes that in its element renderer (`pointer-events-none` unless the
|
|
46018
|
+
* element is actionable). The other four bindings left every element hit-
|
|
46019
|
+
* testable, which is invisible until a deck stacks a large decorative shape
|
|
46020
|
+
* OVER its navigation: on the reporter's deck a 675px ring picture is painted
|
|
46021
|
+
* on top of the eight clickable wheel slices, so in Vue / Angular / Vanilla /
|
|
46022
|
+
* Svelte the ring swallowed every click and the slices could not be reached at
|
|
46023
|
+
* all - the show just stepped to the next slide instead.
|
|
46024
|
+
*
|
|
46025
|
+
* The rule is CSS rather than per-element style so a nested case works by
|
|
46026
|
+
* construction: an actionable shape INSIDE an inert group re-enables itself,
|
|
46027
|
+
* which a `pointer-events: none` written onto the group could never do.
|
|
46028
|
+
*
|
|
46029
|
+
* Scoped to `[data-pptx-presenting]`, which
|
|
46030
|
+
* `applyRenderedElementAccessibility` stamps on a stage that is a running show.
|
|
46031
|
+
*
|
|
46032
|
+
* @module render/presentation-hit-test
|
|
46033
|
+
*/
|
|
46034
|
+
/** Marker attribute a binding's stage carries while it is a running show. */
|
|
46035
|
+
const PRESENTATION_STAGE_ATTRIBUTE = 'data-pptx-presenting';
|
|
46036
|
+
/**
|
|
46037
|
+
* Stylesheet text making a running show's scenery pointer-transparent.
|
|
46038
|
+
*
|
|
46039
|
+
* Inject once, alongside the animation keyframes; the attribute scope makes it
|
|
46040
|
+
* inert everywhere else.
|
|
46041
|
+
*/
|
|
46042
|
+
const PRESENTATION_HIT_TEST_CSS = `
|
|
46043
|
+
[${PRESENTATION_STAGE_ATTRIBUTE}] [data-element-id] {
|
|
46044
|
+
pointer-events: none;
|
|
46045
|
+
}
|
|
46046
|
+
[${PRESENTATION_STAGE_ATTRIBUTE}] [data-pptx-action],
|
|
46047
|
+
[${PRESENTATION_STAGE_ATTRIBUTE}] [data-element-id] a[href],
|
|
46048
|
+
[${PRESENTATION_STAGE_ATTRIBUTE}] [data-element-id] video[controls],
|
|
46049
|
+
[${PRESENTATION_STAGE_ATTRIBUTE}] [data-element-id] audio[controls] {
|
|
46050
|
+
pointer-events: auto;
|
|
46051
|
+
}
|
|
46052
|
+
`;
|
|
46053
|
+
|
|
45116
46054
|
function flattenElements(elements) {
|
|
45117
46055
|
const flattened = [];
|
|
45118
46056
|
for (const element of elements) {
|
|
@@ -45124,7 +46062,15 @@ function flattenElements(elements) {
|
|
|
45124
46062
|
return flattened;
|
|
45125
46063
|
}
|
|
45126
46064
|
/** Apply the shared role and accessible-name model at a rendered stage boundary. */
|
|
45127
|
-
function applyRenderedElementAccessibility(stage, elements) {
|
|
46065
|
+
function applyRenderedElementAccessibility(stage, elements, options = {}) {
|
|
46066
|
+
if (typeof Element !== 'undefined' && stage instanceof Element) {
|
|
46067
|
+
if (options.presenting) {
|
|
46068
|
+
stage.setAttribute(PRESENTATION_STAGE_ATTRIBUTE, 'true');
|
|
46069
|
+
}
|
|
46070
|
+
else {
|
|
46071
|
+
stage.removeAttribute(PRESENTATION_STAGE_ATTRIBUTE);
|
|
46072
|
+
}
|
|
46073
|
+
}
|
|
45128
46074
|
let applied = 0;
|
|
45129
46075
|
for (const element of flattenElements(elements)) {
|
|
45130
46076
|
const escapedId = typeof CSS !== 'undefined' && typeof CSS.escape === 'function'
|
|
@@ -45136,7 +46082,20 @@ function applyRenderedElementAccessibility(stage, elements) {
|
|
|
45136
46082
|
}
|
|
45137
46083
|
// Actionable elements (click/hover action, text hyperlink, zoom tile) are
|
|
45138
46084
|
// announced as buttons, matching React's element renderer.
|
|
45139
|
-
const
|
|
46085
|
+
const actionable = isElementActionable(element);
|
|
46086
|
+
// `data-pptx-action` is the neutral marker
|
|
46087
|
+
// `PRESENTATION_INERT_CLICK_SELECTOR` keys off: an element that owns its
|
|
46088
|
+
// own click must never ALSO step the slide show on. Only React stamped it
|
|
46089
|
+
// (and only on its static renderer), so on a deck whose navigation is
|
|
46090
|
+
// on-slide action shapes every other binding advanced the show instead of
|
|
46091
|
+
// following the link.
|
|
46092
|
+
if (actionable) {
|
|
46093
|
+
node.setAttribute('data-pptx-action', 'click');
|
|
46094
|
+
}
|
|
46095
|
+
else {
|
|
46096
|
+
node.removeAttribute('data-pptx-action');
|
|
46097
|
+
}
|
|
46098
|
+
const role = getAriaRole(element, { actionable });
|
|
45140
46099
|
if (role) {
|
|
45141
46100
|
node.setAttribute('role', role);
|
|
45142
46101
|
}
|
|
@@ -48821,114 +49780,6 @@ function updateViewerPreference(preferences, key, value) {
|
|
|
48821
49780
|
return { ...preferences, [key]: value };
|
|
48822
49781
|
}
|
|
48823
49782
|
|
|
48824
|
-
function shouldLoopContinuously(input) {
|
|
48825
|
-
return Boolean(input.loopContinuously) || input.showType === 'kiosk';
|
|
48826
|
-
}
|
|
48827
|
-
/**
|
|
48828
|
-
* PowerPoint's "On Mouse Click" advance gate. An on-slide click / tap / swipe
|
|
48829
|
-
* advances the show only when the current slide's transition allows it: a slide
|
|
48830
|
-
* whose transition sets `advanceOnClick` to false is advanced solely by timings
|
|
48831
|
-
* or by explicit navigation (keyboard, on-screen next/prev buttons). An
|
|
48832
|
-
* undefined flag defaults to allowed, preserving the historical
|
|
48833
|
-
* click-to-advance behaviour.
|
|
48834
|
-
*
|
|
48835
|
-
* Only the click / tap / swipe advance may consult this. Keyboard, on-screen
|
|
48836
|
-
* next/prev buttons and timed auto-advance must never be gated by it.
|
|
48837
|
-
*/
|
|
48838
|
-
function isClickAdvanceAllowed(slide) {
|
|
48839
|
-
return slide?.transition?.advanceOnClick !== false;
|
|
48840
|
-
}
|
|
48841
|
-
/**
|
|
48842
|
-
* PowerPoint's "After: <n>" timed advance (`p:transition/@advTm`, milliseconds).
|
|
48843
|
-
*
|
|
48844
|
-
* Returns the delay a slide show must wait before stepping to the next slide on
|
|
48845
|
-
* its own, or `undefined` when the slide waits for input instead. Timings are
|
|
48846
|
-
* honoured unless the show is explicitly set to manual advance
|
|
48847
|
-
* (`PptxPresentationProperties.advanceMode === 'manual'`, surfaced here as
|
|
48848
|
-
* `useTimings: false`); an unset flag keeps them, matching PowerPoint's default
|
|
48849
|
-
* "Using timings, if present".
|
|
48850
|
-
*
|
|
48851
|
-
* This pairs with {@link isClickAdvanceAllowed}: a slide authored with
|
|
48852
|
-
* `advClick="0" advTm="…"` is advanced ONLY by this timer, so a binding that
|
|
48853
|
-
* honours the click gate without also running the timer leaves the show
|
|
48854
|
-
* permanently stuck on that slide with no visible response to input.
|
|
48855
|
-
*/
|
|
48856
|
-
function resolveAutoAdvanceDelayMs(slide, options) {
|
|
48857
|
-
if (options?.useTimings === false) {
|
|
48858
|
-
return undefined;
|
|
48859
|
-
}
|
|
48860
|
-
const advanceAfterMs = slide?.transition?.advanceAfterMs;
|
|
48861
|
-
if (typeof advanceAfterMs !== 'number' ||
|
|
48862
|
-
!Number.isFinite(advanceAfterMs) ||
|
|
48863
|
-
advanceAfterMs < 0) {
|
|
48864
|
-
return undefined;
|
|
48865
|
-
}
|
|
48866
|
-
return advanceAfterMs;
|
|
48867
|
-
}
|
|
48868
|
-
/**
|
|
48869
|
-
* Click targets that own their own click during a running show and must never
|
|
48870
|
-
* also step the slide on: hyperlinks and action buttons (PowerPoint follows the
|
|
48871
|
-
* link instead of advancing), media transport, form controls, and anything
|
|
48872
|
-
* inside a dialog. `[data-pptx-action]` is the attribute every binding stamps
|
|
48873
|
-
* on an element carrying an on-click action.
|
|
48874
|
-
*/
|
|
48875
|
-
const PRESENTATION_INERT_CLICK_SELECTOR = 'a, button, input, select, textarea, video, audio, [data-pptx-action], [role="dialog"]';
|
|
48876
|
-
/**
|
|
48877
|
-
* A media element only owns its click while it exposes native transport: with
|
|
48878
|
-
* no controls there is nothing on it to click, so it is as inert as any other
|
|
48879
|
-
* picture. This matters for a full-bleed background video, which covers the
|
|
48880
|
-
* ENTIRE slide: treating it as interactive would swallow every click on that
|
|
48881
|
-
* slide and leave the presenter unable to advance at all.
|
|
48882
|
-
*/
|
|
48883
|
-
function isInertMedia(node) {
|
|
48884
|
-
return ((node.tagName === 'VIDEO' || node.tagName === 'AUDIO') && !node.controls);
|
|
48885
|
-
}
|
|
48886
|
-
/**
|
|
48887
|
-
* Whether a click on `target` is PowerPoint's "On Mouse Click" advance rather
|
|
48888
|
-
* than an interaction with live slide content or show chrome.
|
|
48889
|
-
*
|
|
48890
|
-
* Only decides whether the click *reaches* the advance; whether the advance is
|
|
48891
|
-
* then allowed is {@link isClickAdvanceAllowed}'s job.
|
|
48892
|
-
*/
|
|
48893
|
-
function isPresentationAdvanceClick(target) {
|
|
48894
|
-
if (typeof Element === 'undefined' || !(target instanceof Element)) {
|
|
48895
|
-
return false;
|
|
48896
|
-
}
|
|
48897
|
-
for (let node = target; node !== null; node = node.parentElement) {
|
|
48898
|
-
if (isInertMedia(node)) {
|
|
48899
|
-
continue;
|
|
48900
|
-
}
|
|
48901
|
-
if (node.matches(PRESENTATION_INERT_CLICK_SELECTOR)) {
|
|
48902
|
-
return false;
|
|
48903
|
-
}
|
|
48904
|
-
}
|
|
48905
|
-
return true;
|
|
48906
|
-
}
|
|
48907
|
-
function applyRehearsalTimings(slides, timings) {
|
|
48908
|
-
return slides.map((slide, index) => {
|
|
48909
|
-
const advanceAfterMs = timings[index];
|
|
48910
|
-
if (typeof advanceAfterMs !== 'number') {
|
|
48911
|
-
return slide;
|
|
48912
|
-
}
|
|
48913
|
-
return {
|
|
48914
|
-
...slide,
|
|
48915
|
-
transition: {
|
|
48916
|
-
...slide.transition,
|
|
48917
|
-
type: slide.transition?.type ?? 'none',
|
|
48918
|
-
advanceAfterMs,
|
|
48919
|
-
},
|
|
48920
|
-
};
|
|
48921
|
-
});
|
|
48922
|
-
}
|
|
48923
|
-
function sortEntranceAnimations(animations) {
|
|
48924
|
-
return [...animations]
|
|
48925
|
-
.filter(({ entrance }) => Boolean(entrance))
|
|
48926
|
-
.sort((left, right) => (left.order ?? Number.MAX_SAFE_INTEGER) - (right.order ?? Number.MAX_SAFE_INTEGER));
|
|
48927
|
-
}
|
|
48928
|
-
function computeEntranceAnimationDelay(delayMs, animationIndex) {
|
|
48929
|
-
return Math.max(0, delayMs || 0) + animationIndex * 60;
|
|
48930
|
-
}
|
|
48931
|
-
|
|
48932
49783
|
/**
|
|
48933
49784
|
* presentation-show-order.ts: which slides a running slide show visits, and in
|
|
48934
49785
|
* what order.
|
|
@@ -49102,6 +49953,89 @@ function lastShowSlideIndex(showIndexes) {
|
|
|
49102
49953
|
return showIndexes.length > 0 ? showIndexes[showIndexes.length - 1] : undefined;
|
|
49103
49954
|
}
|
|
49104
49955
|
|
|
49956
|
+
/**
|
|
49957
|
+
* hidden-slide-cue.ts: the one contract every binding uses to mark a slide the
|
|
49958
|
+
* author hid (`p:sld/@show="0"`, parsed by core into `PptxSlide.hidden`) in a
|
|
49959
|
+
* thumbnail rail or a slide sorter.
|
|
49960
|
+
*
|
|
49961
|
+
* Hiding a slide only removes it from the SHOW (see `presentation-show-order`);
|
|
49962
|
+
* the slide stays in the deck, the rail and the sorter. That makes the cue the
|
|
49963
|
+
* only way a user can tell the difference between a slide that will present and
|
|
49964
|
+
* one that will silently be skipped, so it has to be present, legible and
|
|
49965
|
+
* announced, in every binding, or the feature is invisible where it is missing.
|
|
49966
|
+
*
|
|
49967
|
+
* Three separate signals, on purpose:
|
|
49968
|
+
*
|
|
49969
|
+
* 1. `marker` -> `data-pptx-slide-hidden="true"` on the tile. A neutral,
|
|
49970
|
+
* framework-agnostic hook so a spec can assert the state without knowing
|
|
49971
|
+
* which binding rendered it, and without depending on class names that are
|
|
49972
|
+
* Tailwind in two bindings and hand-written CSS in three.
|
|
49973
|
+
* 2. `slashGradient` -> a diagonal line struck through the slide number. This
|
|
49974
|
+
* is PowerPoint's own cue and, unlike dimming, it is a SHAPE: colour alone
|
|
49975
|
+
* is not an accessible signal, and a dimmed tile is indistinguishable from a
|
|
49976
|
+
* dark thumbnail. Shipped as one shared gradient string rather than five
|
|
49977
|
+
* hand-drawn slashes so the mark is literally identical everywhere.
|
|
49978
|
+
* 3. `labelId` -> the id of a "Hidden" text node the tile points at with
|
|
49979
|
+
* `aria-describedby`. Deliberately NOT folded into the tile's `aria-label`:
|
|
49980
|
+
* "Go to slide {{n}}" is the accessible name the whole e2e suite and every
|
|
49981
|
+
* binding's parity spec pins, so the state ships as a DESCRIPTION, which
|
|
49982
|
+
* assistive tech announces after the name and which no name matcher sees.
|
|
49983
|
+
*
|
|
49984
|
+
* Framework-agnostic: no React, Vue, Angular, Svelte or DOM imports.
|
|
49985
|
+
*/
|
|
49986
|
+
/**
|
|
49987
|
+
* Attribute a rail or sorter tile carries while its slide is hidden.
|
|
49988
|
+
*
|
|
49989
|
+
* Present-or-absent rather than `="false"`, so `[data-pptx-slide-hidden]` is a
|
|
49990
|
+
* valid CSS/locator selector on its own.
|
|
49991
|
+
*/
|
|
49992
|
+
const HIDDEN_SLIDE_ATTRIBUTE = 'data-pptx-slide-hidden';
|
|
49993
|
+
/**
|
|
49994
|
+
* The dictionary key for the single word shown and announced for the state.
|
|
49995
|
+
* Reused from the sorter rather than duplicated per surface: one string to
|
|
49996
|
+
* translate, and one string a user learns to recognise.
|
|
49997
|
+
*/
|
|
49998
|
+
const HIDDEN_SLIDE_LABEL_KEY = 'pptx.slideSorter.hidden';
|
|
49999
|
+
/**
|
|
50000
|
+
* The diagonal slash struck through a hidden slide's number, as a CSS
|
|
50001
|
+
* `background-image`.
|
|
50002
|
+
*
|
|
50003
|
+
* Derived from `currentColor` so it inherits whatever the number is painted in
|
|
50004
|
+
* and stays visible in both the light and the dark chrome themes.
|
|
50005
|
+
*
|
|
50006
|
+
* Two details are load-bearing, both found by looking at it rather than by
|
|
50007
|
+
* reasoning about it. The stops are tight, because at the 10px number size the
|
|
50008
|
+
* rails use a thicker line reads as a smudge. And the line is drawn at 60% of
|
|
50009
|
+
* the text colour, so the fully-opaque digit sitting on top of it stays the
|
|
50010
|
+
* darker of the two: at full strength the slash merged with a narrow glyph like
|
|
50011
|
+
* "1" and turned "slide 1, hidden" into "slide ?, hidden".
|
|
50012
|
+
*/
|
|
50013
|
+
const HIDDEN_SLIDE_SLASH_GRADIENT = 'linear-gradient(to top right, transparent 47%, color-mix(in srgb, currentColor 60%, transparent) 47%, color-mix(in srgb, currentColor 60%, transparent) 53%, transparent 53%)';
|
|
50014
|
+
/** Opacity a hidden slide's thumbnail is dimmed to, alongside the slash. */
|
|
50015
|
+
const HIDDEN_SLIDE_DIM_OPACITY = 0.5;
|
|
50016
|
+
/**
|
|
50017
|
+
* The id of a tile's "Hidden" description node.
|
|
50018
|
+
*
|
|
50019
|
+
* `surface` distinguishes the rail from the sorter: both can be mounted at once
|
|
50020
|
+
* (the sorter is an overlay ON TOP of the rail), and two nodes sharing an id
|
|
50021
|
+
* would leave `aria-describedby` pointing at whichever the browser found first.
|
|
50022
|
+
*/
|
|
50023
|
+
function hiddenSlideLabelId(surface, slideIndex) {
|
|
50024
|
+
return `pptx-hidden-slide-${surface}-${slideIndex}`;
|
|
50025
|
+
}
|
|
50026
|
+
/**
|
|
50027
|
+
* Resolve the cue for one tile.
|
|
50028
|
+
*
|
|
50029
|
+
* Takes the flag rather than the slide so a binding can pass its own view model,
|
|
50030
|
+
* and so nothing here has to re-derive a state core already parsed.
|
|
50031
|
+
*/
|
|
50032
|
+
function hiddenSlideCue(hidden, surface, slideIndex) {
|
|
50033
|
+
if (!hidden) {
|
|
50034
|
+
return { hidden: false, labelId: undefined, marker: undefined };
|
|
50035
|
+
}
|
|
50036
|
+
return { hidden: true, labelId: hiddenSlideLabelId(surface, slideIndex), marker: 'true' };
|
|
50037
|
+
}
|
|
50038
|
+
|
|
49105
50039
|
function mergeCaptionResults(resultIndex, results) {
|
|
49106
50040
|
let finalText = '';
|
|
49107
50041
|
let interimText = '';
|
|
@@ -53108,6 +54042,314 @@ function segmentFrameCount(durationMs, fps) {
|
|
|
53108
54042
|
* bare `'pptx-viewer-shared'` specifier (which ng-packagr would externalize).
|
|
53109
54043
|
*/
|
|
53110
54044
|
|
|
54045
|
+
/**
|
|
54046
|
+
* English names for the two animation preset vocabularies, split out of
|
|
54047
|
+
* `translations-en` because 278 mechanical name entries would drown the
|
|
54048
|
+
* hand-written UI copy in that file.
|
|
54049
|
+
*
|
|
54050
|
+
* Two groups live here:
|
|
54051
|
+
*
|
|
54052
|
+
* - the `PptxAnimationPreset` tokens the main dictionary never named, which
|
|
54053
|
+
* a loaded deck can put in a timeline row the moment its OOXML preset maps
|
|
54054
|
+
* onto one of them;
|
|
54055
|
+
* - every entry in `pptx-viewer-core`'s OOXML preset catalogue, keyed by the
|
|
54056
|
+
* slug `animationCatalogPresetLabelKey` derives from the preset id.
|
|
54057
|
+
*
|
|
54058
|
+
* WHY the catalogue is duplicated here rather than read from its `label`
|
|
54059
|
+
* field: the catalogue's labels are English constants baked into a data table
|
|
54060
|
+
* that the parser and writer also use, so a locale has nowhere to override
|
|
54061
|
+
* them. Naming every preset through the dictionary instead is what makes the
|
|
54062
|
+
* German/Spanish/French coverage tests able to prove no preset falls back to
|
|
54063
|
+
* an untranslated string.
|
|
54064
|
+
*
|
|
54065
|
+
* @module i18n/translations-en-animation-presets
|
|
54066
|
+
*/
|
|
54067
|
+
const animationPresetTranslationsEn = {
|
|
54068
|
+
// Editor preset tokens the dictionary never named.
|
|
54069
|
+
'pptx.animation.preset.wheelIn': 'Wheel In',
|
|
54070
|
+
'pptx.animation.preset.blindsIn': 'Blinds In',
|
|
54071
|
+
'pptx.animation.preset.boxIn': 'Box In',
|
|
54072
|
+
'pptx.animation.preset.riseUp': 'Rise Up',
|
|
54073
|
+
'pptx.animation.preset.swivel': 'Swivel',
|
|
54074
|
+
'pptx.animation.preset.expandIn': 'Expand In',
|
|
54075
|
+
'pptx.animation.preset.checkerboardIn': 'Checkerboard In',
|
|
54076
|
+
'pptx.animation.preset.flashIn': 'Flash In',
|
|
54077
|
+
'pptx.animation.preset.peekIn': 'Peek In',
|
|
54078
|
+
'pptx.animation.preset.randomBarsIn': 'Random Bars In',
|
|
54079
|
+
'pptx.animation.preset.spinnerIn': 'Spinner In',
|
|
54080
|
+
'pptx.animation.preset.transparency': 'Transparency',
|
|
54081
|
+
// Entrance catalogue.
|
|
54082
|
+
'pptx.animation.catalogPreset.entr1': 'Appear',
|
|
54083
|
+
'pptx.animation.catalogPreset.entr2': 'Fly In',
|
|
54084
|
+
'pptx.animation.catalogPreset.entr3': 'Blinds',
|
|
54085
|
+
'pptx.animation.catalogPreset.entr4': 'Box',
|
|
54086
|
+
'pptx.animation.catalogPreset.entr5': 'Checkerboard',
|
|
54087
|
+
'pptx.animation.catalogPreset.entr6': 'Circle',
|
|
54088
|
+
'pptx.animation.catalogPreset.entr7': 'Crawl In',
|
|
54089
|
+
'pptx.animation.catalogPreset.entr8': 'Diamond',
|
|
54090
|
+
'pptx.animation.catalogPreset.entr9': 'Dissolve In',
|
|
54091
|
+
'pptx.animation.catalogPreset.entr10': 'Fade',
|
|
54092
|
+
'pptx.animation.catalogPreset.entr11': 'Flash Bulb',
|
|
54093
|
+
'pptx.animation.catalogPreset.entr12': 'Flash Once',
|
|
54094
|
+
'pptx.animation.catalogPreset.entr13': 'Plus',
|
|
54095
|
+
'pptx.animation.catalogPreset.entr14': 'Random Bars',
|
|
54096
|
+
'pptx.animation.catalogPreset.entr15': 'Spiral In',
|
|
54097
|
+
'pptx.animation.catalogPreset.entr16': 'Peek In',
|
|
54098
|
+
'pptx.animation.catalogPreset.entr17': 'Split',
|
|
54099
|
+
'pptx.animation.catalogPreset.entr18': 'Stretch',
|
|
54100
|
+
'pptx.animation.catalogPreset.entr19': 'Strips',
|
|
54101
|
+
'pptx.animation.catalogPreset.entr20': 'Wedge',
|
|
54102
|
+
'pptx.animation.catalogPreset.entr21': 'Wheel',
|
|
54103
|
+
'pptx.animation.catalogPreset.entr22': 'Wipe',
|
|
54104
|
+
'pptx.animation.catalogPreset.entr23': 'Zoom',
|
|
54105
|
+
'pptx.animation.catalogPreset.entr24': 'Random Effects',
|
|
54106
|
+
'pptx.animation.catalogPreset.entr25': 'Boomerang',
|
|
54107
|
+
'pptx.animation.catalogPreset.entr26': 'Rise Up',
|
|
54108
|
+
'pptx.animation.catalogPreset.entr27': 'Credits',
|
|
54109
|
+
'pptx.animation.catalogPreset.entr28': 'Float Up',
|
|
54110
|
+
'pptx.animation.catalogPreset.entr29': 'Pinwheel',
|
|
54111
|
+
'pptx.animation.catalogPreset.entr30': 'Spinner',
|
|
54112
|
+
'pptx.animation.catalogPreset.entr31': 'Expand',
|
|
54113
|
+
'pptx.animation.catalogPreset.entr32': 'Whip',
|
|
54114
|
+
'pptx.animation.catalogPreset.entr33': 'Arrive',
|
|
54115
|
+
'pptx.animation.catalogPreset.entr34': 'Basic Swivel',
|
|
54116
|
+
'pptx.animation.catalogPreset.entr35': 'Beveled Arrival',
|
|
54117
|
+
'pptx.animation.catalogPreset.entr36': 'Curve Up',
|
|
54118
|
+
'pptx.animation.catalogPreset.entr37': 'Bounce',
|
|
54119
|
+
'pptx.animation.catalogPreset.entr38': 'Fold',
|
|
54120
|
+
'pptx.animation.catalogPreset.entr39': 'Faded Swivel',
|
|
54121
|
+
'pptx.animation.catalogPreset.entr40': 'Faded Zoom',
|
|
54122
|
+
'pptx.animation.catalogPreset.entr41': 'Light Speed',
|
|
54123
|
+
'pptx.animation.catalogPreset.entr42': 'Float In',
|
|
54124
|
+
'pptx.animation.catalogPreset.entr43': 'Flip',
|
|
54125
|
+
'pptx.animation.catalogPreset.entr44': 'Glide',
|
|
54126
|
+
'pptx.animation.catalogPreset.entr45': 'Grow & Rotate',
|
|
54127
|
+
'pptx.animation.catalogPreset.entr46': 'Grow with Color',
|
|
54128
|
+
'pptx.animation.catalogPreset.entr47': 'Swivel',
|
|
54129
|
+
'pptx.animation.catalogPreset.entr48': 'Magnify',
|
|
54130
|
+
'pptx.animation.catalogPreset.entr49': 'Pinwheel IV',
|
|
54131
|
+
'pptx.animation.catalogPreset.entr50': 'Sling',
|
|
54132
|
+
'pptx.animation.catalogPreset.entr51': 'Compress',
|
|
54133
|
+
'pptx.animation.catalogPreset.entr52': 'Unfold',
|
|
54134
|
+
'pptx.animation.catalogPreset.entr53': 'Grow & Turn',
|
|
54135
|
+
'pptx.animation.catalogPreset.entr54': 'Zoom Rotate',
|
|
54136
|
+
'pptx.animation.catalogPreset.entr55': 'Curvy Star',
|
|
54137
|
+
'pptx.animation.catalogPreset.entr56': 'Rotate',
|
|
54138
|
+
'pptx.animation.catalogPreset.entr57': 'Center Revolve',
|
|
54139
|
+
'pptx.animation.catalogPreset.entr58': 'Thread',
|
|
54140
|
+
'pptx.animation.catalogPreset.entr59': 'Drop In',
|
|
54141
|
+
'pptx.animation.catalogPreset.entr60': 'Ascend',
|
|
54142
|
+
'pptx.animation.catalogPreset.entr61': 'Descend',
|
|
54143
|
+
'pptx.animation.catalogPreset.entr62': 'Center Stage',
|
|
54144
|
+
'pptx.animation.catalogPreset.entr63': 'Ease In',
|
|
54145
|
+
'pptx.animation.catalogPreset.entr64': 'Stretchy',
|
|
54146
|
+
'pptx.animation.catalogPreset.entr65': 'Zip',
|
|
54147
|
+
'pptx.animation.catalogPreset.entr66': 'Bars',
|
|
54148
|
+
'pptx.animation.catalogPreset.entr67': 'Cover',
|
|
54149
|
+
'pptx.animation.catalogPreset.entr68': 'Reveal',
|
|
54150
|
+
// Exit catalogue.
|
|
54151
|
+
'pptx.animation.catalogPreset.exit1': 'Disappear',
|
|
54152
|
+
'pptx.animation.catalogPreset.exit2': 'Fly Out',
|
|
54153
|
+
'pptx.animation.catalogPreset.exit3': 'Blinds',
|
|
54154
|
+
'pptx.animation.catalogPreset.exit4': 'Box',
|
|
54155
|
+
'pptx.animation.catalogPreset.exit5': 'Checkerboard',
|
|
54156
|
+
'pptx.animation.catalogPreset.exit6': 'Circle',
|
|
54157
|
+
'pptx.animation.catalogPreset.exit7': 'Crawl Out',
|
|
54158
|
+
'pptx.animation.catalogPreset.exit8': 'Diamond',
|
|
54159
|
+
'pptx.animation.catalogPreset.exit9': 'Dissolve Out',
|
|
54160
|
+
'pptx.animation.catalogPreset.exit10': 'Fade',
|
|
54161
|
+
'pptx.animation.catalogPreset.exit11': 'Flash Bulb',
|
|
54162
|
+
'pptx.animation.catalogPreset.exit12': 'Flash Once',
|
|
54163
|
+
'pptx.animation.catalogPreset.exit13': 'Plus',
|
|
54164
|
+
'pptx.animation.catalogPreset.exit14': 'Random Bars',
|
|
54165
|
+
'pptx.animation.catalogPreset.exit15': 'Spiral Out',
|
|
54166
|
+
'pptx.animation.catalogPreset.exit16': 'Peek Out',
|
|
54167
|
+
'pptx.animation.catalogPreset.exit17': 'Split',
|
|
54168
|
+
'pptx.animation.catalogPreset.exit18': 'Collapse',
|
|
54169
|
+
'pptx.animation.catalogPreset.exit19': 'Strips',
|
|
54170
|
+
'pptx.animation.catalogPreset.exit20': 'Wedge',
|
|
54171
|
+
'pptx.animation.catalogPreset.exit21': 'Wheel',
|
|
54172
|
+
'pptx.animation.catalogPreset.exit22': 'Wipe',
|
|
54173
|
+
'pptx.animation.catalogPreset.exit23': 'Zoom',
|
|
54174
|
+
'pptx.animation.catalogPreset.exit24': 'Random Effects',
|
|
54175
|
+
'pptx.animation.catalogPreset.exit25': 'Boomerang',
|
|
54176
|
+
'pptx.animation.catalogPreset.exit26': 'Sink Down',
|
|
54177
|
+
'pptx.animation.catalogPreset.exit27': 'Credits',
|
|
54178
|
+
'pptx.animation.catalogPreset.exit28': 'Float Down',
|
|
54179
|
+
'pptx.animation.catalogPreset.exit29': 'Pinwheel',
|
|
54180
|
+
'pptx.animation.catalogPreset.exit30': 'Spinner',
|
|
54181
|
+
'pptx.animation.catalogPreset.exit31': 'Contract',
|
|
54182
|
+
'pptx.animation.catalogPreset.exit32': 'Whip',
|
|
54183
|
+
'pptx.animation.catalogPreset.exit33': 'Leave',
|
|
54184
|
+
'pptx.animation.catalogPreset.exit34': 'Basic Swivel',
|
|
54185
|
+
'pptx.animation.catalogPreset.exit35': 'Beveled Departure',
|
|
54186
|
+
'pptx.animation.catalogPreset.exit36': 'Curve Down',
|
|
54187
|
+
'pptx.animation.catalogPreset.exit37': 'Bounce',
|
|
54188
|
+
'pptx.animation.catalogPreset.exit38': 'Unfold',
|
|
54189
|
+
'pptx.animation.catalogPreset.exit39': 'Faded Swivel',
|
|
54190
|
+
'pptx.animation.catalogPreset.exit40': 'Faded Zoom',
|
|
54191
|
+
'pptx.animation.catalogPreset.exit41': 'Light Speed',
|
|
54192
|
+
'pptx.animation.catalogPreset.exit42': 'Float Out',
|
|
54193
|
+
'pptx.animation.catalogPreset.exit43': 'Flip',
|
|
54194
|
+
'pptx.animation.catalogPreset.exit44': 'Glide',
|
|
54195
|
+
'pptx.animation.catalogPreset.exit45': 'Shrink & Rotate',
|
|
54196
|
+
'pptx.animation.catalogPreset.exit46': 'Shrink with Color',
|
|
54197
|
+
'pptx.animation.catalogPreset.exit47': 'Swivel',
|
|
54198
|
+
'pptx.animation.catalogPreset.exit48': 'Shrink & Turn',
|
|
54199
|
+
'pptx.animation.catalogPreset.exit49': 'Pinwheel IV',
|
|
54200
|
+
'pptx.animation.catalogPreset.exit50': 'Sling',
|
|
54201
|
+
'pptx.animation.catalogPreset.exit51': 'Stretch Out',
|
|
54202
|
+
'pptx.animation.catalogPreset.exit52': 'Fold Out',
|
|
54203
|
+
'pptx.animation.catalogPreset.exit53': 'Shrink & Spin',
|
|
54204
|
+
'pptx.animation.catalogPreset.exit54': 'Zoom Rotate',
|
|
54205
|
+
'pptx.animation.catalogPreset.exit55': 'Curvy Star',
|
|
54206
|
+
'pptx.animation.catalogPreset.exit56': 'Rotate',
|
|
54207
|
+
'pptx.animation.catalogPreset.exit57': 'Center Revolve',
|
|
54208
|
+
'pptx.animation.catalogPreset.exit58': 'Thread Out',
|
|
54209
|
+
'pptx.animation.catalogPreset.exit59': 'Drop Out',
|
|
54210
|
+
'pptx.animation.catalogPreset.exit60': 'Ascend',
|
|
54211
|
+
'pptx.animation.catalogPreset.exit61': 'Descend',
|
|
54212
|
+
'pptx.animation.catalogPreset.exit62': 'Exit Stage',
|
|
54213
|
+
'pptx.animation.catalogPreset.exit63': 'Ease Out',
|
|
54214
|
+
'pptx.animation.catalogPreset.exit64': 'Stretchy',
|
|
54215
|
+
'pptx.animation.catalogPreset.exit65': 'Zip Out',
|
|
54216
|
+
'pptx.animation.catalogPreset.exit66': 'Bars Out',
|
|
54217
|
+
'pptx.animation.catalogPreset.exit67': 'Uncover',
|
|
54218
|
+
'pptx.animation.catalogPreset.exit68': 'Conceal',
|
|
54219
|
+
// Emphasis catalogue.
|
|
54220
|
+
'pptx.animation.catalogPreset.emph1': 'Bold Flash',
|
|
54221
|
+
'pptx.animation.catalogPreset.emph2': 'Color Wave',
|
|
54222
|
+
'pptx.animation.catalogPreset.emph3': 'Brush on Color',
|
|
54223
|
+
'pptx.animation.catalogPreset.emph4': 'Brush on Underline',
|
|
54224
|
+
'pptx.animation.catalogPreset.emph5': 'Change Font',
|
|
54225
|
+
'pptx.animation.catalogPreset.emph6': 'Grow/Shrink',
|
|
54226
|
+
'pptx.animation.catalogPreset.emph7': 'Change Font Color',
|
|
54227
|
+
'pptx.animation.catalogPreset.emph8': 'Spin',
|
|
54228
|
+
'pptx.animation.catalogPreset.emph9': 'Transparency',
|
|
54229
|
+
'pptx.animation.catalogPreset.emph10': 'Change Font Size',
|
|
54230
|
+
'pptx.animation.catalogPreset.emph11': 'Change Font Style',
|
|
54231
|
+
'pptx.animation.catalogPreset.emph12': 'Grow with Color',
|
|
54232
|
+
'pptx.animation.catalogPreset.emph13': 'Desaturate',
|
|
54233
|
+
'pptx.animation.catalogPreset.emph14': 'Teeter',
|
|
54234
|
+
'pptx.animation.catalogPreset.emph15': 'Vertical Highlight',
|
|
54235
|
+
'pptx.animation.catalogPreset.emph16': 'Wave',
|
|
54236
|
+
'pptx.animation.catalogPreset.emph17': 'Blast',
|
|
54237
|
+
'pptx.animation.catalogPreset.emph18': 'Bold Reveal',
|
|
54238
|
+
'pptx.animation.catalogPreset.emph19': 'Wash Out',
|
|
54239
|
+
'pptx.animation.catalogPreset.emph20': 'Shimmer',
|
|
54240
|
+
'pptx.animation.catalogPreset.emph21': 'Flicker',
|
|
54241
|
+
'pptx.animation.catalogPreset.emph22': 'Grow with Color (Sustain)',
|
|
54242
|
+
'pptx.animation.catalogPreset.emph23': 'Lighten',
|
|
54243
|
+
'pptx.animation.catalogPreset.emph24': 'Darken',
|
|
54244
|
+
'pptx.animation.catalogPreset.emph25': 'Style Emphasis',
|
|
54245
|
+
'pptx.animation.catalogPreset.emph26': 'Pulse',
|
|
54246
|
+
'pptx.animation.catalogPreset.emph27': 'Color Pulse',
|
|
54247
|
+
'pptx.animation.catalogPreset.emph28': 'Color Blend',
|
|
54248
|
+
'pptx.animation.catalogPreset.emph29': 'Complementary Color',
|
|
54249
|
+
'pptx.animation.catalogPreset.emph30': 'Complementary Color 2',
|
|
54250
|
+
'pptx.animation.catalogPreset.emph31': 'Contrasting Color',
|
|
54251
|
+
'pptx.animation.catalogPreset.emph32': 'Pulse Once',
|
|
54252
|
+
'pptx.animation.catalogPreset.emph33': 'Underline',
|
|
54253
|
+
'pptx.animation.catalogPreset.emph34': 'Bold Flash (Variant)',
|
|
54254
|
+
'pptx.animation.catalogPreset.emph35': 'Teeter (Variant)',
|
|
54255
|
+
'pptx.animation.catalogPreset.emph36': 'Wave (Variant)',
|
|
54256
|
+
'pptx.animation.catalogPreset.emph37': 'Object Color',
|
|
54257
|
+
'pptx.animation.catalogPreset.emph38': 'Fill Color',
|
|
54258
|
+
'pptx.animation.catalogPreset.emph39': 'Line Color',
|
|
54259
|
+
'pptx.animation.catalogPreset.emph40': 'Brush on Color (Sustain)',
|
|
54260
|
+
'pptx.animation.catalogPreset.emph41': 'Color Wave (Sustain)',
|
|
54261
|
+
'pptx.animation.catalogPreset.emph42': 'Flash',
|
|
54262
|
+
'pptx.animation.catalogPreset.emph43': 'Flicker Slow',
|
|
54263
|
+
'pptx.animation.catalogPreset.emph44': 'Grow Big',
|
|
54264
|
+
'pptx.animation.catalogPreset.emph45': 'Shrink Small',
|
|
54265
|
+
'pptx.animation.catalogPreset.emph46': 'Color Lighten',
|
|
54266
|
+
'pptx.animation.catalogPreset.emph47': 'Color Darken',
|
|
54267
|
+
'pptx.animation.catalogPreset.emph48': 'Bold Italics',
|
|
54268
|
+
'pptx.animation.catalogPreset.emph49': 'Spin Slow',
|
|
54269
|
+
'pptx.animation.catalogPreset.emph50': 'Spin Fast',
|
|
54270
|
+
'pptx.animation.catalogPreset.emph51': 'Wobble',
|
|
54271
|
+
'pptx.animation.catalogPreset.emph52': 'Jiggle',
|
|
54272
|
+
'pptx.animation.catalogPreset.emph53': 'Bounce In Place',
|
|
54273
|
+
'pptx.animation.catalogPreset.emph54': 'Heartbeat',
|
|
54274
|
+
'pptx.animation.catalogPreset.emph55': 'Glow',
|
|
54275
|
+
'pptx.animation.catalogPreset.emph56': 'Brighten',
|
|
54276
|
+
'pptx.animation.catalogPreset.emph57': 'Dim',
|
|
54277
|
+
'pptx.animation.catalogPreset.emph58': 'Saturate',
|
|
54278
|
+
'pptx.animation.catalogPreset.emph59': 'Color Cycle',
|
|
54279
|
+
'pptx.animation.catalogPreset.emph60': 'Rainbow',
|
|
54280
|
+
'pptx.animation.catalogPreset.emph61': 'Shake',
|
|
54281
|
+
'pptx.animation.catalogPreset.emph62': 'Vibrate',
|
|
54282
|
+
'pptx.animation.catalogPreset.emph63': 'Sway',
|
|
54283
|
+
'pptx.animation.catalogPreset.emph64': 'Bob',
|
|
54284
|
+
// Motion path catalogue.
|
|
54285
|
+
'pptx.animation.catalogPreset.pathLineUp': 'Lines: Up',
|
|
54286
|
+
'pptx.animation.catalogPreset.pathLineDown': 'Lines: Down',
|
|
54287
|
+
'pptx.animation.catalogPreset.pathLineLeft': 'Lines: Left',
|
|
54288
|
+
'pptx.animation.catalogPreset.pathLineRight': 'Lines: Right',
|
|
54289
|
+
'pptx.animation.catalogPreset.pathLineUpLeft': 'Lines: Up-Left',
|
|
54290
|
+
'pptx.animation.catalogPreset.pathLineUpRight': 'Lines: Up-Right',
|
|
54291
|
+
'pptx.animation.catalogPreset.pathLineDownLeft': 'Lines: Down-Left',
|
|
54292
|
+
'pptx.animation.catalogPreset.pathLineDownRight': 'Lines: Down-Right',
|
|
54293
|
+
'pptx.animation.catalogPreset.pathArcUp': 'Arcs: Up',
|
|
54294
|
+
'pptx.animation.catalogPreset.pathArcDown': 'Arcs: Down',
|
|
54295
|
+
'pptx.animation.catalogPreset.pathArcLeft': 'Arcs: Left',
|
|
54296
|
+
'pptx.animation.catalogPreset.pathArcRight': 'Arcs: Right',
|
|
54297
|
+
'pptx.animation.catalogPreset.pathTurnUpLeft': 'Turns: Up-Left',
|
|
54298
|
+
'pptx.animation.catalogPreset.pathTurnUpRight': 'Turns: Up-Right',
|
|
54299
|
+
'pptx.animation.catalogPreset.pathTurnDownLeft': 'Turns: Down-Left',
|
|
54300
|
+
'pptx.animation.catalogPreset.pathTurnDownRight': 'Turns: Down-Right',
|
|
54301
|
+
'pptx.animation.catalogPreset.pathTurnUTurn': 'Turns: U-Turn',
|
|
54302
|
+
'pptx.animation.catalogPreset.pathCircle': 'Shapes: Circle',
|
|
54303
|
+
'pptx.animation.catalogPreset.pathDiamond': 'Shapes: Diamond',
|
|
54304
|
+
'pptx.animation.catalogPreset.pathHexagon': 'Shapes: Hexagon',
|
|
54305
|
+
'pptx.animation.catalogPreset.pathOctagon': 'Shapes: Octagon',
|
|
54306
|
+
'pptx.animation.catalogPreset.pathParallelogram': 'Shapes: Parallelogram',
|
|
54307
|
+
'pptx.animation.catalogPreset.pathPentagon': 'Shapes: Pentagon',
|
|
54308
|
+
'pptx.animation.catalogPreset.pathRightTriangle': 'Shapes: Right Triangle',
|
|
54309
|
+
'pptx.animation.catalogPreset.pathEquilateralTriangle': 'Shapes: Equilateral Triangle',
|
|
54310
|
+
'pptx.animation.catalogPreset.pathTrapezoid': 'Shapes: Trapezoid',
|
|
54311
|
+
'pptx.animation.catalogPreset.pathSquare': 'Shapes: Square',
|
|
54312
|
+
'pptx.animation.catalogPreset.pathStar4': 'Shapes: 4 Point Star',
|
|
54313
|
+
'pptx.animation.catalogPreset.pathStar5': 'Shapes: 5 Point Star',
|
|
54314
|
+
'pptx.animation.catalogPreset.pathStar6': 'Shapes: 6 Point Star',
|
|
54315
|
+
'pptx.animation.catalogPreset.pathStar8': 'Shapes: 8 Point Star',
|
|
54316
|
+
'pptx.animation.catalogPreset.pathCrescent': 'Shapes: Crescent Moon',
|
|
54317
|
+
'pptx.animation.catalogPreset.pathHeart': 'Shapes: Heart',
|
|
54318
|
+
'pptx.animation.catalogPreset.pathFootball': 'Shapes: Football',
|
|
54319
|
+
'pptx.animation.catalogPreset.pathTeardrop': 'Shapes: Teardrop',
|
|
54320
|
+
'pptx.animation.catalogPreset.pathLoopDeCay': 'Loops: Decaying Wave',
|
|
54321
|
+
'pptx.animation.catalogPreset.pathLoopFigure8': 'Loops: Figure 8',
|
|
54322
|
+
'pptx.animation.catalogPreset.pathLoopFigure8Four': 'Loops: Figure 8 Four',
|
|
54323
|
+
'pptx.animation.catalogPreset.pathLoopHorizFigure8': 'Loops: Horizontal Figure 8',
|
|
54324
|
+
'pptx.animation.catalogPreset.pathLoopVertFigure8': 'Loops: Vertical Figure 8',
|
|
54325
|
+
'pptx.animation.catalogPreset.pathLoopLoopDeLoop': 'Loops: Loop de Loop',
|
|
54326
|
+
'pptx.animation.catalogPreset.pathLoopNeutron': 'Loops: Neutron',
|
|
54327
|
+
'pptx.animation.catalogPreset.pathLoopPeanut': 'Loops: Peanut',
|
|
54328
|
+
'pptx.animation.catalogPreset.pathLoopPretzel': 'Loops: Pretzel',
|
|
54329
|
+
'pptx.animation.catalogPreset.pathLoopSpring': 'Loops: Spring',
|
|
54330
|
+
'pptx.animation.catalogPreset.pathLoopSwoosh': 'Loops: Swoosh',
|
|
54331
|
+
'pptx.animation.catalogPreset.pathLoopZigzag': 'Loops: Zigzag',
|
|
54332
|
+
'pptx.animation.catalogPreset.pathLoopHeartBeat': 'Loops: Heartbeat',
|
|
54333
|
+
'pptx.animation.catalogPreset.pathLoopCurvyLeft': 'Loops: Curvy Left',
|
|
54334
|
+
'pptx.animation.catalogPreset.pathLoopCurvyRight': 'Loops: Curvy Right',
|
|
54335
|
+
'pptx.animation.catalogPreset.pathLoopCurvyStar': 'Loops: Curvy Star',
|
|
54336
|
+
'pptx.animation.catalogPreset.pathLoopFigure8Side': 'Loops: Figure 8 Side',
|
|
54337
|
+
'pptx.animation.catalogPreset.pathLoopSpiral': 'Loops: Spiral',
|
|
54338
|
+
'pptx.animation.catalogPreset.pathLoopWave': 'Loops: Wave',
|
|
54339
|
+
'pptx.animation.catalogPreset.pathLoopBean': 'Loops: Bean',
|
|
54340
|
+
'pptx.animation.catalogPreset.pathLoopBuzzSaw': 'Loops: Buzz Saw',
|
|
54341
|
+
'pptx.animation.catalogPreset.pathLoopCogwheel': 'Loops: Cogwheel',
|
|
54342
|
+
'pptx.animation.catalogPreset.pathLoopCornerStar': 'Loops: Corner Star',
|
|
54343
|
+
'pptx.animation.catalogPreset.pathLoopCrossPath': 'Loops: Cross',
|
|
54344
|
+
'pptx.animation.catalogPreset.pathLoopDiamond4': 'Loops: Diamond 4',
|
|
54345
|
+
'pptx.animation.catalogPreset.pathLoopFanIn': 'Loops: Fan In',
|
|
54346
|
+
'pptx.animation.catalogPreset.pathLoopFigure8Top': 'Loops: Figure 8 Top',
|
|
54347
|
+
'pptx.animation.catalogPreset.pathLoopHeartBig': 'Loops: Big Heart',
|
|
54348
|
+
'pptx.animation.catalogPreset.pathLoopInverted': 'Loops: Inverted',
|
|
54349
|
+
'pptx.animation.catalogPreset.pathLoopPlus': 'Loops: Plus',
|
|
54350
|
+
'pptx.animation.catalogPreset.pathCustom': 'Custom Path',
|
|
54351
|
+
};
|
|
54352
|
+
|
|
53111
54353
|
/**
|
|
53112
54354
|
* The canonical English UI-string dictionary for pptx-viewer. None of the
|
|
53113
54355
|
* React/Vue/Angular binding packages ship translations themselves - each
|
|
@@ -53118,6 +54360,9 @@ function segmentFrameCount(durationMs, fps) {
|
|
|
53118
54360
|
* instead of drifting into three separate copies.
|
|
53119
54361
|
*/
|
|
53120
54362
|
const translationsEn = {
|
|
54363
|
+
// Animation effect names for both preset vocabularies (278 mechanical
|
|
54364
|
+
// entries), kept in their own module so they don't drown the UI copy here.
|
|
54365
|
+
...animationPresetTranslationsEn,
|
|
53121
54366
|
// Status bar
|
|
53122
54367
|
'pptx.statusBar.allSaved': 'All saved',
|
|
53123
54368
|
'pptx.statusBar.unsavedChanges': 'Unsaved changes',
|
|
@@ -55420,7 +56665,6 @@ const translationsEn = {
|
|
|
55420
56665
|
'pptx.action.slideNumberPlaceholder': 'Slide number (1-based)',
|
|
55421
56666
|
'pptx.animation.trigger.afterDelay': 'After delay',
|
|
55422
56667
|
'pptx.animationPanel.stepsMore': '{{base}} +{{extra}} more',
|
|
55423
|
-
'pptx.arrowhead.arrow': 'Arrow',
|
|
55424
56668
|
'pptx.arrowhead.diamond': 'Diamond',
|
|
55425
56669
|
'pptx.arrowhead.none': 'None',
|
|
55426
56670
|
'pptx.arrowhead.openArrow': 'Open Arrow',
|
|
@@ -58232,7 +59476,7 @@ function createLocalStorageBackend(namespace) {
|
|
|
58232
59476
|
/** Try IndexedDB first; fall back to localStorage on any failure. */
|
|
58233
59477
|
async function resolveBackend(dbName, namespace) {
|
|
58234
59478
|
try {
|
|
58235
|
-
const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-
|
|
59479
|
+
const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-DdlrIrmU.mjs');
|
|
58236
59480
|
const db = await openChatDb(dbName);
|
|
58237
59481
|
return createIdbBackend(db);
|
|
58238
59482
|
}
|
|
@@ -69409,10 +70653,10 @@ function getImageCropShapeClipPath(element) {
|
|
|
69409
70653
|
/** Build the complete shared image-effect view consumed by Angular templates. */
|
|
69410
70654
|
function buildAngularImageRenderView(element) {
|
|
69411
70655
|
const computed = getComputedImageStyle(element);
|
|
70656
|
+
// The fill/crop fit comes from shared so the `<a:srcRect>` source crop is the
|
|
70657
|
+
// same maths in every binding; `[ngStyle]` accepts its camelCase keys.
|
|
69412
70658
|
const imageStyle = {
|
|
69413
|
-
|
|
69414
|
-
height: '100%',
|
|
69415
|
-
'object-fit': 'contain',
|
|
70659
|
+
...getImageFitStyle(element),
|
|
69416
70660
|
display: 'block',
|
|
69417
70661
|
};
|
|
69418
70662
|
if (computed.filter) {
|
|
@@ -69454,7 +70698,13 @@ class ImageRendererComponent {
|
|
|
69454
70698
|
interactive = input(false, /* @ts-ignore */
|
|
69455
70699
|
...(ngDevMode ? [{ debugName: "interactive" }] : /* istanbul ignore next */ []));
|
|
69456
70700
|
sanitizer = inject(DomSanitizer);
|
|
69457
|
-
|
|
70701
|
+
// The clip is load-bearing, not cosmetic: a cropped picture is rendered by
|
|
70702
|
+
// scaling the source up and translating the cropped-away part out of the
|
|
70703
|
+
// frame, so without it the discarded region paints over its neighbours.
|
|
70704
|
+
containerStyle = computed(() => ({
|
|
70705
|
+
...getContainerStyle(this.element(), this.zIndex()),
|
|
70706
|
+
overflow: getImageOverflow(this.element()),
|
|
70707
|
+
}), /* @ts-ignore */
|
|
69458
70708
|
...(ngDevMode ? [{ debugName: "containerStyle" }] : /* istanbul ignore next */ []));
|
|
69459
70709
|
imageSrc = computed(() => getImageSrc(this.element(), this.mediaDataUrls()), /* @ts-ignore */
|
|
69460
70710
|
...(ngDevMode ? [{ debugName: "imageSrc" }] : /* istanbul ignore next */ []));
|
|
@@ -69940,8 +71190,14 @@ function resolveCaptionTracks(tracks) {
|
|
|
69940
71190
|
*
|
|
69941
71191
|
* On the interactive (edit) canvas native controls are suppressed and pointer
|
|
69942
71192
|
* events are disabled so a click selects / moves the element rather than
|
|
69943
|
-
* scrubbing playback
|
|
69944
|
-
*
|
|
71193
|
+
* scrubbing playback.
|
|
71194
|
+
*
|
|
71195
|
+
* They are suppressed during a SHOW too, which the `interactive` gate alone got
|
|
71196
|
+
* backwards: a running show is non-interactive, so it turned the transport ON,
|
|
71197
|
+
* and a full-bleed background video then painted Chrome's own black scrubber
|
|
71198
|
+
* across the bottom of the slide, over the presentation toolbar. PowerPoint
|
|
71199
|
+
* shows no transport during a show either; React gates on the same condition
|
|
71200
|
+
* (`controls={!isPresentationMode}`).
|
|
69945
71201
|
*/
|
|
69946
71202
|
class MediaRendererComponent {
|
|
69947
71203
|
/** The element to render. Playback only occurs when `type === 'media'`. */
|
|
@@ -70026,7 +71282,7 @@ class MediaRendererComponent {
|
|
|
70026
71282
|
class="pptx-ng-media-el pptx-ng-media-audio"
|
|
70027
71283
|
[class.pptx-ng-media-inert]="interactive()"
|
|
70028
71284
|
[src]="src + trimFragment()"
|
|
70029
|
-
[controls]="!interactive()"
|
|
71285
|
+
[controls]="!interactive() && !presenting()"
|
|
70030
71286
|
[loop]="loop()"
|
|
70031
71287
|
preload="metadata"
|
|
70032
71288
|
></audio>
|
|
@@ -70037,7 +71293,7 @@ class MediaRendererComponent {
|
|
|
70037
71293
|
[class.pptx-ng-media-inert]="interactive()"
|
|
70038
71294
|
[src]="src + trimFragment()"
|
|
70039
71295
|
[poster]="poster() ?? null"
|
|
70040
|
-
[controls]="!interactive()"
|
|
71296
|
+
[controls]="!interactive() && !presenting()"
|
|
70041
71297
|
[loop]="loop()"
|
|
70042
71298
|
preload="metadata"
|
|
70043
71299
|
playsInline
|
|
@@ -70086,7 +71342,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
70086
71342
|
class="pptx-ng-media-el pptx-ng-media-audio"
|
|
70087
71343
|
[class.pptx-ng-media-inert]="interactive()"
|
|
70088
71344
|
[src]="src + trimFragment()"
|
|
70089
|
-
[controls]="!interactive()"
|
|
71345
|
+
[controls]="!interactive() && !presenting()"
|
|
70090
71346
|
[loop]="loop()"
|
|
70091
71347
|
preload="metadata"
|
|
70092
71348
|
></audio>
|
|
@@ -70097,7 +71353,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
70097
71353
|
[class.pptx-ng-media-inert]="interactive()"
|
|
70098
71354
|
[src]="src + trimFragment()"
|
|
70099
71355
|
[poster]="poster() ?? null"
|
|
70100
|
-
[controls]="!interactive()"
|
|
71356
|
+
[controls]="!interactive() && !presenting()"
|
|
70101
71357
|
[loop]="loop()"
|
|
70102
71358
|
preload="metadata"
|
|
70103
71359
|
playsInline
|
|
@@ -73303,8 +74559,9 @@ class SlideCanvasComponent {
|
|
|
73303
74559
|
const stage = this.stageRef()?.nativeElement;
|
|
73304
74560
|
const elements = this.allElements();
|
|
73305
74561
|
const interactive = this.interactive();
|
|
73306
|
-
|
|
73307
|
-
|
|
74562
|
+
const presenting = this.presenting();
|
|
74563
|
+
if (stage && (interactive || presenting)) {
|
|
74564
|
+
queueMicrotask(() => applyRenderedElementAccessibility(stage, elements, { presenting }));
|
|
73308
74565
|
}
|
|
73309
74566
|
});
|
|
73310
74567
|
// Observe the viewport so the slide re-fits on container resize / rotation.
|
|
@@ -79813,6 +81070,29 @@ class ViewerPresentationModeService {
|
|
|
79813
81070
|
this.presentingPresenter.set(true);
|
|
79814
81071
|
}
|
|
79815
81072
|
}
|
|
81073
|
+
/**
|
|
81074
|
+
* Swap between the fullscreen show and the presenter (speaker) console, the
|
|
81075
|
+
* show toolbar's presenter-view toggle and PowerPoint's `N`. Mirrors React's
|
|
81076
|
+
* `togglePresenterView`.
|
|
81077
|
+
*
|
|
81078
|
+
* The two are mutually exclusive rather than stacked: the show overlay is
|
|
81079
|
+
* `position: fixed; z-index: 10000` while the console sits inside the viewer
|
|
81080
|
+
* at `z-index: 50`, so leaving both up would paint the show straight over the
|
|
81081
|
+
* console and the toggle would look inert. The full-deck `activeSlideIndex`
|
|
81082
|
+
* is what both read, so the swap keeps the presenter on the same slide.
|
|
81083
|
+
*/
|
|
81084
|
+
togglePresenterView() {
|
|
81085
|
+
if (this.presentingPresenter()) {
|
|
81086
|
+
this.presentingPresenter.set(false);
|
|
81087
|
+
this.presenting.set(true);
|
|
81088
|
+
return;
|
|
81089
|
+
}
|
|
81090
|
+
if (this.presenterStartTime() === null) {
|
|
81091
|
+
this.presenterStartTime.set(Date.now());
|
|
81092
|
+
}
|
|
81093
|
+
this.presentingPresenter.set(true);
|
|
81094
|
+
this.presenting.set(false);
|
|
81095
|
+
}
|
|
79816
81096
|
/** Close the presenter view (and any audience overlay/window it opened). */
|
|
79817
81097
|
exitPresenter() {
|
|
79818
81098
|
this.presentingPresenter.set(false);
|
|
@@ -81166,8 +82446,25 @@ class PresentationInputController {
|
|
|
81166
82446
|
return;
|
|
81167
82447
|
}
|
|
81168
82448
|
}
|
|
82449
|
+
// An on-slide Action Setting (`a:hlinkClick`) outranks the advance:
|
|
82450
|
+
// PowerPoint follows the shape's link and leaves the show where the link
|
|
82451
|
+
// lands, rather than ALSO stepping to the next slide.
|
|
82452
|
+
if (this.handleActionClick(event.target) !== 'advance') {
|
|
82453
|
+
return;
|
|
82454
|
+
}
|
|
81169
82455
|
this.advanceFromClick();
|
|
81170
82456
|
}
|
|
82457
|
+
/**
|
|
82458
|
+
* Run any on-slide action under the pointer, and report what the click left
|
|
82459
|
+
* for the show: only `'advance'` reaches {@link advanceFromClick}.
|
|
82460
|
+
*/
|
|
82461
|
+
handleActionClick(target) {
|
|
82462
|
+
return handlePresentationStageClick(target, this.deps.currentSlide(), { slideCount: this.deps.slides().length }, {
|
|
82463
|
+
goToSlide: (index) => this.deps.navigator.goToSlide(index),
|
|
82464
|
+
move: (direction) => this.deps.navigator.navigate(direction > 0 ? 'next' : 'prev'),
|
|
82465
|
+
endShow: () => this.deps.requestClose(),
|
|
82466
|
+
});
|
|
82467
|
+
}
|
|
81171
82468
|
/**
|
|
81172
82469
|
* Click/tap/swipe advance. Like every forward step it first reveals the
|
|
81173
82470
|
* current slide's next animation build; only once the builds are exhausted
|
|
@@ -81221,7 +82518,9 @@ function ensurePresetAnimationKeyframes() {
|
|
|
81221
82518
|
}
|
|
81222
82519
|
const style = document.createElement('style');
|
|
81223
82520
|
style.setAttribute('data-pptx-ng-animation-keyframes', '');
|
|
81224
|
-
|
|
82521
|
+
// Plus the show's hit-testing rule: scenery is pointer-transparent so a click
|
|
82522
|
+
// reaches the action shape underneath it (or the show's own advance).
|
|
82523
|
+
style.textContent = `${ANIMATION_KEYFRAMES_CSS}\n${PRESENTATION_HIT_TEST_CSS}`;
|
|
81225
82524
|
document.head.appendChild(style);
|
|
81226
82525
|
presetInjected = true;
|
|
81227
82526
|
}
|
|
@@ -81558,20 +82857,28 @@ class PresentationShowNavigator {
|
|
|
81558
82857
|
this.commit(next, transition);
|
|
81559
82858
|
}
|
|
81560
82859
|
/**
|
|
81561
|
-
* Jump directly to `index` (clamped to the slide range). Used by
|
|
81562
|
-
*
|
|
81563
|
-
*
|
|
82860
|
+
* Jump directly to `index` (clamped to the slide range). Used by zoom tiles
|
|
82861
|
+
* and by on-slide Action Settings (`ppaction://hlinksldjump`).
|
|
82862
|
+
*
|
|
82863
|
+
* A jump ENTERS the target slide, so PowerPoint plays that slide's
|
|
82864
|
+
* transition exactly as a forward step does. Committing with `null` here is
|
|
82865
|
+
* why a deck navigated by clicking its own on-slide links showed no morph at
|
|
82866
|
+
* all while the same transition played fine on PageDown.
|
|
81564
82867
|
*/
|
|
81565
82868
|
goToSlide(index) {
|
|
81566
|
-
const
|
|
82869
|
+
const slides = this.deps.slides();
|
|
82870
|
+
const count = slides.length;
|
|
81567
82871
|
if (count === 0) {
|
|
81568
82872
|
return;
|
|
81569
82873
|
}
|
|
81570
82874
|
const next = clampIndex(index, count);
|
|
81571
|
-
|
|
82875
|
+
const current = this.currentIndex();
|
|
82876
|
+
if (next === current) {
|
|
81572
82877
|
return;
|
|
81573
82878
|
}
|
|
81574
|
-
|
|
82879
|
+
const incoming = slides[next];
|
|
82880
|
+
const outgoing = slides[current];
|
|
82881
|
+
this.commit(next, incoming?.transition && outgoing ? { outgoing, transition: incoming.transition } : null);
|
|
81575
82882
|
}
|
|
81576
82883
|
/**
|
|
81577
82884
|
* The single place a slide change becomes visible: set the transition, move
|
|
@@ -81751,6 +83058,376 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
81751
83058
|
`, styles: [":host{display:block;position:absolute;bottom:3.5rem;left:50%;transform:translate(-50%);z-index:70;max-width:80%;min-width:300px;pointer-events:none}.pptx-ng-subtitle-inner{padding:.75rem 1.5rem;border-radius:.5rem;background:#000000bf;border:1px solid rgba(255,255,255,.1);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.pptx-ng-subtitle-text{display:block;text-align:center;font-size:.9375rem;line-height:1.5;color:#ffffffb3;font-style:italic;font-family:system-ui,sans-serif;white-space:pre-wrap;word-break:break-word}\n"] }]
|
|
81752
83059
|
}], ctorParameters: () => [], propDecorators: { visible: [{ type: i0.Input, args: [{ isSignal: true, alias: "visible", required: true }] }] } });
|
|
81753
83060
|
|
|
83061
|
+
/**
|
|
83062
|
+
* presentation-toolbar-view.ts: the literal class tokens and the auto-hide
|
|
83063
|
+
* state machine behind {@link PresentationToolbarComponent}.
|
|
83064
|
+
*
|
|
83065
|
+
* Neither lives in the component itself, for two reasons:
|
|
83066
|
+
*
|
|
83067
|
+
* - Tailwind is told to scan `src/viewer/**\/*.ts` and the vendored shared
|
|
83068
|
+
* source, and nothing else (see `src/styles/pptx-angular-viewer.css`). A
|
|
83069
|
+
* utility class written straight into a component's external `.html` is
|
|
83070
|
+
* therefore never emitted, and the control silently renders unstyled. Every
|
|
83071
|
+
* literal class the toolbar template needs is declared here so the scanner
|
|
83072
|
+
* sees it; the rest come from shared's `PRESENT_TOOLBAR_CLASSES`, which the
|
|
83073
|
+
* scanner also covers.
|
|
83074
|
+
* - This package has no TestBed (see `vitest.config.ts`), so any toolbar
|
|
83075
|
+
* behaviour worth asserting has to be reachable without rendering it.
|
|
83076
|
+
*/
|
|
83077
|
+
// ---------------------------------------------------------------------------
|
|
83078
|
+
// Class tokens (Tailwind-scanned)
|
|
83079
|
+
// ---------------------------------------------------------------------------
|
|
83080
|
+
/** Ring on the palette swatch matching the tool's current colour. */
|
|
83081
|
+
const SWATCH_BORDER_SELECTED = 'border-white';
|
|
83082
|
+
/** Ring on every other palette swatch. */
|
|
83083
|
+
const SWATCH_BORDER_IDLE = 'border-white/20';
|
|
83084
|
+
/** Hover tint marking the destructive controls (clear ink, end the show). */
|
|
83085
|
+
const DESTRUCTIVE_HOVER = 'hover:text-red-400';
|
|
83086
|
+
/** Annotation-tool toggle, tinted when the tool is armed. */
|
|
83087
|
+
function presentToolbarToggleClass(active) {
|
|
83088
|
+
return active ? PRESENT_TOOLBAR_CLASSES.toggleActive : PRESENT_TOOLBAR_CLASSES.toggle;
|
|
83089
|
+
}
|
|
83090
|
+
/**
|
|
83091
|
+
* "Clear annotations". The red hover tint is withheld while the button is
|
|
83092
|
+
* disabled so a strokeless slide does not advertise an action that cannot run.
|
|
83093
|
+
*/
|
|
83094
|
+
function presentToolbarClearClass(hasAnnotations) {
|
|
83095
|
+
return hasAnnotations
|
|
83096
|
+
? `${PRESENT_TOOLBAR_CLASSES.button} ${DESTRUCTIVE_HOVER}`
|
|
83097
|
+
: PRESENT_TOOLBAR_CLASSES.button;
|
|
83098
|
+
}
|
|
83099
|
+
/** One colour swatch in a palette popover. */
|
|
83100
|
+
function presentToolbarSwatchClass(selected) {
|
|
83101
|
+
const border = selected ? SWATCH_BORDER_SELECTED : SWATCH_BORDER_IDLE;
|
|
83102
|
+
return `${PRESENT_TOOLBAR_CLASSES.swatch} ${border}`;
|
|
83103
|
+
}
|
|
83104
|
+
/**
|
|
83105
|
+
* Everything the toolbar template needs that is not component state, in one
|
|
83106
|
+
* object: the component would otherwise carry a dozen alias fields whose only
|
|
83107
|
+
* job is to make a constant reachable from an Angular expression.
|
|
83108
|
+
*
|
|
83109
|
+
* The literal utility strings sit here rather than in the template because
|
|
83110
|
+
* Tailwind's `@source` globs cover `.ts` only, so a class written into the
|
|
83111
|
+
* `.html` would never be emitted and its control would render unstyled.
|
|
83112
|
+
*/
|
|
83113
|
+
const PRESENT_TOOLBAR_VIEW = {
|
|
83114
|
+
...PRESENT_TOOLBAR_CLASSES,
|
|
83115
|
+
/** "End presentation": always destructive, so always tinted on hover. */
|
|
83116
|
+
end: `${PRESENT_TOOLBAR_CLASSES.button} ${DESTRUCTIVE_HOVER}`,
|
|
83117
|
+
/** Icon inside a navigation / tool button (`PRESENT_TOOLBAR_METRICS.iconSize`). */
|
|
83118
|
+
icon: 'h-[18px] w-[18px]',
|
|
83119
|
+
/** Icon inside a colour caret (`caretIconSize`). */
|
|
83120
|
+
caretIcon: 'h-3 w-3',
|
|
83121
|
+
/** Icon beside the elapsed readout (`timerIconSize`). */
|
|
83122
|
+
timerIcon: 'h-3.5 w-3.5',
|
|
83123
|
+
/**
|
|
83124
|
+
* A tool toggle plus its caret and palette popover. The palette is positioned
|
|
83125
|
+
* against this group, so the group has to establish the containing block.
|
|
83126
|
+
*/
|
|
83127
|
+
group: 'relative flex items-center',
|
|
83128
|
+
penColors: PEN_COLORS,
|
|
83129
|
+
highlighterColors: HIGHLIGHTER_COLORS,
|
|
83130
|
+
toggleClass: presentToolbarToggleClass,
|
|
83131
|
+
clearClass: presentToolbarClearClass,
|
|
83132
|
+
swatchClass: presentToolbarSwatchClass,
|
|
83133
|
+
};
|
|
83134
|
+
// ---------------------------------------------------------------------------
|
|
83135
|
+
// Disabled-state predicates
|
|
83136
|
+
// ---------------------------------------------------------------------------
|
|
83137
|
+
/**
|
|
83138
|
+
* Whether "previous slide" is dead. An empty deck counts as the first slide, so
|
|
83139
|
+
* the control is disabled rather than stepping to index -1.
|
|
83140
|
+
*/
|
|
83141
|
+
function isAtFirstSlide(currentSlideIndex) {
|
|
83142
|
+
return currentSlideIndex <= 0;
|
|
83143
|
+
}
|
|
83144
|
+
/**
|
|
83145
|
+
* Whether "next slide" is dead. Note this is the LAST slide, not the black
|
|
83146
|
+
* end-of-show screen: PowerPoint still lets a forward input raise that screen,
|
|
83147
|
+
* and the show overlay owns it, so the toolbar stops one step earlier than the
|
|
83148
|
+
* keyboard does.
|
|
83149
|
+
*/
|
|
83150
|
+
function isAtLastSlide(currentSlideIndex, totalSlides) {
|
|
83151
|
+
return currentSlideIndex >= totalSlides - 1;
|
|
83152
|
+
}
|
|
83153
|
+
// ---------------------------------------------------------------------------
|
|
83154
|
+
// Auto-hide
|
|
83155
|
+
// ---------------------------------------------------------------------------
|
|
83156
|
+
/**
|
|
83157
|
+
* The show toolbar's auto-hide countdown, mirroring React's
|
|
83158
|
+
* `PresentationToolbarWrapper`: any pointer movement shows the bar, and it
|
|
83159
|
+
* fades out again after {@link AUTO_HIDE_DELAY_MS} of stillness unless the
|
|
83160
|
+
* pointer is resting on the bar itself.
|
|
83161
|
+
*
|
|
83162
|
+
* Split out of the component because a presenter losing the bar mid-show (or
|
|
83163
|
+
* never getting it back) is the failure this logic exists to prevent, and it
|
|
83164
|
+
* cannot be exercised through a component this package cannot mount.
|
|
83165
|
+
*/
|
|
83166
|
+
class PresentToolbarAutoHide {
|
|
83167
|
+
setVisible;
|
|
83168
|
+
timer = null;
|
|
83169
|
+
hovering = false;
|
|
83170
|
+
constructor(setVisible) {
|
|
83171
|
+
this.setVisible = setVisible;
|
|
83172
|
+
}
|
|
83173
|
+
/** Pointer moved anywhere: show the bar and restart the countdown. */
|
|
83174
|
+
poke() {
|
|
83175
|
+
this.setVisible(true);
|
|
83176
|
+
this.restart();
|
|
83177
|
+
}
|
|
83178
|
+
/** Pointer entered the bar: keep it up for as long as it rests there. */
|
|
83179
|
+
enter() {
|
|
83180
|
+
this.hovering = true;
|
|
83181
|
+
this.cancel();
|
|
83182
|
+
this.setVisible(true);
|
|
83183
|
+
}
|
|
83184
|
+
/** Pointer left the bar: resume the countdown. */
|
|
83185
|
+
leave() {
|
|
83186
|
+
this.hovering = false;
|
|
83187
|
+
this.restart();
|
|
83188
|
+
}
|
|
83189
|
+
/** Drop the pending timer (component teardown). */
|
|
83190
|
+
dispose() {
|
|
83191
|
+
this.cancel();
|
|
83192
|
+
}
|
|
83193
|
+
restart() {
|
|
83194
|
+
this.cancel();
|
|
83195
|
+
this.timer = setTimeout(() => {
|
|
83196
|
+
this.timer = null;
|
|
83197
|
+
if (!this.hovering) {
|
|
83198
|
+
this.setVisible(false);
|
|
83199
|
+
}
|
|
83200
|
+
}, AUTO_HIDE_DELAY_MS);
|
|
83201
|
+
}
|
|
83202
|
+
cancel() {
|
|
83203
|
+
if (this.timer !== null) {
|
|
83204
|
+
clearTimeout(this.timer);
|
|
83205
|
+
this.timer = null;
|
|
83206
|
+
}
|
|
83207
|
+
}
|
|
83208
|
+
}
|
|
83209
|
+
|
|
83210
|
+
/**
|
|
83211
|
+
* presentation-toolbar.component.ts: the floating bottom-centre toolbar of a
|
|
83212
|
+
* running slide show.
|
|
83213
|
+
*
|
|
83214
|
+
* Selector: `pptx-presentation-toolbar`
|
|
83215
|
+
*
|
|
83216
|
+
* The inventory, the order and the measurements are NOT decided here: they come
|
|
83217
|
+
* from `PRESENT_TOOLBAR_CONTROLS` / `PRESENT_TOOLBAR_CLASSES` in
|
|
83218
|
+
* `pptx-viewer-shared`, which is what stops this bar drifting from the other
|
|
83219
|
+
* four bindings again. Angular previously shipped a bottom-LEFT strip of four
|
|
83220
|
+
* annotation tools plus a captions button, so a presenter had no visible way to
|
|
83221
|
+
* step slides, read the elapsed time, open presenter view or leave the show.
|
|
83222
|
+
*
|
|
83223
|
+
* The bar is the component HOST (it carries `PRESENT_TOOLBAR_CLASSES.wrapper`
|
|
83224
|
+
* and the auto-hide opacity), so the show overlay only has to place the element;
|
|
83225
|
+
* positioning and fade live with the behaviour that drives them.
|
|
83226
|
+
*
|
|
83227
|
+
* Annotation state is read from the overlay-provided
|
|
83228
|
+
* {@link PresentationAnnotationsService} rather than passed in, the same way
|
|
83229
|
+
* `PresentationAnnotationOverlayComponent` does it, which keeps the input
|
|
83230
|
+
* surface to the four things the bar cannot know: where in the deck it is, when
|
|
83231
|
+
* the show started, whether presenter view is up, and how to leave.
|
|
83232
|
+
*/
|
|
83233
|
+
class PresentationToolbarComponent {
|
|
83234
|
+
// ------------------------------------------------------------------
|
|
83235
|
+
// Inputs / outputs
|
|
83236
|
+
// ------------------------------------------------------------------
|
|
83237
|
+
/** Zero-based index of the slide on screen. */
|
|
83238
|
+
currentSlideIndex = input.required(/* @ts-ignore */
|
|
83239
|
+
...(ngDevMode ? [{ debugName: "currentSlideIndex" }] : /* istanbul ignore next */ []));
|
|
83240
|
+
totalSlides = input.required(/* @ts-ignore */
|
|
83241
|
+
...(ngDevMode ? [{ debugName: "totalSlides" }] : /* istanbul ignore next */ []));
|
|
83242
|
+
/**
|
|
83243
|
+
* Epoch ms the show started. Defaults to this bar's own construction, which
|
|
83244
|
+
* IS the moment the show overlay appeared, so the readout ticks from zero
|
|
83245
|
+
* even for a host that tracks no start time of its own.
|
|
83246
|
+
*/
|
|
83247
|
+
presentationStartTime = input(null, /* @ts-ignore */
|
|
83248
|
+
...(ngDevMode ? [{ debugName: "presentationStartTime" }] : /* istanbul ignore next */ []));
|
|
83249
|
+
/** Whether presenter view is currently up (tints the toggle). */
|
|
83250
|
+
presenterMode = input(false, /* @ts-ignore */
|
|
83251
|
+
...(ngDevMode ? [{ debugName: "presenterMode" }] : /* istanbul ignore next */ []));
|
|
83252
|
+
/** Step the show by one slide (`-1` back, `1` forward). */
|
|
83253
|
+
move = output();
|
|
83254
|
+
/** Leave the show. */
|
|
83255
|
+
endPresentation = output();
|
|
83256
|
+
/** Swap between the fullscreen show and presenter view. */
|
|
83257
|
+
presenterViewToggle = output();
|
|
83258
|
+
// ------------------------------------------------------------------
|
|
83259
|
+
// Injected state
|
|
83260
|
+
// ------------------------------------------------------------------
|
|
83261
|
+
annotations = inject(PresentationAnnotationsService);
|
|
83262
|
+
host = inject(ElementRef);
|
|
83263
|
+
// ------------------------------------------------------------------
|
|
83264
|
+
// Template constants
|
|
83265
|
+
// ------------------------------------------------------------------
|
|
83266
|
+
ui = PRESENT_TOOLBAR_VIEW;
|
|
83267
|
+
// ------------------------------------------------------------------
|
|
83268
|
+
// Derived state
|
|
83269
|
+
// ------------------------------------------------------------------
|
|
83270
|
+
openPalette = signal('none', /* @ts-ignore */
|
|
83271
|
+
...(ngDevMode ? [{ debugName: "openPalette" }] : /* istanbul ignore next */ []));
|
|
83272
|
+
visible = signal(false, /* @ts-ignore */
|
|
83273
|
+
...(ngDevMode ? [{ debugName: "visible" }] : /* istanbul ignore next */ []));
|
|
83274
|
+
mountedAt = Date.now();
|
|
83275
|
+
now = signal(Date.now(), /* @ts-ignore */
|
|
83276
|
+
...(ngDevMode ? [{ debugName: "now" }] : /* istanbul ignore next */ []));
|
|
83277
|
+
counterLabel = computed(() => formatSlideCounter(this.currentSlideIndex(), this.totalSlides()), /* @ts-ignore */
|
|
83278
|
+
...(ngDevMode ? [{ debugName: "counterLabel" }] : /* istanbul ignore next */ []));
|
|
83279
|
+
elapsedLabel = computed(() => formatElapsed(this.now() - (this.presentationStartTime() ?? this.mountedAt)), /* @ts-ignore */
|
|
83280
|
+
...(ngDevMode ? [{ debugName: "elapsedLabel" }] : /* istanbul ignore next */ []));
|
|
83281
|
+
atFirstSlide = computed(() => isAtFirstSlide(this.currentSlideIndex()), /* @ts-ignore */
|
|
83282
|
+
...(ngDevMode ? [{ debugName: "atFirstSlide" }] : /* istanbul ignore next */ []));
|
|
83283
|
+
atLastSlide = computed(() => isAtLastSlide(this.currentSlideIndex(), this.totalSlides()), /* @ts-ignore */
|
|
83284
|
+
...(ngDevMode ? [{ debugName: "atLastSlide" }] : /* istanbul ignore next */ []));
|
|
83285
|
+
hasAnnotations = computed(() => this.annotations.annotationStrokes().length > 0, /* @ts-ignore */
|
|
83286
|
+
...(ngDevMode ? [{ debugName: "hasAnnotations" }] : /* istanbul ignore next */ []));
|
|
83287
|
+
autoHide = new PresentToolbarAutoHide((value) => {
|
|
83288
|
+
this.visible.set(value);
|
|
83289
|
+
});
|
|
83290
|
+
constructor() {
|
|
83291
|
+
const tick = setInterval(() => {
|
|
83292
|
+
this.now.set(Date.now());
|
|
83293
|
+
}, 1000);
|
|
83294
|
+
inject(DestroyRef).onDestroy(() => {
|
|
83295
|
+
clearInterval(tick);
|
|
83296
|
+
this.autoHide.dispose();
|
|
83297
|
+
});
|
|
83298
|
+
}
|
|
83299
|
+
// ------------------------------------------------------------------
|
|
83300
|
+
// Auto-hide
|
|
83301
|
+
// ------------------------------------------------------------------
|
|
83302
|
+
/**
|
|
83303
|
+
* Mirrors React's `PresentationToolbarWrapper`: the shared bottom-trigger
|
|
83304
|
+
* zone is tested against the show surface first, then any other movement
|
|
83305
|
+
* shows the bar too. Both arms re-arm the countdown, so a presenter who
|
|
83306
|
+
* stops moving loses the chrome after three seconds and gets it straight
|
|
83307
|
+
* back on the next twitch.
|
|
83308
|
+
*/
|
|
83309
|
+
onDocumentMouseMove(event) {
|
|
83310
|
+
const surface = this.host.nativeElement.parentElement;
|
|
83311
|
+
if (surface) {
|
|
83312
|
+
const rect = surface.getBoundingClientRect();
|
|
83313
|
+
if (isInBottomTriggerZone(event.clientY, rect.height, rect.top)) {
|
|
83314
|
+
this.autoHide.poke();
|
|
83315
|
+
return;
|
|
83316
|
+
}
|
|
83317
|
+
}
|
|
83318
|
+
this.autoHide.poke();
|
|
83319
|
+
}
|
|
83320
|
+
onMouseEnter() {
|
|
83321
|
+
this.autoHide.enter();
|
|
83322
|
+
}
|
|
83323
|
+
onMouseLeave() {
|
|
83324
|
+
this.autoHide.leave();
|
|
83325
|
+
}
|
|
83326
|
+
/** A press outside the bar dismisses whichever colour palette is open. */
|
|
83327
|
+
onDocumentMouseDown(event) {
|
|
83328
|
+
const target = event.target;
|
|
83329
|
+
if (target instanceof Node && !this.host.nativeElement.contains(target)) {
|
|
83330
|
+
this.openPalette.set('none');
|
|
83331
|
+
}
|
|
83332
|
+
}
|
|
83333
|
+
// ------------------------------------------------------------------
|
|
83334
|
+
// Controls
|
|
83335
|
+
// ------------------------------------------------------------------
|
|
83336
|
+
/**
|
|
83337
|
+
* Every control is bound for both `click` and `touchend`, and both stop
|
|
83338
|
+
* propagation: the show surface advances the deck on click, so a press on
|
|
83339
|
+
* the bar that bubbled would also skip a slide. The touch path additionally
|
|
83340
|
+
* suppresses the synthesized click so one tap does not fire twice.
|
|
83341
|
+
*/
|
|
83342
|
+
onControlClick(event, action) {
|
|
83343
|
+
event.stopPropagation();
|
|
83344
|
+
this.run(action);
|
|
83345
|
+
}
|
|
83346
|
+
onControlTouch(event, action) {
|
|
83347
|
+
event.stopPropagation();
|
|
83348
|
+
event.preventDefault();
|
|
83349
|
+
this.run(action);
|
|
83350
|
+
}
|
|
83351
|
+
/** Pick a swatch. Choosing a colour also arms the tool it belongs to. */
|
|
83352
|
+
pickColor(event, kind, color) {
|
|
83353
|
+
event.stopPropagation();
|
|
83354
|
+
event.preventDefault();
|
|
83355
|
+
if (kind === 'pen') {
|
|
83356
|
+
this.annotations.setPenColor(color);
|
|
83357
|
+
}
|
|
83358
|
+
else {
|
|
83359
|
+
this.annotations.setHighlighterColor(color);
|
|
83360
|
+
}
|
|
83361
|
+
this.openPalette.set('none');
|
|
83362
|
+
if (this.annotations.tool() !== kind) {
|
|
83363
|
+
this.annotations.setTool(kind);
|
|
83364
|
+
}
|
|
83365
|
+
}
|
|
83366
|
+
run(action) {
|
|
83367
|
+
switch (action) {
|
|
83368
|
+
case 'previous':
|
|
83369
|
+
this.move.emit(-1);
|
|
83370
|
+
return;
|
|
83371
|
+
case 'next':
|
|
83372
|
+
this.move.emit(1);
|
|
83373
|
+
return;
|
|
83374
|
+
case 'pen-color':
|
|
83375
|
+
case 'highlighter-color':
|
|
83376
|
+
this.togglePalette(action === 'pen-color' ? 'pen' : 'highlighter');
|
|
83377
|
+
return;
|
|
83378
|
+
case 'clear':
|
|
83379
|
+
this.annotations.clearAnnotations();
|
|
83380
|
+
return;
|
|
83381
|
+
case 'presenter-view':
|
|
83382
|
+
this.presenterViewToggle.emit();
|
|
83383
|
+
return;
|
|
83384
|
+
case 'end':
|
|
83385
|
+
this.endPresentation.emit();
|
|
83386
|
+
return;
|
|
83387
|
+
default:
|
|
83388
|
+
this.selectTool(action);
|
|
83389
|
+
}
|
|
83390
|
+
}
|
|
83391
|
+
selectTool(tool) {
|
|
83392
|
+
this.annotations.setTool(tool);
|
|
83393
|
+
this.openPalette.set('none');
|
|
83394
|
+
}
|
|
83395
|
+
togglePalette(kind) {
|
|
83396
|
+
this.openPalette.update((open) => (open === kind ? 'none' : kind));
|
|
83397
|
+
}
|
|
83398
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PresentationToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
83399
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: PresentationToolbarComponent, isStandalone: true, selector: "pptx-presentation-toolbar", inputs: { currentSlideIndex: { classPropertyName: "currentSlideIndex", publicName: "currentSlideIndex", isSignal: true, isRequired: true, transformFunction: null }, totalSlides: { classPropertyName: "totalSlides", publicName: "totalSlides", isSignal: true, isRequired: true, transformFunction: null }, presentationStartTime: { classPropertyName: "presentationStartTime", publicName: "presentationStartTime", isSignal: true, isRequired: false, transformFunction: null }, presenterMode: { classPropertyName: "presenterMode", publicName: "presenterMode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { move: "move", endPresentation: "endPresentation", presenterViewToggle: "presenterViewToggle" }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "document:mousemove": "onDocumentMouseMove($event)", "document:mousedown": "onDocumentMouseDown($event)" }, properties: { "class": "ui.wrapper", "style.opacity": "visible() ? 1 : 0", "style.pointer-events": "visible() ? \"auto\" : \"none\"" } }, ngImport: i0, template: "<!--\n\tThe 16 slots of `PRESENT_TOOLBAR_CONTROLS` (pptx-viewer-shared), in order.\n\tEach carries its shared id as `data-pptx-present-control` so a parity spec\n\tcan read the inventory off any binding without knowing its markup.\n-->\n<div\n\tdata-pptx-present-toolbar\n\trole=\"toolbar\"\n\t[attr.aria-label]=\"'pptx.toolbar.presentationToolbarAria' | translate\"\n\t[class]=\"ui.container\"\n\t(click)=\"$event.stopPropagation()\"\n>\n\t<button\n\t\ttype=\"button\"\n\t\tdata-pptx-present-control=\"previous\"\n\t\t[class]=\"ui.button\"\n\t\t[disabled]=\"atFirstSlide()\"\n\t\t[attr.title]=\"'pptx.presenter.previousSlide' | translate\"\n\t\t[attr.aria-label]=\"'pptx.presenter.previousSlide' | translate\"\n\t\t(click)=\"onControlClick($event, 'previous')\"\n\t\t(touchend)=\"onControlTouch($event, 'previous')\"\n\t>\n\t\t<svg lucideChevronLeft [class]=\"ui.icon\"></svg>\n\t</button>\n\n\t<span data-pptx-present-control=\"counter\" [class]=\"ui.counter\">{{ counterLabel() }}</span>\n\n\t<button\n\t\ttype=\"button\"\n\t\tdata-pptx-present-control=\"next\"\n\t\t[class]=\"ui.button\"\n\t\t[disabled]=\"atLastSlide()\"\n\t\t[attr.title]=\"'pptx.presenter.nextSlide' | translate\"\n\t\t[attr.aria-label]=\"'pptx.presenter.nextSlide' | translate\"\n\t\t(click)=\"onControlClick($event, 'next')\"\n\t\t(touchend)=\"onControlTouch($event, 'next')\"\n\t>\n\t\t<svg lucideChevronRight [class]=\"ui.icon\"></svg>\n\t</button>\n\n\t<div data-pptx-present-control=\"divider-navigation\" [class]=\"ui.divider\"></div>\n\n\t<div\n\t\tdata-pptx-present-control=\"timer\"\n\t\t[class]=\"ui.timer\"\n\t\t[attr.title]=\"'pptx.presenter.elapsed' | translate\"\n\t\t[attr.aria-label]=\"'pptx.presenter.elapsed' | translate\"\n\t>\n\t\t<svg lucideTimer [class]=\"ui.timerIcon\"></svg>\n\t\t<span>{{ elapsedLabel() }}</span>\n\t</div>\n\n\t<div data-pptx-present-control=\"divider-timer\" [class]=\"ui.divider\"></div>\n\n\t<button\n\t\ttype=\"button\"\n\t\tdata-pptx-present-control=\"laser\"\n\t\t[class]=\"ui.toggleClass(annotations.tool() === 'laser')\"\n\t\t[attr.title]=\"'pptx.presentation.laserPointer' | translate\"\n\t\t[attr.aria-label]=\"'pptx.presentation.laserPointer' | translate\"\n\t\t(click)=\"onControlClick($event, 'laser')\"\n\t\t(touchend)=\"onControlTouch($event, 'laser')\"\n\t>\n\t\t<svg lucideMousePointer2 [class]=\"ui.icon\"></svg>\n\t</button>\n\n\t<div [class]=\"ui.group\">\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tdata-pptx-present-control=\"pen\"\n\t\t\t[class]=\"ui.toggleClass(annotations.tool() === 'pen')\"\n\t\t\t[attr.title]=\"'pptx.presentation.pen' | translate\"\n\t\t\t[attr.aria-label]=\"'pptx.presentation.pen' | translate\"\n\t\t\t(click)=\"onControlClick($event, 'pen')\"\n\t\t\t(touchend)=\"onControlTouch($event, 'pen')\"\n\t\t>\n\t\t\t<svg lucidePenTool [class]=\"ui.icon\"></svg>\n\t\t\t<span [class]=\"ui.swatchBar\" [style.background-color]=\"annotations.penColor()\"></span>\n\t\t</button>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tdata-pptx-present-control=\"pen-color\"\n\t\t\t[class]=\"ui.caret\"\n\t\t\t[attr.title]=\"'pptx.presentationToolbar.penColor' | translate\"\n\t\t\t[attr.aria-label]=\"'pptx.presentationToolbar.penColor' | translate\"\n\t\t\t(click)=\"onControlClick($event, 'pen-color')\"\n\t\t\t(touchend)=\"onControlTouch($event, 'pen-color')\"\n\t\t>\n\t\t\t<svg lucideChevronDown [class]=\"ui.caretIcon\"></svg>\n\t\t</button>\n\t\t@if (openPalette() === 'pen') {\n\t\t\t<div [class]=\"ui.palette\">\n\t\t\t\t@for (color of ui.penColors; track color) {\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t[class]=\"ui.swatchClass(annotations.penColor() === color)\"\n\t\t\t\t\t\t[style.background-color]=\"color\"\n\t\t\t\t\t\t[attr.aria-label]=\"\n\t\t\t\t\t\t\t'pptx.presentationToolbar.penColorValue' | translate: { color: color }\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t(click)=\"pickColor($event, 'pen', color)\"\n\t\t\t\t\t\t(touchend)=\"pickColor($event, 'pen', color)\"\n\t\t\t\t\t></button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t}\n\t</div>\n\n\t<div [class]=\"ui.group\">\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tdata-pptx-present-control=\"highlighter\"\n\t\t\t[class]=\"ui.toggleClass(annotations.tool() === 'highlighter')\"\n\t\t\t[attr.title]=\"'pptx.presentation.highlighter' | translate\"\n\t\t\t[attr.aria-label]=\"'pptx.presentation.highlighter' | translate\"\n\t\t\t(click)=\"onControlClick($event, 'highlighter')\"\n\t\t\t(touchend)=\"onControlTouch($event, 'highlighter')\"\n\t\t>\n\t\t\t<svg lucideHighlighter [class]=\"ui.icon\"></svg>\n\t\t\t<span [class]=\"ui.swatchBar\" [style.background-color]=\"annotations.highlighterColor()\"></span>\n\t\t</button>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tdata-pptx-present-control=\"highlighter-color\"\n\t\t\t[class]=\"ui.caret\"\n\t\t\t[attr.title]=\"'pptx.presentationToolbar.highlighterColor' | translate\"\n\t\t\t[attr.aria-label]=\"'pptx.presentationToolbar.highlighterColor' | translate\"\n\t\t\t(click)=\"onControlClick($event, 'highlighter-color')\"\n\t\t\t(touchend)=\"onControlTouch($event, 'highlighter-color')\"\n\t\t>\n\t\t\t<svg lucideChevronDown [class]=\"ui.caretIcon\"></svg>\n\t\t</button>\n\t\t@if (openPalette() === 'highlighter') {\n\t\t\t<div [class]=\"ui.palette\">\n\t\t\t\t@for (color of ui.highlighterColors; track color) {\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t[class]=\"ui.swatchClass(annotations.highlighterColor() === color)\"\n\t\t\t\t\t\t[style.background-color]=\"color\"\n\t\t\t\t\t\t[attr.aria-label]=\"\n\t\t\t\t\t\t\t'pptx.presentationToolbar.highlighterColorValue' | translate: { color: color }\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t(click)=\"pickColor($event, 'highlighter', color)\"\n\t\t\t\t\t\t(touchend)=\"pickColor($event, 'highlighter', color)\"\n\t\t\t\t\t></button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t}\n\t</div>\n\n\t<button\n\t\ttype=\"button\"\n\t\tdata-pptx-present-control=\"eraser\"\n\t\t[class]=\"ui.toggleClass(annotations.tool() === 'eraser')\"\n\t\t[attr.title]=\"'pptx.presentation.eraser' | translate\"\n\t\t[attr.aria-label]=\"'pptx.presentation.eraser' | translate\"\n\t\t(click)=\"onControlClick($event, 'eraser')\"\n\t\t(touchend)=\"onControlTouch($event, 'eraser')\"\n\t>\n\t\t<svg lucideEraser [class]=\"ui.icon\"></svg>\n\t</button>\n\n\t<button\n\t\ttype=\"button\"\n\t\tdata-pptx-present-control=\"clear\"\n\t\t[class]=\"ui.clearClass(hasAnnotations())\"\n\t\t[disabled]=\"!hasAnnotations()\"\n\t\t[attr.title]=\"'pptx.presentation.clearAnnotations' | translate\"\n\t\t[attr.aria-label]=\"'pptx.presentation.clearAnnotations' | translate\"\n\t\t(click)=\"onControlClick($event, 'clear')\"\n\t\t(touchend)=\"onControlTouch($event, 'clear')\"\n\t>\n\t\t<svg lucideTrash2 [class]=\"ui.icon\"></svg>\n\t</button>\n\n\t<div data-pptx-present-control=\"divider-tools\" [class]=\"ui.divider\"></div>\n\n\t<button\n\t\ttype=\"button\"\n\t\tdata-pptx-present-control=\"presenter-view\"\n\t\t[class]=\"ui.toggleClass(presenterMode())\"\n\t\t[attr.title]=\"'pptx.presenter.presenterView' | translate\"\n\t\t[attr.aria-label]=\"'pptx.presenter.presenterView' | translate\"\n\t\t(click)=\"onControlClick($event, 'presenter-view')\"\n\t\t(touchend)=\"onControlTouch($event, 'presenter-view')\"\n\t>\n\t\t<svg lucidePanelRight [class]=\"ui.icon\"></svg>\n\t</button>\n\n\t<button\n\t\ttype=\"button\"\n\t\tdata-pptx-present-control=\"end\"\n\t\t[class]=\"ui.end\"\n\t\t[attr.title]=\"'pptx.presenter.endPresentation' | translate\"\n\t\t[attr.aria-label]=\"'pptx.presenter.endPresentation' | translate\"\n\t\t(click)=\"onControlClick($event, 'end')\"\n\t\t(touchend)=\"onControlTouch($event, 'end')\"\n\t>\n\t\t<svg lucideX [class]=\"ui.icon\"></svg>\n\t</button>\n</div>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "component", type: LucideChevronDown, selector: "svg[lucideChevronDown]" }, { kind: "component", type: LucideChevronLeft, selector: "svg[lucideChevronLeft]" }, { kind: "component", type: LucideChevronRight, selector: "svg[lucideChevronRight]" }, { kind: "component", type: LucideEraser, selector: "svg[lucideEraser]" }, { kind: "component", type: LucideHighlighter, selector: "svg[lucideHighlighter]" }, { kind: "component", type: LucideMousePointer2, selector: "svg[lucideMousePointer2]" }, { kind: "component", type: LucidePanelRight, selector: "svg[lucidePanelRight]" }, { kind: "component", type: LucidePenTool, selector: "svg[lucidePenTool]" }, { kind: "component", type: LucideTimer, selector: "svg[lucideTimer]" }, { kind: "component", type: LucideTrash2, selector: "svg[lucideTrash2]" }, { kind: "component", type: LucideX, selector: "svg[lucideX]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
83400
|
+
}
|
|
83401
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PresentationToolbarComponent, decorators: [{
|
|
83402
|
+
type: Component,
|
|
83403
|
+
args: [{ selector: 'pptx-presentation-toolbar', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
83404
|
+
TranslatePipe,
|
|
83405
|
+
LucideChevronDown,
|
|
83406
|
+
LucideChevronLeft,
|
|
83407
|
+
LucideChevronRight,
|
|
83408
|
+
LucideEraser,
|
|
83409
|
+
LucideHighlighter,
|
|
83410
|
+
LucideMousePointer2,
|
|
83411
|
+
LucidePanelRight,
|
|
83412
|
+
LucidePenTool,
|
|
83413
|
+
LucideTimer,
|
|
83414
|
+
LucideTrash2,
|
|
83415
|
+
LucideX,
|
|
83416
|
+
], host: {
|
|
83417
|
+
'[class]': 'ui.wrapper',
|
|
83418
|
+
'[style.opacity]': 'visible() ? 1 : 0',
|
|
83419
|
+
'[style.pointer-events]': 'visible() ? "auto" : "none"',
|
|
83420
|
+
'(mouseenter)': 'onMouseEnter()',
|
|
83421
|
+
'(mouseleave)': 'onMouseLeave()',
|
|
83422
|
+
}, template: "<!--\n\tThe 16 slots of `PRESENT_TOOLBAR_CONTROLS` (pptx-viewer-shared), in order.\n\tEach carries its shared id as `data-pptx-present-control` so a parity spec\n\tcan read the inventory off any binding without knowing its markup.\n-->\n<div\n\tdata-pptx-present-toolbar\n\trole=\"toolbar\"\n\t[attr.aria-label]=\"'pptx.toolbar.presentationToolbarAria' | translate\"\n\t[class]=\"ui.container\"\n\t(click)=\"$event.stopPropagation()\"\n>\n\t<button\n\t\ttype=\"button\"\n\t\tdata-pptx-present-control=\"previous\"\n\t\t[class]=\"ui.button\"\n\t\t[disabled]=\"atFirstSlide()\"\n\t\t[attr.title]=\"'pptx.presenter.previousSlide' | translate\"\n\t\t[attr.aria-label]=\"'pptx.presenter.previousSlide' | translate\"\n\t\t(click)=\"onControlClick($event, 'previous')\"\n\t\t(touchend)=\"onControlTouch($event, 'previous')\"\n\t>\n\t\t<svg lucideChevronLeft [class]=\"ui.icon\"></svg>\n\t</button>\n\n\t<span data-pptx-present-control=\"counter\" [class]=\"ui.counter\">{{ counterLabel() }}</span>\n\n\t<button\n\t\ttype=\"button\"\n\t\tdata-pptx-present-control=\"next\"\n\t\t[class]=\"ui.button\"\n\t\t[disabled]=\"atLastSlide()\"\n\t\t[attr.title]=\"'pptx.presenter.nextSlide' | translate\"\n\t\t[attr.aria-label]=\"'pptx.presenter.nextSlide' | translate\"\n\t\t(click)=\"onControlClick($event, 'next')\"\n\t\t(touchend)=\"onControlTouch($event, 'next')\"\n\t>\n\t\t<svg lucideChevronRight [class]=\"ui.icon\"></svg>\n\t</button>\n\n\t<div data-pptx-present-control=\"divider-navigation\" [class]=\"ui.divider\"></div>\n\n\t<div\n\t\tdata-pptx-present-control=\"timer\"\n\t\t[class]=\"ui.timer\"\n\t\t[attr.title]=\"'pptx.presenter.elapsed' | translate\"\n\t\t[attr.aria-label]=\"'pptx.presenter.elapsed' | translate\"\n\t>\n\t\t<svg lucideTimer [class]=\"ui.timerIcon\"></svg>\n\t\t<span>{{ elapsedLabel() }}</span>\n\t</div>\n\n\t<div data-pptx-present-control=\"divider-timer\" [class]=\"ui.divider\"></div>\n\n\t<button\n\t\ttype=\"button\"\n\t\tdata-pptx-present-control=\"laser\"\n\t\t[class]=\"ui.toggleClass(annotations.tool() === 'laser')\"\n\t\t[attr.title]=\"'pptx.presentation.laserPointer' | translate\"\n\t\t[attr.aria-label]=\"'pptx.presentation.laserPointer' | translate\"\n\t\t(click)=\"onControlClick($event, 'laser')\"\n\t\t(touchend)=\"onControlTouch($event, 'laser')\"\n\t>\n\t\t<svg lucideMousePointer2 [class]=\"ui.icon\"></svg>\n\t</button>\n\n\t<div [class]=\"ui.group\">\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tdata-pptx-present-control=\"pen\"\n\t\t\t[class]=\"ui.toggleClass(annotations.tool() === 'pen')\"\n\t\t\t[attr.title]=\"'pptx.presentation.pen' | translate\"\n\t\t\t[attr.aria-label]=\"'pptx.presentation.pen' | translate\"\n\t\t\t(click)=\"onControlClick($event, 'pen')\"\n\t\t\t(touchend)=\"onControlTouch($event, 'pen')\"\n\t\t>\n\t\t\t<svg lucidePenTool [class]=\"ui.icon\"></svg>\n\t\t\t<span [class]=\"ui.swatchBar\" [style.background-color]=\"annotations.penColor()\"></span>\n\t\t</button>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tdata-pptx-present-control=\"pen-color\"\n\t\t\t[class]=\"ui.caret\"\n\t\t\t[attr.title]=\"'pptx.presentationToolbar.penColor' | translate\"\n\t\t\t[attr.aria-label]=\"'pptx.presentationToolbar.penColor' | translate\"\n\t\t\t(click)=\"onControlClick($event, 'pen-color')\"\n\t\t\t(touchend)=\"onControlTouch($event, 'pen-color')\"\n\t\t>\n\t\t\t<svg lucideChevronDown [class]=\"ui.caretIcon\"></svg>\n\t\t</button>\n\t\t@if (openPalette() === 'pen') {\n\t\t\t<div [class]=\"ui.palette\">\n\t\t\t\t@for (color of ui.penColors; track color) {\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t[class]=\"ui.swatchClass(annotations.penColor() === color)\"\n\t\t\t\t\t\t[style.background-color]=\"color\"\n\t\t\t\t\t\t[attr.aria-label]=\"\n\t\t\t\t\t\t\t'pptx.presentationToolbar.penColorValue' | translate: { color: color }\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t(click)=\"pickColor($event, 'pen', color)\"\n\t\t\t\t\t\t(touchend)=\"pickColor($event, 'pen', color)\"\n\t\t\t\t\t></button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t}\n\t</div>\n\n\t<div [class]=\"ui.group\">\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tdata-pptx-present-control=\"highlighter\"\n\t\t\t[class]=\"ui.toggleClass(annotations.tool() === 'highlighter')\"\n\t\t\t[attr.title]=\"'pptx.presentation.highlighter' | translate\"\n\t\t\t[attr.aria-label]=\"'pptx.presentation.highlighter' | translate\"\n\t\t\t(click)=\"onControlClick($event, 'highlighter')\"\n\t\t\t(touchend)=\"onControlTouch($event, 'highlighter')\"\n\t\t>\n\t\t\t<svg lucideHighlighter [class]=\"ui.icon\"></svg>\n\t\t\t<span [class]=\"ui.swatchBar\" [style.background-color]=\"annotations.highlighterColor()\"></span>\n\t\t</button>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tdata-pptx-present-control=\"highlighter-color\"\n\t\t\t[class]=\"ui.caret\"\n\t\t\t[attr.title]=\"'pptx.presentationToolbar.highlighterColor' | translate\"\n\t\t\t[attr.aria-label]=\"'pptx.presentationToolbar.highlighterColor' | translate\"\n\t\t\t(click)=\"onControlClick($event, 'highlighter-color')\"\n\t\t\t(touchend)=\"onControlTouch($event, 'highlighter-color')\"\n\t\t>\n\t\t\t<svg lucideChevronDown [class]=\"ui.caretIcon\"></svg>\n\t\t</button>\n\t\t@if (openPalette() === 'highlighter') {\n\t\t\t<div [class]=\"ui.palette\">\n\t\t\t\t@for (color of ui.highlighterColors; track color) {\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t[class]=\"ui.swatchClass(annotations.highlighterColor() === color)\"\n\t\t\t\t\t\t[style.background-color]=\"color\"\n\t\t\t\t\t\t[attr.aria-label]=\"\n\t\t\t\t\t\t\t'pptx.presentationToolbar.highlighterColorValue' | translate: { color: color }\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t(click)=\"pickColor($event, 'highlighter', color)\"\n\t\t\t\t\t\t(touchend)=\"pickColor($event, 'highlighter', color)\"\n\t\t\t\t\t></button>\n\t\t\t\t}\n\t\t\t</div>\n\t\t}\n\t</div>\n\n\t<button\n\t\ttype=\"button\"\n\t\tdata-pptx-present-control=\"eraser\"\n\t\t[class]=\"ui.toggleClass(annotations.tool() === 'eraser')\"\n\t\t[attr.title]=\"'pptx.presentation.eraser' | translate\"\n\t\t[attr.aria-label]=\"'pptx.presentation.eraser' | translate\"\n\t\t(click)=\"onControlClick($event, 'eraser')\"\n\t\t(touchend)=\"onControlTouch($event, 'eraser')\"\n\t>\n\t\t<svg lucideEraser [class]=\"ui.icon\"></svg>\n\t</button>\n\n\t<button\n\t\ttype=\"button\"\n\t\tdata-pptx-present-control=\"clear\"\n\t\t[class]=\"ui.clearClass(hasAnnotations())\"\n\t\t[disabled]=\"!hasAnnotations()\"\n\t\t[attr.title]=\"'pptx.presentation.clearAnnotations' | translate\"\n\t\t[attr.aria-label]=\"'pptx.presentation.clearAnnotations' | translate\"\n\t\t(click)=\"onControlClick($event, 'clear')\"\n\t\t(touchend)=\"onControlTouch($event, 'clear')\"\n\t>\n\t\t<svg lucideTrash2 [class]=\"ui.icon\"></svg>\n\t</button>\n\n\t<div data-pptx-present-control=\"divider-tools\" [class]=\"ui.divider\"></div>\n\n\t<button\n\t\ttype=\"button\"\n\t\tdata-pptx-present-control=\"presenter-view\"\n\t\t[class]=\"ui.toggleClass(presenterMode())\"\n\t\t[attr.title]=\"'pptx.presenter.presenterView' | translate\"\n\t\t[attr.aria-label]=\"'pptx.presenter.presenterView' | translate\"\n\t\t(click)=\"onControlClick($event, 'presenter-view')\"\n\t\t(touchend)=\"onControlTouch($event, 'presenter-view')\"\n\t>\n\t\t<svg lucidePanelRight [class]=\"ui.icon\"></svg>\n\t</button>\n\n\t<button\n\t\ttype=\"button\"\n\t\tdata-pptx-present-control=\"end\"\n\t\t[class]=\"ui.end\"\n\t\t[attr.title]=\"'pptx.presenter.endPresentation' | translate\"\n\t\t[attr.aria-label]=\"'pptx.presenter.endPresentation' | translate\"\n\t\t(click)=\"onControlClick($event, 'end')\"\n\t\t(touchend)=\"onControlTouch($event, 'end')\"\n\t>\n\t\t<svg lucideX [class]=\"ui.icon\"></svg>\n\t</button>\n</div>\n", styles: [":host{display:block}\n"] }]
|
|
83423
|
+
}], ctorParameters: () => [], propDecorators: { currentSlideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "currentSlideIndex", required: true }] }], totalSlides: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalSlides", required: true }] }], presentationStartTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "presentationStartTime", required: false }] }], presenterMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "presenterMode", required: false }] }], move: [{ type: i0.Output, args: ["move"] }], endPresentation: [{ type: i0.Output, args: ["endPresentation"] }], presenterViewToggle: [{ type: i0.Output, args: ["presenterViewToggle"] }], onDocumentMouseMove: [{
|
|
83424
|
+
type: HostListener,
|
|
83425
|
+
args: ['document:mousemove', ['$event']]
|
|
83426
|
+
}], onDocumentMouseDown: [{
|
|
83427
|
+
type: HostListener,
|
|
83428
|
+
args: ['document:mousedown', ['$event']]
|
|
83429
|
+
}] } });
|
|
83430
|
+
|
|
81754
83431
|
// ---------------------------------------------------------------------------
|
|
81755
83432
|
// Angular-specific duration policy (deliberately diverges from React/Vue)
|
|
81756
83433
|
// ---------------------------------------------------------------------------
|
|
@@ -82189,12 +83866,21 @@ class PresentationOverlayComponent {
|
|
|
82189
83866
|
*/
|
|
82190
83867
|
endWithBlackSlide = input(true, /* @ts-ignore */
|
|
82191
83868
|
...(ngDevMode ? [{ debugName: "endWithBlackSlide" }] : /* istanbul ignore next */ []));
|
|
83869
|
+
/** Whether presenter view is up (tints the toolbar's presenter-view toggle). */
|
|
83870
|
+
presenterMode = input(false, /* @ts-ignore */
|
|
83871
|
+
...(ngDevMode ? [{ debugName: "presenterMode" }] : /* istanbul ignore next */ []));
|
|
82192
83872
|
// ------------------------------------------------------------------
|
|
82193
83873
|
// Outputs
|
|
82194
83874
|
// ------------------------------------------------------------------
|
|
82195
83875
|
indexChange = output();
|
|
82196
83876
|
closed = output();
|
|
83877
|
+
/** Live-caption preference; driven by the host's ribbon, not by show chrome. */
|
|
82197
83878
|
subtitlesChange = output();
|
|
83879
|
+
/**
|
|
83880
|
+
* The toolbar's presenter-view toggle was pressed. The host owns the swap
|
|
83881
|
+
* (this overlay and the presenter console cannot both be on screen).
|
|
83882
|
+
*/
|
|
83883
|
+
presenterViewToggle = output();
|
|
82198
83884
|
/**
|
|
82199
83885
|
* Fired just before `closed` when the show carries ink annotations, so the
|
|
82200
83886
|
* host can offer the keep/discard prompt (mirrors React's exit flow).
|
|
@@ -82395,6 +84081,12 @@ class PresentationOverlayComponent {
|
|
|
82395
84081
|
};
|
|
82396
84082
|
}, /* @ts-ignore */
|
|
82397
84083
|
...(ngDevMode ? [{ debugName: "stageContainerStyle" }] : /* istanbul ignore next */ []));
|
|
84084
|
+
/**
|
|
84085
|
+
* Epoch ms the show opened, feeding the toolbar's elapsed readout. Captured
|
|
84086
|
+
* at construction because this overlay is created exactly when the show
|
|
84087
|
+
* starts, so the readout runs from 00:00 without the host tracking it.
|
|
84088
|
+
*/
|
|
84089
|
+
showStartedAt = Date.now();
|
|
82398
84090
|
/** "3 / 12" label. */
|
|
82399
84091
|
counterLabel = computed(() => {
|
|
82400
84092
|
const count = this.slides().length;
|
|
@@ -82465,13 +84157,9 @@ class PresentationOverlayComponent {
|
|
|
82465
84157
|
this.endOfShow.set(false);
|
|
82466
84158
|
this.emitClosed();
|
|
82467
84159
|
}
|
|
82468
|
-
/**
|
|
82469
|
-
|
|
82470
|
-
this.
|
|
82471
|
-
}
|
|
82472
|
-
/** Toggle the live-caption (subtitle) bar. */
|
|
82473
|
-
toggleSubtitles() {
|
|
82474
|
-
this.subtitlesChange.emit(!this.subtitlesVisible());
|
|
84160
|
+
/** The show toolbar's end button: same exit path as Escape / the close button. */
|
|
84161
|
+
onToolbarEnd() {
|
|
84162
|
+
this.emitClosed();
|
|
82475
84163
|
}
|
|
82476
84164
|
/**
|
|
82477
84165
|
* Overlay-chrome buttons (close / previous / next). Each is bound for both
|
|
@@ -82514,7 +84202,7 @@ class PresentationOverlayComponent {
|
|
|
82514
84202
|
this.closed.emit();
|
|
82515
84203
|
}
|
|
82516
84204
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PresentationOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
82517
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", 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 }, 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 } }, outputs: { indexChange: "indexChange", closed: "closed", subtitlesChange: "subtitlesChange", annotationsExit: "annotationsExit" }, host: { listeners: { "document:fullscreenchange": "onFullscreenChange()", "window:resize": "onWindowResize()", "document:keydown": "onKeyDown($event)" } }, providers: [AnimationPlaybackService, PresentationAnnotationsService, ZoomNavigationService], viewQueries: [{ propertyName: "stageRef", first: true, predicate: ["stage"], descendants: true, isSignal: true }, { propertyName: "rootRef", first: true, predicate: ["root"], descendants: true, isSignal: true }], ngImport: i0, template: "<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)=\"$event.preventDefault()\"\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. -->\n\t\t@if (inkMarkupVisible()) {\n\t\t\t<pptx-presentation-annotation-overlay [canvasSize]=\"canvasSize()\" [zoom]=\"zoom()\" />\n\t\t}\n\t</div>\n\t@if (presenterWindow.snapshot().blackout !== 'none') {\n\t\t<div class=\"presenter-blank\" [style.background]=\"presenterWindow.snapshot().blackout\"></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<!-- Annotation tool toolbar (bottom-centre). -->\n\t<div\n\t\tclass=\"pptx-ng-presentation-tools\"\n\t\trole=\"toolbar\"\n\t\t[attr.aria-label]=\"'pptx.presentation.annotationTools' | translate\"\n\t>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\t[class.is-active]=\"annotations.tool() === 'pen'\"\n\t\t\t(click)=\"selectTool('pen')\"\n\t\t\t[attr.aria-label]=\"'pptx.presentation.pen' | translate\"\n\t\t>\n\t\t\t<svg lucidePenTool class=\"h-4 w-4\"></svg>\n\t\t</button>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\t[class.is-active]=\"annotations.tool() === 'highlighter'\"\n\t\t\t(click)=\"selectTool('highlighter')\"\n\t\t\t[attr.aria-label]=\"'pptx.presentation.highlighter' | translate\"\n\t\t>\n\t\t\t<svg lucideHighlighter class=\"h-4 w-4\"></svg>\n\t\t</button>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\t[class.is-active]=\"annotations.tool() === 'eraser'\"\n\t\t\t(click)=\"selectTool('eraser')\"\n\t\t\t[attr.aria-label]=\"'pptx.presentation.eraser' | translate\"\n\t\t>\n\t\t\t<svg lucideEraser class=\"h-4 w-4\"></svg>\n\t\t</button>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\t[class.is-active]=\"annotations.tool() === 'laser'\"\n\t\t\t(click)=\"selectTool('laser')\"\n\t\t\t[attr.aria-label]=\"'pptx.presentation.laserPointer' | translate\"\n\t\t>\n\t\t\t<svg lucideMousePointer2 class=\"h-4 w-4\"></svg>\n\t\t</button>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\t(click)=\"annotations.clearAnnotations()\"\n\t\t\t[attr.aria-label]=\"'pptx.presentation.clearAnnotations' | translate\"\n\t\t>\n\t\t\t<svg lucideTrash2 class=\"h-4 w-4\"></svg>\n\t\t</button>\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\t[class.is-active]=\"subtitlesVisible()\"\n\t\t\t(click)=\"toggleSubtitles()\"\n\t\t\t[attr.aria-label]=\"'pptx.presentation.liveCaptions' | translate\"\n\t\t>\n\t\t\tCC\n\t\t</button>\n\t</div>\n\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</div>\n", styles: [":host{display:block;position:fixed;inset:0;z-index:10000;background:#000;cursor:pointer;-webkit-user-select:none;user-select:none}.pptx-ng-presentation-root{position:absolute;inset:0;touch-action:pan-y}.pptx-ng-presentation-close:hover,.pptx-ng-presentation-nav:hover{background:#000000bf}.pptx-ng-presentation-tools{position:absolute;bottom:max(1rem,env(safe-area-inset-bottom));left:1rem;display:flex;gap:.25rem;padding:.25rem;border-radius:.5rem;background:#0000008c;z-index:80}.pptx-ng-presentation-tools button{width:2rem;height:2rem;border:none;border-radius:.35rem;background:transparent;color:#fff;font-size:1rem;cursor:pointer}.pptx-ng-presentation-tools button:hover{background:#ffffff26}.pptx-ng-presentation-tools button.is-active{background:#ffffff4d}.presenter-blank{position:absolute;inset:0;z-index:75}.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", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: 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: LucidePenTool, selector: "svg[lucidePenTool]" }, { kind: "component", type: LucideHighlighter, selector: "svg[lucideHighlighter]" }, { kind: "component", type: LucideEraser, selector: "svg[lucideEraser]" }, { kind: "component", type: LucideMousePointer2, selector: "svg[lucideMousePointer2]" }, { kind: "component", type: LucideTrash2, selector: "svg[lucideTrash2]" }, { kind: "component", type: LucideX, selector: "svg[lucideX]" }, { kind: "component", type: LucideChevronLeft, selector: "svg[lucideChevronLeft]" }, { kind: "component", type: LucideChevronRight, selector: "svg[lucideChevronRight]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
84205
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", 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 }, 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 }, presenterMode: { classPropertyName: "presenterMode", publicName: "presenterMode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { indexChange: "indexChange", closed: "closed", subtitlesChange: "subtitlesChange", presenterViewToggle: "presenterViewToggle", annotationsExit: "annotationsExit" }, host: { listeners: { "document:fullscreenchange": "onFullscreenChange()", "window:resize": "onWindowResize()", "document:keydown": "onKeyDown($event)" } }, providers: [AnimationPlaybackService, PresentationAnnotationsService, ZoomNavigationService], viewQueries: [{ propertyName: "stageRef", first: true, predicate: ["stage"], descendants: true, isSignal: true }, { propertyName: "rootRef", first: true, predicate: ["root"], descendants: true, isSignal: true }], ngImport: i0, template: "<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)=\"$event.preventDefault()\"\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. -->\n\t\t@if (inkMarkupVisible()) {\n\t\t\t<pptx-presentation-annotation-overlay [canvasSize]=\"canvasSize()\" [zoom]=\"zoom()\" />\n\t\t}\n\t</div>\n\t@if (presenterWindow.snapshot().blackout !== 'none') {\n\t\t<div class=\"presenter-blank\" [style.background]=\"presenterWindow.snapshot().blackout\"></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\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[currentSlideIndex]=\"currentIndex()\"\n\t\t[totalSlides]=\"slides().length\"\n\t\t[presentationStartTime]=\"showStartedAt\"\n\t\t[presenterMode]=\"presenterMode()\"\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\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\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</div>\n", styles: [":host{display:block;position:fixed;inset:0;z-index:10000;background:#000;cursor:pointer;-webkit-user-select:none;user-select:none}.pptx-ng-presentation-root{position:absolute;inset:0;touch-action:pan-y}.pptx-ng-presentation-close:hover,.pptx-ng-presentation-nav:hover{background:#000000bf}@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}.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", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: 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"], outputs: ["move", "endPresentation", "presenterViewToggle"] }, { 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 });
|
|
82518
84206
|
}
|
|
82519
84207
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PresentationOverlayComponent, decorators: [{
|
|
82520
84208
|
type: Component,
|
|
@@ -82524,17 +84212,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
82524
84212
|
PresentationTransitionOverlayComponent,
|
|
82525
84213
|
PresentationAnnotationOverlayComponent,
|
|
82526
84214
|
PresentationSubtitleBarComponent,
|
|
84215
|
+
PresentationToolbarComponent,
|
|
82527
84216
|
TranslatePipe,
|
|
82528
|
-
LucidePenTool,
|
|
82529
|
-
LucideHighlighter,
|
|
82530
|
-
LucideEraser,
|
|
82531
|
-
LucideMousePointer2,
|
|
82532
|
-
LucideTrash2,
|
|
82533
84217
|
LucideX,
|
|
82534
84218
|
LucideChevronLeft,
|
|
82535
84219
|
LucideChevronRight,
|
|
82536
|
-
], providers: [AnimationPlaybackService, PresentationAnnotationsService, ZoomNavigationService], 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)=\"$event.preventDefault()\"\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. -->\n\t\t@if (inkMarkupVisible()) {\n\t\t\t<pptx-presentation-annotation-overlay [canvasSize]=\"canvasSize()\" [zoom]=\"zoom()\" />\n\t\t}\n\t</div>\n\t@if (presenterWindow.snapshot().blackout !== 'none') {\n\t\t<div class=\"presenter-blank\" [style.background]=\"presenterWindow.snapshot().blackout\"></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
|
|
82537
|
-
}], ctorParameters: () => [], propDecorators: { slides: [{ type: i0.Input, args: [{ isSignal: true, alias: "slides", required: true }] }], canvasSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasSize", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], startIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "startIndex", required: false }] }], showWithAnimation: [{ type: i0.Input, args: [{ isSignal: true, alias: "showWithAnimation", required: false }] }], useTimings: [{ type: i0.Input, args: [{ isSignal: true, alias: "useTimings", required: false }] }], subtitlesVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitlesVisible", required: false }] }], sessionEnded: [{ type: i0.Input, args: [{ isSignal: true, alias: "sessionEnded", required: false }] }], endWithBlackSlide: [{ type: i0.Input, args: [{ isSignal: true, alias: "endWithBlackSlide", required: false }] }], indexChange: [{ type: i0.Output, args: ["indexChange"] }], closed: [{ type: i0.Output, args: ["closed"] }], subtitlesChange: [{ type: i0.Output, args: ["subtitlesChange"] }], annotationsExit: [{ type: i0.Output, args: ["annotationsExit"] }], stageRef: [{ type: i0.ViewChild, args: ['stage', { isSignal: true }] }], rootRef: [{ type: i0.ViewChild, args: ['root', { isSignal: true }] }], onFullscreenChange: [{
|
|
84220
|
+
], providers: [AnimationPlaybackService, PresentationAnnotationsService, ZoomNavigationService], 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)=\"$event.preventDefault()\"\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. -->\n\t\t@if (inkMarkupVisible()) {\n\t\t\t<pptx-presentation-annotation-overlay [canvasSize]=\"canvasSize()\" [zoom]=\"zoom()\" />\n\t\t}\n\t</div>\n\t@if (presenterWindow.snapshot().blackout !== 'none') {\n\t\t<div class=\"presenter-blank\" [style.background]=\"presenterWindow.snapshot().blackout\"></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\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[currentSlideIndex]=\"currentIndex()\"\n\t\t[totalSlides]=\"slides().length\"\n\t\t[presentationStartTime]=\"showStartedAt\"\n\t\t[presenterMode]=\"presenterMode()\"\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\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\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</div>\n", styles: [":host{display:block;position:fixed;inset:0;z-index:10000;background:#000;cursor:pointer;-webkit-user-select:none;user-select:none}.pptx-ng-presentation-root{position:absolute;inset:0;touch-action:pan-y}.pptx-ng-presentation-close:hover,.pptx-ng-presentation-nav:hover{background:#000000bf}@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}.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"] }]
|
|
84221
|
+
}], ctorParameters: () => [], propDecorators: { slides: [{ type: i0.Input, args: [{ isSignal: true, alias: "slides", required: true }] }], canvasSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasSize", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], startIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "startIndex", required: false }] }], showWithAnimation: [{ type: i0.Input, args: [{ isSignal: true, alias: "showWithAnimation", required: false }] }], useTimings: [{ type: i0.Input, args: [{ isSignal: true, alias: "useTimings", required: false }] }], subtitlesVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitlesVisible", required: false }] }], sessionEnded: [{ type: i0.Input, args: [{ isSignal: true, alias: "sessionEnded", required: false }] }], endWithBlackSlide: [{ type: i0.Input, args: [{ isSignal: true, alias: "endWithBlackSlide", required: false }] }], presenterMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "presenterMode", required: false }] }], indexChange: [{ type: i0.Output, args: ["indexChange"] }], closed: [{ type: i0.Output, args: ["closed"] }], subtitlesChange: [{ type: i0.Output, args: ["subtitlesChange"] }], presenterViewToggle: [{ type: i0.Output, args: ["presenterViewToggle"] }], annotationsExit: [{ type: i0.Output, args: ["annotationsExit"] }], stageRef: [{ type: i0.ViewChild, args: ['stage', { isSignal: true }] }], rootRef: [{ type: i0.ViewChild, args: ['root', { isSignal: true }] }], onFullscreenChange: [{
|
|
82538
84222
|
type: HostListener,
|
|
82539
84223
|
args: ['document:fullscreenchange']
|
|
82540
84224
|
}], onWindowResize: [{
|
|
@@ -84567,10 +86251,6 @@ const SEQUENCE_OPTIONS = [
|
|
|
84567
86251
|
* so the ribbon keeps the single-row height `e2e/ribbon-tab-parity.spec.ts`
|
|
84568
86252
|
* guards.
|
|
84569
86253
|
*/
|
|
84570
|
-
/** The i18n key naming a preset, shared by every binding's gallery. */
|
|
84571
|
-
function animationPresetLabelKey(preset) {
|
|
84572
|
-
return `pptx.animation.preset.${preset}`;
|
|
84573
|
-
}
|
|
84574
86254
|
function entries(presets) {
|
|
84575
86255
|
return presets.map((value) => ({ value, labelKey: animationPresetLabelKey(value) }));
|
|
84576
86256
|
}
|
|
@@ -88060,7 +89740,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
88060
89740
|
}], propDecorators: { canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], slideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideIndex", required: false }] }] } });
|
|
88061
89741
|
|
|
88062
89742
|
// Generated by scripts/inline-shared.mjs from package.json. Do not edit.
|
|
88063
|
-
const PPTX_ANGULAR_VIEWER_VERSION = "2.11.
|
|
89743
|
+
const PPTX_ANGULAR_VIEWER_VERSION = "2.11.1";
|
|
88064
89744
|
|
|
88065
89745
|
/**
|
|
88066
89746
|
* account-page.component.ts: File > Account content.
|
|
@@ -93700,8 +95380,14 @@ class AnimationTimelineComponent {
|
|
|
93700
95380
|
}
|
|
93701
95381
|
return getAnimationElementLabel(element);
|
|
93702
95382
|
}
|
|
95383
|
+
/**
|
|
95384
|
+
* The i18n key naming the row's effect, not finished text: resolving text in
|
|
95385
|
+
* an `OnPush` getter would freeze the wording at the language that happened
|
|
95386
|
+
* to be active when the view last rendered. The row used to print the raw
|
|
95387
|
+
* preset token (`fadeIn`) here.
|
|
95388
|
+
*/
|
|
93703
95389
|
effect(animation) {
|
|
93704
|
-
return
|
|
95390
|
+
return animationEffectLabelKey(animation);
|
|
93705
95391
|
}
|
|
93706
95392
|
preview(animation) {
|
|
93707
95393
|
previewAngularAnimation(animation);
|
|
@@ -93762,17 +95448,17 @@ class AnimationTimelineComponent {
|
|
|
93762
95448
|
>
|
|
93763
95449
|
<span class="grip">⋮⋮</span><span class="order">{{ index + 1 }}.</span
|
|
93764
95450
|
><span class="name">{{ label(animation.elementId) }}</span
|
|
93765
|
-
><span class="effect">{{ effect(animation) }}</span>
|
|
95451
|
+
><span class="effect">{{ effect(animation) | translate }}</span>
|
|
93766
95452
|
</div>
|
|
93767
95453
|
}
|
|
93768
95454
|
</div>
|
|
93769
95455
|
</section>
|
|
93770
95456
|
}
|
|
93771
|
-
`, isInline: true, styles: [".timeline{display:grid;gap:6px;padding:8px 0;border-top:1px solid var(--pptx-inspector-border, #333)}h4{margin:0;color:var(--pptx-inspector-muted, #888);font-size:10px;text-transform:uppercase}.bar{position:relative;height:22px;overflow:hidden;border:1px solid var(--pptx-inspector-border, #444);border-radius:3px;background:var(--pptx-inspector-input-bg, #2d2d2d)}.bar span{position:absolute;top:3px;bottom:3px;min-width:2%;border-radius:2px;background:#6b9a68}.bar span.selected{outline:1px solid var(--pptx-primary, #4c9ffe)}.list{display:grid;gap:3px;max-height:160px;overflow-y:auto}.item{display:flex;align-items:center;gap:4px;min-width:0;padding:4px;border:1px solid transparent;border-radius:3px;background:var(--pptx-inspector-input-bg, #2d2d2d);cursor:grab;font-size:10px}.item.selected{border-color:var(--pptx-primary, #4c9ffe)}.item.drag-over{border-top:2px solid var(--pptx-primary, #4c9ffe)}.grip,.order{color:var(--pptx-inspector-muted, #888)}.name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.effect{color:var(--pptx-inspector-muted, #aaa)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
95457
|
+
`, isInline: true, styles: [".timeline{display:grid;gap:6px;padding:8px 0;border-top:1px solid var(--pptx-inspector-border, #333)}h4{margin:0;color:var(--pptx-inspector-muted, #888);font-size:10px;text-transform:uppercase}.bar{position:relative;height:22px;overflow:hidden;border:1px solid var(--pptx-inspector-border, #444);border-radius:3px;background:var(--pptx-inspector-input-bg, #2d2d2d)}.bar span{position:absolute;top:3px;bottom:3px;min-width:2%;border-radius:2px;background:#6b9a68}.bar span.selected{outline:1px solid var(--pptx-primary, #4c9ffe)}.list{display:grid;gap:3px;max-height:160px;overflow-y:auto}.item{display:flex;align-items:center;gap:4px;min-width:0;padding:4px;border:1px solid transparent;border-radius:3px;background:var(--pptx-inspector-input-bg, #2d2d2d);cursor:grab;font-size:10px}.item.selected{border-color:var(--pptx-primary, #4c9ffe)}.item.drag-over{border-top:2px solid var(--pptx-primary, #4c9ffe)}.grip,.order{color:var(--pptx-inspector-muted, #888)}.name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.effect{color:var(--pptx-inspector-muted, #aaa)}\n"], dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
93772
95458
|
}
|
|
93773
95459
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AnimationTimelineComponent, decorators: [{
|
|
93774
95460
|
type: Component,
|
|
93775
|
-
args: [{ selector: 'pptx-animation-timeline', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
95461
|
+
args: [{ selector: 'pptx-animation-timeline', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslatePipe], template: `
|
|
93776
95462
|
@if (sorted().length) {
|
|
93777
95463
|
<section class="timeline" aria-label="Animation timeline">
|
|
93778
95464
|
<h4>Timeline</h4>
|
|
@@ -93801,7 +95487,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
93801
95487
|
>
|
|
93802
95488
|
<span class="grip">⋮⋮</span><span class="order">{{ index + 1 }}.</span
|
|
93803
95489
|
><span class="name">{{ label(animation.elementId) }}</span
|
|
93804
|
-
><span class="effect">{{ effect(animation) }}</span>
|
|
95490
|
+
><span class="effect">{{ effect(animation) | translate }}</span>
|
|
93805
95491
|
</div>
|
|
93806
95492
|
}
|
|
93807
95493
|
</div>
|
|
@@ -98318,6 +100004,18 @@ function smartArtStyleLabelKey(style) {
|
|
|
98318
100004
|
function smartArtLayoutLabelKey(layout) {
|
|
98319
100005
|
return schemaLabelKey(SMARTART_LAYOUT_LABEL_KEYS, layout);
|
|
98320
100006
|
}
|
|
100007
|
+
/**
|
|
100008
|
+
* `a:headEnd`/`a:tailEnd` arrowhead type (`none`, `triangle`, `arrow`, ...).
|
|
100009
|
+
*
|
|
100010
|
+
* WHY it goes through the shared catalogue instead of interpolating the token
|
|
100011
|
+
* into `pptx.arrowhead.<token>`: that shortcut spelled `arrow` as "Arrow",
|
|
100012
|
+
* while the other four bindings (which all read this catalogue) spelled it
|
|
100013
|
+
* "Open Arrow", which is what PowerPoint calls that head (`msoArrowheadOpen`).
|
|
100014
|
+
* The same control therefore read differently depending on the framework.
|
|
100015
|
+
*/
|
|
100016
|
+
function arrowheadLabelKey(type) {
|
|
100017
|
+
return schemaLabelKey(ARROWHEAD_LABEL_KEYS, type);
|
|
100018
|
+
}
|
|
98321
100019
|
/** Arrowhead width/length step (`sm` / `med` / `lg`). */
|
|
98322
100020
|
function arrowSizeLabelKey(size) {
|
|
98323
100021
|
return schemaLabelKey(ARROW_SIZE_LABEL_KEYS, size);
|
|
@@ -98376,7 +100074,7 @@ class ElementMiscPropertiesComponent {
|
|
|
98376
100074
|
oleType = computed(() => getOleObjectTypeLabel(this.ole()?.oleObjectType), /* @ts-ignore */
|
|
98377
100075
|
...(ngDevMode ? [{ debugName: "oleType" }] : /* istanbul ignore next */ []));
|
|
98378
100076
|
arrowLabel(value) {
|
|
98379
|
-
return
|
|
100077
|
+
return arrowheadLabelKey(value);
|
|
98380
100078
|
}
|
|
98381
100079
|
/**
|
|
98382
100080
|
* Spell an arrowhead width/length step. `sm` / `med` / `lg` are the literal
|
|
@@ -107273,12 +108971,24 @@ class SlideSorterOverlayComponent {
|
|
|
107273
108971
|
const s = slide;
|
|
107274
108972
|
return s['hidden'] === true;
|
|
107275
108973
|
}
|
|
108974
|
+
/** Dictionary key for the word shown and announced on a hidden slide's cell. */
|
|
108975
|
+
hiddenLabelKey = HIDDEN_SLIDE_LABEL_KEY;
|
|
108976
|
+
/** Shared slash mark, bound inline so a stylesheet copy cannot drift. */
|
|
108977
|
+
slashGradient = HIDDEN_SLIDE_SLASH_GRADIENT;
|
|
108978
|
+
/**
|
|
108979
|
+
* The shared cue for one cell. The dim already came off `.is-hidden`, but
|
|
108980
|
+
* opacity is a colour-only signal and said nothing to a screen reader, so
|
|
108981
|
+
* this adds the number slash, the word, and the neutral marker attribute.
|
|
108982
|
+
*/
|
|
108983
|
+
hiddenCue(slide, index) {
|
|
108984
|
+
return hiddenSlideCue(this.isHiddenSlide(slide), 'sorter', index);
|
|
108985
|
+
}
|
|
107276
108986
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SlideSorterOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
107277
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", 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 } }, outputs: { select: "select", closed: "closed" }, 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<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]=\"
|
|
108987
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", 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 } }, outputs: { select: "select", closed: "closed" }, 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>\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/>\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</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}\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", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
107278
108988
|
}
|
|
107279
108989
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SlideSorterOverlayComponent, decorators: [{
|
|
107280
108990
|
type: Component,
|
|
107281
|
-
args: [{ selector: 'pptx-slide-sorter-overlay', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgStyle, SlideCanvasComponent, TranslatePipe], 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<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]=\"
|
|
108991
|
+
args: [{ selector: 'pptx-slide-sorter-overlay', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgStyle, SlideCanvasComponent, TranslatePipe], 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>\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/>\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</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}\n"] }]
|
|
107282
108992
|
}], propDecorators: { slides: [{ type: i0.Input, args: [{ isSignal: true, alias: "slides", required: true }] }], canvasSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasSize", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], activeIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeIndex", required: false }] }], select: [{ type: i0.Output, args: ["select"] }], closed: [{ type: i0.Output, args: ["closed"] }], onKeydown: [{
|
|
107283
108993
|
type: HostListener,
|
|
107284
108994
|
args: ['document:keydown', ['$event']]
|
|
@@ -107423,8 +109133,26 @@ class SlidesPanelComponent {
|
|
|
107423
109133
|
sectionIndex(sectionId) {
|
|
107424
109134
|
return this.editor.sections().findIndex((section) => section.id === sectionId);
|
|
107425
109135
|
}
|
|
109136
|
+
/** Dictionary key for the word shown and announced on a hidden slide's card. */
|
|
109137
|
+
hiddenLabelKey = HIDDEN_SLIDE_LABEL_KEY;
|
|
109138
|
+
/**
|
|
109139
|
+
* The hidden-slide slash and dim, bound as inline styles rather than written
|
|
109140
|
+
* into `slides-panel.component.css`. A component stylesheet cannot read a TS
|
|
109141
|
+
* constant, so a literal copy there would be free to drift from the four
|
|
109142
|
+
* other bindings; binding the shared values makes drift impossible.
|
|
109143
|
+
*/
|
|
109144
|
+
slashGradient = HIDDEN_SLIDE_SLASH_GRADIENT;
|
|
109145
|
+
dimOpacity = HIDDEN_SLIDE_DIM_OPACITY;
|
|
109146
|
+
/**
|
|
109147
|
+
* The shared rail/sorter cue for one card. A hidden slide is still LISTED
|
|
109148
|
+
* here (hiding only removes it from the show), so without this the panel gave
|
|
109149
|
+
* a user no way to tell that a slide will be skipped.
|
|
109150
|
+
*/
|
|
109151
|
+
hiddenCue(slide, index) {
|
|
109152
|
+
return hiddenSlideCue(slide.hidden, 'rail', index);
|
|
109153
|
+
}
|
|
107426
109154
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SlidesPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
107427
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", 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@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<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\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(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) -->\n\t\t\t\t\t\t\t\t<span class=\"pptx-ng-spanel-num\" aria-hidden=\"true\">{{ i + 1 }}</span>\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/>\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-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{overflow:hidden;border-radius:2px}.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", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: LucideCopy, selector: "svg[lucideCopy]" }, { kind: "component", type: LucideTrash2, selector: "svg[lucideTrash2]" }, { kind: "component", type: LucideArrowUp, selector: "svg[lucideArrowUp]" }, { kind: "component", type: LucideArrowDown, selector: "svg[lucideArrowDown]" }, { kind: "component", type: LucidePlus, selector: "svg[lucidePlus]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
109155
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", 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<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[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-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", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: LucideCopy, selector: "svg[lucideCopy]" }, { kind: "component", type: LucideTrash2, selector: "svg[lucideTrash2]" }, { kind: "component", type: LucideArrowUp, selector: "svg[lucideArrowUp]" }, { kind: "component", type: LucideArrowDown, selector: "svg[lucideArrowDown]" }, { kind: "component", type: LucidePlus, selector: "svg[lucidePlus]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
107428
109156
|
}
|
|
107429
109157
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SlidesPanelComponent, decorators: [{
|
|
107430
109158
|
type: Component,
|
|
@@ -107437,7 +109165,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
107437
109165
|
LucideArrowUp,
|
|
107438
109166
|
LucideArrowDown,
|
|
107439
109167
|
LucidePlus,
|
|
107440
|
-
], 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@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<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\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(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) -->\n\t\t\t\t\t\t\t\t<span class=\"pptx-ng-spanel-num\" aria-hidden=\"true\">{{ i + 1 }}</span>\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/>\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-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{overflow:hidden;border-radius:2px}.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"] }]
|
|
109168
|
+
], 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<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[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-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"] }]
|
|
107441
109169
|
}], ctorParameters: () => [], propDecorators: { canvasSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasSize", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], activeIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeIndex", required: false }] }], select: [{ type: i0.Output, args: ["select"] }], scrollViewport: [{ type: i0.ViewChild, args: ['scrollViewport', { isSignal: true }] }] } });
|
|
107442
109170
|
|
|
107443
109171
|
class StatusBarComponent {
|
|
@@ -116083,6 +117811,8 @@ class PowerPointViewerComponent {
|
|
|
116083
117811
|
[subtitlesVisible]="presentationMode.subtitlesVisible()"
|
|
116084
117812
|
[sessionEnded]="audienceSessionEnded()"
|
|
116085
117813
|
[endWithBlackSlide]="viewerOpts.options().advanced.slideShowEndWithBlackSlide"
|
|
117814
|
+
[presenterMode]="presentationMode.presentingPresenter()"
|
|
117815
|
+
(presenterViewToggle)="presentationMode.togglePresenterView()"
|
|
116086
117816
|
(subtitlesChange)="presentationMode.subtitlesVisible.set($event)"
|
|
116087
117817
|
(indexChange)="presentationMode.onPresentationIndexChange($event)"
|
|
116088
117818
|
(annotationsExit)="presentationMode.onPresentationAnnotationsExit($event)"
|
|
@@ -116363,7 +118093,7 @@ class PowerPointViewerComponent {
|
|
|
116363
118093
|
/>
|
|
116364
118094
|
}
|
|
116365
118095
|
</div>
|
|
116366
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresentationOverlayComponent, selector: "pptx-presentation-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "startIndex", "showWithAnimation", "useTimings", "subtitlesVisible", "sessionEnded", "endWithBlackSlide"], outputs: ["indexChange", "closed", "subtitlesChange", "annotationsExit"] }, { kind: "component", type: PresenterViewComponent, selector: "pptx-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime", "isAudienceWindowOpen"], outputs: ["movePresentationSlide", "exit", "openAudienceWindow", "closeAudienceWindow", "navigateToSlide"] }, { kind: "component", type: MobilePresenterViewComponent, selector: "pptx-mobile-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime"], outputs: ["movePresentationSlide", "exit"] }, { kind: "component", type: SlideSorterOverlayComponent, selector: "pptx-slide-sorter-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select", "closed"] }, { kind: "component", type: 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"], outputs: ["commentAdd", "commentRemove", "commentResolve"] }, { kind: "component", type: FindBarComponent, selector: "pptx-find-bar", inputs: ["slides"], outputs: ["navigate", "closed"] }, { kind: "component", type: FindReplaceBarComponent, selector: "pptx-find-replace-bar", inputs: ["matchCount", "matchIndex"], outputs: ["find", "navigate", "replaceOne", "replaceAll", "close"] }, { kind: "component", type: SlidesPanelComponent, selector: "pptx-slides-panel", inputs: ["canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select"] }, { kind: "component", type: StatusBarComponent, selector: "pptx-status-bar", inputs: ["slideIndex", "slideCount", "canEdit", "dirty", "autosaveStatus", "notesOpen", "zoomPercent", "sorterActive", "presenting", "hiddenActions"], outputs: ["toggleNotes", "normalView", "openSorter", "slideShow", "zoomIn", "zoomOut", "zoomReset"] }, { kind: "component", type: EditorContextMenuComponent, selector: "pptx-editor-context-menu", inputs: ["x", "y", "slideIndex", "showAiActions"], outputs: ["closed", "askAi", "fixAi", "editHyperlink", "addComment"] }, { kind: "component", type: ExportProgressModalComponent, selector: "pptx-export-progress-modal", inputs: ["open", "title", "progress", "statusMessage"], outputs: ["cancel"] }, { kind: "component", type: CommentsPanelComponent, selector: "pptx-comments-panel", inputs: ["comments", "authorName"], outputs: ["add", "remove", "resolve"] }, { kind: "component", type: SignaturesPanelComponent, selector: "pptx-signatures-panel", inputs: ["signatures"] }, { kind: "component", type: AccessibilityPanelComponent, selector: "pptx-accessibility-panel", inputs: ["issues"], outputs: ["selectSlide"] }, { kind: "component", type: CollaborationCursorsComponent, selector: "pptx-collaboration-cursors", inputs: ["cursors", "zoom"] }, { kind: "component", type: RemoteSelectionOverlayComponent, selector: "pptx-remote-selection-overlay", inputs: ["presences", "elements", "activeSlideIndex", "zoom"] }, { kind: "component", type: 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"], outputs: ["print", "cancel"] }, { kind: "component", type: ShareDialogComponent, selector: "pptx-share-dialog", inputs: ["open", "defaults", "active", "connected", "userCount", "shareUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: BroadcastDialogComponent, selector: "pptx-broadcast-dialog", inputs: ["open", "defaults", "active", "connected", "viewerCount", "viewerUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: MobileBottomBarComponent, selector: "pptx-mobile-bottom-bar", inputs: ["slideCount", "commentCount", "activeSheet"], outputs: ["openSlides", "insert", "openFormat", "openComments", "notes"] }, { kind: "component", type: MobileMenuSheetComponent, selector: "pptx-mobile-menu-sheet", inputs: ["open", "slideCount", "exporting", "showNotes", "canEdit", "hiddenActions"], outputs: ["closed", "openFind", "openSorter", "toggleNotes", "insertText", "present", "openFile", "savePptx", "exportPng", "exportPdf", "exportGif", "exportVideo", "print"] }, { kind: "component", type: MobileSlidesSheetComponent, selector: "pptx-mobile-slides-sheet", inputs: ["open", "slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["closed", "jumpToSlide"] }, { kind: "component", type: MobileToolbarComponent, selector: "pptx-mobile-toolbar", inputs: ["canUndo", "canRedo", "canPresent", "canEdit", "menuOpen", "aiEnabled", "aiPanelOpen", "hiddenActions"], outputs: ["toggleMenu", "toggleAiPanel", "undo", "redo", "share", "save", "present"] }, { kind: "component", type: MasterViewCanvasComponent, selector: "pptx-master-view-canvas", inputs: ["tab", "slideMasters", "activeMasterIndex", "activeLayoutIndex", "notesMaster", "handoutMaster", "canvasSize", "notesCanvasSize", "mediaDataUrls", "editable"], outputs: ["notesMasterChange", "handoutMasterChange"] }, { kind: "component", type: MasterViewSidebarComponent, selector: "pptx-master-view-sidebar", inputs: ["tab", "slideMasters", "notesMaster", "handoutMaster", "activeMasterIndex", "activeLayoutIndex", "handoutSlidesPerPage"], outputs: ["tabChange", "selectMaster", "selectLayout", "slidesPerPageChange", "backgroundChange", "close"] }, { kind: "component", type: NotesPanelComponent, selector: "pptx-notes-panel", inputs: ["slide", "expanded"], outputs: ["update", "notesToggle"] }, { kind: "component", type: RibbonComponent, selector: "pptx-ribbon", inputs: ["slideIndex", "slideCount", "canEdit", "selectedElement", "zoomPercent", "formatPainterActive", "canActivateFormatPainter", "exporting", "hasMacros", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToShape", "eyedropperActive", "themeGalleryOpen", "sidebarCollapsed", "inspectorOpen", "commentsOpen", "commentCount", "findOpen", "collabConnected", "connectedCount", "spellCheckEnabled", "showSubtitles", "hiddenActions", "aiEnabled", "aiPanelOpen", "accountAuth", "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", "packageForSharing", "toggleSidebar", "toggleAiPanel", "signatures", "info", "print", "comments", "a11y", "link", "openSorter", "openReadingView", "openOutlineView", "openMasterView", "toggleNotes", "toggleFormatPainter", "exportPng", "exportPdf", "exportGif", "exportVideo", "copySlideAsImage", "replace", "toggleInspector", "drawToolChange", "toggleThemeGallery", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "openCustomShows", "toggleSnapToGrid", "toggleSnapToShape", "addGuide", "zoomToFit", "toggleEyedropper", "openSmartArtDialog", "openEquationDialog", "openSetUpSlideShow", "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"], outputs: ["applyTheme", "applyCustomTheme", "close"] }, { kind: "component", type: SelectionPaneComponent, selector: "pptx-selection-pane", inputs: ["elements", "selectedIds"], outputs: ["selectElement", "bringForward", "sendBackward", "toggleHidden"] }, { kind: "component", type: CustomShowsComponent, selector: "pptx-custom-shows", inputs: ["open", "slides", "customShows", "activeCustomShowId"], outputs: ["create", "remove", "update", "setActive", "close"] }, { kind: "component", type: InsertSmartArtDialogComponent, selector: "pptx-insert-smart-art-dialog", inputs: ["open"], outputs: ["close", "insert"] }, { kind: "component", type: ViewerExtraDialogsComponent, selector: "pptx-viewer-extra-dialogs", inputs: ["activeSlideIndex", "selectedElementId", "filePath", "customShows", "themeKey", "availableThemes", "localeCode", "availableLocales", "aiExportVisible"], outputs: ["restoreContent", "themeKeySelect", "localeSelect"] }, { kind: "component", type: RehearseTimingsComponent, selector: "pptx-rehearse-timings", inputs: ["summary", "paused", "slideStartedAt", "presentationStartedAt", "timings"], outputs: ["togglePause", "save", "discard"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [/* @ts-ignore */
|
|
118096
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "rulerUnit", "showGuides", "snapToGrid", "snapToShape", "guideCommand", "spellCheck", "snapToGuides", "autoFit", "transparentBackground", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "aiHighlights", "aiActive", "aiActiveSlideIndex", "aiChangeBatch", "aiPickMode", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textInput", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresentationOverlayComponent, selector: "pptx-presentation-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "startIndex", "showWithAnimation", "useTimings", "subtitlesVisible", "sessionEnded", "endWithBlackSlide", "presenterMode"], outputs: ["indexChange", "closed", "subtitlesChange", "presenterViewToggle", "annotationsExit"] }, { kind: "component", type: PresenterViewComponent, selector: "pptx-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime", "isAudienceWindowOpen"], outputs: ["movePresentationSlide", "exit", "openAudienceWindow", "closeAudienceWindow", "navigateToSlide"] }, { kind: "component", type: MobilePresenterViewComponent, selector: "pptx-mobile-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime"], outputs: ["movePresentationSlide", "exit"] }, { kind: "component", type: SlideSorterOverlayComponent, selector: "pptx-slide-sorter-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select", "closed"] }, { kind: "component", type: 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"], outputs: ["commentAdd", "commentRemove", "commentResolve"] }, { kind: "component", type: FindBarComponent, selector: "pptx-find-bar", inputs: ["slides"], outputs: ["navigate", "closed"] }, { kind: "component", type: FindReplaceBarComponent, selector: "pptx-find-replace-bar", inputs: ["matchCount", "matchIndex"], outputs: ["find", "navigate", "replaceOne", "replaceAll", "close"] }, { kind: "component", type: SlidesPanelComponent, selector: "pptx-slides-panel", inputs: ["canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select"] }, { kind: "component", type: StatusBarComponent, selector: "pptx-status-bar", inputs: ["slideIndex", "slideCount", "canEdit", "dirty", "autosaveStatus", "notesOpen", "zoomPercent", "sorterActive", "presenting", "hiddenActions"], outputs: ["toggleNotes", "normalView", "openSorter", "slideShow", "zoomIn", "zoomOut", "zoomReset"] }, { kind: "component", type: EditorContextMenuComponent, selector: "pptx-editor-context-menu", inputs: ["x", "y", "slideIndex", "showAiActions"], outputs: ["closed", "askAi", "fixAi", "editHyperlink", "addComment"] }, { kind: "component", type: ExportProgressModalComponent, selector: "pptx-export-progress-modal", inputs: ["open", "title", "progress", "statusMessage"], outputs: ["cancel"] }, { kind: "component", type: CommentsPanelComponent, selector: "pptx-comments-panel", inputs: ["comments", "authorName"], outputs: ["add", "remove", "resolve"] }, { kind: "component", type: SignaturesPanelComponent, selector: "pptx-signatures-panel", inputs: ["signatures"] }, { kind: "component", type: AccessibilityPanelComponent, selector: "pptx-accessibility-panel", inputs: ["issues"], outputs: ["selectSlide"] }, { kind: "component", type: CollaborationCursorsComponent, selector: "pptx-collaboration-cursors", inputs: ["cursors", "zoom"] }, { kind: "component", type: RemoteSelectionOverlayComponent, selector: "pptx-remote-selection-overlay", inputs: ["presences", "elements", "activeSlideIndex", "zoom"] }, { kind: "component", type: 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"], outputs: ["print", "cancel"] }, { kind: "component", type: ShareDialogComponent, selector: "pptx-share-dialog", inputs: ["open", "defaults", "active", "connected", "userCount", "shareUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: BroadcastDialogComponent, selector: "pptx-broadcast-dialog", inputs: ["open", "defaults", "active", "connected", "viewerCount", "viewerUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: MobileBottomBarComponent, selector: "pptx-mobile-bottom-bar", inputs: ["slideCount", "commentCount", "activeSheet"], outputs: ["openSlides", "insert", "openFormat", "openComments", "notes"] }, { kind: "component", type: MobileMenuSheetComponent, selector: "pptx-mobile-menu-sheet", inputs: ["open", "slideCount", "exporting", "showNotes", "canEdit", "hiddenActions"], outputs: ["closed", "openFind", "openSorter", "toggleNotes", "insertText", "present", "openFile", "savePptx", "exportPng", "exportPdf", "exportGif", "exportVideo", "print"] }, { kind: "component", type: MobileSlidesSheetComponent, selector: "pptx-mobile-slides-sheet", inputs: ["open", "slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["closed", "jumpToSlide"] }, { kind: "component", type: MobileToolbarComponent, selector: "pptx-mobile-toolbar", inputs: ["canUndo", "canRedo", "canPresent", "canEdit", "menuOpen", "aiEnabled", "aiPanelOpen", "hiddenActions"], outputs: ["toggleMenu", "toggleAiPanel", "undo", "redo", "share", "save", "present"] }, { kind: "component", type: MasterViewCanvasComponent, selector: "pptx-master-view-canvas", inputs: ["tab", "slideMasters", "activeMasterIndex", "activeLayoutIndex", "notesMaster", "handoutMaster", "canvasSize", "notesCanvasSize", "mediaDataUrls", "editable"], outputs: ["notesMasterChange", "handoutMasterChange"] }, { kind: "component", type: MasterViewSidebarComponent, selector: "pptx-master-view-sidebar", inputs: ["tab", "slideMasters", "notesMaster", "handoutMaster", "activeMasterIndex", "activeLayoutIndex", "handoutSlidesPerPage"], outputs: ["tabChange", "selectMaster", "selectLayout", "slidesPerPageChange", "backgroundChange", "close"] }, { kind: "component", type: NotesPanelComponent, selector: "pptx-notes-panel", inputs: ["slide", "expanded"], outputs: ["update", "notesToggle"] }, { kind: "component", type: RibbonComponent, selector: "pptx-ribbon", inputs: ["slideIndex", "slideCount", "canEdit", "selectedElement", "zoomPercent", "formatPainterActive", "canActivateFormatPainter", "exporting", "hasMacros", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToShape", "eyedropperActive", "themeGalleryOpen", "sidebarCollapsed", "inspectorOpen", "commentsOpen", "commentCount", "findOpen", "collabConnected", "connectedCount", "spellCheckEnabled", "showSubtitles", "hiddenActions", "aiEnabled", "aiPanelOpen", "accountAuth", "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", "packageForSharing", "toggleSidebar", "toggleAiPanel", "signatures", "info", "print", "comments", "a11y", "link", "openSorter", "openReadingView", "openOutlineView", "openMasterView", "toggleNotes", "toggleFormatPainter", "exportPng", "exportPdf", "exportGif", "exportVideo", "copySlideAsImage", "replace", "toggleInspector", "drawToolChange", "toggleThemeGallery", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "openCustomShows", "toggleSnapToGrid", "toggleSnapToShape", "addGuide", "zoomToFit", "toggleEyedropper", "openSmartArtDialog", "openEquationDialog", "openSetUpSlideShow", "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"], outputs: ["applyTheme", "applyCustomTheme", "close"] }, { kind: "component", type: SelectionPaneComponent, selector: "pptx-selection-pane", inputs: ["elements", "selectedIds"], outputs: ["selectElement", "bringForward", "sendBackward", "toggleHidden"] }, { kind: "component", type: CustomShowsComponent, selector: "pptx-custom-shows", inputs: ["open", "slides", "customShows", "activeCustomShowId"], outputs: ["create", "remove", "update", "setActive", "close"] }, { kind: "component", type: InsertSmartArtDialogComponent, selector: "pptx-insert-smart-art-dialog", inputs: ["open"], outputs: ["close", "insert"] }, { kind: "component", type: ViewerExtraDialogsComponent, selector: "pptx-viewer-extra-dialogs", inputs: ["activeSlideIndex", "selectedElementId", "filePath", "customShows", "themeKey", "availableThemes", "localeCode", "availableLocales", "aiExportVisible"], outputs: ["restoreContent", "themeKeySelect", "localeSelect"] }, { kind: "component", type: RehearseTimingsComponent, selector: "pptx-rehearse-timings", inputs: ["summary", "paused", "slideStartedAt", "presentationStartedAt", "timings"], outputs: ["togglePause", "save", "discard"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [/* @ts-ignore */
|
|
116367
118097
|
Promise.resolve().then(function () { return aiChatPanel_component; }).then(m => m.AiChatPanelComponent)]] });
|
|
116368
118098
|
}
|
|
116369
118099
|
i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.0.8", ngImport: i0, type: PowerPointViewerComponent, resolveDeferredDeps: () => [/* @ts-ignore */
|
|
@@ -116933,6 +118663,8 @@ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.0.8", ng
|
|
|
116933
118663
|
[subtitlesVisible]="presentationMode.subtitlesVisible()"
|
|
116934
118664
|
[sessionEnded]="audienceSessionEnded()"
|
|
116935
118665
|
[endWithBlackSlide]="viewerOpts.options().advanced.slideShowEndWithBlackSlide"
|
|
118666
|
+
[presenterMode]="presentationMode.presentingPresenter()"
|
|
118667
|
+
(presenterViewToggle)="presentationMode.togglePresenterView()"
|
|
116936
118668
|
(subtitlesChange)="presentationMode.subtitlesVisible.set($event)"
|
|
116937
118669
|
(indexChange)="presentationMode.onPresentationIndexChange($event)"
|
|
116938
118670
|
(annotationsExit)="presentationMode.onPresentationAnnotationsExit($event)"
|
|
@@ -118789,13 +120521,17 @@ const TRIGGER_LABEL_KEYS = [
|
|
|
118789
120521
|
{ value: 'afterPrevious', key: 'pptx.animation.trigger.afterPrevious' },
|
|
118790
120522
|
{ value: 'afterDelay', key: 'pptx.animation.trigger.afterDelay' },
|
|
118791
120523
|
];
|
|
120524
|
+
/**
|
|
120525
|
+
* The step's effect name.
|
|
120526
|
+
*
|
|
120527
|
+
* This used to look the element's preset token up in core's OOXML catalogue,
|
|
120528
|
+
* which is keyed by wire ids (`entr.1`) and so never matched an editor token
|
|
120529
|
+
* (`fadeIn`); the fallback then printed that token straight into the step row.
|
|
120530
|
+
* The shared resolver understands both vocabularies and answers with an i18n
|
|
120531
|
+
* key, so the step reads "Fade In" in every language.
|
|
120532
|
+
*/
|
|
118792
120533
|
function presetLabel(anim, translate) {
|
|
118793
|
-
|
|
118794
|
-
if (!presetId) {
|
|
118795
|
-
return translate.instant('pptx.animation.animation');
|
|
118796
|
-
}
|
|
118797
|
-
const info = getAnimationPresetInfo(presetId);
|
|
118798
|
-
return info?.label ?? presetId;
|
|
120534
|
+
return translate.instant(animationEffectLabelKey(anim));
|
|
118799
120535
|
}
|
|
118800
120536
|
function triggerLabel(trigger, translate) {
|
|
118801
120537
|
const key = TRIGGER_LABEL_KEYS.find((o) => o.value === trigger)?.key ?? 'pptx.animation.trigger.onClick';
|
|
@@ -119106,5 +120842,5 @@ function cn(...values) {
|
|
|
119106
120842
|
* Generated bundle index. Do not edit.
|
|
119107
120843
|
*/
|
|
119108
120844
|
|
|
119109
|
-
export { CustomShowsComponent as $, ALIGN_OPTIONS as A, BroadcastDialogComponent as B, CHART_EDITOR_STYLES as C, CanvasFitService as D, ChartAxisOptionsComponent as E, ChartAxisStyleOptionsComponent as F, ChartComboTypeOptionsComponent as G, ChartDataEditorComponent as H, ChartDataLabelOptionsComponent as I, ChartDatapointMarkerOptionsComponent as J, ChartDatapointOptionsComponent as K, ChartDisplayOptionsComponent as L, ChartElementViewComponent as M, ChartErrorBarOptionsComponent as N, ChartMarkerOptionsComponent as O, ChartPartSelectionService as P, ChartPrimitivesComponent as Q, ChartRendererComponent as R, ChartTrendlineOptionsComponent as S, CollaborationCursorsComponent as T, CollaborationService as U, ColorChangedImageComponent as V, CommentsPanelComponent as W, CommentsService as X, ComparePanelComponent as Y, ConnectorRendererComponent as Z, ConnectorTextOverlayComponent as _, ANIMATION_PRESET_CATEGORIES as a, LoadContentService as a$, DATA_TABLE_HEADER_H as a0, DATA_TABLE_KEY_W as a1, DATA_TABLE_PADDING as a2, DATA_TABLE_ROW_H as a3, DEFAULT_BOUNDS as a4, DEFAULT_BROADCAST_SERVER_URL as a5, DEFAULT_CANVAS_HEIGHT as a6, DEFAULT_CANVAS_WIDTH as a7, DEFAULT_COLOR_SCHEME as a8, DEFAULT_FILL_COLOR as a9, EquationEditorDialogComponent as aA, EquationRendererComponent as aB, EquationTemplateGalleryComponent as aC, ExportProgressModalComponent as aD, ExportService as aE, FieldContextService as aF, FindBarComponent as aG, FindReplaceBarComponent as aH, FollowModeBarComponent as aI, FontEmbeddingListComponent as aJ, FontEmbeddingPanelComponent as aK, GALLERY_THEME_PRESETS as aL, GradientPickerComponent as aM, HANDOUT_OPTIONS as aN, HeaderFooterDialogComponent as aO, HyperlinkDialogComponent as aP, ImagePropertiesPanelComponent as aQ, InkDrawingService as aR, InkRendererComponent as aS, InsertSmartArtDialogComponent as aT, InspectorPaneHeaderComponent as aU, InspectorPanelComponent as aV, IsMobileService as aW, KeepAnnotationsDialogComponent as aX, LOCALE_CATALOG as aY, LONG_PRESS_DURATION_MS as aZ, LONG_PRESS_MOVE_TOLERANCE_PX as a_, DEFAULT_LAYOUT as aa, DEFAULT_PALETTE$1 as ab, DEFAULT_PATTERN_FILL_PRESET as ac, DEFAULT_PRINT_SETTINGS as ad, DEFAULT_SLIDE_BACKGROUND as ae, DEFAULT_STROKE_COLOR as af, DEFAULT_STYLE as ag, DEFAULT_TABLE_ROW_HEIGHT as ah, DEFAULT_TEXT_COLOR$1 as ai, DEFAULT_VIEWER_PROFILE as aj, DIRECTIONAL_PRESETS as ak, DIRECTION_OPTIONS as al, DocumentPropertiesCardComponent as am, EMBEDDED_FONTS_STYLE_ID as an, EMPHASIS_PRESETS as ao, ENTRANCE_PRESETS as ap, TEMPLATES as aq, EXIT_PRESETS as ar, EditorContextMenuComponent as as, EditorHistory as at, EditorStateService as au, EditorToolbarComponent as av, EffectsPanelComponent as aw, ElementRendererComponent as ax, EmbeddedFontsService as ay, EncryptedFileDialogComponent as az, AUDIENCE_HASH as b, RibbonMotionPathGalleryComponent as b$, LocalPresencePublisher as b0, MAX_ZOOM_SCALE as b1, MIN_ZOOM_SCALE as b2, MOTION_PATH_COLUMNS as b3, MediaPreviewComponent as b4, MediaPropertiesPanelComponent as b5, MediaRendererComponent as b6, MediaTrimTimelineComponent as b7, MobileBottomBarComponent as b8, MobileMenuSheetComponent as b9, PresenterViewComponent as bA, PresenterWindowService as bB, PrintDialogComponent as bC, PrintService as bD, PrintSettingsPanelComponent as bE, PropertiesDialogComponent as bF, REPEAT_MODE_OPTIONS as bG, RESIZE_HANDLES as bH, RULER_FONT_SIZE as bI, RULER_THICKNESS as bJ, ReadingViewOverlayComponent as bK, RemoteSelectionOverlayComponent as bL, RibbonAnimationGalleryComponent as bM, RibbonAnimationsSectionComponent as bN, RibbonArrangeSectionComponent as bO, RibbonColorPopoverComponent as bP, RibbonComponent as bQ, RibbonDesignSectionComponent as bR, RibbonDrawSectionComponent as bS, RibbonDrawingGroupComponent as bT, RibbonEditingSectionComponent as bU, RibbonFileSectionComponent as bV, RibbonFontControlsComponent as bW, RibbonHomeSectionComponent as bX, RibbonHyperlinkButtonComponent as bY, RibbonInsertFieldsComponent as bZ, RibbonInsertSectionComponent as b_, MobilePresenterViewComponent as ba, MobileSheetComponent as bb, MobileSlidesSheetComponent as bc, MobileToolbarComponent as bd, ModalDialogComponent as be, Model3DRendererComponent as bf, NotesHandoutCardComponent as bg, NotesPanelComponent as bh, NotesToolbarComponent as bi, OleRendererComponent as bj, OutlineViewOverlayComponent as bk, POWER_POINT_VIEWER_PROVIDERS as bl, PRESENTER_CHANNEL_NAME as bm, PRESENTER_MSG_ORIGIN as bn, PX_PER_CM as bo, PX_PER_INCH as bp, PasswordProtectionDialogComponent as bq, PasswordStrengthMeterComponent as br, PowerPointViewerComponent as bs, PresentationAnnotationOverlayComponent as bt, PresentationAnnotationsService as bu, PresentationOverlayComponent as bv, PresentationPropertiesPanelComponent as bw, PresentationSettingsCardComponent as bx, PresentationSubtitleBarComponent as by, PresentationTransitionOverlayComponent as bz, AUDIENCE_NONCE_KEY as c, TableResizeOverlayComponent as c$, RibbonParagraphControlsComponent as c0, RibbonPrimaryRowComponent as c1, RibbonReviewSectionComponent as c2, RibbonShapeExtrasComponent as c3, RibbonSlideshowSectionComponent as c4, RibbonTransitionsSectionComponent as c5, RibbonViewSectionComponent as c6, RulerGuidesService as c7, SEQUENCE_OPTIONS as c8, SEVERITY_GROUPS as c9, SlideDiffChangesComponent as cA, SlideDiffRowComponent as cB, SlideDiffThumbnailsComponent as cC, SlideSizeCardComponent as cD, SlideSorterOverlayComponent as cE, SlideThemeOverridePanelComponent as cF, SlideTransitionCardComponent as cG, SlidesPanelComponent as cH, SmartArt3DRendererComponent as cI, SmartArt3DService as cJ, SmartArtPreviewComponent as cK, SmartArtPropertiesComponent as cL, SmartArtRendererComponent as cM, StatusBarComponent as cN, TABLE_STRUCTURE_TOGGLES as cO, TEXT_3D_BOTTOM_BEVEL_KEYS as cP, TEXT_3D_TOP_BEVEL_KEYS as cQ, TEXT_DIRECTION_OPTIONS$1 as cR, THEME_CATALOG as cS, TIMING_CURVE_OPTIONS as cT, TRIGGER_OPTIONS as cU, TYPE_LABELS as cV, TableCellAdvancedFillComponent as cW, TableCellFormattingComponent as cX, TableDataEditorComponent as cY, TablePropertiesComponent as cZ, TableRendererComponent as c_, SEVERITY_LABELS as ca, SHORTCUT_REFERENCE_ITEMS as cb, SLIDE_TRANSITION_KEYFRAMES as cc, DEFAULT_PALETTE as cd, PALETTES$1 as ce, SMART_ART_COLOR_SCHEMES as cf, SMART_ART_STYLE_OPTIONS as cg, SUB_ITEM_LABEL as ch, SVG_WARP_PRESETS as ci, SWIPE_MAX_VERTICAL_PX as cj, SWIPE_THRESHOLD_PX as ck, SelectionPaneComponent as cl, SetUpSlideShowDialogComponent as cm, SettingsAppearanceTabComponent as cn, SettingsDialogComponent as co, SettingsLanguageTabComponent as cp, ShareDialogComponent as cq, ShortcutPanelComponent as cr, ShowOptionsFieldsetComponent as cs, ShowSlidesFieldsetComponent as ct, SignatureStrippedDialogComponent as cu, SignaturesPanelComponent as cv, SignaturesService as cw, SlideBackgroundCardComponent as cx, SlideCanvasComponent as cy, SlideDefaultInspectorComponent as cz, AVATAR_COLOR_SWATCHES as d, bevelSizePatch as d$, TableSelectionService as d0, TagsCardComponent as d1, Text3DBevelSectionComponent as d2, Text3DPanelComponent as d3, TextAdvancedPanelComponent as d4, ThemeEditorFieldsComponent as d5, ThemeGalleryComponent as d6, ThemeSelectorCardComponent as d7, TitleBarComponent as d8, TitleBarSearchComponent as d9, WriteBackScheduler as dA, ZoomNavigationService as dB, ZoomRendererComponent as dC, ZoomTargetService as dD, addCategory as dE, addCommentToList as dF, addGradientStopPatch as dG, addItem as dH, addSeries as dI, addSubItem as dJ, advanceStep as dK, aiToggleVisible as dL, alignPatch as dM, animationFor as dN, animationPresetLabelKey as dO, annotationMapToInkInserts as dP, applyAcceptedDiff as dQ, applyAnimationPreset as dR, applyFindReplacements as dS, applyFormatToElement as dT, applyMove as dU, applyResize as dV, applyTableStylePreset as dW, asMediaElement as dX, assignUserColor as dY, attachTouchGestures as dZ, beginNodeEdit as d_, TransitionDirectionPickerComponent as da, TransitionPreviewComponent as db, VALIGN_OPTIONS as dc, VIEWER_THEME as dd, VersionHistoryPanelComponent as de, ViewerCanvasEditingService as df, ViewerCollabCursorService as dg, ViewerCollaborationSessionService as dh, ViewerCompareService as di, ViewerCustomShowsService as dj, ViewerDialogsService as dk, ViewerDocumentPropertiesService as dl, ViewerExportService as dm, ViewerExtraDialogsComponent as dn, ViewerFileIOService as dp, ViewerFindReplaceService as dq, ViewerFormatPainterService as dr, ViewerInspectorPanelService as ds, ViewerKeyboardService as dt, ViewerMobileSheetService as du, ViewerPresentationModeService as dv, ViewerThemeGalleryService as dw, ViewerTouchGesturesService as dx, ViewerZoomService as dy, WEBM_MIME_CANDIDATES as dz, AccessibilityPanelComponent as e, cellStyleToStyleMap as e$, boolFromEvent as e0, bringForward as e1, bringToFront as e2, buildBarActions as e3, buildBroadcastConfig as e4, buildBroadcastViewerUrl as e5, buildCategoryLabels as e6, buildCellParagraphs as e7, buildChartViewModel as e8, buildChatLogExport as e9, buildPrintHtmlDocument as eA, buildPropertiesPatch as eB, buildRegionMapViewModel as eC, buildSaveSlides as eD, buildShareUrl as eE, buildSmartArtInsertElement as eF, buildSmartArtNodes as eG, buildStockViewModel as eH, buildSurfaceViewModel as eI, buildTableViewModel as eJ, buildTreemapViewModel as eK, buildTrimFragment as eL, buildWaterfallViewModel as eM, buildZeroLine as eN, buildZoomContainerStyle as eO, buildZoomViewModel as eP, bulletIndentPx as eQ, canAddTopLevelNode as eR, canGroupSelection as eS, canRemoveTopLevelNode as eT, canSetStrokeWidth as eU, canStartBroadcast as eV, canStartShare as eW, canUngroupSelection as eX, canUseClipboard as eY, captionDisplayText as eZ, cellRunStyle as e_, buildChatLogMarkdown as ea, buildChromeStyle as eb, buildClearHyperlinkPatch as ec, buildClickGroups as ed, buildColStyles as ee, buildCollaborationConfig as ef, buildComboViewModel as eg, buildCssGradientFromShapeStyle as eh, buildDuotoneFilter as ei, buildDuotoneFilterId as ej, buildEmbeddedFontStyles as ek, buildEquationElement as el, buildEquationSegment as em, buildFallbackViewModel as en, buildFontFaceRule as eo, buildGradientFillCss as ep, buildGridlinesAndLabels as eq, buildHyperlinkPatch as er, buildInkContainerStyle as es, buildInkStrokes as et, buildLegend as eu, buildModel3DContainerStyle as ev, buildModel3DViewModel as ew, buildOleActionModel as ex, buildOleInfoRows as ey, buildPatternFillCss as ez, AccessibilityService as f, createWebsocketBundle as f$, cellTdStyle as f0, changeCountLabel as f1, changeIcon as f2, characterSpacingPatch as f3, checkFontAvailable as f4, clampCursorPosition as f5, clampGifDimensions as f6, clampIndex as f7, clampNotesFontSize as f8, clampScale as f9, computeLinearRegression as fA, computePageCount as fB, computePieLayout as fC, computePieSlicePath as fD, computePieSlices as fE, computePlotLayout as fF, computeRSquared as fG, computeRadarPoints as fH, computeScatterDots as fI, computeSelectionBoxes as fJ, computeSingleSelected as fK, computeSlideIndices as fL, computeSnap as fM, computeStackedBarRects as fN, computeStackedValueRange as fO, computeTextLines as fP, computeTimerProgress as fQ, computeTrendlinePrimitives as fR, computeValueRange as fS, convertOmmlToMathMl as fT, copyFormatFromElement as fU, countAccessibilityIssues as fV, countAnnotationStrokes as fW, createAngularAiBridge as fX, createCustomShow as fY, createSwipeDismissDrag as fZ, createWebrtcBundle as f_, clampStep as fa, clearAllLocalViewerData as fb, clearAudienceContent as fc, cn as fd, collectAccessibilityIssues as fe, collectElementText as ff, collectSlideText as fg, collectStoredChats as fh, collectUsedFontFamilies as fi, columnWidthStyle as fj, commitNodeText as fk, computeAlign as fl, computeAxisTitlePrimitives as fm, computeBarRects as fn, computeBubbleRadius as fo, computeCornerHandle as fp, computeDataTablePrimitives as fq, computeDistribute as fr, computeDrawingViewBox as fs, computeErrorBarPrimitives as ft, computeFocusTargets as fu, computeHandleBoxes as fv, computeHandoutLayout as fw, computeIsMobile as fx, computeIsTablet as fy, computeLinePoints as fz, AccountPageComponent as g, getOleAriaLabel as g$, cssObjectToStyleMap as g0, currentColorScheme as g1, currentLayout as g2, currentStyle as g3, defaultCssVars as g4, defaultRadius as g5, defaultThemeColors as g6, deleteElementsByIds as g7, deleteVersion as g8, demoteNode as g9, findOwningSlideIndex as gA, findSlideIndexByElementId as gB, firstVisibleIndex as gC, fitPolynomial as gD, fitZoom as gE, focusTargetChips as gF, fontMimeForFormat as gG, fontSizeOf as gH, formatAutoNumber as gI, formatAxisValue as gJ, formatBytes as gK, formatCursorLabel as gL, formatElapsed as gM, formatFileSize as gN, formatPropertyDate as gO, formatTime as gP, fpsToFrameIntervalMs as gQ, generateBroadcastRoomId as gR, generateCommentId as gS, generateCustomShowId as gT, generatePressureCircles as gU, generateTicks as gV, getClrChangeParams as gW, getContainerStyle as gX, getDuotoneFilterDef as gY, getImageSrc as gZ, getLocalStorageUsageSummary as g_, deriveModel3DBlobUrl as ga, derivePresenceList as gb, describeSmartArtBounds as gc, disableGlowPatch as gd, disableInnerShadowPatch as ge, disableOuterShadowPatch as gf, disableReflectionPatch as gg, disableSoftEdgePatch as gh, duplicateElementById as gi, durationOf as gj, effectsStateOf as gk, enableGlowPatch as gl, enableInnerShadowPatch as gm, enableOuterShadowPatch as gn, enableReflectionPatch as go, enableSoftEdgePatch as gp, encodeGif as gq, estimatePageCount as gr, evenColumnWidths as gs, evenRowHeights as gt, exitPresentationFullscreen as gu, exportAiChatLogs as gv, extractPathPoints as gw, eyedropperAvailable as gx, fillColorOf as gy, findInSlides as gz, ActionSettingsPanelComponent as h, lineSpacingPatch as h$, getOleBadgeLabel as h0, getOleDisplayName as h1, getOleDownloadFileName as h2, getOleTypeColor as h3, getOleTypeLabel as h4, getPasswordStrength as h5, getPatternSvg as h6, getPlaceholderStyle as h7, getVersions as h8, getResolvedShapeClipPath as h9, inkViewBox as hA, insertTableElementColumn as hB, insertTableElementRow as hC, interpolateWidth as hD, isAudienceTab as hE, isBold as hF, isBrowserOpenableMime as hG, isChildNode as hH, isElementInteractive as hI, isInjectableUrl as hJ, isItalic as hK, isPpactionUrl as hL, isPresenterMessage as hM, isSigned as hN, isTextElement as hO, isTwoTableFocus as hP, isUnderline as hQ, isUrlSafe as hR, isValidRoomId as hS, isViewportBackgroundPressTarget as hT, isZoomActivationKey as hU, issueTrackKey as hV, issueTypeLabel as hW, keyToLabel as hX, lastVisibleIndex as hY, latexToMathml as hZ, linePointsToSvgString as h_, getResolvedShapeClipPathFor 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, gridColumns as ho, groupElements 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, AdvancedChartEditorComponent as i, readAsDataUrl as i$, loadAudienceContent as i0, mergeCaptionResults as i1, mergeDown as i2, mergeRight as i3, mergeSelection as i4, moveElementBy as i5, moveNodeDown as i6, moveNodeUp as i7, msToFrameDelayCs as i8, narrowToCircle as i9, overallStatus as iA, paletteColor as iB, parseAudienceNonce as iC, parseNodeTextarea as iD, partitionSlides as iE, patchChartData as iF, patchChartStyle as iG, patchTableData as iH, patchTextStyle as iI, patternPresetOptions as iJ, pendingElementStyles as iK, pickColorByClickFallback as iL, pickFile as iM, pickSupportedMimeType as iN, planGifFrames as iO, planVideoSegments as iP, pointsToSvgPathD as iQ, presenceToCursors as iR, presetByLayout as iS, presetsForCategory as iT, pressuresToWidths as iU, prevVisibleIndex as iV, projectDrawingShapes as iW, promoteNode as iX, provideViewerTheme as iY, radarAngle as iZ, radarRingPoints as i_, narrowToPolygon as ia, narrowToRect as ib, newChartElement as ic, newEquationElement as id, newPresetShapeElement as ie, newShapeElement as ig, newSmartArtElement as ih, newTableElement as ii, newTextElement as ij, nextVisibleIndex as ik, nodeBold as il, nodeEditBox as im, nodeFillColor as io, nodeFontColor as ip, nodeIdFromKey as iq, nodeItalic as ir, nodeStyle as is, normalizeFontFormat as it, normalizeSlidesPerPage as iu, normalizeValue as iv, numFromEvent as iw, ommlToMathml as ix, ooxmlDashToCssBorderStyle as iy, openNativeEyeDropper as iz, AiChangeOverlayComponent as j, setCategoryLabel as j$, recordWebm as j0, redistributeColumnWidth as j1, removeAnimation as j2, removeCategory as j3, removeTableElementColumn as j4, removeCommentFromList as j5, removeElementAnimation as j6, removeGradientStopPatch as j7, removeNode as j8, removeTableElementRow as j9, rulerDragToGuidePosition as jA, rulerHighlight as jB, rulerStripTicks as jC, sampleColorFromSlide as jD, sanitizeColor as jE, sanitizeSlideIndex as jF, sanitizeUserName as jG, saveViewerProfile as jH, scanAvailableFonts as jI, searchSlides as jJ, seedBroadcastFields as jK, seedHyperlinkDraft as jL, seedPropertiesDraft as jM, seedShareFields as jN, segmentFrameCount as jO, selectValue$2 as jP, sendBackward as jQ, sendToBack as jR, sequentialColorScale as jS, serializeWriteBack as jT, seriesColor as jU, setAnimationEmphasis as jV, setAnimationEntrance as jW, setAnimationExit as jX, setAxis as jY, setAxisLogScale as jZ, setAxisTitleStyle as j_, removeSeries as ja, renderToCanvas as jb, reorderAnimationDown as jc, reorderAnimationUp as jd, replaceInSlides as je, replaceMatch as jf, requestPresentationFullscreen as jg, resizeElement as jh, resolveCaptionTracks as ji, resolveChartKind as jj, resolveFontVariant as jk, resolveHyperlinkHref as jl, resolveInteractiveElementId as jm, resolveMediaSrc as jn, resolveOleType as jo, resolveParagraphBullet as jp, resolvePresenterNotes as jq, resolveProfileInitial as jr, resolveRegionCode as js, resolveSlideAutoAdvanceMs as jt, resolvePalette as ju, resolveThemeCatalogEntry as jv, resolveTransitionDuration as jw, revealedElementStyles as jx, routeOrthogonalConnector as jy, rowStyle as jz, AiChatPanelComponent as k, themeStyle as k$, setCellText as k0, setColorScheme as k1, setDataLabels as k2, setDataPointExplosion as k3, setDataPointFill as k4, setDataPointLabel as k5, setDataPointMarker as k6, setDelay as k7, setDirection as k8, setDuration as k9, showsTemplateAffordance as kA, signatureCountLabel as kB, signatureKey as kC, signatureTimestamp as kD, signerName as kE, statusLabel as kF, slideNumberOf as kG, smartArtNodes as kH, paletteColour as kI, snapToGridStep as kJ, splitCursorCell as kK, splitMergedCell as kL, statusKind as kM, statusLabel$1 as kN, storeAudienceContent as kO, stringFromEvent$5 as kP, strokeColorOf as kQ, strokeToInkElement as kR, strokeWidthOf as kS, styleShadowFilter as kT, textAdvancedPatch as kU, textAdvancedStateFromStyle as kV, textAdvancedStateOf as kW, textColorOf as kX, textDirectionPatch as kY, textStyleOf as kZ, textStylePatch as k_, setElementPosition as ka, setGridlineStyle as kb, setLayout as kc, setLegend as kd, setNodeStyle as ke, setNodeText as kf, setRepeatCount as kg, setRepeatMode as kh, setSequence as ki, setSeriesChartType as kj, setSeriesColor as kk, setSeriesErrorBars as kl, setSeriesMarker as km, setSeriesName as kn, setSeriesTrendline as ko, setSeriesValue as kp, setStyle as kq, setTimingCurve as kr, setTitle as ks, setTrigger as kt, setTriggerShapeId as ku, shapeStylePatch as kv, sheetAfterNavigate as kw, shouldBlockClickAdvance as kx, shouldUseSvgWarp as ky, showDirectionPicker as kz, AiChatService as l, themeToCssVars as l0, thumbnailHeight as l1, thumbnailZoom as l2, toggleCommentResolvedInList as l3, toggleNodeBold as l4, toggleNodeItalic as l5, toggleSheet as l6, topLevelNodeCount as l7, transformSelectedTextCase as l8, translationsEn as l9, ungroupElements as la, updateElementById as lb, updateGlowPatch as lc, updateGradientStopPatch as ld, updateInnerShadowPatch as le, updateOuterShadowPatch as lf, updateReflectionPatch as lg, vAlignPatch as lh, validatePassword as li, validatePrintSettings as lj, validateRoomId as lk, valueToY as ll, vermilionDarkColors as lm, vermilionDarkTheme as ln, vermilionLightColors as lo, vermilionLightTheme as lp, vermilionRadius as lq, waypointsToPathD as lr, worstStatus as ls, zoomTargetSlideIndex as lt, AiComposerComponent as m, AiFocusBarComponent as n, AiFocusHighlightOverlayComponent as o, AiMessageListComponent as p, AiPanelStore as q, AiProposalCardComponent as r, AiSettingsSectionComponent as s, toChatSummary as t, AiToolCallCardComponent as u, AnimationAuthorPanelComponent as v, AnimationPanelComponent as w, AnimationPlaybackService as x, AutosaveService as y, CURSOR_PALETTE as z };
|
|
119110
|
-
//# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-
|
|
120845
|
+
export { CustomShowsComponent as $, ALIGN_OPTIONS as A, BroadcastDialogComponent as B, CHART_EDITOR_STYLES as C, CanvasFitService as D, ChartAxisOptionsComponent as E, ChartAxisStyleOptionsComponent as F, ChartComboTypeOptionsComponent as G, ChartDataEditorComponent as H, ChartDataLabelOptionsComponent as I, ChartDatapointMarkerOptionsComponent as J, ChartDatapointOptionsComponent as K, ChartDisplayOptionsComponent as L, ChartElementViewComponent as M, ChartErrorBarOptionsComponent as N, ChartMarkerOptionsComponent as O, ChartPartSelectionService as P, ChartPrimitivesComponent as Q, ChartRendererComponent as R, ChartTrendlineOptionsComponent as S, CollaborationCursorsComponent as T, CollaborationService as U, ColorChangedImageComponent as V, CommentsPanelComponent as W, CommentsService as X, ComparePanelComponent as Y, ConnectorRendererComponent as Z, ConnectorTextOverlayComponent as _, ANIMATION_PRESET_CATEGORIES as a, LoadContentService as a$, DATA_TABLE_HEADER_H as a0, DATA_TABLE_KEY_W as a1, DATA_TABLE_PADDING as a2, DATA_TABLE_ROW_H as a3, DEFAULT_BOUNDS as a4, DEFAULT_BROADCAST_SERVER_URL as a5, DEFAULT_CANVAS_HEIGHT as a6, DEFAULT_CANVAS_WIDTH as a7, DEFAULT_COLOR_SCHEME as a8, DEFAULT_FILL_COLOR as a9, EquationEditorDialogComponent as aA, EquationRendererComponent as aB, EquationTemplateGalleryComponent as aC, ExportProgressModalComponent as aD, ExportService as aE, FieldContextService as aF, FindBarComponent as aG, FindReplaceBarComponent as aH, FollowModeBarComponent as aI, FontEmbeddingListComponent as aJ, FontEmbeddingPanelComponent as aK, GALLERY_THEME_PRESETS as aL, GradientPickerComponent as aM, HANDOUT_OPTIONS as aN, HeaderFooterDialogComponent as aO, HyperlinkDialogComponent as aP, ImagePropertiesPanelComponent as aQ, InkDrawingService as aR, InkRendererComponent as aS, InsertSmartArtDialogComponent as aT, InspectorPaneHeaderComponent as aU, InspectorPanelComponent as aV, IsMobileService as aW, KeepAnnotationsDialogComponent as aX, LOCALE_CATALOG as aY, LONG_PRESS_DURATION_MS as aZ, LONG_PRESS_MOVE_TOLERANCE_PX as a_, DEFAULT_LAYOUT as aa, DEFAULT_PALETTE$1 as ab, DEFAULT_PATTERN_FILL_PRESET as ac, DEFAULT_PRINT_SETTINGS as ad, DEFAULT_SLIDE_BACKGROUND as ae, DEFAULT_STROKE_COLOR as af, DEFAULT_STYLE as ag, DEFAULT_TABLE_ROW_HEIGHT as ah, DEFAULT_TEXT_COLOR$1 as ai, DEFAULT_VIEWER_PROFILE as aj, DIRECTIONAL_PRESETS as ak, DIRECTION_OPTIONS as al, DocumentPropertiesCardComponent as am, EMBEDDED_FONTS_STYLE_ID as an, EMPHASIS_PRESETS as ao, ENTRANCE_PRESETS as ap, TEMPLATES as aq, EXIT_PRESETS as ar, EditorContextMenuComponent as as, EditorHistory as at, EditorStateService as au, EditorToolbarComponent as av, EffectsPanelComponent as aw, ElementRendererComponent as ax, EmbeddedFontsService as ay, EncryptedFileDialogComponent as az, AUDIENCE_HASH as b, RibbonInsertFieldsComponent as b$, LocalPresencePublisher as b0, MAX_ZOOM_SCALE as b1, MIN_ZOOM_SCALE as b2, MOTION_PATH_COLUMNS as b3, MediaPreviewComponent as b4, MediaPropertiesPanelComponent as b5, MediaRendererComponent as b6, MediaTrimTimelineComponent as b7, MobileBottomBarComponent as b8, MobileMenuSheetComponent as b9, PresentationToolbarComponent as bA, PresentationTransitionOverlayComponent as bB, PresenterViewComponent as bC, PresenterWindowService as bD, PrintDialogComponent as bE, PrintService as bF, PrintSettingsPanelComponent as bG, PropertiesDialogComponent as bH, REPEAT_MODE_OPTIONS as bI, RESIZE_HANDLES as bJ, RULER_FONT_SIZE as bK, RULER_THICKNESS as bL, ReadingViewOverlayComponent as bM, RemoteSelectionOverlayComponent as bN, RibbonAnimationGalleryComponent as bO, RibbonAnimationsSectionComponent as bP, RibbonArrangeSectionComponent as bQ, RibbonColorPopoverComponent as bR, RibbonComponent as bS, RibbonDesignSectionComponent as bT, RibbonDrawSectionComponent as bU, RibbonDrawingGroupComponent as bV, RibbonEditingSectionComponent as bW, RibbonFileSectionComponent as bX, RibbonFontControlsComponent as bY, RibbonHomeSectionComponent as bZ, RibbonHyperlinkButtonComponent as b_, MobilePresenterViewComponent as ba, MobileSheetComponent as bb, MobileSlidesSheetComponent as bc, MobileToolbarComponent as bd, ModalDialogComponent as be, Model3DRendererComponent as bf, NotesHandoutCardComponent as bg, NotesPanelComponent as bh, NotesToolbarComponent as bi, OleRendererComponent as bj, OutlineViewOverlayComponent as bk, POWER_POINT_VIEWER_PROVIDERS as bl, PRESENTER_CHANNEL_NAME as bm, PRESENTER_MSG_ORIGIN as bn, PX_PER_CM as bo, PX_PER_INCH as bp, PasswordProtectionDialogComponent as bq, PasswordStrengthMeterComponent as br, PowerPointViewerComponent as bs, PresentToolbarAutoHide as bt, PresentationAnnotationOverlayComponent as bu, PresentationAnnotationsService as bv, PresentationOverlayComponent as bw, PresentationPropertiesPanelComponent as bx, PresentationSettingsCardComponent as by, PresentationSubtitleBarComponent as bz, AUDIENCE_NONCE_KEY as c, TablePropertiesComponent as c$, RibbonInsertSectionComponent as c0, RibbonMotionPathGalleryComponent as c1, RibbonParagraphControlsComponent as c2, RibbonPrimaryRowComponent as c3, RibbonReviewSectionComponent as c4, RibbonShapeExtrasComponent as c5, RibbonSlideshowSectionComponent as c6, RibbonTransitionsSectionComponent as c7, RibbonViewSectionComponent as c8, RulerGuidesService as c9, SlideCanvasComponent as cA, SlideDefaultInspectorComponent as cB, SlideDiffChangesComponent as cC, SlideDiffRowComponent as cD, SlideDiffThumbnailsComponent as cE, SlideSizeCardComponent as cF, SlideSorterOverlayComponent as cG, SlideThemeOverridePanelComponent as cH, SlideTransitionCardComponent as cI, SlidesPanelComponent as cJ, SmartArt3DRendererComponent as cK, SmartArt3DService as cL, SmartArtPreviewComponent as cM, SmartArtPropertiesComponent as cN, SmartArtRendererComponent as cO, StatusBarComponent as cP, TABLE_STRUCTURE_TOGGLES as cQ, TEXT_3D_BOTTOM_BEVEL_KEYS as cR, TEXT_3D_TOP_BEVEL_KEYS as cS, TEXT_DIRECTION_OPTIONS$1 as cT, THEME_CATALOG as cU, TIMING_CURVE_OPTIONS as cV, TRIGGER_OPTIONS as cW, TYPE_LABELS as cX, TableCellAdvancedFillComponent as cY, TableCellFormattingComponent as cZ, TableDataEditorComponent as c_, SEQUENCE_OPTIONS as ca, SEVERITY_GROUPS as cb, SEVERITY_LABELS as cc, SHORTCUT_REFERENCE_ITEMS as cd, SLIDE_TRANSITION_KEYFRAMES as ce, DEFAULT_PALETTE as cf, PALETTES$1 as cg, SMART_ART_COLOR_SCHEMES as ch, SMART_ART_STYLE_OPTIONS as ci, SUB_ITEM_LABEL as cj, SVG_WARP_PRESETS as ck, SWIPE_MAX_VERTICAL_PX as cl, SWIPE_THRESHOLD_PX as cm, SelectionPaneComponent as cn, SetUpSlideShowDialogComponent as co, SettingsAppearanceTabComponent as cp, SettingsDialogComponent as cq, SettingsLanguageTabComponent as cr, ShareDialogComponent as cs, ShortcutPanelComponent as ct, ShowOptionsFieldsetComponent as cu, ShowSlidesFieldsetComponent as cv, SignatureStrippedDialogComponent as cw, SignaturesPanelComponent as cx, SignaturesService as cy, SlideBackgroundCardComponent as cz, AVATAR_COLOR_SWATCHES as d, attachTouchGestures as d$, TableRendererComponent as d0, TableResizeOverlayComponent as d1, TableSelectionService as d2, TagsCardComponent as d3, Text3DBevelSectionComponent as d4, Text3DPanelComponent as d5, TextAdvancedPanelComponent as d6, ThemeEditorFieldsComponent as d7, ThemeGalleryComponent as d8, ThemeSelectorCardComponent as d9, ViewerZoomService as dA, WEBM_MIME_CANDIDATES as dB, WriteBackScheduler as dC, ZoomNavigationService as dD, ZoomRendererComponent as dE, ZoomTargetService as dF, addCategory as dG, addCommentToList as dH, addGradientStopPatch as dI, addItem as dJ, addSeries as dK, addSubItem as dL, advanceStep as dM, aiToggleVisible as dN, alignPatch as dO, animationFor as dP, animationPresetLabelKey as dQ, annotationMapToInkInserts as dR, applyAcceptedDiff as dS, applyAnimationPreset as dT, applyFindReplacements as dU, applyFormatToElement as dV, applyMove as dW, applyResize as dX, applyTableStylePreset as dY, asMediaElement as dZ, assignUserColor as d_, TitleBarComponent as da, TitleBarSearchComponent as db, TransitionDirectionPickerComponent as dc, TransitionPreviewComponent as dd, VALIGN_OPTIONS as de, VIEWER_THEME as df, VersionHistoryPanelComponent as dg, ViewerCanvasEditingService as dh, ViewerCollabCursorService as di, ViewerCollaborationSessionService as dj, ViewerCompareService as dk, ViewerCustomShowsService as dl, ViewerDialogsService as dm, ViewerDocumentPropertiesService as dn, ViewerExportService as dp, ViewerExtraDialogsComponent as dq, ViewerFileIOService as dr, ViewerFindReplaceService as ds, ViewerFormatPainterService as dt, ViewerInspectorPanelService as du, ViewerKeyboardService as dv, ViewerMobileSheetService as dw, ViewerPresentationModeService as dx, ViewerThemeGalleryService as dy, ViewerTouchGesturesService as dz, AccessibilityPanelComponent as e, captionDisplayText as e$, beginNodeEdit as e0, bevelSizePatch as e1, boolFromEvent as e2, bringForward as e3, bringToFront as e4, buildBarActions as e5, buildBroadcastConfig as e6, buildBroadcastViewerUrl as e7, buildCategoryLabels as e8, buildCellParagraphs as e9, buildOleInfoRows as eA, buildPatternFillCss as eB, buildPrintHtmlDocument as eC, buildPropertiesPatch as eD, buildRegionMapViewModel as eE, buildSaveSlides as eF, buildShareUrl as eG, buildSmartArtInsertElement as eH, buildSmartArtNodes as eI, buildStockViewModel as eJ, buildSurfaceViewModel as eK, buildTableViewModel as eL, buildTreemapViewModel as eM, buildTrimFragment as eN, buildWaterfallViewModel as eO, buildZeroLine as eP, buildZoomContainerStyle as eQ, buildZoomViewModel as eR, bulletIndentPx as eS, canAddTopLevelNode as eT, canGroupSelection as eU, canRemoveTopLevelNode as eV, canSetStrokeWidth as eW, canStartBroadcast as eX, canStartShare as eY, canUngroupSelection as eZ, canUseClipboard as e_, buildChartViewModel as ea, buildChatLogExport as eb, buildChatLogMarkdown as ec, buildChromeStyle as ed, buildClearHyperlinkPatch as ee, buildClickGroups as ef, buildColStyles as eg, buildCollaborationConfig as eh, buildComboViewModel as ei, buildCssGradientFromShapeStyle as ej, buildDuotoneFilter as ek, buildDuotoneFilterId as el, buildEmbeddedFontStyles as em, buildEquationElement as en, buildEquationSegment as eo, buildFallbackViewModel as ep, buildFontFaceRule as eq, buildGradientFillCss as er, buildGridlinesAndLabels as es, buildHyperlinkPatch as et, buildInkContainerStyle as eu, buildInkStrokes as ev, buildLegend as ew, buildModel3DContainerStyle as ex, buildModel3DViewModel as ey, buildOleActionModel as ez, AccessibilityService as f, createSwipeDismissDrag as f$, cellRunStyle as f0, cellStyleToStyleMap as f1, cellTdStyle as f2, changeCountLabel as f3, changeIcon as f4, characterSpacingPatch as f5, checkFontAvailable as f6, clampCursorPosition as f7, clampGifDimensions as f8, clampIndex as f9, computeIsTablet as fA, computeLinePoints as fB, computeLinearRegression as fC, computePageCount as fD, computePieLayout as fE, computePieSlicePath as fF, computePieSlices as fG, computePlotLayout as fH, computeRSquared as fI, computeRadarPoints as fJ, computeScatterDots as fK, computeSelectionBoxes as fL, computeSingleSelected as fM, computeSlideIndices as fN, computeSnap as fO, computeStackedBarRects as fP, computeStackedValueRange as fQ, computeTextLines as fR, computeTimerProgress as fS, computeTrendlinePrimitives as fT, computeValueRange as fU, convertOmmlToMathMl as fV, copyFormatFromElement as fW, countAccessibilityIssues as fX, countAnnotationStrokes as fY, createAngularAiBridge as fZ, createCustomShow as f_, clampNotesFontSize as fa, clampScale as fb, clampStep as fc, clearAllLocalViewerData as fd, clearAudienceContent as fe, cn as ff, collectAccessibilityIssues as fg, collectElementText as fh, collectSlideText as fi, collectStoredChats as fj, collectUsedFontFamilies as fk, columnWidthStyle as fl, commitNodeText as fm, computeAlign as fn, computeAxisTitlePrimitives as fo, computeBarRects as fp, computeBubbleRadius as fq, computeCornerHandle as fr, computeDataTablePrimitives as fs, computeDistribute as ft, computeDrawingViewBox as fu, computeErrorBarPrimitives as fv, computeFocusTargets as fw, computeHandleBoxes as fx, computeHandoutLayout as fy, computeIsMobile as fz, AccountPageComponent as g, getImageSrc as g$, createWebrtcBundle as g0, createWebsocketBundle as g1, cssObjectToStyleMap as g2, currentColorScheme as g3, currentLayout as g4, currentStyle as g5, defaultCssVars as g6, defaultRadius as g7, defaultThemeColors as g8, deleteElementsByIds as g9, fillColorOf as gA, findInSlides as gB, findOwningSlideIndex as gC, findSlideIndexByElementId as gD, firstVisibleIndex as gE, fitPolynomial as gF, fitZoom as gG, focusTargetChips as gH, fontMimeForFormat as gI, fontSizeOf as gJ, formatAutoNumber as gK, formatAxisValue as gL, formatBytes as gM, formatCursorLabel as gN, formatElapsed as gO, formatFileSize as gP, formatPropertyDate as gQ, formatTime as gR, fpsToFrameIntervalMs as gS, generateBroadcastRoomId as gT, generateCommentId as gU, generateCustomShowId as gV, generatePressureCircles as gW, generateTicks as gX, getClrChangeParams as gY, getContainerStyle as gZ, getDuotoneFilterDef as g_, deleteVersion as ga, demoteNode as gb, deriveModel3DBlobUrl as gc, derivePresenceList as gd, describeSmartArtBounds as ge, disableGlowPatch as gf, disableInnerShadowPatch as gg, disableOuterShadowPatch as gh, disableReflectionPatch as gi, disableSoftEdgePatch as gj, duplicateElementById as gk, durationOf as gl, effectsStateOf as gm, enableGlowPatch as gn, enableInnerShadowPatch as go, enableOuterShadowPatch as gp, enableReflectionPatch as gq, enableSoftEdgePatch as gr, encodeGif as gs, estimatePageCount as gt, evenColumnWidths as gu, evenRowHeights as gv, exitPresentationFullscreen as gw, exportAiChatLogs as gx, extractPathPoints as gy, eyedropperAvailable as gz, ActionSettingsPanelComponent as h, latexToMathml as h$, getLocalStorageUsageSummary as h0, getOleAriaLabel as h1, getOleBadgeLabel as h2, getOleDisplayName as h3, getOleDownloadFileName as h4, getOleTypeColor as h5, getOleTypeLabel as h6, getPasswordStrength as h7, getPatternSvg as h8, getPlaceholderStyle as h9, headerLabel as hA, imageDimensions as hB, inkViewBox as hC, insertTableElementColumn as hD, insertTableElementRow as hE, interpolateWidth as hF, isAudienceTab as hG, isBold as hH, isBrowserOpenableMime as hI, isChildNode as hJ, isElementInteractive as hK, isInjectableUrl as hL, isItalic as hM, isPpactionUrl as hN, isPresenterMessage as hO, isSigned as hP, isTextElement as hQ, isTwoTableFocus as hR, isUnderline as hS, isUrlSafe as hT, isValidRoomId as hU, isViewportBackgroundPressTarget as hV, isZoomActivationKey as hW, issueTrackKey as hX, issueTypeLabel as hY, keyToLabel as hZ, lastVisibleIndex as h_, getVersions as ha, getResolvedShapeClipPath as hb, getResolvedShapeClipPathFor as hc, getShapeFillStrokeStyle as hd, getSlideBackgroundStyle as he, getSlideTransitionAnimations as hf, getSmartArtNodeBounds as hg, getSpeechRecognitionCtor as hh, getTextBlockStyle as hi, getTextWarp as hj, getTouchDistance as hk, getWarpCategory as hl, getWarpPath as hm, gradientStateFromStyle as hn, gradientStateOf as ho, gradientStatePatch as hp, gridColumns as hq, groupElements as hr, groupIssuesBySeverity as hs, hasAnimation as ht, hasCopyableFormat as hu, hasExistingLink as hv, hasExitedFullscreen as hw, hasGradientFill as hx, hasPressureVariation as hy, hasVisibleSlideAfter as hz, AdvancedChartEditorComponent as i, radarAngle as i$, linePointsToSvgString as i0, lineSpacingPatch as i1, loadAudienceContent as i2, mergeCaptionResults as i3, mergeDown as i4, mergeRight as i5, mergeSelection as i6, moveElementBy as i7, moveNodeDown as i8, moveNodeUp as i9, ooxmlDashToCssBorderStyle as iA, openNativeEyeDropper as iB, overallStatus as iC, paletteColor as iD, parseAudienceNonce as iE, parseNodeTextarea as iF, partitionSlides as iG, patchChartData as iH, patchChartStyle as iI, patchTableData as iJ, patchTextStyle as iK, patternPresetOptions as iL, pendingElementStyles as iM, pickColorByClickFallback as iN, pickFile as iO, pickSupportedMimeType as iP, planGifFrames as iQ, planVideoSegments as iR, pointsToSvgPathD as iS, presenceToCursors as iT, presetByLayout as iU, presetsForCategory as iV, pressuresToWidths as iW, prevVisibleIndex as iX, projectDrawingShapes as iY, promoteNode as iZ, provideViewerTheme as i_, msToFrameDelayCs as ia, narrowToCircle as ib, narrowToPolygon as ic, narrowToRect as id, newChartElement as ie, newEquationElement as ig, newPresetShapeElement as ih, newShapeElement as ii, newSmartArtElement as ij, newTableElement as ik, newTextElement as il, nextVisibleIndex as im, nodeBold as io, nodeEditBox as ip, nodeFillColor as iq, nodeFontColor as ir, nodeIdFromKey as is, nodeItalic as it, nodeStyle as iu, normalizeFontFormat as iv, normalizeSlidesPerPage as iw, normalizeValue as ix, numFromEvent as iy, ommlToMathml as iz, AiChangeOverlayComponent as j, setAxisLogScale as j$, radarRingPoints as j0, readAsDataUrl as j1, recordWebm as j2, redistributeColumnWidth as j3, removeAnimation as j4, removeCategory as j5, removeTableElementColumn as j6, removeCommentFromList as j7, removeElementAnimation as j8, removeGradientStopPatch as j9, routeOrthogonalConnector as jA, rowStyle as jB, rulerDragToGuidePosition as jC, rulerHighlight as jD, rulerStripTicks as jE, sampleColorFromSlide as jF, sanitizeColor as jG, sanitizeSlideIndex as jH, sanitizeUserName as jI, saveViewerProfile as jJ, scanAvailableFonts as jK, searchSlides as jL, seedBroadcastFields as jM, seedHyperlinkDraft as jN, seedPropertiesDraft as jO, seedShareFields as jP, segmentFrameCount as jQ, selectValue$2 as jR, sendBackward as jS, sendToBack as jT, sequentialColorScale as jU, serializeWriteBack as jV, seriesColor as jW, setAnimationEmphasis as jX, setAnimationEntrance as jY, setAnimationExit as jZ, setAxis as j_, removeNode as ja, removeTableElementRow as jb, removeSeries as jc, renderToCanvas as jd, reorderAnimationDown as je, reorderAnimationUp as jf, replaceInSlides as jg, replaceMatch as jh, requestPresentationFullscreen as ji, resizeElement as jj, resolveCaptionTracks as jk, resolveChartKind as jl, resolveFontVariant as jm, resolveHyperlinkHref as jn, resolveInteractiveElementId as jo, resolveMediaSrc as jp, resolveOleType as jq, resolveParagraphBullet as jr, resolvePresenterNotes as js, resolveProfileInitial as jt, resolveRegionCode as ju, resolveSlideAutoAdvanceMs as jv, resolvePalette as jw, resolveThemeCatalogEntry as jx, resolveTransitionDuration as jy, revealedElementStyles as jz, AiChatPanelComponent as k, textStyleOf as k$, setAxisTitleStyle as k0, setCategoryLabel as k1, setCellText as k2, setColorScheme as k3, setDataLabels as k4, setDataPointExplosion as k5, setDataPointFill as k6, setDataPointLabel as k7, setDataPointMarker as k8, setDelay as k9, shouldUseSvgWarp as kA, showDirectionPicker as kB, showsTemplateAffordance as kC, signatureCountLabel as kD, signatureKey as kE, signatureTimestamp as kF, signerName as kG, statusLabel as kH, slideNumberOf as kI, smartArtNodes as kJ, paletteColour as kK, snapToGridStep as kL, splitCursorCell as kM, splitMergedCell as kN, statusKind as kO, statusLabel$1 as kP, storeAudienceContent as kQ, stringFromEvent$5 as kR, strokeColorOf as kS, strokeToInkElement as kT, strokeWidthOf as kU, styleShadowFilter as kV, textAdvancedPatch as kW, textAdvancedStateFromStyle as kX, textAdvancedStateOf as kY, textColorOf as kZ, textDirectionPatch as k_, setDirection as ka, setDuration as kb, setElementPosition as kc, setGridlineStyle as kd, setLayout as ke, setLegend as kf, setNodeStyle as kg, setNodeText as kh, setRepeatCount as ki, setRepeatMode as kj, setSequence as kk, setSeriesChartType as kl, setSeriesColor as km, setSeriesErrorBars as kn, setSeriesMarker as ko, setSeriesName as kp, setSeriesTrendline as kq, setSeriesValue as kr, setStyle as ks, setTimingCurve as kt, setTitle as ku, setTrigger as kv, setTriggerShapeId as kw, shapeStylePatch as kx, sheetAfterNavigate as ky, shouldBlockClickAdvance as kz, AiChatService as l, textStylePatch as l0, themeStyle as l1, themeToCssVars as l2, thumbnailHeight as l3, thumbnailZoom as l4, toggleCommentResolvedInList as l5, toggleNodeBold as l6, toggleNodeItalic as l7, toggleSheet as l8, topLevelNodeCount as l9, transformSelectedTextCase as la, translationsEn as lb, ungroupElements as lc, updateElementById as ld, updateGlowPatch as le, updateGradientStopPatch as lf, updateInnerShadowPatch as lg, updateOuterShadowPatch as lh, updateReflectionPatch as li, vAlignPatch as lj, validatePassword as lk, validatePrintSettings as ll, validateRoomId as lm, valueToY as ln, vermilionDarkColors as lo, vermilionDarkTheme as lp, vermilionLightColors as lq, vermilionLightTheme as lr, vermilionRadius as ls, waypointsToPathD as lt, worstStatus as lu, zoomTargetSlideIndex as lv, AiComposerComponent as m, AiFocusBarComponent as n, AiFocusHighlightOverlayComponent as o, AiMessageListComponent as p, AiPanelStore as q, AiProposalCardComponent as r, AiSettingsSectionComponent as s, toChatSummary as t, AiToolCallCardComponent as u, AnimationAuthorPanelComponent as v, AnimationPanelComponent as w, AnimationPlaybackService as x, AutosaveService as y, CURSOR_PALETTE as z };
|
|
120846
|
+
//# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-y5x5Ro5v.mjs.map
|