pptx-angular-viewer 3.6.0 → 3.6.2

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,7 +2,7 @@ import { NgStyle, NgTemplateOutlet, NgClass } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
3
  import { InjectionToken, input, output, inject, computed, ChangeDetectionStrategy, Component, signal, Injectable, DestroyRef, viewChild, effect, Injector, untracked, ElementRef, HostListener, afterNextRender, Renderer2, ViewEncapsulation, forwardRef, Directive } from '@angular/core';
4
4
  import { TranslateService, TranslatePipe, translate } from '@ngx-translate/core';
5
- import { THEME_PRESETS, guideEmuToPx, getShapeClipPath, getAdjustmentAwareClipPath, getShapeClipPathFromPreset, getCloudPathForRendering, MIN_ELEMENT_SIZE as MIN_ELEMENT_SIZE$1, customGeometryPathsToSvgSubpaths, evaluatePresetShape, hasShapeProperties, ooxmlGradientAngleToCssDegrees, getShapeType, isImageLikeElement, getElementTextContent, getRoundRectRadiusPx as getRoundRectRadiusPx$1, applyDrawingColorTransforms as applyDrawingColorTransforms$1, hslToRgb as hslToRgb$1, PRESET_COLOR_MAP, getSubstituteFontFamily, parsePanoseString, hasTextProperties, stripXmlOrderSuffix, orderedXmlKey, chartDataChangeType, chartDataAddSeries, chartDataRemoveSeries, chartDataAddCategory, chartDataRemoveCategory, chartDataUpdatePoint, rebuildTableStructureInRawXml, updateCellTextInRawXml, deepCloneData, cloneTemplateElementsBySlideId, cloneSlide, EMU_PER_PX as EMU_PER_PX$2, DEFAULT_POWERPOINT_TABLE_STYLE_ID, DEFAULT_SCHEME_COLOR_MAP as DEFAULT_SCHEME_COLOR_MAP$1, formatAutoNumberMarker, getLinkedTextBoxSegments, deriveSlideTitle, svgPathToPolygons, THEME_COLOR_SCHEME_KEYS, createBuiltinVariables, resolveCoordinate, lookupPresetShape, normalizeStShapeType, evaluateGuides, PptxHandler, styleStroke, strokeFor, fitFontSize, nodeTextStyle, truncate, nodeOpacity, nodeStroke, nodeFill, styleShadow, buildTree, treeWidth, treeDepth, gearPoints, flattenNodes, interpretSmartArtLayout, addSmartArtNode, removeSmartArtNode, demoteSmartArtNode, promoteSmartArtNode, reorderSmartArtNode, parseDataUrlToBytes, deobfuscateFont, detectFontFormat, createEditorId, makeStoreAwareId, reassignDescendantIds, checkMissingAltText, checkMissingSlideTitle, checkLowContrast, checkComplexTables, checkBlankSlide, checkDuplicateTitles, createChartElement, renameSlideMaster, deleteSlideMaster, duplicateSlideMaster, insertSlideMaster, renameLayout, deleteLayout, duplicateLayout, insertLayout, detectFileFormat, cloneElement, duplicateElement, serializePptxToJson, PPTX_JSON_MIME_TYPE, PptxMarkdownConverter, ThemePresets, formatCommentTimestamp as formatCommentTimestamp$1, EncryptedFileError, decodeXmlEntities, parseSignatureXml, groupElements, ungroupElements, updateSmartArtNodeText, setSmartArtNodeStyle, isInkElement, isZoomElement, SvgExporter, applyThemeToData, reResolveElementColors, pptxActionToElementAction, elementActionToPptxAction, setChartTitle, setChartLegend, setChartDataLabels, setChartAxis, setChartSeriesTrendline, setChartSeriesErrorBars, setChartDataPointLabel, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointMarker, setChartDataPointExplosion, getOleObjectTypeLabel, addSmartArtNodeAsChild, switchSmartArtLayout, SWITCHABLE_LAYOUT_TYPES, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, applyThemeOverrideToSlide, TRANSITION_VALID_DIRECTIONS } from 'pptx-viewer-core';
5
+ import { THEME_PRESETS, guideEmuToPx, getShapeClipPath, getAdjustmentAwareClipPath, getShapeClipPathFromPreset, getCloudPathForRendering, MIN_ELEMENT_SIZE as MIN_ELEMENT_SIZE$1, customGeometryPathsToSvgSubpaths, evaluatePresetShape, hasShapeProperties, ooxmlGradientAngleToCssDegrees, getShapeType, isImageLikeElement, getElementTextContent, getRoundRectRadiusPx as getRoundRectRadiusPx$1, applyDrawingColorTransforms as applyDrawingColorTransforms$1, hslToRgb as hslToRgb$1, PRESET_COLOR_MAP, getSubstituteFontFamily, parsePanoseString, hasTextProperties, stripXmlOrderSuffix, orderedXmlKey, chartDataChangeType, chartDataAddSeries, chartDataRemoveSeries, chartDataAddCategory, chartDataRemoveCategory, chartDataUpdatePoint, rebuildTableStructureInRawXml, updateCellTextInRawXml, deepCloneData, cloneTemplateElementsBySlideId, cloneSlide, EMU_PER_PX as EMU_PER_PX$2, formatAutoNumberMarker, DEFAULT_POWERPOINT_TABLE_STYLE_ID, DEFAULT_SCHEME_COLOR_MAP as DEFAULT_SCHEME_COLOR_MAP$1, getLinkedTextBoxSegments, deriveSlideTitle, svgPathToPolygons, THEME_COLOR_SCHEME_KEYS, createBuiltinVariables, resolveCoordinate, lookupPresetShape, normalizeStShapeType, evaluateGuides, PptxHandler, styleStroke, strokeFor, fitFontSize, nodeTextStyle, truncate, nodeOpacity, nodeStroke, nodeFill, styleShadow, buildTree, treeWidth, treeDepth, gearPoints, flattenNodes, interpretSmartArtLayout, addSmartArtNode, removeSmartArtNode, demoteSmartArtNode, promoteSmartArtNode, reorderSmartArtNode, parseDataUrlToBytes, deobfuscateFont, detectFontFormat, createEditorId, makeStoreAwareId, reassignDescendantIds, checkMissingAltText, checkMissingSlideTitle, checkLowContrast, checkComplexTables, checkBlankSlide, checkDuplicateTitles, createChartElement, renameSlideMaster, deleteSlideMaster, duplicateSlideMaster, insertSlideMaster, renameLayout, deleteLayout, duplicateLayout, insertLayout, detectFileFormat, cloneElement, duplicateElement, serializePptxToJson, PPTX_JSON_MIME_TYPE, PptxMarkdownConverter, ThemePresets, formatCommentTimestamp as formatCommentTimestamp$1, EncryptedFileError, decodeXmlEntities, parseSignatureXml, groupElements, ungroupElements, updateSmartArtNodeText, setSmartArtNodeStyle, isInkElement, isZoomElement, SvgExporter, applyThemeToData, reResolveElementColors, pptxActionToElementAction, elementActionToPptxAction, setChartTitle, setChartLegend, setChartDataLabels, setChartAxis, setChartSeriesTrendline, setChartSeriesErrorBars, setChartDataPointLabel, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointMarker, setChartDataPointExplosion, getOleObjectTypeLabel, addSmartArtNodeAsChild, switchSmartArtLayout, SWITCHABLE_LAYOUT_TYPES, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, applyThemeOverrideToSlide, TRANSITION_VALID_DIRECTIONS } from 'pptx-viewer-core';
6
6
  import DOMPurify from 'dompurify';
7
7
  import { z } from 'zod';
8
8
  import * as mcp from 'pptx-viewer-mcp';
@@ -29609,7 +29609,9 @@ function cellStyleToCss(style) {
29609
29609
  css.fontFamily = style.fontFamily;
29610
29610
  }
29611
29611
  if (style.fontSize) {
29612
- css.fontSize = `${style.fontSize}px`;
29612
+ // Table-cell controls and the OOXML save path use PowerPoint points.
29613
+ // Emitting the same number as CSS pixels makes edited cells 25% smaller.
29614
+ css.fontSize = `${style.fontSize}pt`;
29613
29615
  }
