pptx-angular-viewer 1.10.0 → 1.11.1

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,8 +2,9 @@ import { NgStyle, NgClass } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
3
  import { InjectionToken, input, output, computed, ChangeDetectionStrategy, Component, signal, Injectable, inject, Injector, DestroyRef, effect, HostListener, ElementRef, viewChild, afterNextRender } from '@angular/core';
4
4
  import { TranslatePipe, translate, TranslateService } from '@ngx-translate/core';
5
- import { guideEmuToPx, getShapeClipPath, getAdjustmentAwareShapeClipPath, getShapeClipPathFromPreset, getCloudPathForRendering, hasShapeProperties, applyDrawingColorTransforms as applyDrawingColorTransforms$1, hslToRgb as hslToRgb$1, PRESET_COLOR_MAP, isImageLikeElement, hasTextProperties, MIN_ELEMENT_SIZE as MIN_ELEMENT_SIZE$2, THEME_COLOR_SCHEME_KEYS, getLinkedTextBoxSegments, svgPathToPolygons, deobfuscateFont, detectFontFormat, getSubstituteFontFamily, checkMissingAltText, checkMissingSlideTitle, checkLowContrast, checkComplexTables, checkBlankSlide, checkDuplicateTitles, createChartElement, formatCommentTimestamp as formatCommentTimestamp$1, PptxHandler, EncryptedFileError, parseSignatureXml, updateSmartArtNodeText, setSmartArtNodeStyle, setChartTitle, setChartLegend, setChartDataLabels, setChartAxis, setChartSeriesTrendline, setChartSeriesErrorBars, setChartDataPointLabel, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointExplosion, chartDataAddSeries, chartDataRemoveSeries, chartDataAddCategory, chartDataRemoveCategory, chartDataUpdatePoint, chartDataChangeType, addSmartArtNodeAsChild, removeSmartArtNode, promoteSmartArtNode, demoteSmartArtNode, reorderSmartArtNode, switchSmartArtLayout, SWITCHABLE_LAYOUT_TYPES, isInkElement, parseDataUrlToBytes, isZoomElement, THEME_PRESETS, applyThemeToData, getAnimationPresetInfo } from 'pptx-viewer-core';
5
+ import { guideEmuToPx, getShapeClipPath, getAdjustmentAwareShapeClipPath, getShapeClipPathFromPreset, getCloudPathForRendering, hasShapeProperties, applyDrawingColorTransforms as applyDrawingColorTransforms$1, hslToRgb as hslToRgb$1, PRESET_COLOR_MAP, isImageLikeElement, hasTextProperties, MIN_ELEMENT_SIZE as MIN_ELEMENT_SIZE$2, THEME_COLOR_SCHEME_KEYS, getLinkedTextBoxSegments, svgPathToPolygons, deobfuscateFont, detectFontFormat, getSubstituteFontFamily, checkMissingAltText, checkMissingSlideTitle, checkLowContrast, checkComplexTables, checkBlankSlide, checkDuplicateTitles, createChartElement, formatCommentTimestamp as formatCommentTimestamp$1, cloneSlide as cloneSlide$1, cloneTemplateElementsBySlideId as cloneTemplateElementsBySlideId$1, cloneElement as cloneElement$1, PptxHandler, EncryptedFileError, parseSignatureXml, updateSmartArtNodeText, setSmartArtNodeStyle, setChartTitle, setChartLegend, setChartDataLabels, setChartAxis, setChartSeriesTrendline, setChartSeriesErrorBars, setChartDataPointLabel, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointExplosion, chartDataAddSeries, chartDataRemoveSeries, chartDataAddCategory, chartDataRemoveCategory, chartDataUpdatePoint, chartDataChangeType, addSmartArtNodeAsChild, removeSmartArtNode, promoteSmartArtNode, demoteSmartArtNode, reorderSmartArtNode, switchSmartArtLayout, SWITCHABLE_LAYOUT_TYPES, isInkElement, parseDataUrlToBytes, isZoomElement, THEME_PRESETS, applyThemeToData, getAnimationPresetInfo } from 'pptx-viewer-core';
6
6
  import DOMPurify from 'dompurify';
7
+ import { LucideX, LucideSquare, LucideCircle, LucideSlash, LucideCopy, LucideTrash2, LucideChevronsUp, LucideChevronsDown, LucideArrowUp, LucideArrowDown, LucideGroup, LucideUngroup, LucideTextAlignStart, LucideTextAlignCenter, LucideTextAlignEnd, LucideChevronUp, LucideChevronDown, LucideAlignHorizontalSpaceAround, LucideAlignVerticalSpaceAround, LucideChevronRight, LucidePenTool, LucideHighlighter, LucideEraser, LucideMousePointer2, LucideChevronLeft, LucidePlay, LucideSparkles, LucidePanelRight, LucideMoveRight, LucidePencil, LucideType, LucideMinus, LucideSpline, LucideAArrowUp, LucideAArrowDown, LucideRemoveFormatting, LucideList, LucideListOrdered, LucideListIndentDecrease, LucideListIndentIncrease, LucideTextAlignJustify, LucidePlus, LucideImage, LucideVideo, LucideDatabase, LucideLayers, LucidePanelLeft, LucideMessageSquare, LucideEllipsis, LucideShare2, LucideEye, LucideEyeOff, LucideStickyNote, LucideMonitor, LucideColumns2, LucidePresentation, LucideCheck, LucideSave, LucideUndo, LucideRedo, LucideSearch } from '@lucide/angular';
7
8
  import { jsPDF } from 'jspdf';
8
9
  import html2canvasPro from 'html2canvas-pro';
9
10
  import { DomSanitizer } from '@angular/platform-browser';
@@ -31863,6 +31864,37 @@ function rebuildDrawingShapesIfCleared(smartArtData, layout, palette, style, ele
31863
31864
  };
31864
31865
  }
31865
31866
 
31867
+ /**
31868
+ * Presentation-mode media autoplay.
31869
+ *
31870
+ * When present mode makes a slide the active, visible surface, any media on it
31871
+ * should begin playing without a manual click (matching PowerPoint's slideshow
31872
+ * behaviour). Browsers only honour a fresh `.play()` call, not an `autoplay`
31873
+ * attribute added retroactively to an already-mounted node, so each binding
31874
+ * calls this once the media element is mounted and its slide is live.
31875
+ *
31876
+ * `play()` can reject when the browser blocks autoplay-with-sound without a
31877
+ * prior user gesture; the rejection is swallowed so it never surfaces as an
31878
+ * unhandled promise (the element simply stays paused until the user interacts).
31879
+ */
31880
+ function startMediaAutoplay(el, options) {
31881
+ const trimStartMs = options?.trimStartMs;
31882
+ if (trimStartMs !== undefined && trimStartMs > 0) {
31883
+ try {
31884
+ el.currentTime = trimStartMs / 1000;
31885
+ }
31886
+ catch {
31887
+ /* seeking before metadata is loaded can throw in some browsers; ignore */
31888
+ }
31889
+ }
31890
+ const result = el.play();
31891
+ if (result && typeof result.catch === 'function') {
31892
+ void result.catch(() => {
31893
+ /* autoplay blocked (e.g. sound without a user gesture) */
31894
+ });
31895
+ }
31896
+ }
31897
+
31866
31898
  /**
31867
31899
  * Artistic image-effect presets for the image inspector's "Artistic Effects"
31868
31900
  * gallery. Each entry is a tuple `[effectName, i18nKey, cssFilter]`:
@@ -32698,6 +32730,13 @@ async function saveAutosaveSnapshot(filePath, data) {
32698
32730
  const FALLBACK_DOWNLOAD_NAME = 'presentation.pptx';
32699
32731
  /** Revoke delay (ms) after triggering a download click. */
32700
32732
  const REVOKE_DELAY_MS = 200;
32733
+ /**
32734
+ * Revoke delay (ms) after opening a payload in a new tab. Longer than the
32735
+ * download delay: the new document may still be fetching the object URL (a PDF
32736
+ * viewer, an image) well after the current task finishes, so we keep the URL
32737
+ * alive for a minute before releasing it.
32738
+ */
32739
+ const OPEN_REVOKE_DELAY_MS = 60_000;
32701
32740
  /**
32702
32741
  * Strip control characters, filesystem-reserved characters, and path-traversal
32703
32742
  * sequences from a user-supplied download filename. CR/LF in particular can
@@ -32775,6 +32814,69 @@ function downloadDataUrl(dataUrl, filename) {
32775
32814
  anchor.remove();
32776
32815
  }, REVOKE_DELAY_MS);
32777
32816
  }
32817
+ /**
32818
+ * Convert a `data:` URL into a {@link Blob}, preserving its MIME type. Handles
32819
+ * both base64 and percent-encoded payloads. Returns `undefined` for a non-data
32820
+ * URL or a payload that cannot be decoded, so callers can fall back gracefully.
32821
+ *
32822
+ * @param dataUrl - A `data:` URL string.
32823
+ */
32824
+ function dataUrlToBlob(dataUrl) {
32825
+ const match = /^data:(?<mime>[^;,]*)(?<base64>;base64)?,(?<payload>[\s\S]*)$/u.exec(dataUrl);
32826
+ if (!match?.groups) {
32827
+ return undefined;
32828
+ }
32829
+ const mime = match.groups.mime || 'application/octet-stream';
32830
+ const isBase64 = Boolean(match.groups.base64);
32831
+ const payload = match.groups.payload ?? '';
32832
+ try {
32833
+ if (isBase64) {
32834
+ const binary = atob(payload);
32835
+ const bytes = new Uint8Array(binary.length);
32836
+ for (let i = 0; i < binary.length; i++) {
32837
+ bytes[i] = binary.charCodeAt(i);
32838
+ }
32839
+ return new Blob([bytes], { type: mime });
32840
+ }
32841
+ return new Blob([decodeURIComponent(payload)], { type: mime });
32842
+ }
32843
+ catch {
32844
+ return undefined;
32845
+ }
32846
+ }
32847
+ /**
32848
+ * Open a payload in a new browser tab. Chromium (and other browsers) silently
32849
+ * refuse to navigate a new top-level browsing context straight to a `data:`
32850
+ * URL, so a data URL is first converted to a Blob object URL - which browsers
32851
+ * do allow a new tab to open - and revoked after {@link OPEN_REVOKE_DELAY_MS}
32852
+ * once the new document has had time to fetch it. Non-`data:` URLs (http(s),
32853
+ * blob) are opened as-is.
32854
+ *
32855
+ * @param url - The payload URL (typically a recovered `data:` URL).
32856
+ */
32857
+ function openUrlInNewTab(url) {
32858
+ const blob = url.startsWith('data:') ? dataUrlToBlob(url) : undefined;
32859
+ const target = blob ? URL.createObjectURL(blob) : url;
32860
+ // NB: no `noopener` here. A `blob:` object URL is resolved from the opener's
32861
+ // origin-partitioned blob store, and Chromium refuses to resolve it in the
32862
+ // disconnected browsing context `noopener` creates (the new tab lands on an
32863
+ // empty document). We instead sever the child's back-reference to us
32864
+ // afterwards, which mitigates reverse-tabnabbing without breaking the blob.
32865
+ const opened = window.open(target, '_blank');
32866
+ if (opened) {
32867
+ try {
32868
+ opened.opener = null;
32869
+ }
32870
+ catch {
32871
+ // Some browsers disallow reassigning `opener`; best-effort only.
32872
+ }
32873
+ }
32874
+ if (blob) {
32875
+ setTimeout(() => {
32876
+ URL.revokeObjectURL(target);
32877
+ }, OPEN_REVOKE_DELAY_MS);
32878
+ }
32879
+ }
32778
32880
 
32779
32881
  /**
32780
32882
  * Canvas -> JPEG byte extraction shared by every binding's PDF export. This is
@@ -37356,7 +37458,7 @@ class CustomShowsComponent {
37356
37458
  [attr.aria-label]="'pptx.customShows.closeDialog' | translate"
37357
37459
  (click)="close.emit()"
37358
37460
  >
37359
-
37461
+ <svg lucideX class="h-4 w-4"></svg>
37360
37462
  </button>
37361
37463
  </header>
37362
37464
 
@@ -37519,11 +37621,11 @@ class CustomShowsComponent {
37519
37621
  </footer>
37520
37622
  </div>
37521
37623
  }
37522
- `, isInline: true, styles: [":host{display:contents}.pptx-ng-cs-backdrop{position:fixed;inset:0;background:#00000080;z-index:200}.pptx-ng-cs-dialog{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:201;width:min(540px,94vw);max-height:80vh;display:flex;flex-direction:column;background:var(--pptx-card, #111827);color:var(--pptx-foreground, #f3f4f6);border:1px solid var(--pptx-border, #374151);border-radius:12px;box-shadow:0 20px 60px #0009;font-family:system-ui,sans-serif}.pptx-ng-cs-header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid var(--pptx-border, #374151);flex-shrink:0}.pptx-ng-cs-title{margin:0;font-size:15px;font-weight:600}.pptx-ng-cs-close{background:transparent;border:none;color:var(--pptx-muted-foreground, #9ca3af);cursor:pointer;font-size:16px;padding:2px 6px;border-radius:4px}.pptx-ng-cs-close:hover{background:var(--pptx-accent, #1f2937);color:var(--pptx-foreground, #f3f4f6)}.pptx-ng-cs-body{flex:1 1 auto;overflow-y:auto;padding:16px 20px;display:flex;flex-direction:column;gap:20px;min-height:0}.pptx-ng-cs-section{display:flex;flex-direction:column;gap:10px}.pptx-ng-cs-section-title{margin:0;font-size:13px;font-weight:600;color:var(--pptx-muted-foreground, #9ca3af);text-transform:uppercase;letter-spacing:.05em;display:flex;align-items:center;gap:6px}.pptx-ng-cs-badge{background:var(--pptx-primary, #6366f1);color:#fff;border-radius:10px;padding:1px 7px;font-size:11px;font-weight:700}.pptx-ng-cs-show-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}.pptx-ng-cs-show-row{padding:10px 12px;border:1px solid var(--pptx-border, #374151);border-radius:8px;display:flex;flex-direction:column;gap:8px}.pptx-ng-cs-show-row--active{border-color:var(--pptx-primary, #6366f1);background:color-mix(in srgb,var(--pptx-primary, #6366f1) 10%,transparent)}.pptx-ng-cs-show-info{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.pptx-ng-cs-show-name{font-size:13px;font-weight:600}.pptx-ng-cs-show-meta{font-size:11px;color:var(--pptx-muted-foreground, #9ca3af)}.pptx-ng-cs-show-actions{display:flex;gap:6px;flex-wrap:wrap}.pptx-ng-cs-edit-row{display:flex;gap:6px;align-items:center;flex-wrap:wrap}.pptx-ng-cs-input{flex:1 1 auto;min-width:120px;padding:6px 10px;border-radius:6px;border:1px solid var(--pptx-border, #374151);background:var(--pptx-background, #030712);color:inherit;font:inherit;font-size:13px}.pptx-ng-cs-slide-picker{display:flex;flex-direction:column;gap:4px;max-height:160px;overflow-y:auto;padding:6px 8px;border:1px solid var(--pptx-border, #374151);border-radius:6px;background:var(--pptx-background, #030712)}.pptx-ng-cs-slide-option{display:flex;align-items:center;gap:8px;font-size:13px;cursor:pointer;padding:2px 0}.pptx-ng-cs-empty{font-size:13px;color:var(--pptx-muted-foreground, #9ca3af);margin:0}.pptx-ng-cs-create-form{display:flex;flex-direction:column;gap:10px}.pptx-ng-cs-btn{font-size:12px;padding:5px 12px;border-radius:6px;border:1px solid var(--pptx-border, #374151);background:transparent;color:inherit;cursor:pointer;white-space:nowrap}.pptx-ng-cs-btn:hover{background:var(--pptx-accent, #1f2937)}.pptx-ng-cs-btn--primary{background:var(--pptx-primary, #6366f1);border-color:var(--pptx-primary, #6366f1);color:#fff;align-self:flex-start}.pptx-ng-cs-btn--primary:hover:not(:disabled){opacity:.9}.pptx-ng-cs-btn--primary:disabled{opacity:.5;cursor:not-allowed}.pptx-ng-cs-btn--danger{color:#f87171;border-color:#f87171}.pptx-ng-cs-btn--danger:hover{background:#f871711a}.pptx-ng-cs-btn--active{background:color-mix(in srgb,var(--pptx-primary, #6366f1) 20%,transparent);border-color:var(--pptx-primary, #6366f1);color:var(--pptx-primary, #6366f1)}.pptx-ng-cs-btn:disabled{opacity:.5;cursor:not-allowed}.pptx-ng-cs-footer{display:flex;justify-content:flex-end;padding:12px 20px;border-top:1px solid var(--pptx-border, #374151);flex-shrink:0}\n"], dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
37624
+ `, isInline: true, styles: [":host{display:contents}.pptx-ng-cs-backdrop{position:fixed;inset:0;background:#00000080;z-index:200}.pptx-ng-cs-dialog{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:201;width:min(540px,94vw);max-height:80vh;display:flex;flex-direction:column;background:var(--pptx-card, #111827);color:var(--pptx-foreground, #f3f4f6);border:1px solid var(--pptx-border, #374151);border-radius:12px;box-shadow:0 20px 60px #0009;font-family:system-ui,sans-serif}.pptx-ng-cs-header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px 12px;border-bottom:1px solid var(--pptx-border, #374151);flex-shrink:0}.pptx-ng-cs-title{margin:0;font-size:15px;font-weight:600}.pptx-ng-cs-close{background:transparent;border:none;color:var(--pptx-muted-foreground, #9ca3af);cursor:pointer;font-size:16px;padding:2px 6px;border-radius:4px}.pptx-ng-cs-close:hover{background:var(--pptx-accent, #1f2937);color:var(--pptx-foreground, #f3f4f6)}.pptx-ng-cs-body{flex:1 1 auto;overflow-y:auto;padding:16px 20px;display:flex;flex-direction:column;gap:20px;min-height:0}.pptx-ng-cs-section{display:flex;flex-direction:column;gap:10px}.pptx-ng-cs-section-title{margin:0;font-size:13px;font-weight:600;color:var(--pptx-muted-foreground, #9ca3af);text-transform:uppercase;letter-spacing:.05em;display:flex;align-items:center;gap:6px}.pptx-ng-cs-badge{background:var(--pptx-primary, #6366f1);color:#fff;border-radius:10px;padding:1px 7px;font-size:11px;font-weight:700}.pptx-ng-cs-show-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}.pptx-ng-cs-show-row{padding:10px 12px;border:1px solid var(--pptx-border, #374151);border-radius:8px;display:flex;flex-direction:column;gap:8px}.pptx-ng-cs-show-row--active{border-color:var(--pptx-primary, #6366f1);background:color-mix(in srgb,var(--pptx-primary, #6366f1) 10%,transparent)}.pptx-ng-cs-show-info{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.pptx-ng-cs-show-name{font-size:13px;font-weight:600}.pptx-ng-cs-show-meta{font-size:11px;color:var(--pptx-muted-foreground, #9ca3af)}.pptx-ng-cs-show-actions{display:flex;gap:6px;flex-wrap:wrap}.pptx-ng-cs-edit-row{display:flex;gap:6px;align-items:center;flex-wrap:wrap}.pptx-ng-cs-input{flex:1 1 auto;min-width:120px;padding:6px 10px;border-radius:6px;border:1px solid var(--pptx-border, #374151);background:var(--pptx-background, #030712);color:inherit;font:inherit;font-size:13px}.pptx-ng-cs-slide-picker{display:flex;flex-direction:column;gap:4px;max-height:160px;overflow-y:auto;padding:6px 8px;border:1px solid var(--pptx-border, #374151);border-radius:6px;background:var(--pptx-background, #030712)}.pptx-ng-cs-slide-option{display:flex;align-items:center;gap:8px;font-size:13px;cursor:pointer;padding:2px 0}.pptx-ng-cs-empty{font-size:13px;color:var(--pptx-muted-foreground, #9ca3af);margin:0}.pptx-ng-cs-create-form{display:flex;flex-direction:column;gap:10px}.pptx-ng-cs-btn{font-size:12px;padding:5px 12px;border-radius:6px;border:1px solid var(--pptx-border, #374151);background:transparent;color:inherit;cursor:pointer;white-space:nowrap}.pptx-ng-cs-btn:hover{background:var(--pptx-accent, #1f2937)}.pptx-ng-cs-btn--primary{background:var(--pptx-primary, #6366f1);border-color:var(--pptx-primary, #6366f1);color:#fff;align-self:flex-start}.pptx-ng-cs-btn--primary:hover:not(:disabled){opacity:.9}.pptx-ng-cs-btn--primary:disabled{opacity:.5;cursor:not-allowed}.pptx-ng-cs-btn--danger{color:#f87171;border-color:#f87171}.pptx-ng-cs-btn--danger:hover{background:#f871711a}.pptx-ng-cs-btn--active{background:color-mix(in srgb,var(--pptx-primary, #6366f1) 20%,transparent);border-color:var(--pptx-primary, #6366f1);color:var(--pptx-primary, #6366f1)}.pptx-ng-cs-btn:disabled{opacity:.5;cursor:not-allowed}.pptx-ng-cs-footer{display:flex;justify-content:flex-end;padding:12px 20px;border-top:1px solid var(--pptx-border, #374151);flex-shrink:0}\n"], dependencies: [{ kind: "component", type: LucideX, selector: "svg[lucideX]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
37523
37625
  }
37524
37626
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: CustomShowsComponent, decorators: [{
37525
37627
  type: Component,
37526
- args: [{ selector: 'pptx-custom-shows', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslatePipe], template: `
37628
+ args: [{ selector: 'pptx-custom-shows', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslatePipe, LucideX], template: `
37527
37629
  @if (open()) {
37528
37630
  <!-- Backdrop -->
37529
37631
  <div class="pptx-ng-cs-backdrop" aria-hidden="true" (click)="close.emit()"></div>
@@ -37545,7 +37647,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
37545
37647
  [attr.aria-label]="'pptx.customShows.closeDialog' | translate"
37546
37648
  (click)="close.emit()"
37547
37649
  >
37548
-
37650
+ <svg lucideX class="h-4 w-4"></svg>
37549
37651
  </button>
37550
37652
  </header>
37551
37653
 
@@ -37814,7 +37916,7 @@ class EditorStateService {
37814
37916
  * layer and re-merged on save.
37815
37917
  */
37816
37918
  setSlides(slides) {
37817
- const partitioned = partitionSlides(this.clone(slides));
37919
+ const partitioned = partitionSlides(slides.map(cloneSlide$1));
37818
37920
  this.slides.set(partitioned.slides);
37819
37921
  this.templateElementsBySlideId.set(partitioned.templateElementsBySlideId);
37820
37922
  this.selectedIds.set([]);
@@ -37824,7 +37926,7 @@ class EditorStateService {
37824
37926
  }
37825
37927
  /** Current editable (template-free) slides as a fresh (cloned) array. */
37826
37928
  snapshot() {
37827
- return this.clone(this.slides());
37929
+ return this.slides().map(cloneSlide$1);
37828
37930
  }
37829
37931
  /**
37830
37932
  * Replace the whole deck with pre-computed slides (e.g. a find/replace
@@ -37833,7 +37935,7 @@ class EditorStateService {
37833
37935
  */
37834
37936
  applyReplacement(newSlides, label = 'Replace') {
37835
37937
  this.history.record(this.captureSnapshot(), label);
37836
- this.slides.set(this.clone(newSlides));
37938
+ this.slides.set(newSlides.map(cloneSlide$1));
37837
37939
  this.dirty.set(true);
37838
37940
  this.syncHistory();
37839
37941
  }
@@ -37844,15 +37946,15 @@ class EditorStateService {
37844
37946
  * steps.
37845
37947
  */
37846
37948
  applyRemoteSlides(slides) {
37847
- this.slides.set(this.clone(slides));
37949
+ this.slides.set(slides.map(cloneSlide$1));
37848
37950
  this.dirty.set(true);
37849
37951
  }
37850
37952
  // ── Snapshot (deck + template store) ─────────────────────────────────────
37851
37953
  /** Capture the current deck + template store as one undo/redo snapshot. */
37852
37954
  captureSnapshot() {
37853
37955
  return {
37854
- slides: this.clone(this.slides()),
37855
- templateElementsBySlideId: this.clone(this.templateElementsBySlideId()),
37956
+ slides: this.slides().map(cloneSlide$1),
37957
+ templateElementsBySlideId: cloneTemplateElementsBySlideId$1(this.templateElementsBySlideId()),
37856
37958
  };
37857
37959
  }
37858
37960
  /** Restore both the deck and the template store from a snapshot. */
@@ -38102,7 +38204,7 @@ class EditorStateService {
38102
38204
  if (picked.length === 0) {
38103
38205
  return;
38104
38206
  }
38105
- this.clipboard = this.clone(picked);
38207
+ this.clipboard = picked.map(cloneElement$1);
38106
38208
  this.hasClipboard.set(true);
38107
38209
  }
38108
38210
  /** Copy then delete the selected elements. */
@@ -38124,7 +38226,7 @@ class EditorStateService {
38124
38226
  const additions = this.clipboard.map((el) => {
38125
38227
  const id = this.newId();
38126
38228
  newIds.push(id);
38127
- return { ...this.clone(el), id, x: el.x + 12, y: el.y + 12 };
38229
+ return { ...cloneElement$1(el), id, x: el.x + 12, y: el.y + 12 };
38128
38230
  });
38129
38231
  this.slides.set(slides.map((slide, i) => i === slideIndex ? { ...slide, elements: [...slide.elements, ...additions] } : slide));
38130
38232
  this.selectedIds.set(newIds);
@@ -38190,7 +38292,7 @@ class EditorStateService {
38190
38292
  }
38191
38293
  this.history.record(this.captureSnapshot(), 'Duplicate slide');
38192
38294
  const id = this.newId();
38193
- const copy = { ...this.clone(slides[index]), id, rId: id };
38295
+ const copy = { ...cloneSlide$1(slides[index]), id, rId: id };
38194
38296
  const next = [...slides];
38195
38297
  next.splice(index + 1, 0, copy);
38196
38298
  this.slides.set(this.renumber(next));
@@ -38249,9 +38351,6 @@ class EditorStateService {
38249
38351
  this.undoLabel.set(this.history.undoLabel);
38250
38352
  this.redoLabel.set(this.history.redoLabel);
38251
38353
  }
38252
- clone(value) {
38253
- return structuredClone(value);
38254
- }
38255
38354
  newId() {
38256
38355
  const c = globalThis.crypto;
38257
38356
  if (c && typeof c.randomUUID === 'function') {
@@ -39124,7 +39223,7 @@ class EditorToolbarComponent {
39124
39223
  [title]="'pptx.editorToolbar.insertRectangle' | translate"
39125
39224
  (click)="onInsertShape('rect')"
39126
39225
  >
39127
-
39226
+ <svg lucideSquare class="h-4 w-4"></svg>
39128
39227
  </button>
39129
39228
 
39130
39229
  <button
@@ -39133,7 +39232,7 @@ class EditorToolbarComponent {
39133
39232
  [title]="'pptx.editorToolbar.insertEllipse' | translate"
39134
39233
  (click)="onInsertShape('ellipse')"
39135
39234
  >
39136
-
39235
+ <svg lucideCircle class="h-4 w-4"></svg>
39137
39236
  </button>
39138
39237
 
39139
39238
  <button
@@ -39142,7 +39241,7 @@ class EditorToolbarComponent {
39142
39241
  [title]="'pptx.editorToolbar.insertLine' | translate"
39143
39242
  (click)="onInsertShape('line')"
39144
39243
  >
39145
-
39244
+ <svg lucideSlash class="h-4 w-4"></svg>
39146
39245
  </button>
39147
39246
  </div>
39148
39247
 
@@ -39166,7 +39265,7 @@ class EditorToolbarComponent {
39166
39265
  [disabled]="!editor.hasSelection()"
39167
39266
  (click)="editor.duplicateSelected(slideIndex())"
39168
39267
  >
39169
-
39268
+ <svg lucideCopy class="h-4 w-4"></svg>
39170
39269
  </button>
39171
39270
 
39172
39271
  <button
@@ -39176,7 +39275,7 @@ class EditorToolbarComponent {
39176
39275
  [disabled]="!editor.hasSelection()"
39177
39276
  (click)="editor.deleteSelected(slideIndex())"
39178
39277
  >
39179
-
39278
+ <svg lucideTrash2 class="h-4 w-4"></svg>
39180
39279
  </button>
39181
39280
 
39182
39281
  <button
@@ -39186,7 +39285,7 @@ class EditorToolbarComponent {
39186
39285
  [disabled]="!editor.hasSelection()"
39187
39286
  (click)="editor.bringSelectedToFront(slideIndex())"
39188
39287
  >
39189
-
39288
+ <svg lucideChevronsUp class="h-4 w-4"></svg>
39190
39289
  </button>
39191
39290
 
39192
39291
  <button
@@ -39196,7 +39295,7 @@ class EditorToolbarComponent {
39196
39295
  [disabled]="!editor.hasSelection()"
39197
39296
  (click)="editor.sendSelectedToBack(slideIndex())"
39198
39297
  >
39199
-
39298
+ <svg lucideChevronsDown class="h-4 w-4"></svg>
39200
39299
  </button>
39201
39300
 
39202
39301
  <button
@@ -39206,7 +39305,7 @@ class EditorToolbarComponent {
39206
39305
  [disabled]="!editor.hasSelection()"
39207
39306
  (click)="editor.bringSelectedForward(slideIndex())"
39208
39307
  >
39209
-
39308
+ <svg lucideArrowUp class="h-4 w-4"></svg>
39210
39309
  </button>
39211
39310
 
39212
39311
  <button
@@ -39216,7 +39315,7 @@ class EditorToolbarComponent {
39216
39315
  [disabled]="!editor.hasSelection()"
39217
39316
  (click)="editor.sendSelectedBackward(slideIndex())"
39218
39317
  >
39219
-
39318
+ <svg lucideArrowDown class="h-4 w-4"></svg>
39220
39319
  </button>
39221
39320
  <button
39222
39321
  type="button"
@@ -39225,7 +39324,7 @@ class EditorToolbarComponent {
39225
39324
  [disabled]="!canGroup()"
39226
39325
  (click)="editor.groupSelected(slideIndex())"
39227
39326
  >
39228
-
39327
+ <svg lucideGroup class="h-4 w-4"></svg>
39229
39328
  </button>
39230
39329
  <button
39231
39330
  type="button"
@@ -39234,7 +39333,7 @@ class EditorToolbarComponent {
39234
39333
  [disabled]="!canUngroup()"
39235
39334
  (click)="editor.ungroupSelected(slideIndex())"
39236
39335
  >
39237
-
39336
+ <svg lucideUngroup class="h-4 w-4"></svg>
39238
39337
  </button>
39239
39338
  </div>
39240
39339
 
@@ -39255,7 +39354,7 @@ class EditorToolbarComponent {
39255
39354
  [disabled]="!canAlign()"
39256
39355
  (click)="editor.alignSelected(slideIndex(), 'left')"
39257
39356
  >
39258
-
39357
+ <svg lucideTextAlignStart class="h-4 w-4"></svg>
39259
39358
  </button>
39260
39359
  <button
39261
39360
  type="button"
@@ -39264,7 +39363,7 @@ class EditorToolbarComponent {
39264
39363
  [disabled]="!canAlign()"
39265
39364
  (click)="editor.alignSelected(slideIndex(), 'centerH')"
39266
39365
  >
39267
-
39366
+ <svg lucideTextAlignCenter class="h-4 w-4"></svg>
39268
39367
  </button>
39269
39368
  <button
39270
39369
  type="button"
@@ -39273,7 +39372,7 @@ class EditorToolbarComponent {
39273
39372
  [disabled]="!canAlign()"
39274
39373
  (click)="editor.alignSelected(slideIndex(), 'right')"
39275
39374
  >
39276
-
39375
+ <svg lucideTextAlignEnd class="h-4 w-4"></svg>
39277
39376
  </button>
39278
39377
  <button
39279
39378
  type="button"
@@ -39282,7 +39381,7 @@ class EditorToolbarComponent {
39282
39381
  [disabled]="!canAlign()"
39283
39382
  (click)="editor.alignSelected(slideIndex(), 'top')"
39284
39383
  >
39285
-
39384
+ <svg lucideChevronUp class="h-4 w-4"></svg>
39286
39385
  </button>
39287
39386
  <button
39288
39387
  type="button"
@@ -39291,7 +39390,7 @@ class EditorToolbarComponent {
39291
39390
  [disabled]="!canAlign()"
39292
39391
  (click)="editor.alignSelected(slideIndex(), 'middle')"
39293
39392
  >
39294
-
39393
+ <svg lucideTextAlignCenter class="h-4 w-4 rotate-90"></svg>
39295
39394
  </button>
39296
39395
  <button
39297
39396
  type="button"
@@ -39300,7 +39399,7 @@ class EditorToolbarComponent {
39300
39399
  [disabled]="!canAlign()"
39301
39400
  (click)="editor.alignSelected(slideIndex(), 'bottom')"
39302
39401
  >
39303
-
39402
+ <svg lucideChevronDown class="h-4 w-4"></svg>
39304
39403
  </button>
39305
39404
  <button
39306
39405
  type="button"
@@ -39309,7 +39408,7 @@ class EditorToolbarComponent {
39309
39408
  [disabled]="!canDistribute()"
39310
39409
  (click)="editor.distributeSelected(slideIndex(), 'horizontal')"
39311
39410
  >
39312
-
39411
+ <svg lucideAlignHorizontalSpaceAround class="h-4 w-4"></svg>
39313
39412
  </button>
39314
39413
  <button
39315
39414
  type="button"
@@ -39318,15 +39417,35 @@ class EditorToolbarComponent {
39318
39417
  [disabled]="!canDistribute()"
39319
39418
  (click)="editor.distributeSelected(slideIndex(), 'vertical')"
39320
39419
  >
39321
-
39420
+ <svg lucideAlignVerticalSpaceAround class="h-4 w-4"></svg>
39322
39421
  </button>
39323
39422
  </div>
39324
39423
  </div>
39325
- `, isInline: true, styles: [".pptx-ng-toolbar{display:flex;flex-direction:row;align-items:center;gap:0;padding:4px 8px;background:var(--pptx-toolbar-bg, #1e1e1e);color:var(--pptx-toolbar-fg, #e0e0e0);border-bottom:1px solid var(--pptx-toolbar-border, #333);min-height:36px;-webkit-user-select:none;user-select:none}.pptx-ng-toolbar__group{display:flex;flex-direction:row;align-items:center;gap:4px}.pptx-ng-toolbar__group-label{font-size:10px;color:var(--pptx-toolbar-muted, #888);text-transform:uppercase;letter-spacing:.05em;padding:0 6px 0 4px;flex-shrink:0}.pptx-ng-toolbar__divider{width:1px;height:20px;background:var(--pptx-toolbar-border, #444);margin:0 4px;flex-shrink:0}.pptx-ng-toolbar__btn{display:inline-flex;align-items:center;justify-content:center;min-width:28px;height:28px;padding:2px 8px;background:transparent;border:1px solid transparent;border-radius:4px;color:inherit;font-size:14px;cursor:pointer;transition:background .1s;flex-shrink:0}.pptx-ng-toolbar__btn:hover:not(:disabled){background:var(--pptx-toolbar-hover, #3a3a3a)}.pptx-ng-toolbar__btn:active:not(:disabled){background:var(--pptx-toolbar-active-bg, #2a2a2a);transform:scale(.95);opacity:.8}.pptx-ng-toolbar__btn:disabled{opacity:.4;cursor:not-allowed}.pptx-ng-toolbar__btn--danger:not(:disabled){color:var(--pptx-toolbar-danger, #f47c7c)}.pptx-ng-toolbar__btn--danger:hover:not(:disabled){background:var(--pptx-toolbar-danger-hover, #4a1a1a)}\n"], dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
39424
+ `, isInline: true, styles: [".pptx-ng-toolbar{display:flex;flex-direction:row;align-items:center;gap:0;padding:4px 8px;background:var(--pptx-toolbar-bg, #1e1e1e);color:var(--pptx-toolbar-fg, #e0e0e0);border-bottom:1px solid var(--pptx-toolbar-border, #333);min-height:36px;-webkit-user-select:none;user-select:none}.pptx-ng-toolbar__group{display:flex;flex-direction:row;align-items:center;gap:4px}.pptx-ng-toolbar__group-label{font-size:10px;color:var(--pptx-toolbar-muted, #888);text-transform:uppercase;letter-spacing:.05em;padding:0 6px 0 4px;flex-shrink:0}.pptx-ng-toolbar__divider{width:1px;height:20px;background:var(--pptx-toolbar-border, #444);margin:0 4px;flex-shrink:0}.pptx-ng-toolbar__btn{display:inline-flex;align-items:center;justify-content:center;min-width:28px;height:28px;padding:2px 8px;background:transparent;border:1px solid transparent;border-radius:4px;color:inherit;font-size:14px;cursor:pointer;transition:background .1s;flex-shrink:0}.pptx-ng-toolbar__btn:hover:not(:disabled){background:var(--pptx-toolbar-hover, #3a3a3a)}.pptx-ng-toolbar__btn:active:not(:disabled){background:var(--pptx-toolbar-active-bg, #2a2a2a);transform:scale(.95);opacity:.8}.pptx-ng-toolbar__btn:disabled{opacity:.4;cursor:not-allowed}.pptx-ng-toolbar__btn--danger:not(:disabled){color:var(--pptx-toolbar-danger, #f47c7c)}.pptx-ng-toolbar__btn--danger:hover:not(:disabled){background:var(--pptx-toolbar-danger-hover, #4a1a1a)}\n"], dependencies: [{ kind: "component", type: LucideSquare, selector: "svg[lucideSquare]" }, { kind: "component", type: LucideCircle, selector: "svg[lucideCircle]" }, { kind: "component", type: LucideSlash, selector: "svg[lucideSlash]" }, { kind: "component", type: LucideCopy, selector: "svg[lucideCopy]" }, { kind: "component", type: LucideTrash2, selector: "svg[lucideTrash2]" }, { kind: "component", type: LucideChevronsUp, selector: "svg[lucideChevronsUp]" }, { kind: "component", type: LucideChevronsDown, selector: "svg[lucideChevronsDown]" }, { kind: "component", type: LucideArrowUp, selector: "svg[lucideArrowUp]" }, { kind: "component", type: LucideArrowDown, selector: "svg[lucideArrowDown]" }, { kind: "component", type: LucideGroup, selector: "svg[lucideGroup]" }, { kind: "component", type: LucideUngroup, selector: "svg[lucideUngroup]" }, { kind: "component", type: LucideTextAlignStart, selector: "svg[lucideTextAlignStart], svg[lucideText], svg[lucideAlignLeft]" }, { kind: "component", type: LucideTextAlignCenter, selector: "svg[lucideTextAlignCenter], svg[lucideAlignCenter]" }, { kind: "component", type: LucideTextAlignEnd, selector: "svg[lucideTextAlignEnd], svg[lucideAlignRight]" }, { kind: "component", type: LucideChevronUp, selector: "svg[lucideChevronUp]" }, { kind: "component", type: LucideChevronDown, selector: "svg[lucideChevronDown]" }, { kind: "component", type: LucideAlignHorizontalSpaceAround, selector: "svg[lucideAlignHorizontalSpaceAround]" }, { kind: "component", type: LucideAlignVerticalSpaceAround, selector: "svg[lucideAlignVerticalSpaceAround]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
39326
39425
  }
39327
39426
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: EditorToolbarComponent, decorators: [{
39328
39427
  type: Component,
39329
- args: [{ selector: 'pptx-editor-toolbar', standalone: true, imports: [TranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: `
39428
+ args: [{ selector: 'pptx-editor-toolbar', standalone: true, imports: [
39429
+ TranslatePipe,
39430
+ LucideSquare,
39431
+ LucideCircle,
39432
+ LucideSlash,
39433
+ LucideCopy,
39434
+ LucideTrash2,
39435
+ LucideChevronsUp,
39436
+ LucideChevronsDown,
39437
+ LucideArrowUp,
39438
+ LucideArrowDown,
39439
+ LucideGroup,
39440
+ LucideUngroup,
39441
+ LucideTextAlignStart,
39442
+ LucideTextAlignCenter,
39443
+ LucideTextAlignEnd,
39444
+ LucideChevronUp,
39445
+ LucideChevronDown,
39446
+ LucideAlignHorizontalSpaceAround,
39447
+ LucideAlignVerticalSpaceAround,
39448
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: `
39330
39449
  <div
39331
39450
  class="pptx-ng-toolbar"
39332
39451
  role="toolbar"
@@ -39357,7 +39476,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
39357
39476
  [title]="'pptx.editorToolbar.insertRectangle' | translate"
39358
39477
  (click)="onInsertShape('rect')"
39359
39478
  >
39360
-
39479
+ <svg lucideSquare class="h-4 w-4"></svg>
39361
39480
  </button>
39362
39481
 
39363
39482
  <button
@@ -39366,7 +39485,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
39366
39485
  [title]="'pptx.editorToolbar.insertEllipse' | translate"
39367
39486
  (click)="onInsertShape('ellipse')"
39368
39487
  >
39369
-
39488
+ <svg lucideCircle class="h-4 w-4"></svg>
39370
39489
  </button>
39371
39490
 
39372
39491
  <button
@@ -39375,7 +39494,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
39375
39494
  [title]="'pptx.editorToolbar.insertLine' | translate"
39376
39495
  (click)="onInsertShape('line')"
39377
39496
  >
39378
-
39497
+ <svg lucideSlash class="h-4 w-4"></svg>
39379
39498
  </button>
39380
39499
  </div>
39381
39500
 
@@ -39399,7 +39518,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
39399
39518
  [disabled]="!editor.hasSelection()"
39400
39519
  (click)="editor.duplicateSelected(slideIndex())"
39401
39520
  >
39402
-
39521
+ <svg lucideCopy class="h-4 w-4"></svg>
39403
39522
  </button>
39404
39523
 
39405
39524
  <button
@@ -39409,7 +39528,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
39409
39528
  [disabled]="!editor.hasSelection()"
39410
39529
  (click)="editor.deleteSelected(slideIndex())"
39411
39530
  >
39412
-
39531
+ <svg lucideTrash2 class="h-4 w-4"></svg>
39413
39532
  </button>
39414
39533
 
39415
39534
  <button
@@ -39419,7 +39538,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
39419
39538
  [disabled]="!editor.hasSelection()"
39420
39539
  (click)="editor.bringSelectedToFront(slideIndex())"
39421
39540
  >
39422
-
39541
+ <svg lucideChevronsUp class="h-4 w-4"></svg>
39423
39542
  </button>
39424
39543
 
39425
39544
  <button
@@ -39429,7 +39548,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
39429
39548
  [disabled]="!editor.hasSelection()"
39430
39549
  (click)="editor.sendSelectedToBack(slideIndex())"
39431
39550
  >
39432
-
39551
+ <svg lucideChevronsDown class="h-4 w-4"></svg>
39433
39552
  </button>
39434
39553
 
39435
39554
  <button
@@ -39439,7 +39558,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
39439
39558
  [disabled]="!editor.hasSelection()"
39440
39559
  (click)="editor.bringSelectedForward(slideIndex())"
39441
39560
  >
39442
-
39561
+ <svg lucideArrowUp class="h-4 w-4"></svg>
39443
39562
  </button>
39444
39563
 
39445
39564
  <button
@@ -39449,7 +39568,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
39449
39568
  [disabled]="!editor.hasSelection()"
39450
39569
  (click)="editor.sendSelectedBackward(slideIndex())"
39451
39570
  >
39452
-
39571
+ <svg lucideArrowDown class="h-4 w-4"></svg>
39453
39572
  </button>
39454
39573
  <button
39455
39574
  type="button"
@@ -39458,7 +39577,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
39458
39577
  [disabled]="!canGroup()"
39459
39578
  (click)="editor.groupSelected(slideIndex())"
39460
39579
  >
39461
-
39580
+ <svg lucideGroup class="h-4 w-4"></svg>
39462
39581
  </button>
39463
39582
  <button
39464
39583
  type="button"
@@ -39467,7 +39586,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
39467
39586
  [disabled]="!canUngroup()"
39468
39587
  (click)="editor.ungroupSelected(slideIndex())"
39469
39588
  >
39470
-
39589
+ <svg lucideUngroup class="h-4 w-4"></svg>
39471
39590
  </button>
39472
39591
  </div>
39473
39592
 
@@ -39488,7 +39607,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
39488
39607
  [disabled]="!canAlign()"
39489
39608
  (click)="editor.alignSelected(slideIndex(), 'left')"
39490
39609
  >
39491
-
39610
+ <svg lucideTextAlignStart class="h-4 w-4"></svg>
39492
39611
  </button>
39493
39612
  <button
39494
39613
  type="button"
@@ -39497,7 +39616,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
39497
39616
  [disabled]="!canAlign()"
39498
39617
  (click)="editor.alignSelected(slideIndex(), 'centerH')"
39499
39618
  >
39500
-
39619
+ <svg lucideTextAlignCenter class="h-4 w-4"></svg>
39501
39620
  </button>
39502
39621
  <button
39503
39622
  type="button"
@@ -39506,7 +39625,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
39506
39625
  [disabled]="!canAlign()"
39507
39626
  (click)="editor.alignSelected(slideIndex(), 'right')"
39508
39627
  >
39509
-
39628
+ <svg lucideTextAlignEnd class="h-4 w-4"></svg>
39510
39629
  </button>
39511
39630
  <button
39512
39631
  type="button"
@@ -39515,7 +39634,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
39515
39634
  [disabled]="!canAlign()"
39516
39635
  (click)="editor.alignSelected(slideIndex(), 'top')"
39517
39636
  >
39518
-
39637
+ <svg lucideChevronUp class="h-4 w-4"></svg>
39519
39638
  </button>
39520
39639
  <button
39521
39640
  type="button"
@@ -39524,7 +39643,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
39524
39643
  [disabled]="!canAlign()"
39525
39644
  (click)="editor.alignSelected(slideIndex(), 'middle')"
39526
39645
  >
39527
-
39646
+ <svg lucideTextAlignCenter class="h-4 w-4 rotate-90"></svg>
39528
39647
  </button>
39529
39648
  <button
39530
39649
  type="button"
@@ -39533,7 +39652,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
39533
39652
  [disabled]="!canAlign()"
39534
39653
  (click)="editor.alignSelected(slideIndex(), 'bottom')"
39535
39654
  >
39536
-
39655
+ <svg lucideChevronDown class="h-4 w-4"></svg>
39537
39656
  </button>
39538
39657
  <button
39539
39658
  type="button"
@@ -39542,7 +39661,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
39542
39661
  [disabled]="!canDistribute()"
39543
39662
  (click)="editor.distributeSelected(slideIndex(), 'horizontal')"
39544
39663
  >
39545
-
39664
+ <svg lucideAlignHorizontalSpaceAround class="h-4 w-4"></svg>
39546
39665
  </button>
39547
39666
  <button
39548
39667
  type="button"
@@ -39551,7 +39670,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
39551
39670
  [disabled]="!canDistribute()"
39552
39671
  (click)="editor.distributeSelected(slideIndex(), 'vertical')"
39553
39672
  >
39554
-
39673
+ <svg lucideAlignVerticalSpaceAround class="h-4 w-4"></svg>
39555
39674
  </button>
39556
39675
  </div>
39557
39676
  </div>
@@ -42613,6 +42732,7 @@ class SmartArtRendererComponent {
42613
42732
  } @else if (hasDrawingShapes()) {
42614
42733
  <svg
42615
42734
  class="pptx-ng-smartart-svg"
42735
+ data-testid="smartart-drawing-shapes"
42616
42736
  [attr.viewBox]="svgViewBox()"
42617
42737
  preserveAspectRatio="xMidYMid meet"
42618
42738
  >
@@ -42669,6 +42789,7 @@ class SmartArtRendererComponent {
42669
42789
  } @else if (hasLayout()) {
42670
42790
  <svg
42671
42791
  class="pptx-ng-smartart-svg"
42792
+ [attr.data-testid]="'smartart-' + layout().family"
42672
42793
  [attr.viewBox]="layout().viewBox"
42673
42794
  preserveAspectRatio="xMidYMid meet"
42674
42795
  [attr.data-layout-family]="layout().family"
@@ -42847,6 +42968,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
42847
42968
  } @else if (hasDrawingShapes()) {
42848
42969
  <svg
42849
42970
  class="pptx-ng-smartart-svg"
42971
+ data-testid="smartart-drawing-shapes"
42850
42972
  [attr.viewBox]="svgViewBox()"
42851
42973
  preserveAspectRatio="xMidYMid meet"
42852
42974
  >
@@ -42903,6 +43025,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
42903
43025
  } @else if (hasLayout()) {
42904
43026
  <svg
42905
43027
  class="pptx-ng-smartart-svg"
43028
+ [attr.data-testid]="'smartart-' + layout().family"
42906
43029
  [attr.viewBox]="layout().viewBox"
42907
43030
  preserveAspectRatio="xMidYMid meet"
42908
43031
  [attr.data-layout-family]="layout().family"
@@ -43742,11 +43865,11 @@ class AnimationAuthorPanelComponent {
43742
43865
  @if (currentHasAnimation()) {
43743
43866
  <button
43744
43867
  type="button"
43745
- class="pptx-ng-anim__remove-btn"
43868
+ class="pptx-ng-anim__remove-btn inline-flex items-center gap-1"
43746
43869
  [title]="'pptx.animations.removeFromElement' | translate"
43747
43870
  (click)="onRemove()"
43748
43871
  >
43749
- {{ 'pptx.animations.remove' | translate }}
43872
+ <svg lucideX class="h-3.5 w-3.5"></svg> {{ 'pptx.animations.remove' | translate }}
43750
43873
  </button>
43751
43874
  }
43752
43875
  </div>
@@ -44004,32 +44127,34 @@ class AnimationAuthorPanelComponent {
44004
44127
  <div class="pptx-ng-anim__row">
44005
44128
  <button
44006
44129
  type="button"
44007
- class="pptx-ng-anim__order-btn"
44130
+ class="pptx-ng-anim__order-btn inline-flex items-center gap-1"
44008
44131
  [disabled]="!canEdit()"
44009
44132
  [title]="'pptx.animations.moveEarlier' | translate"
44010
44133
  (click)="onMoveUp()"
44011
44134
  >
44012
- {{ 'pptx.animations.earlier' | translate }}
44135
+ <svg lucideArrowUp class="h-3.5 w-3.5"></svg>
44136
+ {{ 'pptx.animations.earlier' | translate }}
44013
44137
  </button>
44014
44138
  <button
44015
44139
  type="button"
44016
- class="pptx-ng-anim__order-btn"
44140
+ class="pptx-ng-anim__order-btn inline-flex items-center gap-1"
44017
44141
  [disabled]="!canEdit()"
44018
44142
  [title]="'pptx.animations.moveLater' | translate"
44019
44143
  (click)="onMoveDown()"
44020
44144
  >
44021
- {{ 'pptx.animations.later' | translate }}
44145
+ <svg lucideArrowDown class="h-3.5 w-3.5"></svg>
44146
+ {{ 'pptx.animations.later' | translate }}
44022
44147
  </button>
44023
44148
  </div>
44024
44149
  </section>
44025
44150
  }
44026
44151
  <!-- end @if (currentHasAnimation()) -->
44027
44152
  </aside>
44028
- `, isInline: true, styles: [".pptx-ng-anim{display:flex;flex-direction:column;gap:0;padding:.5rem;background:var(--pptx-inspector-bg, #1e1e1e);color:var(--pptx-inspector-fg, #e0e0e0);font-size:12px;min-width:220px;overflow-y:auto}.pptx-ng-anim__header{display:flex;align-items:center;justify-content:space-between;padding-bottom:.4rem;border-bottom:1px solid var(--pptx-inspector-border, #333);margin-bottom:.35rem}.pptx-ng-anim__title{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--pptx-inspector-muted, #888)}.pptx-ng-anim__subheading{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--pptx-inspector-muted, #888);padding:.4rem 0 .2rem;border-top:1px solid var(--pptx-inspector-border, #333);margin-top:.2rem}.pptx-ng-anim__section{padding:.25rem 0;border-bottom:1px solid var(--pptx-inspector-border, #2a2a2a)}.pptx-ng-anim__section:last-child{border-bottom:none}.pptx-ng-anim__label{display:block;font-size:10px;color:var(--pptx-inspector-muted, #888);margin-bottom:.2rem}.pptx-ng-anim__select,.pptx-ng-anim__input{width:100%;background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;padding:3px 6px;font-size:12px;box-sizing:border-box}.pptx-ng-anim__select:disabled,.pptx-ng-anim__input:disabled{opacity:.5;cursor:not-allowed}.pptx-ng-anim__direction-grid{display:flex;flex-wrap:wrap;gap:.25rem}.pptx-ng-anim__dir-btn{width:30px;height:30px;background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;cursor:pointer;font-size:14px;display:flex;align-items:center;justify-content:center}.pptx-ng-anim__dir-btn.is-active{background:var(--pptx-inspector-active, #0078d4);border-color:var(--pptx-inspector-active, #0078d4);color:#fff}.pptx-ng-anim__dir-btn:disabled{opacity:.5;cursor:not-allowed}.pptx-ng-anim__row{display:flex;gap:.35rem}.pptx-ng-anim__order-btn{flex:1;padding:3px 6px;background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;cursor:pointer;font-size:11px;white-space:nowrap}.pptx-ng-anim__order-btn:hover:not(:disabled){background:var(--pptx-inspector-hover, #3a3a3a)}.pptx-ng-anim__order-btn:disabled{opacity:.5;cursor:not-allowed}.pptx-ng-anim__remove-btn{padding:2px 6px;background:transparent;border:1px solid var(--pptx-inspector-danger-border, #6b2a2a);color:var(--pptx-inspector-danger, #f47c7c);border-radius:3px;cursor:pointer;font-size:10px}.pptx-ng-anim__remove-btn:hover{background:var(--pptx-inspector-danger-hover, #4a1a1a)}@media(pointer:coarse),(max-width:640px){.pptx-ng-anim{width:100%;min-width:0;box-sizing:border-box;font-size:14px}.pptx-ng-anim__select,.pptx-ng-anim__input{min-height:40px;font-size:16px;padding:6px 8px}.pptx-ng-anim__dir-btn{width:40px;height:40px}.pptx-ng-anim__order-btn{min-height:40px;font-size:13px}}\n"], dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
44153
+ `, isInline: true, styles: [".pptx-ng-anim{display:flex;flex-direction:column;gap:0;padding:.5rem;background:var(--pptx-inspector-bg, #1e1e1e);color:var(--pptx-inspector-fg, #e0e0e0);font-size:12px;min-width:220px;overflow-y:auto}.pptx-ng-anim__header{display:flex;align-items:center;justify-content:space-between;padding-bottom:.4rem;border-bottom:1px solid var(--pptx-inspector-border, #333);margin-bottom:.35rem}.pptx-ng-anim__title{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--pptx-inspector-muted, #888)}.pptx-ng-anim__subheading{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--pptx-inspector-muted, #888);padding:.4rem 0 .2rem;border-top:1px solid var(--pptx-inspector-border, #333);margin-top:.2rem}.pptx-ng-anim__section{padding:.25rem 0;border-bottom:1px solid var(--pptx-inspector-border, #2a2a2a)}.pptx-ng-anim__section:last-child{border-bottom:none}.pptx-ng-anim__label{display:block;font-size:10px;color:var(--pptx-inspector-muted, #888);margin-bottom:.2rem}.pptx-ng-anim__select,.pptx-ng-anim__input{width:100%;background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;padding:3px 6px;font-size:12px;box-sizing:border-box}.pptx-ng-anim__select:disabled,.pptx-ng-anim__input:disabled{opacity:.5;cursor:not-allowed}.pptx-ng-anim__direction-grid{display:flex;flex-wrap:wrap;gap:.25rem}.pptx-ng-anim__dir-btn{width:30px;height:30px;background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;cursor:pointer;font-size:14px;display:flex;align-items:center;justify-content:center}.pptx-ng-anim__dir-btn.is-active{background:var(--pptx-inspector-active, #0078d4);border-color:var(--pptx-inspector-active, #0078d4);color:#fff}.pptx-ng-anim__dir-btn:disabled{opacity:.5;cursor:not-allowed}.pptx-ng-anim__row{display:flex;gap:.35rem}.pptx-ng-anim__order-btn{flex:1;padding:3px 6px;background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;cursor:pointer;font-size:11px;white-space:nowrap}.pptx-ng-anim__order-btn:hover:not(:disabled){background:var(--pptx-inspector-hover, #3a3a3a)}.pptx-ng-anim__order-btn:disabled{opacity:.5;cursor:not-allowed}.pptx-ng-anim__remove-btn{padding:2px 6px;background:transparent;border:1px solid var(--pptx-inspector-danger-border, #6b2a2a);color:var(--pptx-inspector-danger, #f47c7c);border-radius:3px;cursor:pointer;font-size:10px}.pptx-ng-anim__remove-btn:hover{background:var(--pptx-inspector-danger-hover, #4a1a1a)}@media(pointer:coarse),(max-width:640px){.pptx-ng-anim{width:100%;min-width:0;box-sizing:border-box;font-size:14px}.pptx-ng-anim__select,.pptx-ng-anim__input{min-height:40px;font-size:16px;padding:6px 8px}.pptx-ng-anim__dir-btn{width:40px;height:40px}.pptx-ng-anim__order-btn{min-height:40px;font-size:13px}}\n"], dependencies: [{ kind: "component", type: LucideX, selector: "svg[lucideX]" }, { kind: "component", type: LucideArrowUp, selector: "svg[lucideArrowUp]" }, { kind: "component", type: LucideArrowDown, selector: "svg[lucideArrowDown]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
44029
44154
  }
44030
44155
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: AnimationAuthorPanelComponent, decorators: [{
44031
44156
  type: Component,
44032
- args: [{ selector: 'pptx-animation-author-panel', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslatePipe], template: `
44157
+ args: [{ selector: 'pptx-animation-author-panel', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslatePipe, LucideX, LucideArrowUp, LucideArrowDown], template: `
44033
44158
  <aside class="pptx-ng-anim" [attr.aria-label]="'pptx.animations.propertiesLabel' | translate">
44034
44159
  <!-- ── Header ───────────────────────────────────────────────────── -->
44035
44160
  <div class="pptx-ng-anim__header">
@@ -44037,11 +44162,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
44037
44162
  @if (currentHasAnimation()) {
44038
44163
  <button
44039
44164
  type="button"
44040
- class="pptx-ng-anim__remove-btn"
44165
+ class="pptx-ng-anim__remove-btn inline-flex items-center gap-1"
44041
44166
  [title]="'pptx.animations.removeFromElement' | translate"
44042
44167
  (click)="onRemove()"
44043
44168
  >
44044
- {{ 'pptx.animations.remove' | translate }}
44169
+ <svg lucideX class="h-3.5 w-3.5"></svg> {{ 'pptx.animations.remove' | translate }}
44045
44170
  </button>
44046
44171
  }
44047
44172
  </div>
@@ -44299,21 +44424,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
44299
44424
  <div class="pptx-ng-anim__row">
44300
44425
  <button
44301
44426
  type="button"
44302
- class="pptx-ng-anim__order-btn"
44427
+ class="pptx-ng-anim__order-btn inline-flex items-center gap-1"
44303
44428
  [disabled]="!canEdit()"
44304
44429
  [title]="'pptx.animations.moveEarlier' | translate"
44305
44430
  (click)="onMoveUp()"
44306
44431
  >
44307
- {{ 'pptx.animations.earlier' | translate }}
44432
+ <svg lucideArrowUp class="h-3.5 w-3.5"></svg>
44433
+ {{ 'pptx.animations.earlier' | translate }}
44308
44434
  </button>
44309
44435
  <button
44310
44436
  type="button"
44311
- class="pptx-ng-anim__order-btn"
44437
+ class="pptx-ng-anim__order-btn inline-flex items-center gap-1"
44312
44438
  [disabled]="!canEdit()"
44313
44439
  [title]="'pptx.animations.moveLater' | translate"
44314
44440
  (click)="onMoveDown()"
44315
44441
  >
44316
- {{ 'pptx.animations.later' | translate }}
44442
+ <svg lucideArrowDown class="h-3.5 w-3.5"></svg>
44443
+ {{ 'pptx.animations.later' | translate }}
44317
44444
  </button>
44318
44445
  </div>
44319
44446
  </section>
@@ -51896,7 +52023,7 @@ class InspectorPanelComponent {
51896
52023
  [title]="'pptx.contextMenu.bringForward' | translate"
51897
52024
  (click)="editor.bringSelectedForward(slideIndex())"
51898
52025
  >
51899
-
52026
+ <svg lucideArrowUp class="h-3.5 w-3.5"></svg>
51900
52027
  </button>
51901
52028
  <button
51902
52029
  type="button"
@@ -51904,7 +52031,7 @@ class InspectorPanelComponent {
51904
52031
  [title]="'pptx.contextMenu.sendBackward' | translate"
51905
52032
  (click)="editor.sendSelectedBackward(slideIndex())"
51906
52033
  >
51907
-
52034
+ <svg lucideArrowDown class="h-3.5 w-3.5"></svg>
51908
52035
  </button>
51909
52036
  </div>
51910
52037
  </section>
@@ -52016,7 +52143,7 @@ class InspectorPanelComponent {
52016
52143
  </div>
52017
52144
  </section>
52018
52145
  </aside>
52019
- `, isInline: true, styles: [".pptx-ng-inspector{display:flex;flex-direction:column;gap:0;padding:.5rem;background:var(--pptx-inspector-bg, #1e1e1e);color:var(--pptx-inspector-fg, #e0e0e0);font-size:12px;min-width:220px;overflow-y:auto}.pptx-ng-inspector__section{padding:.5rem 0;border-bottom:1px solid var(--pptx-inspector-border, #333)}.pptx-ng-inspector__section:last-child{border-bottom:none}.pptx-ng-inspector__heading{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--pptx-inspector-muted, #888);margin:0 0 .35rem}.pptx-ng-inspector__details{border-bottom:1px solid var(--pptx-inspector-border, #333)}.pptx-ng-inspector__summary{padding:.5rem 0;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--pptx-inspector-muted, #888);cursor:pointer;-webkit-user-select:none;user-select:none}.pptx-ng-inspector__row{display:flex;align-items:center;gap:.35rem;margin-bottom:.35rem}.pptx-ng-inspector__row:last-child{margin-bottom:0}.pptx-ng-inspector__row--toggles{gap:.25rem}.pptx-ng-inspector__label{font-size:10px;color:var(--pptx-inspector-muted, #888);min-width:32px;text-align:right;flex-shrink:0}.pptx-ng-inspector__input{background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;padding:2px 4px;font-size:12px}.pptx-ng-inspector__input--number{width:62px;text-align:right}.pptx-ng-inspector__color{width:32px;height:22px;border:1px solid var(--pptx-inspector-border, #444);border-radius:3px;padding:1px;cursor:pointer;background:transparent;flex-shrink:0}.pptx-ng-inspector__toggle{width:26px;height:22px;background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:12px}.pptx-ng-inspector.is-mobile{width:100%;min-width:0;box-sizing:border-box;font-size:14px}.pptx-ng-inspector.is-mobile .pptx-ng-inspector__row{flex-wrap:wrap;gap:.5rem}.pptx-ng-inspector.is-mobile .pptx-ng-inspector__label{min-width:28px}.pptx-ng-inspector.is-mobile .pptx-ng-inspector__input{flex:1 1 auto;min-height:40px;font-size:16px;padding:6px 8px}.pptx-ng-inspector.is-mobile .pptx-ng-inspector__input--number{width:auto;min-width:72px}.pptx-ng-inspector.is-mobile .pptx-ng-inspector__color{width:44px;height:40px}.pptx-ng-inspector.is-mobile .pptx-ng-inspector__toggle{min-width:44px;width:auto;flex:1 1 auto;height:40px;font-size:15px}.pptx-ng-inspector.is-mobile .pptx-ng-inspector__btn{min-height:40px;padding:8px 10px;font-size:13px}@media(pointer:coarse),(max-width:767px){.pptx-ng-inspector{width:100%;min-width:0;box-sizing:border-box;font-size:14px}.pptx-ng-inspector__row{flex-wrap:wrap;gap:.5rem}.pptx-ng-inspector__label{min-width:28px}.pptx-ng-inspector__input{flex:1 1 auto;min-height:40px;font-size:16px;padding:6px 8px}.pptx-ng-inspector__input--number{width:auto;min-width:72px}.pptx-ng-inspector__color{width:44px;height:40px}.pptx-ng-inspector__toggle{min-width:44px;width:auto;flex:1 1 auto;height:40px;font-size:15px}.pptx-ng-inspector__btn{min-height:40px;padding:8px 10px;font-size:13px}}.pptx-ng-inspector__toggle.is-active{background:var(--pptx-inspector-active, #0078d4);border-color:var(--pptx-inspector-active, #0078d4);color:#fff}.pptx-ng-inspector__btn{flex:1;padding:3px 6px;background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;cursor:pointer;font-size:11px;white-space:nowrap}.pptx-ng-inspector__btn:hover{background:var(--pptx-inspector-hover, #3a3a3a)}.pptx-ng-inspector__btn--danger{color:var(--pptx-inspector-danger, #f47c7c);border-color:var(--pptx-inspector-danger-border, #6b2a2a)}.pptx-ng-inspector__btn--danger:hover{background:var(--pptx-inspector-danger-hover, #4a1a1a)}\n"], dependencies: [{ kind: "component", type: GradientPickerComponent, selector: "pptx-gradient-picker", inputs: ["element"], outputs: ["patch"] }, { kind: "component", type: EffectsPanelComponent, selector: "pptx-effects-panel", inputs: ["element"], outputs: ["patch"] }, { kind: "component", type: TextAdvancedPanelComponent, selector: "pptx-text-advanced-panel", inputs: ["element"], outputs: ["patch"] }, { kind: "component", type: TableDataEditorComponent, selector: "pptx-table-data-editor", inputs: ["element", "canEdit"], outputs: ["elementChange"] }, { kind: "component", type: TablePropertiesComponent, selector: "pptx-table-properties", inputs: ["element", "canEdit"], outputs: ["elementChange"] }, { kind: "component", type: TableCellFormattingComponent, selector: "pptx-table-cell-formatting", inputs: ["element", "canEdit"], outputs: ["elementChange"] }, { kind: "component", type: ChartDataEditorComponent, selector: "pptx-chart-data-editor", inputs: ["element", "canEdit"], outputs: ["elementChange"] }, { kind: "component", type: SmartArtPropertiesComponent, selector: "pptx-smart-art-properties", inputs: ["smartArtData", "canEdit"], outputs: ["smartArtDataChange"] }, { kind: "component", type: AnimationAuthorPanelComponent, selector: "pptx-animation-author-panel", inputs: ["element", "slideIndex", "animations", "canEdit"], outputs: ["animationsChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
52146
+ `, isInline: true, styles: [".pptx-ng-inspector{display:flex;flex-direction:column;gap:0;padding:.5rem;background:var(--pptx-inspector-bg, #1e1e1e);color:var(--pptx-inspector-fg, #e0e0e0);font-size:12px;min-width:220px;overflow-y:auto}.pptx-ng-inspector__section{padding:.5rem 0;border-bottom:1px solid var(--pptx-inspector-border, #333)}.pptx-ng-inspector__section:last-child{border-bottom:none}.pptx-ng-inspector__heading{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--pptx-inspector-muted, #888);margin:0 0 .35rem}.pptx-ng-inspector__details{border-bottom:1px solid var(--pptx-inspector-border, #333)}.pptx-ng-inspector__summary{padding:.5rem 0;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--pptx-inspector-muted, #888);cursor:pointer;-webkit-user-select:none;user-select:none}.pptx-ng-inspector__row{display:flex;align-items:center;gap:.35rem;margin-bottom:.35rem}.pptx-ng-inspector__row:last-child{margin-bottom:0}.pptx-ng-inspector__row--toggles{gap:.25rem}.pptx-ng-inspector__label{font-size:10px;color:var(--pptx-inspector-muted, #888);min-width:32px;text-align:right;flex-shrink:0}.pptx-ng-inspector__input{background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;padding:2px 4px;font-size:12px}.pptx-ng-inspector__input--number{width:62px;text-align:right}.pptx-ng-inspector__color{width:32px;height:22px;border:1px solid var(--pptx-inspector-border, #444);border-radius:3px;padding:1px;cursor:pointer;background:transparent;flex-shrink:0}.pptx-ng-inspector__toggle{width:26px;height:22px;background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:12px}.pptx-ng-inspector.is-mobile{width:100%;min-width:0;box-sizing:border-box;font-size:14px}.pptx-ng-inspector.is-mobile .pptx-ng-inspector__row{flex-wrap:wrap;gap:.5rem}.pptx-ng-inspector.is-mobile .pptx-ng-inspector__label{min-width:28px}.pptx-ng-inspector.is-mobile .pptx-ng-inspector__input{flex:1 1 auto;min-height:40px;font-size:16px;padding:6px 8px}.pptx-ng-inspector.is-mobile .pptx-ng-inspector__input--number{width:auto;min-width:72px}.pptx-ng-inspector.is-mobile .pptx-ng-inspector__color{width:44px;height:40px}.pptx-ng-inspector.is-mobile .pptx-ng-inspector__toggle{min-width:44px;width:auto;flex:1 1 auto;height:40px;font-size:15px}.pptx-ng-inspector.is-mobile .pptx-ng-inspector__btn{min-height:40px;padding:8px 10px;font-size:13px}@media(pointer:coarse),(max-width:767px){.pptx-ng-inspector{width:100%;min-width:0;box-sizing:border-box;font-size:14px}.pptx-ng-inspector__row{flex-wrap:wrap;gap:.5rem}.pptx-ng-inspector__label{min-width:28px}.pptx-ng-inspector__input{flex:1 1 auto;min-height:40px;font-size:16px;padding:6px 8px}.pptx-ng-inspector__input--number{width:auto;min-width:72px}.pptx-ng-inspector__color{width:44px;height:40px}.pptx-ng-inspector__toggle{min-width:44px;width:auto;flex:1 1 auto;height:40px;font-size:15px}.pptx-ng-inspector__btn{min-height:40px;padding:8px 10px;font-size:13px}}.pptx-ng-inspector__toggle.is-active{background:var(--pptx-inspector-active, #0078d4);border-color:var(--pptx-inspector-active, #0078d4);color:#fff}.pptx-ng-inspector__btn{flex:1;padding:3px 6px;background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;cursor:pointer;font-size:11px;white-space:nowrap}.pptx-ng-inspector__btn:hover{background:var(--pptx-inspector-hover, #3a3a3a)}.pptx-ng-inspector__btn--danger{color:var(--pptx-inspector-danger, #f47c7c);border-color:var(--pptx-inspector-danger-border, #6b2a2a)}.pptx-ng-inspector__btn--danger:hover{background:var(--pptx-inspector-danger-hover, #4a1a1a)}\n"], dependencies: [{ kind: "component", type: GradientPickerComponent, selector: "pptx-gradient-picker", inputs: ["element"], outputs: ["patch"] }, { kind: "component", type: EffectsPanelComponent, selector: "pptx-effects-panel", inputs: ["element"], outputs: ["patch"] }, { kind: "component", type: TextAdvancedPanelComponent, selector: "pptx-text-advanced-panel", inputs: ["element"], outputs: ["patch"] }, { kind: "component", type: TableDataEditorComponent, selector: "pptx-table-data-editor", inputs: ["element", "canEdit"], outputs: ["elementChange"] }, { kind: "component", type: TablePropertiesComponent, selector: "pptx-table-properties", inputs: ["element", "canEdit"], outputs: ["elementChange"] }, { kind: "component", type: TableCellFormattingComponent, selector: "pptx-table-cell-formatting", inputs: ["element", "canEdit"], outputs: ["elementChange"] }, { kind: "component", type: ChartDataEditorComponent, selector: "pptx-chart-data-editor", inputs: ["element", "canEdit"], outputs: ["elementChange"] }, { kind: "component", type: SmartArtPropertiesComponent, selector: "pptx-smart-art-properties", inputs: ["smartArtData", "canEdit"], outputs: ["smartArtDataChange"] }, { kind: "component", type: AnimationAuthorPanelComponent, selector: "pptx-animation-author-panel", inputs: ["element", "slideIndex", "animations", "canEdit"], outputs: ["animationsChange"] }, { kind: "component", type: LucideArrowUp, selector: "svg[lucideArrowUp]" }, { kind: "component", type: LucideArrowDown, selector: "svg[lucideArrowDown]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
52020
52147
  }
52021
52148
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: InspectorPanelComponent, decorators: [{
52022
52149
  type: Component,
@@ -52031,6 +52158,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
52031
52158
  SmartArtPropertiesComponent,
52032
52159
  AnimationAuthorPanelComponent,
52033
52160
  TranslatePipe,
52161
+ LucideArrowUp,
52162
+ LucideArrowDown,
52034
52163
  ], providers: [IsMobileService], template: `
52035
52164
  <!--
52036
52165
  NOTE (mobile-safe inputs): every numeric / colour input is keyed on the
@@ -52272,7 +52401,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
52272
52401
  [title]="'pptx.contextMenu.bringForward' | translate"
52273
52402
  (click)="editor.bringSelectedForward(slideIndex())"
52274
52403
  >
52275
-
52404
+ <svg lucideArrowUp class="h-3.5 w-3.5"></svg>
52276
52405
  </button>
52277
52406
  <button
52278
52407
  type="button"
@@ -52280,7 +52409,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
52280
52409
  [title]="'pptx.contextMenu.sendBackward' | translate"
52281
52410
  (click)="editor.sendSelectedBackward(slideIndex())"
52282
52411
  >
52283
-
52412
+ <svg lucideArrowDown class="h-3.5 w-3.5"></svg>
52284
52413
  </button>
52285
52414
  </div>
52286
52415
  </section>
@@ -54992,9 +55121,40 @@ class MediaRendererComponent {
54992
55121
  ...(ngDevMode ? [{ debugName: "zIndex" }] : /* istanbul ignore next */ []));
54993
55122
  interactive = input(true, /* @ts-ignore */
54994
55123
  ...(ngDevMode ? [{ debugName: "interactive" }] : /* istanbul ignore next */ []));
55124
+ /**
55125
+ * True only on the live presentation stage. When set, the media element
55126
+ * starts playing on its own once mounted (as PowerPoint does when a slide
55127
+ * with media becomes active) instead of waiting for a manual click; the
55128
+ * thumbnail / sorter / editor canvases leave it false so their media is quiet.
55129
+ */
55130
+ presenting = input(false, /* @ts-ignore */
55131
+ ...(ngDevMode ? [{ debugName: "presenting" }] : /* istanbul ignore next */ []));
54995
55132
  /** Fallback text shown when neither a source nor a poster is available. */
54996
55133
  placeholderLabel = input('Media', /* @ts-ignore */
54997
55134
  ...(ngDevMode ? [{ debugName: "placeholderLabel" }] : /* istanbul ignore next */ []));
55135
+ /** The live `<video>`/`<audio>` node (only one is mounted at a time). */
55136
+ mediaElRef = viewChild('mediaEl', /* @ts-ignore */
55137
+ ...(ngDevMode ? [{ debugName: "mediaElRef" }] : /* istanbul ignore next */ []));
55138
+ constructor() {
55139
+ // Presentation autoplay: once the media node is in the DOM and this is the
55140
+ // live stage, start playback; pause again if it leaves present mode. Reads
55141
+ // mediaSrc so a source swap re-evaluates. The shared helper owns the
55142
+ // `.play()` + blocked-autoplay handling so all three bindings match.
55143
+ effect(() => {
55144
+ const el = this.mediaElRef()?.nativeElement;
55145
+ const presenting = this.presenting();
55146
+ this.mediaSrc();
55147
+ if (!el) {
55148
+ return;
55149
+ }
55150
+ if (presenting) {
55151
+ startMediaAutoplay(el, { trimStartMs: asMediaElement(this.element())?.trimStartMs });
55152
+ }
55153
+ else if (!el.paused) {
55154
+ el.pause();
55155
+ }
55156
+ });
55157
+ }
54998
55158
  containerStyle = computed(() => getContainerStyle(this.element(), this.zIndex()), /* @ts-ignore */
54999
55159
  ...(ngDevMode ? [{ debugName: "containerStyle" }] : /* istanbul ignore next */ []));
55000
55160
  /** Poster / preview frame data-URL (also used as the `<video poster>`). */
@@ -55020,7 +55180,7 @@ class MediaRendererComponent {
55020
55180
  clrChangeParams = computed(() => getClrChangeParams(this.element()), /* @ts-ignore */
55021
55181
  ...(ngDevMode ? [{ debugName: "clrChangeParams" }] : /* istanbul ignore next */ []));
55022
55182
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MediaRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
55023
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: MediaRendererComponent, isStandalone: true, selector: "pptx-media-renderer", inputs: { element: { classPropertyName: "element", publicName: "element", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, placeholderLabel: { classPropertyName: "placeholderLabel", publicName: "placeholderLabel", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
55183
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: MediaRendererComponent, isStandalone: true, selector: "pptx-media-renderer", inputs: { element: { classPropertyName: "element", publicName: "element", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, presenting: { classPropertyName: "presenting", publicName: "presenting", isSignal: true, isRequired: false, transformFunction: null }, placeholderLabel: { classPropertyName: "placeholderLabel", publicName: "placeholderLabel", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "mediaElRef", first: true, predicate: ["mediaEl"], descendants: true, isSignal: true }], ngImport: i0, template: `
55024
55184
  <div
55025
55185
  class="pptx-ng-element pptx-ng-media"
55026
55186
  [ngStyle]="containerStyle()"
@@ -55030,6 +55190,7 @@ class MediaRendererComponent {
55030
55190
  @if (mediaSrc(); as src) {
55031
55191
  @if (mediaKind() === 'audio') {
55032
55192
  <audio
55193
+ #mediaEl
55033
55194
  class="pptx-ng-media-el pptx-ng-media-audio"
55034
55195
  [class.pptx-ng-media-inert]="interactive()"
55035
55196
  [src]="src + trimFragment()"
@@ -55039,6 +55200,7 @@ class MediaRendererComponent {
55039
55200
  ></audio>
55040
55201
  } @else {
55041
55202
  <video
55203
+ #mediaEl
55042
55204
  class="pptx-ng-media-el pptx-ng-media-video"
55043
55205
  [class.pptx-ng-media-inert]="interactive()"
55044
55206
  [src]="src + trimFragment()"
@@ -55088,6 +55250,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
55088
55250
  @if (mediaSrc(); as src) {
55089
55251
  @if (mediaKind() === 'audio') {
55090
55252
  <audio
55253
+ #mediaEl
55091
55254
  class="pptx-ng-media-el pptx-ng-media-audio"
55092
55255
  [class.pptx-ng-media-inert]="interactive()"
55093
55256
  [src]="src + trimFragment()"
@@ -55097,6 +55260,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
55097
55260
  ></audio>
55098
55261
  } @else {
55099
55262
  <video
55263
+ #mediaEl
55100
55264
  class="pptx-ng-media-el pptx-ng-media-video"
55101
55265
  [class.pptx-ng-media-inert]="interactive()"
55102
55266
  [src]="src + trimFragment()"
@@ -55133,7 +55297,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
55133
55297
  }
55134
55298
  </div>
55135
55299
  `, styles: [".pptx-ng-media-el{display:block;pointer-events:auto}.pptx-ng-media-video{width:100%;height:100%;object-fit:contain}.pptx-ng-media-audio{width:100%}.pptx-ng-media-inert{pointer-events:none}.pptx-ng-img{width:100%;height:100%;object-fit:contain;display:block}\n"] }]
55136
- }], propDecorators: { element: [{ type: i0.Input, args: [{ isSignal: true, alias: "element", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], zIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "zIndex", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], placeholderLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholderLabel", required: false }] }] } });
55300
+ }], ctorParameters: () => [], propDecorators: { element: [{ type: i0.Input, args: [{ isSignal: true, alias: "element", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], zIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "zIndex", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], presenting: [{ type: i0.Input, args: [{ isSignal: true, alias: "presenting", required: false }] }], placeholderLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholderLabel", required: false }] }], mediaElRef: [{ type: i0.ViewChild, args: ['mediaEl', { isSignal: true }] }] } });
55137
55301
 
55138
55302
  /**
55139
55303
  * Pure helpers for `Model3DRendererComponent`.
@@ -55576,6 +55740,18 @@ class OleRendererComponent {
55576
55740
  return rows.map((row) => `${row.label}: ${row.value}`).join(', ');
55577
55741
  }, /* @ts-ignore */
55578
55742
  ...(ngDevMode ? [{ debugName: "infoTitle" }] : /* istanbul ignore next */ []));
55743
+ /**
55744
+ * Open the recovered embedded payload in a new browser tab. Routes through
55745
+ * the shared {@link openUrlInNewTab} helper, which converts the `data:` URL to
55746
+ * a Blob object URL first: browsers silently refuse to navigate a new
55747
+ * top-level tab straight to a `data:` URL.
55748
+ */
55749
+ openEmbedded() {
55750
+ const href = this.actions().downloadHref;
55751
+ if (href) {
55752
+ openUrlInNewTab(href);
55753
+ }
55754
+ }
55579
55755
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: OleRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
55580
55756
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: OleRendererComponent, isStandalone: true, selector: "pptx-ole-renderer", inputs: { element: { classPropertyName: "element", publicName: "element", isSignal: true, isRequired: true, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
55581
55757
  <div
@@ -55853,18 +56029,16 @@ class OleRendererComponent {
55853
56029
  {{ 'pptx.ole.download' | translate }}
55854
56030
  </a>
55855
56031
  @if (actions().canOpen) {
55856
- <a
56032
+ <button
56033
+ type="button"
55857
56034
  class="pptx-ng-ole-action"
55858
- [href]="actions().downloadHref"
55859
- target="_blank"
55860
- rel="noopener noreferrer"
55861
56035
  [attr.aria-label]="
55862
56036
  'pptx.ole.openFileAria' | translate: { file: actions().downloadFileName }
55863
56037
  "
55864
- (click)="$event.stopPropagation()"
56038
+ (click)="$event.stopPropagation(); openEmbedded()"
55865
56039
  >
55866
56040
  {{ 'pptx.ole.open' | translate }}
55867
- </a>
56041
+ </button>
55868
56042
  }
55869
56043
  </div>
55870
56044
  }
@@ -56149,18 +56323,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
56149
56323
  {{ 'pptx.ole.download' | translate }}
56150
56324
  </a>
56151
56325
  @if (actions().canOpen) {
56152
- <a
56326
+ <button
56327
+ type="button"
56153
56328
  class="pptx-ng-ole-action"
56154
- [href]="actions().downloadHref"
56155
- target="_blank"
56156
- rel="noopener noreferrer"
56157
56329
  [attr.aria-label]="
56158
56330
  'pptx.ole.openFileAria' | translate: { file: actions().downloadFileName }
56159
56331
  "
56160
- (click)="$event.stopPropagation()"
56332
+ (click)="$event.stopPropagation(); openEmbedded()"
56161
56333
  >
56162
56334
  {{ 'pptx.ole.open' | translate }}
56163
- </a>
56335
+ </button>
56164
56336
  }
56165
56337
  </div>
56166
56338
  }
@@ -57888,6 +58060,13 @@ class ElementRendererComponent {
57888
58060
  */
57889
58061
  interactive = input(true, /* @ts-ignore */
57890
58062
  ...(ngDevMode ? [{ debugName: "interactive" }] : /* istanbul ignore next */ []));
58063
+ /**
58064
+ * True only on the live presentation stage; threaded to the media renderer so
58065
+ * a slide's media autoplays when the slide becomes active (and to group
58066
+ * children so nested media autoplays too). False everywhere else.
58067
+ */
58068
+ presenting = input(false, /* @ts-ignore */
58069
+ ...(ngDevMode ? [{ debugName: "presenting" }] : /* istanbul ignore next */ []));
57891
58070
  /** Whether inline editing (e.g. table-cell text input) is enabled. */
57892
58071
  editable = input(false, /* @ts-ignore */
57893
58072
  ...(ngDevMode ? [{ debugName: "editable" }] : /* istanbul ignore next */ []));
@@ -58075,7 +58254,7 @@ class ElementRendererComponent {
58075
58254
  }, /* @ts-ignore */
58076
58255
  ...(ngDevMode ? [{ debugName: "placeholderLabel" }] : /* istanbul ignore next */ []));
58077
58256
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: ElementRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
58078
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: ElementRendererComponent, isStandalone: true, selector: "pptx-element-renderer", inputs: { element: { classPropertyName: "element", publicName: "element", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, obstacles: { classPropertyName: "obstacles", publicName: "obstacles", isSignal: true, isRequired: false, transformFunction: null }, canvasWidth: { classPropertyName: "canvasWidth", publicName: "canvasWidth", isSignal: true, isRequired: false, transformFunction: null }, canvasHeight: { classPropertyName: "canvasHeight", publicName: "canvasHeight", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, fieldContext: { classPropertyName: "fieldContext", publicName: "fieldContext", isSignal: true, isRequired: false, transformFunction: null }, editTemplateMode: { classPropertyName: "editTemplateMode", publicName: "editTemplateMode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { cellCommit: "cellCommit", tableChange: "tableChange" }, host: { classAttribute: "contents" }, ngImport: i0, template: `
58257
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: ElementRendererComponent, isStandalone: true, selector: "pptx-element-renderer", inputs: { element: { classPropertyName: "element", publicName: "element", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, obstacles: { classPropertyName: "obstacles", publicName: "obstacles", isSignal: true, isRequired: false, transformFunction: null }, canvasWidth: { classPropertyName: "canvasWidth", publicName: "canvasWidth", isSignal: true, isRequired: false, transformFunction: null }, canvasHeight: { classPropertyName: "canvasHeight", publicName: "canvasHeight", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, presenting: { classPropertyName: "presenting", publicName: "presenting", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, fieldContext: { classPropertyName: "fieldContext", publicName: "fieldContext", isSignal: true, isRequired: false, transformFunction: null }, editTemplateMode: { classPropertyName: "editTemplateMode", publicName: "editTemplateMode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { cellCommit: "cellCommit", tableChange: "tableChange" }, host: { classAttribute: "contents" }, ngImport: i0, template: `
58079
58258
  @switch (true) {
58080
58259
  @case (element().type === 'connector') {
58081
58260
  <pptx-connector-renderer
@@ -58177,6 +58356,7 @@ class ElementRendererComponent {
58177
58356
  [mediaDataUrls]="mediaDataUrls()"
58178
58357
  [zIndex]="$index"
58179
58358
  [interactive]="interactive()"
58359
+ [presenting]="presenting()"
58180
58360
  [fieldContext]="fieldContext()"
58181
58361
  />
58182
58362
  }
@@ -58209,6 +58389,7 @@ class ElementRendererComponent {
58209
58389
  [mediaDataUrls]="mediaDataUrls()"
58210
58390
  [zIndex]="zIndex()"
58211
58391
  [interactive]="interactive()"
58392
+ [presenting]="presenting()"
58212
58393
  [placeholderLabel]="placeholderLabel()"
58213
58394
  />
58214
58395
  }
@@ -58341,7 +58522,7 @@ class ElementRendererComponent {
58341
58522
  </defs>
58342
58523
  </svg>
58343
58524
  }
58344
- `, isInline: true, dependencies: [{ kind: "component", type: ElementRendererComponent, selector: "pptx-element-renderer", inputs: ["element", "mediaDataUrls", "zIndex", "obstacles", "canvasWidth", "canvasHeight", "interactive", "editable", "fieldContext", "editTemplateMode"], outputs: ["cellCommit", "tableChange"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ConnectorRendererComponent, selector: "pptx-connector-renderer", inputs: ["element", "zIndex", "obstacles", "canvasWidth", "canvasHeight", "interactive"] }, { kind: "component", type: TableRendererComponent, selector: "pptx-table-renderer", inputs: ["element", "editable"], outputs: ["cellCommit", "tableChange"] }, { kind: "component", type: ChartRendererComponent, selector: "pptx-chart-renderer", inputs: ["element"] }, { kind: "component", type: SmartArtRendererComponent, selector: "pptx-smart-art-renderer", inputs: ["element", "zIndex", "editable"] }, { kind: "component", type: SmartArt3DRendererComponent, selector: "pptx-smart-art-3d-renderer", inputs: ["element", "zIndex", "canEdit"] }, { kind: "component", type: InkRendererComponent, selector: "pptx-ink-renderer", inputs: ["element", "zIndex", "mediaDataUrls"] }, { kind: "component", type: MediaRendererComponent, selector: "pptx-media-renderer", inputs: ["element", "mediaDataUrls", "zIndex", "interactive", "placeholderLabel"] }, { kind: "component", type: OleRendererComponent, selector: "pptx-ole-renderer", inputs: ["element", "zIndex"] }, { kind: "component", type: Model3DRendererComponent, selector: "pptx-model3d-renderer", inputs: ["element", "zIndex", "mediaDataUrls", "interactive"] }, { kind: "component", type: ZoomRendererComponent, selector: "pptx-zoom-renderer", inputs: ["element", "zIndex", "mediaDataUrls"] }, { kind: "component", type: EquationRendererComponent, selector: "pptx-equation-renderer", inputs: ["equationXml", "equationNumber"] }, { kind: "component", type: ColorChangedImageComponent, selector: "pptx-color-changed-image", inputs: ["src", "clrChange", "alt", "imgClass", "imgStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
58525
+ `, isInline: true, dependencies: [{ kind: "component", type: ElementRendererComponent, selector: "pptx-element-renderer", inputs: ["element", "mediaDataUrls", "zIndex", "obstacles", "canvasWidth", "canvasHeight", "interactive", "presenting", "editable", "fieldContext", "editTemplateMode"], outputs: ["cellCommit", "tableChange"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ConnectorRendererComponent, selector: "pptx-connector-renderer", inputs: ["element", "zIndex", "obstacles", "canvasWidth", "canvasHeight", "interactive"] }, { kind: "component", type: TableRendererComponent, selector: "pptx-table-renderer", inputs: ["element", "editable"], outputs: ["cellCommit", "tableChange"] }, { kind: "component", type: ChartRendererComponent, selector: "pptx-chart-renderer", inputs: ["element"] }, { kind: "component", type: SmartArtRendererComponent, selector: "pptx-smart-art-renderer", inputs: ["element", "zIndex", "editable"] }, { kind: "component", type: SmartArt3DRendererComponent, selector: "pptx-smart-art-3d-renderer", inputs: ["element", "zIndex", "canEdit"] }, { kind: "component", type: InkRendererComponent, selector: "pptx-ink-renderer", inputs: ["element", "zIndex", "mediaDataUrls"] }, { kind: "component", type: MediaRendererComponent, selector: "pptx-media-renderer", inputs: ["element", "mediaDataUrls", "zIndex", "interactive", "presenting", "placeholderLabel"] }, { kind: "component", type: OleRendererComponent, selector: "pptx-ole-renderer", inputs: ["element", "zIndex"] }, { kind: "component", type: Model3DRendererComponent, selector: "pptx-model3d-renderer", inputs: ["element", "zIndex", "mediaDataUrls", "interactive"] }, { kind: "component", type: ZoomRendererComponent, selector: "pptx-zoom-renderer", inputs: ["element", "zIndex", "mediaDataUrls"] }, { kind: "component", type: EquationRendererComponent, selector: "pptx-equation-renderer", inputs: ["equationXml", "equationNumber"] }, { kind: "component", type: ColorChangedImageComponent, selector: "pptx-color-changed-image", inputs: ["src", "clrChange", "alt", "imgClass", "imgStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
58345
58526
  }
58346
58527
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: ElementRendererComponent, decorators: [{
58347
58528
  type: Component,
@@ -58467,6 +58648,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
58467
58648
  [mediaDataUrls]="mediaDataUrls()"
58468
58649
  [zIndex]="$index"
58469
58650
  [interactive]="interactive()"
58651
+ [presenting]="presenting()"
58470
58652
  [fieldContext]="fieldContext()"
58471
58653
  />
58472
58654
  }
@@ -58499,6 +58681,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
58499
58681
  [mediaDataUrls]="mediaDataUrls()"
58500
58682
  [zIndex]="zIndex()"
58501
58683
  [interactive]="interactive()"
58684
+ [presenting]="presenting()"
58502
58685
  [placeholderLabel]="placeholderLabel()"
58503
58686
  />
58504
58687
  }
@@ -58633,7 +58816,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
58633
58816
  }
58634
58817
  `,
58635
58818
  }]
58636
- }], propDecorators: { element: [{ type: i0.Input, args: [{ isSignal: true, alias: "element", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], zIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "zIndex", required: false }] }], obstacles: [{ type: i0.Input, args: [{ isSignal: true, alias: "obstacles", required: false }] }], canvasWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasWidth", required: false }] }], canvasHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasHeight", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], editable: [{ type: i0.Input, args: [{ isSignal: true, alias: "editable", required: false }] }], fieldContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "fieldContext", required: false }] }], editTemplateMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "editTemplateMode", required: false }] }], cellCommit: [{ type: i0.Output, args: ["cellCommit"] }], tableChange: [{ type: i0.Output, args: ["tableChange"] }] } });
58819
+ }], propDecorators: { element: [{ type: i0.Input, args: [{ isSignal: true, alias: "element", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], zIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "zIndex", required: false }] }], obstacles: [{ type: i0.Input, args: [{ isSignal: true, alias: "obstacles", required: false }] }], canvasWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasWidth", required: false }] }], canvasHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasHeight", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], presenting: [{ type: i0.Input, args: [{ isSignal: true, alias: "presenting", required: false }] }], editable: [{ type: i0.Input, args: [{ isSignal: true, alias: "editable", required: false }] }], fieldContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "fieldContext", required: false }] }], editTemplateMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "editTemplateMode", required: false }] }], cellCommit: [{ type: i0.Output, args: ["cellCommit"] }], tableChange: [{ type: i0.Output, args: ["tableChange"] }] } });
58637
58820
 
58638
58821
  /**
58639
58822
  * ink-drawing.service.ts: Pen/highlighter/freeform/eraser drawing state +
@@ -59140,6 +59323,13 @@ class SlideCanvasComponent {
59140
59323
  */
59141
59324
  interactive = input(true, /* @ts-ignore */
59142
59325
  ...(ngDevMode ? [{ debugName: "interactive" }] : /* istanbul ignore next */ []));
59326
+ /**
59327
+ * True only for the live presentation stage: slide-content media autoplays.
59328
+ * Left false for thumbnails, the sorter and the editor canvas so their media
59329
+ * stays quiet (the template layer never autoplays regardless).
59330
+ */
59331
+ presenting = input(false, /* @ts-ignore */
59332
+ ...(ngDevMode ? [{ debugName: "presenting" }] : /* istanbul ignore next */ []));
59143
59333
  /** Ids of currently-selected elements (drawn with a selection outline). */
59144
59334
  selectedIds = input([], /* @ts-ignore */
59145
59335
  ...(ngDevMode ? [{ debugName: "selectedIds" }] : /* istanbul ignore next */ []));
@@ -59805,7 +59995,7 @@ class SlideCanvasComponent {
59805
59995
  }, /* @ts-ignore */
59806
59996
  ...(ngDevMode ? [{ debugName: "stageStyle" }] : /* istanbul ignore next */ []));
59807
59997
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SlideCanvasComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
59808
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: SlideCanvasComponent, isStandalone: true, selector: "pptx-slide-canvas", inputs: { slide: { classPropertyName: "slide", publicName: "slide", isSignal: true, isRequired: false, transformFunction: null }, canvasSize: { classPropertyName: "canvasSize", publicName: "canvasSize", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, zoom: { classPropertyName: "zoom", publicName: "zoom", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, showGrid: { classPropertyName: "showGrid", publicName: "showGrid", isSignal: true, isRequired: false, transformFunction: null }, showRulers: { classPropertyName: "showRulers", publicName: "showRulers", isSignal: true, isRequired: false, transformFunction: null }, showGuides: { classPropertyName: "showGuides", publicName: "showGuides", isSignal: true, isRequired: false, transformFunction: null }, snapToGrid: { classPropertyName: "snapToGrid", publicName: "snapToGrid", isSignal: true, isRequired: false, transformFunction: null }, snapToGuides: { classPropertyName: "snapToGuides", publicName: "snapToGuides", isSignal: true, isRequired: false, transformFunction: null }, autoFit: { classPropertyName: "autoFit", publicName: "autoFit", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, selectedIds: { classPropertyName: "selectedIds", publicName: "selectedIds", isSignal: true, isRequired: false, transformFunction: null }, editingId: { classPropertyName: "editingId", publicName: "editingId", isSignal: true, isRequired: false, transformFunction: null }, editTemplateMode: { classPropertyName: "editTemplateMode", publicName: "editTemplateMode", isSignal: true, isRequired: false, transformFunction: null }, templateElements: { classPropertyName: "templateElements", publicName: "templateElements", isSignal: true, isRequired: false, transformFunction: null }, drawTool: { classPropertyName: "drawTool", publicName: "drawTool", isSignal: true, isRequired: false, transformFunction: null }, drawColor: { classPropertyName: "drawColor", publicName: "drawColor", isSignal: true, isRequired: false, transformFunction: null }, drawWidth: { classPropertyName: "drawWidth", publicName: "drawWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { elementSelect: "elementSelect", backgroundClick: "backgroundClick", transformStart: "transformStart", transformUpdate: "transformUpdate", contextMenu: "contextMenu", textEditStart: "textEditStart", textCommit: "textCommit", textCancel: "textCancel", textFormat: "textFormat", rotateUpdate: "rotateUpdate", marqueeSelect: "marqueeSelect", inkStrokeComplete: "inkStrokeComplete", eraserHit: "eraserHit", cellCommit: "cellCommit", tableChange: "tableChange" }, host: { listeners: { "document:pointermove": "onPointerMove($event)", "document:pointerup": "onPointerUp()" } }, providers: [CanvasFitService, InkDrawingService, RulerGuidesService], viewQueries: [{ propertyName: "textEditor", first: true, predicate: ["textEditor"], descendants: true, isSignal: true }, { propertyName: "stageRef", first: true, predicate: ["stage"], descendants: true, isSignal: true }, { propertyName: "viewportRef", first: true, predicate: ["viewport"], descendants: true, isSignal: true }], ngImport: i0, template: `
59998
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: SlideCanvasComponent, isStandalone: true, selector: "pptx-slide-canvas", inputs: { slide: { classPropertyName: "slide", publicName: "slide", isSignal: true, isRequired: false, transformFunction: null }, canvasSize: { classPropertyName: "canvasSize", publicName: "canvasSize", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, zoom: { classPropertyName: "zoom", publicName: "zoom", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, showGrid: { classPropertyName: "showGrid", publicName: "showGrid", isSignal: true, isRequired: false, transformFunction: null }, showRulers: { classPropertyName: "showRulers", publicName: "showRulers", isSignal: true, isRequired: false, transformFunction: null }, showGuides: { classPropertyName: "showGuides", publicName: "showGuides", isSignal: true, isRequired: false, transformFunction: null }, snapToGrid: { classPropertyName: "snapToGrid", publicName: "snapToGrid", isSignal: true, isRequired: false, transformFunction: null }, snapToGuides: { classPropertyName: "snapToGuides", publicName: "snapToGuides", isSignal: true, isRequired: false, transformFunction: null }, autoFit: { classPropertyName: "autoFit", publicName: "autoFit", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, presenting: { classPropertyName: "presenting", publicName: "presenting", isSignal: true, isRequired: false, transformFunction: null }, selectedIds: { classPropertyName: "selectedIds", publicName: "selectedIds", isSignal: true, isRequired: false, transformFunction: null }, editingId: { classPropertyName: "editingId", publicName: "editingId", isSignal: true, isRequired: false, transformFunction: null }, editTemplateMode: { classPropertyName: "editTemplateMode", publicName: "editTemplateMode", isSignal: true, isRequired: false, transformFunction: null }, templateElements: { classPropertyName: "templateElements", publicName: "templateElements", isSignal: true, isRequired: false, transformFunction: null }, drawTool: { classPropertyName: "drawTool", publicName: "drawTool", isSignal: true, isRequired: false, transformFunction: null }, drawColor: { classPropertyName: "drawColor", publicName: "drawColor", isSignal: true, isRequired: false, transformFunction: null }, drawWidth: { classPropertyName: "drawWidth", publicName: "drawWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { elementSelect: "elementSelect", backgroundClick: "backgroundClick", transformStart: "transformStart", transformUpdate: "transformUpdate", contextMenu: "contextMenu", textEditStart: "textEditStart", textCommit: "textCommit", textCancel: "textCancel", textFormat: "textFormat", rotateUpdate: "rotateUpdate", marqueeSelect: "marqueeSelect", inkStrokeComplete: "inkStrokeComplete", eraserHit: "eraserHit", cellCommit: "cellCommit", tableChange: "tableChange" }, host: { listeners: { "document:pointermove": "onPointerMove($event)", "document:pointerup": "onPointerUp()" } }, providers: [CanvasFitService, InkDrawingService, RulerGuidesService], viewQueries: [{ propertyName: "textEditor", first: true, predicate: ["textEditor"], descendants: true, isSignal: true }, { propertyName: "stageRef", first: true, predicate: ["stage"], descendants: true, isSignal: true }, { propertyName: "viewportRef", first: true, predicate: ["viewport"], descendants: true, isSignal: true }], ngImport: i0, template: `
59809
59999
  <div
59810
60000
  #viewport
59811
60001
  class="pptx-ng-canvas-viewport"
@@ -59856,6 +60046,7 @@ class SlideCanvasComponent {
59856
60046
  [canvasWidth]="canvasSize().width"
59857
60047
  [canvasHeight]="canvasSize().height"
59858
60048
  [interactive]="interactive()"
60049
+ [presenting]="presenting()"
59859
60050
  [editable]="editable()"
59860
60051
  [fieldContext]="fieldContext()"
59861
60052
  [editTemplateMode]="false"
@@ -60175,7 +60366,7 @@ class SlideCanvasComponent {
60175
60366
  }
60176
60367
  </div>
60177
60368
  </div>
60178
- `, isInline: true, styles: [".pptx-ng-canvas-stage.is-editable{touch-action:none}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ElementRendererComponent, selector: "pptx-element-renderer", inputs: ["element", "mediaDataUrls", "zIndex", "obstacles", "canvasWidth", "canvasHeight", "interactive", "editable", "fieldContext", "editTemplateMode"], outputs: ["cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
60369
+ `, isInline: true, styles: [".pptx-ng-canvas-stage.is-editable{touch-action:none}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ElementRendererComponent, selector: "pptx-element-renderer", inputs: ["element", "mediaDataUrls", "zIndex", "obstacles", "canvasWidth", "canvasHeight", "interactive", "presenting", "editable", "fieldContext", "editTemplateMode"], outputs: ["cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
60179
60370
  }
60180
60371
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SlideCanvasComponent, decorators: [{
60181
60372
  type: Component,
@@ -60230,6 +60421,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
60230
60421
  [canvasWidth]="canvasSize().width"
60231
60422
  [canvasHeight]="canvasSize().height"
60232
60423
  [interactive]="interactive()"
60424
+ [presenting]="presenting()"
60233
60425
  [editable]="editable()"
60234
60426
  [fieldContext]="fieldContext()"
60235
60427
  [editTemplateMode]="false"
@@ -60550,7 +60742,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
60550
60742
  </div>
60551
60743
  </div>
60552
60744
  `, styles: [".pptx-ng-canvas-stage.is-editable{touch-action:none}\n"] }]
60553
- }], ctorParameters: () => [], propDecorators: { slide: [{ type: i0.Input, args: [{ isSignal: true, alias: "slide", required: false }] }], canvasSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasSize", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], zoom: [{ type: i0.Input, args: [{ isSignal: true, alias: "zoom", required: false }] }], editable: [{ type: i0.Input, args: [{ isSignal: true, alias: "editable", required: false }] }], showGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGrid", required: false }] }], showRulers: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRulers", required: false }] }], showGuides: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGuides", required: false }] }], snapToGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToGrid", required: false }] }], snapToGuides: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToGuides", required: false }] }], autoFit: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoFit", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], selectedIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedIds", required: false }] }], editingId: [{ type: i0.Input, args: [{ isSignal: true, alias: "editingId", required: false }] }], editTemplateMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "editTemplateMode", required: false }] }], templateElements: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateElements", required: false }] }], drawTool: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawTool", required: false }] }], drawColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawColor", required: false }] }], drawWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawWidth", required: false }] }], elementSelect: [{ type: i0.Output, args: ["elementSelect"] }], backgroundClick: [{ type: i0.Output, args: ["backgroundClick"] }], transformStart: [{ type: i0.Output, args: ["transformStart"] }], transformUpdate: [{ type: i0.Output, args: ["transformUpdate"] }], contextMenu: [{ type: i0.Output, args: ["contextMenu"] }], textEditStart: [{ type: i0.Output, args: ["textEditStart"] }], textCommit: [{ type: i0.Output, args: ["textCommit"] }], textCancel: [{ type: i0.Output, args: ["textCancel"] }], textFormat: [{ type: i0.Output, args: ["textFormat"] }], rotateUpdate: [{ type: i0.Output, args: ["rotateUpdate"] }], marqueeSelect: [{ type: i0.Output, args: ["marqueeSelect"] }], inkStrokeComplete: [{ type: i0.Output, args: ["inkStrokeComplete"] }], eraserHit: [{ type: i0.Output, args: ["eraserHit"] }], cellCommit: [{ type: i0.Output, args: ["cellCommit"] }], tableChange: [{ type: i0.Output, args: ["tableChange"] }], textEditor: [{ type: i0.ViewChild, args: ['textEditor', { isSignal: true }] }], stageRef: [{ type: i0.ViewChild, args: ['stage', { isSignal: true }] }], viewportRef: [{ type: i0.ViewChild, args: ['viewport', { isSignal: true }] }], onPointerMove: [{
60745
+ }], ctorParameters: () => [], propDecorators: { slide: [{ type: i0.Input, args: [{ isSignal: true, alias: "slide", required: false }] }], canvasSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasSize", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], zoom: [{ type: i0.Input, args: [{ isSignal: true, alias: "zoom", required: false }] }], editable: [{ type: i0.Input, args: [{ isSignal: true, alias: "editable", required: false }] }], showGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGrid", required: false }] }], showRulers: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRulers", required: false }] }], showGuides: [{ type: i0.Input, args: [{ isSignal: true, alias: "showGuides", required: false }] }], snapToGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToGrid", required: false }] }], snapToGuides: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToGuides", required: false }] }], autoFit: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoFit", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], presenting: [{ type: i0.Input, args: [{ isSignal: true, alias: "presenting", required: false }] }], selectedIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedIds", required: false }] }], editingId: [{ type: i0.Input, args: [{ isSignal: true, alias: "editingId", required: false }] }], editTemplateMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "editTemplateMode", required: false }] }], templateElements: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateElements", required: false }] }], drawTool: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawTool", required: false }] }], drawColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawColor", required: false }] }], drawWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "drawWidth", required: false }] }], elementSelect: [{ type: i0.Output, args: ["elementSelect"] }], backgroundClick: [{ type: i0.Output, args: ["backgroundClick"] }], transformStart: [{ type: i0.Output, args: ["transformStart"] }], transformUpdate: [{ type: i0.Output, args: ["transformUpdate"] }], contextMenu: [{ type: i0.Output, args: ["contextMenu"] }], textEditStart: [{ type: i0.Output, args: ["textEditStart"] }], textCommit: [{ type: i0.Output, args: ["textCommit"] }], textCancel: [{ type: i0.Output, args: ["textCancel"] }], textFormat: [{ type: i0.Output, args: ["textFormat"] }], rotateUpdate: [{ type: i0.Output, args: ["rotateUpdate"] }], marqueeSelect: [{ type: i0.Output, args: ["marqueeSelect"] }], inkStrokeComplete: [{ type: i0.Output, args: ["inkStrokeComplete"] }], eraserHit: [{ type: i0.Output, args: ["eraserHit"] }], cellCommit: [{ type: i0.Output, args: ["cellCommit"] }], tableChange: [{ type: i0.Output, args: ["tableChange"] }], textEditor: [{ type: i0.ViewChild, args: ['textEditor', { isSignal: true }] }], stageRef: [{ type: i0.ViewChild, args: ['stage', { isSignal: true }] }], viewportRef: [{ type: i0.ViewChild, args: ['viewport', { isSignal: true }] }], onPointerMove: [{
60554
60746
  type: HostListener,
60555
60747
  args: ['document:pointermove', ['$event']]
60556
60748
  }], onPointerUp: [{
@@ -60755,7 +60947,7 @@ class MobilePresenterViewComponent {
60755
60947
  } @else {
60756
60948
  <div class="pptx-ng-mpresenter-empty">{{ 'pptx.presenter.noSlides' | translate }}</div>
60757
60949
  }
60758
- `, isInline: true, styles: [":host{position:absolute;inset:0;z-index:50;display:flex;flex-direction:column;background:#0b0b0c;color:#f5f5f5;font-family:system-ui,sans-serif;padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px);padding-left:env(safe-area-inset-left,0px);padding-right:env(safe-area-inset-right,0px)}.pptx-ng-mpresenter-header,.pptx-ng-mpresenter-next,.pptx-ng-mpresenter-ctl{display:flex;align-items:center;gap:.75rem;padding:.5rem 1rem}.pptx-ng-mpresenter-header{justify-content:space-between;border-bottom:1px solid rgba(255,255,255,.08)}.pptx-ng-mpresenter-label{font-size:.625rem;text-transform:uppercase;letter-spacing:.06em;color:#ffffff8c}.pptx-ng-mpresenter-elapsed{font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:1.125rem;color:#6ea8fe}.pptx-ng-mpresenter-counter{font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:.875rem}.pptx-ng-mpresenter-exit{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;min-width:44px;min-height:44px;border:none;border-radius:6px;background:transparent;color:#ffffffbf;cursor:pointer;font-size:1.25rem;line-height:1}.pptx-ng-mpresenter-exit:hover{background:#ffffff1f;color:#fff}.pptx-ng-mpresenter-main{display:flex;align-items:center;justify-content:center;background:#000;padding:.75rem}.pptx-ng-mpresenter-main-stage{width:100%;max-width:640px}.pptx-ng-mpresenter-next{border-bottom:1px solid rgba(255,255,255,.08)}.pptx-ng-mpresenter-thumb{flex:0 0 auto;overflow:hidden;border:1px solid rgba(255,255,255,.15);border-radius:4px}.pptx-ng-mpresenter-next-empty{display:flex;flex:1 1 auto;align-items:center;justify-content:center;height:3rem;border:1px solid rgba(255,255,255,.15);border-radius:4px;background:#ffffff0a;font-size:.625rem;font-style:italic;color:#ffffff80}.pptx-ng-mpresenter-notes{flex:1 1 auto;display:flex;flex-direction:column;min-height:0;padding:.5rem 1rem}.pptx-ng-mpresenter-notes-body{flex:1 1 auto;overflow-y:auto;margin-top:.25rem;border:1px solid rgba(255,255,255,.15);border-radius:6px;background:#ffffff0a;padding:.5rem .75rem;white-space:pre-wrap;line-height:1.5;font-size:15px}.pptx-ng-mpresenter-notes-empty{font-style:italic;color:#ffffff80}.pptx-ng-mpresenter-ctl{justify-content:space-between;border-top:1px solid rgba(255,255,255,.08)}.pptx-ng-mpresenter-navbtn{flex:1 1 0;display:inline-flex;align-items:center;justify-content:center;gap:.375rem;height:44px;border:none;border-radius:6px;background:#ffffff14;color:#f5f5f5;cursor:pointer;font-size:.9rem}.pptx-ng-mpresenter-navbtn:hover:not(:disabled){background:#ffffff29}.pptx-ng-mpresenter-navbtn:disabled{opacity:.4;cursor:not-allowed}.pptx-ng-mpresenter-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#fff9}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
60950
+ `, isInline: true, styles: [":host{position:absolute;inset:0;z-index:50;display:flex;flex-direction:column;background:#0b0b0c;color:#f5f5f5;font-family:system-ui,sans-serif;padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px);padding-left:env(safe-area-inset-left,0px);padding-right:env(safe-area-inset-right,0px)}.pptx-ng-mpresenter-header,.pptx-ng-mpresenter-next,.pptx-ng-mpresenter-ctl{display:flex;align-items:center;gap:.75rem;padding:.5rem 1rem}.pptx-ng-mpresenter-header{justify-content:space-between;border-bottom:1px solid rgba(255,255,255,.08)}.pptx-ng-mpresenter-label{font-size:.625rem;text-transform:uppercase;letter-spacing:.06em;color:#ffffff8c}.pptx-ng-mpresenter-elapsed{font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:1.125rem;color:#6ea8fe}.pptx-ng-mpresenter-counter{font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:.875rem}.pptx-ng-mpresenter-exit{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;min-width:44px;min-height:44px;border:none;border-radius:6px;background:transparent;color:#ffffffbf;cursor:pointer;font-size:1.25rem;line-height:1}.pptx-ng-mpresenter-exit:hover{background:#ffffff1f;color:#fff}.pptx-ng-mpresenter-main{display:flex;align-items:center;justify-content:center;background:#000;padding:.75rem}.pptx-ng-mpresenter-main-stage{width:100%;max-width:640px}.pptx-ng-mpresenter-next{border-bottom:1px solid rgba(255,255,255,.08)}.pptx-ng-mpresenter-thumb{flex:0 0 auto;overflow:hidden;border:1px solid rgba(255,255,255,.15);border-radius:4px}.pptx-ng-mpresenter-next-empty{display:flex;flex:1 1 auto;align-items:center;justify-content:center;height:3rem;border:1px solid rgba(255,255,255,.15);border-radius:4px;background:#ffffff0a;font-size:.625rem;font-style:italic;color:#ffffff80}.pptx-ng-mpresenter-notes{flex:1 1 auto;display:flex;flex-direction:column;min-height:0;padding:.5rem 1rem}.pptx-ng-mpresenter-notes-body{flex:1 1 auto;overflow-y:auto;margin-top:.25rem;border:1px solid rgba(255,255,255,.15);border-radius:6px;background:#ffffff0a;padding:.5rem .75rem;white-space:pre-wrap;line-height:1.5;font-size:15px}.pptx-ng-mpresenter-notes-empty{font-style:italic;color:#ffffff80}.pptx-ng-mpresenter-ctl{justify-content:space-between;border-top:1px solid rgba(255,255,255,.08)}.pptx-ng-mpresenter-navbtn{flex:1 1 0;display:inline-flex;align-items:center;justify-content:center;gap:.375rem;height:44px;border:none;border-radius:6px;background:#ffffff14;color:#f5f5f5;cursor:pointer;font-size:.9rem}.pptx-ng-mpresenter-navbtn:hover:not(:disabled){background:#ffffff29}.pptx-ng-mpresenter-navbtn:disabled{opacity:.4;cursor:not-allowed}.pptx-ng-mpresenter-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#fff9}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
60759
60951
  }
60760
60952
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MobilePresenterViewComponent, decorators: [{
60761
60953
  type: Component,
@@ -61031,7 +61223,7 @@ class MobileSlidesSheetComponent {
61031
61223
  }
61032
61224
  </div>
61033
61225
  </pptx-mobile-sheet>
61034
- `, isInline: true, styles: [":host{display:contents}.pptx-ng-mslides-count{margin:0;padding:.5rem 1rem .25rem;font-size:.75rem;color:#ffffff73}.pptx-ng-mslides-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:.75rem;padding:.75rem .875rem 1.5rem}.pptx-ng-mslides-cell{display:flex;flex-direction:column;align-items:center;gap:.375rem;padding:.375rem;border:2px solid transparent;border-radius:.5rem;background:transparent;color:inherit;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;transition:border-color .12s,background .12s}.pptx-ng-mslides-cell:hover{background:#ffffff0d;border-color:#ffffff26}.pptx-ng-mslides-cell:active{background:#ffffff1a}.pptx-ng-mslides-cell.is-active{border-color:#3b82f6;background:#3b82f61a}.pptx-ng-mslides-clip{overflow:hidden;border-radius:.25rem;width:100%}.pptx-ng-mslides-clip ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}.pptx-ng-mslides-num{display:block;font-size:.625rem;color:#fff6;line-height:1.4;-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: MobileSheetComponent, selector: "pptx-mobile-sheet", inputs: ["open", "title", "heightFraction", "fullScreen"], outputs: ["closed"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
61226
+ `, isInline: true, styles: [":host{display:contents}.pptx-ng-mslides-count{margin:0;padding:.5rem 1rem .25rem;font-size:.75rem;color:#ffffff73}.pptx-ng-mslides-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:.75rem;padding:.75rem .875rem 1.5rem}.pptx-ng-mslides-cell{display:flex;flex-direction:column;align-items:center;gap:.375rem;padding:.375rem;border:2px solid transparent;border-radius:.5rem;background:transparent;color:inherit;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;transition:border-color .12s,background .12s}.pptx-ng-mslides-cell:hover{background:#ffffff0d;border-color:#ffffff26}.pptx-ng-mslides-cell:active{background:#ffffff1a}.pptx-ng-mslides-cell.is-active{border-color:#3b82f6;background:#3b82f61a}.pptx-ng-mslides-clip{overflow:hidden;border-radius:.25rem;width:100%}.pptx-ng-mslides-clip ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}.pptx-ng-mslides-num{display:block;font-size:.625rem;color:#fff6;line-height:1.4;-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: MobileSheetComponent, selector: "pptx-mobile-sheet", inputs: ["open", "title", "heightFraction", "fullScreen"], outputs: ["closed"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
61035
61227
  }
61036
61228
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: MobileSlidesSheetComponent, decorators: [{
61037
61229
  type: Component,
@@ -61930,7 +62122,13 @@ class NotesPanelComponent {
61930
62122
  (click)="toggle()"
61931
62123
  >
61932
62124
  <span class="pptx-ng-notes-label">{{ 'pptx.notes.speakerNotes' | translate }}</span>
61933
- <span class="pptx-ng-notes-chevron" aria-hidden="true">{{ collapsed() ? '▸' : '▾' }}</span>
62125
+ <span class="pptx-ng-notes-chevron" aria-hidden="true">
62126
+ @if (collapsed()) {
62127
+ <svg lucideChevronRight class="h-4 w-4"></svg>
62128
+ } @else {
62129
+ <svg lucideChevronDown class="h-4 w-4"></svg>
62130
+ }
62131
+ </span>
61934
62132
  </button>
61935
62133
 
61936
62134
  @if (!collapsed()) {
@@ -61954,7 +62152,7 @@ class NotesPanelComponent {
61954
62152
  #richEditor
61955
62153
  class="pptx-ng-notes-rich"
61956
62154
  [hidden]="!showRich()"
61957
- [attr.contenteditable]="slide() ? 'true' : 'false'"
62155
+ [attr.contenteditable]="showRich() ? 'true' : 'false'"
61958
62156
  role="textbox"
61959
62157
  aria-multiline="true"
61960
62158
  [attr.aria-label]="'pptx.notes.speakerNotes' | translate"
@@ -61981,11 +62179,11 @@ class NotesPanelComponent {
61981
62179
  </div>
61982
62180
  }
61983
62181
  </section>
61984
- `, isInline: true, styles: [":host{display:block}.pptx-ng-notes-panel{display:flex;flex-direction:column;border-top:1px solid var(--pptx-border, rgba(0, 0, 0, .1));background:var(--pptx-background, #ffffff);color:var(--pptx-foreground, #111827)}.pptx-ng-notes-header{display:flex;width:100%;align-items:center;justify-content:space-between;padding:.5rem .75rem;border:none;background:transparent;font-size:.8125rem;font-weight:600;color:var(--pptx-muted-foreground, #6b7280);cursor:pointer}.pptx-ng-notes-header:hover{color:var(--pptx-foreground, #111827)}.pptx-ng-notes-body{padding:0 .75rem .75rem}.pptx-ng-notes-rich,.pptx-ng-notes-textarea{box-sizing:border-box;width:100%;min-height:5rem;padding:.5rem;border:1px solid rgba(0,0,0,.15);border-radius:.375rem;background:#00000008;font:inherit;font-size:.8125rem;line-height:1.5;color:#111827}.pptx-ng-notes-rich{overflow:auto;resize:vertical}.pptx-ng-notes-textarea{resize:vertical}.pptx-ng-notes-rich:focus,.pptx-ng-notes-textarea:focus{outline:none;border-color:#6366f1;box-shadow:0 0 0 1px #6366f14d}.pptx-ng-notes-textarea:disabled{cursor:not-allowed;opacity:.6}\n"], dependencies: [{ kind: "component", type: NotesToolbarComponent, selector: "pptx-notes-toolbar", inputs: ["isRichEnabled", "showLinkPopover", "savedSelectionText"], outputs: ["inline", "paragraph", "linkButtonClick", "insertLink", "closeLinkPopover", "print", "toggleRich"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
62182
+ `, isInline: true, styles: [":host{display:block}.pptx-ng-notes-panel{display:flex;flex-direction:column;border-top:1px solid var(--pptx-border, rgba(0, 0, 0, .1));background:var(--pptx-background, #ffffff);color:var(--pptx-foreground, #111827)}.pptx-ng-notes-header{display:flex;width:100%;align-items:center;justify-content:space-between;padding:.5rem .75rem;border:none;background:transparent;font-size:.8125rem;font-weight:600;color:var(--pptx-muted-foreground, #6b7280);cursor:pointer}.pptx-ng-notes-header:hover{color:var(--pptx-foreground, #111827)}.pptx-ng-notes-body{padding:0 .75rem .75rem}.pptx-ng-notes-rich,.pptx-ng-notes-textarea{box-sizing:border-box;width:100%;min-height:5rem;padding:.5rem;border:1px solid rgba(0,0,0,.15);border-radius:.375rem;background:#00000008;font:inherit;font-size:.8125rem;line-height:1.5;color:#111827}.pptx-ng-notes-rich{overflow:auto;resize:vertical}.pptx-ng-notes-textarea{resize:vertical}.pptx-ng-notes-rich:focus,.pptx-ng-notes-textarea:focus{outline:none;border-color:#6366f1;box-shadow:0 0 0 1px #6366f14d}.pptx-ng-notes-textarea:disabled{cursor:not-allowed;opacity:.6}\n"], dependencies: [{ kind: "component", type: NotesToolbarComponent, selector: "pptx-notes-toolbar", inputs: ["isRichEnabled", "showLinkPopover", "savedSelectionText"], outputs: ["inline", "paragraph", "linkButtonClick", "insertLink", "closeLinkPopover", "print", "toggleRich"] }, { kind: "component", type: LucideChevronRight, selector: "svg[lucideChevronRight]" }, { kind: "component", type: LucideChevronDown, selector: "svg[lucideChevronDown]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
61985
62183
  }
61986
62184
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: NotesPanelComponent, decorators: [{
61987
62185
  type: Component,
61988
- args: [{ selector: 'pptx-notes-panel', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NotesToolbarComponent, TranslatePipe], template: `
62186
+ args: [{ selector: 'pptx-notes-panel', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NotesToolbarComponent, TranslatePipe, LucideChevronRight, LucideChevronDown], template: `
61989
62187
  <section class="pptx-ng-notes-panel" [attr.data-collapsed]="collapsed()">
61990
62188
  <button
61991
62189
  type="button"
@@ -61994,7 +62192,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
61994
62192
  (click)="toggle()"
61995
62193
  >
61996
62194
  <span class="pptx-ng-notes-label">{{ 'pptx.notes.speakerNotes' | translate }}</span>
61997
- <span class="pptx-ng-notes-chevron" aria-hidden="true">{{ collapsed() ? '▸' : '▾' }}</span>
62195
+ <span class="pptx-ng-notes-chevron" aria-hidden="true">
62196
+ @if (collapsed()) {
62197
+ <svg lucideChevronRight class="h-4 w-4"></svg>
62198
+ } @else {
62199
+ <svg lucideChevronDown class="h-4 w-4"></svg>
62200
+ }
62201
+ </span>
61998
62202
  </button>
61999
62203
 
62000
62204
  @if (!collapsed()) {
@@ -62018,7 +62222,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
62018
62222
  #richEditor
62019
62223
  class="pptx-ng-notes-rich"
62020
62224
  [hidden]="!showRich()"
62021
- [attr.contenteditable]="slide() ? 'true' : 'false'"
62225
+ [attr.contenteditable]="showRich() ? 'true' : 'false'"
62022
62226
  role="textbox"
62023
62227
  aria-multiline="true"
62024
62228
  [attr.aria-label]="'pptx.notes.speakerNotes' | translate"
@@ -63002,6 +63206,78 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
63002
63206
  `, styles: [":host{display:block;position:absolute;inset:0;pointer-events:none}.pptx-ng-anno-wrapper{position:absolute;inset:0}.pptx-ng-anno-svg{position:absolute;top:0;left:0;transform-origin:top left;overflow:visible}.pptx-ng-laser-dot{position:absolute;border-radius:50%;pointer-events:none;background:#ff0000d9;box-shadow:0 0 12px 6px #ff000080,0 0 24px 12px #ff000040;filter:drop-shadow(0 0 8px rgba(255,0,0,.7))}\n"] }]
63003
63207
  }], propDecorators: { canvasSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasSize", required: true }] }], zoom: [{ type: i0.Input, args: [{ isSignal: true, alias: "zoom", required: false }] }], svgRef: [{ type: i0.ViewChild, args: ['svg', { isSignal: true }] }] } });
63004
63208
 
63209
+ /**
63210
+ * presentation-fullscreen.ts
63211
+ *
63212
+ * DOM-only helpers that drive the real browser Fullscreen API for the
63213
+ * presentation overlay. Kept Angular-free so they can be unit-tested without
63214
+ * TestBed (mirrors `presentation-overlay-helpers.ts`).
63215
+ *
63216
+ * Mirrors the React (`usePresentationMode.ts`) and Vue (`PresentationMode.vue`)
63217
+ * implementations: request fullscreen on the overlay's own root element when it
63218
+ * mounts, exit fullscreen when it unmounts, and feature-detect throughout so
63219
+ * browsers/environments without full Fullscreen API support (iOS Safari's
63220
+ * partial support, jsdom in tests, etc.) degrade silently to the CSS-fixed
63221
+ * overlay rather than throwing.
63222
+ */
63223
+ /**
63224
+ * Request fullscreen on `element` if the Fullscreen API is available.
63225
+ * No-ops (rather than throwing) when the element is missing, the API is
63226
+ * unsupported, or the browser rejects the request (no active user gesture,
63227
+ * permission denied, etc.).
63228
+ */
63229
+ function requestPresentationFullscreen(element) {
63230
+ if (!element) {
63231
+ return;
63232
+ }
63233
+ const el = element;
63234
+ if (typeof el.requestFullscreen !== 'function') {
63235
+ return;
63236
+ }
63237
+ try {
63238
+ void el.requestFullscreen().catch(() => {
63239
+ /* ignore: denied, unsupported, or no active user gesture */
63240
+ });
63241
+ }
63242
+ catch {
63243
+ /* ignore: some environments throw synchronously instead of rejecting */
63244
+ }
63245
+ }
63246
+ /**
63247
+ * Exit fullscreen if the given document is currently in it and the Fullscreen
63248
+ * API is available. No-ops otherwise.
63249
+ */
63250
+ function exitPresentationFullscreen(doc) {
63251
+ if (!doc) {
63252
+ return;
63253
+ }
63254
+ const d = doc;
63255
+ if (!d.fullscreenElement || typeof d.exitFullscreen !== 'function') {
63256
+ return;
63257
+ }
63258
+ try {
63259
+ void d.exitFullscreen().catch(() => {
63260
+ /* ignore */
63261
+ });
63262
+ }
63263
+ catch {
63264
+ /* ignore */
63265
+ }
63266
+ }
63267
+ /**
63268
+ * Whether `doc` is currently NOT in fullscreen (i.e. fullscreen was just
63269
+ * exited, or was never entered, e.g. because the API is unsupported).
63270
+ *
63271
+ * Fed a `fullscreenchange` event on `document`; combined with the overlay's
63272
+ * own "did I just cause this?" guard, distinguishes an external exit (Esc
63273
+ * consumed by the browser before reaching the overlay's own keydown handler,
63274
+ * the Android back gesture, swiping away on iOS) from our own close flow.
63275
+ */
63276
+ function hasExitedFullscreen(doc) {
63277
+ const d = doc;
63278
+ return !d?.fullscreenElement;
63279
+ }
63280
+
63005
63281
  /**
63006
63282
  * Clamp `index` to the valid range [0, count - 1].
63007
63283
  * Returns 0 when `count` is 0 to avoid -1 states.
@@ -63519,7 +63795,7 @@ class PresentationTransitionOverlayComponent {
63519
63795
  />
63520
63796
  </div>
63521
63797
  </div>
63522
- `, isInline: true, styles: [":host{display:block;position:absolute;inset:0;overflow:hidden;pointer-events:none}.pptx-ng-transition-layer{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
63798
+ `, isInline: true, styles: [":host{display:block;position:absolute;inset:0;overflow:hidden;pointer-events:none}.pptx-ng-transition-layer{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
63523
63799
  }
63524
63800
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PresentationTransitionOverlayComponent, decorators: [{
63525
63801
  type: Component,
@@ -63628,6 +63904,17 @@ function attachTouchGestures(element, config) {
63628
63904
  * Horizontal swipe → left → next, right → previous
63629
63905
  *
63630
63906
  * Click on the overlay body → advance to next visible slide.
63907
+ *
63908
+ * Fullscreen (mirrors the React `usePresentationMode` / Vue `PresentationMode.vue`
63909
+ * behavior, on top of the CSS-fixed full-viewport overlay above): the real
63910
+ * Fullscreen API is requested on this component's root element once it mounts,
63911
+ * and released again on destroy, so the browser chrome (address bar, etc.) gets
63912
+ * out of the way on mobile the same way it does for React/Vue. A
63913
+ * `fullscreenchange` listener syncs back to `closed` when fullscreen is exited
63914
+ * from outside this component's own close/Escape handling (browser UI, the
63915
+ * Android back gesture, etc.). Environments without Fullscreen API support
63916
+ * (iOS Safari's partial support, `jsdom` in tests) degrade silently to the
63917
+ * plain CSS overlay.
63631
63918
  */
63632
63919
  class PresentationOverlayComponent {
63633
63920
  // ------------------------------------------------------------------
@@ -63679,11 +63966,23 @@ class PresentationOverlayComponent {
63679
63966
  /** The slide stage root; animation styles are applied to its elements. */
63680
63967
  stageRef = viewChild('stage', /* @ts-ignore */
63681
63968
  ...(ngDevMode ? [{ debugName: "stageRef" }] : /* istanbul ignore next */ []));
63682
- /** The overlay root; the shared touch-gesture recogniser attaches here. */
63969
+ /**
63970
+ * The overlay root; the shared touch-gesture recogniser attaches here, and
63971
+ * it is the element the real Fullscreen API is requested on (see
63972
+ * {@link setupFullscreen}).
63973
+ */
63683
63974
  rootRef = viewChild('root', /* @ts-ignore */
63684
63975
  ...(ngDevMode ? [{ debugName: "rootRef" }] : /* istanbul ignore next */ []));
63976
+ /**
63977
+ * Guards against handling the same exit twice: e.g. Escape both reaches our
63978
+ * own `keydown` handler AND causes the browser to natively exit fullscreen
63979
+ * (firing `fullscreenchange`), or the close button's `click` and `touchend`
63980
+ * both fire for one tap.
63981
+ */
63982
+ closing = false;
63685
63983
  constructor() {
63686
63984
  this.setupTouchGestures();
63985
+ this.setupFullscreen();
63687
63986
  // Wire the zoom-navigation context to this overlay's slide navigation so a
63688
63987
  // descendant zoom tile can jump to its target slide on click.
63689
63988
  this.zoomNavigation.setHandler((index) => this.goToSlide(index));
@@ -63881,6 +64180,39 @@ class PresentationOverlayComponent {
63881
64180
  });
63882
64181
  }
63883
64182
  // ------------------------------------------------------------------
64183
+ // Real Fullscreen API (layered on top of the CSS-fixed overlay)
64184
+ // ------------------------------------------------------------------
64185
+ /**
64186
+ * Request real fullscreen on the overlay root once it mounts, and release
64187
+ * it again when the overlay is destroyed (`presenting` flips back to
64188
+ * false, closing this `@if` block). Mirrors Vue's `onMounted` /
64189
+ * `onBeforeUnmount` pair on its own overlay root; feature-detected so
64190
+ * unsupported environments just keep the CSS overlay.
64191
+ */
64192
+ setupFullscreen() {
64193
+ const destroyRef = inject(DestroyRef);
64194
+ afterNextRender(() => {
64195
+ requestPresentationFullscreen(this.rootRef()?.nativeElement);
64196
+ });
64197
+ destroyRef.onDestroy(() => {
64198
+ exitPresentationFullscreen(typeof document === 'undefined' ? null : document);
64199
+ });
64200
+ }
64201
+ /**
64202
+ * Sync back to `closed` when fullscreen is exited from OUTSIDE this
64203
+ * component's own close/Escape handling: the browser's native Esc handling
64204
+ * can beat (or replace) our `keydown` listener, and mobile back
64205
+ * gestures/browser-UI exits never reach it at all. Without this, `presenting`
64206
+ * would stay stuck true while the app has silently fallen back to the plain
64207
+ * CSS overlay. `emitClosed()` is itself guarded against double-firing, so it
64208
+ * is safe if our own close flow *also* triggers this event.
64209
+ */
64210
+ onFullscreenChange() {
64211
+ if (hasExitedFullscreen(typeof document === 'undefined' ? null : document)) {
64212
+ this.emitClosed();
64213
+ }
64214
+ }
64215
+ // ------------------------------------------------------------------
63884
64216
  // Lifecycle
63885
64217
  // ------------------------------------------------------------------
63886
64218
  ngOnInit() {
@@ -64060,13 +64392,17 @@ class PresentationOverlayComponent {
64060
64392
  this.indexChange.emit(next);
64061
64393
  }
64062
64394
  emitClosed() {
64395
+ if (this.closing) {
64396
+ return;
64397
+ }
64398
+ this.closing = true;
64063
64399
  if (this.annotations.hasAnyAnnotations()) {
64064
64400
  this.annotationsExit.emit(this.annotations.getAllSlideAnnotations());
64065
64401
  }
64066
64402
  this.closed.emit();
64067
64403
  }
64068
64404
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PresentationOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
64069
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: PresentationOverlayComponent, isStandalone: true, selector: "pptx-presentation-overlay", inputs: { slides: { classPropertyName: "slides", publicName: "slides", isSignal: true, isRequired: true, transformFunction: null }, canvasSize: { classPropertyName: "canvasSize", publicName: "canvasSize", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, startIndex: { classPropertyName: "startIndex", publicName: "startIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { indexChange: "indexChange", closed: "closed", annotationsExit: "annotationsExit" }, host: { listeners: { "window:resize": "onWindowResize()", "document:keydown": "onKeyDown($event)" } }, providers: [AnimationPlaybackService, PresentationAnnotationsService, ZoomNavigationService], viewQueries: [{ propertyName: "stageRef", first: true, predicate: ["stage"], descendants: true, isSignal: true }, { propertyName: "rootRef", first: true, predicate: ["root"], descendants: true, isSignal: true }], ngImport: i0, template: `
64405
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: PresentationOverlayComponent, isStandalone: true, selector: "pptx-presentation-overlay", inputs: { slides: { classPropertyName: "slides", publicName: "slides", isSignal: true, isRequired: true, transformFunction: null }, canvasSize: { classPropertyName: "canvasSize", publicName: "canvasSize", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, startIndex: { classPropertyName: "startIndex", publicName: "startIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { indexChange: "indexChange", closed: "closed", annotationsExit: "annotationsExit" }, host: { listeners: { "document:fullscreenchange": "onFullscreenChange()", "window:resize": "onWindowResize()", "document:keydown": "onKeyDown($event)" } }, providers: [AnimationPlaybackService, PresentationAnnotationsService, ZoomNavigationService], viewQueries: [{ propertyName: "stageRef", first: true, predicate: ["stage"], descendants: true, isSignal: true }, { propertyName: "rootRef", first: true, predicate: ["root"], descendants: true, isSignal: true }], ngImport: i0, template: `
64070
64406
  <div #root class="pptx-ng-presentation-root">
64071
64407
  <!--
64072
64408
  Slide counter, rendered first in DOM (before slide content) so a
@@ -64092,6 +64428,7 @@ class PresentationOverlayComponent {
64092
64428
  [zoom]="zoom()"
64093
64429
  [autoFit]="false"
64094
64430
  [interactive]="false"
64431
+ [presenting]="true"
64095
64432
  />
64096
64433
 
64097
64434
  @if (activeTransition(); as t) {
@@ -64123,7 +64460,7 @@ class PresentationOverlayComponent {
64123
64460
  (click)="selectTool('pen')"
64124
64461
  [attr.aria-label]="'pptx.presentation.pen' | translate"
64125
64462
  >
64126
-
64463
+ <svg lucidePenTool class="h-4 w-4"></svg>
64127
64464
  </button>
64128
64465
  <button
64129
64466
  type="button"
@@ -64131,7 +64468,7 @@ class PresentationOverlayComponent {
64131
64468
  (click)="selectTool('highlighter')"
64132
64469
  [attr.aria-label]="'pptx.presentation.highlighter' | translate"
64133
64470
  >
64134
-
64471
+ <svg lucideHighlighter class="h-4 w-4"></svg>
64135
64472
  </button>
64136
64473
  <button
64137
64474
  type="button"
@@ -64139,7 +64476,7 @@ class PresentationOverlayComponent {
64139
64476
  (click)="selectTool('eraser')"
64140
64477
  [attr.aria-label]="'pptx.presentation.eraser' | translate"
64141
64478
  >
64142
-
64479
+ <svg lucideEraser class="h-4 w-4"></svg>
64143
64480
  </button>
64144
64481
  <button
64145
64482
  type="button"
@@ -64147,14 +64484,14 @@ class PresentationOverlayComponent {
64147
64484
  (click)="selectTool('laser')"
64148
64485
  [attr.aria-label]="'pptx.presentation.laserPointer' | translate"
64149
64486
  >
64150
-
64487
+ <svg lucideMousePointer2 class="h-4 w-4"></svg>
64151
64488
  </button>
64152
64489
  <button
64153
64490
  type="button"
64154
64491
  (click)="annotations.clearAnnotations()"
64155
64492
  [attr.aria-label]="'pptx.presentation.clearAnnotations' | translate"
64156
64493
  >
64157
- 🗑
64494
+ <svg lucideTrash2 class="h-4 w-4"></svg>
64158
64495
  </button>
64159
64496
  <button
64160
64497
  type="button"
@@ -64175,7 +64512,7 @@ class PresentationOverlayComponent {
64175
64512
  (touchend)="onCloseTouch($event)"
64176
64513
  [attr.aria-label]="'pptx.presenter.endPresentation' | translate"
64177
64514
  >
64178
- &#x2715;
64515
+ <svg lucideX class="h-5 w-5"></svg>
64179
64516
  </button>
64180
64517
 
64181
64518
  <!-- Edge navigation buttons (vertically centred, touch-friendly). -->
@@ -64187,7 +64524,7 @@ class PresentationOverlayComponent {
64187
64524
  (touchend)="onPrevTouch($event)"
64188
64525
  [attr.aria-label]="'pptx.presenter.previousSlide' | translate"
64189
64526
  >
64190
- &#x2039;
64527
+ <svg lucideChevronLeft class="h-6 w-6"></svg>
64191
64528
  </button>
64192
64529
  <button
64193
64530
  type="button"
@@ -64197,10 +64534,10 @@ class PresentationOverlayComponent {
64197
64534
  (touchend)="onNextTouch($event)"
64198
64535
  [attr.aria-label]="'pptx.presenter.nextSlide' | translate"
64199
64536
  >
64200
- &#x203A;
64537
+ <svg lucideChevronRight class="h-6 w-6"></svg>
64201
64538
  </button>
64202
64539
  </div>
64203
- `, isInline: true, styles: [":host{display:block;position:fixed;inset:0;z-index:10000;background:#000;cursor:pointer;-webkit-user-select:none;user-select:none}.pptx-ng-presentation-root{position:absolute;inset:0;touch-action:pan-y}.pptx-ng-presentation-close:hover,.pptx-ng-presentation-nav:hover{background:#000000bf}.pptx-ng-presentation-tools{position:absolute;bottom:max(1rem,env(safe-area-inset-bottom));left:1rem;display:flex;gap:.25rem;padding:.25rem;border-radius:.5rem;background:#0000008c;z-index:80}.pptx-ng-presentation-tools button{width:2rem;height:2rem;border:none;border-radius:.35rem;background:transparent;color:#fff;font-size:1rem;cursor:pointer}.pptx-ng-presentation-tools button:hover{background:#ffffff26}.pptx-ng-presentation-tools button.is-active{background:#ffffff4d}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresentationTransitionOverlayComponent, selector: "pptx-presentation-transition-overlay", inputs: ["outgoingSlide", "canvasSize", "transition", "templateElements", "mediaDataUrls", "durationMs"], outputs: ["complete"] }, { kind: "component", type: PresentationAnnotationOverlayComponent, selector: "pptx-presentation-annotation-overlay", inputs: ["canvasSize", "zoom"] }, { kind: "component", type: PresentationSubtitleBarComponent, selector: "pptx-presentation-subtitle-bar", inputs: ["visible"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
64540
+ `, isInline: true, styles: [":host{display:block;position:fixed;inset:0;z-index:10000;background:#000;cursor:pointer;-webkit-user-select:none;user-select:none}.pptx-ng-presentation-root{position:absolute;inset:0;touch-action:pan-y}.pptx-ng-presentation-close:hover,.pptx-ng-presentation-nav:hover{background:#000000bf}.pptx-ng-presentation-tools{position:absolute;bottom:max(1rem,env(safe-area-inset-bottom));left:1rem;display:flex;gap:.25rem;padding:.25rem;border-radius:.5rem;background:#0000008c;z-index:80}.pptx-ng-presentation-tools button{width:2rem;height:2rem;border:none;border-radius:.35rem;background:transparent;color:#fff;font-size:1rem;cursor:pointer}.pptx-ng-presentation-tools button:hover{background:#ffffff26}.pptx-ng-presentation-tools button.is-active{background:#ffffff4d}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresentationTransitionOverlayComponent, selector: "pptx-presentation-transition-overlay", inputs: ["outgoingSlide", "canvasSize", "transition", "templateElements", "mediaDataUrls", "durationMs"], outputs: ["complete"] }, { kind: "component", type: PresentationAnnotationOverlayComponent, selector: "pptx-presentation-annotation-overlay", inputs: ["canvasSize", "zoom"] }, { kind: "component", type: PresentationSubtitleBarComponent, selector: "pptx-presentation-subtitle-bar", inputs: ["visible"] }, { kind: "component", type: LucidePenTool, selector: "svg[lucidePenTool]" }, { kind: "component", type: LucideHighlighter, selector: "svg[lucideHighlighter]" }, { kind: "component", type: LucideEraser, selector: "svg[lucideEraser]" }, { kind: "component", type: LucideMousePointer2, selector: "svg[lucideMousePointer2]" }, { kind: "component", type: LucideTrash2, selector: "svg[lucideTrash2]" }, { kind: "component", type: LucideX, selector: "svg[lucideX]" }, { kind: "component", type: LucideChevronLeft, selector: "svg[lucideChevronLeft]" }, { kind: "component", type: LucideChevronRight, selector: "svg[lucideChevronRight]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
64204
64541
  }
64205
64542
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PresentationOverlayComponent, decorators: [{
64206
64543
  type: Component,
@@ -64211,6 +64548,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
64211
64548
  PresentationAnnotationOverlayComponent,
64212
64549
  PresentationSubtitleBarComponent,
64213
64550
  TranslatePipe,
64551
+ LucidePenTool,
64552
+ LucideHighlighter,
64553
+ LucideEraser,
64554
+ LucideMousePointer2,
64555
+ LucideTrash2,
64556
+ LucideX,
64557
+ LucideChevronLeft,
64558
+ LucideChevronRight,
64214
64559
  ], providers: [AnimationPlaybackService, PresentationAnnotationsService, ZoomNavigationService], template: `
64215
64560
  <div #root class="pptx-ng-presentation-root">
64216
64561
  <!--
@@ -64237,6 +64582,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
64237
64582
  [zoom]="zoom()"
64238
64583
  [autoFit]="false"
64239
64584
  [interactive]="false"
64585
+ [presenting]="true"
64240
64586
  />
64241
64587
 
64242
64588
  @if (activeTransition(); as t) {
@@ -64268,7 +64614,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
64268
64614
  (click)="selectTool('pen')"
64269
64615
  [attr.aria-label]="'pptx.presentation.pen' | translate"
64270
64616
  >
64271
-
64617
+ <svg lucidePenTool class="h-4 w-4"></svg>
64272
64618
  </button>
64273
64619
  <button
64274
64620
  type="button"
@@ -64276,7 +64622,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
64276
64622
  (click)="selectTool('highlighter')"
64277
64623
  [attr.aria-label]="'pptx.presentation.highlighter' | translate"
64278
64624
  >
64279
-
64625
+ <svg lucideHighlighter class="h-4 w-4"></svg>
64280
64626
  </button>
64281
64627
  <button
64282
64628
  type="button"
@@ -64284,7 +64630,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
64284
64630
  (click)="selectTool('eraser')"
64285
64631
  [attr.aria-label]="'pptx.presentation.eraser' | translate"
64286
64632
  >
64287
-
64633
+ <svg lucideEraser class="h-4 w-4"></svg>
64288
64634
  </button>
64289
64635
  <button
64290
64636
  type="button"
@@ -64292,14 +64638,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
64292
64638
  (click)="selectTool('laser')"
64293
64639
  [attr.aria-label]="'pptx.presentation.laserPointer' | translate"
64294
64640
  >
64295
-
64641
+ <svg lucideMousePointer2 class="h-4 w-4"></svg>
64296
64642
  </button>
64297
64643
  <button
64298
64644
  type="button"
64299
64645
  (click)="annotations.clearAnnotations()"
64300
64646
  [attr.aria-label]="'pptx.presentation.clearAnnotations' | translate"
64301
64647
  >
64302
- 🗑
64648
+ <svg lucideTrash2 class="h-4 w-4"></svg>
64303
64649
  </button>
64304
64650
  <button
64305
64651
  type="button"
@@ -64320,7 +64666,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
64320
64666
  (touchend)="onCloseTouch($event)"
64321
64667
  [attr.aria-label]="'pptx.presenter.endPresentation' | translate"
64322
64668
  >
64323
- &#x2715;
64669
+ <svg lucideX class="h-5 w-5"></svg>
64324
64670
  </button>
64325
64671
 
64326
64672
  <!-- Edge navigation buttons (vertically centred, touch-friendly). -->
@@ -64332,7 +64678,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
64332
64678
  (touchend)="onPrevTouch($event)"
64333
64679
  [attr.aria-label]="'pptx.presenter.previousSlide' | translate"
64334
64680
  >
64335
- &#x2039;
64681
+ <svg lucideChevronLeft class="h-6 w-6"></svg>
64336
64682
  </button>
64337
64683
  <button
64338
64684
  type="button"
@@ -64342,11 +64688,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
64342
64688
  (touchend)="onNextTouch($event)"
64343
64689
  [attr.aria-label]="'pptx.presenter.nextSlide' | translate"
64344
64690
  >
64345
- &#x203A;
64691
+ <svg lucideChevronRight class="h-6 w-6"></svg>
64346
64692
  </button>
64347
64693
  </div>
64348
64694
  `, styles: [":host{display:block;position:fixed;inset:0;z-index:10000;background:#000;cursor:pointer;-webkit-user-select:none;user-select:none}.pptx-ng-presentation-root{position:absolute;inset:0;touch-action:pan-y}.pptx-ng-presentation-close:hover,.pptx-ng-presentation-nav:hover{background:#000000bf}.pptx-ng-presentation-tools{position:absolute;bottom:max(1rem,env(safe-area-inset-bottom));left:1rem;display:flex;gap:.25rem;padding:.25rem;border-radius:.5rem;background:#0000008c;z-index:80}.pptx-ng-presentation-tools button{width:2rem;height:2rem;border:none;border-radius:.35rem;background:transparent;color:#fff;font-size:1rem;cursor:pointer}.pptx-ng-presentation-tools button:hover{background:#ffffff26}.pptx-ng-presentation-tools button.is-active{background:#ffffff4d}\n"] }]
64349
- }], ctorParameters: () => [], propDecorators: { slides: [{ type: i0.Input, args: [{ isSignal: true, alias: "slides", required: true }] }], canvasSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasSize", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], startIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "startIndex", required: false }] }], indexChange: [{ type: i0.Output, args: ["indexChange"] }], closed: [{ type: i0.Output, args: ["closed"] }], annotationsExit: [{ type: i0.Output, args: ["annotationsExit"] }], stageRef: [{ type: i0.ViewChild, args: ['stage', { isSignal: true }] }], rootRef: [{ type: i0.ViewChild, args: ['root', { isSignal: true }] }], onWindowResize: [{
64695
+ }], ctorParameters: () => [], propDecorators: { slides: [{ type: i0.Input, args: [{ isSignal: true, alias: "slides", required: true }] }], canvasSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasSize", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], startIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "startIndex", required: false }] }], indexChange: [{ type: i0.Output, args: ["indexChange"] }], closed: [{ type: i0.Output, args: ["closed"] }], annotationsExit: [{ type: i0.Output, args: ["annotationsExit"] }], stageRef: [{ type: i0.ViewChild, args: ['stage', { isSignal: true }] }], rootRef: [{ type: i0.ViewChild, args: ['root', { isSignal: true }] }], onFullscreenChange: [{
64696
+ type: HostListener,
64697
+ args: ['document:fullscreenchange']
64698
+ }], onWindowResize: [{
64350
64699
  type: HostListener,
64351
64700
  args: ['window:resize']
64352
64701
  }], onKeyDown: [{
@@ -64667,7 +65016,7 @@ class PresenterViewComponent {
64667
65016
  } @else {
64668
65017
  <div class="pptx-ng-presenter-empty">{{ 'pptx.presenter.noSlides' | translate }}</div>
64669
65018
  }
64670
- `, isInline: true, styles: [":host{position:absolute;inset:0;z-index:50;display:flex;flex-direction:column;background:#0b0b0c;color:#f5f5f5;font-family:system-ui,sans-serif}.pptx-ng-presenter-body{display:flex;flex:1 1 auto;min-height:0}.pptx-ng-presenter-current{flex:7 1 0;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#000;padding:1rem;min-width:0}.pptx-ng-presenter-preview-stage{width:100%;max-width:100%;min-height:0}.pptx-ng-presenter-slide-badge{margin-top:.5rem;font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:.75rem;color:#ffffff80;-webkit-user-select:none;user-select:none}.pptx-ng-presenter-side{flex:3 1 0;display:flex;flex-direction:column;background:#18181b;border-left:1px solid rgba(255,255,255,.12);min-width:260px;max-width:440px}.pptx-ng-presenter-header,.pptx-ng-presenter-nav,.pptx-ng-presenter-next{padding:.5rem 1rem;border-bottom:1px solid rgba(255,255,255,.08)}.pptx-ng-presenter-header{display:flex;align-items:center;justify-content:space-between;gap:.5rem}.pptx-ng-presenter-label{font-size:.625rem;text-transform:uppercase;letter-spacing:.06em;color:#ffffff8c}.pptx-ng-presenter-clock{font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:1.125rem}.pptx-ng-presenter-elapsed{color:#6ea8fe}.pptx-ng-presenter-iconbtn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;border-radius:6px;background:transparent;color:#ffffffb3;cursor:pointer;font-size:1rem;line-height:1}.pptx-ng-presenter-iconbtn:hover{background:#ffffff1a;color:#fff}.pptx-ng-presenter-iconbtn:disabled{opacity:.3;cursor:not-allowed}.pptx-ng-presenter-nav{display:flex;align-items:center;justify-content:space-between}.pptx-ng-presenter-navbtn{display:inline-flex;align-items:center;gap:.375rem;padding:.375rem .75rem;border:none;border-radius:6px;background:#ffffff14;color:#f5f5f5;cursor:pointer;font-size:.75rem}.pptx-ng-presenter-navbtn:hover:not(:disabled){background:#ffffff29}.pptx-ng-presenter-navbtn:disabled{opacity:.4;cursor:not-allowed}.pptx-ng-presenter-counter{font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:.875rem}.pptx-ng-presenter-next-empty{display:flex;align-items:center;justify-content:center;height:4rem;border:1px solid rgba(255,255,255,.15);border-radius:6px;background:#ffffff0a;font-size:.75rem;font-style:italic;color:#ffffff80}.pptx-ng-presenter-notes{flex:1 1 auto;display:flex;flex-direction:column;min-height:0;padding:.75rem 1rem}.pptx-ng-presenter-notes-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem}.pptx-ng-presenter-notes-size{display:flex;align-items:center;gap:.25rem}.pptx-ng-presenter-notes-size-value{min-width:28px;text-align:center;font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:.625rem;color:#ffffff8c;-webkit-user-select:none;user-select:none}.pptx-ng-presenter-notes-body{flex:1 1 auto;overflow-y:auto;border:1px solid rgba(255,255,255,.15);border-radius:6px;background:#ffffff0a;padding:.5rem .75rem;white-space:pre-wrap;line-height:1.5}.pptx-ng-presenter-notes-empty{font-style:italic;color:#ffffff80}.pptx-ng-presenter-progress{height:6px;width:100%;background:#ffffff1f;flex:0 0 auto}.pptx-ng-presenter-progress-fill{height:100%;background:#6ea8fe;transition:width 1s linear}.pptx-ng-presenter-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#fff9}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
65019
+ `, isInline: true, styles: [":host{position:absolute;inset:0;z-index:50;display:flex;flex-direction:column;background:#0b0b0c;color:#f5f5f5;font-family:system-ui,sans-serif}.pptx-ng-presenter-body{display:flex;flex:1 1 auto;min-height:0}.pptx-ng-presenter-current{flex:7 1 0;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#000;padding:1rem;min-width:0}.pptx-ng-presenter-preview-stage{width:100%;max-width:100%;min-height:0}.pptx-ng-presenter-slide-badge{margin-top:.5rem;font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:.75rem;color:#ffffff80;-webkit-user-select:none;user-select:none}.pptx-ng-presenter-side{flex:3 1 0;display:flex;flex-direction:column;background:#18181b;border-left:1px solid rgba(255,255,255,.12);min-width:260px;max-width:440px}.pptx-ng-presenter-header,.pptx-ng-presenter-nav,.pptx-ng-presenter-next{padding:.5rem 1rem;border-bottom:1px solid rgba(255,255,255,.08)}.pptx-ng-presenter-header{display:flex;align-items:center;justify-content:space-between;gap:.5rem}.pptx-ng-presenter-label{font-size:.625rem;text-transform:uppercase;letter-spacing:.06em;color:#ffffff8c}.pptx-ng-presenter-clock{font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:1.125rem}.pptx-ng-presenter-elapsed{color:#6ea8fe}.pptx-ng-presenter-iconbtn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;border-radius:6px;background:transparent;color:#ffffffb3;cursor:pointer;font-size:1rem;line-height:1}.pptx-ng-presenter-iconbtn:hover{background:#ffffff1a;color:#fff}.pptx-ng-presenter-iconbtn:disabled{opacity:.3;cursor:not-allowed}.pptx-ng-presenter-nav{display:flex;align-items:center;justify-content:space-between}.pptx-ng-presenter-navbtn{display:inline-flex;align-items:center;gap:.375rem;padding:.375rem .75rem;border:none;border-radius:6px;background:#ffffff14;color:#f5f5f5;cursor:pointer;font-size:.75rem}.pptx-ng-presenter-navbtn:hover:not(:disabled){background:#ffffff29}.pptx-ng-presenter-navbtn:disabled{opacity:.4;cursor:not-allowed}.pptx-ng-presenter-counter{font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:.875rem}.pptx-ng-presenter-next-empty{display:flex;align-items:center;justify-content:center;height:4rem;border:1px solid rgba(255,255,255,.15);border-radius:6px;background:#ffffff0a;font-size:.75rem;font-style:italic;color:#ffffff80}.pptx-ng-presenter-notes{flex:1 1 auto;display:flex;flex-direction:column;min-height:0;padding:.75rem 1rem}.pptx-ng-presenter-notes-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem}.pptx-ng-presenter-notes-size{display:flex;align-items:center;gap:.25rem}.pptx-ng-presenter-notes-size-value{min-width:28px;text-align:center;font-family:ui-monospace,monospace;font-variant-numeric:tabular-nums;font-size:.625rem;color:#ffffff8c;-webkit-user-select:none;user-select:none}.pptx-ng-presenter-notes-body{flex:1 1 auto;overflow-y:auto;border:1px solid rgba(255,255,255,.15);border-radius:6px;background:#ffffff0a;padding:.5rem .75rem;white-space:pre-wrap;line-height:1.5}.pptx-ng-presenter-notes-empty{font-style:italic;color:#ffffff80}.pptx-ng-presenter-progress{height:6px;width:100%;background:#ffffff1f;flex:0 0 auto}.pptx-ng-presenter-progress-fill{height:100%;background:#6ea8fe;transition:width 1s linear}.pptx-ng-presenter-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#fff9}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
64671
65020
  }
64672
65021
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PresenterViewComponent, decorators: [{
64673
65022
  type: Component,
@@ -66443,7 +66792,7 @@ class RibbonAnimationsSectionComponent {
66443
66792
  [title]="'pptx.animations.previewTooltip' | translate"
66444
66793
  (click)="present.emit()"
66445
66794
  >
66446
- {{ 'pptx.animations.preview' | translate }}
66795
+ <svg lucidePlay class="h-4 w-4"></svg> {{ 'pptx.animations.preview' | translate }}
66447
66796
  </button>
66448
66797
  <span class="pptx-rb-sep"></span>
66449
66798
  <!-- Add Animation dropdown (hover-reveal, mirrors React pattern) -->
@@ -66454,7 +66803,9 @@ class RibbonAnimationsSectionComponent {
66454
66803
  [disabled]="!hasSel()"
66455
66804
  [title]="'pptx.animations.addTooltip' | translate"
66456
66805
  >
66457
- {{ 'pptx.animations.addAnimation' | translate }} ▾
66806
+ <svg lucideSparkles class="h-4 w-4"></svg>
66807
+ {{ 'pptx.animations.addAnimation' | translate }}
66808
+ <svg lucideChevronDown class="h-3 w-3"></svg>
66458
66809
  </button>
66459
66810
  <!-- Dropdown panel: shown on group hover -->
66460
66811
  <div class="absolute left-0 top-full z-50 hidden w-44 pt-1 group-hover:block">
@@ -66522,7 +66873,7 @@ class RibbonAnimationsSectionComponent {
66522
66873
  [title]="'pptx.animations.removeTooltip' | translate"
66523
66874
  (click)="removeAnim()"
66524
66875
  >
66525
- {{ 'pptx.ribbon.removeAnimation' | translate }}
66876
+ <svg lucideTrash2 class="h-4 w-4"></svg> {{ 'pptx.ribbon.removeAnimation' | translate }}
66526
66877
  </button>
66527
66878
  <span class="pptx-rb-sep"></span>
66528
66879
  <!-- Animation Panel -->
@@ -66532,9 +66883,10 @@ class RibbonAnimationsSectionComponent {
66532
66883
  [title]="'pptx.animations.openPanelTooltip' | translate"
66533
66884
  (click)="toggleInspector.emit()"
66534
66885
  >
66535
- {{ 'pptx.animations.animationPanel' | translate }}
66886
+ <svg lucidePanelRight class="h-4 w-4"></svg>
66887
+ {{ 'pptx.animations.animationPanel' | translate }}
66536
66888
  </button>
66537
- `, isInline: true, dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
66889
+ `, isInline: true, dependencies: [{ kind: "component", type: LucidePlay, selector: "svg[lucidePlay]" }, { kind: "component", type: LucideSparkles, selector: "svg[lucideSparkles], svg[lucideStars]" }, { kind: "component", type: LucideChevronDown, selector: "svg[lucideChevronDown]" }, { kind: "component", type: LucideTrash2, selector: "svg[lucideTrash2]" }, { kind: "component", type: LucidePanelRight, selector: "svg[lucidePanelRight]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
66538
66890
  }
66539
66891
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RibbonAnimationsSectionComponent, decorators: [{
66540
66892
  type: Component,
@@ -66543,7 +66895,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
66543
66895
  standalone: true,
66544
66896
  changeDetection: ChangeDetectionStrategy.OnPush,
66545
66897
  host: { class: 'contents' },
66546
- imports: [TranslatePipe],
66898
+ imports: [
66899
+ TranslatePipe,
66900
+ LucidePlay,
66901
+ LucideSparkles,
66902
+ LucideChevronDown,
66903
+ LucideTrash2,
66904
+ LucidePanelRight,
66905
+ ],
66547
66906
  template: `
66548
66907
  <!-- Preview: plays presentation from this slide; no element-only preview API yet -->
66549
66908
  <button
@@ -66553,7 +66912,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
66553
66912
  [title]="'pptx.animations.previewTooltip' | translate"
66554
66913
  (click)="present.emit()"
66555
66914
  >
66556
- {{ 'pptx.animations.preview' | translate }}
66915
+ <svg lucidePlay class="h-4 w-4"></svg> {{ 'pptx.animations.preview' | translate }}
66557
66916
  </button>
66558
66917
  <span class="pptx-rb-sep"></span>
66559
66918
  <!-- Add Animation dropdown (hover-reveal, mirrors React pattern) -->
@@ -66564,7 +66923,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
66564
66923
  [disabled]="!hasSel()"
66565
66924
  [title]="'pptx.animations.addTooltip' | translate"
66566
66925
  >
66567
- {{ 'pptx.animations.addAnimation' | translate }} ▾
66926
+ <svg lucideSparkles class="h-4 w-4"></svg>
66927
+ {{ 'pptx.animations.addAnimation' | translate }}
66928
+ <svg lucideChevronDown class="h-3 w-3"></svg>
66568
66929
  </button>
66569
66930
  <!-- Dropdown panel: shown on group hover -->
66570
66931
  <div class="absolute left-0 top-full z-50 hidden w-44 pt-1 group-hover:block">
@@ -66632,7 +66993,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
66632
66993
  [title]="'pptx.animations.removeTooltip' | translate"
66633
66994
  (click)="removeAnim()"
66634
66995
  >
66635
- {{ 'pptx.ribbon.removeAnimation' | translate }}
66996
+ <svg lucideTrash2 class="h-4 w-4"></svg> {{ 'pptx.ribbon.removeAnimation' | translate }}
66636
66997
  </button>
66637
66998
  <span class="pptx-rb-sep"></span>
66638
66999
  <!-- Animation Panel -->
@@ -66642,7 +67003,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
66642
67003
  [title]="'pptx.animations.openPanelTooltip' | translate"
66643
67004
  (click)="toggleInspector.emit()"
66644
67005
  >
66645
- {{ 'pptx.animations.animationPanel' | translate }}
67006
+ <svg lucidePanelRight class="h-4 w-4"></svg>
67007
+ {{ 'pptx.animations.animationPanel' | translate }}
66646
67008
  </button>
66647
67009
  `,
66648
67010
  }]
@@ -66738,7 +67100,7 @@ class RibbonArrangeSectionComponent {
66738
67100
  [title]="'pptx.ribbon.alignLeft' | translate"
66739
67101
  (click)="editor.alignSelected(slideIndex(), 'left')"
66740
67102
  >
66741
-
67103
+ <svg lucideTextAlignStart class="h-4 w-4"></svg>
66742
67104
  </button>
66743
67105
  <button
66744
67106
  type="button"
@@ -66747,7 +67109,7 @@ class RibbonArrangeSectionComponent {
66747
67109
  [title]="'pptx.ribbon.alignCenter' | translate"
66748
67110
  (click)="editor.alignSelected(slideIndex(), 'centerH')"
66749
67111
  >
66750
-
67112
+ <svg lucideTextAlignCenter class="h-4 w-4"></svg>
66751
67113
  </button>
66752
67114
  <button
66753
67115
  type="button"
@@ -66756,7 +67118,7 @@ class RibbonArrangeSectionComponent {
66756
67118
  [title]="'pptx.ribbon.alignRight' | translate"
66757
67119
  (click)="editor.alignSelected(slideIndex(), 'right')"
66758
67120
  >
66759
-
67121
+ <svg lucideTextAlignEnd class="h-4 w-4"></svg>
66760
67122
  </button>
66761
67123
  <button
66762
67124
  type="button"
@@ -66765,7 +67127,7 @@ class RibbonArrangeSectionComponent {
66765
67127
  [title]="'pptx.ribbon.alignTop' | translate"
66766
67128
  (click)="editor.alignSelected(slideIndex(), 'top')"
66767
67129
  >
66768
-
67130
+ <svg lucideChevronUp class="h-4 w-4"></svg>
66769
67131
  </button>
66770
67132
  <button
66771
67133
  type="button"
@@ -66774,7 +67136,7 @@ class RibbonArrangeSectionComponent {
66774
67136
  [title]="'pptx.ribbon.alignMiddle' | translate"
66775
67137
  (click)="editor.alignSelected(slideIndex(), 'middle')"
66776
67138
  >
66777
-
67139
+ <svg lucideTextAlignCenter class="h-4 w-4 rotate-90"></svg>
66778
67140
  </button>
66779
67141
  <button
66780
67142
  type="button"
@@ -66783,7 +67145,7 @@ class RibbonArrangeSectionComponent {
66783
67145
  [title]="'pptx.ribbon.alignBottom' | translate"
66784
67146
  (click)="editor.alignSelected(slideIndex(), 'bottom')"
66785
67147
  >
66786
-
67148
+ <svg lucideChevronDown class="h-4 w-4"></svg>
66787
67149
  </button>
66788
67150
  </div>
66789
67151
  <span class="pptx-rb-sep"></span>
@@ -66796,7 +67158,7 @@ class RibbonArrangeSectionComponent {
66796
67158
  [title]="'pptx.ribbon.distributeHorizontally' | translate"
66797
67159
  (click)="editor.distributeSelected(slideIndex(), 'horizontal')"
66798
67160
  >
66799
- &#x2194; H
67161
+ <svg lucideAlignHorizontalSpaceAround class="h-4 w-4"></svg>
66800
67162
  </button>
66801
67163
  <button
66802
67164
  type="button"
@@ -66805,7 +67167,7 @@ class RibbonArrangeSectionComponent {
66805
67167
  [title]="'pptx.ribbon.distributeVertically' | translate"
66806
67168
  (click)="editor.distributeSelected(slideIndex(), 'vertical')"
66807
67169
  >
66808
- &#x2195; V
67170
+ <svg lucideAlignVerticalSpaceAround class="h-4 w-4"></svg>
66809
67171
  </button>
66810
67172
  </div>
66811
67173
  <span class="pptx-rb-sep"></span>
@@ -66912,7 +67274,7 @@ class RibbonArrangeSectionComponent {
66912
67274
  {{ 'pptx.arrange.delete' | translate }}
66913
67275
  </button>
66914
67276
  </div>
66915
- `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
67277
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: LucideTextAlignStart, selector: "svg[lucideTextAlignStart], svg[lucideText], svg[lucideAlignLeft]" }, { kind: "component", type: LucideTextAlignCenter, selector: "svg[lucideTextAlignCenter], svg[lucideAlignCenter]" }, { kind: "component", type: LucideTextAlignEnd, selector: "svg[lucideTextAlignEnd], svg[lucideAlignRight]" }, { kind: "component", type: LucideChevronUp, selector: "svg[lucideChevronUp]" }, { kind: "component", type: LucideChevronDown, selector: "svg[lucideChevronDown]" }, { kind: "component", type: LucideAlignHorizontalSpaceAround, selector: "svg[lucideAlignHorizontalSpaceAround]" }, { kind: "component", type: LucideAlignVerticalSpaceAround, selector: "svg[lucideAlignVerticalSpaceAround]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
66916
67278
  }
66917
67279
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RibbonArrangeSectionComponent, decorators: [{
66918
67280
  type: Component,
@@ -66921,7 +67283,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
66921
67283
  standalone: true,
66922
67284
  changeDetection: ChangeDetectionStrategy.OnPush,
66923
67285
  host: { class: 'contents' },
66924
- imports: [NgClass, TranslatePipe],
67286
+ imports: [
67287
+ NgClass,
67288
+ TranslatePipe,
67289
+ LucideTextAlignStart,
67290
+ LucideTextAlignCenter,
67291
+ LucideTextAlignEnd,
67292
+ LucideChevronUp,
67293
+ LucideChevronDown,
67294
+ LucideAlignHorizontalSpaceAround,
67295
+ LucideAlignVerticalSpaceAround,
67296
+ ],
66925
67297
  template: `
66926
67298
  <!-- Order -->
66927
67299
  <div class="pptx-rb-grp">
@@ -66972,7 +67344,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
66972
67344
  [title]="'pptx.ribbon.alignLeft' | translate"
66973
67345
  (click)="editor.alignSelected(slideIndex(), 'left')"
66974
67346
  >
66975
-
67347
+ <svg lucideTextAlignStart class="h-4 w-4"></svg>
66976
67348
  </button>
66977
67349
  <button
66978
67350
  type="button"
@@ -66981,7 +67353,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
66981
67353
  [title]="'pptx.ribbon.alignCenter' | translate"
66982
67354
  (click)="editor.alignSelected(slideIndex(), 'centerH')"
66983
67355
  >
66984
-
67356
+ <svg lucideTextAlignCenter class="h-4 w-4"></svg>
66985
67357
  </button>
66986
67358
  <button
66987
67359
  type="button"
@@ -66990,7 +67362,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
66990
67362
  [title]="'pptx.ribbon.alignRight' | translate"
66991
67363
  (click)="editor.alignSelected(slideIndex(), 'right')"
66992
67364
  >
66993
-
67365
+ <svg lucideTextAlignEnd class="h-4 w-4"></svg>
66994
67366
  </button>
66995
67367
  <button
66996
67368
  type="button"
@@ -66999,7 +67371,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
66999
67371
  [title]="'pptx.ribbon.alignTop' | translate"
67000
67372
  (click)="editor.alignSelected(slideIndex(), 'top')"
67001
67373
  >
67002
-
67374
+ <svg lucideChevronUp class="h-4 w-4"></svg>
67003
67375
  </button>
67004
67376
  <button
67005
67377
  type="button"
@@ -67008,7 +67380,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
67008
67380
  [title]="'pptx.ribbon.alignMiddle' | translate"
67009
67381
  (click)="editor.alignSelected(slideIndex(), 'middle')"
67010
67382
  >
67011
-
67383
+ <svg lucideTextAlignCenter class="h-4 w-4 rotate-90"></svg>
67012
67384
  </button>
67013
67385
  <button
67014
67386
  type="button"
@@ -67017,7 +67389,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
67017
67389
  [title]="'pptx.ribbon.alignBottom' | translate"
67018
67390
  (click)="editor.alignSelected(slideIndex(), 'bottom')"
67019
67391
  >
67020
-
67392
+ <svg lucideChevronDown class="h-4 w-4"></svg>
67021
67393
  </button>
67022
67394
  </div>
67023
67395
  <span class="pptx-rb-sep"></span>
@@ -67030,7 +67402,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
67030
67402
  [title]="'pptx.ribbon.distributeHorizontally' | translate"
67031
67403
  (click)="editor.distributeSelected(slideIndex(), 'horizontal')"
67032
67404
  >
67033
- &#x2194; H
67405
+ <svg lucideAlignHorizontalSpaceAround class="h-4 w-4"></svg>
67034
67406
  </button>
67035
67407
  <button
67036
67408
  type="button"
@@ -67039,7 +67411,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
67039
67411
  [title]="'pptx.ribbon.distributeVertically' | translate"
67040
67412
  (click)="editor.distributeSelected(slideIndex(), 'vertical')"
67041
67413
  >
67042
- &#x2195; V
67414
+ <svg lucideAlignVerticalSpaceAround class="h-4 w-4"></svg>
67043
67415
  </button>
67044
67416
  </div>
67045
67417
  <span class="pptx-rb-sep"></span>
@@ -67260,11 +67632,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
67260
67632
  * {@link DrawToolState} the parent re-broadcasts as `drawToolChange`.
67261
67633
  */
67262
67634
  const DRAW_TOOLS = [
67263
- { id: 'select', labelKey: 'pptx.ribbon.tool.select', icon: '↖' },
67264
- { id: 'pen', labelKey: 'pptx.ribbon.tool.pen', icon: '✏' },
67265
- { id: 'highlighter', labelKey: 'pptx.ribbon.tool.highlighter', icon: 'Hl' },
67266
- { id: 'eraser', labelKey: 'pptx.ribbon.tool.eraser', icon: '⌫' },
67267
- { id: 'freeform', labelKey: 'pptx.ribbon.tool.freeform', icon: '∿' },
67635
+ { id: 'select', labelKey: 'pptx.ribbon.tool.select' },
67636
+ { id: 'pen', labelKey: 'pptx.ribbon.tool.pen' },
67637
+ { id: 'highlighter', labelKey: 'pptx.ribbon.tool.highlighter' },
67638
+ { id: 'eraser', labelKey: 'pptx.ribbon.tool.eraser' },
67639
+ { id: 'freeform', labelKey: 'pptx.ribbon.tool.freeform' },
67268
67640
  ];
67269
67641
  class RibbonDrawSectionComponent {
67270
67642
  activeTool = input('select', /* @ts-ignore */
@@ -67304,7 +67676,23 @@ class RibbonDrawSectionComponent {
67304
67676
  [title]="tool.labelKey | translate"
67305
67677
  (click)="selectTool(tool.id)"
67306
67678
  >
67307
- {{ tool.icon }}
67679
+ @switch (tool.id) {
67680
+ @case ('select') {
67681
+ <svg lucideMoveRight class="h-4 w-4"></svg>
67682
+ }
67683
+ @case ('pen') {
67684
+ <svg lucidePencil class="h-4 w-4"></svg>
67685
+ }
67686
+ @case ('highlighter') {
67687
+ <svg lucideType class="h-4 w-4"></svg>
67688
+ }
67689
+ @case ('eraser') {
67690
+ <svg lucideMinus class="h-4 w-4"></svg>
67691
+ }
67692
+ @case ('freeform') {
67693
+ <svg lucideSpline class="h-4 w-4"></svg>
67694
+ }
67695
+ }
67308
67696
  </button>
67309
67697
  }
67310
67698
  </div>
@@ -67338,7 +67726,7 @@ class RibbonDrawSectionComponent {
67338
67726
  />
67339
67727
  <span class="w-4 text-right text-foreground">{{ drawingWidth() }}</span>
67340
67728
  </label>
67341
- `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
67729
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: LucideMoveRight, selector: "svg[lucideMoveRight]" }, { kind: "component", type: LucidePencil, selector: "svg[lucidePencil]" }, { kind: "component", type: LucideType, selector: "svg[lucideType]" }, { kind: "component", type: LucideMinus, selector: "svg[lucideMinus]" }, { kind: "component", type: LucideSpline, selector: "svg[lucideSpline]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
67342
67730
  }
67343
67731
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RibbonDrawSectionComponent, decorators: [{
67344
67732
  type: Component,
@@ -67347,7 +67735,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
67347
67735
  standalone: true,
67348
67736
  changeDetection: ChangeDetectionStrategy.OnPush,
67349
67737
  host: { class: 'contents' },
67350
- imports: [NgClass, TranslatePipe],
67738
+ imports: [
67739
+ NgClass,
67740
+ TranslatePipe,
67741
+ LucideMoveRight,
67742
+ LucidePencil,
67743
+ LucideType,
67744
+ LucideMinus,
67745
+ LucideSpline,
67746
+ ],
67351
67747
  template: `
67352
67748
  <!--
67353
67749
  Draw tool state is held in the parent ribbon and pushed up via
@@ -67365,7 +67761,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
67365
67761
  [title]="tool.labelKey | translate"
67366
67762
  (click)="selectTool(tool.id)"
67367
67763
  >
67368
- {{ tool.icon }}
67764
+ @switch (tool.id) {
67765
+ @case ('select') {
67766
+ <svg lucideMoveRight class="h-4 w-4"></svg>
67767
+ }
67768
+ @case ('pen') {
67769
+ <svg lucidePencil class="h-4 w-4"></svg>
67770
+ }
67771
+ @case ('highlighter') {
67772
+ <svg lucideType class="h-4 w-4"></svg>
67773
+ }
67774
+ @case ('eraser') {
67775
+ <svg lucideMinus class="h-4 w-4"></svg>
67776
+ }
67777
+ @case ('freeform') {
67778
+ <svg lucideSpline class="h-4 w-4"></svg>
67779
+ }
67780
+ }
67369
67781
  </button>
67370
67782
  }
67371
67783
  </div>
@@ -67452,12 +67864,12 @@ class RibbonDrawingGroupComponent {
67452
67864
  <div class="relative">
67453
67865
  <button
67454
67866
  type="button"
67455
- class="pptx-rb-gb"
67867
+ class="pptx-rb-gb gap-1.5"
67456
67868
  [disabled]="!canEdit()"
67457
67869
  [title]="'pptx.ribbon.shapes' | translate"
67458
67870
  (click)="shapesOpen.set(!shapesOpen())"
67459
67871
  >
67460
- {{ 'pptx.ribbon.shapes' | translate }}
67872
+ {{ 'pptx.ribbon.shapes' | translate }} <svg lucideChevronDown class="h-3 w-3"></svg>
67461
67873
  </button>
67462
67874
  @if (shapesOpen()) {
67463
67875
  <div
@@ -67479,12 +67891,12 @@ class RibbonDrawingGroupComponent {
67479
67891
  <div class="relative">
67480
67892
  <button
67481
67893
  type="button"
67482
- class="pptx-rb-gb"
67894
+ class="pptx-rb-gb gap-1.5"
67483
67895
  [disabled]="!canEdit()"
67484
67896
  [title]="'pptx.arrange.arrange' | translate"
67485
67897
  (click)="arrangeOpen.set(!arrangeOpen())"
67486
67898
  >
67487
- {{ 'pptx.arrange.arrange' | translate }}
67899
+ {{ 'pptx.arrange.arrange' | translate }} <svg lucideChevronDown class="h-3 w-3"></svg>
67488
67900
  </button>
67489
67901
  @if (arrangeOpen()) {
67490
67902
  <div
@@ -67544,7 +67956,7 @@ class RibbonDrawingGroupComponent {
67544
67956
  {{ 'pptx.ribbon.shapeStyles' | translate }}
67545
67957
  </span>
67546
67958
  </div>
67547
- `, isInline: true, dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
67959
+ `, isInline: true, dependencies: [{ kind: "component", type: LucideChevronDown, selector: "svg[lucideChevronDown]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
67548
67960
  }
67549
67961
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RibbonDrawingGroupComponent, decorators: [{
67550
67962
  type: Component,
@@ -67553,7 +67965,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
67553
67965
  standalone: true,
67554
67966
  changeDetection: ChangeDetectionStrategy.OnPush,
67555
67967
  host: { class: 'contents' },
67556
- imports: [TranslatePipe],
67968
+ imports: [TranslatePipe, LucideChevronDown],
67557
67969
  template: `
67558
67970
  <!-- Shapes -->
67559
67971
  <div class="flex flex-col items-center gap-0.5">
@@ -67561,12 +67973,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
67561
67973
  <div class="relative">
67562
67974
  <button
67563
67975
  type="button"
67564
- class="pptx-rb-gb"
67976
+ class="pptx-rb-gb gap-1.5"
67565
67977
  [disabled]="!canEdit()"
67566
67978
  [title]="'pptx.ribbon.shapes' | translate"
67567
67979
  (click)="shapesOpen.set(!shapesOpen())"
67568
67980
  >
67569
- {{ 'pptx.ribbon.shapes' | translate }}
67981
+ {{ 'pptx.ribbon.shapes' | translate }} <svg lucideChevronDown class="h-3 w-3"></svg>
67570
67982
  </button>
67571
67983
  @if (shapesOpen()) {
67572
67984
  <div
@@ -67588,12 +68000,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
67588
68000
  <div class="relative">
67589
68001
  <button
67590
68002
  type="button"
67591
- class="pptx-rb-gb"
68003
+ class="pptx-rb-gb gap-1.5"
67592
68004
  [disabled]="!canEdit()"
67593
68005
  [title]="'pptx.arrange.arrange' | translate"
67594
68006
  (click)="arrangeOpen.set(!arrangeOpen())"
67595
68007
  >
67596
- {{ 'pptx.arrange.arrange' | translate }}
68008
+ {{ 'pptx.arrange.arrange' | translate }} <svg lucideChevronDown class="h-3 w-3"></svg>
67597
68009
  </button>
67598
68010
  @if (arrangeOpen()) {
67599
68011
  <div
@@ -68208,7 +68620,7 @@ class RibbonFontControlsComponent {
68208
68620
  [title]="'pptx.ribbon.growFont' | translate"
68209
68621
  (click)="stepFontSize(1)"
68210
68622
  >
68211
- A▴
68623
+ <svg lucideAArrowUp class="h-4 w-4"></svg>
68212
68624
  </button>
68213
68625
  <button
68214
68626
  type="button"
@@ -68217,7 +68629,7 @@ class RibbonFontControlsComponent {
68217
68629
  [title]="'pptx.ribbon.shrinkFont' | translate"
68218
68630
  (click)="stepFontSize(-1)"
68219
68631
  >
68220
- A▾
68632
+ <svg lucideAArrowDown class="h-4 w-4"></svg>
68221
68633
  </button>
68222
68634
  <button
68223
68635
  type="button"
@@ -68226,7 +68638,7 @@ class RibbonFontControlsComponent {
68226
68638
  [title]="'pptx.ribbon.clearFormatting' | translate"
68227
68639
  (click)="clearFormatting()"
68228
68640
  >
68229
-
68641
+ <svg lucideRemoveFormatting class="h-4 w-4"></svg>
68230
68642
  </button>
68231
68643
  </div>
68232
68644
  <div class="pptx-rb-grp">
@@ -68337,9 +68749,9 @@ class RibbonFontControlsComponent {
68337
68749
  swatchAriaKey="pptx.ribbon.highlightColourValue"
68338
68750
  (pick)="setHighlight($event)"
68339
68751
  >
68340
- <span class="font-bold">🖍</span>
68752
+ <svg lucideHighlighter class="h-3.5 w-3.5"></svg>
68341
68753
  </pptx-ribbon-color-popover>
68342
- `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: RibbonColorPopoverComponent, selector: "pptx-ribbon-color-popover", inputs: ["current", "presets", "disabled", "titleKey", "swatchAriaKey"], outputs: ["pick"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
68754
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: RibbonColorPopoverComponent, selector: "pptx-ribbon-color-popover", inputs: ["current", "presets", "disabled", "titleKey", "swatchAriaKey"], outputs: ["pick"] }, { kind: "component", type: LucideAArrowUp, selector: "svg[lucideAArrowUp]" }, { kind: "component", type: LucideAArrowDown, selector: "svg[lucideAArrowDown]" }, { kind: "component", type: LucideRemoveFormatting, selector: "svg[lucideRemoveFormatting]" }, { kind: "component", type: LucideHighlighter, selector: "svg[lucideHighlighter]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
68343
68755
  }
68344
68756
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RibbonFontControlsComponent, decorators: [{
68345
68757
  type: Component,
@@ -68348,7 +68760,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
68348
68760
  standalone: true,
68349
68761
  changeDetection: ChangeDetectionStrategy.OnPush,
68350
68762
  host: { class: 'contents' },
68351
- imports: [NgClass, TranslatePipe, RibbonColorPopoverComponent],
68763
+ imports: [
68764
+ NgClass,
68765
+ TranslatePipe,
68766
+ RibbonColorPopoverComponent,
68767
+ LucideAArrowUp,
68768
+ LucideAArrowDown,
68769
+ LucideRemoveFormatting,
68770
+ LucideHighlighter,
68771
+ ],
68352
68772
  template: `
68353
68773
  <div class="flex items-center gap-1">
68354
68774
  <select
@@ -68380,7 +68800,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
68380
68800
  [title]="'pptx.ribbon.growFont' | translate"
68381
68801
  (click)="stepFontSize(1)"
68382
68802
  >
68383
- A▴
68803
+ <svg lucideAArrowUp class="h-4 w-4"></svg>
68384
68804
  </button>
68385
68805
  <button
68386
68806
  type="button"
@@ -68389,7 +68809,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
68389
68809
  [title]="'pptx.ribbon.shrinkFont' | translate"
68390
68810
  (click)="stepFontSize(-1)"
68391
68811
  >
68392
- A▾
68812
+ <svg lucideAArrowDown class="h-4 w-4"></svg>
68393
68813
  </button>
68394
68814
  <button
68395
68815
  type="button"
@@ -68398,7 +68818,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
68398
68818
  [title]="'pptx.ribbon.clearFormatting' | translate"
68399
68819
  (click)="clearFormatting()"
68400
68820
  >
68401
-
68821
+ <svg lucideRemoveFormatting class="h-4 w-4"></svg>
68402
68822
  </button>
68403
68823
  </div>
68404
68824
  <div class="pptx-rb-grp">
@@ -68509,7 +68929,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
68509
68929
  swatchAriaKey="pptx.ribbon.highlightColourValue"
68510
68930
  (pick)="setHighlight($event)"
68511
68931
  >
68512
- <span class="font-bold">🖍</span>
68932
+ <svg lucideHighlighter class="h-3.5 w-3.5"></svg>
68513
68933
  </pptx-ribbon-color-popover>
68514
68934
  `,
68515
68935
  }]
@@ -68672,7 +69092,7 @@ class RibbonParagraphControlsComponent {
68672
69092
  [title]="'pptx.ribbon.bulletList' | translate"
68673
69093
  (click)="toggleList('bullet')"
68674
69094
  >
68675
- •≡
69095
+ <svg lucideList class="h-4 w-4"></svg>
68676
69096
  </button>
68677
69097
  <button
68678
69098
  type="button"
@@ -68682,7 +69102,7 @@ class RibbonParagraphControlsComponent {
68682
69102
  [title]="'pptx.notes.numberedList' | translate"
68683
69103
  (click)="toggleList('numbered')"
68684
69104
  >
68685
- 1.≡
69105
+ <svg lucideListOrdered class="h-4 w-4"></svg>
68686
69106
  </button>
68687
69107
  </div>
68688
69108
  <!-- Indent: outdent + indent -->
@@ -68694,7 +69114,7 @@ class RibbonParagraphControlsComponent {
68694
69114
  [title]="'pptx.notes.outdent' | translate"
68695
69115
  (click)="changeIndent(-24)"
68696
69116
  >
68697
-
69117
+ <svg lucideListIndentDecrease class="h-4 w-4"></svg>
68698
69118
  </button>
68699
69119
  <button
68700
69120
  type="button"
@@ -68703,7 +69123,7 @@ class RibbonParagraphControlsComponent {
68703
69123
  [title]="'pptx.notes.indent' | translate"
68704
69124
  (click)="changeIndent(24)"
68705
69125
  >
68706
-
69126
+ <svg lucideListIndentIncrease class="h-4 w-4"></svg>
68707
69127
  </button>
68708
69128
  </div>
68709
69129
  <!-- Alignment -->
@@ -68716,7 +69136,7 @@ class RibbonParagraphControlsComponent {
68716
69136
  [title]="'pptx.ribbon.alignLeft' | translate"
68717
69137
  (click)="setAlign('left')"
68718
69138
  >
68719
-
69139
+ <svg lucideTextAlignStart class="h-4 w-4"></svg>
68720
69140
  </button>
68721
69141
  <button
68722
69142
  type="button"
@@ -68726,7 +69146,7 @@ class RibbonParagraphControlsComponent {
68726
69146
  [title]="'pptx.ribbon.alignCenter' | translate"
68727
69147
  (click)="setAlign('center')"
68728
69148
  >
68729
-
69149
+ <svg lucideTextAlignCenter class="h-4 w-4"></svg>
68730
69150
  </button>
68731
69151
  <button
68732
69152
  type="button"
@@ -68736,7 +69156,7 @@ class RibbonParagraphControlsComponent {
68736
69156
  [title]="'pptx.ribbon.alignRight' | translate"
68737
69157
  (click)="setAlign('right')"
68738
69158
  >
68739
-
69159
+ <svg lucideTextAlignEnd class="h-4 w-4"></svg>
68740
69160
  </button>
68741
69161
  <button
68742
69162
  type="button"
@@ -68746,7 +69166,7 @@ class RibbonParagraphControlsComponent {
68746
69166
  [title]="'pptx.ribbon.justify' | translate"
68747
69167
  (click)="setAlign('justify')"
68748
69168
  >
68749
-
69169
+ <svg lucideTextAlignJustify class="h-4 w-4"></svg>
68750
69170
  </button>
68751
69171
  </div>
68752
69172
  <!-- Line Spacing -->
@@ -68784,7 +69204,7 @@ class RibbonParagraphControlsComponent {
68784
69204
  <option [value]="c" [selected]="c === curColumns()">{{ c }}</option>
68785
69205
  }
68786
69206
  </select>
68787
- `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
69207
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: LucideList, selector: "svg[lucideList]" }, { kind: "component", type: LucideListOrdered, selector: "svg[lucideListOrdered]" }, { kind: "component", type: LucideListIndentDecrease, selector: "svg[lucideListIndentDecrease], svg[lucideOutdent], svg[lucideIndentDecrease]" }, { kind: "component", type: LucideListIndentIncrease, selector: "svg[lucideListIndentIncrease], svg[lucideIndent], svg[lucideIndentIncrease]" }, { kind: "component", type: LucideTextAlignStart, selector: "svg[lucideTextAlignStart], svg[lucideText], svg[lucideAlignLeft]" }, { kind: "component", type: LucideTextAlignCenter, selector: "svg[lucideTextAlignCenter], svg[lucideAlignCenter]" }, { kind: "component", type: LucideTextAlignEnd, selector: "svg[lucideTextAlignEnd], svg[lucideAlignRight]" }, { kind: "component", type: LucideTextAlignJustify, selector: "svg[lucideTextAlignJustify], svg[lucideAlignJustify]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
68788
69208
  }
68789
69209
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RibbonParagraphControlsComponent, decorators: [{
68790
69210
  type: Component,
@@ -68793,7 +69213,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
68793
69213
  standalone: true,
68794
69214
  changeDetection: ChangeDetectionStrategy.OnPush,
68795
69215
  host: { class: 'contents' },
68796
- imports: [NgClass, TranslatePipe],
69216
+ imports: [
69217
+ NgClass,
69218
+ TranslatePipe,
69219
+ LucideList,
69220
+ LucideListOrdered,
69221
+ LucideListIndentDecrease,
69222
+ LucideListIndentIncrease,
69223
+ LucideTextAlignStart,
69224
+ LucideTextAlignCenter,
69225
+ LucideTextAlignEnd,
69226
+ LucideTextAlignJustify,
69227
+ ],
68797
69228
  template: `
68798
69229
  <!-- List style: bullets + numbering -->
68799
69230
  <div class="pptx-rb-grp">
@@ -68805,7 +69236,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
68805
69236
  [title]="'pptx.ribbon.bulletList' | translate"
68806
69237
  (click)="toggleList('bullet')"
68807
69238
  >
68808
- •≡
69239
+ <svg lucideList class="h-4 w-4"></svg>
68809
69240
  </button>
68810
69241
  <button
68811
69242
  type="button"
@@ -68815,7 +69246,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
68815
69246
  [title]="'pptx.notes.numberedList' | translate"
68816
69247
  (click)="toggleList('numbered')"
68817
69248
  >
68818
- 1.≡
69249
+ <svg lucideListOrdered class="h-4 w-4"></svg>
68819
69250
  </button>
68820
69251
  </div>
68821
69252
  <!-- Indent: outdent + indent -->
@@ -68827,7 +69258,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
68827
69258
  [title]="'pptx.notes.outdent' | translate"
68828
69259
  (click)="changeIndent(-24)"
68829
69260
  >
68830
-
69261
+ <svg lucideListIndentDecrease class="h-4 w-4"></svg>
68831
69262
  </button>
68832
69263
  <button
68833
69264
  type="button"
@@ -68836,7 +69267,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
68836
69267
  [title]="'pptx.notes.indent' | translate"
68837
69268
  (click)="changeIndent(24)"
68838
69269
  >
68839
-
69270
+ <svg lucideListIndentIncrease class="h-4 w-4"></svg>
68840
69271
  </button>
68841
69272
  </div>
68842
69273
  <!-- Alignment -->
@@ -68849,7 +69280,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
68849
69280
  [title]="'pptx.ribbon.alignLeft' | translate"
68850
69281
  (click)="setAlign('left')"
68851
69282
  >
68852
-
69283
+ <svg lucideTextAlignStart class="h-4 w-4"></svg>
68853
69284
  </button>
68854
69285
  <button
68855
69286
  type="button"
@@ -68859,7 +69290,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
68859
69290
  [title]="'pptx.ribbon.alignCenter' | translate"
68860
69291
  (click)="setAlign('center')"
68861
69292
  >
68862
-
69293
+ <svg lucideTextAlignCenter class="h-4 w-4"></svg>
68863
69294
  </button>
68864
69295
  <button
68865
69296
  type="button"
@@ -68869,7 +69300,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
68869
69300
  [title]="'pptx.ribbon.alignRight' | translate"
68870
69301
  (click)="setAlign('right')"
68871
69302
  >
68872
-
69303
+ <svg lucideTextAlignEnd class="h-4 w-4"></svg>
68873
69304
  </button>
68874
69305
  <button
68875
69306
  type="button"
@@ -68879,7 +69310,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
68879
69310
  [title]="'pptx.ribbon.justify' | translate"
68880
69311
  (click)="setAlign('justify')"
68881
69312
  >
68882
-
69313
+ <svg lucideTextAlignJustify class="h-4 w-4"></svg>
68883
69314
  </button>
68884
69315
  </div>
68885
69316
  <!-- Line Spacing -->
@@ -69011,11 +69442,11 @@ class RibbonHomeSectionComponent {
69011
69442
  <div class="pptx-rb-grp">
69012
69443
  <button
69013
69444
  type="button"
69014
- class="pptx-rb-gb"
69445
+ class="pptx-rb-gb gap-1.5"
69015
69446
  [title]="'pptx.ribbon.newSlide' | translate"
69016
69447
  (click)="editor.addSlide(slideIndex())"
69017
69448
  >
69018
- {{ 'pptx.ribbon.slide' | translate }}
69449
+ <svg lucidePlus class="h-4 w-4"></svg> {{ 'pptx.ribbon.slide' | translate }}
69019
69450
  </button>
69020
69451
  <button
69021
69452
  type="button"
@@ -69091,7 +69522,7 @@ class RibbonHomeSectionComponent {
69091
69522
  {{ 'pptx.ribbon.editing' | translate }}
69092
69523
  </span>
69093
69524
  </div>
69094
- `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: RibbonFontControlsComponent, selector: "pptx-ribbon-font-controls", inputs: ["slideIndex", "selectedElement"] }, { kind: "component", type: RibbonParagraphControlsComponent, selector: "pptx-ribbon-paragraph-controls", inputs: ["slideIndex", "selectedElement"] }, { kind: "component", type: RibbonEditingSectionComponent, selector: "pptx-ribbon-editing-section", outputs: ["toggleFindReplace", "selectAll"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
69525
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: LucidePlus, selector: "svg[lucidePlus]" }, { kind: "component", type: RibbonFontControlsComponent, selector: "pptx-ribbon-font-controls", inputs: ["slideIndex", "selectedElement"] }, { kind: "component", type: RibbonParagraphControlsComponent, selector: "pptx-ribbon-paragraph-controls", inputs: ["slideIndex", "selectedElement"] }, { kind: "component", type: RibbonEditingSectionComponent, selector: "pptx-ribbon-editing-section", outputs: ["toggleFindReplace", "selectAll"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
69095
69526
  }
69096
69527
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RibbonHomeSectionComponent, decorators: [{
69097
69528
  type: Component,
@@ -69103,6 +69534,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
69103
69534
  imports: [
69104
69535
  NgClass,
69105
69536
  TranslatePipe,
69537
+ LucidePlus,
69106
69538
  RibbonFontControlsComponent,
69107
69539
  RibbonParagraphControlsComponent,
69108
69540
  RibbonEditingSectionComponent,
@@ -69160,11 +69592,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
69160
69592
  <div class="pptx-rb-grp">
69161
69593
  <button
69162
69594
  type="button"
69163
- class="pptx-rb-gb"
69595
+ class="pptx-rb-gb gap-1.5"
69164
69596
  [title]="'pptx.ribbon.newSlide' | translate"
69165
69597
  (click)="editor.addSlide(slideIndex())"
69166
69598
  >
69167
- {{ 'pptx.ribbon.slide' | translate }}
69599
+ <svg lucidePlus class="h-4 w-4"></svg> {{ 'pptx.ribbon.slide' | translate }}
69168
69600
  </button>
69169
69601
  <button
69170
69602
  type="button"
@@ -69422,7 +69854,7 @@ class RibbonInsertFieldsComponent {
69422
69854
  <rect x="3" y="3" width="18" height="18" rx="2" />
69423
69855
  <path d="M13 7l4 5-4 5" />
69424
69856
  </svg>
69425
- {{ 'pptx.ribbon.action' | translate }}
69857
+ {{ 'pptx.ribbon.action' | translate }} <svg lucideChevronDown class="h-3 w-3"></svg>
69426
69858
  </button>
69427
69859
  <div class="absolute left-0 top-full z-50 hidden w-44 pt-1 group-hover:block">
69428
69860
  <div class="rounded-lg border border-border bg-card py-1 shadow-2xl">
@@ -69466,7 +69898,7 @@ class RibbonInsertFieldsComponent {
69466
69898
  <path d="M4 7h16M4 12h10M4 17h12" />
69467
69899
  <circle cx="19" cy="15" r="3" />
69468
69900
  </svg>
69469
- {{ 'pptx.field.field' | translate }}
69901
+ {{ 'pptx.field.field' | translate }} <svg lucideChevronDown class="h-3 w-3"></svg>
69470
69902
  </button>
69471
69903
  <div class="absolute left-0 top-full z-50 hidden w-44 pt-1 group-hover:block">
69472
69904
  <div class="rounded-lg border border-border bg-card py-1 shadow-2xl">
@@ -69553,7 +69985,7 @@ class RibbonInsertFieldsComponent {
69553
69985
  </div>
69554
69986
  </div>
69555
69987
  }
69556
- `, isInline: true, dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
69988
+ `, isInline: true, dependencies: [{ kind: "component", type: LucideChevronDown, selector: "svg[lucideChevronDown]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
69557
69989
  }
69558
69990
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RibbonInsertFieldsComponent, decorators: [{
69559
69991
  type: Component,
@@ -69562,7 +69994,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
69562
69994
  standalone: true,
69563
69995
  changeDetection: ChangeDetectionStrategy.OnPush,
69564
69996
  host: { class: 'contents' },
69565
- imports: [TranslatePipe],
69997
+ imports: [TranslatePipe, LucideChevronDown],
69566
69998
  template: `
69567
69999
  <!-- Action Buttons dropdown (hover-reveal, mirrors React/Vue) -->
69568
70000
  <div class="group relative">
@@ -69583,7 +70015,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
69583
70015
  <rect x="3" y="3" width="18" height="18" rx="2" />
69584
70016
  <path d="M13 7l4 5-4 5" />
69585
70017
  </svg>
69586
- {{ 'pptx.ribbon.action' | translate }}
70018
+ {{ 'pptx.ribbon.action' | translate }} <svg lucideChevronDown class="h-3 w-3"></svg>
69587
70019
  </button>
69588
70020
  <div class="absolute left-0 top-full z-50 hidden w-44 pt-1 group-hover:block">
69589
70021
  <div class="rounded-lg border border-border bg-card py-1 shadow-2xl">
@@ -69627,7 +70059,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
69627
70059
  <path d="M4 7h16M4 12h10M4 17h12" />
69628
70060
  <circle cx="19" cy="15" r="3" />
69629
70061
  </svg>
69630
- {{ 'pptx.field.field' | translate }}
70062
+ {{ 'pptx.field.field' | translate }} <svg lucideChevronDown class="h-3 w-3"></svg>
69631
70063
  </button>
69632
70064
  <div class="absolute left-0 top-full z-50 hidden w-44 pt-1 group-hover:block">
69633
70065
  <div class="rounded-lg border border-border bg-card py-1 shadow-2xl">
@@ -69854,43 +70286,43 @@ class RibbonInsertSectionComponent {
69854
70286
  </button>
69855
70287
  <button
69856
70288
  type="button"
69857
- class="pptx-rb-gb"
70289
+ class="pptx-rb-gb gap-1.5"
69858
70290
  (click)="insertShape('rect')"
69859
70291
  [title]="'pptx.ribbon.rectangle' | translate"
69860
70292
  >
69861
- {{ 'pptx.ribbon.rect' | translate }}
70293
+ <svg lucideSquare class="h-4 w-4"></svg> {{ 'pptx.ribbon.rect' | translate }}
69862
70294
  </button>
69863
70295
  <button
69864
70296
  type="button"
69865
- class="pptx-rb-gb"
70297
+ class="pptx-rb-gb gap-1.5"
69866
70298
  (click)="insertShape('ellipse')"
69867
70299
  [title]="'pptx.ribbon.ellipse' | translate"
69868
70300
  >
69869
- {{ 'pptx.ribbon.ellipse' | translate }}
70301
+ <svg lucideCircle class="h-4 w-4"></svg> {{ 'pptx.ribbon.ellipse' | translate }}
69870
70302
  </button>
69871
70303
  <button
69872
70304
  type="button"
69873
- class="pptx-rb-gb"
70305
+ class="pptx-rb-gb gap-1.5"
69874
70306
  (click)="insertShape('line')"
69875
70307
  [title]="'pptx.ribbon.line' | translate"
69876
70308
  >
69877
- {{ 'pptx.ribbon.line' | translate }}
70309
+ <svg lucideSlash class="h-4 w-4"></svg> {{ 'pptx.ribbon.line' | translate }}
69878
70310
  </button>
69879
70311
  <button
69880
70312
  type="button"
69881
- class="pptx-rb-gb"
70313
+ class="pptx-rb-gb gap-1.5"
69882
70314
  (click)="insertImage()"
69883
70315
  [title]="'pptx.ribbon.insertImage' | translate"
69884
70316
  >
69885
- 🖼 {{ 'pptx.ribbon.image' | translate }}
70317
+ <svg lucideImage class="h-4 w-4"></svg> {{ 'pptx.ribbon.image' | translate }}
69886
70318
  </button>
69887
70319
  <button
69888
70320
  type="button"
69889
- class="pptx-rb-gl"
70321
+ class="pptx-rb-gl gap-1.5"
69890
70322
  (click)="insertMedia()"
69891
70323
  [title]="'pptx.ribbon.insertMedia' | translate"
69892
70324
  >
69893
- 🎬 {{ 'pptx.ribbon.media' | translate }}
70325
+ <svg lucideVideo class="h-4 w-4"></svg> {{ 'pptx.ribbon.media' | translate }}
69894
70326
  </button>
69895
70327
  </div>
69896
70328
  <span class="pptx-rb-sep"></span>
@@ -69898,19 +70330,19 @@ class RibbonInsertSectionComponent {
69898
70330
  <div class="pptx-rb-grp">
69899
70331
  <button
69900
70332
  type="button"
69901
- class="pptx-rb-gb"
70333
+ class="pptx-rb-gb gap-1.5"
69902
70334
  (click)="insertTable()"
69903
70335
  [title]="'pptx.ribbon.insertTable' | translate"
69904
70336
  >
69905
- {{ 'pptx.ribbon.table' | translate }}
70337
+ <svg lucideDatabase class="h-4 w-4"></svg> {{ 'pptx.ribbon.table' | translate }}
69906
70338
  </button>
69907
70339
  <button
69908
70340
  type="button"
69909
- class="pptx-rb-gb"
70341
+ class="pptx-rb-gb gap-1.5"
69910
70342
  (click)="openSmartArtDialog.emit()"
69911
70343
  [title]="'pptx.ribbon.insertSmartArt' | translate"
69912
70344
  >
69913
- {{ 'pptx.ribbon.smartArt' | translate }}
70345
+ <svg lucideLayers class="h-4 w-4"></svg> {{ 'pptx.ribbon.smartArt' | translate }}
69914
70346
  </button>
69915
70347
  <select
69916
70348
  class="pptx-rb-gl"
@@ -69924,25 +70356,50 @@ class RibbonInsertSectionComponent {
69924
70356
  </select>
69925
70357
  <button
69926
70358
  type="button"
69927
- class="pptx-rb-gb"
70359
+ class="pptx-rb-gb gap-1.5"
69928
70360
  (click)="insertChart()"
69929
70361
  [title]="'pptx.ribbon.insertChart' | translate"
69930
70362
  >
69931
- ▥ {{ 'pptx.ribbon.chart' | translate }}
70363
+ <svg
70364
+ class="h-4 w-4"
70365
+ viewBox="0 0 24 24"
70366
+ fill="none"
70367
+ stroke="currentColor"
70368
+ stroke-width="2"
70369
+ stroke-linecap="round"
70370
+ stroke-linejoin="round"
70371
+ >
70372
+ <path d="M3 3v18h18" />
70373
+ <rect x="7" y="11" width="3" height="6" />
70374
+ <rect x="12" y="7" width="3" height="10" />
70375
+ <rect x="17" y="13" width="3" height="4" />
70376
+ </svg>
70377
+ {{ 'pptx.ribbon.chart' | translate }}
69932
70378
  </button>
69933
70379
  <button
69934
70380
  type="button"
69935
- class="pptx-rb-gl"
70381
+ class="pptx-rb-gl gap-1.5"
69936
70382
  (click)="openEquationDialog.emit()"
69937
70383
  [title]="'pptx.ribbon.insertEquation' | translate"
69938
70384
  >
69939
- ∑ {{ 'pptx.ribbon.equation' | translate }}
70385
+ <svg
70386
+ class="h-4 w-4"
70387
+ viewBox="0 0 24 24"
70388
+ fill="none"
70389
+ stroke="currentColor"
70390
+ stroke-width="2"
70391
+ stroke-linecap="round"
70392
+ stroke-linejoin="round"
70393
+ >
70394
+ <path d="M4 17h6M7 14v6M14 7l4.5 10M15.5 14h5" />
70395
+ </svg>
70396
+ {{ 'pptx.ribbon.equation' | translate }}
69940
70397
  </button>
69941
70398
  </div>
69942
70399
  <span class="pptx-rb-sep"></span>
69943
70400
  <!-- Action button + Field dropdowns -->
69944
70401
  <pptx-ribbon-insert-fields [slideIndex]="slideIndex()" />
69945
- `, isInline: true, dependencies: [{ kind: "component", type: RibbonInsertFieldsComponent, selector: "pptx-ribbon-insert-fields", inputs: ["slideIndex"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
70402
+ `, isInline: true, dependencies: [{ kind: "component", type: RibbonInsertFieldsComponent, selector: "pptx-ribbon-insert-fields", inputs: ["slideIndex"] }, { kind: "component", type: LucideSquare, selector: "svg[lucideSquare]" }, { kind: "component", type: LucideCircle, selector: "svg[lucideCircle]" }, { kind: "component", type: LucideSlash, selector: "svg[lucideSlash]" }, { kind: "component", type: LucideImage, selector: "svg[lucideImage]" }, { kind: "component", type: LucideVideo, selector: "svg[lucideVideo]" }, { kind: "component", type: LucideDatabase, selector: "svg[lucideDatabase]" }, { kind: "component", type: LucideLayers, selector: "svg[lucideLayers], svg[lucideLayers3]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
69946
70403
  }
69947
70404
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RibbonInsertSectionComponent, decorators: [{
69948
70405
  type: Component,
@@ -69951,7 +70408,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
69951
70408
  standalone: true,
69952
70409
  changeDetection: ChangeDetectionStrategy.OnPush,
69953
70410
  host: { class: 'contents' },
69954
- imports: [TranslatePipe, RibbonInsertFieldsComponent],
70411
+ imports: [
70412
+ TranslatePipe,
70413
+ RibbonInsertFieldsComponent,
70414
+ LucideSquare,
70415
+ LucideCircle,
70416
+ LucideSlash,
70417
+ LucideImage,
70418
+ LucideVideo,
70419
+ LucideDatabase,
70420
+ LucideLayers,
70421
+ ],
69955
70422
  template: `
69956
70423
  <!-- Shapes group -->
69957
70424
  <div class="pptx-rb-grp">
@@ -69965,43 +70432,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
69965
70432
  </button>
69966
70433
  <button
69967
70434
  type="button"
69968
- class="pptx-rb-gb"
70435
+ class="pptx-rb-gb gap-1.5"
69969
70436
  (click)="insertShape('rect')"
69970
70437
  [title]="'pptx.ribbon.rectangle' | translate"
69971
70438
  >
69972
- {{ 'pptx.ribbon.rect' | translate }}
70439
+ <svg lucideSquare class="h-4 w-4"></svg> {{ 'pptx.ribbon.rect' | translate }}
69973
70440
  </button>
69974
70441
  <button
69975
70442
  type="button"
69976
- class="pptx-rb-gb"
70443
+ class="pptx-rb-gb gap-1.5"
69977
70444
  (click)="insertShape('ellipse')"
69978
70445
  [title]="'pptx.ribbon.ellipse' | translate"
69979
70446
  >
69980
- {{ 'pptx.ribbon.ellipse' | translate }}
70447
+ <svg lucideCircle class="h-4 w-4"></svg> {{ 'pptx.ribbon.ellipse' | translate }}
69981
70448
  </button>
69982
70449
  <button
69983
70450
  type="button"
69984
- class="pptx-rb-gb"
70451
+ class="pptx-rb-gb gap-1.5"
69985
70452
  (click)="insertShape('line')"
69986
70453
  [title]="'pptx.ribbon.line' | translate"
69987
70454
  >
69988
- {{ 'pptx.ribbon.line' | translate }}
70455
+ <svg lucideSlash class="h-4 w-4"></svg> {{ 'pptx.ribbon.line' | translate }}
69989
70456
  </button>
69990
70457
  <button
69991
70458
  type="button"
69992
- class="pptx-rb-gb"
70459
+ class="pptx-rb-gb gap-1.5"
69993
70460
  (click)="insertImage()"
69994
70461
  [title]="'pptx.ribbon.insertImage' | translate"
69995
70462
  >
69996
- 🖼 {{ 'pptx.ribbon.image' | translate }}
70463
+ <svg lucideImage class="h-4 w-4"></svg> {{ 'pptx.ribbon.image' | translate }}
69997
70464
  </button>
69998
70465
  <button
69999
70466
  type="button"
70000
- class="pptx-rb-gl"
70467
+ class="pptx-rb-gl gap-1.5"
70001
70468
  (click)="insertMedia()"
70002
70469
  [title]="'pptx.ribbon.insertMedia' | translate"
70003
70470
  >
70004
- 🎬 {{ 'pptx.ribbon.media' | translate }}
70471
+ <svg lucideVideo class="h-4 w-4"></svg> {{ 'pptx.ribbon.media' | translate }}
70005
70472
  </button>
70006
70473
  </div>
70007
70474
  <span class="pptx-rb-sep"></span>
@@ -70009,19 +70476,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70009
70476
  <div class="pptx-rb-grp">
70010
70477
  <button
70011
70478
  type="button"
70012
- class="pptx-rb-gb"
70479
+ class="pptx-rb-gb gap-1.5"
70013
70480
  (click)="insertTable()"
70014
70481
  [title]="'pptx.ribbon.insertTable' | translate"
70015
70482
  >
70016
- {{ 'pptx.ribbon.table' | translate }}
70483
+ <svg lucideDatabase class="h-4 w-4"></svg> {{ 'pptx.ribbon.table' | translate }}
70017
70484
  </button>
70018
70485
  <button
70019
70486
  type="button"
70020
- class="pptx-rb-gb"
70487
+ class="pptx-rb-gb gap-1.5"
70021
70488
  (click)="openSmartArtDialog.emit()"
70022
70489
  [title]="'pptx.ribbon.insertSmartArt' | translate"
70023
70490
  >
70024
- {{ 'pptx.ribbon.smartArt' | translate }}
70491
+ <svg lucideLayers class="h-4 w-4"></svg> {{ 'pptx.ribbon.smartArt' | translate }}
70025
70492
  </button>
70026
70493
  <select
70027
70494
  class="pptx-rb-gl"
@@ -70035,19 +70502,44 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70035
70502
  </select>
70036
70503
  <button
70037
70504
  type="button"
70038
- class="pptx-rb-gb"
70505
+ class="pptx-rb-gb gap-1.5"
70039
70506
  (click)="insertChart()"
70040
70507
  [title]="'pptx.ribbon.insertChart' | translate"
70041
70508
  >
70042
- ▥ {{ 'pptx.ribbon.chart' | translate }}
70509
+ <svg
70510
+ class="h-4 w-4"
70511
+ viewBox="0 0 24 24"
70512
+ fill="none"
70513
+ stroke="currentColor"
70514
+ stroke-width="2"
70515
+ stroke-linecap="round"
70516
+ stroke-linejoin="round"
70517
+ >
70518
+ <path d="M3 3v18h18" />
70519
+ <rect x="7" y="11" width="3" height="6" />
70520
+ <rect x="12" y="7" width="3" height="10" />
70521
+ <rect x="17" y="13" width="3" height="4" />
70522
+ </svg>
70523
+ {{ 'pptx.ribbon.chart' | translate }}
70043
70524
  </button>
70044
70525
  <button
70045
70526
  type="button"
70046
- class="pptx-rb-gl"
70527
+ class="pptx-rb-gl gap-1.5"
70047
70528
  (click)="openEquationDialog.emit()"
70048
70529
  [title]="'pptx.ribbon.insertEquation' | translate"
70049
70530
  >
70050
- ∑ {{ 'pptx.ribbon.equation' | translate }}
70531
+ <svg
70532
+ class="h-4 w-4"
70533
+ viewBox="0 0 24 24"
70534
+ fill="none"
70535
+ stroke="currentColor"
70536
+ stroke-width="2"
70537
+ stroke-linecap="round"
70538
+ stroke-linejoin="round"
70539
+ >
70540
+ <path d="M4 17h6M7 14v6M14 7l4.5 10M15.5 14h5" />
70541
+ </svg>
70542
+ {{ 'pptx.ribbon.equation' | translate }}
70051
70543
  </button>
70052
70544
  </div>
70053
70545
  <span class="pptx-rb-sep"></span>
@@ -70158,7 +70650,7 @@ class RibbonPrimaryRowComponent {
70158
70650
  [attr.aria-label]="'pptx.toolbar.toggleSlidesPanel' | translate"
70159
70651
  (click)="toggleSidebar.emit()"
70160
70652
  >
70161
-
70653
+ <svg lucidePanelLeft class="h-4 w-4"></svg>
70162
70654
  </button>
70163
70655
 
70164
70656
  <!-- Center spacer -->
@@ -70173,7 +70665,7 @@ class RibbonPrimaryRowComponent {
70173
70665
  [attr.aria-label]="'pptx.toolbar.comments' | translate"
70174
70666
  (click)="toggleComments.emit()"
70175
70667
  >
70176
- 💬
70668
+ <svg lucideMessageSquare class="h-3.5 w-3.5"></svg>
70177
70669
  @if (commentCount() > 0) {
70178
70670
  <span
70179
70671
  class="absolute -right-0.5 -top-0.5 flex h-3.5 w-3.5 items-center justify-center rounded-full bg-primary text-[8px] leading-none text-white"
@@ -70190,7 +70682,7 @@ class RibbonPrimaryRowComponent {
70190
70682
  [disabled]="slideCount() === 0"
70191
70683
  (click)="present.emit()"
70192
70684
  >
70193
- {{ 'pptx.toolbar.present' | translate }}
70685
+ <svg lucidePlay class="h-3.5 w-3.5"></svg> {{ 'pptx.toolbar.present' | translate }}
70194
70686
  </button>
70195
70687
  <button
70196
70688
  type="button"
@@ -70200,7 +70692,7 @@ class RibbonPrimaryRowComponent {
70200
70692
  [attr.aria-label]="'pptx.ribbon.slideShowOptions' | translate"
70201
70693
  (click)="presentMenuOpen.set(!presentMenuOpen())"
70202
70694
  >
70203
-
70695
+ <svg lucideChevronDown class="h-3 w-3"></svg>
70204
70696
  </button>
70205
70697
  @if (presentMenuOpen()) {
70206
70698
  <div class="absolute right-0 top-full z-50 w-48 pt-1">
@@ -70240,7 +70732,7 @@ class RibbonPrimaryRowComponent {
70240
70732
  [attr.aria-label]="'pptx.ribbon.customShows' | translate"
70241
70733
  (click)="openCustomShows.emit()"
70242
70734
  >
70243
- {{ 'pptx.ribbon.show' | translate }}
70735
+ <svg lucidePlus class="h-3.5 w-3.5"></svg> {{ 'pptx.ribbon.show' | translate }}
70244
70736
  </button>
70245
70737
 
70246
70738
  <span class="mx-1 h-5 w-px self-center bg-border/50"></span>
@@ -70253,7 +70745,7 @@ class RibbonPrimaryRowComponent {
70253
70745
  [attr.aria-label]="'pptx.toolbar.toggleInspector' | translate"
70254
70746
  (click)="toggleInspector.emit()"
70255
70747
  >
70256
-
70748
+ <svg lucidePanelRight class="h-4 w-4"></svg>
70257
70749
  </button>
70258
70750
 
70259
70751
  <!-- Overflow menu -->
@@ -70266,7 +70758,7 @@ class RibbonPrimaryRowComponent {
70266
70758
  [attr.aria-label]="'pptx.ribbon.moreActions' | translate"
70267
70759
  (click)="overflowOpen.set(!overflowOpen())"
70268
70760
  >
70269
-
70761
+ <svg lucideEllipsis class="h-3.5 w-3.5"></svg>
70270
70762
  </button>
70271
70763
  @if (overflowOpen()) {
70272
70764
  <div class="absolute right-0 top-full z-50 w-52 pt-1">
@@ -70290,7 +70782,7 @@ class RibbonPrimaryRowComponent {
70290
70782
  }
70291
70783
  </div>
70292
70784
  </div>
70293
- `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
70785
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: LucidePanelLeft, selector: "svg[lucidePanelLeft], svg[lucideSidebar]" }, { kind: "component", type: LucidePanelRight, selector: "svg[lucidePanelRight]" }, { kind: "component", type: LucideMessageSquare, selector: "svg[lucideMessageSquare]" }, { kind: "component", type: LucidePlay, selector: "svg[lucidePlay]" }, { kind: "component", type: LucideChevronDown, selector: "svg[lucideChevronDown]" }, { kind: "component", type: LucidePlus, selector: "svg[lucidePlus]" }, { kind: "component", type: LucideEllipsis, selector: "svg[lucideEllipsis], svg[lucideMoreHorizontal]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
70294
70786
  }
70295
70787
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RibbonPrimaryRowComponent, decorators: [{
70296
70788
  type: Component,
@@ -70298,7 +70790,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70298
70790
  selector: 'pptx-ribbon-primary-row',
70299
70791
  standalone: true,
70300
70792
  changeDetection: ChangeDetectionStrategy.OnPush,
70301
- imports: [NgClass, TranslatePipe],
70793
+ imports: [
70794
+ NgClass,
70795
+ TranslatePipe,
70796
+ LucidePanelLeft,
70797
+ LucidePanelRight,
70798
+ LucideMessageSquare,
70799
+ LucidePlay,
70800
+ LucideChevronDown,
70801
+ LucidePlus,
70802
+ LucideEllipsis,
70803
+ ],
70302
70804
  template: `
70303
70805
  <div class="flex items-center gap-0.5 px-1.5 py-0.5">
70304
70806
  <!-- Left: slides pane toggle (undo/redo/find moved to the title bar) -->
@@ -70310,7 +70812,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70310
70812
  [attr.aria-label]="'pptx.toolbar.toggleSlidesPanel' | translate"
70311
70813
  (click)="toggleSidebar.emit()"
70312
70814
  >
70313
-
70815
+ <svg lucidePanelLeft class="h-4 w-4"></svg>
70314
70816
  </button>
70315
70817
 
70316
70818
  <!-- Center spacer -->
@@ -70325,7 +70827,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70325
70827
  [attr.aria-label]="'pptx.toolbar.comments' | translate"
70326
70828
  (click)="toggleComments.emit()"
70327
70829
  >
70328
- 💬
70830
+ <svg lucideMessageSquare class="h-3.5 w-3.5"></svg>
70329
70831
  @if (commentCount() > 0) {
70330
70832
  <span
70331
70833
  class="absolute -right-0.5 -top-0.5 flex h-3.5 w-3.5 items-center justify-center rounded-full bg-primary text-[8px] leading-none text-white"
@@ -70342,7 +70844,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70342
70844
  [disabled]="slideCount() === 0"
70343
70845
  (click)="present.emit()"
70344
70846
  >
70345
- {{ 'pptx.toolbar.present' | translate }}
70847
+ <svg lucidePlay class="h-3.5 w-3.5"></svg> {{ 'pptx.toolbar.present' | translate }}
70346
70848
  </button>
70347
70849
  <button
70348
70850
  type="button"
@@ -70352,7 +70854,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70352
70854
  [attr.aria-label]="'pptx.ribbon.slideShowOptions' | translate"
70353
70855
  (click)="presentMenuOpen.set(!presentMenuOpen())"
70354
70856
  >
70355
-
70857
+ <svg lucideChevronDown class="h-3 w-3"></svg>
70356
70858
  </button>
70357
70859
  @if (presentMenuOpen()) {
70358
70860
  <div class="absolute right-0 top-full z-50 w-48 pt-1">
@@ -70392,7 +70894,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70392
70894
  [attr.aria-label]="'pptx.ribbon.customShows' | translate"
70393
70895
  (click)="openCustomShows.emit()"
70394
70896
  >
70395
- {{ 'pptx.ribbon.show' | translate }}
70897
+ <svg lucidePlus class="h-3.5 w-3.5"></svg> {{ 'pptx.ribbon.show' | translate }}
70396
70898
  </button>
70397
70899
 
70398
70900
  <span class="mx-1 h-5 w-px self-center bg-border/50"></span>
@@ -70405,7 +70907,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70405
70907
  [attr.aria-label]="'pptx.toolbar.toggleInspector' | translate"
70406
70908
  (click)="toggleInspector.emit()"
70407
70909
  >
70408
-
70910
+ <svg lucidePanelRight class="h-4 w-4"></svg>
70409
70911
  </button>
70410
70912
 
70411
70913
  <!-- Overflow menu -->
@@ -70418,7 +70920,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70418
70920
  [attr.aria-label]="'pptx.ribbon.moreActions' | translate"
70419
70921
  (click)="overflowOpen.set(!overflowOpen())"
70420
70922
  >
70421
-
70923
+ <svg lucideEllipsis class="h-3.5 w-3.5"></svg>
70422
70924
  </button>
70423
70925
  @if (overflowOpen()) {
70424
70926
  <div class="absolute right-0 top-full z-50 w-52 pt-1">
@@ -70737,7 +71239,7 @@ class RibbonTransitionsSectionComponent {
70737
71239
  [title]="'pptx.ribbon.previewTransition' | translate"
70738
71240
  (click)="present.emit()"
70739
71241
  >
70740
- {{ 'pptx.ribbon.preview' | translate }}
71242
+ <svg lucidePlay class="h-4 w-4"></svg> {{ 'pptx.ribbon.preview' | translate }}
70741
71243
  </button>
70742
71244
  <span class="pptx-rb-sep"></span>
70743
71245
  <!-- Preset gallery -->
@@ -70833,9 +71335,9 @@ class RibbonTransitionsSectionComponent {
70833
71335
  [title]="'pptx.ribbon.openInspectorTransitions' | translate"
70834
71336
  (click)="toggleInspector.emit()"
70835
71337
  >
70836
- {{ 'pptx.ribbon.inspector' | translate }}
71338
+ <svg lucidePanelRight class="h-4 w-4"></svg> {{ 'pptx.ribbon.inspector' | translate }}
70837
71339
  </button>
70838
- `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
71340
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: LucidePlay, selector: "svg[lucidePlay]" }, { kind: "component", type: LucidePanelRight, selector: "svg[lucidePanelRight]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
70839
71341
  }
70840
71342
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RibbonTransitionsSectionComponent, decorators: [{
70841
71343
  type: Component,
@@ -70844,7 +71346,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70844
71346
  standalone: true,
70845
71347
  changeDetection: ChangeDetectionStrategy.OnPush,
70846
71348
  host: { class: 'contents' },
70847
- imports: [NgClass, TranslatePipe],
71349
+ imports: [NgClass, TranslatePipe, LucidePlay, LucidePanelRight],
70848
71350
  template: `
70849
71351
  <!-- Preview (fires existing presentation present path; no separate preview API yet) -->
70850
71352
  <button
@@ -70853,7 +71355,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70853
71355
  [title]="'pptx.ribbon.previewTransition' | translate"
70854
71356
  (click)="present.emit()"
70855
71357
  >
70856
- {{ 'pptx.ribbon.preview' | translate }}
71358
+ <svg lucidePlay class="h-4 w-4"></svg> {{ 'pptx.ribbon.preview' | translate }}
70857
71359
  </button>
70858
71360
  <span class="pptx-rb-sep"></span>
70859
71361
  <!-- Preset gallery -->
@@ -70949,7 +71451,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
70949
71451
  [title]="'pptx.ribbon.openInspectorTransitions' | translate"
70950
71452
  (click)="toggleInspector.emit()"
70951
71453
  >
70952
- {{ 'pptx.ribbon.inspector' | translate }}
71454
+ <svg lucidePanelRight class="h-4 w-4"></svg> {{ 'pptx.ribbon.inspector' | translate }}
70953
71455
  </button>
70954
71456
  `,
70955
71457
  }]
@@ -71431,24 +71933,28 @@ class RibbonComponent {
71431
71933
 
71432
71934
  <!-- ── Tab bar ───────────────────────────────────────────────────── -->
71433
71935
  <div class="flex items-center border-b border-border/60 px-1">
71434
- @for (t of tabs; track t.id) {
71435
- <button
71436
- type="button"
71437
- (click)="activeTab.set(t.id)"
71438
- class="relative whitespace-nowrap px-3.5 py-2 text-[12px] font-medium transition-colors"
71439
- [ngClass]="
71440
- activeTab() === t.id
71441
- ? 'text-foreground after:absolute after:-bottom-px after:left-0 after:right-0 after:h-[2.5px] after:bg-primary'
71442
- : 'text-muted-foreground hover:bg-accent/30 hover:text-foreground'
71443
- "
71444
- >
71445
- {{ t.labelKey | translate }}
71446
- </button>
71447
- }
71448
- <div class="flex-1"></div>
71936
+ <!-- Scrollable tab strip: on narrow widths the tabs scroll instead of
71937
+ clipping (mirrors React's max-md:overflow-x-auto scrollbar-none),
71938
+ while the Record/Share actions and collapse toggle stay pinned. -->
71939
+ <div class="flex min-w-0 flex-1 items-center overflow-x-auto pptx-scrollbar-none">
71940
+ @for (t of tabs; track t.id) {
71941
+ <button
71942
+ type="button"
71943
+ (click)="activeTab.set(t.id)"
71944
+ class="relative whitespace-nowrap px-3.5 py-2 text-[12px] font-medium transition-colors"
71945
+ [ngClass]="
71946
+ activeTab() === t.id
71947
+ ? 'text-foreground after:absolute after:-bottom-px after:left-0 after:right-0 after:h-[2.5px] after:bg-primary'
71948
+ : 'text-muted-foreground hover:bg-accent/30 hover:text-foreground'
71949
+ "
71950
+ >
71951
+ {{ t.labelKey | translate }}
71952
+ </button>
71953
+ }
71954
+ </div>
71449
71955
 
71450
71956
  <!-- Tab-row right actions (Record + Share), mirroring React's TabRowActions -->
71451
- <div class="flex items-center gap-1 pr-1">
71957
+ <div class="flex shrink-0 items-center gap-1 pr-1">
71452
71958
  @if (canEdit()) {
71453
71959
  <button
71454
71960
  type="button"
@@ -71477,7 +71983,7 @@ class RibbonComponent {
71477
71983
  [attr.aria-label]="'pptx.toolbar.share' | translate"
71478
71984
  (click)="share.emit()"
71479
71985
  >
71480
-
71986
+ <svg lucideShare2 class="h-3.5 w-3.5"></svg>
71481
71987
  <span>{{
71482
71988
  collabConnected()
71483
71989
  ? ('pptx.toolbar.sharingCount' | translate: { count: connectedCount() })
@@ -71488,7 +71994,7 @@ class RibbonComponent {
71488
71994
 
71489
71995
  <button
71490
71996
  type="button"
71491
- class="mr-1 rounded px-2 py-1 text-[11px] text-muted-foreground transition-colors hover:text-foreground"
71997
+ class="mr-1 shrink-0 rounded px-2 py-1 text-[11px] text-muted-foreground transition-colors hover:text-foreground"
71492
71998
  [attr.aria-pressed]="!ribbonExpanded()"
71493
71999
  [title]="
71494
72000
  (ribbonExpanded() ? 'pptx.ribbon.collapseRibbon' : 'pptx.ribbon.expandRibbon')
@@ -71496,7 +72002,11 @@ class RibbonComponent {
71496
72002
  "
71497
72003
  (click)="ribbonExpanded.set(!ribbonExpanded())"
71498
72004
  >
71499
- {{ ribbonExpanded() ? '▴' : '▾' }}
72005
+ @if (ribbonExpanded()) {
72006
+ <svg lucideChevronUp class="h-3.5 w-3.5"></svg>
72007
+ } @else {
72008
+ <svg lucideChevronDown class="h-3.5 w-3.5"></svg>
72009
+ }
71500
72010
  </button>
71501
72011
  </div>
71502
72012
 
@@ -71667,7 +72177,7 @@ class RibbonComponent {
71667
72177
  }
71668
72178
  </div>
71669
72179
  </div>
71670
- `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: RibbonPrimaryRowComponent, selector: "pptx-ribbon-primary-row", inputs: ["slideCount", "sidebarCollapsed", "inspectorOpen", "commentsOpen", "commentCount"], outputs: ["toggleSidebar", "toggleComments", "present", "presenter", "broadcast", "openCustomShows", "toggleInspector", "exportPng", "exportPdf", "exportGif", "exportVideo", "print", "info", "a11y", "save"] }, { kind: "component", type: RibbonFileSectionComponent, selector: "pptx-ribbon-file-section", inputs: ["slideCount", "exporting"], outputs: ["openFile", "save", "exportPng", "exportPdf", "exportGif", "exportVideo", "print", "info", "signatures", "replace", "openPassword", "openFontEmbedding", "openVersionHistory"] }, { kind: "component", type: RibbonHomeSectionComponent, selector: "pptx-ribbon-home-section", inputs: ["slideIndex", "selectedElement", "formatPainterActive", "canActivateFormatPainter"], outputs: ["toggleFormatPainter", "findReplace", "applyLayout", "resetSlide", "addSection"] }, { kind: "component", type: RibbonInsertSectionComponent, selector: "pptx-ribbon-insert-section", inputs: ["slideIndex", "newChartType"], outputs: ["openSmartArtDialog", "openEquationDialog", "chartTypeChange"] }, { kind: "component", type: RibbonFontControlsComponent, selector: "pptx-ribbon-font-controls", inputs: ["slideIndex", "selectedElement"] }, { kind: "component", type: RibbonParagraphControlsComponent, selector: "pptx-ribbon-paragraph-controls", inputs: ["slideIndex", "selectedElement"] }, { kind: "component", type: RibbonArrangeSectionComponent, selector: "pptx-ribbon-arrange-section", inputs: ["slideIndex", "formatPainterActive", "canActivateFormatPainter"], outputs: ["toggleFormatPainter"] }, { kind: "component", type: RibbonSlideshowSectionComponent, selector: "pptx-ribbon-slideshow-section", inputs: ["slideCount"], outputs: ["present", "presenter", "broadcast", "openCustomShows", "openSetUpSlideShow"] }, { kind: "component", type: RibbonReviewSectionComponent, selector: "pptx-ribbon-review-section", outputs: ["comments", "spelling", "a11y", "openCompare", "language", "link"] }, { kind: "component", type: RibbonViewSectionComponent, selector: "pptx-ribbon-view-section", inputs: ["canEdit", "showGrid", "showRulers", "showGuides", "snapToGrid", "eyedropperActive"], outputs: ["openSorter", "toggleNotes", "print", "openShortcuts", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "toggleSnapToGrid", "toggleEyedropper"] }, { kind: "component", type: RibbonDrawSectionComponent, selector: "pptx-ribbon-draw-section", inputs: ["activeTool", "drawingColor", "drawingWidth"], outputs: ["drawToolChange"] }, { kind: "component", type: RibbonDrawingGroupComponent, selector: "pptx-ribbon-drawing-group", inputs: ["canEdit"], outputs: ["shapeInsert", "moveLayer", "moveLayerToEdge"] }, { kind: "component", type: RibbonDesignSectionComponent, selector: "pptx-ribbon-design-section", inputs: ["themeGalleryOpen"], outputs: ["toggleThemeGallery", "info", "toggleInspector"] }, { kind: "component", type: RibbonTransitionsSectionComponent, selector: "pptx-ribbon-transitions-section", inputs: ["slideIndex", "selectedTransition", "transitionDurationSec"], outputs: ["present", "toggleInspector", "transitionChange", "durationChange"] }, { kind: "component", type: RibbonAnimationsSectionComponent, selector: "pptx-ribbon-animations-section", inputs: ["slideIndex", "selectedElement"], outputs: ["present", "toggleInspector"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
72180
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: LucideShare2, selector: "svg[lucideShare2]" }, { kind: "component", type: LucideChevronUp, selector: "svg[lucideChevronUp]" }, { kind: "component", type: LucideChevronDown, selector: "svg[lucideChevronDown]" }, { kind: "component", type: RibbonPrimaryRowComponent, selector: "pptx-ribbon-primary-row", inputs: ["slideCount", "sidebarCollapsed", "inspectorOpen", "commentsOpen", "commentCount"], outputs: ["toggleSidebar", "toggleComments", "present", "presenter", "broadcast", "openCustomShows", "toggleInspector", "exportPng", "exportPdf", "exportGif", "exportVideo", "print", "info", "a11y", "save"] }, { kind: "component", type: RibbonFileSectionComponent, selector: "pptx-ribbon-file-section", inputs: ["slideCount", "exporting"], outputs: ["openFile", "save", "exportPng", "exportPdf", "exportGif", "exportVideo", "print", "info", "signatures", "replace", "openPassword", "openFontEmbedding", "openVersionHistory"] }, { kind: "component", type: RibbonHomeSectionComponent, selector: "pptx-ribbon-home-section", inputs: ["slideIndex", "selectedElement", "formatPainterActive", "canActivateFormatPainter"], outputs: ["toggleFormatPainter", "findReplace", "applyLayout", "resetSlide", "addSection"] }, { kind: "component", type: RibbonInsertSectionComponent, selector: "pptx-ribbon-insert-section", inputs: ["slideIndex", "newChartType"], outputs: ["openSmartArtDialog", "openEquationDialog", "chartTypeChange"] }, { kind: "component", type: RibbonFontControlsComponent, selector: "pptx-ribbon-font-controls", inputs: ["slideIndex", "selectedElement"] }, { kind: "component", type: RibbonParagraphControlsComponent, selector: "pptx-ribbon-paragraph-controls", inputs: ["slideIndex", "selectedElement"] }, { kind: "component", type: RibbonArrangeSectionComponent, selector: "pptx-ribbon-arrange-section", inputs: ["slideIndex", "formatPainterActive", "canActivateFormatPainter"], outputs: ["toggleFormatPainter"] }, { kind: "component", type: RibbonSlideshowSectionComponent, selector: "pptx-ribbon-slideshow-section", inputs: ["slideCount"], outputs: ["present", "presenter", "broadcast", "openCustomShows", "openSetUpSlideShow"] }, { kind: "component", type: RibbonReviewSectionComponent, selector: "pptx-ribbon-review-section", outputs: ["comments", "spelling", "a11y", "openCompare", "language", "link"] }, { kind: "component", type: RibbonViewSectionComponent, selector: "pptx-ribbon-view-section", inputs: ["canEdit", "showGrid", "showRulers", "showGuides", "snapToGrid", "eyedropperActive"], outputs: ["openSorter", "toggleNotes", "print", "openShortcuts", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "toggleSnapToGrid", "toggleEyedropper"] }, { kind: "component", type: RibbonDrawSectionComponent, selector: "pptx-ribbon-draw-section", inputs: ["activeTool", "drawingColor", "drawingWidth"], outputs: ["drawToolChange"] }, { kind: "component", type: RibbonDrawingGroupComponent, selector: "pptx-ribbon-drawing-group", inputs: ["canEdit"], outputs: ["shapeInsert", "moveLayer", "moveLayerToEdge"] }, { kind: "component", type: RibbonDesignSectionComponent, selector: "pptx-ribbon-design-section", inputs: ["themeGalleryOpen"], outputs: ["toggleThemeGallery", "info", "toggleInspector"] }, { kind: "component", type: RibbonTransitionsSectionComponent, selector: "pptx-ribbon-transitions-section", inputs: ["slideIndex", "selectedTransition", "transitionDurationSec"], outputs: ["present", "toggleInspector", "transitionChange", "durationChange"] }, { kind: "component", type: RibbonAnimationsSectionComponent, selector: "pptx-ribbon-animations-section", inputs: ["slideIndex", "selectedElement"], outputs: ["present", "toggleInspector"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
71671
72181
  }
71672
72182
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: RibbonComponent, decorators: [{
71673
72183
  type: Component,
@@ -71678,6 +72188,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
71678
72188
  imports: [
71679
72189
  NgClass,
71680
72190
  TranslatePipe,
72191
+ LucideShare2,
72192
+ LucideChevronUp,
72193
+ LucideChevronDown,
71681
72194
  RibbonPrimaryRowComponent,
71682
72195
  RibbonFileSectionComponent,
71683
72196
  RibbonHomeSectionComponent,
@@ -71726,24 +72239,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
71726
72239
 
71727
72240
  <!-- ── Tab bar ───────────────────────────────────────────────────── -->
71728
72241
  <div class="flex items-center border-b border-border/60 px-1">
71729
- @for (t of tabs; track t.id) {
71730
- <button
71731
- type="button"
71732
- (click)="activeTab.set(t.id)"
71733
- class="relative whitespace-nowrap px-3.5 py-2 text-[12px] font-medium transition-colors"
71734
- [ngClass]="
71735
- activeTab() === t.id
71736
- ? 'text-foreground after:absolute after:-bottom-px after:left-0 after:right-0 after:h-[2.5px] after:bg-primary'
71737
- : 'text-muted-foreground hover:bg-accent/30 hover:text-foreground'
71738
- "
71739
- >
71740
- {{ t.labelKey | translate }}
71741
- </button>
71742
- }
71743
- <div class="flex-1"></div>
72242
+ <!-- Scrollable tab strip: on narrow widths the tabs scroll instead of
72243
+ clipping (mirrors React's max-md:overflow-x-auto scrollbar-none),
72244
+ while the Record/Share actions and collapse toggle stay pinned. -->
72245
+ <div class="flex min-w-0 flex-1 items-center overflow-x-auto pptx-scrollbar-none">
72246
+ @for (t of tabs; track t.id) {
72247
+ <button
72248
+ type="button"
72249
+ (click)="activeTab.set(t.id)"
72250
+ class="relative whitespace-nowrap px-3.5 py-2 text-[12px] font-medium transition-colors"
72251
+ [ngClass]="
72252
+ activeTab() === t.id
72253
+ ? 'text-foreground after:absolute after:-bottom-px after:left-0 after:right-0 after:h-[2.5px] after:bg-primary'
72254
+ : 'text-muted-foreground hover:bg-accent/30 hover:text-foreground'
72255
+ "
72256
+ >
72257
+ {{ t.labelKey | translate }}
72258
+ </button>
72259
+ }
72260
+ </div>
71744
72261
 
71745
72262
  <!-- Tab-row right actions (Record + Share), mirroring React's TabRowActions -->
71746
- <div class="flex items-center gap-1 pr-1">
72263
+ <div class="flex shrink-0 items-center gap-1 pr-1">
71747
72264
  @if (canEdit()) {
71748
72265
  <button
71749
72266
  type="button"
@@ -71772,7 +72289,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
71772
72289
  [attr.aria-label]="'pptx.toolbar.share' | translate"
71773
72290
  (click)="share.emit()"
71774
72291
  >
71775
-
72292
+ <svg lucideShare2 class="h-3.5 w-3.5"></svg>
71776
72293
  <span>{{
71777
72294
  collabConnected()
71778
72295
  ? ('pptx.toolbar.sharingCount' | translate: { count: connectedCount() })
@@ -71783,7 +72300,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
71783
72300
 
71784
72301
  <button
71785
72302
  type="button"
71786
- class="mr-1 rounded px-2 py-1 text-[11px] text-muted-foreground transition-colors hover:text-foreground"
72303
+ class="mr-1 shrink-0 rounded px-2 py-1 text-[11px] text-muted-foreground transition-colors hover:text-foreground"
71787
72304
  [attr.aria-pressed]="!ribbonExpanded()"
71788
72305
  [title]="
71789
72306
  (ribbonExpanded() ? 'pptx.ribbon.collapseRibbon' : 'pptx.ribbon.expandRibbon')
@@ -71791,7 +72308,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
71791
72308
  "
71792
72309
  (click)="ribbonExpanded.set(!ribbonExpanded())"
71793
72310
  >
71794
- {{ ribbonExpanded() ? '▴' : '▾' }}
72311
+ @if (ribbonExpanded()) {
72312
+ <svg lucideChevronUp class="h-3.5 w-3.5"></svg>
72313
+ } @else {
72314
+ <svg lucideChevronDown class="h-3.5 w-3.5"></svg>
72315
+ }
71795
72316
  </button>
71796
72317
  </div>
71797
72318
 
@@ -72068,7 +72589,11 @@ class SelectionPaneComponent {
72068
72589
  "
72069
72590
  (click)="toggleHidden.emit(el.id)"
72070
72591
  >
72071
- {{ el.hidden ? '🙈' : '👁' }}
72592
+ @if (el.hidden) {
72593
+ <svg lucideEyeOff class="h-3.5 w-3.5"></svg>
72594
+ } @else {
72595
+ <svg lucideEye class="h-3.5 w-3.5"></svg>
72596
+ }
72072
72597
  </button>
72073
72598
  <button
72074
72599
  type="button"
@@ -72077,7 +72602,7 @@ class SelectionPaneComponent {
72077
72602
  [title]="'pptx.arrange.bringForward' | translate"
72078
72603
  (click)="bringForward.emit(el.id)"
72079
72604
  >
72080
-
72605
+ <svg lucideArrowUp class="h-3.5 w-3.5"></svg>
72081
72606
  </button>
72082
72607
  <button
72083
72608
  type="button"
@@ -72086,7 +72611,7 @@ class SelectionPaneComponent {
72086
72611
  [title]="'pptx.arrange.sendBackward' | translate"
72087
72612
  (click)="sendBackward.emit(el.id)"
72088
72613
  >
72089
-
72614
+ <svg lucideArrowDown class="h-3.5 w-3.5"></svg>
72090
72615
  </button>
72091
72616
  </div>
72092
72617
  </li>
@@ -72096,11 +72621,11 @@ class SelectionPaneComponent {
72096
72621
  <p class="pptx-ng-sel-pane__empty">{{ 'pptx.selectionPane.empty' | translate }}</p>
72097
72622
  }
72098
72623
  </aside>
72099
- `, isInline: true, styles: [":host{display:block;height:100%;width:100%}.pptx-ng-sel-pane{display:flex;flex-direction:column;min-height:0;height:100%;width:100%;background:var(--pptx-card, #111827);color:var(--pptx-foreground, #f3f4f6);border-left:1px solid var(--pptx-border, #374151);font-family:system-ui,sans-serif}.pptx-ng-sel-pane__header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--pptx-border, #374151);flex-shrink:0}.pptx-ng-sel-pane__title{margin:0;font-size:14px;font-weight:600}.pptx-ng-sel-pane__count{font-size:12px;color:var(--pptx-muted-foreground, #9ca3af)}.pptx-ng-sel-pane__list{list-style:none;margin:0;padding:8px;overflow-y:auto;flex:1 1 auto;min-height:0}.pptx-ng-sel-pane__row{display:flex;align-items:center;gap:6px;padding:6px 8px;border-radius:6px;border:1px solid transparent;cursor:pointer;margin-bottom:2px;transition:background .1s;-webkit-user-select:none;user-select:none}.pptx-ng-sel-pane__row:hover{background:var(--pptx-accent, #1f2937)}.pptx-ng-sel-pane__row--selected{border-color:var(--pptx-primary, #6366f1);background:color-mix(in srgb,var(--pptx-primary, #6366f1) 15%,transparent)}.pptx-ng-sel-pane__row--hidden{opacity:.5}.pptx-ng-sel-pane__icon{flex-shrink:0;width:20px;text-align:center;font-size:12px;color:var(--pptx-muted-foreground, #9ca3af)}.pptx-ng-sel-pane__label{flex:1 1 auto;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.pptx-ng-sel-pane__actions{display:flex;gap:2px;flex-shrink:0}.pptx-ng-sel-pane__btn{background:transparent;border:1px solid var(--pptx-border, #374151);color:inherit;border-radius:4px;padding:2px 5px;font-size:11px;cursor:pointer;line-height:1.2}.pptx-ng-sel-pane__btn:hover{background:var(--pptx-accent, #1f2937)}.pptx-ng-sel-pane__empty{padding:16px;font-size:13px;color:var(--pptx-muted-foreground, #9ca3af)}\n"], dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
72624
+ `, isInline: true, styles: [":host{display:block;height:100%;width:100%}.pptx-ng-sel-pane{display:flex;flex-direction:column;min-height:0;height:100%;width:100%;background:var(--pptx-card, #111827);color:var(--pptx-foreground, #f3f4f6);border-left:1px solid var(--pptx-border, #374151);font-family:system-ui,sans-serif}.pptx-ng-sel-pane__header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--pptx-border, #374151);flex-shrink:0}.pptx-ng-sel-pane__title{margin:0;font-size:14px;font-weight:600}.pptx-ng-sel-pane__count{font-size:12px;color:var(--pptx-muted-foreground, #9ca3af)}.pptx-ng-sel-pane__list{list-style:none;margin:0;padding:8px;overflow-y:auto;flex:1 1 auto;min-height:0}.pptx-ng-sel-pane__row{display:flex;align-items:center;gap:6px;padding:6px 8px;border-radius:6px;border:1px solid transparent;cursor:pointer;margin-bottom:2px;transition:background .1s;-webkit-user-select:none;user-select:none}.pptx-ng-sel-pane__row:hover{background:var(--pptx-accent, #1f2937)}.pptx-ng-sel-pane__row--selected{border-color:var(--pptx-primary, #6366f1);background:color-mix(in srgb,var(--pptx-primary, #6366f1) 15%,transparent)}.pptx-ng-sel-pane__row--hidden{opacity:.5}.pptx-ng-sel-pane__icon{flex-shrink:0;width:20px;text-align:center;font-size:12px;color:var(--pptx-muted-foreground, #9ca3af)}.pptx-ng-sel-pane__label{flex:1 1 auto;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.pptx-ng-sel-pane__actions{display:flex;gap:2px;flex-shrink:0}.pptx-ng-sel-pane__btn{background:transparent;border:1px solid var(--pptx-border, #374151);color:inherit;border-radius:4px;padding:2px 5px;font-size:11px;cursor:pointer;line-height:1.2}.pptx-ng-sel-pane__btn:hover{background:var(--pptx-accent, #1f2937)}.pptx-ng-sel-pane__empty{padding:16px;font-size:13px;color:var(--pptx-muted-foreground, #9ca3af)}\n"], dependencies: [{ kind: "component", type: LucideEye, selector: "svg[lucideEye]" }, { kind: "component", type: LucideEyeOff, selector: "svg[lucideEyeOff]" }, { kind: "component", type: LucideArrowUp, selector: "svg[lucideArrowUp]" }, { kind: "component", type: LucideArrowDown, selector: "svg[lucideArrowDown]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
72100
72625
  }
72101
72626
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SelectionPaneComponent, decorators: [{
72102
72627
  type: Component,
72103
- args: [{ selector: 'pptx-selection-pane', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslatePipe], template: `
72628
+ args: [{ selector: 'pptx-selection-pane', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslatePipe, LucideEye, LucideEyeOff, LucideArrowUp, LucideArrowDown], template: `
72104
72629
  <aside class="pptx-ng-sel-pane" [attr.aria-label]="'pptx.selectionPane.title' | translate">
72105
72630
  <header class="pptx-ng-sel-pane__header">
72106
72631
  <h2 class="pptx-ng-sel-pane__title">{{ 'pptx.selectionPane.title' | translate }}</h2>
@@ -72139,7 +72664,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
72139
72664
  "
72140
72665
  (click)="toggleHidden.emit(el.id)"
72141
72666
  >
72142
- {{ el.hidden ? '🙈' : '👁' }}
72667
+ @if (el.hidden) {
72668
+ <svg lucideEyeOff class="h-3.5 w-3.5"></svg>
72669
+ } @else {
72670
+ <svg lucideEye class="h-3.5 w-3.5"></svg>
72671
+ }
72143
72672
  </button>
72144
72673
  <button
72145
72674
  type="button"
@@ -72148,7 +72677,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
72148
72677
  [title]="'pptx.arrange.bringForward' | translate"
72149
72678
  (click)="bringForward.emit(el.id)"
72150
72679
  >
72151
-
72680
+ <svg lucideArrowUp class="h-3.5 w-3.5"></svg>
72152
72681
  </button>
72153
72682
  <button
72154
72683
  type="button"
@@ -72157,7 +72686,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
72157
72686
  [title]="'pptx.arrange.sendBackward' | translate"
72158
72687
  (click)="sendBackward.emit(el.id)"
72159
72688
  >
72160
-
72689
+ <svg lucideArrowDown class="h-3.5 w-3.5"></svg>
72161
72690
  </button>
72162
72691
  </div>
72163
72692
  </li>
@@ -73060,7 +73589,7 @@ class SlideSorterOverlayComponent {
73060
73589
  </div>
73061
73590
  </div>
73062
73591
  </div>
73063
- `, isInline: true, styles: [":host{display:contents}.pptx-ng-sorter-backdrop{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;background:#000000b3;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.pptx-ng-sorter-panel{display:flex;flex-direction:column;width:min(96vw,1200px);max-height:90vh;border-radius:.5rem;background:#1a1a1a;color:#e5e5e5;box-shadow:0 24px 64px #0009;overflow:hidden}.pptx-ng-sorter-header{display:flex;align-items:center;gap:.75rem;padding:.75rem 1.25rem;border-bottom:1px solid rgba(255,255,255,.1);flex-shrink:0}.pptx-ng-sorter-title{margin:0;font-size:.875rem;font-weight:500}.pptx-ng-sorter-count{font-size:.75rem;color:#ffffff80;flex:1}.pptx-ng-sorter-close{display:flex;align-items:center;justify-content:center;width:44px;height:44px;min-width:44px;min-height:44px;padding:0;border:none;border-radius:50%;background:#ffffff1a;color:#e5e5e5;cursor:pointer;transition:background .15s;flex-shrink:0;touch-action:manipulation}.pptx-ng-sorter-close:hover{background:#fff3}.pptx-ng-sorter-grid-scroll{flex:1;overflow-y:auto;padding:1.25rem}.pptx-ng-sorter-grid{display:grid;gap:1rem}.pptx-ng-sorter-cell{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:.5rem;border:2px solid transparent;border-radius:.375rem;background:transparent;cursor:pointer;transition:border-color .15s,background .15s;color:inherit}.pptx-ng-sorter-cell:hover{background:#ffffff0f;border-color:#fff3}.pptx-ng-sorter-cell.is-active{border-color:#3b82f6;background:#3b82f61a}.pptx-ng-sorter-cell.is-hidden{opacity:.4}.pptx-ng-sorter-thumb-clip{overflow:hidden;border-radius:2px}.pptx-ng-sorter-thumb-clip ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}.pptx-ng-sorter-index{font-size:.6875rem;color:#ffffff8c;-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
73592
+ `, isInline: true, styles: [":host{display:contents}.pptx-ng-sorter-backdrop{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;background:#000000b3;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.pptx-ng-sorter-panel{display:flex;flex-direction:column;width:min(96vw,1200px);max-height:90vh;border-radius:.5rem;background:#1a1a1a;color:#e5e5e5;box-shadow:0 24px 64px #0009;overflow:hidden}.pptx-ng-sorter-header{display:flex;align-items:center;gap:.75rem;padding:.75rem 1.25rem;border-bottom:1px solid rgba(255,255,255,.1);flex-shrink:0}.pptx-ng-sorter-title{margin:0;font-size:.875rem;font-weight:500}.pptx-ng-sorter-count{font-size:.75rem;color:#ffffff80;flex:1}.pptx-ng-sorter-close{display:flex;align-items:center;justify-content:center;width:44px;height:44px;min-width:44px;min-height:44px;padding:0;border:none;border-radius:50%;background:#ffffff1a;color:#e5e5e5;cursor:pointer;transition:background .15s;flex-shrink:0;touch-action:manipulation}.pptx-ng-sorter-close:hover{background:#fff3}.pptx-ng-sorter-grid-scroll{flex:1;overflow-y:auto;padding:1.25rem}.pptx-ng-sorter-grid{display:grid;gap:1rem}.pptx-ng-sorter-cell{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:.5rem;border:2px solid transparent;border-radius:.375rem;background:transparent;cursor:pointer;transition:border-color .15s,background .15s;color:inherit}.pptx-ng-sorter-cell:hover{background:#ffffff0f;border-color:#fff3}.pptx-ng-sorter-cell.is-active{border-color:#3b82f6;background:#3b82f61a}.pptx-ng-sorter-cell.is-hidden{opacity:.4}.pptx-ng-sorter-thumb-clip{overflow:hidden;border-radius:2px}.pptx-ng-sorter-thumb-clip ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}.pptx-ng-sorter-index{font-size:.6875rem;color:#ffffff8c;-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
73064
73593
  }
73065
73594
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SlideSorterOverlayComponent, decorators: [{
73066
73595
  type: Component,
@@ -73256,7 +73785,7 @@ class SlidesPanelComponent {
73256
73785
  [attr.aria-label]="'pptx.arrange.duplicate' | translate"
73257
73786
  (click)="onDuplicate(i)"
73258
73787
  >
73259
-
73788
+ <svg lucideCopy class="h-3.5 w-3.5"></svg>
73260
73789
  </button>
73261
73790
  <button
73262
73791
  type="button"
@@ -73266,7 +73795,7 @@ class SlidesPanelComponent {
73266
73795
  [disabled]="editor.slides().length <= 1"
73267
73796
  (click)="onDelete(i)"
73268
73797
  >
73269
-
73798
+ <svg lucideTrash2 class="h-3.5 w-3.5"></svg>
73270
73799
  </button>
73271
73800
  <button
73272
73801
  type="button"
@@ -73276,7 +73805,7 @@ class SlidesPanelComponent {
73276
73805
  [disabled]="i === 0"
73277
73806
  (click)="onMoveUp(i)"
73278
73807
  >
73279
-
73808
+ <svg lucideArrowUp class="h-3.5 w-3.5"></svg>
73280
73809
  </button>
73281
73810
  <button
73282
73811
  type="button"
@@ -73286,7 +73815,7 @@ class SlidesPanelComponent {
73286
73815
  [disabled]="i === editor.slides().length - 1"
73287
73816
  (click)="onMoveDown(i)"
73288
73817
  >
73289
-
73818
+ <svg lucideArrowDown class="h-3.5 w-3.5"></svg>
73290
73819
  </button>
73291
73820
  </div>
73292
73821
  </div>
@@ -73301,15 +73830,24 @@ class SlidesPanelComponent {
73301
73830
  [attr.aria-label]="'pptx.sections.addSlide' | translate"
73302
73831
  (click)="onAddSlide()"
73303
73832
  >
73304
- {{ 'pptx.sections.addSlide' | translate }}
73833
+ <svg lucidePlus class="h-3.5 w-3.5"></svg> {{ 'pptx.sections.addSlide' | translate }}
73305
73834
  </button>
73306
73835
  </footer>
73307
73836
  </div>
73308
- `, isInline: true, styles: [":host{display:flex;flex-direction:column;height:100%;overflow:hidden}.pptx-ng-spanel{display:flex;flex-direction:column;height:100%;background:#1e1e1e;color:#e5e5e5;border-right:1px solid rgba(255,255,255,.08);overflow:hidden}.pptx-ng-spanel-scroll{flex:1;overflow-y:auto;padding:.5rem .375rem;display:flex;flex-direction:column;gap:.375rem}.pptx-ng-spanel-card{position:relative;border-radius:.375rem;border:2px solid transparent;background:transparent;transition:border-color .15s,background .15s}.pptx-ng-spanel-card:hover,.pptx-ng-spanel-card:focus-within{background:#ffffff0d;border-color:#ffffff26}.pptx-ng-spanel-card.is-active{border-color:#3b82f6;background:#3b82f61a}.pptx-ng-spanel-thumb-btn{display:block;width:100%;padding:.375rem .375rem 0;border:none;background:transparent;cursor:pointer;color:inherit;line-height:0}.pptx-ng-spanel-thumb-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;border-radius:.25rem}.pptx-ng-spanel-clip{overflow:hidden;border-radius:2px}.pptx-ng-spanel-clip ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}.pptx-ng-spanel-num{display:block;text-align:center;font-size:.625rem;line-height:1.6;color:#ffffff73;-webkit-user-select:none;user-select:none;padding-bottom:.25rem}.pptx-ng-spanel-actions{position:absolute;top:.25rem;right:.25rem;display:flex;flex-direction:column;gap:.125rem;opacity:0;pointer-events:none;transition:opacity .12s}.pptx-ng-spanel-card:hover .pptx-ng-spanel-actions,.pptx-ng-spanel-card:focus-within .pptx-ng-spanel-actions{opacity:1;pointer-events:auto}.pptx-ng-spanel-action{display:flex;align-items:center;justify-content:center;width:1.375rem;height:1.375rem;padding:0;border:none;border-radius:.25rem;background:#1e1e1ed9;color:#e5e5e5;font-size:.6875rem;cursor:pointer;transition:background .12s;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.pptx-ng-spanel-action:hover:not([disabled]){background:#3b82f6bf}.pptx-ng-spanel-action[disabled]{opacity:.3;cursor:not-allowed}.pptx-ng-spanel-footer{flex-shrink:0;padding:.5rem .375rem;border-top:1px solid rgba(255,255,255,.08)}.pptx-ng-spanel-add{display:block;width:100%;padding:.4375rem 0;border:1px dashed rgba(255,255,255,.2);border-radius:.375rem;background:transparent;color:#fff9;font-size:.75rem;cursor:pointer;transition:background .15s,border-color .15s,color .15s}.pptx-ng-spanel-add:hover{background:#3b82f626;border-color:#3b82f6;color:#e5e5e5}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
73837
+ `, isInline: true, styles: [":host{display:flex;flex-direction:column;height:100%;overflow:hidden}.pptx-ng-spanel{display:flex;flex-direction:column;height:100%;background:#1e1e1e;color:#e5e5e5;border-right:1px solid rgba(255,255,255,.08);overflow:hidden}.pptx-ng-spanel-scroll{flex:1;overflow-y:auto;padding:.5rem .375rem;display:flex;flex-direction:column;gap:.375rem}.pptx-ng-spanel-card{position:relative;border-radius:.375rem;border:2px solid transparent;background:transparent;transition:border-color .15s,background .15s}.pptx-ng-spanel-card:hover,.pptx-ng-spanel-card:focus-within{background:#ffffff0d;border-color:#ffffff26}.pptx-ng-spanel-card.is-active{border-color:#3b82f6;background:#3b82f61a}.pptx-ng-spanel-thumb-btn{display:block;width:100%;padding:.375rem .375rem 0;border:none;background:transparent;cursor:pointer;color:inherit;line-height:0}.pptx-ng-spanel-thumb-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;border-radius:.25rem}.pptx-ng-spanel-clip{overflow:hidden;border-radius:2px}.pptx-ng-spanel-clip ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}.pptx-ng-spanel-num{display:block;text-align:center;font-size:.625rem;line-height:1.6;color:#ffffff73;-webkit-user-select:none;user-select:none;padding-bottom:.25rem}.pptx-ng-spanel-actions{position:absolute;top:.25rem;right:.25rem;display:flex;flex-direction:column;gap:.125rem;opacity:0;pointer-events:none;transition:opacity .12s}.pptx-ng-spanel-card:hover .pptx-ng-spanel-actions,.pptx-ng-spanel-card:focus-within .pptx-ng-spanel-actions{opacity:1;pointer-events:auto}.pptx-ng-spanel-action{display:flex;align-items:center;justify-content:center;width:1.375rem;height:1.375rem;padding:0;border:none;border-radius:.25rem;background:#1e1e1ed9;color:#e5e5e5;font-size:.6875rem;cursor:pointer;transition:background .12s;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.pptx-ng-spanel-action:hover:not([disabled]){background:#3b82f6bf}.pptx-ng-spanel-action[disabled]{opacity:.3;cursor:not-allowed}.pptx-ng-spanel-footer{flex-shrink:0;padding:.5rem .375rem;border-top:1px solid rgba(255,255,255,.08)}.pptx-ng-spanel-add{display:block;width:100%;padding:.4375rem 0;border:1px dashed rgba(255,255,255,.2);border-radius:.375rem;background:transparent;color:#fff9;font-size:.75rem;cursor:pointer;transition:background .15s,border-color .15s,color .15s}.pptx-ng-spanel-add:hover{background:#3b82f626;border-color:#3b82f6;color:#e5e5e5}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: LucideCopy, selector: "svg[lucideCopy]" }, { kind: "component", type: LucideTrash2, selector: "svg[lucideTrash2]" }, { kind: "component", type: LucideArrowUp, selector: "svg[lucideArrowUp]" }, { kind: "component", type: LucideArrowDown, selector: "svg[lucideArrowDown]" }, { kind: "component", type: LucidePlus, selector: "svg[lucidePlus]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
73309
73838
  }
73310
73839
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SlidesPanelComponent, decorators: [{
73311
73840
  type: Component,
73312
- args: [{ selector: 'pptx-slides-panel', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgStyle, SlideCanvasComponent, TranslatePipe], template: `
73841
+ args: [{ selector: 'pptx-slides-panel', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
73842
+ NgStyle,
73843
+ SlideCanvasComponent,
73844
+ TranslatePipe,
73845
+ LucideCopy,
73846
+ LucideTrash2,
73847
+ LucideArrowUp,
73848
+ LucideArrowDown,
73849
+ LucidePlus,
73850
+ ], template: `
73313
73851
  <div class="pptx-ng-spanel">
73314
73852
  <!-- Scrollable slide list -->
73315
73853
  <div
@@ -73363,7 +73901,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
73363
73901
  [attr.aria-label]="'pptx.arrange.duplicate' | translate"
73364
73902
  (click)="onDuplicate(i)"
73365
73903
  >
73366
-
73904
+ <svg lucideCopy class="h-3.5 w-3.5"></svg>
73367
73905
  </button>
73368
73906
  <button
73369
73907
  type="button"
@@ -73373,7 +73911,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
73373
73911
  [disabled]="editor.slides().length <= 1"
73374
73912
  (click)="onDelete(i)"
73375
73913
  >
73376
-
73914
+ <svg lucideTrash2 class="h-3.5 w-3.5"></svg>
73377
73915
  </button>
73378
73916
  <button
73379
73917
  type="button"
@@ -73383,7 +73921,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
73383
73921
  [disabled]="i === 0"
73384
73922
  (click)="onMoveUp(i)"
73385
73923
  >
73386
-
73924
+ <svg lucideArrowUp class="h-3.5 w-3.5"></svg>
73387
73925
  </button>
73388
73926
  <button
73389
73927
  type="button"
@@ -73393,7 +73931,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
73393
73931
  [disabled]="i === editor.slides().length - 1"
73394
73932
  (click)="onMoveDown(i)"
73395
73933
  >
73396
-
73934
+ <svg lucideArrowDown class="h-3.5 w-3.5"></svg>
73397
73935
  </button>
73398
73936
  </div>
73399
73937
  </div>
@@ -73408,7 +73946,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
73408
73946
  [attr.aria-label]="'pptx.sections.addSlide' | translate"
73409
73947
  (click)="onAddSlide()"
73410
73948
  >
73411
- {{ 'pptx.sections.addSlide' | translate }}
73949
+ <svg lucidePlus class="h-3.5 w-3.5"></svg> {{ 'pptx.sections.addSlide' | translate }}
73412
73950
  </button>
73413
73951
  </footer>
73414
73952
  </div>
@@ -73529,7 +74067,7 @@ class StatusBarComponent {
73529
74067
  [attr.aria-label]="'pptx.statusBar.toggleNotes' | translate"
73530
74068
  (click)="toggleNotes.emit()"
73531
74069
  >
73532
- <span aria-hidden="true">🗒</span>
74070
+ <svg lucideStickyNote class="h-3 w-3"></svg>
73533
74071
  <span>{{ 'pptx.notes.title' | translate }}</span>
73534
74072
  </button>
73535
74073
 
@@ -73545,7 +74083,7 @@ class StatusBarComponent {
73545
74083
  [attr.aria-label]="'pptx.statusBar.normalView' | translate"
73546
74084
  (click)="normalView.emit()"
73547
74085
  >
73548
- <span aria-hidden="true">🖵</span>
74086
+ <svg lucideMonitor class="h-3.5 w-3.5"></svg>
73549
74087
  </button>
73550
74088
  <button
73551
74089
  type="button"
@@ -73555,7 +74093,7 @@ class StatusBarComponent {
73555
74093
  [attr.aria-label]="'pptx.statusBar.slideSorter' | translate"
73556
74094
  (click)="openSorter.emit()"
73557
74095
  >
73558
- <span aria-hidden="true">▦</span>
74096
+ <svg lucideColumns2 class="h-3.5 w-3.5"></svg>
73559
74097
  </button>
73560
74098
  <button
73561
74099
  type="button"
@@ -73566,7 +74104,7 @@ class StatusBarComponent {
73566
74104
  [attr.aria-label]="'pptx.statusBar.slideShow' | translate"
73567
74105
  (click)="slideShow.emit()"
73568
74106
  >
73569
- <span aria-hidden="true">▶</span>
74107
+ <svg lucidePresentation class="h-3.5 w-3.5"></svg>
73570
74108
  </button>
73571
74109
  </div>
73572
74110
 
@@ -73580,7 +74118,7 @@ class StatusBarComponent {
73580
74118
  [attr.aria-label]="'pptx.statusBar.zoomOut' | translate"
73581
74119
  (click)="zoomOut.emit()"
73582
74120
  >
73583
- <span aria-hidden="true">−</span>
74121
+ <svg lucideMinus class="h-3 w-3"></svg>
73584
74122
  </button>
73585
74123
  <button
73586
74124
  type="button"
@@ -73597,11 +74135,11 @@ class StatusBarComponent {
73597
74135
  [attr.aria-label]="'pptx.statusBar.zoomIn' | translate"
73598
74136
  (click)="zoomIn.emit()"
73599
74137
  >
73600
- <span aria-hidden="true">+</span>
74138
+ <svg lucidePlus class="h-3 w-3"></svg>
73601
74139
  </button>
73602
74140
  </div>
73603
74141
  </div>
73604
- `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
74142
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: LucideStickyNote, selector: "svg[lucideStickyNote]" }, { kind: "component", type: LucideMonitor, selector: "svg[lucideMonitor]" }, { kind: "component", type: LucideColumns2, selector: "svg[lucideColumns2], svg[lucideColumns]" }, { kind: "component", type: LucidePresentation, selector: "svg[lucidePresentation]" }, { kind: "component", type: LucideMinus, selector: "svg[lucideMinus]" }, { kind: "component", type: LucidePlus, selector: "svg[lucidePlus]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
73605
74143
  }
73606
74144
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: StatusBarComponent, decorators: [{
73607
74145
  type: Component,
@@ -73609,7 +74147,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
73609
74147
  selector: 'pptx-status-bar',
73610
74148
  standalone: true,
73611
74149
  changeDetection: ChangeDetectionStrategy.OnPush,
73612
- imports: [NgClass, TranslatePipe],
74150
+ imports: [
74151
+ NgClass,
74152
+ TranslatePipe,
74153
+ LucideStickyNote,
74154
+ LucideMonitor,
74155
+ LucideColumns2,
74156
+ LucidePresentation,
74157
+ LucideMinus,
74158
+ LucidePlus,
74159
+ ],
73613
74160
  template: `
73614
74161
  <div
73615
74162
  class="flex w-full items-center gap-1 border-t border-border bg-secondary/50 px-2 py-0.5 text-[10px] text-muted-foreground"
@@ -73644,7 +74191,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
73644
74191
  [attr.aria-label]="'pptx.statusBar.toggleNotes' | translate"
73645
74192
  (click)="toggleNotes.emit()"
73646
74193
  >
73647
- <span aria-hidden="true">🗒</span>
74194
+ <svg lucideStickyNote class="h-3 w-3"></svg>
73648
74195
  <span>{{ 'pptx.notes.title' | translate }}</span>
73649
74196
  </button>
73650
74197
 
@@ -73660,7 +74207,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
73660
74207
  [attr.aria-label]="'pptx.statusBar.normalView' | translate"
73661
74208
  (click)="normalView.emit()"
73662
74209
  >
73663
- <span aria-hidden="true">🖵</span>
74210
+ <svg lucideMonitor class="h-3.5 w-3.5"></svg>
73664
74211
  </button>
73665
74212
  <button
73666
74213
  type="button"
@@ -73670,7 +74217,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
73670
74217
  [attr.aria-label]="'pptx.statusBar.slideSorter' | translate"
73671
74218
  (click)="openSorter.emit()"
73672
74219
  >
73673
- <span aria-hidden="true">▦</span>
74220
+ <svg lucideColumns2 class="h-3.5 w-3.5"></svg>
73674
74221
  </button>
73675
74222
  <button
73676
74223
  type="button"
@@ -73681,7 +74228,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
73681
74228
  [attr.aria-label]="'pptx.statusBar.slideShow' | translate"
73682
74229
  (click)="slideShow.emit()"
73683
74230
  >
73684
- <span aria-hidden="true">▶</span>
74231
+ <svg lucidePresentation class="h-3.5 w-3.5"></svg>
73685
74232
  </button>
73686
74233
  </div>
73687
74234
 
@@ -73695,7 +74242,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
73695
74242
  [attr.aria-label]="'pptx.statusBar.zoomOut' | translate"
73696
74243
  (click)="zoomOut.emit()"
73697
74244
  >
73698
- <span aria-hidden="true">−</span>
74245
+ <svg lucideMinus class="h-3 w-3"></svg>
73699
74246
  </button>
73700
74247
  <button
73701
74248
  type="button"
@@ -73712,7 +74259,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
73712
74259
  [attr.aria-label]="'pptx.statusBar.zoomIn' | translate"
73713
74260
  (click)="zoomIn.emit()"
73714
74261
  >
73715
- <span aria-hidden="true">+</span>
74262
+ <svg lucidePlus class="h-3 w-3"></svg>
73716
74263
  </button>
73717
74264
  </div>
73718
74265
  </div>
@@ -73930,7 +74477,7 @@ class ThemeGalleryComponent {
73930
74477
  (click)="close.emit()"
73931
74478
  aria-label="Close theme gallery"
73932
74479
  >
73933
-
74480
+ <svg lucideX class="h-4 w-4"></svg>
73934
74481
  </button>
73935
74482
  </div>
73936
74483
 
@@ -73980,8 +74527,8 @@ class ThemeGalleryComponent {
73980
74527
  <span
73981
74528
  class="absolute right-1 top-1 flex h-4 w-4 items-center justify-center rounded-full bg-primary text-[10px] font-bold text-white"
73982
74529
  aria-label="Selected theme"
73983
- >✓</span
73984
- >
74530
+ ><svg lucideCheck class="h-2.5 w-2.5"></svg
74531
+ ></span>
73985
74532
  }
73986
74533
  </button>
73987
74534
  }
@@ -74002,7 +74549,7 @@ class ThemeGalleryComponent {
74002
74549
  </div>
74003
74550
  </div>
74004
74551
  }
74005
- `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
74552
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: LucideX, selector: "svg[lucideX]" }, { kind: "component", type: LucideCheck, selector: "svg[lucideCheck]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
74006
74553
  }
74007
74554
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: ThemeGalleryComponent, decorators: [{
74008
74555
  type: Component,
@@ -74010,7 +74557,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
74010
74557
  selector: 'pptx-theme-gallery',
74011
74558
  standalone: true,
74012
74559
  changeDetection: ChangeDetectionStrategy.OnPush,
74013
- imports: [NgClass],
74560
+ imports: [NgClass, LucideX, LucideCheck],
74014
74561
  template: `
74015
74562
  @if (open()) {
74016
74563
  <!-- Backdrop -->
@@ -74038,7 +74585,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
74038
74585
  (click)="close.emit()"
74039
74586
  aria-label="Close theme gallery"
74040
74587
  >
74041
-
74588
+ <svg lucideX class="h-4 w-4"></svg>
74042
74589
  </button>
74043
74590
  </div>
74044
74591
 
@@ -74088,8 +74635,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
74088
74635
  <span
74089
74636
  class="absolute right-1 top-1 flex h-4 w-4 items-center justify-center rounded-full bg-primary text-[10px] font-bold text-white"
74090
74637
  aria-label="Selected theme"
74091
- >✓</span
74092
- >
74638
+ ><svg lucideCheck class="h-2.5 w-2.5"></svg
74639
+ ></span>
74093
74640
  }
74094
74641
  </button>
74095
74642
  }
@@ -74266,7 +74813,7 @@ class TitleBarComponent {
74266
74813
  [attr.aria-label]="'pptx.titleBar.save' | translate"
74267
74814
  (click)="save.emit()"
74268
74815
  >
74269
- 💾
74816
+ <svg lucideSave class="h-3.5 w-3.5"></svg>
74270
74817
  </button>
74271
74818
  <button
74272
74819
  type="button"
@@ -74280,7 +74827,7 @@ class TitleBarComponent {
74280
74827
  [attr.aria-label]="'pptx.toolbar.undo' | translate"
74281
74828
  (click)="undo.emit()"
74282
74829
  >
74283
-
74830
+ <svg lucideUndo class="h-3.5 w-3.5"></svg>
74284
74831
  </button>
74285
74832
  <button
74286
74833
  type="button"
@@ -74294,7 +74841,7 @@ class TitleBarComponent {
74294
74841
  [attr.aria-label]="'pptx.toolbar.redo' | translate"
74295
74842
  (click)="redo.emit()"
74296
74843
  >
74297
-
74844
+ <svg lucideRedo class="h-3.5 w-3.5"></svg>
74298
74845
  </button>
74299
74846
 
74300
74847
  <div [class]="tb.separator"></div>
@@ -74319,7 +74866,9 @@ class TitleBarComponent {
74319
74866
  searchFocused() || findReplaceOpen() ? 'text-foreground bg-background' : ''
74320
74867
  "
74321
74868
  >
74322
- <span [class]="tb.searchIcon" aria-hidden="true">⌕</span>
74869
+ <span [class]="tb.searchIcon" aria-hidden="true"
74870
+ ><svg lucideSearch class="h-3.5 w-3.5"></svg
74871
+ ></span>
74323
74872
  <input
74324
74873
  type="text"
74325
74874
  [value]="searchQuery()"
@@ -74365,7 +74914,7 @@ class TitleBarComponent {
74365
74914
  class="flex w-full items-center gap-2 px-3 py-1.5 text-xs text-foreground hover:bg-accent transition-colors"
74366
74915
  (mousedown)="openFindReplace()"
74367
74916
  >
74368
- <span aria-hidden="true">⌕</span>
74917
+ <svg lucideSearch class="h-3.5 w-3.5"></svg>
74369
74918
  <span
74370
74919
  >{{ 'pptx.titleBar.searchContent' | translate }} &ldquo;{{
74371
74920
  searchQuery()
@@ -74381,7 +74930,7 @@ class TitleBarComponent {
74381
74930
 
74382
74931
  <span [class]="tb.rightSpacer"></span>
74383
74932
  </div>
74384
- `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
74933
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: LucideSave, selector: "svg[lucideSave]" }, { kind: "component", type: LucideUndo, selector: "svg[lucideUndo]" }, { kind: "component", type: LucideRedo, selector: "svg[lucideRedo]" }, { kind: "component", type: LucideSearch, selector: "svg[lucideSearch]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
74385
74934
  }
74386
74935
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TitleBarComponent, decorators: [{
74387
74936
  type: Component,
@@ -74389,7 +74938,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
74389
74938
  selector: 'pptx-title-bar',
74390
74939
  standalone: true,
74391
74940
  changeDetection: ChangeDetectionStrategy.OnPush,
74392
- imports: [NgClass, TranslatePipe],
74941
+ imports: [NgClass, TranslatePipe, LucideSave, LucideUndo, LucideRedo, LucideSearch],
74393
74942
  template: `
74394
74943
  <div [class]="tb.container" data-pptx-title-bar>
74395
74944
  <span [class]="tb.logo" aria-hidden="true">P</span>
@@ -74427,7 +74976,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
74427
74976
  [attr.aria-label]="'pptx.titleBar.save' | translate"
74428
74977
  (click)="save.emit()"
74429
74978
  >
74430
- 💾
74979
+ <svg lucideSave class="h-3.5 w-3.5"></svg>
74431
74980
  </button>
74432
74981
  <button
74433
74982
  type="button"
@@ -74441,7 +74990,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
74441
74990
  [attr.aria-label]="'pptx.toolbar.undo' | translate"
74442
74991
  (click)="undo.emit()"
74443
74992
  >
74444
-
74993
+ <svg lucideUndo class="h-3.5 w-3.5"></svg>
74445
74994
  </button>
74446
74995
  <button
74447
74996
  type="button"
@@ -74455,7 +75004,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
74455
75004
  [attr.aria-label]="'pptx.toolbar.redo' | translate"
74456
75005
  (click)="redo.emit()"
74457
75006
  >
74458
-
75007
+ <svg lucideRedo class="h-3.5 w-3.5"></svg>
74459
75008
  </button>
74460
75009
 
74461
75010
  <div [class]="tb.separator"></div>
@@ -74480,7 +75029,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
74480
75029
  searchFocused() || findReplaceOpen() ? 'text-foreground bg-background' : ''
74481
75030
  "
74482
75031
  >
74483
- <span [class]="tb.searchIcon" aria-hidden="true">⌕</span>
75032
+ <span [class]="tb.searchIcon" aria-hidden="true"
75033
+ ><svg lucideSearch class="h-3.5 w-3.5"></svg
75034
+ ></span>
74484
75035
  <input
74485
75036
  type="text"
74486
75037
  [value]="searchQuery()"
@@ -74526,7 +75077,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
74526
75077
  class="flex w-full items-center gap-2 px-3 py-1.5 text-xs text-foreground hover:bg-accent transition-colors"
74527
75078
  (mousedown)="openFindReplace()"
74528
75079
  >
74529
- <span aria-hidden="true">⌕</span>
75080
+ <svg lucideSearch class="h-3.5 w-3.5"></svg>
74530
75081
  <span
74531
75082
  >{{ 'pptx.titleBar.searchContent' | translate }} &ldquo;{{
74532
75083
  searchQuery()
@@ -75562,9 +76113,18 @@ class ViewerCustomShowsService {
75562
76113
  ...(ngDevMode ? [{ debugName: "activeId" }] : /* istanbul ignore next */ []));
75563
76114
  /** Active-slide index of the host viewer (bound from the component). */
75564
76115
  activeSlideIndex = () => 0;
75565
- /** Wire the host's active-slide-index accessor (called once from the constructor). */
75566
- bind(activeSlideIndex) {
75567
- this.activeSlideIndex = activeSlideIndex;
76116
+ /**
76117
+ * The viewer's LIVE (edited) slides accessor, bound from the component. The
76118
+ * presentation overlay must reflect in-session edits (inserted media, moved
76119
+ * shapes, etc.), so it reads these rather than the pristine loaded deck
76120
+ * (`loader.slides()`), mirroring React/Vue where present mode shows the
76121
+ * working set. Defaults to the loaded slides until bound.
76122
+ */
76123
+ liveSlides = () => this.loader.slides();
76124
+ /** Wire the host's active-slide-index + live-slides accessors (called once from the constructor). */
76125
+ bind(accessors) {
76126
+ this.activeSlideIndex = accessors.activeSlideIndex;
76127
+ this.liveSlides = accessors.liveSlides;
75568
76128
  }
75569
76129
  /** Custom shows mapped to the core shape consumed by set-up-slide-show. */
75570
76130
  pptxCustomShows = computed(() => this.shows().map((show) => ({
@@ -75573,8 +76133,8 @@ class ViewerCustomShowsService {
75573
76133
  slideRIds: [...show.slideIds],
75574
76134
  })), /* @ts-ignore */
75575
76135
  ...(ngDevMode ? [{ debugName: "pptxCustomShows" }] : /* istanbul ignore next */ []));
75576
- /** Slides shown in presentation mode: the active custom show, else the full deck. */
75577
- presentationSlides = computed(() => this.resolveActiveShowSlides() ?? [...this.loader.slides()], /* @ts-ignore */
76136
+ /** Slides shown in presentation mode: the active custom show, else the full (live) deck. */
76137
+ presentationSlides = computed(() => this.resolveActiveShowSlides() ?? [...this.liveSlides()], /* @ts-ignore */
75578
76138
  ...(ngDevMode ? [{ debugName: "presentationSlides" }] : /* istanbul ignore next */ []));
75579
76139
  /** Start index into {@link presentationSlides}: first slide of a custom show, else the active slide. */
75580
76140
  presentationStartIndex = computed(() => this.resolveActiveShowSlides() ? 0 : this.activeSlideIndex(), /* @ts-ignore */
@@ -75604,7 +76164,7 @@ class ViewerCustomShowsService {
75604
76164
  if (!show || show.slideIds.length === 0) {
75605
76165
  return null;
75606
76166
  }
75607
- const byId = new Map(this.loader.slides().map((s) => [s.id, s]));
76167
+ const byId = new Map(this.liveSlides().map((s) => [s.id, s]));
75608
76168
  const picked = show.slideIds
75609
76169
  .map((sid) => byId.get(sid))
75610
76170
  .filter((s) => s !== undefined);
@@ -76076,7 +76636,7 @@ class SlideDiffThumbnailsComponent {
76076
76636
  </div>
76077
76637
  }
76078
76638
  </div>
76079
- `, isInline: true, styles: [".pptx-ng-diff-thumbs{display:flex;gap:.5rem}.pptx-ng-diff-thumb-col{flex:1}.pptx-ng-diff-thumb-label{margin-bottom:.25rem;font-size:.625rem;color:var(--pptx-muted-foreground, #9ca3af)}.pptx-ng-diff-thumb-clip{overflow:hidden;border:1px solid var(--pptx-border, #374151);border-radius:.25rem}.pptx-ng-diff-thumb-clip[data-status=added]{border-color:#15803d99}.pptx-ng-diff-thumb-clip[data-status=changed]{border-color:#b4530999}.pptx-ng-diff-thumb-clip ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}\n"], dependencies: [{ kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
76639
+ `, isInline: true, styles: [".pptx-ng-diff-thumbs{display:flex;gap:.5rem}.pptx-ng-diff-thumb-col{flex:1}.pptx-ng-diff-thumb-label{margin-bottom:.25rem;font-size:.625rem;color:var(--pptx-muted-foreground, #9ca3af)}.pptx-ng-diff-thumb-clip{overflow:hidden;border:1px solid var(--pptx-border, #374151);border-radius:.25rem}.pptx-ng-diff-thumb-clip[data-status=added]{border-color:#15803d99}.pptx-ng-diff-thumb-clip[data-status=changed]{border-color:#b4530999}.pptx-ng-diff-thumb-clip ::ng-deep .pptx-ng-canvas-wrapper{margin:0!important}\n"], dependencies: [{ kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
76080
76640
  }
76081
76641
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SlideDiffThumbnailsComponent, decorators: [{
76082
76642
  type: Component,
@@ -76183,7 +76743,13 @@ class SlideDiffRowComponent {
76183
76743
  <div class="pptx-ng-diff-row" [class.is-resolved]="isResolved()">
76184
76744
  <!-- Header (toggles expand) -->
76185
76745
  <button type="button" class="pptx-ng-diff-head" (click)="toggle()">
76186
- <span class="pptx-ng-diff-chevron">{{ expanded() ? '▾' : '▸' }}</span>
76746
+ <span class="pptx-ng-diff-chevron inline-flex items-center">
76747
+ @if (expanded()) {
76748
+ <svg lucideChevronDown class="h-3.5 w-3.5"></svg>
76749
+ } @else {
76750
+ <svg lucideChevronRight class="h-3.5 w-3.5"></svg>
76751
+ }
76752
+ </span>
76187
76753
  <span class="pptx-ng-diff-slide">{{
76188
76754
  'pptx.compare.slideNumber' | translate: { number: slideNumber() }
76189
76755
  }}</span>
@@ -76218,17 +76784,18 @@ class SlideDiffRowComponent {
76218
76784
  <div class="pptx-ng-diff-actions">
76219
76785
  <button
76220
76786
  type="button"
76221
- class="pptx-ng-diff-btn is-accept"
76787
+ class="pptx-ng-diff-btn is-accept inline-flex items-center gap-1"
76222
76788
  (click)="accept.emit(diffIndex())"
76223
76789
  >
76224
- {{ 'pptx.compare.accept' | translate }}
76790
+ <svg lucideCheck class="h-3.5 w-3.5"></svg>
76791
+ {{ 'pptx.compare.accept' | translate }}
76225
76792
  </button>
76226
76793
  <button
76227
76794
  type="button"
76228
- class="pptx-ng-diff-btn is-reject"
76795
+ class="pptx-ng-diff-btn is-reject inline-flex items-center gap-1"
76229
76796
  (click)="reject.emit(diffIndex())"
76230
76797
  >
76231
- {{ 'pptx.compare.reject' | translate }}
76798
+ <svg lucideX class="h-3.5 w-3.5"></svg> {{ 'pptx.compare.reject' | translate }}
76232
76799
  </button>
76233
76800
  </div>
76234
76801
  }
@@ -76236,16 +76803,30 @@ class SlideDiffRowComponent {
76236
76803
  }
76237
76804
  </div>
76238
76805
  }
76239
- `, isInline: true, styles: [".pptx-ng-diff-row{border:1px solid var(--pptx-border, #374151);border-radius:.5rem;background:var(--pptx-background, #030712)}.pptx-ng-diff-row.is-resolved{opacity:.6;background:var(--pptx-card, #111827)}.pptx-ng-diff-head{display:flex;align-items:center;gap:.5rem;width:100%;padding:.5rem .75rem;text-align:left;border:none;background:transparent;color:var(--pptx-foreground, #f3f4f6);cursor:pointer}.pptx-ng-diff-chevron{flex-shrink:0;color:var(--pptx-muted-foreground, #9ca3af);font-size:.75rem}.pptx-ng-diff-slide{font-size:.75rem}.pptx-ng-diff-pill{border-radius:9999px;padding:.0625rem .5rem;font-size:.625rem;font-weight:500;color:var(--pptx-muted-foreground, #9ca3af);background:#6b728033}.pptx-ng-diff-pill[data-status=added]{color:#4ade80;background:#14532d4d}.pptx-ng-diff-pill[data-status=removed]{color:#f87171;background:#7f1d1d4d}.pptx-ng-diff-pill[data-status=changed]{color:#fbbf24;background:#78350f4d}.pptx-ng-diff-count{font-size:.625rem;color:var(--pptx-muted-foreground, #9ca3af)}.pptx-ng-diff-spacer{flex:1}.pptx-ng-diff-tag{font-size:.625rem;font-weight:500;color:var(--pptx-muted-foreground, #9ca3af)}.pptx-ng-diff-tag.is-accepted{color:#4ade80}.pptx-ng-diff-body{display:flex;flex-direction:column;gap:.5rem;padding:0 .75rem .75rem}.pptx-ng-diff-actions{display:flex;gap:.5rem;padding-top:.25rem}.pptx-ng-diff-btn{display:inline-flex;align-items:center;gap:.25rem;padding:.25rem .625rem;border:none;border-radius:.25rem;font-size:.6875rem;cursor:pointer}.pptx-ng-diff-btn.is-accept{background:#15803dcc;color:#f0fdf4}.pptx-ng-diff-btn.is-accept:hover{background:#16a34a}.pptx-ng-diff-btn.is-reject{background:var(--pptx-card, #111827);color:var(--pptx-foreground, #f3f4f6)}.pptx-ng-diff-btn.is-reject:hover{filter:brightness(1.2)}\n"], dependencies: [{ kind: "component", type: SlideDiffThumbnailsComponent, selector: "pptx-slide-diff-thumbnails", inputs: ["diff", "canvasSize", "mediaDataUrls"] }, { kind: "component", type: SlideDiffChangesComponent, selector: "pptx-slide-diff-changes", inputs: ["changes"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
76806
+ `, isInline: true, styles: [".pptx-ng-diff-row{border:1px solid var(--pptx-border, #374151);border-radius:.5rem;background:var(--pptx-background, #030712)}.pptx-ng-diff-row.is-resolved{opacity:.6;background:var(--pptx-card, #111827)}.pptx-ng-diff-head{display:flex;align-items:center;gap:.5rem;width:100%;padding:.5rem .75rem;text-align:left;border:none;background:transparent;color:var(--pptx-foreground, #f3f4f6);cursor:pointer}.pptx-ng-diff-chevron{flex-shrink:0;color:var(--pptx-muted-foreground, #9ca3af);font-size:.75rem}.pptx-ng-diff-slide{font-size:.75rem}.pptx-ng-diff-pill{border-radius:9999px;padding:.0625rem .5rem;font-size:.625rem;font-weight:500;color:var(--pptx-muted-foreground, #9ca3af);background:#6b728033}.pptx-ng-diff-pill[data-status=added]{color:#4ade80;background:#14532d4d}.pptx-ng-diff-pill[data-status=removed]{color:#f87171;background:#7f1d1d4d}.pptx-ng-diff-pill[data-status=changed]{color:#fbbf24;background:#78350f4d}.pptx-ng-diff-count{font-size:.625rem;color:var(--pptx-muted-foreground, #9ca3af)}.pptx-ng-diff-spacer{flex:1}.pptx-ng-diff-tag{font-size:.625rem;font-weight:500;color:var(--pptx-muted-foreground, #9ca3af)}.pptx-ng-diff-tag.is-accepted{color:#4ade80}.pptx-ng-diff-body{display:flex;flex-direction:column;gap:.5rem;padding:0 .75rem .75rem}.pptx-ng-diff-actions{display:flex;gap:.5rem;padding-top:.25rem}.pptx-ng-diff-btn{display:inline-flex;align-items:center;gap:.25rem;padding:.25rem .625rem;border:none;border-radius:.25rem;font-size:.6875rem;cursor:pointer}.pptx-ng-diff-btn.is-accept{background:#15803dcc;color:#f0fdf4}.pptx-ng-diff-btn.is-accept:hover{background:#16a34a}.pptx-ng-diff-btn.is-reject{background:var(--pptx-card, #111827);color:var(--pptx-foreground, #f3f4f6)}.pptx-ng-diff-btn.is-reject:hover{filter:brightness(1.2)}\n"], dependencies: [{ kind: "component", type: SlideDiffThumbnailsComponent, selector: "pptx-slide-diff-thumbnails", inputs: ["diff", "canvasSize", "mediaDataUrls"] }, { kind: "component", type: SlideDiffChangesComponent, selector: "pptx-slide-diff-changes", inputs: ["changes"] }, { kind: "component", type: LucideChevronDown, selector: "svg[lucideChevronDown]" }, { kind: "component", type: LucideChevronRight, selector: "svg[lucideChevronRight]" }, { kind: "component", type: LucideCheck, selector: "svg[lucideCheck]" }, { kind: "component", type: LucideX, selector: "svg[lucideX]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
76240
76807
  }
76241
76808
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: SlideDiffRowComponent, decorators: [{
76242
76809
  type: Component,
76243
- args: [{ selector: 'pptx-slide-diff-row', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [SlideDiffThumbnailsComponent, SlideDiffChangesComponent, TranslatePipe], template: `
76810
+ args: [{ selector: 'pptx-slide-diff-row', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
76811
+ SlideDiffThumbnailsComponent,
76812
+ SlideDiffChangesComponent,
76813
+ TranslatePipe,
76814
+ LucideChevronDown,
76815
+ LucideChevronRight,
76816
+ LucideCheck,
76817
+ LucideX,
76818
+ ], template: `
76244
76819
  @if (diff().status !== 'unchanged') {
76245
76820
  <div class="pptx-ng-diff-row" [class.is-resolved]="isResolved()">
76246
76821
  <!-- Header (toggles expand) -->
76247
76822
  <button type="button" class="pptx-ng-diff-head" (click)="toggle()">
76248
- <span class="pptx-ng-diff-chevron">{{ expanded() ? '▾' : '▸' }}</span>
76823
+ <span class="pptx-ng-diff-chevron inline-flex items-center">
76824
+ @if (expanded()) {
76825
+ <svg lucideChevronDown class="h-3.5 w-3.5"></svg>
76826
+ } @else {
76827
+ <svg lucideChevronRight class="h-3.5 w-3.5"></svg>
76828
+ }
76829
+ </span>
76249
76830
  <span class="pptx-ng-diff-slide">{{
76250
76831
  'pptx.compare.slideNumber' | translate: { number: slideNumber() }
76251
76832
  }}</span>
@@ -76280,17 +76861,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
76280
76861
  <div class="pptx-ng-diff-actions">
76281
76862
  <button
76282
76863
  type="button"
76283
- class="pptx-ng-diff-btn is-accept"
76864
+ class="pptx-ng-diff-btn is-accept inline-flex items-center gap-1"
76284
76865
  (click)="accept.emit(diffIndex())"
76285
76866
  >
76286
- {{ 'pptx.compare.accept' | translate }}
76867
+ <svg lucideCheck class="h-3.5 w-3.5"></svg>
76868
+ {{ 'pptx.compare.accept' | translate }}
76287
76869
  </button>
76288
76870
  <button
76289
76871
  type="button"
76290
- class="pptx-ng-diff-btn is-reject"
76872
+ class="pptx-ng-diff-btn is-reject inline-flex items-center gap-1"
76291
76873
  (click)="reject.emit(diffIndex())"
76292
76874
  >
76293
- {{ 'pptx.compare.reject' | translate }}
76875
+ <svg lucideX class="h-3.5 w-3.5"></svg> {{ 'pptx.compare.reject' | translate }}
76294
76876
  </button>
76295
76877
  </div>
76296
76878
  }
@@ -76402,15 +76984,19 @@ class ComparePanelComponent {
76402
76984
  [attr.aria-label]="'pptx.compare.closePanel' | translate"
76403
76985
  (click)="close.emit()"
76404
76986
  >
76405
-
76987
+ <svg lucideX class="h-4 w-4"></svg>
76406
76988
  </button>
76407
76989
  </div>
76408
76990
 
76409
76991
  <!-- Accept all -->
76410
76992
  @if (nonTrivialCount() > 0) {
76411
76993
  <div class="pptx-ng-compare-acceptall">
76412
- <button type="button" class="pptx-ng-compare-acceptall-btn" (click)="handleAcceptAll()">
76413
- ✓ {{ 'pptx.compare.acceptAll' | translate }}
76994
+ <button
76995
+ type="button"
76996
+ class="pptx-ng-compare-acceptall-btn inline-flex items-center gap-1"
76997
+ (click)="handleAcceptAll()"
76998
+ >
76999
+ <svg lucideCheck class="h-3.5 w-3.5"></svg> {{ 'pptx.compare.acceptAll' | translate }}
76414
77000
  </button>
76415
77001
  </div>
76416
77002
  }
@@ -76436,11 +77022,11 @@ class ComparePanelComponent {
76436
77022
  </div>
76437
77023
  </div>
76438
77024
  }
76439
- `, isInline: true, styles: [".pptx-ng-compare{position:fixed;inset-block:0;right:0;z-index:50;display:flex;flex-direction:column;width:440px;max-width:100%;border-left:1px solid var(--pptx-border, #374151);background:var(--pptx-popover, #0b1220);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);box-shadow:-12px 0 40px #00000080}.pptx-ng-compare-head{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;border-bottom:1px solid var(--pptx-border, #374151)}.pptx-ng-compare-title{margin:0;font-size:.875rem;font-weight:500;color:var(--pptx-foreground, #f3f4f6)}.pptx-ng-compare-summary{margin:.125rem 0 0;font-size:.6875rem;color:var(--pptx-muted-foreground, #9ca3af)}.pptx-ng-compare-close{padding:.375rem;border:none;border-radius:.25rem;background:transparent;color:var(--pptx-muted-foreground, #9ca3af);cursor:pointer;transition:background .15s ease}.pptx-ng-compare-close:hover{background:var(--pptx-muted, #1f2937);color:var(--pptx-foreground, #f3f4f6)}.pptx-ng-compare-acceptall{padding:.5rem 1rem;border-bottom:1px solid var(--pptx-border, #374151)}.pptx-ng-compare-acceptall-btn{display:inline-flex;align-items:center;gap:.375rem;padding:.375rem .75rem;border:none;border-radius:.25rem;background:#15803dcc;color:#f0fdf4;font-size:.75rem;cursor:pointer;transition:background .15s ease}.pptx-ng-compare-acceptall-btn:hover{background:#16a34a}.pptx-ng-compare-list{flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:.5rem;padding:.75rem}.pptx-ng-compare-empty{padding:2rem 0;text-align:center;font-size:.75rem;color:var(--pptx-muted-foreground, #9ca3af)}\n"], dependencies: [{ kind: "component", type: SlideDiffRowComponent, selector: "pptx-slide-diff-row", inputs: ["diff", "diffIndex", "canvasSize", "mediaDataUrls", "accepted", "rejected"], outputs: ["accept", "reject"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
77025
+ `, isInline: true, styles: [".pptx-ng-compare{position:fixed;inset-block:0;right:0;z-index:50;display:flex;flex-direction:column;width:440px;max-width:100%;border-left:1px solid var(--pptx-border, #374151);background:var(--pptx-popover, #0b1220);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);box-shadow:-12px 0 40px #00000080}.pptx-ng-compare-head{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;border-bottom:1px solid var(--pptx-border, #374151)}.pptx-ng-compare-title{margin:0;font-size:.875rem;font-weight:500;color:var(--pptx-foreground, #f3f4f6)}.pptx-ng-compare-summary{margin:.125rem 0 0;font-size:.6875rem;color:var(--pptx-muted-foreground, #9ca3af)}.pptx-ng-compare-close{padding:.375rem;border:none;border-radius:.25rem;background:transparent;color:var(--pptx-muted-foreground, #9ca3af);cursor:pointer;transition:background .15s ease}.pptx-ng-compare-close:hover{background:var(--pptx-muted, #1f2937);color:var(--pptx-foreground, #f3f4f6)}.pptx-ng-compare-acceptall{padding:.5rem 1rem;border-bottom:1px solid var(--pptx-border, #374151)}.pptx-ng-compare-acceptall-btn{display:inline-flex;align-items:center;gap:.375rem;padding:.375rem .75rem;border:none;border-radius:.25rem;background:#15803dcc;color:#f0fdf4;font-size:.75rem;cursor:pointer;transition:background .15s ease}.pptx-ng-compare-acceptall-btn:hover{background:#16a34a}.pptx-ng-compare-list{flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:.5rem;padding:.75rem}.pptx-ng-compare-empty{padding:2rem 0;text-align:center;font-size:.75rem;color:var(--pptx-muted-foreground, #9ca3af)}\n"], dependencies: [{ kind: "component", type: SlideDiffRowComponent, selector: "pptx-slide-diff-row", inputs: ["diff", "diffIndex", "canvasSize", "mediaDataUrls", "accepted", "rejected"], outputs: ["accept", "reject"] }, { kind: "component", type: LucideCheck, selector: "svg[lucideCheck]" }, { kind: "component", type: LucideX, selector: "svg[lucideX]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
76440
77026
  }
76441
77027
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: ComparePanelComponent, decorators: [{
76442
77028
  type: Component,
76443
- args: [{ selector: 'pptx-compare-panel', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [SlideDiffRowComponent, TranslatePipe], template: `
77029
+ args: [{ selector: 'pptx-compare-panel', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [SlideDiffRowComponent, TranslatePipe, LucideCheck, LucideX], template: `
76444
77030
  @if (open() && compareResult(); as result) {
76445
77031
  <div class="pptx-ng-compare">
76446
77032
  <!-- Header -->
@@ -76466,15 +77052,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
76466
77052
  [attr.aria-label]="'pptx.compare.closePanel' | translate"
76467
77053
  (click)="close.emit()"
76468
77054
  >
76469
-
77055
+ <svg lucideX class="h-4 w-4"></svg>
76470
77056
  </button>
76471
77057
  </div>
76472
77058
 
76473
77059
  <!-- Accept all -->
76474
77060
  @if (nonTrivialCount() > 0) {
76475
77061
  <div class="pptx-ng-compare-acceptall">
76476
- <button type="button" class="pptx-ng-compare-acceptall-btn" (click)="handleAcceptAll()">
76477
- ✓ {{ 'pptx.compare.acceptAll' | translate }}
77062
+ <button
77063
+ type="button"
77064
+ class="pptx-ng-compare-acceptall-btn inline-flex items-center gap-1"
77065
+ (click)="handleAcceptAll()"
77066
+ >
77067
+ <svg lucideCheck class="h-3.5 w-3.5"></svg> {{ 'pptx.compare.acceptAll' | translate }}
76478
77068
  </button>
76479
77069
  </div>
76480
77070
  }
@@ -79627,6 +80217,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
79627
80217
  * prompt trigger) via {@link bind}; the template reads the signals / invokes the
79628
80218
  * handlers off the injected instance directly (same pattern as `session`/`xport`).
79629
80219
  *
80220
+ * This service owns no DOM node, so the real browser Fullscreen API request/exit
80221
+ * (mirroring React's `usePresentationMode` / Vue's `PresentationMode.vue`) is
80222
+ * driven by `PresentationOverlayComponent` itself off this `presenting` signal's
80223
+ * mount/unmount, not from here; see that component for the fullscreen wiring.
80224
+ *
79630
80225
  * Provide it once on the viewer component (`providers: [ViewerPresentationModeService]`).
79631
80226
  */
79632
80227
  class ViewerPresentationModeService {
@@ -79653,7 +80248,11 @@ class ViewerPresentationModeService {
79653
80248
  }
79654
80249
  return this.host;
79655
80250
  }
79656
- /** Open the fullscreen presentation overlay from the current slide. */
80251
+ /**
80252
+ * Open the presentation overlay from the current slide. The overlay itself
80253
+ * (`PresentationOverlayComponent`) requests real browser fullscreen once it
80254
+ * mounts as a result of `presenting` flipping true.
80255
+ */
79657
80256
  present() {
79658
80257
  const host = this.requireHost();
79659
80258
  if (host.slideCount() > 0) {
@@ -80277,9 +80876,14 @@ class PowerPointViewerComponent {
80277
80876
  // Hand the find/replace controller a slide-navigation callback so a match
80278
80877
  // can scroll its slide into view.
80279
80878
  this.findReplace.bind((index) => this.goTo(index));
80280
- // Hand the custom-shows controller the active-slide-index accessor so a
80281
- // normal (non-custom) show starts at the current slide.
80282
- this.customShowsCtl.bind(() => this.activeSlideIndex());
80879
+ // Hand the custom-shows controller the active-slide-index accessor (so a
80880
+ // normal show starts at the current slide) and the LIVE edited-slides
80881
+ // accessor (so present mode reflects in-session edits like inserted media,
80882
+ // mirroring React/Vue) rather than the pristine loaded deck.
80883
+ this.customShowsCtl.bind({
80884
+ activeSlideIndex: () => this.activeSlideIndex(),
80885
+ liveSlides: () => this.displaySlidesMut(),
80886
+ });
80283
80887
  // Hand the collaboration-session controller the host inputs it cannot own
80284
80888
  // (author name, share defaults, template-element supplier) and the
80285
80889
  // start/stop output emitters.
@@ -81380,7 +81984,12 @@ class PowerPointViewerComponent {
81380
81984
  >
81381
81985
  <div class="pptx-ng-mnotes-handle"></div>
81382
81986
  </div>
81383
- <pptx-notes-panel [slide]="activeSlide()" (update)="canvasEditing.onNotesUpdate($event)" />
81987
+ <pptx-notes-panel
81988
+ [slide]="activeSlide()"
81989
+ [expanded]="true"
81990
+ (update)="canvasEditing.onNotesUpdate($event)"
81991
+ (notesToggle)="mobileSheetSvc.toggleNotes()"
81992
+ />
81384
81993
  </div>
81385
81994
  }
81386
81995
 
@@ -81402,7 +82011,7 @@ class PowerPointViewerComponent {
81402
82011
  />
81403
82012
  }
81404
82013
  </div>
81405
- `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresentationOverlayComponent, selector: "pptx-presentation-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "startIndex"], outputs: ["indexChange", "closed", "annotationsExit"] }, { kind: "component", type: PresenterViewComponent, selector: "pptx-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime", "isAudienceWindowOpen"], outputs: ["movePresentationSlide", "exit", "openAudienceWindow", "closeAudienceWindow"] }, { kind: "component", type: MobilePresenterViewComponent, selector: "pptx-mobile-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime"], outputs: ["movePresentationSlide", "exit"] }, { kind: "component", type: SlideSorterOverlayComponent, selector: "pptx-slide-sorter-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select", "closed"] }, { kind: "component", type: FindBarComponent, selector: "pptx-find-bar", inputs: ["slides"], outputs: ["navigate", "closed"] }, { kind: "component", type: FindReplaceBarComponent, selector: "pptx-find-replace-bar", inputs: ["matchCount", "matchIndex"], outputs: ["find", "navigate", "replaceOne", "replaceAll", "close"] }, { kind: "component", type: InspectorPanelComponent, selector: "pptx-inspector-panel", inputs: ["element", "slideIndex"] }, { kind: "component", type: SlidesPanelComponent, selector: "pptx-slides-panel", inputs: ["canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select"] }, { kind: "component", type: StatusBarComponent, selector: "pptx-status-bar", inputs: ["slideIndex", "slideCount", "canEdit", "dirty", "autosaveStatus", "notesOpen", "zoomPercent", "sorterActive", "presenting"], outputs: ["toggleNotes", "normalView", "openSorter", "slideShow", "zoomIn", "zoomOut", "zoomReset"] }, { kind: "component", type: EditorContextMenuComponent, selector: "pptx-editor-context-menu", inputs: ["x", "y", "slideIndex"], outputs: ["closed"] }, { kind: "component", type: ExportProgressModalComponent, selector: "pptx-export-progress-modal", inputs: ["open", "title", "progress", "statusMessage"], outputs: ["cancel"] }, { kind: "component", type: CommentsPanelComponent, selector: "pptx-comments-panel", inputs: ["comments", "authorName"], outputs: ["add", "remove", "resolve"] }, { kind: "component", type: SignaturesPanelComponent, selector: "pptx-signatures-panel", inputs: ["signatures"] }, { kind: "component", type: AccessibilityPanelComponent, selector: "pptx-accessibility-panel", inputs: ["issues"], outputs: ["selectSlide"] }, { kind: "component", type: CollaborationCursorsComponent, selector: "pptx-collaboration-cursors", inputs: ["cursors", "zoom"] }, { kind: "component", type: RemoteSelectionOverlayComponent, selector: "pptx-remote-selection-overlay", inputs: ["presences", "elements", "activeSlideIndex", "zoom"] }, { kind: "component", type: FollowModeBarComponent, selector: "pptx-follow-mode-bar", inputs: ["presences", "followedClientId"], outputs: ["follow"] }, { kind: "component", type: PropertiesDialogComponent, selector: "pptx-properties-dialog", inputs: ["open", "properties"], outputs: ["save", "close"] }, { kind: "component", type: HyperlinkDialogComponent, selector: "pptx-hyperlink-dialog", inputs: ["open", "element"], outputs: ["save", "close"] }, { kind: "component", type: PrintDialogComponent, selector: "pptx-print-dialog", inputs: ["slides", "activeSlideIndex", "defaultSlidesPerPage", "defaultFrameSlides"], outputs: ["print", "cancel"] }, { kind: "component", type: ShareDialogComponent, selector: "pptx-share-dialog", inputs: ["open", "defaults", "active", "connected", "userCount", "shareUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: BroadcastDialogComponent, selector: "pptx-broadcast-dialog", inputs: ["open", "defaults", "active", "connected", "viewerCount", "viewerUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: MobileBottomBarComponent, selector: "pptx-mobile-bottom-bar", inputs: ["slideCount", "commentCount", "activeSheet"], outputs: ["openSlides", "insert", "openFormat", "openComments", "notes"] }, { kind: "component", type: MobileMenuSheetComponent, selector: "pptx-mobile-menu-sheet", inputs: ["open", "slideCount", "exporting", "showNotes", "canEdit"], outputs: ["closed", "openFind", "openSorter", "toggleNotes", "insertText", "present", "openFile", "savePptx", "exportPng", "exportPdf", "exportGif", "exportVideo", "print"] }, { kind: "component", type: MobileSlidesSheetComponent, selector: "pptx-mobile-slides-sheet", inputs: ["open", "slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["closed", "jumpToSlide"] }, { kind: "component", type: MobileToolbarComponent, selector: "pptx-mobile-toolbar", inputs: ["canUndo", "canRedo", "canPresent", "canEdit", "menuOpen"], outputs: ["toggleMenu", "undo", "redo", "save", "present"] }, { kind: "component", type: NotesPanelComponent, selector: "pptx-notes-panel", inputs: ["slide", "expanded"], outputs: ["update", "notesToggle"] }, { kind: "component", type: RibbonComponent, selector: "pptx-ribbon", inputs: ["slideIndex", "slideCount", "canEdit", "selectedElement", "zoomPercent", "formatPainterActive", "canActivateFormatPainter", "exporting", "showGrid", "showRulers", "showGuides", "snapToGrid", "eyedropperActive", "themeGalleryOpen", "sidebarCollapsed", "inspectorOpen", "commentsOpen", "commentCount", "findOpen", "collabConnected", "connectedCount"], outputs: ["prev", "next", "zoomIn", "zoomOut", "zoomReset", "find", "present", "presenter", "record", "share", "broadcast", "openFile", "save", "toggleSidebar", "signatures", "info", "print", "comments", "a11y", "link", "openSorter", "toggleNotes", "toggleFormatPainter", "exportPng", "exportPdf", "exportGif", "exportVideo", "replace", "toggleInspector", "drawToolChange", "toggleThemeGallery", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "openCustomShows", "toggleSnapToGrid", "toggleEyedropper", "openSmartArtDialog", "openEquationDialog", "openSetUpSlideShow", "openCompare", "openPassword", "openFontEmbedding", "openVersionHistory", "openShortcuts", "shapeInsert", "moveLayer", "moveLayerToEdge"] }, { kind: "component", type: TitleBarComponent, selector: "pptx-title-bar", inputs: ["canEdit", "fileName", "isDirty", "autosaveStatus", "autosaveEnabled", "canUndo", "canRedo", "undoLabel", "redoLabel", "findReplaceOpen"], outputs: ["toggleAutosave", "save", "undo", "redo", "toggleFindReplace", "commandSearch"] }, { kind: "component", type: ThemeGalleryComponent, selector: "pptx-theme-gallery", inputs: ["open", "activeName"], outputs: ["applyTheme", "close"] }, { kind: "component", type: SelectionPaneComponent, selector: "pptx-selection-pane", inputs: ["elements", "selectedIds"], outputs: ["selectElement", "bringForward", "sendBackward", "toggleHidden"] }, { kind: "component", type: CustomShowsComponent, selector: "pptx-custom-shows", inputs: ["open", "slides", "customShows", "activeCustomShowId"], outputs: ["create", "remove", "update", "setActive", "close"] }, { kind: "component", type: InsertSmartArtDialogComponent, selector: "pptx-insert-smart-art-dialog", inputs: ["open"], outputs: ["close", "insert"] }, { kind: "component", type: ViewerExtraDialogsComponent, selector: "pptx-viewer-extra-dialogs", inputs: ["activeSlideIndex", "selectedElementId", "filePath", "customShows"], outputs: ["restoreContent"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
82014
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: SlideCanvasComponent, selector: "pptx-slide-canvas", inputs: ["slide", "canvasSize", "mediaDataUrls", "zoom", "editable", "showGrid", "showRulers", "showGuides", "snapToGrid", "snapToGuides", "autoFit", "interactive", "presenting", "selectedIds", "editingId", "editTemplateMode", "templateElements", "drawTool", "drawColor", "drawWidth"], outputs: ["elementSelect", "backgroundClick", "transformStart", "transformUpdate", "contextMenu", "textEditStart", "textCommit", "textCancel", "textFormat", "rotateUpdate", "marqueeSelect", "inkStrokeComplete", "eraserHit", "cellCommit", "tableChange"] }, { kind: "component", type: PresentationOverlayComponent, selector: "pptx-presentation-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "startIndex"], outputs: ["indexChange", "closed", "annotationsExit"] }, { kind: "component", type: PresenterViewComponent, selector: "pptx-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime", "isAudienceWindowOpen"], outputs: ["movePresentationSlide", "exit", "openAudienceWindow", "closeAudienceWindow"] }, { kind: "component", type: MobilePresenterViewComponent, selector: "pptx-mobile-presenter-view", inputs: ["slides", "currentSlideIndex", "canvasSize", "templateElements", "mediaDataUrls", "presentationStartTime"], outputs: ["movePresentationSlide", "exit"] }, { kind: "component", type: SlideSorterOverlayComponent, selector: "pptx-slide-sorter-overlay", inputs: ["slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select", "closed"] }, { kind: "component", type: FindBarComponent, selector: "pptx-find-bar", inputs: ["slides"], outputs: ["navigate", "closed"] }, { kind: "component", type: FindReplaceBarComponent, selector: "pptx-find-replace-bar", inputs: ["matchCount", "matchIndex"], outputs: ["find", "navigate", "replaceOne", "replaceAll", "close"] }, { kind: "component", type: InspectorPanelComponent, selector: "pptx-inspector-panel", inputs: ["element", "slideIndex"] }, { kind: "component", type: SlidesPanelComponent, selector: "pptx-slides-panel", inputs: ["canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["select"] }, { kind: "component", type: StatusBarComponent, selector: "pptx-status-bar", inputs: ["slideIndex", "slideCount", "canEdit", "dirty", "autosaveStatus", "notesOpen", "zoomPercent", "sorterActive", "presenting"], outputs: ["toggleNotes", "normalView", "openSorter", "slideShow", "zoomIn", "zoomOut", "zoomReset"] }, { kind: "component", type: EditorContextMenuComponent, selector: "pptx-editor-context-menu", inputs: ["x", "y", "slideIndex"], outputs: ["closed"] }, { kind: "component", type: ExportProgressModalComponent, selector: "pptx-export-progress-modal", inputs: ["open", "title", "progress", "statusMessage"], outputs: ["cancel"] }, { kind: "component", type: CommentsPanelComponent, selector: "pptx-comments-panel", inputs: ["comments", "authorName"], outputs: ["add", "remove", "resolve"] }, { kind: "component", type: SignaturesPanelComponent, selector: "pptx-signatures-panel", inputs: ["signatures"] }, { kind: "component", type: AccessibilityPanelComponent, selector: "pptx-accessibility-panel", inputs: ["issues"], outputs: ["selectSlide"] }, { kind: "component", type: CollaborationCursorsComponent, selector: "pptx-collaboration-cursors", inputs: ["cursors", "zoom"] }, { kind: "component", type: RemoteSelectionOverlayComponent, selector: "pptx-remote-selection-overlay", inputs: ["presences", "elements", "activeSlideIndex", "zoom"] }, { kind: "component", type: FollowModeBarComponent, selector: "pptx-follow-mode-bar", inputs: ["presences", "followedClientId"], outputs: ["follow"] }, { kind: "component", type: PropertiesDialogComponent, selector: "pptx-properties-dialog", inputs: ["open", "properties"], outputs: ["save", "close"] }, { kind: "component", type: HyperlinkDialogComponent, selector: "pptx-hyperlink-dialog", inputs: ["open", "element"], outputs: ["save", "close"] }, { kind: "component", type: PrintDialogComponent, selector: "pptx-print-dialog", inputs: ["slides", "activeSlideIndex", "defaultSlidesPerPage", "defaultFrameSlides"], outputs: ["print", "cancel"] }, { kind: "component", type: ShareDialogComponent, selector: "pptx-share-dialog", inputs: ["open", "defaults", "active", "connected", "userCount", "shareUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: BroadcastDialogComponent, selector: "pptx-broadcast-dialog", inputs: ["open", "defaults", "active", "connected", "viewerCount", "viewerUrl", "p2p"], outputs: ["start", "stop", "close"] }, { kind: "component", type: MobileBottomBarComponent, selector: "pptx-mobile-bottom-bar", inputs: ["slideCount", "commentCount", "activeSheet"], outputs: ["openSlides", "insert", "openFormat", "openComments", "notes"] }, { kind: "component", type: MobileMenuSheetComponent, selector: "pptx-mobile-menu-sheet", inputs: ["open", "slideCount", "exporting", "showNotes", "canEdit"], outputs: ["closed", "openFind", "openSorter", "toggleNotes", "insertText", "present", "openFile", "savePptx", "exportPng", "exportPdf", "exportGif", "exportVideo", "print"] }, { kind: "component", type: MobileSlidesSheetComponent, selector: "pptx-mobile-slides-sheet", inputs: ["open", "slides", "canvasSize", "mediaDataUrls", "activeIndex"], outputs: ["closed", "jumpToSlide"] }, { kind: "component", type: MobileToolbarComponent, selector: "pptx-mobile-toolbar", inputs: ["canUndo", "canRedo", "canPresent", "canEdit", "menuOpen"], outputs: ["toggleMenu", "undo", "redo", "save", "present"] }, { kind: "component", type: NotesPanelComponent, selector: "pptx-notes-panel", inputs: ["slide", "expanded"], outputs: ["update", "notesToggle"] }, { kind: "component", type: RibbonComponent, selector: "pptx-ribbon", inputs: ["slideIndex", "slideCount", "canEdit", "selectedElement", "zoomPercent", "formatPainterActive", "canActivateFormatPainter", "exporting", "showGrid", "showRulers", "showGuides", "snapToGrid", "eyedropperActive", "themeGalleryOpen", "sidebarCollapsed", "inspectorOpen", "commentsOpen", "commentCount", "findOpen", "collabConnected", "connectedCount"], outputs: ["prev", "next", "zoomIn", "zoomOut", "zoomReset", "find", "present", "presenter", "record", "share", "broadcast", "openFile", "save", "toggleSidebar", "signatures", "info", "print", "comments", "a11y", "link", "openSorter", "toggleNotes", "toggleFormatPainter", "exportPng", "exportPdf", "exportGif", "exportVideo", "replace", "toggleInspector", "drawToolChange", "toggleThemeGallery", "toggleGrid", "toggleRulers", "toggleGuides", "toggleSelectionPane", "openCustomShows", "toggleSnapToGrid", "toggleEyedropper", "openSmartArtDialog", "openEquationDialog", "openSetUpSlideShow", "openCompare", "openPassword", "openFontEmbedding", "openVersionHistory", "openShortcuts", "shapeInsert", "moveLayer", "moveLayerToEdge"] }, { kind: "component", type: TitleBarComponent, selector: "pptx-title-bar", inputs: ["canEdit", "fileName", "isDirty", "autosaveStatus", "autosaveEnabled", "canUndo", "canRedo", "undoLabel", "redoLabel", "findReplaceOpen"], outputs: ["toggleAutosave", "save", "undo", "redo", "toggleFindReplace", "commandSearch"] }, { kind: "component", type: ThemeGalleryComponent, selector: "pptx-theme-gallery", inputs: ["open", "activeName"], outputs: ["applyTheme", "close"] }, { kind: "component", type: SelectionPaneComponent, selector: "pptx-selection-pane", inputs: ["elements", "selectedIds"], outputs: ["selectElement", "bringForward", "sendBackward", "toggleHidden"] }, { kind: "component", type: CustomShowsComponent, selector: "pptx-custom-shows", inputs: ["open", "slides", "customShows", "activeCustomShowId"], outputs: ["create", "remove", "update", "setActive", "close"] }, { kind: "component", type: InsertSmartArtDialogComponent, selector: "pptx-insert-smart-art-dialog", inputs: ["open"], outputs: ["close", "insert"] }, { kind: "component", type: ViewerExtraDialogsComponent, selector: "pptx-viewer-extra-dialogs", inputs: ["activeSlideIndex", "selectedElementId", "filePath", "customShows"], outputs: ["restoreContent"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
81406
82015
  }
81407
82016
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: PowerPointViewerComponent, decorators: [{
81408
82017
  type: Component,
@@ -82051,7 +82660,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
82051
82660
  >
82052
82661
  <div class="pptx-ng-mnotes-handle"></div>
82053
82662
  </div>
82054
- <pptx-notes-panel [slide]="activeSlide()" (update)="canvasEditing.onNotesUpdate($event)" />
82663
+ <pptx-notes-panel
82664
+ [slide]="activeSlide()"
82665
+ [expanded]="true"
82666
+ (update)="canvasEditing.onNotesUpdate($event)"
82667
+ (notesToggle)="mobileSheetSvc.toggleNotes()"
82668
+ />
82055
82669
  </div>
82056
82670
  }
82057
82671