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.
@@ -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, getAnimationPresetInfo } from 'pptx-viewer-core';
5
+ import { THEME_PRESETS, guideEmuToPx, getShapeClipPath, getAdjustmentAwareClipPath, getShapeClipPathFromPreset, getCloudPathForRendering, ooxmlGradientAngleToCssDegrees, hasShapeProperties, applyDrawingColorTransforms as applyDrawingColorTransforms$1, hslToRgb as hslToRgb$1, PRESET_COLOR_MAP, isImageLikeElement, hasTextProperties, stripXmlOrderSuffix, orderedXmlKey, chartDataAddSeries, chartDataRemoveSeries, chartDataAddCategory, chartDataRemoveCategory, chartDataUpdatePoint, rebuildTableStructureInRawXml, updateCellTextInRawXml, MIN_ELEMENT_SIZE as MIN_ELEMENT_SIZE$2, getLinkedTextBoxSegments, deriveSlideTitle, getSubstituteFontFamily, svgPathToPolygons, THEME_COLOR_SCHEME_KEYS, createBuiltinVariables, resolveCoordinate, PptxHandler, deobfuscateFont, detectFontFormat, checkMissingAltText, checkMissingSlideTitle, checkLowContrast, checkComplexTables, checkBlankSlide, checkDuplicateTitles, createChartElement, PptxMarkdownConverter, ThemePresets, formatCommentTimestamp as formatCommentTimestamp$1, EncryptedFileError, parseSignatureXml, cloneSlide as cloneSlide$1, cloneTemplateElementsBySlideId as cloneTemplateElementsBySlideId$1, cloneElement as cloneElement$1, updateSmartArtNodeText, setSmartArtNodeStyle, isInkElement, parseDataUrlToBytes, isZoomElement, SvgExporter, applyThemeToData, pptxActionToElementAction, elementActionToPptxAction, setChartTitle, setChartLegend, setChartDataLabels, setChartAxis, setChartSeriesTrendline, setChartSeriesErrorBars, setChartDataPointLabel, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, 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, LucidePenTool, LucideHighlighter, LucideEraser, LucideMousePointer2, LucideChevronLeft, LucideStar, LucideMoveRight, LucidePlay, LucideMousePointerClick, LucidePaintbrush, LucideClock3, LucidePanelRight, 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';
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
- /** Resolve a displayable image source for picture/image/media poster frames. */
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.imageData ?? (el.imagePath ? mediaDataUrls.get(el.imagePath) : undefined);
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
- if (s.bold) {
28069
- style.fontWeight = 'bold';
28070
- }
28071
- if (s.italic) {
28072
- style.fontStyle = 'italic';
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
- if (element.actionClick && hasActionHandler) {
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 role = getAriaRole(element, { actionable: isElementActionable(element) });
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-DOGPkU6F.mjs');
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
- width: '100%',
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
- containerStyle = computed(() => getContainerStyle(this.element(), this.zIndex()), /* @ts-ignore */
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; preview / presentation canvases play normally. This
69944
- * mirrors Vue's `interactive`-gated controls.
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
- if (stage && interactive) {
73307
- queueMicrotask(() => applyRenderedElementAccessibility(stage, elements));
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
- style.textContent = ANIMATION_KEYFRAMES_CSS;
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 the
81562
- * zoom-navigation context for a click-to-jump from a zoom tile: this is a
81563
- * transition-less jump, so it does NOT replay the target slide's transition.
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 count = this.deps.slides().length;
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
- if (next === this.currentIndex()) {
82875
+ const current = this.currentIndex();
82876
+ if (next === current) {
81572
82877
  return;
81573
82878
  }
81574
- this.commit(next, null);
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
- /** Toggle an annotation tool (clicking the active one disarms it). */
82469
- selectTool(tool) {
82470
- this.annotations.setTool(tool);
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<!-- 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"] }]
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.0";
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 String(animation.entrance ?? animation.emphasis ?? animation.exit ?? 'custom');
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 `pptx.arrowhead.${value}`;
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]=\"isHiddenSlide(slide)\"\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-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 -->\n\t\t\t\t\t\t<span class=\"pptx-ng-sorter-index\" aria-hidden=\"true\">{{ i + 1 }}</span>\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{font-size:.6875rem;color:#ffffff8c;-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "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 });
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]=\"isHiddenSlide(slide)\"\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-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 -->\n\t\t\t\t\t\t<span class=\"pptx-ng-sorter-index\" aria-hidden=\"true\">{{ i + 1 }}</span>\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{font-size:.6875rem;color:#ffffff8c;-webkit-user-select:none;user-select:none}\n"] }]
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
- const presetId = anim.entrance ?? anim.emphasis ?? anim.exit;
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-BLXPLe5x.mjs.map
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