29614
29616
  if (style.bold) {
29615
29617
  css.fontWeight = 'bold';
@@ -32517,6 +32519,350 @@ function round6(value) {
32517
32519
  * childAbsX = childRelX + groupX
32518
32520
  */
32519
32521
 
32522
+ /**
32523
+ * Auto-numbering helpers for paragraph bullets (framework-agnostic).
32524
+ *
32525
+ * Numbering schemes follow the OOXML `ST_TextAutonumberScheme` enumeration
32526
+ * (ECMA-376 §20.1.10.61). The implementation lives in `pptx-viewer-core`
32527
+ * (`core/utils/auto-number-format`) because the LOAD path needs the identical
32528
+ * string: core stamps the marker onto the parsed bullet segment and the
32529
+ * renderer resolves it again from `BulletInfo`, and the paragraph builder drops
32530
+ * core's segment only when the two agree. While this module carried its own
32531
+ * table the two disagreed for every East-Asian / Thai / Hindi / Hebrew scheme
32532
+ * and painted a DOUBLE marker (`一.1. Item`). Core is the only package both
32533
+ * sides can depend on (shared already depends on core; the reverse would be a
32534
+ * cycle), so it owns the single copy and this module re-exports it.
32535
+ */
32536
+
32537
+ /**
32538
+ * Pure paragraph bullet / list-marker + indent helpers (framework-agnostic).
32539
+ *
32540
+ * Mirrors React's paragraph + bullet renderer (`text-paragraph-render.tsx` +
32541
+ * `text-segment-render.tsx`): bullet-glyph selection, auto-numbering (see
32542
+ * {@link ./bullet-autonum}), bullet font/size/colour, and the marginLeft /
32543
+ * hanging-indent layout. Shared by the React/Vue/Angular bindings.
32544
+ */
32545
+ /** Resolve React-compatible picture-bullet sizing and fallback metadata. */
32546
+ function resolvePictureBullet(info, baseFontSize) {
32547
+ if (!info.imageDataUrl && !info.imageRelId && !info.imageBlipFillXml) {
32548
+ return undefined;
32549
+ }
32550
+ const sizePx = typeof info.sizePts === 'number'
32551
+ ? info.sizePts
32552
+ : typeof info.sizePercent === 'number'
32553
+ ? baseFontSize * (info.sizePercent / 100)
32554
+ : baseFontSize;
32555
+ return {
32556
+ ...(info.imageDataUrl ? { src: info.imageDataUrl } : {}),
32557
+ sizePx,
32558
+ fallbackMarker: '•',
32559
+ accessibleLabel: 'Bullet',
32560
+ ...(info.imageRelId ? { imageRelId: info.imageRelId } : {}),
32561
+ };
32562
+ }
32563
+ /**
32564
+ * Resolve the bullet marker for the first segment of a paragraph.
32565
+ *
32566
+ * Returns `undefined` when the segment is absent or carries no `bulletInfo`,
32567
+ * when `bulletInfo.none`/`listType:'none'` suppresses it, or when neither a
32568
+ * character bullet nor an auto-number type is present. For auto-numbered
32569
+ * bullets the 1-based sequence index is `autoNumStartAt` (default 1) plus the
32570
+ * 0-based `paragraphIndex`.
32571
+ */
32572
+ function resolveParagraphBullet(firstSegment, baseFontSize = firstSegment?.style?.fontSize ?? 16) {
32573
+ if (!firstSegment) {
32574
+ return undefined;
32575
+ }
32576
+ // listType on the first segment's style can explicitly suppress bullets.
32577
+ if (firstSegment.style?.listType === 'none') {
32578
+ return undefined;
32579
+ }
32580
+ const info = firstSegment.bulletInfo;
32581
+ if (!info || info.none) {
32582
+ return undefined;
32583
+ }
32584
+ const color = info.color;
32585
+ const fontFamily = info.fontFamily;
32586
+ const sizePts = typeof info.sizePts === 'number' ? info.sizePts : undefined;
32587
+ const sizePercent = typeof info.sizePercent === 'number' ? info.sizePercent : undefined;
32588
+ const picture = resolvePictureBullet(info, baseFontSize);
32589
+ if (picture) {
32590
+ return {
32591
+ marker: picture.fallbackMarker,
32592
+ isNumbered: false,
32593
+ color,
32594
+ fontFamily,
32595
+ sizePts,
32596
+ sizePercent,
32597
+ picture,
32598
+ };
32599
+ }
32600
+ // ── Auto-numbered list ──
32601
+ if (info.autoNumType) {
32602
+ const startAt = typeof info.autoNumStartAt === 'number' ? info.autoNumStartAt : 1;
32603
+ const paraIdx = typeof info.paragraphIndex === 'number' ? info.paragraphIndex : 0;
32604
+ const seqNum = Math.max(1, startAt + paraIdx);
32605
+ return {
32606
+ marker: formatAutoNumberMarker(info.autoNumType, seqNum),
32607
+ isNumbered: true,
32608
+ color,
32609
+ fontFamily,
32610
+ sizePts,
32611
+ sizePercent,
32612
+ };
32613
+ }
32614
+ // ── Character bullet ──
32615
+ if (info.char) {
32616
+ return { marker: info.char, isNumbered: false, color, fontFamily, sizePts, sizePercent };
32617
+ }
32618
+ // Unsupported cases have no marker to show as text.
32619
+ return undefined;
32620
+ }
32621
+ /** Pixels of left-padding to apply per list nesting level. */
32622
+ const INDENT_PX_PER_LEVEL = 18;
32623
+ /**
32624
+ * Return the left-indent in pixels for the given 0-based list nesting level
32625
+ * (OOXML `a:p/@lvl`). `undefined`/negative is treated as level 0. Used as a
32626
+ * fallback when the element carries no explicit per-paragraph `marginLeft`.
32627
+ */
32628
+ function bulletIndentPx(level) {
32629
+ const lvl = typeof level === 'number' && level > 0 ? level : 0;
32630
+ return lvl * INDENT_PX_PER_LEVEL;
32631
+ }
32632
+ /**
32633
+ * Resolve the hanging-indent layout for a paragraph (mirrors React's
32634
+ * `text-paragraph-render.tsx`). Explicit `paragraphIndents[paraIndex]`
32635
+ * `marginLeft`/`indent` are used verbatim (zeros omitted); otherwise falls back
32636
+ * to the per-level indent derived from `paragraphLevel`.
32637
+ */
32638
+ function resolveParagraphIndent(paraIndent, paragraphLevel) {
32639
+ const marginLeft = typeof paraIndent?.marginLeft === 'number' && paraIndent.marginLeft !== 0
32640
+ ? paraIndent.marginLeft
32641
+ : undefined;
32642
+ const textIndent = typeof paraIndent?.indent === 'number' && paraIndent.indent !== 0
32643
+ ? paraIndent.indent
32644
+ : undefined;
32645
+ if (marginLeft === undefined && textIndent === undefined) {
32646
+ const levelPx = bulletIndentPx(paragraphLevel);
32647
+ return levelPx > 0 ? { marginLeftPx: levelPx } : {};
32648
+ }
32649
+ return { marginLeftPx: marginLeft, textIndentPx: textIndent };
32650
+ }
32651
+
32652
+ /**
32653
+ * Bullet / numbered-list toggling for the ribbon's paragraph buttons.
32654
+ *
32655
+ * The renderer (`resolveParagraphBullet`) and the save writer
32656
+ * (`applyBulletProperties`) both read a paragraph's list state from the
32657
+ * `bulletInfo` of its FIRST segment; `TextStyle.listType` is consulted for
32658
+ * nothing but the `'none'` suppression. Every binding's Bullets / Numbering
32659
+ * button used to write `listType: 'bullet' | 'numbered'` onto the element's
32660
+ * `textStyle`, a field nothing downstream reads, so the buttons were dead.
32661
+ *
32662
+ * These helpers author the real thing: a `BulletInfo` on each paragraph's
32663
+ * first segment (`a:buChar` / `a:buAutoNum` / `a:buNone` on save), with the
32664
+ * inert `listType` cleared so a stale `'none'` cannot suppress the new marker.
32665
+ *
32666
+ * On load core prefixes a display-only marker segment (text "• " / "1.") to a
32667
+ * listed paragraph; the renderer drops it when its text matches the marker it
32668
+ * would draw, and the save writer drops it because the paragraph properties
32669
+ * already express it. Switching a bullet to a number (or off) would leave the
32670
+ * old glyph behind as literal text, so the previous marker is removed and a
32671
+ * fresh one authored in the same shape core uses.
32672
+ */
32673
+ /** The default character bullet PowerPoint inserts (`a:buChar char="•"`). */
32674
+ const DEFAULT_BULLET_CHAR = '•';
32675
+ /** The default numbering scheme PowerPoint inserts (`a:buAutoNum type="arabicPeriod"`). */
32676
+ const DEFAULT_AUTONUM_TYPE = 'arabicPeriod';
32677
+ /**
32678
+ * The `BulletInfo` that authors `kind`.
32679
+ *
32680
+ * @param ordinal - Zero-based position of the paragraph within its numbered
32681
+ * run, published as `paragraphIndex` so the renderer counts "1. 2. 3." (see
32682
+ * `BulletInfo.paragraphIndex`). Ignored for the other kinds.
32683
+ */
32684
+ function bulletInfoForKind(kind, ordinal = 0) {
32685
+ switch (kind) {
32686
+ case 'bullet':
32687
+ return { char: DEFAULT_BULLET_CHAR };
32688
+ case 'numbered':
32689
+ return { autoNumType: DEFAULT_AUTONUM_TYPE, autoNumStartAt: 1, paragraphIndex: ordinal };
32690
+ case 'none':
32691
+ return { none: true };
32692
+ }
32693
+ }
32694
+ /**
32695
+ * Whether a segment is the display-only marker core inserts on load (mirrors
32696
+ * the save writer's `isRenderedBulletMarker`): it carries `bulletInfo` and its
32697
+ * text is exactly the glyph the renderer would draw for that info.
32698
+ */
32699
+ function isBulletMarkerSegment(segment) {
32700
+ const bullet = segment.bulletInfo;
32701
+ if (!bullet || bullet.none) {
32702
+ return false;
32703
+ }
32704
+ const resolved = resolveParagraphBullet(segment);
32705
+ if (!resolved) {
32706
+ return false;
32707
+ }
32708
+ return segment.text.trim() === resolved.marker.trim() && segment.text.trim().length > 0;
32709
+ }
32710
+ /**
32711
+ * The current list state of one paragraph (its segments, separators excluded),
32712
+ * derived from the resolved bullet of its first segment so an inherited
32713
+ * (master / layout) bullet that core resolved on load counts as `'bullet'`.
32714
+ */
32715
+ function paragraphBulletKind(paragraph) {
32716
+ const resolved = resolveParagraphBullet(paragraph[0]);
32717
+ if (!resolved) {
32718
+ return 'none';
32719
+ }
32720
+ return resolved.isNumbered ? 'numbered' : 'bullet';
32721
+ }
32722
+ /** Copy of `style` without the inert `listType` flag. */
32723
+ function withoutListType(style) {
32724
+ const next = { ...(style ?? {}) };
32725
+ delete next.listType;
32726
+ return next;
32727
+ }
32728
+ function paragraphMeta(segment) {
32729
+ const meta = {};
32730
+ if (segment?.paragraphLevel !== undefined) {
32731
+ meta.paragraphLevel = segment.paragraphLevel;
32732
+ }
32733
+ if (segment?.paragraphProperties !== undefined) {
32734
+ meta.paragraphProperties = segment.paragraphProperties;
32735
+ }
32736
+ if (segment?.endParaRunProperties !== undefined) {
32737
+ meta.endParaRunProperties = segment.endParaRunProperties;
32738
+ }
32739
+ return meta;
32740
+ }
32741
+ /** The display text of the marker segment for a bullet / numbered `info`. */
32742
+ function markerText(info) {
32743
+ if (info.char) {
32744
+ return `${info.char} `;
32745
+ }
32746
+ const ordinal = (info.autoNumStartAt ?? 1) + (info.paragraphIndex ?? 0);
32747
+ return formatAutoNumberMarker(info.autoNumType ?? DEFAULT_AUTONUM_TYPE, ordinal);
32748
+ }
32749
+ /**
32750
+ * Set one paragraph's list state to `kind`, returning the paragraph's new
32751
+ * segments.
32752
+ *
32753
+ * The result uses the same shape core produces on load, so the renderer and
32754
+ * the save writer treat an authored list exactly like a parsed one: for
32755
+ * `'bullet'` / `'numbered'` a display-only marker segment carrying the new
32756
+ * `bulletInfo` (and the paragraph-level fields) is placed first, followed by
32757
+ * the content runs with any previous marker removed; for `'none'` the marker
32758
+ * is dropped and the first content segment carries `{ none: true }`. The
32759
+ * inert `style.listType` is cleared on the touched segments. An empty
32760
+ * paragraph is returned unchanged since there is no run to carry the state.
32761
+ *
32762
+ * @param ordinal - Zero-based position within a numbered run; see
32763
+ * {@link bulletInfoForKind}.
32764
+ */
32765
+ function toggleParagraphBullet(paragraph, kind, ordinal = 0) {
32766
+ const content = paragraph.filter((segment) => !isBulletMarkerSegment(segment));
32767
+ const first = content[0];
32768
+ if (!first) {
32769
+ return [...paragraph];
32770
+ }
32771
+ const meta = paragraphMeta(paragraph[0]);
32772
+ const info = bulletInfoForKind(kind, ordinal);
32773
+ const rest = content.slice(1);
32774
+ if (kind === 'none') {
32775
+ return [{ ...first, ...meta, style: withoutListType(first.style), bulletInfo: info }, ...rest];
32776
+ }
32777
+ const marker = {
32778
+ text: markerText(info),
32779
+ style: withoutListType(first.style),
32780
+ ...meta,
32781
+ bulletInfo: info,
32782
+ };
32783
+ const body = { ...first, style: withoutListType(first.style) };
32784
+ delete body.bulletInfo;
32785
+ return [marker, body, ...rest];
32786
+ }
32787
+ function isParagraphSeparator$1(segment) {
32788
+ return Boolean(segment.isParagraphBreak) || (segment.text === '\n' && !segment.isLineBreak);
32789
+ }
32790
+ /** Split a segment list into paragraphs, keeping each paragraph's terminator. */
32791
+ function splitParagraphs(segments) {
32792
+ const paragraphs = [
32793
+ { segments: [] },
32794
+ ];
32795
+ for (const segment of segments) {
32796
+ if (isParagraphSeparator$1(segment)) {
32797
+ paragraphs[paragraphs.length - 1].terminator = segment;
32798
+ paragraphs.push({ segments: [] });
32799
+ continue;
32800
+ }
32801
+ paragraphs[paragraphs.length - 1].segments.push(segment);
32802
+ }
32803
+ return paragraphs;
32804
+ }
32805
+ /** The element's segments, synthesised from `text` when it carries none. */
32806
+ function elementSegments(element) {
32807
+ if (!hasTextProperties(element)) {
32808
+ return [];
32809
+ }
32810
+ if (element.textSegments && element.textSegments.length > 0) {
32811
+ return element.textSegments;
32812
+ }
32813
+ const style = { ...(element.textStyle ?? {}) };
32814
+ const segments = [];
32815
+ for (const [index, line] of (element.text ?? '').split('\n').entries()) {
32816
+ if (index > 0) {
32817
+ segments.push({ text: '\n', style: { ...style }, isParagraphBreak: true });
32818
+ }
32819
+ segments.push({ text: line, style: { ...style } });
32820
+ }
32821
+ return segments;
32822
+ }
32823
+ /**
32824
+ * The list state an element's ribbon buttons should show: the kind of its
32825
+ * first non-empty paragraph, since that is what a toggle would act on.
32826
+ */
32827
+ function elementBulletKind(element) {
32828
+ for (const paragraph of splitParagraphs(elementSegments(element))) {
32829
+ if (paragraph.segments.length > 0) {
32830
+ return paragraphBulletKind(paragraph.segments);
32831
+ }
32832
+ }
32833
+ return 'none';
32834
+ }
32835
+ /**
32836
+ * Set every paragraph of an element to `kind`, returning the element patch
32837
+ * (`textSegments` rewritten; `textStyle.listType` cleared so the element-level
32838
+ * flag can no longer suppress or lie about the state). Numbered paragraphs are
32839
+ * counted consecutively so the renderer shows "1. 2. 3.".
32840
+ */
32841
+ function setElementBullets(element, kind) {
32842
+ const textStyle = withoutListType(hasTextProperties(element) ? element.textStyle : undefined);
32843
+ const next = [];
32844
+ let ordinal = 0;
32845
+ for (const paragraph of splitParagraphs(elementSegments(element))) {
32846
+ if (paragraph.segments.length > 0) {
32847
+ next.push(...toggleParagraphBullet(paragraph.segments, kind, ordinal));
32848
+ ordinal += 1;
32849
+ }
32850
+ if (paragraph.terminator) {
32851
+ next.push(paragraph.terminator);
32852
+ }
32853
+ }
32854
+ return { textSegments: next, textStyle };
32855
+ }
32856
+ /**
32857
+ * The ribbon button behaviour: pressing Bullets (or Numbering) on an element
32858
+ * already in that state turns its lists off, otherwise it applies that kind
32859
+ * to every paragraph. Returns the element patch to apply through the
32860
+ * binding's update-element operation.
32861
+ */
32862
+ function toggleElementBullets(element, kind) {
32863
+ return setElementBullets(element, elementBulletKind(element) === kind ? 'none' : kind);
32864
+ }
32865
+
32520
32866
  /**
32521
32867
  * PowerPoint's Outline view, as a framework-agnostic model of the deck's text.
32522
32868
  *
@@ -32680,16 +33026,17 @@ function isBulletMarker(segment) {
32680
33026
  if (!bullet) {
32681
33027
  return false;
32682
33028
  }
33029
+ if (bullet.autoNumType) {
33030
+ return bullet.paragraphIndex !== undefined && isBulletMarkerSegment(segment);
33031
+ }
32683
33032
  const marker = bullet.char
32684
33033
  ? `${bullet.char} `
32685
33034
  : bullet.imageRelId || bullet.imageDataUrl
32686
33035
  ? '\u{1F4CE} '
32687
- : bullet.autoNumType
32688
- ? undefined
32689
- : '• ';
32690
- return marker ? segment.text === marker : bullet.paragraphIndex !== undefined;
33036
+ : '• ';
33037
+ return segment.text === marker;
32691
33038
  }
32692
- function isParagraphSeparator$1(segment) {
33039
+ function isParagraphSeparator(segment) {
32693
33040
  return Boolean(segment.isParagraphBreak) || (segment.text === '\n' && !segment.isLineBreak);
32694
33041
  }
32695
33042
  /**
@@ -32710,7 +33057,7 @@ function groupElementParagraphs(element) {
32710
33057
  }
32711
33058
  const groups = [{ content: [] }];
32712
33059
  for (const segment of segments) {
32713
- if (isParagraphSeparator$1(segment)) {
33060
+ if (isParagraphSeparator(segment)) {
32714
33061
  groups.push({ content: [] });
32715
33062
  continue;
32716
33063
  }
@@ -38842,350 +39189,6 @@ function rulerDragToGuidePosition(pointerOffsetPx, scale, slideLengthPx) {
38842
39189
  return position;
38843
39190
  }
38844
39191
 
38845
- /**
38846
- * Auto-numbering helpers for paragraph bullets (framework-agnostic).
38847
- *
38848
- * Numbering schemes follow the OOXML `ST_TextAutonumberScheme` enumeration
38849
- * (ECMA-376 §20.1.10.61). The implementation lives in `pptx-viewer-core`
38850
- * (`core/utils/auto-number-format`) because the LOAD path needs the identical
38851
- * string: core stamps the marker onto the parsed bullet segment and the
38852
- * renderer resolves it again from `BulletInfo`, and the paragraph builder drops
38853
- * core's segment only when the two agree. While this module carried its own
38854
- * table the two disagreed for every East-Asian / Thai / Hindi / Hebrew scheme
38855
- * and painted a DOUBLE marker (`一.1. Item`). Core is the only package both
38856
- * sides can depend on (shared already depends on core; the reverse would be a
38857
- * cycle), so it owns the single copy and this module re-exports it.
38858
- */
38859
-
38860
- /**
38861
- * Pure paragraph bullet / list-marker + indent helpers (framework-agnostic).
38862
- *
38863
- * Mirrors React's paragraph + bullet renderer (`text-paragraph-render.tsx` +
38864
- * `text-segment-render.tsx`): bullet-glyph selection, auto-numbering (see
38865
- * {@link ./bullet-autonum}), bullet font/size/colour, and the marginLeft /
38866
- * hanging-indent layout. Shared by the React/Vue/Angular bindings.
38867
- */
38868
- /** Resolve React-compatible picture-bullet sizing and fallback metadata. */
38869
- function resolvePictureBullet(info, baseFontSize) {
38870
- if (!info.imageDataUrl && !info.imageRelId && !info.imageBlipFillXml) {
38871
- return undefined;
38872
- }
38873
- const sizePx = typeof info.sizePts === 'number'
38874
- ? info.sizePts
38875
- : typeof info.sizePercent === 'number'
38876
- ? baseFontSize * (info.sizePercent / 100)
38877
- : baseFontSize;
38878
- return {
38879
- ...(info.imageDataUrl ? { src: info.imageDataUrl } : {}),
38880
- sizePx,
38881
- fallbackMarker: '•',
38882
- accessibleLabel: 'Bullet',
38883
- ...(info.imageRelId ? { imageRelId: info.imageRelId } : {}),
38884
- };
38885
- }
38886
- /**
38887
- * Resolve the bullet marker for the first segment of a paragraph.
38888
- *
38889
- * Returns `undefined` when the segment is absent or carries no `bulletInfo`,
38890
- * when `bulletInfo.none`/`listType:'none'` suppresses it, or when neither a
38891
- * character bullet nor an auto-number type is present. For auto-numbered
38892
- * bullets the 1-based sequence index is `autoNumStartAt` (default 1) plus the
38893
- * 0-based `paragraphIndex`.
38894
- */
38895
- function resolveParagraphBullet(firstSegment, baseFontSize = firstSegment?.style?.fontSize ?? 16) {
38896
- if (!firstSegment) {
38897
- return undefined;
38898
- }
38899
- // listType on the first segment's style can explicitly suppress bullets.
38900
- if (firstSegment.style?.listType === 'none') {
38901
- return undefined;
38902
- }
38903
- const info = firstSegment.bulletInfo;
38904
- if (!info || info.none) {
38905
- return undefined;
38906
- }
38907
- const color = info.color;
38908
- const fontFamily = info.fontFamily;
38909
- const sizePts = typeof info.sizePts === 'number' ? info.sizePts : undefined;
38910
- const sizePercent = typeof info.sizePercent === 'number' ? info.sizePercent : undefined;
38911
- const picture = resolvePictureBullet(info, baseFontSize);
38912
- if (picture) {
38913
- return {
38914
- marker: picture.fallbackMarker,
38915
- isNumbered: false,
38916
- color,
38917
- fontFamily,
38918
- sizePts,
38919
- sizePercent,
38920
- picture,
38921
- };
38922
- }
38923
- // ── Auto-numbered list ──
38924
- if (info.autoNumType) {
38925
- const startAt = typeof info.autoNumStartAt === 'number' ? info.autoNumStartAt : 1;
38926
- const paraIdx = typeof info.paragraphIndex === 'number' ? info.paragraphIndex : 0;
38927
- const seqNum = Math.max(1, startAt + paraIdx);
38928
- return {
38929
- marker: formatAutoNumberMarker(info.autoNumType, seqNum),
38930
- isNumbered: true,
38931
- color,
38932
- fontFamily,
38933
- sizePts,
38934
- sizePercent,
38935
- };
38936
- }
38937
- // ── Character bullet ──
38938
- if (info.char) {
38939
- return { marker: info.char, isNumbered: false, color, fontFamily, sizePts, sizePercent };
38940
- }
38941
- // Unsupported cases have no marker to show as text.
38942
- return undefined;
38943
- }
38944
- /** Pixels of left-padding to apply per list nesting level. */
38945
- const INDENT_PX_PER_LEVEL = 18;
38946
- /**
38947
- * Return the left-indent in pixels for the given 0-based list nesting level
38948
- * (OOXML `a:p/@lvl`). `undefined`/negative is treated as level 0. Used as a
38949
- * fallback when the element carries no explicit per-paragraph `marginLeft`.
38950
- */
38951
- function bulletIndentPx(level) {
38952
- const lvl = typeof level === 'number' && level > 0 ? level : 0;
38953
- return lvl * INDENT_PX_PER_LEVEL;
38954
- }
38955
- /**
38956
- * Resolve the hanging-indent layout for a paragraph (mirrors React's
38957
- * `text-paragraph-render.tsx`). Explicit `paragraphIndents[paraIndex]`
38958
- * `marginLeft`/`indent` are used verbatim (zeros omitted); otherwise falls back
38959
- * to the per-level indent derived from `paragraphLevel`.
38960
- */
38961
- function resolveParagraphIndent(paraIndent, paragraphLevel) {
38962
- const marginLeft = typeof paraIndent?.marginLeft === 'number' && paraIndent.marginLeft !== 0
38963
- ? paraIndent.marginLeft
38964
- : undefined;
38965
- const textIndent = typeof paraIndent?.indent === 'number' && paraIndent.indent !== 0
38966
- ? paraIndent.indent
38967
- : undefined;
38968
- if (marginLeft === undefined && textIndent === undefined) {
38969
- const levelPx = bulletIndentPx(paragraphLevel);
38970
- return levelPx > 0 ? { marginLeftPx: levelPx } : {};
38971
- }
38972
- return { marginLeftPx: marginLeft, textIndentPx: textIndent };
38973
- }
38974
-
38975
- /**
38976
- * Bullet / numbered-list toggling for the ribbon's paragraph buttons.
38977
- *
38978
- * The renderer (`resolveParagraphBullet`) and the save writer
38979
- * (`applyBulletProperties`) both read a paragraph's list state from the
38980
- * `bulletInfo` of its FIRST segment; `TextStyle.listType` is consulted for
38981
- * nothing but the `'none'` suppression. Every binding's Bullets / Numbering
38982
- * button used to write `listType: 'bullet' | 'numbered'` onto the element's
38983
- * `textStyle`, a field nothing downstream reads, so the buttons were dead.
38984
- *
38985
- * These helpers author the real thing: a `BulletInfo` on each paragraph's
38986
- * first segment (`a:buChar` / `a:buAutoNum` / `a:buNone` on save), with the
38987
- * inert `listType` cleared so a stale `'none'` cannot suppress the new marker.
38988
- *
38989
- * On load core prefixes a display-only marker segment (text "• " / "1.") to a
38990
- * listed paragraph; the renderer drops it when its text matches the marker it
38991
- * would draw, and the save writer drops it because the paragraph properties
38992
- * already express it. Switching a bullet to a number (or off) would leave the
38993
- * old glyph behind as literal text, so the previous marker is removed and a
38994
- * fresh one authored in the same shape core uses.
38995
- */
38996
- /** The default character bullet PowerPoint inserts (`a:buChar char="•"`). */
38997
- const DEFAULT_BULLET_CHAR = '•';
38998
- /** The default numbering scheme PowerPoint inserts (`a:buAutoNum type="arabicPeriod"`). */
38999
- const DEFAULT_AUTONUM_TYPE = 'arabicPeriod';
39000
- /**
39001
- * The `BulletInfo` that authors `kind`.
39002
- *
39003
- * @param ordinal - Zero-based position of the paragraph within its numbered
39004
- * run, published as `paragraphIndex` so the renderer counts "1. 2. 3." (see
39005
- * `BulletInfo.paragraphIndex`). Ignored for the other kinds.
39006
- */
39007
- function bulletInfoForKind(kind, ordinal = 0) {
39008
- switch (kind) {
39009
- case 'bullet':
39010
- return { char: DEFAULT_BULLET_CHAR };
39011
- case 'numbered':
39012
- return { autoNumType: DEFAULT_AUTONUM_TYPE, autoNumStartAt: 1, paragraphIndex: ordinal };
39013
- case 'none':
39014
- return { none: true };
39015
- }
39016
- }
39017
- /**
39018
- * Whether a segment is the display-only marker core inserts on load (mirrors
39019
- * the save writer's `isRenderedBulletMarker`): it carries `bulletInfo` and its
39020
- * text is exactly the glyph the renderer would draw for that info.
39021
- */
39022
- function isBulletMarkerSegment(segment) {
39023
- const bullet = segment.bulletInfo;
39024
- if (!bullet || bullet.none) {
39025
- return false;
39026
- }
39027
- const resolved = resolveParagraphBullet(segment);
39028
- if (!resolved) {
39029
- return false;
39030
- }
39031
- return segment.text.trim() === resolved.marker.trim() && segment.text.trim().length > 0;
39032
- }
39033
- /**
39034
- * The current list state of one paragraph (its segments, separators excluded),
39035
- * derived from the resolved bullet of its first segment so an inherited
39036
- * (master / layout) bullet that core resolved on load counts as `'bullet'`.
39037
- */
39038
- function paragraphBulletKind(paragraph) {
39039
- const resolved = resolveParagraphBullet(paragraph[0]);
39040
- if (!resolved) {
39041
- return 'none';
39042
- }
39043
- return resolved.isNumbered ? 'numbered' : 'bullet';
39044
- }
39045
- /** Copy of `style` without the inert `listType` flag. */
39046
- function withoutListType(style) {
39047
- const next = { ...(style ?? {}) };
39048
- delete next.listType;
39049
- return next;
39050
- }
39051
- function paragraphMeta(segment) {
39052
- const meta = {};
39053
- if (segment?.paragraphLevel !== undefined) {
39054
- meta.paragraphLevel = segment.paragraphLevel;
39055
- }
39056
- if (segment?.paragraphProperties !== undefined) {
39057
- meta.paragraphProperties = segment.paragraphProperties;
39058
- }
39059
- if (segment?.endParaRunProperties !== undefined) {
39060
- meta.endParaRunProperties = segment.endParaRunProperties;
39061
- }
39062
- return meta;
39063
- }
39064
- /** The display text of the marker segment for a bullet / numbered `info`. */
39065
- function markerText(info) {
39066
- if (info.char) {
39067
- return `${info.char} `;
39068
- }
39069
- const ordinal = (info.autoNumStartAt ?? 1) + (info.paragraphIndex ?? 0);
39070
- return formatAutoNumberMarker(info.autoNumType ?? DEFAULT_AUTONUM_TYPE, ordinal);
39071
- }
39072
- /**
39073
- * Set one paragraph's list state to `kind`, returning the paragraph's new
39074
- * segments.
39075
- *
39076
- * The result uses the same shape core produces on load, so the renderer and
39077
- * the save writer treat an authored list exactly like a parsed one: for
39078
- * `'bullet'` / `'numbered'` a display-only marker segment carrying the new
39079
- * `bulletInfo` (and the paragraph-level fields) is placed first, followed by
39080
- * the content runs with any previous marker removed; for `'none'` the marker
39081
- * is dropped and the first content segment carries `{ none: true }`. The
39082
- * inert `style.listType` is cleared on the touched segments. An empty
39083
- * paragraph is returned unchanged since there is no run to carry the state.
39084
- *
39085
- * @param ordinal - Zero-based position within a numbered run; see
39086
- * {@link bulletInfoForKind}.
39087
- */
39088
- function toggleParagraphBullet(paragraph, kind, ordinal = 0) {
39089
- const content = paragraph.filter((segment) => !isBulletMarkerSegment(segment));
39090
- const first = content[0];
39091
- if (!first) {
39092
- return [...paragraph];
39093
- }
39094
- const meta = paragraphMeta(paragraph[0]);
39095
- const info = bulletInfoForKind(kind, ordinal);
39096
- const rest = content.slice(1);
39097
- if (kind === 'none') {
39098
- return [{ ...first, ...meta, style: withoutListType(first.style), bulletInfo: info }, ...rest];
39099
- }
39100
- const marker = {
39101
- text: markerText(info),
39102
- style: withoutListType(first.style),
39103
- ...meta,
39104
- bulletInfo: info,
39105
- };
39106
- const body = { ...first, style: withoutListType(first.style) };
39107
- delete body.bulletInfo;
39108
- return [marker, body, ...rest];
39109
- }
39110
- function isParagraphSeparator(segment) {
39111
- return Boolean(segment.isParagraphBreak) || (segment.text === '\n' && !segment.isLineBreak);
39112
- }
39113
- /** Split a segment list into paragraphs, keeping each paragraph's terminator. */
39114
- function splitParagraphs(segments) {
39115
- const paragraphs = [
39116
- { segments: [] },
39117
- ];
39118
- for (const segment of segments) {
39119
- if (isParagraphSeparator(segment)) {
39120
- paragraphs[paragraphs.length - 1].terminator = segment;
39121
- paragraphs.push({ segments: [] });
39122
- continue;
39123
- }
39124
- paragraphs[paragraphs.length - 1].segments.push(segment);
39125
- }
39126
- return paragraphs;
39127
- }
39128
- /** The element's segments, synthesised from `text` when it carries none. */
39129
- function elementSegments(element) {
39130
- if (!hasTextProperties(element)) {
39131
- return [];
39132
- }
39133
- if (element.textSegments && element.textSegments.length > 0) {
39134
- return element.textSegments;
39135
- }
39136
- const style = { ...(element.textStyle ?? {}) };
39137
- const segments = [];
39138
- for (const [index, line] of (element.text ?? '').split('\n').entries()) {
39139
- if (index > 0) {
39140
- segments.push({ text: '\n', style: { ...style }, isParagraphBreak: true });
39141
- }
39142
- segments.push({ text: line, style: { ...style } });
39143
- }
39144
- return segments;
39145
- }
39146
- /**
39147
- * The list state an element's ribbon buttons should show: the kind of its
39148
- * first non-empty paragraph, since that is what a toggle would act on.
39149
- */
39150
- function elementBulletKind(element) {
39151
- for (const paragraph of splitParagraphs(elementSegments(element))) {
39152
- if (paragraph.segments.length > 0) {
39153
- return paragraphBulletKind(paragraph.segments);
39154
- }
39155
- }
39156
- return 'none';
39157
- }
39158
- /**
39159
- * Set every paragraph of an element to `kind`, returning the element patch
39160
- * (`textSegments` rewritten; `textStyle.listType` cleared so the element-level
39161
- * flag can no longer suppress or lie about the state). Numbered paragraphs are
39162
- * counted consecutively so the renderer shows "1. 2. 3.".
39163
- */
39164
- function setElementBullets(element, kind) {
39165
- const textStyle = withoutListType(hasTextProperties(element) ? element.textStyle : undefined);
39166
- const next = [];
39167
- let ordinal = 0;
39168
- for (const paragraph of splitParagraphs(elementSegments(element))) {
39169
- if (paragraph.segments.length > 0) {
39170
- next.push(...toggleParagraphBullet(paragraph.segments, kind, ordinal));
39171
- ordinal += 1;
39172
- }
39173
- if (paragraph.terminator) {
39174
- next.push(paragraph.terminator);
39175
- }
39176
- }
39177
- return { textSegments: next, textStyle };
39178
- }
39179
- /**
39180
- * The ribbon button behaviour: pressing Bullets (or Numbering) on an element
39181
- * already in that state turns its lists off, otherwise it applies that kind
39182
- * to every paragraph. Returns the element patch to apply through the
39183
- * binding's update-element operation.
39184
- */
39185
- function toggleElementBullets(element, kind) {
39186
- return setElementBullets(element, elementBulletKind(element) === kind ? 'none' : kind);
39187
- }
39188
-
39189
39192
  /**
39190
39193
  * notes-utils.ts: framework-agnostic pure helpers for the rich speaker-notes
39191
39194
  * editor, shared by the React, Vue, and Angular bindings.
@@ -48193,96 +48196,94 @@ function buildLeaderString(leader, widthPx, fontSizePx = 16) {
48193
48196
  return char.repeat(count);
48194
48197
  }
48195
48198
 
48196
- let pendingRestore = null;
48197
- function setPendingSelectionRestore(sel) {
48198
- pendingRestore = sel;
48199
- }
48200
- /** Read-once: clears the stored value after returning it. */
48201
- function getPendingSelectionRestore() {
48202
- const sel = pendingRestore;
48203
- pendingRestore = null;
48204
- return sel;
48205
- }
48206
48199
  /**
48207
48200
  * Read the current browser selection and, if it falls within an
48208
48201
  * `[data-inline-editor]` element, return the segment-level range.
48209
48202
  *
48210
- * Returns `null` when there is no selection, the selection is collapsed
48211
- * (just a cursor), or the selection is outside the inline editor.
48203
+ * Returns `null` when there is no editable text selected, the selection is
48204
+ * collapsed (just a cursor), or the selection is outside the inline editor.
48212
48205
  */
48213
48206
  function getInlineEditorSelection(segments) {
48214
- if (!segments || segments.length === 0) {
48207
+ if (!segments?.length) {
48215
48208
  return null;
48216
48209
  }
48217
- const sel = window.getSelection();
48218
- if (!sel || sel.rangeCount === 0 || sel.isCollapsed) {
48210
+ const selection = window.getSelection();
48211
+ if (!selection || selection.rangeCount === 0 || selection.isCollapsed) {
48212
+ return null;
48213
+ }
48214
+ // A Range is always in document order, including for a backwards selection.
48215
+ const range = selection.getRangeAt(0);
48216
+ const editor = findEditorContainer(range.startContainer);
48217
+ if (!editor || !editor.contains(range.endContainer) || range.toString().length === 0) {
48219
48218
  return null;
48220
48219
  }
48221
- const { anchorNode, anchorOffset, focusNode, focusOffset } = sel;
48222
- if (!anchorNode || !focusNode) {
48220
+ const start = getSegmentPosition(editor, range.startContainer, range.startOffset, segments);
48221
+ const end = getSegmentPosition(editor, range.endContainer, range.endOffset, segments);
48222
+ if (!start || !end) {
48223
48223
  return null;
48224
48224
  }
48225
- const editor = findEditorContainer(anchorNode);
48226
- if (!editor || !editor.contains(focusNode)) {
48225
+ const renderedSpans = Array.from(editor.querySelectorAll('[data-seg-idx]'));
48226
+ const startSpanIndex = renderedSpans.indexOf(start.span);
48227
+ const endSpanIndex = renderedSpans.indexOf(end.span);
48228
+ if (startSpanIndex < 0 || endSpanIndex < startSpanIndex) {
48227
48229
  return null;
48228
48230
  }
48229
- const anchorInfo = getSegmentPosition(editor, anchorNode, anchorOffset, segments);
48230
- const focusInfo = getSegmentPosition(editor, focusNode, focusOffset, segments);
48231
- if (!anchorInfo || !focusInfo) {
48231
+ const selectedSpans = renderedSpans.slice(startSpanIndex, endSpanIndex + 1);
48232
+ const first = selectedSpans.find((span) => isEditableSpan(span, segments) && (span !== start.span || start.offset < start.textLength));
48233
+ const last = [...selectedSpans]
48234
+ .reverse()
48235
+ .find((span) => isEditableSpan(span, segments) && (span !== end.span || end.offset > 0));
48236
+ if (!first || !last) {
48232
48237
  return null;
48233
48238
  }
48234
- // Normalize so start <= end.
48235
- const [start, end] = anchorInfo.absOffset <= focusInfo.absOffset ? [anchorInfo, focusInfo] : [focusInfo, anchorInfo];
48236
48239
  return {
48237
- startSegIdx: start.segIdx,
48238
- startOffset: start.offsetInSeg,
48239
- endSegIdx: end.segIdx,
48240
- endOffset: end.offsetInSeg,
48240
+ startSegIdx: getSegmentIndex(first),
48241
+ startOffset: first === start.span ? start.offset : 0,
48242
+ endSegIdx: getSegmentIndex(last),
48243
+ endOffset: last === end.span ? end.offset : (last.textContent?.length ?? 0),
48241
48244
  };
48242
48245
  }
48246
+ function isEditableSpan(span, segments) {
48247
+ const segment = segments[getSegmentIndex(span)];
48248
+ return Boolean(segment &&
48249
+ !segment.isParagraphBreak &&
48250
+ segment.text !== '\n' &&
48251
+ !isBulletMarkerSegment(segment) &&
48252
+ (span.textContent?.length ?? 0) > 0);
48253
+ }
48254
+ function getSegmentIndex(span) {
48255
+ return Number(span.getAttribute('data-seg-idx'));
48256
+ }
48243
48257
  function findEditorContainer(node) {
48244
- const el = node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement;
48245
- return el?.closest('[data-inline-editor]') ?? null;
48258
+ const element = node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement;
48259
+ return element?.closest('[data-inline-editor]') ?? null;
48246
48260
  }
48247
48261
  function getSegmentPosition(editor, node, offset, segments) {
48248
- const el = node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement;
48249
- if (!el) {
48250
- return null;
48251
- }
48252
- const segSpan = el.closest('[data-seg-idx]');
48253
- if (!segSpan || !editor.contains(segSpan)) {
48262
+ const element = node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement;
48263
+ const span = element?.closest('[data-seg-idx]');
48264
+ if (!span || !editor.contains(span)) {
48254
48265
  return null;
48255
48266
  }
48256
- const segIdx = parseInt(segSpan.getAttribute('data-seg-idx'), 10);
48257
- if (isNaN(segIdx) || segIdx < 0 || segIdx >= segments.length) {
48267
+ const segIdx = getSegmentIndex(span);
48268
+ if (!Number.isInteger(segIdx) || segIdx < 0 || segIdx >= segments.length) {
48258
48269
  return null;
48259
48270
  }
48260
- const offsetInSeg = getTextOffsetWithin(segSpan, node, offset);
48261
- // Absolute offset = sum of all segment text lengths before this one + offset.
48262
- let absOffset = 0;
48263
- for (let i = 0; i < segIdx; i++) {
48264
- absOffset += segments[i].text.length;
48265
- }
48266
- absOffset += offsetInSeg;
48267
- return { segIdx, offsetInSeg, absOffset };
48271
+ return {
48272
+ segIdx,
48273
+ offset: getTextOffsetWithin(span, node, offset),
48274
+ span,
48275
+ textLength: span.textContent?.length ?? 0,
48276
+ };
48268
48277
  }
48269
- /**
48270
- * Compute the character offset of a DOM position (node + offset) relative to
48271
- * the text content of a container element.
48272
- */
48273
48278
  function getTextOffsetWithin(container, targetNode, targetOffset) {
48274
- // When the target IS the container (or an element child), offset is a
48275
- // child-index count, not a character count.
48276
48279
  if (targetNode === container || targetNode.nodeType === Node.ELEMENT_NODE) {
48277
48280
  const parent = targetNode === container ? container : targetNode;
48278
48281
  let count = 0;
48279
- for (let i = 0; i < targetOffset && i < parent.childNodes.length; i++) {
48280
- count += (parent.childNodes[i].textContent || '').length;
48282
+ for (let index = 0; index < targetOffset && index < parent.childNodes.length; index++) {
48283
+ count += parent.childNodes[index].textContent?.length ?? 0;
48281
48284
  }
48282
48285
  return count;
48283
48286
  }
48284
- // Walk text nodes in document order and accumulate lengths until we hit the
48285
- // target text node.
48286
48287
  const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT);
48287
48288
  let charCount = 0;
48288
48289
  let node;
@@ -48294,6 +48295,17 @@ function getTextOffsetWithin(container, targetNode, targetOffset) {
48294
48295
  }
48295
48296
  return charCount;
48296
48297
  }
48298
+
48299
+ let pendingRestore = null;
48300
+ function setPendingSelectionRestore(sel) {
48301
+ pendingRestore = sel;
48302
+ }
48303
+ /** Read-once: clears the stored value after returning it. */
48304
+ function getPendingSelectionRestore() {
48305
+ const sel = pendingRestore;
48306
+ pendingRestore = null;
48307
+ return sel;
48308
+ }
48297
48309
  /**
48298
48310
  * Apply `updates` only to the characters within the selection range. Segments
48299
48311
  * at the boundaries are split; segments outside the range are copied unchanged.
@@ -50245,6 +50257,37 @@ function hasCopyableFormat(element) {
50245
50257
  return hasShapeProperties(element) || hasTextProperties(element);
50246
50258
  }
50247
50259
 
50260
+ /**
50261
+ * Remove marker text from editor surfaces that seed it as ordinary text.
50262
+ * Depending on the binding, the gap can be CSS (`"1.Item"`) or the parsed
50263
+ * marker's trailing space (`"1. Item"`). React instead annotates its rendered
50264
+ * marker so `readEditableText` can exclude it at the DOM boundary.
50265
+ */
50266
+ function withoutRenderedBulletPrefix(text, originalSegments, dedicatedMarker) {
50267
+ if (!dedicatedMarker) {
50268
+ return text;
50269
+ }
50270
+ const resolved = resolveParagraphBullet(dedicatedMarker);
50271
+ if (!resolved || !text.startsWith(resolved.marker)) {
50272
+ return text;
50273
+ }
50274
+ const withoutMarker = text.slice(resolved.marker.length);
50275
+ const originalContent = originalSegments
50276
+ .slice(1)
50277
+ .map((segment) => segment.text)
50278
+ .join('');
50279
+ // Empty list paragraphs do not render a marker, so marker-like text typed
50280
+ // into them is authored content and must not be stripped.
50281
+ if (originalContent.trim().length === 0) {
50282
+ return text;
50283
+ }
50284
+ const originalLeadingSpaces = originalContent.length - originalContent.trimStart().length;
50285
+ const editedLeadingSpaces = withoutMarker.length - withoutMarker.trimStart().length;
50286
+ if (editedLeadingSpaces > originalLeadingSpaces) {
50287
+ return withoutMarker.slice(1);
50288
+ }
50289
+ return withoutMarker;
50290
+ }
50248
50291
  /**
50249
50292
  * Whether an original segment is ATOMIC: its rendered text is not what is
50250
50293
  * literally stored (a field re-substitutes its live value at render, from
@@ -50294,6 +50337,34 @@ function copySegmentMetadata(from, to) {
50294
50337
  }
50295
50338
  return to;
50296
50339
  }
50340
+ /**
50341
+ * Restore paragraph-scoped metadata on the first remapped run. Core and the
50342
+ * save writer deliberately carry these values on that run only; remapping the
50343
+ * characters must not turn an authored paragraph back into a default one.
50344
+ */
50345
+ function restoreParagraphMetadata(from, segments) {
50346
+ if (segments.length === 0) {
50347
+ return segments;
50348
+ }
50349
+ const [first, ...rest] = segments;
50350
+ const restored = { ...first };
50351
+ // `remapParagraph` may itself return a donor segment. Clear its paragraph
50352
+ // fields first so an extra paragraph cannot accidentally inherit metadata
50353
+ // merely because it reused the final paragraph for run styling.
50354
+ delete restored.paragraphLevel;
50355
+ delete restored.paragraphProperties;
50356
+ delete restored.endParaRunProperties;
50357
+ if (from?.paragraphLevel !== undefined) {
50358
+ restored.paragraphLevel = from.paragraphLevel;
50359
+ }
50360
+ if (from?.paragraphProperties !== undefined) {
50361
+ restored.paragraphProperties = from.paragraphProperties;
50362
+ }
50363
+ if (from?.endParaRunProperties !== undefined) {
50364
+ restored.endParaRunProperties = from.endParaRunProperties;
50365
+ }
50366
+ return [restored, ...rest];
50367
+ }
50297
50368
  /**
50298
50369
  * Strategy:
50299
50370
  * 1. Split both original segments and new text into paragraphs by "\n".
@@ -50306,18 +50377,25 @@ function remapTextToSegments(newText, originalSegments, elementTextStyle) {
50306
50377
  if (!originalSegments || originalSegments.length === 0) {
50307
50378
  return [{ text: newText, style: fallbackStyle }];
50308
50379
  }
50309
- // Split original segments into paragraphs by paragraph-break markers.
50310
- const originalParagraphs = [[]];
50380
+ // Split original segments into paragraphs by paragraph-break markers. Keep
50381
+ // each terminator because an authored empty paragraph has no content run, so
50382
+ // core carries its paragraph metadata on the terminator itself.
50383
+ const originalParagraphs = [
50384
+ { segments: [] },
50385
+ ];
50311
50386
  for (const seg of originalSegments) {
50312
50387
  if (seg.text === '\n' || seg.isParagraphBreak) {
50313
- originalParagraphs.push([]);
50388
+ originalParagraphs[originalParagraphs.length - 1].terminator = seg;
50389
+ originalParagraphs.push({ segments: [] });
50314
50390
  }
50315
50391
  else {
50316
- originalParagraphs[originalParagraphs.length - 1].push(seg);
50392
+ originalParagraphs[originalParagraphs.length - 1].segments.push(seg);
50317
50393
  }
50318
50394
  }
50319
50395
  const newParagraphTexts = newText.split('\n');
50320
- const firstContentSeg = originalParagraphs.flat().find((s) => s.text.trim().length > 0);
50396
+ const firstContentSeg = originalParagraphs
50397
+ .flatMap((paragraph) => paragraph.segments)
50398
+ .find((s) => s.text.trim().length > 0);
50321
50399
  const baseFallbackStyle = firstContentSeg?.style
50322
50400
  ? { ...firstContentSeg.style }
50323
50401
  : fallbackStyle;
@@ -50327,6 +50405,20 @@ function remapTextToSegments(newText, originalSegments, elementTextStyle) {
50327
50405
  ? [{ text: paraNewText, style: { ...baseFallbackStyle } }]
50328
50406
  : [{ text: '', style: { ...baseFallbackStyle } }];
50329
50407
  }
50408
+ const firstSegment = paraOrigSegments[0];
50409
+ const dedicatedMarker = isBulletMarkerSegment(firstSegment) &&
50410
+ (!firstSegment.bulletInfo?.autoNumType ||
50411
+ firstSegment.bulletInfo.paragraphIndex !== undefined)
50412
+ ? firstSegment
50413
+ : undefined;
50414
+ if (dedicatedMarker) {
50415
+ const contentSegments = paraOrigSegments.slice(1);
50416
+ const contentText = withoutRenderedBulletPrefix(paraNewText, paraOrigSegments, dedicatedMarker);
50417
+ const content = contentSegments.length > 0
50418
+ ? remapParagraph(contentText, contentSegments)
50419
+ : [{ text: contentText, style: { ...dedicatedMarker.style } }];
50420
+ return [dedicatedMarker, ...content];
50421
+ }
50330
50422
  const paragraphBulletInfo = paraOrigSegments[0].bulletInfo;
50331
50423
  if (paraNewText.length === 0) {
50332
50424
  const emptyStyle = { ...paraOrigSegments[0].style };
@@ -50405,17 +50497,18 @@ function remapTextToSegments(newText, originalSegments, elementTextStyle) {
50405
50497
  return remapped;
50406
50498
  }
50407
50499
  const output = [];
50408
- const lastOrigPara = originalParagraphs[originalParagraphs.length - 1];
50500
+ const lastOrigPara = originalParagraphs[originalParagraphs.length - 1]?.segments;
50409
50501
  for (let pi = 0; pi < newParagraphTexts.length; pi++) {
50410
50502
  if (pi > 0) {
50411
- const precedingOrigPara = originalParagraphs[pi - 1] ?? [];
50503
+ const precedingOrigPara = originalParagraphs[pi - 1]?.segments ?? [];
50412
50504
  const breakStyle = precedingOrigPara[0]?.style
50413
50505
  ? { ...precedingOrigPara[0].style }
50414
50506
  : { ...baseFallbackStyle };
50415
50507
  output.push({ text: '\n', style: breakStyle, isParagraphBreak: true });
50416
50508
  }
50417
- const origPara = originalParagraphs[pi] ?? lastOrigPara ?? [];
50418
- const paraSegments = remapParagraph(newParagraphTexts[pi], origPara);
50509
+ const originalParagraph = originalParagraphs[pi];
50510
+ const origPara = originalParagraph?.segments ?? lastOrigPara ?? [];
50511
+ const paraSegments = restoreParagraphMetadata(originalParagraph?.segments[0] ?? originalParagraph?.terminator, remapParagraph(newParagraphTexts[pi], origPara));
50419
50512
  output.push(...paraSegments);
50420
50513
  }
50421
50514
  return output.length > 0 ? output : [{ text: '', style: { ...baseFallbackStyle } }];
@@ -61182,6 +61275,105 @@ function smartArtNodeLabel(node) {
61182
61275
  };
61183
61276
  }
61184
61277
 
61278
+ /**
61279
+ * Regular-text font sizes are stored in slide/CSS pixels in the shared model,
61280
+ * while PowerPoint's font controls and the preset list below use points.
61281
+ */
61282
+ function textFontSizePxToPt(fontSizePx) {
61283
+ // DrawingML stores regular text sizes in hundredths of a point. Normalising
61284
+ // to that precision removes binary floating-point noise without discarding
61285
+ // valid authored values such as 10.5 pt or 48.1 pt.
61286
+ return Math.round(fontSizePx * (72 / 96) * 100) / 100;
61287
+ }
61288
+ /** Convert a PowerPoint font-control value in points to the model's pixels. */
61289
+ function textFontSizePtToPx(fontSizePt) {
61290
+ return fontSizePt * (96 / 72);
61291
+ }
61292
+ /**
61293
+ * Font families offered by the Home-tab font dropdown, alphabetically.
61294
+ *
61295
+ * Covers the families PowerPoint's own list leads with (the Office UI faces,
61296
+ * the Aptos family that replaced Calibri as the default theme font, and the
61297
+ * classic Windows/Mac core fonts) plus the handful of web faces decks
61298
+ * routinely arrive with. Entries the host cannot resolve simply fall back
61299
+ * through the CSS font stack, so listing a family costs nothing but gives the
61300
+ * user a name to pick when the deck already references it.
61301
+ */
61302
+ const COMMON_FONT_FAMILIES = [
61303
+ 'Abadi',
61304
+ 'Aptos',
61305
+ 'Aptos Display',
61306
+ 'Arial',
61307
+ 'Arial Black',
61308
+ 'Arial Narrow',
61309
+ 'Bahnschrift',
61310
+ 'Book Antiqua',
61311
+ 'Bookman Old Style',
61312
+ 'Calibri',
61313
+ 'Calibri Light',
61314
+ 'Cambria',
61315
+ 'Candara',
61316
+ 'Century Gothic',
61317
+ 'Comic Sans MS',
61318
+ 'Consolas',
61319
+ 'Corbel',
61320
+ 'Courier New',
61321
+ 'Franklin Gothic Book',
61322
+ 'Franklin Gothic Medium',
61323
+ 'Garamond',
61324
+ 'Georgia',
61325
+ 'Gill Sans MT',
61326
+ 'Helvetica',
61327
+ 'Impact',
61328
+ 'Inter',
61329
+ 'Lucida Console',
61330
+ 'Lucida Sans Unicode',
61331
+ 'Microsoft Sans Serif',
61332
+ 'Montserrat',
61333
+ 'Noto Sans',
61334
+ 'Open Sans',
61335
+ 'Palatino Linotype',
61336
+ 'Poppins',
61337
+ 'Roboto',
61338
+ 'Rockwell',
61339
+ 'Segoe UI',
61340
+ 'Source Sans Pro',
61341
+ 'Tahoma',
61342
+ 'Times New Roman',
61343
+ 'Trebuchet MS',
61344
+ 'Tw Cen MT',
61345
+ 'Verdana',
61346
+ ];
61347
+ /** Font sizes (pt) offered by the Home-tab size dropdown. */
61348
+ const COMMON_FONT_SIZES = [
61349
+ 8, 9, 10, 11, 12, 14, 16, 18, 20, 24, 28, 32, 36, 40, 44, 48, 54, 60, 72, 96,
61350
+ ];
61351
+ /** Character-spacing presets for the toolbar dropdown. */
61352
+ const CHARACTER_SPACING_OPTIONS = [
61353
+ { label: 'Very Tight', i18nKey: 'pptx.text.characterSpacingVeryTight', value: -150 },
61354
+ { label: 'Tight', i18nKey: 'pptx.text.characterSpacingTight', value: -75 },
61355
+ { label: 'Normal', i18nKey: 'pptx.text.characterSpacingNormal', value: 0 },
61356
+ { label: 'Loose', i18nKey: 'pptx.text.characterSpacingLoose', value: 75 },
61357
+ { label: 'Very Loose', i18nKey: 'pptx.text.characterSpacingVeryLoose', value: 150 },
61358
+ ];
61359
+ /** Line-spacing presets for the paragraph dropdown. */
61360
+ const LINE_SPACING_OPTIONS$1 = [
61361
+ { label: '1.0', value: 1.0 },
61362
+ { label: '1.15', value: 1.15 },
61363
+ { label: '1.5', value: 1.5 },
61364
+ { label: '2.0', value: 2.0 },
61365
+ { label: '2.5', value: 2.5 },
61366
+ { label: '3.0', value: 3.0 },
61367
+ ];
61368
+ /** Change-case options in menu order (matches PowerPoint's ordering). */
61369
+ const CHANGE_CASE_OPTIONS$1 = [
61370
+ { value: 'sentence', i18nKey: 'pptx.text.changeCaseSentence' },
61371
+ { value: 'lower', i18nKey: 'pptx.text.changeCaseLower' },
61372
+ { value: 'upper', i18nKey: 'pptx.text.changeCaseUpper' },
61373
+ { value: 'capitalize', i18nKey: 'pptx.text.changeCaseCapitalize' },
61374
+ { value: 'toggle', i18nKey: 'pptx.text.changeCaseToggle' },
61375
+ ];
61376
+
61185
61377
  /**
61186
61378
  * inspector-helpers.ts: Pure (no framework) helpers for the inspector panel.
61187
61379
  *
@@ -61239,10 +61431,10 @@ function textColorOf(el) {
61239
61431
  */
61240
61432
  function fontSizeOf(el, presentationDefault) {
61241
61433
  if (hasTextProperties(el) && el.textStyle?.fontSize !== undefined) {
61242
- return el.textStyle.fontSize;
61434
+ return textFontSizePxToPt(el.textStyle.fontSize);
61243
61435
  }
61244
61436
  const deckDefault = presentationDefault?.levelStyles?.[0]?.fontSize;
61245
- return deckDefault ?? DEFAULT_FONT_SIZE$1;
61437
+ return deckDefault === undefined ? DEFAULT_FONT_SIZE$1 : textFontSizePxToPt(deckDefault);
61246
61438
  }
61247
61439
  /** Returns whether the element's text is bold (false when absent). */
61248
61440
  function isBold(el) {
@@ -61291,6 +61483,20 @@ function textStylePatch(el, changes) {
61291
61483
  },
61292
61484
  };
61293
61485
  }
61486
+ /** Apply an ordinary-text model pixel size to the element and all of its runs. */
61487
+ function textFontSizePatch(el, fontSize) {
61488
+ const patch = textStylePatch(el, { fontSize });
61489
+ if (!hasTextProperties(el) || !el.textSegments) {
61490
+ return patch;
61491
+ }
61492
+ return {
61493
+ ...patch,
61494
+ textSegments: el.textSegments.map((segment) => ({
61495
+ ...segment,
61496
+ style: { ...segment.style, fontSize },
61497
+ })),
61498
+ };
61499
+ }
61294
61500
 
61295
61501
  /**
61296
61502
  * effects-shadow-helpers.ts: Pure (no framework) outer/inner shadow helpers
@@ -75371,91 +75577,6 @@ const SHAPE_PRESET_DEFS = [
75371
75577
  },
75372
75578
  ];
75373
75579
 
75374
- /**
75375
- * Font families offered by the Home-tab font dropdown, alphabetically.
75376
- *
75377
- * Covers the families PowerPoint's own list leads with (the Office UI faces,
75378
- * the Aptos family that replaced Calibri as the default theme font, and the
75379
- * classic Windows/Mac core fonts) plus the handful of web faces decks
75380
- * routinely arrive with. Entries the host cannot resolve simply fall back
75381
- * through the CSS font stack, so listing a family costs nothing but gives the
75382
- * user a name to pick when the deck already references it.
75383
- */
75384
- const COMMON_FONT_FAMILIES = [
75385
- 'Abadi',
75386
- 'Aptos',
75387
- 'Aptos Display',
75388
- 'Arial',
75389
- 'Arial Black',
75390
- 'Arial Narrow',
75391
- 'Bahnschrift',
75392
- 'Book Antiqua',
75393
- 'Bookman Old Style',
75394
- 'Calibri',
75395
- 'Calibri Light',
75396
- 'Cambria',
75397
- 'Candara',
75398
- 'Century Gothic',
75399
- 'Comic Sans MS',
75400
- 'Consolas',
75401
- 'Corbel',
75402
- 'Courier New',
75403
- 'Franklin Gothic Book',
75404
- 'Franklin Gothic Medium',
75405
- 'Garamond',
75406
- 'Georgia',
75407
- 'Gill Sans MT',
75408
- 'Helvetica',
75409
- 'Impact',
75410
- 'Inter',
75411
- 'Lucida Console',
75412
- 'Lucida Sans Unicode',
75413
- 'Microsoft Sans Serif',
75414
- 'Montserrat',
75415
- 'Noto Sans',
75416
- 'Open Sans',
75417
- 'Palatino Linotype',
75418
- 'Poppins',
75419
- 'Roboto',
75420
- 'Rockwell',
75421
- 'Segoe UI',
75422
- 'Source Sans Pro',
75423
- 'Tahoma',
75424
- 'Times New Roman',
75425
- 'Trebuchet MS',
75426
- 'Tw Cen MT',
75427
- 'Verdana',
75428
- ];
75429
- /** Font sizes (pt) offered by the Home-tab size dropdown. */
75430
- const COMMON_FONT_SIZES = [
75431
- 8, 9, 10, 11, 12, 14, 16, 18, 20, 24, 28, 32, 36, 40, 44, 48, 54, 60, 72, 96,
75432
- ];
75433
- /** Character-spacing presets for the toolbar dropdown. */
75434
- const CHARACTER_SPACING_OPTIONS = [
75435
- { label: 'Very Tight', i18nKey: 'pptx.text.characterSpacingVeryTight', value: -150 },
75436
- { label: 'Tight', i18nKey: 'pptx.text.characterSpacingTight', value: -75 },
75437
- { label: 'Normal', i18nKey: 'pptx.text.characterSpacingNormal', value: 0 },
75438
- { label: 'Loose', i18nKey: 'pptx.text.characterSpacingLoose', value: 75 },
75439
- { label: 'Very Loose', i18nKey: 'pptx.text.characterSpacingVeryLoose', value: 150 },
75440
- ];
75441
- /** Line-spacing presets for the paragraph dropdown. */
75442
- const LINE_SPACING_OPTIONS$1 = [
75443
- { label: '1.0', value: 1.0 },
75444
- { label: '1.15', value: 1.15 },
75445
- { label: '1.5', value: 1.5 },
75446
- { label: '2.0', value: 2.0 },
75447
- { label: '2.5', value: 2.5 },
75448
- { label: '3.0', value: 3.0 },
75449
- ];
75450
- /** Change-case options in menu order (matches PowerPoint's ordering). */
75451
- const CHANGE_CASE_OPTIONS$1 = [
75452
- { value: 'sentence', i18nKey: 'pptx.text.changeCaseSentence' },
75453
- { value: 'lower', i18nKey: 'pptx.text.changeCaseLower' },
75454
- { value: 'upper', i18nKey: 'pptx.text.changeCaseUpper' },
75455
- { value: 'capitalize', i18nKey: 'pptx.text.changeCaseCapitalize' },
75456
- { value: 'toggle', i18nKey: 'pptx.text.changeCaseToggle' },
75457
- ];
75458
-
75459
75580
  /**
75460
75581
  * font-catalog.ts: grouping for the Home-tab font dropdown.
75461
75582
  *
@@ -80181,6 +80302,13 @@ function readEditableText(root) {
80181
80302
  if (!(child instanceof HTMLElement)) {
80182
80303
  continue;
80183
80304
  }
80305
+ // A list marker is presentation chrome, not authored paragraph text.
80306
+ // React renders it inside the contenteditable so edit mode matches view
80307
+ // mode; excluding the annotated node prevents a semantic bullet from
80308
+ // being committed as literal text (for example, "1.Item").
80309
+ if (child.hasAttribute('data-pptx-bullet-marker')) {
80310
+ continue;
80311
+ }
80184
80312
  if (child.tagName === 'BR') {
80185
80313
  out += '\n';
80186
80314
  continue;
@@ -85980,7 +86108,7 @@ function createLocalStorageBackend(namespace) {
85980
86108
  /** Try IndexedDB first; fall back to localStorage on any failure. */
85981
86109
  async function resolveBackend(dbName, namespace) {
85982
86110
  try {
85983
- const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-C5kwAYuI.mjs');
86111
+ const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-DEXWS41y.mjs');
85984
86112
  const db = await openChatDb(dbName);
85985
86113
  return createIdbBackend(db);
85986
86114
  }
@@ -99578,8 +99706,7 @@ function cellRunStyle(style) {
99578
99706
  }
99579
99707
  const map = {};
99580
99708
  if (style.fontSize) {
99581
- // PptxTableCellStyle.fontSize is already in px (converted from EMU).
99582
- map['font-size'] = `${style.fontSize}px`;
99709
+ map['font-size'] = `${style.fontSize}pt`;
99583
99710
  }
99584
99711
  if (style.bold) {
99585
99712
  map['font-weight'] = 'bold';
@@ -123044,7 +123171,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImpor
123044
123171
  }], propDecorators: { canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], slideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideIndex", required: false }] }], selectedElement: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedElement", required: false }] }] } });
123045
123172
 
123046
123173
  // Generated by scripts/inline-shared.mjs from package.json. Do not edit.
123047
- const PPTX_ANGULAR_VIEWER_VERSION = "3.5.1";
123174
+ const PPTX_ANGULAR_VIEWER_VERSION = "3.6.1";
123048
123175
 
123049
123176
  /**
123050
123177
  * account-page.component.ts: File > Account content.
@@ -123405,6 +123532,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImpor
123405
123532
  * so it cannot drift from the other bindings' Font control group.
123406
123533
  */
123407
123534
  const FONT_SIZES = COMMON_FONT_SIZES;
123535
+ /** Next PowerPoint point-size preset in the requested direction. */
123536
+ function steppedFontSizePt(current, direction) {
123537
+ const next = direction === 1
123538
+ ? FONT_SIZES.find((size) => size > current)
123539
+ : [...FONT_SIZES].reverse().find((size) => size < current);
123540
+ return next ?? (direction === 1 ? FONT_SIZES[FONT_SIZES.length - 1] : FONT_SIZES[0]) ?? current;
123541
+ }
123408
123542
  /** Font-colour swatches in the Home/Text colour popover (mirrors React/Vue). */
123409
123543
  const FONT_COLOR_PRESETS = [
123410
123544
  '#000000',
@@ -123497,7 +123631,8 @@ class RibbonFontControlsComponent {
123497
123631
  }
123498
123632
  curFontSize() {
123499
123633
  // Mirror React's HomeSection default (24) shown when nothing is selected.
123500
- return Math.round(this.curStyle()?.fontSize ?? 24);
123634
+ const fontSize = this.curStyle()?.fontSize;
123635
+ return fontSize === undefined ? 24 : textFontSizePxToPt(fontSize);
123501
123636
  }
123502
123637
  /** Current font colour of the selection (for the swatch + active-state ring). */
123503
123638
  curColor() {
@@ -123549,20 +123684,18 @@ class RibbonFontControlsComponent {
123549
123684
  this.patch({ fontFamily: event.target.value });
123550
123685
  }
123551
123686
  setFontSize(event) {
123552
- this.patch({ fontSize: Number(event.target.value) });
123687
+ this.patchFontSize(textFontSizePtToPx(Number(event.target.value)));
123553
123688
  }
123554
123689
  /** Step the selection's font size up or down through the FONT_SIZES ladder. */
123555
123690
  stepFontSize(direction) {
123556
- const current = this.curFontSize();
123557
- const sizes = FONT_SIZES;
123558
- let idx = sizes.findIndex((s) => s >= current);
123559
- if (idx < 0) {
123560
- idx = sizes.length - 1;
123561
- }
123562
- const next = sizes[Math.min(sizes.length - 1, Math.max(0, idx + direction))];
123563
- if (next !== undefined) {
123564
- this.patch({ fontSize: next });
123691
+ this.patchFontSize(textFontSizePtToPx(steppedFontSizePt(this.curFontSize(), direction)));
123692
+ }
123693
+ patchFontSize(fontSize) {
123694
+ const element = this.selectedElement();
123695
+ if (!element || !isTextElement(element)) {
123696
+ return;
123565
123697
  }
123698
+ this.editor.updateElement(this.slideIndex(), element.id, textFontSizePatch(element, fontSize));
123566
123699
  }
123567
123700
  /** Clear character formatting (bold/italic/underline/strikethrough) on the selection. */
123568
123701
  clearFormatting() {
@@ -123603,6 +123736,9 @@ class RibbonFontControlsComponent {
123603
123736
  [attr.aria-label]="'pptx.ribbon.fontSize' | translate"
123604
123737
  (change)="setFontSize($event)"
123605
123738
  >
123739
+ @if (!fontSizes.includes(curFontSize())) {
123740
+ <option [value]="curFontSize()" selected>{{ curFontSize() }}</option>
123741
+ }
123606
123742
  @for (s of fontSizes; track s) {
123607
123743
  <option [value]="s" [selected]="s === curFontSize()">{{ s }}</option>
123608
123744
  }
@@ -123819,6 +123955,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImpor
123819
123955
  [attr.aria-label]="'pptx.ribbon.fontSize' | translate"
123820
123956
  (change)="setFontSize($event)"
123821
123957
  >
123958
+ @if (!fontSizes.includes(curFontSize())) {
123959
+ <option [value]="curFontSize()" selected>{{ curFontSize() }}</option>
123960
+ }
123822
123961
  @for (s of fontSizes; track s) {
123823
123962
  <option [value]="s" [selected]="s === curFontSize()">{{ s }}</option>
123824
123963
  }
@@ -141354,7 +141493,7 @@ class InspectorPanelComponent {
141354
141493
  return;
141355
141494
  }
141356
141495
  const cur = this.el();
141357
- this.editor.updateElement(this.slideIndex(), cur.id, textStylePatch(cur, { fontSize: val }));
141496
+ this.editor.updateElement(this.slideIndex(), cur.id, textFontSizePatch(cur, textFontSizePtToPx(val)));
141358
141497
  }
141359
141498
  onBoldToggle() {
141360
141499
  const cur = this.el();
@@ -141547,8 +141686,9 @@ class InspectorPanelComponent {
141547
141686
  id="insp-font-size"
141548
141687
  class="pptx-ng-inspector__input pptx-ng-inspector__input--number"
141549
141688
  type="number"
141550
- inputmode="numeric"
141689
+ inputmode="decimal"
141551
141690
  min="1"
141691
+ step="any"
141552
141692
  [value]="seed().fontSize"
141553
141693
  (change)="onFontSizeChange($event)"
141554
141694
  />
@@ -142037,8 +142177,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImpor
142037
142177
  id="insp-font-size"
142038
142178
  class="pptx-ng-inspector__input pptx-ng-inspector__input--number"
142039
142179
  type="number"
142040
- inputmode="numeric"
142180
+ inputmode="decimal"
142041
142181
  min="1"
142182
+ step="any"
142042
142183
  [value]="seed().fontSize"
142043
142184
  (change)="onFontSizeChange($event)"
142044
142185
  />
@@ -158615,5 +158756,5 @@ function cn(...values) {
158615
158756
  * Generated bundle index. Do not edit.
158616
158757
  */
158617
158758
 
158618
- export { ColorChangedImageComponent as $, AFTER_ANIMATION_VALUES as A, AnimationPanelComponent as B, AnimationPlaybackService as C, AutosaveRecoveryDialogComponent as D, AutosaveService as E, BroadcastDialogComponent as F, CHART_EDITOR_STYLES as G, CURSOR_PALETTE as H, CanvasFitService as I, ChartAxisOptionsComponent as J, ChartAxisStyleOptionsComponent as K, ChartComboTypeOptionsComponent as L, ChartDataEditorComponent as M, ChartDataLabelOptionsComponent as N, ChartDatapointMarkerOptionsComponent as O, ChartDatapointOptionsComponent as P, ChartDisplayOptionsComponent as Q, ChartElementViewComponent as R, ChartErrorBarOptionsComponent as S, ChartMarkerOptionsComponent as T, ChartPartSelectionService as U, ChartPrimitivesComponent as V, ChartRendererComponent as W, ChartTrendlineOptionsComponent as X, ChartTypeSelectorComponent as Y, CollaborationCursorsComponent as Z, CollaborationService as _, ALIGN_OPTIONS as a, InspectorPanelComponent as a$, CommentMarkersOverlayComponent as a0, CommentsPanelComponent as a1, CommentsService as a2, ComparePanelComponent as a3, ConnectorRendererComponent as a4, ConnectorTextOverlayComponent as a5, CustomShowsComponent as a6, DEFAULT_BOUNDS as a7, DEFAULT_BROADCAST_SERVER_URL as a8, DEFAULT_CANVAS_HEIGHT as a9, ElementRendererComponent as aA, EmbeddedFontsService as aB, EncryptedFileDialogComponent as aC, EquationEditorDialogComponent as aD, EquationRendererComponent as aE, EquationTemplateGalleryComponent as aF, ExportProgressModalComponent as aG, ExportService as aH, FieldContextService as aI, FindBarComponent as aJ, FindReplaceBarComponent as aK, FollowModeBarComponent as aL, FontEmbeddingListComponent as aM, FontEmbeddingPanelComponent as aN, GALLERY_THEME_PRESETS as aO, GOOGLE_WEBFONTS_LINK_ID as aP, GRIDLINE_COLOR$1 as aQ, GoogleWebfontsService as aR, GradientPickerComponent as aS, HANDOUT_OPTIONS as aT, HeaderFooterDialogComponent as aU, HyperlinkDialogComponent as aV, ImagePropertiesPanelComponent as aW, InkDrawingService as aX, InkRendererComponent as aY, InsertSmartArtDialogComponent as aZ, InspectorPaneHeaderComponent as a_, DEFAULT_CANVAS_WIDTH as aa, DEFAULT_COLOR_SCHEME as ab, DEFAULT_FILL_COLOR$1 as ac, DEFAULT_LAYOUT as ad, DEFAULT_PALETTE$1 as ae, DEFAULT_PATTERN_FILL_PRESET as af, DEFAULT_PRINT_SETTINGS as ag, DEFAULT_SLIDE_BACKGROUND as ah, DEFAULT_STROKE_COLOR as ai, DEFAULT_STYLE as aj, DEFAULT_TABLE_ROW_HEIGHT as ak, DEFAULT_TEXT_COLOR$2 as al, DEFAULT_VIEWER_PROFILE as am, DIRECTIONAL_PRESETS as an, DIRECTION_OPTIONS as ao, DocumentPropertiesCardComponent as ap, EMBEDDED_FONTS_STYLE_ID as aq, EMPHASIS_PRESETS as ar, ENTRANCE_PRESETS as as, TEMPLATES as at, EXIT_PRESETS as au, EditorContextMenuComponent as av, EditorHistory as aw, EditorStateService as ax, EditorToolbarComponent as ay, EffectsPanelComponent as az, ANIMATION_PRESET_CATEGORIES as b, RibbonComponent as b$, IsMobileService as b0, KeepAnnotationsDialogComponent as b1, LOCALE_CATALOG as b2, LONG_PRESS_DURATION_MS as b3, LONG_PRESS_MOVE_TOLERANCE_PX as b4, LoadContentService as b5, LocalPresencePublisher as b6, MAX_ZOOM_SCALE as b7, MIN_ZOOM_SCALE as b8, MOTION_PATH_COLUMNS as b9, PasswordStrengthMeterComponent as bA, PowerPointViewerComponent as bB, PresentToolbarAutoHide as bC, PresentationAnnotationOverlayComponent as bD, PresentationAnnotationsService as bE, PresentationOverlayComponent as bF, PresentationPropertiesPanelComponent as bG, PresentationSettingsCardComponent as bH, PresentationSubtitleBarComponent as bI, PresentationToolbarComponent as bJ, PresentationTransitionOverlayComponent as bK, PresenterViewComponent as bL, PresenterWindowService as bM, PrintDialogComponent as bN, PrintService as bO, PrintSettingsPanelComponent as bP, PropertiesDialogComponent as bQ, REPEAT_MODE_OPTIONS as bR, RESIZE_HANDLES as bS, RULER_FONT_SIZE as bT, RULER_THICKNESS as bU, ReadingViewOverlayComponent as bV, RemoteSelectionOverlayComponent as bW, RibbonAnimationGalleryComponent as bX, RibbonAnimationsSectionComponent as bY, RibbonArrangeSectionComponent as bZ, RibbonColorPopoverComponent as b_, MediaPreviewComponent as ba, MediaPropertiesPanelComponent as bb, MediaRendererComponent as bc, MediaTrimTimelineComponent as bd, MobileBottomBarComponent as be, MobileMenuSheetComponent as bf, MobilePresenterViewComponent as bg, MobileSheetComponent as bh, MobileSlidesSheetComponent as bi, MobileToolbarComponent as bj, ModalDialogComponent as bk, Model3DRendererComponent as bl, NotesHandoutCardComponent as bm, NotesPanelComponent as bn, NotesToolbarComponent as bo, OleRendererComponent as bp, OutlineViewOverlayComponent as bq, POWER_POINT_VIEWER_PROVIDERS as br, PPTX_OPEN_ACCEPT as bs, PRESENTATION_OPEN_EXTENSIONS as bt, PRESENTER_CHANNEL_NAME as bu, PRESENTER_MSG_ORIGIN as bv, PRESENTER_TIMER_SEGMENT_MS as bw, PX_PER_CM as bx, PX_PER_INCH as by, PasswordProtectionDialogComponent as bz, AUDIENCE_HASH as c, TEXT_3D_TOP_BEVEL_KEYS as c$, RibbonDesignSectionComponent as c0, RibbonDrawSectionComponent as c1, RibbonDrawingGroupComponent as c2, RibbonEditingSectionComponent as c3, RibbonFileSectionComponent as c4, RibbonFontControlsComponent as c5, RibbonHomeSectionComponent as c6, RibbonHyperlinkButtonComponent as c7, RibbonInsertFieldsComponent as c8, RibbonInsertSectionComponent as c9, SettingsLanguageTabComponent as cA, ShareDialogComponent as cB, ShortcutPanelComponent as cC, ShowOptionsFieldsetComponent as cD, ShowSlidesFieldsetComponent as cE, SignatureStrippedDialogComponent as cF, SignaturesPanelComponent as cG, SignaturesService as cH, SlideBackgroundCardComponent as cI, SlideCanvasComponent as cJ, SlideDefaultInspectorComponent as cK, SlideDiffChangesComponent as cL, SlideDiffRowComponent as cM, SlideDiffThumbnailsComponent as cN, SlideSizeCardComponent as cO, SlideSorterOverlayComponent as cP, SlideThemeOverridePanelComponent as cQ, SlideTransitionCardComponent as cR, SlidesPanelComponent as cS, SmartArt3DRendererComponent as cT, SmartArt3DService as cU, SmartArtPreviewComponent as cV, SmartArtPropertiesComponent as cW, SmartArtRendererComponent as cX, StatusBarComponent as cY, TABLE_STRUCTURE_TOGGLES as cZ, TEXT_3D_BOTTOM_BEVEL_KEYS as c_, RibbonMotionPathGalleryComponent as ca, RibbonParagraphControlsComponent as cb, RibbonPrimaryRowComponent as cc, RibbonReviewSectionComponent as cd, RibbonShapeExtrasComponent as ce, RibbonSlideshowSectionComponent as cf, RibbonTransitionsSectionComponent as cg, RibbonViewSectionComponent as ch, RulerGuidesService as ci, SEQUENCE_OPTIONS as cj, SEVERITY_GROUPS as ck, SEVERITY_LABELS as cl, SHORTCUT_REFERENCE_ITEMS as cm, SLIDE_TRANSITION_KEYFRAMES as cn, DEFAULT_PALETTE as co, PALETTES$1 as cp, SMART_ART_COLOR_SCHEMES as cq, SMART_ART_STYLE_OPTIONS as cr, SUB_ITEM_LABEL as cs, SVG_WARP_PRESETS as ct, SWIPE_MAX_VERTICAL_PX as cu, SWIPE_THRESHOLD_PX as cv, SelectionPaneComponent as cw, SetUpSlideShowDialogComponent as cx, SettingsAppearanceTabComponent as cy, SettingsDialogComponent as cz, AUDIENCE_NONCE_KEY as d, animationPresetLabelKey as d$, TEXT_DIRECTION_OPTIONS$1 as d0, THEME_CATALOG as d1, TIMING_CURVE_OPTIONS as d2, TRIGGER_OPTIONS as d3, TYPE_LABELS as d4, TableCellAdvancedFillComponent as d5, TableCellFormattingComponent as d6, TableDataEditorComponent as d7, TablePropertiesComponent as d8, TableRendererComponent as d9, ViewerFileIOService as dA, ViewerFindReplaceService as dB, ViewerFormatPainterService as dC, ViewerInspectorPanelService as dD, ViewerKeyboardService as dE, ViewerMobileSheetService as dF, ViewerPresentationModeService as dG, ViewerThemeGalleryService as dH, ViewerTouchGesturesService as dI, ViewerZoomService as dJ, WEBM_MIME_CANDIDATES as dK, WriteBackScheduler as dL, ZERO_LINE_COLOR as dM, ZoomNavigationService as dN, ZoomRendererComponent as dO, ZoomTargetService as dP, addCategory as dQ, addCommentToList as dR, addGradientStopPatch as dS, addItem as dT, addSeries as dU, addSubItem as dV, advanceStep as dW, affordanceElements as dX, aiToggleVisible as dY, alignPatch as dZ, animationFor as d_, TableResizeOverlayComponent as da, TableSelectionService as db, TagsCardComponent as dc, Text3DBevelSectionComponent as dd, Text3DPanelComponent as de, TextAdvancedPanelComponent as df, ThemeEditorFieldsComponent as dg, ThemeGalleryComponent as dh, ThemeSelectorCardComponent as di, TitleBarComponent as dj, TitleBarSearchComponent as dk, TransitionDirectionPickerComponent as dl, TransitionPreviewComponent as dm, VALIGN_OPTIONS as dn, VIEWER_THEME as dp, VersionHistoryPanelComponent as dq, ViewerCanvasEditingService as dr, ViewerCollabCursorService as ds, ViewerCollaborationSessionService as dt, ViewerCompareService as du, ViewerCustomShowsService as dv, ViewerDialogsService as dw, ViewerDocumentPropertiesService as dx, ViewerExportService as dy, ViewerExtraDialogsComponent as dz, AVATAR_COLOR_SWATCHES as e, buildTreemapViewModel as e$, annotationMapToInkInserts as e0, applyAcceptedDiff as e1, applyAnimationPreset as e2, applyFindReplacements as e3, applyFormatToElement as e4, applyMove as e5, applyResize as e6, asMediaElement as e7, assignUserColor as e8, attachShowVisibilityPause as e9, buildEquationSegment as eA, buildFallbackViewModel as eB, buildFontFaceRule as eC, buildGradientFillCss as eD, buildGridlinesAndLabels as eE, buildHyperlinkPatch as eF, buildInkContainerStyle as eG, buildInkStrokes as eH, buildLegend as eI, buildMarkTooltip as eJ, buildModel3DContainerStyle as eK, buildModel3DViewModel as eL, buildOleActionModel as eM, buildOleInfoRows as eN, buildPatternFillCss as eO, buildPieViewModel as eP, buildPrintHtmlDocument as eQ, buildPropertiesPatch as eR, buildRadarViewModel as eS, buildRegionMapViewModel as eT, buildSaveSlides as eU, buildShareUrl as eV, buildSmartArtInsertElement as eW, buildSmartArtNodes as eX, buildStockViewModel as eY, buildSurfaceViewModel as eZ, buildTableViewModel as e_, attachTouchGestures as ea, axisTickValues as eb, beginNodeEdit as ec, bevelSizePatch as ed, boolFromEvent as ee, bringForward as ef, bringToFront as eg, buildBarActions as eh, buildBroadcastConfig as ei, buildBroadcastViewerUrl as ej, buildCategoryLabels as ek, buildCellParagraphs as el, buildChartViewModel as em, buildChatLogExport as en, buildChatLogMarkdown as eo, buildChromeStyle as ep, buildClearHyperlinkPatch as eq, buildClickGroups as er, buildColStyles as es, buildCollaborationConfig as et, buildComboViewModel as eu, buildCssGradientFromShapeStyle as ev, buildDuotoneFilter as ew, buildDuotoneFilterId as ex, buildEmbeddedFontStyles as ey, buildEquationElement as ez, AXIS_LABEL_COLOR as f, computeRotateHandleBox as f$, buildTrimFragment as f0, buildWaterfallViewModel as f1, buildZeroLine as f2, buildZoomContainerStyle as f3, buildZoomViewModel as f4, bulletIndentPx as f5, canAddTopLevelNode as f6, canGroupSelection as f7, canRemoveTopLevelNode as f8, canSetStrokeWidth as f9, collectUsedFontFamilies as fA, columnWidthStyle as fB, commitNodeText as fC, computeAlign as fD, computeAxisTitlePrimitives as fE, computeBarRects as fF, computeBubbleRadius as fG, computeCornerHandle as fH, computeDistribute as fI, computeDrawingViewBox as fJ, computeErrorBarPrimitives as fK, computeFocusTargets as fL, computeGridSpacingPx as fM, computeHandleBoxes as fN, computeHandoutLayout as fO, computeIsMobile as fP, computeIsTablet as fQ, computeLinePoints as fR, computeLinearRegression as fS, computePageCount as fT, computePieLayout as fU, computePieSlicePath as fV, computePieSlices as fW, computePlotLayout as fX, computeRSquared as fY, computeRadarPoints as fZ, computeResizeHandleBoxes as f_, canStartBroadcast as fa, canStartShare as fb, canUngroupSelection as fc, canUseClipboard as fd, captionDisplayText as fe, cellRunStyle as ff, cellStyleToStyleMap as fg, cellTdStyle as fh, changeCountLabel as fi, changeIcon as fj, characterSpacingPatch as fk, chartPreserveAspectRatio as fl, checkFontAvailable as fm, clampCursorPosition as fn, clampGifDimensions as fo, clampIndex as fp, clampNotesFontSize as fq, clampScale as fr, clampStep as fs, clearAllLocalViewerData as ft, clearAudienceContent as fu, cn as fv, collectAccessibilityIssues as fw, collectElementText as fx, collectSlideText as fy, collectStoredChats as fz, AccessibilityPanelComponent as g, formatAxisValue as g$, computeScatterDots as g0, computeScatterXDomain as g1, computeSelectionBoxes as g2, computeSingleSelected as g3, computeSlideIndices as g4, computeSnap as g5, computeStackedBarRects as g6, computeStackedValueRange as g7, computeTrendlinePrimitives as g8, computeValueRange as g9, disableSoftEdgePatch as gA, duplicateElementById as gB, durationOf as gC, effectsStateOf as gD, enableGlowPatch as gE, enableInnerShadowPatch as gF, enableOuterShadowPatch as gG, enableReflectionPatch as gH, enableSoftEdgePatch as gI, encodeGif as gJ, endShowMediaCleanup as gK, estimatePageCount as gL, exitPresentationFullscreen as gM, exportAiChatLogs as gN, extractPathPoints as gO, eyedropperAvailable as gP, fillColorOf$1 as gQ, findInSlides as gR, findOwningSlideIndex as gS, findSlideIndexByElementId as gT, firstVisibleIndex as gU, fitPolynomial as gV, fitZoom as gW, focusTargetChips as gX, fontMimeForFormat as gY, fontSizeOf as gZ, forgetSessionDeck as g_, convertOmmlToMathMl as ga, copyFormatFromElement as gb, countAccessibilityIssues as gc, countAnnotationStrokes as gd, createAngularAiBridge as ge, createCustomShow as gf, createSwipeDismissDrag as gg, createWebrtcBundle as gh, createWebsocketBundle as gi, cssObjectToStyleMap as gj, currentColorScheme as gk, currentLayout as gl, currentStyle as gm, defaultCssVars as gn, defaultRadius as go, defaultThemeColors as gp, deleteElementsByIds as gq, deleteVersion as gr, demoteNode as gs, deriveModel3DBlobUrl as gt, derivePresenceList as gu, describeSmartArtBounds as gv, disableGlowPatch as gw, disableInnerShadowPatch as gx, disableOuterShadowPatch as gy, disableReflectionPatch as gz, AccessibilityService as h, isElementInteractive as h$, formatBytes as h0, formatCursorLabel as h1, formatElapsed as h2, formatFileSize as h3, formatPropertyDate as h4, formatTime as h5, fpsToFrameIntervalMs as h6, generateBroadcastRoomId as h7, generateCommentId as h8, generateCustomShowId as h9, getTextBlockStyle as hA, getTextWarp as hB, getTouchDistance as hC, getWarpCategory as hD, getWarpPath as hE, gradientStateFromStyle as hF, gradientStateOf as hG, gradientStatePatch as hH, gridColumns as hI, groupIssuesBySeverity as hJ, hasAnimation as hK, hasCopyableFormat as hL, hasExistingLink as hM, hasExitedFullscreen as hN, hasGradientFill as hO, hasPressureVariation as hP, hasVisibleSlideAfter as hQ, headerLabel as hR, imageDimensions as hS, inkViewBox as hT, insertTableElementColumn as hU, insertTableElementRow as hV, interpolateWidth as hW, isAudienceTab as hX, isBold as hY, isBrowserOpenableMime as hZ, isChildNode as h_, generatePressureCircles as ha, generateTicks as hb, getClrChangeParams as hc, getContainerStyle as hd, getDuotoneFilterDef as he, getEffectSoundState as hf, getImageSrc as hg, getLocalStorageUsageSummary as hh, getOleAriaLabel as hi, getOleBadgeLabel as hj, getOleDisplayName as hk, getOleDownloadFileName as hl, getOleTypeColor as hm, getOleTypeLabel as hn, getPasswordStrength as ho, getPatternSvg as hp, getPlaceholderStyle as hq, getVersions as hr, getResolvedShapeClipPath as hs, getResolvedShapeClipPathFor as ht, getSessionTabId as hu, getShapeFillStrokeStyle as hv, getSlideBackgroundStyle as hw, getSlideTransitionAnimations as hx, getSmartArtNodeBounds as hy, getSpeechRecognitionCtor as hz, AccountPageComponent as i, overallStatus as i$, isInjectableUrl as i0, isItalic as i1, isLegacyBinaryPresentation as i2, isPpactionUrl as i3, isPresenterMessage as i4, isSigned as i5, isSupportedPresentationFile as i6, isTextElement as i7, isTwoTableFocus as i8, isUnderline as i9, moveNodeUp as iA, msToFrameDelayCs as iB, narrowToCircle as iC, narrowToPolygon as iD, narrowToRect as iE, newChartElement as iF, newEquationElement as iG, newPresetShapeElement as iH, newShapeElement as iI, newSmartArtElement as iJ, newTableElement as iK, newTextElement as iL, nextVisibleIndex as iM, nodeBold as iN, nodeEditBox as iO, nodeFillColor as iP, nodeFontColor as iQ, nodeIdFromKey as iR, nodeItalic as iS, nodeStyle as iT, normalizeFontFormat as iU, normalizeSlidesPerPage as iV, normalizeValue as iW, numFromEvent as iX, ommlToMathml as iY, ooxmlDashToCssBorderStyle as iZ, openNativeEyeDropper as i_, isUrlSafe as ia, isValidRoomId as ib, isViewportBackgroundPressTarget as ic, isZoomActivationKey as id, issueTrackKey as ie, issueTypeLabel as ig, keyToLabel as ih, lastVisibleIndex as ii, latexToMathml as ij, layoutConnectorPaints as ik, layoutNodeLabels as il, linePointsToSvgString as im, lineSpacingPatch as io, loadAudienceContent as ip, loadSessionDeck as iq, mediaFallbackFor as ir, mediaSurfaceFor as is, mergeCaptionResults as it, mergeDown as iu, mergeRight as iv, mergeSelection as iw, mergeTablesDirective as ix, moveElementBy as iy, moveNodeDown as iz, ActionSettingsPanelComponent as j, resolveTransitionDuration as j$, paletteColor as j0, parseAudienceNonce as j1, parseNodeTextarea as j2, partitionSlides as j3, patchChartData as j4, patchChartStyle as j5, patchTableData as j6, patchTextStyle as j7, patternPresetOptions as j8, pendingElementStyles as j9, removeCommentFromList as jA, removeElementAnimation as jB, removeGradientStopPatch as jC, removeNode as jD, removeTableElementRow as jE, removeSeries as jF, renderToCanvas as jG, reorderAnimationDown as jH, reorderAnimationUp as jI, replaceInSlides as jJ, replaceMatch as jK, requestPresentationFullscreen as jL, resizeElement as jM, resolveCaptionTracks as jN, resolveChartKind as jO, resolveFontVariant as jP, resolveHyperlinkHref as jQ, resolveInteractiveElementId as jR, resolveMediaSrc as jS, resolveOleType as jT, resolveParagraphBullet as jU, resolvePresenterNotes as jV, resolveProfileInitial as jW, resolveRegionCode as jX, resolveSlideAutoAdvanceMs as jY, resolvePalette as jZ, resolveThemeCatalogEntry as j_, pickColorByClickFallback as ja, pickFile as jb, pickSupportedMimeType as jc, planGifFrames as jd, planVideoSegments as je, pointsToSvgPathD as jf, presenceToCursors as jg, presentationBaseName as jh, presentationStageStyle as ji, presenterTimerProgress as jj, presetByLayout as jk, presetsForCategory as jl, pressuresToWidths as jm, prevVisibleIndex as jn, projectDrawingShapes as jo, promoteNode as jp, provideViewerTheme as jq, radarAngle as jr, radarRingPoints as js, readAsDataUrl as jt, recordWebm as ju, registerCrossSlideAudio as jv, rememberSessionDeck as jw, removeAnimation as jx, removeCategory as jy, removeTableElementColumn as jz, AdvancedChartEditorComponent as k, setTimingCurve as k$, restoreSessionDeck as k0, revealedElementStyles as k1, routeOrthogonalConnector as k2, rowStyle as k3, rulerDragToGuidePosition as k4, rulerHighlight as k5, rulerStripTicks as k6, sampleColorFromSlide as k7, sanitizeColor as k8, sanitizeSlideIndex as k9, setColorScheme as kA, setDataLabels as kB, setDataPointExplosion as kC, setDataPointFill as kD, setDataPointLabel as kE, setDataPointMarker as kF, setDelay as kG, setDirection as kH, setDuration as kI, setEffectSound as kJ, setElementPosition as kK, setGridlineStyle as kL, setLayout as kM, setLegend as kN, setNodeStyle as kO, setNodeText as kP, setRepeatCount as kQ, setRepeatMode as kR, setSequence as kS, setSeriesChartType as kT, setSeriesColor as kU, setSeriesErrorBars as kV, setSeriesMarker as kW, setSeriesName as kX, setSeriesTrendline as kY, setSeriesValue as kZ, setStyle as k_, sanitizeUserName as ka, saveViewerProfile as kb, savedPresentationFileName as kc, scanAvailableFonts as kd, searchSlides as ke, seedBroadcastFields as kf, seedHyperlinkDraft as kg, seedPropertiesDraft as kh, seedShareFields as ki, segmentFrameCount as kj, selectValue$3 as kk, sendBackward as kl, sendToBack as km, sequentialColorScale as kn, serializeWriteBack as ko, seriesColor as kp, setAfterAnimation as kq, setAfterAnimationColor as kr, setAnimationEmphasis as ks, setAnimationEntrance as kt, setAnimationExit as ku, setAxis as kv, setAxisLogScale as kw, setAxisTitleStyle as kx, setCategoryLabel as ky, setCellText as kz, AiChangeOverlayComponent as l, vermilionRadius as l$, setTitle as l0, setTrigger as l1, setTriggerShapeId as l2, shapeStylePatch$1 as l3, sheetAfterNavigate as l4, shouldBlockClickAdvance as l5, shouldUseSvgWarp as l6, showDirectionPicker as l7, showsTemplateAffordance as l8, signatureCountLabel as l9, textStylePatch as lA, themeStyle as lB, themeToCssVars as lC, thumbnailHeight as lD, thumbnailZoom as lE, toggleCommentResolvedInList as lF, toggleNodeBold as lG, toggleNodeItalic as lH, toggleSheet as lI, topLevelNodeCount as lJ, transformSelectedTextCase as lK, translationsEn as lL, updateElementById as lM, updateGlowPatch as lN, updateGradientStopPatch as lO, updateInnerShadowPatch as lP, updateOuterShadowPatch as lQ, updateReflectionPatch as lR, vAlignPatch as lS, validatePassword as lT, validatePrintSettings as lU, validateRoomId as lV, valueToY as lW, vermilionDarkColors as lX, vermilionDarkTheme as lY, vermilionLightColors as lZ, vermilionLightTheme as l_, signatureKey as la, signatureTimestamp as lb, signerName as lc, statusLabel as ld, slideNumberOf as le, slidesWithReappliedLayout as lf, smartArtNodes as lg, paletteColour as lh, snapToGridStep as li, splitCursorCell as lj, splitMergedCell as lk, statusKind as ll, statusLabel$1 as lm, storeAudienceContent as ln, stringFromEvent$5 as lo, strokeColorOf as lp, strokeToInkElement as lq, strokeWidthOf as lr, styleShadowFilter as ls, surfaceColor as lt, textAdvancedPatch as lu, textAdvancedStateFromStyle as lv, textAdvancedStateOf as lw, textColorOf as lx, textDirectionPatch as ly, textStyleOf as lz, AiChatPanelComponent as m, waypointsToPathD as m0, withManualLayouts as m1, worstStatus as m2, zoomTargetSlideIndex as m3, AiChatService as n, AiComposerComponent as o, AiFocusBarComponent as p, AiFocusHighlightOverlayComponent as q, AiHistoryMenuComponent as r, AiHistoryService as s, toChatSummary as t, AiMessageListComponent as u, AiPanelStore as v, AiProposalCardComponent as w, AiSettingsSectionComponent as x, AiToolCallCardComponent as y, AnimationAuthorPanelComponent as z };
158619
- //# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-CnoCmxaJ.mjs.map
158759
+ export { ColorChangedImageComponent as $, AFTER_ANIMATION_VALUES as A, AnimationPanelComponent as B, AnimationPlaybackService as C, AutosaveRecoveryDialogComponent as D, AutosaveService as E, BroadcastDialogComponent as F, CHART_EDITOR_STYLES as G, CURSOR_PALETTE as H, CanvasFitService as I, ChartAxisOptionsComponent as J, ChartAxisStyleOptionsComponent as K, ChartComboTypeOptionsComponent as L, ChartDataEditorComponent as M, ChartDataLabelOptionsComponent as N, ChartDatapointMarkerOptionsComponent as O, ChartDatapointOptionsComponent as P, ChartDisplayOptionsComponent as Q, ChartElementViewComponent as R, ChartErrorBarOptionsComponent as S, ChartMarkerOptionsComponent as T, ChartPartSelectionService as U, ChartPrimitivesComponent as V, ChartRendererComponent as W, ChartTrendlineOptionsComponent as X, ChartTypeSelectorComponent as Y, CollaborationCursorsComponent as Z, CollaborationService as _, ALIGN_OPTIONS as a, InspectorPanelComponent as a$, CommentMarkersOverlayComponent as a0, CommentsPanelComponent as a1, CommentsService as a2, ComparePanelComponent as a3, ConnectorRendererComponent as a4, ConnectorTextOverlayComponent as a5, CustomShowsComponent as a6, DEFAULT_BOUNDS as a7, DEFAULT_BROADCAST_SERVER_URL as a8, DEFAULT_CANVAS_HEIGHT as a9, ElementRendererComponent as aA, EmbeddedFontsService as aB, EncryptedFileDialogComponent as aC, EquationEditorDialogComponent as aD, EquationRendererComponent as aE, EquationTemplateGalleryComponent as aF, ExportProgressModalComponent as aG, ExportService as aH, FieldContextService as aI, FindBarComponent as aJ, FindReplaceBarComponent as aK, FollowModeBarComponent as aL, FontEmbeddingListComponent as aM, FontEmbeddingPanelComponent as aN, GALLERY_THEME_PRESETS as aO, GOOGLE_WEBFONTS_LINK_ID as aP, GRIDLINE_COLOR$1 as aQ, GoogleWebfontsService as aR, GradientPickerComponent as aS, HANDOUT_OPTIONS as aT, HeaderFooterDialogComponent as aU, HyperlinkDialogComponent as aV, ImagePropertiesPanelComponent as aW, InkDrawingService as aX, InkRendererComponent as aY, InsertSmartArtDialogComponent as aZ, InspectorPaneHeaderComponent as a_, DEFAULT_CANVAS_WIDTH as aa, DEFAULT_COLOR_SCHEME as ab, DEFAULT_FILL_COLOR$1 as ac, DEFAULT_LAYOUT as ad, DEFAULT_PALETTE$1 as ae, DEFAULT_PATTERN_FILL_PRESET as af, DEFAULT_PRINT_SETTINGS as ag, DEFAULT_SLIDE_BACKGROUND as ah, DEFAULT_STROKE_COLOR as ai, DEFAULT_STYLE as aj, DEFAULT_TABLE_ROW_HEIGHT as ak, DEFAULT_TEXT_COLOR$2 as al, DEFAULT_VIEWER_PROFILE as am, DIRECTIONAL_PRESETS as an, DIRECTION_OPTIONS as ao, DocumentPropertiesCardComponent as ap, EMBEDDED_FONTS_STYLE_ID as aq, EMPHASIS_PRESETS as ar, ENTRANCE_PRESETS as as, TEMPLATES as at, EXIT_PRESETS as au, EditorContextMenuComponent as av, EditorHistory as aw, EditorStateService as ax, EditorToolbarComponent as ay, EffectsPanelComponent as az, ANIMATION_PRESET_CATEGORIES as b, RibbonComponent as b$, IsMobileService as b0, KeepAnnotationsDialogComponent as b1, LOCALE_CATALOG as b2, LONG_PRESS_DURATION_MS as b3, LONG_PRESS_MOVE_TOLERANCE_PX as b4, LoadContentService as b5, LocalPresencePublisher as b6, MAX_ZOOM_SCALE as b7, MIN_ZOOM_SCALE as b8, MOTION_PATH_COLUMNS as b9, PasswordStrengthMeterComponent as bA, PowerPointViewerComponent as bB, PresentToolbarAutoHide as bC, PresentationAnnotationOverlayComponent as bD, PresentationAnnotationsService as bE, PresentationOverlayComponent as bF, PresentationPropertiesPanelComponent as bG, PresentationSettingsCardComponent as bH, PresentationSubtitleBarComponent as bI, PresentationToolbarComponent as bJ, PresentationTransitionOverlayComponent as bK, PresenterViewComponent as bL, PresenterWindowService as bM, PrintDialogComponent as bN, PrintService as bO, PrintSettingsPanelComponent as bP, PropertiesDialogComponent as bQ, REPEAT_MODE_OPTIONS as bR, RESIZE_HANDLES as bS, RULER_FONT_SIZE as bT, RULER_THICKNESS as bU, ReadingViewOverlayComponent as bV, RemoteSelectionOverlayComponent as bW, RibbonAnimationGalleryComponent as bX, RibbonAnimationsSectionComponent as bY, RibbonArrangeSectionComponent as bZ, RibbonColorPopoverComponent as b_, MediaPreviewComponent as ba, MediaPropertiesPanelComponent as bb, MediaRendererComponent as bc, MediaTrimTimelineComponent as bd, MobileBottomBarComponent as be, MobileMenuSheetComponent as bf, MobilePresenterViewComponent as bg, MobileSheetComponent as bh, MobileSlidesSheetComponent as bi, MobileToolbarComponent as bj, ModalDialogComponent as bk, Model3DRendererComponent as bl, NotesHandoutCardComponent as bm, NotesPanelComponent as bn, NotesToolbarComponent as bo, OleRendererComponent as bp, OutlineViewOverlayComponent as bq, POWER_POINT_VIEWER_PROVIDERS as br, PPTX_OPEN_ACCEPT as bs, PRESENTATION_OPEN_EXTENSIONS as bt, PRESENTER_CHANNEL_NAME as bu, PRESENTER_MSG_ORIGIN as bv, PRESENTER_TIMER_SEGMENT_MS as bw, PX_PER_CM as bx, PX_PER_INCH as by, PasswordProtectionDialogComponent as bz, AUDIENCE_HASH as c, TEXT_3D_TOP_BEVEL_KEYS as c$, RibbonDesignSectionComponent as c0, RibbonDrawSectionComponent as c1, RibbonDrawingGroupComponent as c2, RibbonEditingSectionComponent as c3, RibbonFileSectionComponent as c4, RibbonFontControlsComponent as c5, RibbonHomeSectionComponent as c6, RibbonHyperlinkButtonComponent as c7, RibbonInsertFieldsComponent as c8, RibbonInsertSectionComponent as c9, SettingsLanguageTabComponent as cA, ShareDialogComponent as cB, ShortcutPanelComponent as cC, ShowOptionsFieldsetComponent as cD, ShowSlidesFieldsetComponent as cE, SignatureStrippedDialogComponent as cF, SignaturesPanelComponent as cG, SignaturesService as cH, SlideBackgroundCardComponent as cI, SlideCanvasComponent as cJ, SlideDefaultInspectorComponent as cK, SlideDiffChangesComponent as cL, SlideDiffRowComponent as cM, SlideDiffThumbnailsComponent as cN, SlideSizeCardComponent as cO, SlideSorterOverlayComponent as cP, SlideThemeOverridePanelComponent as cQ, SlideTransitionCardComponent as cR, SlidesPanelComponent as cS, SmartArt3DRendererComponent as cT, SmartArt3DService as cU, SmartArtPreviewComponent as cV, SmartArtPropertiesComponent as cW, SmartArtRendererComponent as cX, StatusBarComponent as cY, TABLE_STRUCTURE_TOGGLES as cZ, TEXT_3D_BOTTOM_BEVEL_KEYS as c_, RibbonMotionPathGalleryComponent as ca, RibbonParagraphControlsComponent as cb, RibbonPrimaryRowComponent as cc, RibbonReviewSectionComponent as cd, RibbonShapeExtrasComponent as ce, RibbonSlideshowSectionComponent as cf, RibbonTransitionsSectionComponent as cg, RibbonViewSectionComponent as ch, RulerGuidesService as ci, SEQUENCE_OPTIONS as cj, SEVERITY_GROUPS as ck, SEVERITY_LABELS as cl, SHORTCUT_REFERENCE_ITEMS as cm, SLIDE_TRANSITION_KEYFRAMES as cn, DEFAULT_PALETTE as co, PALETTES$1 as cp, SMART_ART_COLOR_SCHEMES as cq, SMART_ART_STYLE_OPTIONS as cr, SUB_ITEM_LABEL as cs, SVG_WARP_PRESETS as ct, SWIPE_MAX_VERTICAL_PX as cu, SWIPE_THRESHOLD_PX as cv, SelectionPaneComponent as cw, SetUpSlideShowDialogComponent as cx, SettingsAppearanceTabComponent as cy, SettingsDialogComponent as cz, AUDIENCE_NONCE_KEY as d, animationPresetLabelKey as d$, TEXT_DIRECTION_OPTIONS$1 as d0, THEME_CATALOG as d1, TIMING_CURVE_OPTIONS as d2, TRIGGER_OPTIONS as d3, TYPE_LABELS as d4, TableCellAdvancedFillComponent as d5, TableCellFormattingComponent as d6, TableDataEditorComponent as d7, TablePropertiesComponent as d8, TableRendererComponent as d9, ViewerFileIOService as dA, ViewerFindReplaceService as dB, ViewerFormatPainterService as dC, ViewerInspectorPanelService as dD, ViewerKeyboardService as dE, ViewerMobileSheetService as dF, ViewerPresentationModeService as dG, ViewerThemeGalleryService as dH, ViewerTouchGesturesService as dI, ViewerZoomService as dJ, WEBM_MIME_CANDIDATES as dK, WriteBackScheduler as dL, ZERO_LINE_COLOR as dM, ZoomNavigationService as dN, ZoomRendererComponent as dO, ZoomTargetService as dP, addCategory as dQ, addCommentToList as dR, addGradientStopPatch as dS, addItem as dT, addSeries as dU, addSubItem as dV, advanceStep as dW, affordanceElements as dX, aiToggleVisible as dY, alignPatch as dZ, animationFor as d_, TableResizeOverlayComponent as da, TableSelectionService as db, TagsCardComponent as dc, Text3DBevelSectionComponent as dd, Text3DPanelComponent as de, TextAdvancedPanelComponent as df, ThemeEditorFieldsComponent as dg, ThemeGalleryComponent as dh, ThemeSelectorCardComponent as di, TitleBarComponent as dj, TitleBarSearchComponent as dk, TransitionDirectionPickerComponent as dl, TransitionPreviewComponent as dm, VALIGN_OPTIONS as dn, VIEWER_THEME as dp, VersionHistoryPanelComponent as dq, ViewerCanvasEditingService as dr, ViewerCollabCursorService as ds, ViewerCollaborationSessionService as dt, ViewerCompareService as du, ViewerCustomShowsService as dv, ViewerDialogsService as dw, ViewerDocumentPropertiesService as dx, ViewerExportService as dy, ViewerExtraDialogsComponent as dz, AVATAR_COLOR_SWATCHES as e, buildTreemapViewModel as e$, annotationMapToInkInserts as e0, applyAcceptedDiff as e1, applyAnimationPreset as e2, applyFindReplacements as e3, applyFormatToElement as e4, applyMove as e5, applyResize as e6, asMediaElement as e7, assignUserColor as e8, attachShowVisibilityPause as e9, buildEquationSegment as eA, buildFallbackViewModel as eB, buildFontFaceRule as eC, buildGradientFillCss as eD, buildGridlinesAndLabels as eE, buildHyperlinkPatch as eF, buildInkContainerStyle as eG, buildInkStrokes as eH, buildLegend as eI, buildMarkTooltip as eJ, buildModel3DContainerStyle as eK, buildModel3DViewModel as eL, buildOleActionModel as eM, buildOleInfoRows as eN, buildPatternFillCss as eO, buildPieViewModel as eP, buildPrintHtmlDocument as eQ, buildPropertiesPatch as eR, buildRadarViewModel as eS, buildRegionMapViewModel as eT, buildSaveSlides as eU, buildShareUrl as eV, buildSmartArtInsertElement as eW, buildSmartArtNodes as eX, buildStockViewModel as eY, buildSurfaceViewModel as eZ, buildTableViewModel as e_, attachTouchGestures as ea, axisTickValues as eb, beginNodeEdit as ec, bevelSizePatch as ed, boolFromEvent as ee, bringForward as ef, bringToFront as eg, buildBarActions as eh, buildBroadcastConfig as ei, buildBroadcastViewerUrl as ej, buildCategoryLabels as ek, buildCellParagraphs as el, buildChartViewModel as em, buildChatLogExport as en, buildChatLogMarkdown as eo, buildChromeStyle as ep, buildClearHyperlinkPatch as eq, buildClickGroups as er, buildColStyles as es, buildCollaborationConfig as et, buildComboViewModel as eu, buildCssGradientFromShapeStyle as ev, buildDuotoneFilter as ew, buildDuotoneFilterId as ex, buildEmbeddedFontStyles as ey, buildEquationElement as ez, AXIS_LABEL_COLOR as f, computeRotateHandleBox as f$, buildTrimFragment as f0, buildWaterfallViewModel as f1, buildZeroLine as f2, buildZoomContainerStyle as f3, buildZoomViewModel as f4, bulletIndentPx as f5, canAddTopLevelNode as f6, canGroupSelection as f7, canRemoveTopLevelNode as f8, canSetStrokeWidth as f9, collectUsedFontFamilies as fA, columnWidthStyle as fB, commitNodeText as fC, computeAlign as fD, computeAxisTitlePrimitives as fE, computeBarRects as fF, computeBubbleRadius as fG, computeCornerHandle as fH, computeDistribute as fI, computeDrawingViewBox as fJ, computeErrorBarPrimitives as fK, computeFocusTargets as fL, computeGridSpacingPx as fM, computeHandleBoxes as fN, computeHandoutLayout as fO, computeIsMobile as fP, computeIsTablet as fQ, computeLinePoints as fR, computeLinearRegression as fS, computePageCount as fT, computePieLayout as fU, computePieSlicePath as fV, computePieSlices as fW, computePlotLayout as fX, computeRSquared as fY, computeRadarPoints as fZ, computeResizeHandleBoxes as f_, canStartBroadcast as fa, canStartShare as fb, canUngroupSelection as fc, canUseClipboard as fd, captionDisplayText as fe, cellRunStyle as ff, cellStyleToStyleMap as fg, cellTdStyle as fh, changeCountLabel as fi, changeIcon as fj, characterSpacingPatch as fk, chartPreserveAspectRatio as fl, checkFontAvailable as fm, clampCursorPosition as fn, clampGifDimensions as fo, clampIndex as fp, clampNotesFontSize as fq, clampScale as fr, clampStep as fs, clearAllLocalViewerData as ft, clearAudienceContent as fu, cn as fv, collectAccessibilityIssues as fw, collectElementText as fx, collectSlideText as fy, collectStoredChats as fz, AccessibilityPanelComponent as g, formatAxisValue as g$, computeScatterDots as g0, computeScatterXDomain as g1, computeSelectionBoxes as g2, computeSingleSelected as g3, computeSlideIndices as g4, computeSnap as g5, computeStackedBarRects as g6, computeStackedValueRange as g7, computeTrendlinePrimitives as g8, computeValueRange as g9, disableSoftEdgePatch as gA, duplicateElementById as gB, durationOf as gC, effectsStateOf as gD, enableGlowPatch as gE, enableInnerShadowPatch as gF, enableOuterShadowPatch as gG, enableReflectionPatch as gH, enableSoftEdgePatch as gI, encodeGif as gJ, endShowMediaCleanup as gK, estimatePageCount as gL, exitPresentationFullscreen as gM, exportAiChatLogs as gN, extractPathPoints as gO, eyedropperAvailable as gP, fillColorOf$1 as gQ, findInSlides as gR, findOwningSlideIndex as gS, findSlideIndexByElementId as gT, firstVisibleIndex as gU, fitPolynomial as gV, fitZoom as gW, focusTargetChips as gX, fontMimeForFormat as gY, fontSizeOf as gZ, forgetSessionDeck as g_, convertOmmlToMathMl as ga, copyFormatFromElement as gb, countAccessibilityIssues as gc, countAnnotationStrokes as gd, createAngularAiBridge as ge, createCustomShow as gf, createSwipeDismissDrag as gg, createWebrtcBundle as gh, createWebsocketBundle as gi, cssObjectToStyleMap as gj, currentColorScheme as gk, currentLayout as gl, currentStyle as gm, defaultCssVars as gn, defaultRadius as go, defaultThemeColors as gp, deleteElementsByIds as gq, deleteVersion as gr, demoteNode as gs, deriveModel3DBlobUrl as gt, derivePresenceList as gu, describeSmartArtBounds as gv, disableGlowPatch as gw, disableInnerShadowPatch as gx, disableOuterShadowPatch as gy, disableReflectionPatch as gz, AccessibilityService as h, isElementInteractive as h$, formatBytes as h0, formatCursorLabel as h1, formatElapsed as h2, formatFileSize as h3, formatPropertyDate as h4, formatTime as h5, fpsToFrameIntervalMs as h6, generateBroadcastRoomId as h7, generateCommentId as h8, generateCustomShowId as h9, getTextBlockStyle as hA, getTextWarp as hB, getTouchDistance as hC, getWarpCategory as hD, getWarpPath as hE, gradientStateFromStyle as hF, gradientStateOf as hG, gradientStatePatch as hH, gridColumns as hI, groupIssuesBySeverity as hJ, hasAnimation as hK, hasCopyableFormat as hL, hasExistingLink as hM, hasExitedFullscreen as hN, hasGradientFill as hO, hasPressureVariation as hP, hasVisibleSlideAfter as hQ, headerLabel as hR, imageDimensions as hS, inkViewBox as hT, insertTableElementColumn as hU, insertTableElementRow as hV, interpolateWidth as hW, isAudienceTab as hX, isBold as hY, isBrowserOpenableMime as hZ, isChildNode as h_, generatePressureCircles as ha, generateTicks as hb, getClrChangeParams as hc, getContainerStyle as hd, getDuotoneFilterDef as he, getEffectSoundState as hf, getImageSrc as hg, getLocalStorageUsageSummary as hh, getOleAriaLabel as hi, getOleBadgeLabel as hj, getOleDisplayName as hk, getOleDownloadFileName as hl, getOleTypeColor as hm, getOleTypeLabel as hn, getPasswordStrength as ho, getPatternSvg as hp, getPlaceholderStyle as hq, getVersions as hr, getResolvedShapeClipPath as hs, getResolvedShapeClipPathFor as ht, getSessionTabId as hu, getShapeFillStrokeStyle as hv, getSlideBackgroundStyle as hw, getSlideTransitionAnimations as hx, getSmartArtNodeBounds as hy, getSpeechRecognitionCtor as hz, AccountPageComponent as i, overallStatus as i$, isInjectableUrl as i0, isItalic as i1, isLegacyBinaryPresentation as i2, isPpactionUrl as i3, isPresenterMessage as i4, isSigned as i5, isSupportedPresentationFile as i6, isTextElement as i7, isTwoTableFocus as i8, isUnderline as i9, moveNodeUp as iA, msToFrameDelayCs as iB, narrowToCircle as iC, narrowToPolygon as iD, narrowToRect as iE, newChartElement as iF, newEquationElement as iG, newPresetShapeElement as iH, newShapeElement as iI, newSmartArtElement as iJ, newTableElement as iK, newTextElement as iL, nextVisibleIndex as iM, nodeBold as iN, nodeEditBox as iO, nodeFillColor as iP, nodeFontColor as iQ, nodeIdFromKey as iR, nodeItalic as iS, nodeStyle as iT, normalizeFontFormat as iU, normalizeSlidesPerPage as iV, normalizeValue as iW, numFromEvent as iX, ommlToMathml as iY, ooxmlDashToCssBorderStyle as iZ, openNativeEyeDropper as i_, isUrlSafe as ia, isValidRoomId as ib, isViewportBackgroundPressTarget as ic, isZoomActivationKey as id, issueTrackKey as ie, issueTypeLabel as ig, keyToLabel as ih, lastVisibleIndex as ii, latexToMathml as ij, layoutConnectorPaints as ik, layoutNodeLabels as il, linePointsToSvgString as im, lineSpacingPatch as io, loadAudienceContent as ip, loadSessionDeck as iq, mediaFallbackFor as ir, mediaSurfaceFor as is, mergeCaptionResults as it, mergeDown as iu, mergeRight as iv, mergeSelection as iw, mergeTablesDirective as ix, moveElementBy as iy, moveNodeDown as iz, ActionSettingsPanelComponent as j, resolveTransitionDuration as j$, paletteColor as j0, parseAudienceNonce as j1, parseNodeTextarea as j2, partitionSlides as j3, patchChartData as j4, patchChartStyle as j5, patchTableData as j6, patchTextStyle as j7, patternPresetOptions as j8, pendingElementStyles as j9, removeCommentFromList as jA, removeElementAnimation as jB, removeGradientStopPatch as jC, removeNode as jD, removeTableElementRow as jE, removeSeries as jF, renderToCanvas as jG, reorderAnimationDown as jH, reorderAnimationUp as jI, replaceInSlides as jJ, replaceMatch as jK, requestPresentationFullscreen as jL, resizeElement as jM, resolveCaptionTracks as jN, resolveChartKind as jO, resolveFontVariant as jP, resolveHyperlinkHref as jQ, resolveInteractiveElementId as jR, resolveMediaSrc as jS, resolveOleType as jT, resolveParagraphBullet as jU, resolvePresenterNotes as jV, resolveProfileInitial as jW, resolveRegionCode as jX, resolveSlideAutoAdvanceMs as jY, resolvePalette as jZ, resolveThemeCatalogEntry as j_, pickColorByClickFallback as ja, pickFile as jb, pickSupportedMimeType as jc, planGifFrames as jd, planVideoSegments as je, pointsToSvgPathD as jf, presenceToCursors as jg, presentationBaseName as jh, presentationStageStyle as ji, presenterTimerProgress as jj, presetByLayout as jk, presetsForCategory as jl, pressuresToWidths as jm, prevVisibleIndex as jn, projectDrawingShapes as jo, promoteNode as jp, provideViewerTheme as jq, radarAngle as jr, radarRingPoints as js, readAsDataUrl as jt, recordWebm as ju, registerCrossSlideAudio as jv, rememberSessionDeck as jw, removeAnimation as jx, removeCategory as jy, removeTableElementColumn as jz, AdvancedChartEditorComponent as k, setTimingCurve as k$, restoreSessionDeck as k0, revealedElementStyles as k1, routeOrthogonalConnector as k2, rowStyle as k3, rulerDragToGuidePosition as k4, rulerHighlight as k5, rulerStripTicks as k6, sampleColorFromSlide as k7, sanitizeColor as k8, sanitizeSlideIndex as k9, setColorScheme as kA, setDataLabels as kB, setDataPointExplosion as kC, setDataPointFill as kD, setDataPointLabel as kE, setDataPointMarker as kF, setDelay as kG, setDirection as kH, setDuration as kI, setEffectSound as kJ, setElementPosition as kK, setGridlineStyle as kL, setLayout as kM, setLegend as kN, setNodeStyle as kO, setNodeText as kP, setRepeatCount as kQ, setRepeatMode as kR, setSequence as kS, setSeriesChartType as kT, setSeriesColor as kU, setSeriesErrorBars as kV, setSeriesMarker as kW, setSeriesName as kX, setSeriesTrendline as kY, setSeriesValue as kZ, setStyle as k_, sanitizeUserName as ka, saveViewerProfile as kb, savedPresentationFileName as kc, scanAvailableFonts as kd, searchSlides as ke, seedBroadcastFields as kf, seedHyperlinkDraft as kg, seedPropertiesDraft as kh, seedShareFields as ki, segmentFrameCount as kj, selectValue$3 as kk, sendBackward as kl, sendToBack as km, sequentialColorScale as kn, serializeWriteBack as ko, seriesColor as kp, setAfterAnimation as kq, setAfterAnimationColor as kr, setAnimationEmphasis as ks, setAnimationEntrance as kt, setAnimationExit as ku, setAxis as kv, setAxisLogScale as kw, setAxisTitleStyle as kx, setCategoryLabel as ky, setCellText as kz, AiChangeOverlayComponent as l, vermilionLightTheme as l$, setTitle as l0, setTrigger as l1, setTriggerShapeId as l2, shapeStylePatch$1 as l3, sheetAfterNavigate as l4, shouldBlockClickAdvance as l5, shouldUseSvgWarp as l6, showDirectionPicker as l7, showsTemplateAffordance as l8, signatureCountLabel as l9, textStyleOf as lA, textStylePatch as lB, themeStyle as lC, themeToCssVars as lD, thumbnailHeight as lE, thumbnailZoom as lF, toggleCommentResolvedInList as lG, toggleNodeBold as lH, toggleNodeItalic as lI, toggleSheet as lJ, topLevelNodeCount as lK, transformSelectedTextCase as lL, translationsEn as lM, updateElementById as lN, updateGlowPatch as lO, updateGradientStopPatch as lP, updateInnerShadowPatch as lQ, updateOuterShadowPatch as lR, updateReflectionPatch as lS, vAlignPatch as lT, validatePassword as lU, validatePrintSettings as lV, validateRoomId as lW, valueToY as lX, vermilionDarkColors as lY, vermilionDarkTheme as lZ, vermilionLightColors as l_, signatureKey as la, signatureTimestamp as lb, signerName as lc, statusLabel as ld, slideNumberOf as le, slidesWithReappliedLayout as lf, smartArtNodes as lg, paletteColour as lh, snapToGridStep as li, splitCursorCell as lj, splitMergedCell as lk, statusKind as ll, statusLabel$1 as lm, storeAudienceContent as ln, stringFromEvent$5 as lo, strokeColorOf as lp, strokeToInkElement as lq, strokeWidthOf as lr, styleShadowFilter as ls, surfaceColor as lt, textAdvancedPatch as lu, textAdvancedStateFromStyle as lv, textAdvancedStateOf as lw, textColorOf as lx, textDirectionPatch as ly, textFontSizePatch as lz, AiChatPanelComponent as m, vermilionRadius as m0, waypointsToPathD as m1, withManualLayouts as m2, worstStatus as m3, zoomTargetSlideIndex as m4, AiChatService as n, AiComposerComponent as o, AiFocusBarComponent as p, AiFocusHighlightOverlayComponent as q, AiHistoryMenuComponent as r, AiHistoryService as s, toChatSummary as t, AiMessageListComponent as u, AiPanelStore as v, AiProposalCardComponent as w, AiSettingsSectionComponent as x, AiToolCallCardComponent as y, AnimationAuthorPanelComponent as z };
158760
+ //# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-CoBWqWD0.mjs.map