pptx-angular-viewer 4.11.0 → 4.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/fesm2022/{pptx-angular-viewer-chart-3d-view-scene-Cfk7dMVK.mjs → pptx-angular-viewer-chart-3d-view-scene-DWxceh6M.mjs} +2 -2
  3. package/fesm2022/{pptx-angular-viewer-chart-3d-view-scene-Cfk7dMVK.mjs.map → pptx-angular-viewer-chart-3d-view-scene-DWxceh6M.mjs.map} +1 -1
  4. package/fesm2022/{pptx-angular-viewer-chat-history-idb-BnV3ANp_.mjs → pptx-angular-viewer-chat-history-idb-Dv60g0T7.mjs} +2 -2
  5. package/fesm2022/{pptx-angular-viewer-chat-history-idb-BnV3ANp_.mjs.map → pptx-angular-viewer-chat-history-idb-Dv60g0T7.mjs.map} +1 -1
  6. package/fesm2022/{pptx-angular-viewer-pptx-angular-viewer-Dy62s3Dt.mjs → pptx-angular-viewer-pptx-angular-viewer-Bi23ofA3.mjs} +1140 -81
  7. package/fesm2022/{pptx-angular-viewer-pptx-angular-viewer-Dy62s3Dt.mjs.map → pptx-angular-viewer-pptx-angular-viewer-Bi23ofA3.mjs.map} +1 -1
  8. package/fesm2022/{pptx-angular-viewer-view-scene-CNlGt3WC.mjs → pptx-angular-viewer-view-scene-BXmy-hp0.mjs} +2 -2
  9. package/fesm2022/{pptx-angular-viewer-view-scene-CNlGt3WC.mjs.map → pptx-angular-viewer-view-scene-BXmy-hp0.mjs.map} +1 -1
  10. package/fesm2022/pptx-angular-viewer.mjs +1 -1
  11. package/i18n/de.cjs +45 -15
  12. package/i18n/de.mjs +45 -15
  13. package/i18n/es.cjs +45 -15
  14. package/i18n/es.mjs +45 -15
  15. package/i18n/fr.cjs +45 -15
  16. package/i18n/fr.mjs +45 -15
  17. package/i18n/zh-CN.cjs +46 -16
  18. package/i18n/zh-CN.mjs +46 -16
  19. package/package.json +3 -2
  20. package/types/pptx-angular-viewer.d.ts +29 -5
  21. package/types/pptx-angular-viewer.d.ts.map +1 -1
@@ -3,7 +3,7 @@ import * as i0 from '@angular/core';
3
3
  import { InjectionToken, input, output, inject, computed, ChangeDetectionStrategy, Component, signal, Injectable, DestroyRef, viewChild, effect, Injector, afterNextRender, untracked, ElementRef, HostListener, Renderer2, ViewEncapsulation, CUSTOM_ELEMENTS_SCHEMA, Directive, forwardRef, afterRenderEffect, Input, Pipe, EventEmitter, Output, linkedSignal } from '@angular/core';
4
4
  import { TranslateService, TranslatePipe, translate } from '@ngx-translate/core';
5
5
  import { THEME_PRESETS, themeColorSchemesEqual, guideEmuToPx, hasTextProperties, evaluateCustomGeometryPathData, getShapeClipPath, getAdjustmentAwareClipPath, getShapeClipPathFromPreset, getCloudPathForRendering, evaluateCustomGeometryPaths, customGeometryPathsToSvgSubpaths, evaluatePresetShape, hasShapeProperties, ooxmlGradientAngleToCssDegrees, getShapeType, isImageLikeElement as isImageLikeElement$1, getElementTextContent, getRoundRectRadiusPx as getRoundRectRadiusPx$1, applyDrawingColorTransforms as applyDrawingColorTransforms$1, hslToRgb as hslToRgb$1, PRESET_COLOR_MAP, getSubstituteFontFamily, parsePanoseString, evaluateGuides, deobfuscateFont, detectFontFormat, stripXmlOrderSuffix, orderedXmlKey, parseDataUrlToBytes, sampleFirstPixelColorFromBytes, flattenChartUserShapes, chartDataChangeType, isParetoChartData, resolveDisplayedChartTypeName, chartDataAddSeries, chartDataRemoveSeries, chartDataAddCategory, chartDataRemoveCategory, chartDataUpdatePoint, resolveThemeColorRef, resolveOoxmlPresetMapping, getCapturedPreset, resolveDirectionSubtype, capturedPresetNativeAnimation, timingCurveToAccelDecel, rebuildTableStructureInRawXml, updateCellTextInRawXml, deepCloneData, cloneTemplateElementsBySlideId, cloneSlide, MIN_ELEMENT_SIZE as MIN_ELEMENT_SIZE$1, EMU_PER_PX as EMU_PER_PX$6, DEFAULT_POWERPOINT_TABLE_STYLE_ID, DEFAULT_SCHEME_COLOR_MAP as DEFAULT_SCHEME_COLOR_MAP$1, formatAutoNumberMarker, createAutoNumberSequence, nextAutoNumber, breakAutoNumberRun, ELEMENT_PARAGRAPH_GEOMETRY_KEYS, getLinkedTextBoxSegments, deriveSlideTitle, svgPathToPolygons, THEME_COLOR_SCHEME_KEYS, createBuiltinVariables, resolveCoordinate, getPresetConnectionSites, getConnectorPathGeometry, resolveCustomGeometryToken, resolveCustomGeometryGuideContext, lookupPresetShape, normalizeStShapeType, PptxHandler, styleStroke, strokeFor, fitFontSize, nodeTextStyle, truncate, nodeOpacity, nodeStroke, nodeFill, styleShadow, buildTree, treeWidth, treeDepth, gearPoints, flattenNodes, interpretSmartArtLayout, smartArtQuickStyleHas3d, relayoutSmartArt, addSmartArtNode, removeSmartArtNode, demoteSmartArtNode, promoteSmartArtNode, reorderSmartArtNode, createEditorId, makeStoreAwareId, reassignDescendantIds, checkMissingAltText, checkMissingSlideTitle, checkLowContrast, checkComplexTables, checkBlankSlide, checkDuplicateTitles, createChartElement, createImageElement, THEME_COLOR_PALETTE_COLUMNS, hexToRgbChannels as hexToRgbChannels$2, rgbToHsl as rgbToHsl$1, renameSlideMaster, deleteSlideMaster, duplicateSlideMaster, insertSlideMaster, renameLayout, deleteLayout, duplicateLayout, insertLayout, detectFileFormat, themeColorRefFromColorChoice, cropShapeForPresetGeometry, cloneElement, duplicateElement, resolveModifyVerifierAlgorithmName, verifyModifyPassword, TABLE_STYLE_PART_SEQUENCE, douglasPeucker, serializePptxToJson, PPTX_JSON_MIME_TYPE, PptxMarkdownConverter, ThemePresets, formatCommentTimestamp as formatCommentTimestamp$1, EncryptedFileError, decodeXmlEntities, parseSignatureXml, groupElements, ungroupElements, updateSmartArtNodeText, setSmartArtNodeStyle, isInkElement, isZoomElement, SvgExporter, applyThemeToData, reResolveElementColors, pptxActionToElementAction, elementActionToPptxAction, setChartTitle, setChartLegend, setChartDataLabels, setChartAxis, setChartSeriesTrendline, setChartSeriesErrorBars, setChartDataPointLabel, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointMarker, setChartDataPointExplosion, getOleSheetGrid, getOleDocumentParagraphs, getOleNestedDeckDetail, applyOleSheetCellEdit, applyOleDocumentParagraphEdit, applyOleNestedDeckElementTextEdit, replaceOleFile, getOleObjectTypeLabel, addSmartArtNodeAsChild, switchSmartArtLayout, SWITCHABLE_LAYOUT_TYPES, normalizeTableStyleGuid, createTableStyleEntry, addTableStyleToMap, deleteTableStyleFromMap, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, applyThemeOverrideToSlide, TRANSITION_VALID_DIRECTIONS, TRANSITION_PATTERN_OPTIONS, TRANSITION_THRUBLK_TYPES } from 'pptx-viewer-core';
6
- import { parse } from 'opentype.js';
6
+ import * as opentypeModule from 'opentype.js';
7
7
  import DOMPurify from 'dompurify';
8
8
  import { z } from 'zod';
9
9
  import * as mcp from 'pptx-viewer-mcp';
@@ -9969,6 +9969,15 @@ function buildEmbeddedFontStyles(fonts, mintObjectUrl) {
9969
9969
  return { fontFaceCss, fontFamilies, objectUrls };
9970
9970
  }
9971
9971
 
9972
+ /** Resolve opentype.js as either its ESM namespace or its CommonJS default object. */
9973
+ function parseOpenTypeFont(buffer, module = opentypeModule) {
9974
+ const parser = module.parse ?? module.default?.parse;
9975
+ if (!parser) {
9976
+ throw new Error('opentype.js does not expose a font parser');
9977
+ }
9978
+ return parser(buffer);
9979
+ }
9980
+
9972
9981
  function toArrayBuffer(bytes) {
9973
9982
  // `opentype.parse` wants a real ArrayBuffer; `bytes` may be a view over a
9974
9983
  // larger buffer (e.g. `rawFontData` sliced from a ZIP entry), so this
@@ -10038,7 +10047,7 @@ class GlyphOutlineFontCache {
10038
10047
  continue;
10039
10048
  }
10040
10049
  try {
10041
- this.fonts.set(key, parse(toArrayBuffer(bytes)));
10050
+ this.fonts.set(key, parseOpenTypeFont(toArrayBuffer(bytes)));
10042
10051
  }
10043
10052
  catch {
10044
10053
  // Unparseable font (corrupt or an outline format opentype.js does
@@ -10059,7 +10068,7 @@ class GlyphOutlineFontCache {
10059
10068
  return false;
10060
10069
  }
10061
10070
  try {
10062
- this.fonts.set(key, parse(toArrayBuffer(bytes)));
10071
+ this.fonts.set(key, parseOpenTypeFont(toArrayBuffer(bytes)));
10063
10072
  return true;
10064
10073
  }
10065
10074
  catch {
@@ -16025,6 +16034,34 @@ function dataLabelBox(label) {
16025
16034
  return { x, y, w, h };
16026
16035
  }
16027
16036
 
16037
+ /**
16038
+ * chart-label-lines.ts: turn a data label whose text contains line breaks
16039
+ * (for example a pie's default "Category" + newline + "25%") into one
16040
+ * single-line `SvgText` per line.
16041
+ *
16042
+ * SVG `<text>` collapses a newline to a space, and each binding paints an
16043
+ * `SvgText` as one `<text>` node, so splitting here (pure, shared) makes every
16044
+ * binding draw the lines without any template change.
16045
+ *
16046
+ * @module chart-label-lines
16047
+ */
16048
+ /**
16049
+ * Split `label` on `\n` into stacked single-line labels. A single-line label is
16050
+ * returned as-is (same object). A vertically centred label (`central` /
16051
+ * `middle`) stays centred as a block; otherwise `y` is the first line's
16052
+ * baseline and the rest stack below it.
16053
+ */
16054
+ function splitLabelLines(label) {
16055
+ const lines = label.text.split(/\r?\n/);
16056
+ if (lines.length < 2) {
16057
+ return [label];
16058
+ }
16059
+ const step = label.fontSize * DATA_LABEL_LINE_HEIGHT;
16060
+ const centred = label.dominantBaseline === 'central' || label.dominantBaseline === 'middle';
16061
+ const top = centred ? label.y - ((lines.length - 1) * step) / 2 : label.y;
16062
+ return lines.map((text, i) => ({ ...label, text, y: top + i * step }));
16063
+ }
16064
+
16028
16065
  /**
16029
16066
  * Map a (possibly fractional / extrapolated) category index to an X pixel.
16030
16067
  * `mode === 'bar'` centres on category slots; `'line'` anchors at points.
@@ -19079,6 +19116,12 @@ function pushPointLabel(dataLabels, boxes, chartData, series, pointIndex, target
19079
19116
 
19080
19117
  /** PowerPoint's default separator between combined label components. */
19081
19118
  const DEFAULT_SEPARATOR = ', ';
19119
+ /**
19120
+ * PowerPoint's default separator when a label shows the category name AND the
19121
+ * percentage and the file carries no `c:separator` (a pie's "Cat 1" over
19122
+ * "25%"): a line break, not ", ". Every other combination keeps ", ".
19123
+ */
19124
+ const CATEGORY_PERCENT_SEPARATOR = '\n';
19082
19125
  /**
19083
19126
  * Resolve the label content flags for one point.
19084
19127
  *
@@ -19128,7 +19171,12 @@ function resolveDataLabelContent(chartData, series, pointIndex) {
19128
19171
  showSeriesName: showSeriesName === true,
19129
19172
  showPercent: showPercent === true,
19130
19173
  showBubbleSize: showBubbleSize === true,
19131
- separator: point?.separator ?? seriesLevel?.separator ?? chartLevel?.separator ?? DEFAULT_SEPARATOR,
19174
+ separator: point?.separator ??
19175
+ seriesLevel?.separator ??
19176
+ chartLevel?.separator ??
19177
+ (showCategory === true && showPercent === true
19178
+ ? CATEGORY_PERCENT_SEPARATOR
19179
+ : DEFAULT_SEPARATOR),
19132
19180
  deleted: point?.deleted === true,
19133
19181
  ...(point?.text !== undefined
19134
19182
  ? { customText: point.text }
@@ -25697,7 +25745,7 @@ function withManualLayouts(vm, chartData, frame) {
25697
25745
  * - A label that does not fit goes OUTSIDE, on the mid-angle, with the box
25698
25746
  * side facing the pie 2pt beyond the rim. PowerPoint then nudges outside
25699
25747
  * labels apart when they collide and draws leader lines to the nudged
25700
- * ones; that collision pass is not modelled.
25748
+ * ones; that pass is `chart-pie-label-collision` (an approximation).
25701
25749
  *
25702
25750
  * All lengths are in the chart's px space (1pt = 4/3px).
25703
25751
  *
@@ -25777,12 +25825,97 @@ function placeBestFitLabel(slice, w, h) {
25777
25825
  return { x: slice.cx + outside * ux, y: slice.cy + outside * uy, inside: false };
25778
25826
  }
25779
25827
 
25780
- /** Distance (px) an outside label sits beyond the slice rim. */
25781
- const LEADER_LENGTH = 14;
25782
- /** Whether a data-label position renders outside the pie rim (a doughnut's `bestFit` too). */
25783
- function isOutsidePosition(position) {
25784
- return position === 'outEnd' || position === 'bestFit';
25828
+ /**
25829
+ * chart-pie-label-collision.ts: nudge colliding OUTSIDE pie labels apart.
25830
+ *
25831
+ * At `c:dLblPos val="bestFit"` PowerPoint puts a label that does not fit in its
25832
+ * slice outside the rim; when two such labels overlap it moves them apart
25833
+ * (vertically, within their own side of the pie) and draws a leader line to
25834
+ * each one it moved. This module is the pure geometry half: it takes the
25835
+ * outside label boxes and returns how far each one moves. The caller decides
25836
+ * what to draw (a moved label gets a leader line; see `chart-pie-labels`).
25837
+ *
25838
+ * The algorithm is a per-side sweep: labels on the right (or left) of the pie
25839
+ * are sorted top to bottom, each is pushed below the previous one when they
25840
+ * overlap, and if the stack then runs past the bottom bound it is shifted back
25841
+ * up. Constants are not COM-measured; the gap is one line of breathing room.
25842
+ *
25843
+ * @module chart-pie-label-collision
25844
+ */
25845
+ /** Minimum vertical gap (px) kept between two nudged labels. */
25846
+ const LABEL_COLLISION_GAP = 2;
25847
+ /** Distance from the disc centre to the nearest point of a box centred at (`x`, `y`). */
25848
+ function boxDistanceToCentre(box, y, disc) {
25849
+ const nearestX = Math.max(box.x - box.w / 2, Math.min(disc.cx, box.x + box.w / 2));
25850
+ const nearestY = Math.max(y - box.h / 2, Math.min(disc.cy, y + box.h / 2));
25851
+ return Math.hypot(nearestX - disc.cx, nearestY - disc.cy);
25852
+ }
25853
+ /**
25854
+ * A vertical nudge moves a label ALONG the rim only near 3 and 9 o'clock; near
25855
+ * 6 and 12 o'clock it drives the label into the pie. Push such a label
25856
+ * outward horizontally until its box clears the disc again.
25857
+ */
25858
+ function clearOfDisc(box, y, disc) {
25859
+ if (boxDistanceToCentre(box, y, disc) >= disc.r) {
25860
+ return 0;
25861
+ }
25862
+ const sign = box.x >= disc.cx ? 1 : -1;
25863
+ let dx = 0;
25864
+ while (dx < disc.r * 2 &&
25865
+ boxDistanceToCentre({ ...box, x: box.x + sign * dx }, y, disc) < disc.r) {
25866
+ dx += 1;
25867
+ }
25868
+ return sign * dx;
25869
+ }
25870
+ /** Whether two boxes overlap horizontally (they share x extent). */
25871
+ function overlapsX(a, b) {
25872
+ return Math.abs(a.x - b.x) < (a.w + b.w) / 2;
25873
+ }
25874
+ /** Sweep one side's labels; returns the resolved centre y per box, by input order. */
25875
+ function sweepSide(boxes, minY, maxY) {
25876
+ const sorted = [...boxes].sort((a, b) => a.y - b.y || a.id - b.id);
25877
+ const ys = sorted.map((box) => box.y);
25878
+ for (let i = 1; i < sorted.length; i++) {
25879
+ const prev = sorted[i - 1];
25880
+ const box = sorted[i];
25881
+ if (overlapsX(prev, box)) {
25882
+ ys[i] = Math.max(ys[i], ys[i - 1] + (prev.h + box.h) / 2 + LABEL_COLLISION_GAP);
25883
+ }
25884
+ }
25885
+ // Past the bottom bound: shift the tail back up, keeping the gaps.
25886
+ for (let i = sorted.length - 1; i >= 0; i--) {
25887
+ const box = sorted[i];
25888
+ const limit = i === sorted.length - 1
25889
+ ? maxY - box.h / 2
25890
+ : ys[i + 1] - (box.h + sorted[i + 1].h) / 2 - LABEL_COLLISION_GAP;
25891
+ if (ys[i] > limit) {
25892
+ ys[i] = Math.max(limit, minY + box.h / 2);
25893
+ }
25894
+ }
25895
+ return new Map(sorted.map((box, i) => [box.id, ys[i]]));
25896
+ }
25897
+ /**
25898
+ * Compute the vertical nudges that separate overlapping outside labels.
25899
+ * `disc` splits the labels into a left and a right column and keeps every
25900
+ * nudged label outside the pie; `minY`/`maxY` bound the drawing area. Labels
25901
+ * that do not collide get `dx: 0, dy: 0`.
25902
+ */
25903
+ function nudgeOutsideLabels(boxes, disc, minY, maxY) {
25904
+ const resolved = new Map();
25905
+ for (const side of [
25906
+ boxes.filter((box) => box.x >= disc.cx),
25907
+ boxes.filter((box) => box.x < disc.cx),
25908
+ ]) {
25909
+ for (const [id, y] of sweepSide(side, minY, maxY)) {
25910
+ resolved.set(id, y);
25911
+ }
25912
+ }
25913
+ return boxes.map((box) => {
25914
+ const y = resolved.get(box.id) ?? box.y;
25915
+ return { id: box.id, dx: y === box.y ? 0 : clearOfDisc(box, y, disc), dy: y - box.y };
25916
+ });
25785
25917
  }
25918
+
25786
25919
  /**
25787
25920
  * Resolve a label's SvgText font, starting from the given defaults (the
25788
25921
  * fixed inside/outside styling this module always used) and overriding with
@@ -25827,6 +25960,13 @@ function leaderLine(slice, cx, cy, outerR, to, style) {
25827
25960
  strokeWidth: 0.75,
25828
25961
  };
25829
25962
  }
25963
+
25964
+ /** Distance (px) an outside label sits beyond the slice rim. */
25965
+ const LEADER_LENGTH = 14;
25966
+ /** Whether a data-label position renders outside the pie rim (a doughnut's `bestFit` too). */
25967
+ function isOutsidePosition(position) {
25968
+ return position === 'outEnd' || position === 'bestFit';
25969
+ }
25830
25970
  /**
25831
25971
  * Build pie/doughnut data labels. Inside positions reuse each slice's centroid
25832
25972
  * (white bold, centred). Outside positions place the label beyond the rim with a
@@ -25839,13 +25979,24 @@ function buildPieDataLabels(params) {
25839
25979
  const leaderLines = [];
25840
25980
  const boxes = [];
25841
25981
  const push = (i, label, midAngle) => {
25842
- labels.push(label);
25982
+ // The box/callout is sized from the whole label; the painted text is
25983
+ // one primitive per line so no binding needs multi-line support.
25984
+ labels.push(...splitLabelLines(label));
25843
25985
  const r = params.targetRadius ?? outerR;
25844
25986
  if (decorate) {
25845
25987
  const target = { x: cx + r * Math.cos(midAngle), y: cy + r * Math.sin(midAngle) };
25846
25988
  boxes.push(...decorate(i, label, target));
25847
25989
  }
25848
25990
  };
25991
+ const pendingOutside = [];
25992
+ const placeBestFit = (i, slice, label, auto, nudged = auto) => {
25993
+ const moved = applyManualDrag(nudged, i, params);
25994
+ push(i, { ...label, x: moved.x, y: moved.y }, slice.midAngle);
25995
+ // PowerPoint draws a leader line only to a label that left its spot.
25996
+ if (showLeaderLines !== false && (moved.x !== auto.x || moved.y !== auto.y)) {
25997
+ leaderLines.push(leaderLine(slice, cx, cy, outerR, moved, leaderLineStyle));
25998
+ }
25999
+ };
25849
26000
  slices.forEach((slice, i) => {
25850
26001
  const val = values[i];
25851
26002
  if (val === undefined) {
@@ -25870,12 +26021,12 @@ function buildPieDataLabels(params) {
25870
26021
  };
25871
26022
  const { w, h } = dataLabelBoxSize(label);
25872
26023
  const auto = placeBestFitLabel({ ...slice, outerR }, w, h);
25873
- const moved = applyManualDrag(auto, i, params);
25874
- push(i, { ...label, x: moved.x, y: moved.y }, slice.midAngle);
25875
- // PowerPoint draws a leader line only to a label that left its spot.
25876
- if (showLeaderLines !== false && (moved.x !== auto.x || moved.y !== auto.y)) {
25877
- leaderLines.push(leaderLine(slice, cx, cy, outerR, moved, leaderLineStyle));
26024
+ if (!auto.inside) {
26025
+ // Outside labels may collide: placed after the loop, once nudged apart.
26026
+ pendingOutside.push({ i, slice, label, auto, w, h });
26027
+ return;
25878
26028
  }
26029
+ placeBestFit(i, slice, label, auto);
25879
26030
  return;
25880
26031
  }
25881
26032
  if (!isOutsidePosition(pointPosition)) {
@@ -25918,6 +26069,16 @@ function buildPieDataLabels(params) {
25918
26069
  leaderLines.push(leaderLine(slice, cx, cy, outerR, { x: labelX, y: labelY }, leaderLineStyle));
25919
26070
  }
25920
26071
  });
26072
+ // Outside bestFit labels: nudge colliding ones apart (a moved label gets a
26073
+ // leader line from placeBestFit), see chart-pie-label-collision.
26074
+ const nudges = nudgeOutsideLabels(pendingOutside.map((p) => ({ id: p.i, x: p.auto.x, y: p.auto.y, w: p.w, h: p.h })), { cx, cy, r: outerR }, 0, params.svgHeight ?? Number.POSITIVE_INFINITY);
26075
+ for (const p of pendingOutside) {
26076
+ const nudge = nudges.find((n) => n.id === p.i);
26077
+ placeBestFit(p.i, p.slice, p.label, p.auto, {
26078
+ x: p.auto.x + (nudge?.dx ?? 0),
26079
+ y: p.auto.y + (nudge?.dy ?? 0),
26080
+ });
26081
+ }
25921
26082
  return { labels, leaderLines, boxes };
25922
26083
  }
25923
26084
 
@@ -25978,9 +26139,19 @@ function computePieSlicePath(cx, cy, outerR, innerR, startAngle, endAngle) {
25978
26139
  labelR = innerR > 0 ? (innerR + outerR) / 2 : outerR * 0.7, labelX = cx + labelR * Math.cos(midAngle), labelY = cy + labelR * Math.sin(midAngle);
25979
26140
  return { d, midAngle, labelX, labelY, startAngle, endAngle, cx, cy };
25980
26141
  }
26142
+ /** Constant padding (px) PowerPoint leaves inside an automatic pie plot area. */
26143
+ const PIE_AUTO_INSET_PX = 6.7;
25981
26144
  function computePieLayout(elementWidth, elementHeight, chartData, isDoughnut) {
25982
26145
  const size = Math.min(Math.max(elementWidth, 1), Math.max(elementHeight, 1)), titleOffset = chartTitleReservePx(chartData), legendOffset = chartData.style?.hasLegend ? 20 : 0;
25983
- let cx = size / 2, cy = titleOffset + (size - titleOffset - legendOffset) / 2, outerR = Math.max((size - titleOffset - legendOffset) * 0.42, 0);
26146
+ let cx = size / 2, cy = titleOffset + (size - titleOffset - legendOffset) / 2,
26147
+ // Automatic plot area: 42% of the free height, less a fixed inset.
26148
+ // PowerPoint keeps a constant padding (about 5pt, 6.7px) between the
26149
+ // pie and the plot-area edge, so the pie is smaller than a pure
26150
+ // percentage of the box by the same PIXELS at every size: about 8% of the
26151
+ // radius in a small (~200px) chart, under 1% in a large one, which is
26152
+ // the documented discrepancy. Not COM-measured; the constant is fitted to
26153
+ // that reported worst case.
26154
+ outerR = Math.max((size - titleOffset - legendOffset) * 0.42 - PIE_AUTO_INSET_PX, 0);
25984
26155
  // c:plotArea/c:layout/c:manualLayout is measured on the element, while the
25985
26156
  // pie is laid out on a centred `size x size` square: translate the automatic
25986
26157
  // disc out to the element, resolve, and translate the centre back in. The
@@ -27653,6 +27824,14 @@ function buildWaterfallViewModel(element, chartData, categoryLabels) {
27653
27824
  // Main view-model builder
27654
27825
  // ─────────────────────────────────────────────────────────────────────────────
27655
27826
  function buildChartViewModel(element) {
27827
+ const vm = buildChartViewModelInner(element);
27828
+ // A label with a line break (a "\n" `c:separator`) paints as one `<text>` per
27829
+ // line in every binding; single-line labels pass through untouched.
27830
+ return vm.dataLabels.some((label) => label.text.includes('\n'))
27831
+ ? { ...vm, dataLabels: vm.dataLabels.flatMap(splitLabelLines) }
27832
+ : vm;
27833
+ }
27834
+ function buildChartViewModelInner(element) {
27656
27835
  if (element.type !== 'chart') {
27657
27836
  return buildFallbackViewModel(element.width, element.height, 'Chart');
27658
27837
  }
@@ -30970,7 +31149,7 @@ const DEFAULT_ANIMATION_TIMING_CURVE = 'linear';
30970
31149
  function effectiveTimingCurve(curve) {
30971
31150
  return curve ?? DEFAULT_ANIMATION_TIMING_CURVE;
30972
31151
  }
30973
- function unit(value) {
31152
+ function unit$1(value) {
30974
31153
  if (value === undefined || !Number.isFinite(value) || value <= 0) {
30975
31154
  return 0;
30976
31155
  }
@@ -30982,8 +31161,8 @@ function unit(value) {
30982
31161
  * down proportionally so the ramps meet instead of overlapping.
30983
31162
  */
30984
31163
  function normalizeAccelDecel(accel, decel) {
30985
- const a = unit(accel);
30986
- const d = unit(decel);
31164
+ const a = unit$1(accel);
31165
+ const d = unit$1(decel);
30987
31166
  const sum = a + d;
30988
31167
  return sum > 1 ? { accel: a / sum, decel: d / sum } : { accel: a, decel: d };
30989
31168
  }
@@ -31890,6 +32069,20 @@ const DIRECTION_VALUES = [
31890
32069
  'fromBottomLeft',
31891
32070
  'fromBottomRight',
31892
32071
  ];
32072
+ /**
32073
+ * Direction -> i18n dictionary key, for every picker in every binding, so the
32074
+ * bindings spell a direction the same way without each keeping its own map.
32075
+ */
32076
+ const ANIMATION_DIRECTION_LABEL_KEYS = {
32077
+ fromTop: 'pptx.animation.direction.fromTop',
32078
+ fromBottom: 'pptx.animation.direction.fromBottom',
32079
+ fromLeft: 'pptx.animation.direction.fromLeft',
32080
+ fromRight: 'pptx.animation.direction.fromRight',
32081
+ fromTopLeft: 'pptx.animation.direction.fromTopLeft',
32082
+ fromTopRight: 'pptx.animation.direction.fromTopRight',
32083
+ fromBottomLeft: 'pptx.animation.direction.fromBottomLeft',
32084
+ fromBottomRight: 'pptx.animation.direction.fromBottomRight',
32085
+ };
31893
32086
  const EDGES$1 = DIRECTION_VALUES.slice(0, 4);
31894
32087
  const PRESET_DIRECTIONS = {
31895
32088
  flyIn: DIRECTION_VALUES,
@@ -34635,6 +34828,33 @@ function redirectMaskEffectByFilterSubtype(effect, filter) {
34635
34828
  }
34636
34829
  return effect;
34637
34830
  }
34831
+ /** Shape reveals whose exit Effect Options "Out" opens a hole at the centre. */
34832
+ const EXIT_FROM_CENTER_REVEAL = {
34833
+ boxOut: { family: 'box', variant: 'boxOutFromCenter' },
34834
+ circleOut: { family: 'circle', variant: 'circleOutFromCenter' },
34835
+ diamondOut: { family: 'diamond', variant: 'diamondOutFromCenter' },
34836
+ plusOut: { family: 'plus', variant: 'plusOutFromCenter' },
34837
+ };
34838
+ /** `p:cTn/@presetSubtype` PowerPoint writes for the shape reveals' "Out" direction. */
34839
+ const SHAPE_REVEAL_OUT_SUBTYPE = 32;
34840
+ /**
34841
+ * Redirect the default Box / Circle / Diamond / Plus EXIT (which closes in
34842
+ * toward the centre, PowerPoint's "In") to its "Out" variant when the effect
34843
+ * asks for that direction: the filter's own subtype token (`box(out)`), else,
34844
+ * with no filter to read, `presetSubtype` 32. Mirrors how the entrance side
34845
+ * honours the same token in {@link redirectMaskEffectByFilterSubtype}.
34846
+ * Returns `effect` unchanged for any other effect or direction.
34847
+ */
34848
+ function redirectExitShapeByDirection(effect, filter, presetSubtype) {
34849
+ const variant = effect ? EXIT_FROM_CENTER_REVEAL[effect] : undefined;
34850
+ if (!effect || !variant) {
34851
+ return effect;
34852
+ }
34853
+ const isOut = filter
34854
+ ? filter.family === variant.family && filter.subtype === 'out'
34855
+ : presetSubtype === SHAPE_REVEAL_OUT_SUBTYPE;
34856
+ return isOut ? variant.variant : effect;
34857
+ }
34638
34858
 
34639
34859
  /**
34640
34860
  * `animation-presets` - OOXML preset-id -> effect-name lookup tables for the
@@ -36366,6 +36586,25 @@ const EXIT_SHAPE_KEYFRAME_DEFINITIONS = {
36366
36586
  plusOut: `@keyframes pptx-plusOut {
36367
36587
  from { ${maskShapeDecl('plusOut', 'shown')} opacity: 1; }
36368
36588
  to { ${maskShapeDecl('plusOut', 'hidden')} opacity: 0; }
36589
+ }`,
36590
+ // Exit Effect Options "Out": a hole shaped like the preset opens at the
36591
+ // centre and grows to the element's edges (the entrance "In" hole
36592
+ // reveal played in reverse), so the element vanishes from the middle.
36593
+ boxOutFromCenter: `@keyframes pptx-boxOutFromCenter {
36594
+ from { ${maskHoleDecl('box', 'shown')} opacity: 1; }
36595
+ to { ${maskHoleDecl('box', 'hidden')} opacity: 1; }
36596
+ }`,
36597
+ circleOutFromCenter: `@keyframes pptx-circleOutFromCenter {
36598
+ from { ${maskHoleDecl('circle', 'shown')} opacity: 1; }
36599
+ to { ${maskHoleDecl('circle', 'hidden')} opacity: 1; }
36600
+ }`,
36601
+ diamondOutFromCenter: `@keyframes pptx-diamondOutFromCenter {
36602
+ from { ${maskHoleDecl('diamond', 'shown')} opacity: 1; }
36603
+ to { ${maskHoleDecl('diamond', 'hidden')} opacity: 1; }
36604
+ }`,
36605
+ plusOutFromCenter: `@keyframes pptx-plusOutFromCenter {
36606
+ from { ${maskPlusHoleDecl('shown')} opacity: 1; }
36607
+ to { ${maskPlusHoleDecl('hidden')} opacity: 1; }
36369
36608
  }`,
36370
36609
  // The hidden region is the entrance's two wedges opening from 12
36371
36610
  // o'clock (CreateVideo-derived, see `animation-wedge-reveal`).
@@ -39146,7 +39385,7 @@ function resolveEffect(anim, pixelateMosaic) {
39146
39385
  }
39147
39386
  }
39148
39387
  else if (cls === 'exit') {
39149
- const effect = redirectStripsEffect(applyFlyDirection(PRESET_ID_TO_EFFECT.exit[id], anim.presetSubtype), anim.effectFilter, anim.presetSubtype);
39388
+ const effect = redirectStripsEffect(redirectExitShapeByDirection(applyFlyDirection(PRESET_ID_TO_EFFECT.exit[id], anim.presetSubtype), anim.effectFilter, anim.presetSubtype), anim.effectFilter, anim.presetSubtype);
39150
39389
  if (effect) {
39151
39390
  return effect;
39152
39391
  }
@@ -55115,6 +55354,39 @@ const galleryTranslationsEn = {
55115
55354
  'pptx.gallery.shapeStyles.gradientFill': 'Gradient Fill - {{color}}',
55116
55355
  };
55117
55356
 
55357
+ /**
55358
+ * English copy for the Picture Format > Adjust galleries (Corrections, Color,
55359
+ * Artistic Effects; `render/ribbon-galleries/picture-*-gallery.ts`). Artistic
55360
+ * effect tiles reuse the `pptx.image.effect*` keys.
55361
+ */
55362
+ const galleryAdjustTranslationsEn = {
55363
+ 'pptx.ribbon.groupAdjust': 'Adjust',
55364
+ 'pptx.gallery.pictureCorrections.title': 'Corrections',
55365
+ 'pptx.gallery.pictureCorrections.sharpenSoften': 'Sharpen/Soften',
55366
+ 'pptx.gallery.pictureCorrections.brightnessContrastTitle': 'Brightness/Contrast',
55367
+ 'pptx.gallery.pictureCorrections.soften': 'Soften: {{amount}}%',
55368
+ 'pptx.gallery.pictureCorrections.sharpen': 'Sharpen: {{amount}}%',
55369
+ 'pptx.gallery.pictureCorrections.sharpenNormal': 'Sharpen: 0% (Normal)',
55370
+ 'pptx.gallery.pictureCorrections.brightnessContrast': 'Brightness: {{brightness}}% Contrast: {{contrast}}%',
55371
+ 'pptx.gallery.pictureCorrections.brightnessContrastNormal': 'Brightness: 0% Contrast: 0% (Normal)',
55372
+ 'pptx.gallery.pictureColor.title': 'Color',
55373
+ 'pptx.gallery.pictureColor.saturationTitle': 'Color Saturation',
55374
+ 'pptx.gallery.pictureColor.toneTitle': 'Color Tone',
55375
+ 'pptx.gallery.pictureColor.recolorTitle': 'Recolor',
55376
+ 'pptx.gallery.pictureColor.saturation': 'Saturation: {{amount}}%',
55377
+ 'pptx.gallery.pictureColor.saturationNormal': 'Saturation: 100% (Normal)',
55378
+ 'pptx.gallery.pictureColor.tone': 'Temperature: {{kelvin}} K',
55379
+ 'pptx.gallery.pictureColor.toneNormal': 'Temperature: 6500 K (Normal)',
55380
+ 'pptx.gallery.pictureColor.recolorNone': 'No Recolor',
55381
+ 'pptx.gallery.pictureColor.recolorGrayscale': 'Grayscale',
55382
+ 'pptx.gallery.pictureColor.recolorSepia': 'Sepia',
55383
+ 'pptx.gallery.pictureColor.recolorWashout': 'Washout',
55384
+ 'pptx.gallery.pictureColor.recolorBlackWhite': 'Black and White: {{amount}}%',
55385
+ 'pptx.gallery.pictureColor.recolorAccentDark': 'Accent {{n}}, Dark',
55386
+ 'pptx.gallery.pictureColor.recolorAccentLight': 'Accent {{n}}, Light',
55387
+ 'pptx.gallery.pictureArtisticEffects.title': 'Artistic Effects',
55388
+ };
55389
+
55118
55390
  /**
55119
55391
  * English copy for the Table Styles, chart, SmartArt and theme Variants
55120
55392
  * galleries (`render/ribbon-galleries/`).
@@ -55361,6 +55633,7 @@ const translationsEn = {
55361
55633
  ...galleryEffectsTranslationsEn,
55362
55634
  ...galleryDataTranslationsEn,
55363
55635
  ...galleryPictureTranslationsEn,
55636
+ ...galleryAdjustTranslationsEn,
55364
55637
  // Status bar
55365
55638
  'pptx.statusBar.allSaved': 'All saved',
55366
55639
  'pptx.statusBar.unsavedChanges': 'Unsaved changes',
@@ -77405,6 +77678,8 @@ const COMPLEX_ELEMENT_FIELDS = {
77405
77678
  customGeometryAdjustHandlesPolar: '_cgo',
77406
77679
  customGeometryConnectionSites: '_cgc',
77407
77680
  customGeometryTextRect: '_cgt',
77681
+ // A 3D model's authored camera, transform and lights (read-only view of `rawXml`).
77682
+ scene: '_m3s',
77408
77683
  };
77409
77684
  const REV_COMPLEX_ELEMENT = Object.fromEntries(Object.entries(COMPLEX_ELEMENT_FIELDS).map(([k, v]) => [v, k]));
77410
77685
  const SCALAR_SLIDE_KEYS = new Set([
@@ -85426,7 +85701,7 @@ function computeSmartArtElementLayout(smartArtData, nodes, box, palette, style,
85426
85701
  * @module color-contrast
85427
85702
  */
85428
85703
  /** Parse `#rgb`/`#rrggbb` into `[r, g, b]` (0..255); falls back to mid-grey. */
85429
- function parseHex(hex) {
85704
+ function parseHex$1(hex) {
85430
85705
  let h = hex.trim().replace(/^#/u, '');
85431
85706
  if (h.length === 3) {
85432
85707
  h = h
@@ -85444,7 +85719,7 @@ function parseHex(hex) {
85444
85719
  * using the WCAG relative-luminance threshold.
85445
85720
  */
85446
85721
  function contrastTextColor(fill) {
85447
- const [r, g, b] = parseHex(fill);
85722
+ const [r, g, b] = parseHex$1(fill);
85448
85723
  const lum = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
85449
85724
  return lum > 0.6 ? '#1a1a1a' : '#ffffff';
85450
85725
  }
@@ -86553,7 +86828,7 @@ function blendOntoWhite(color, opacity) {
86553
86828
  if (opacity === undefined || !color.startsWith('#')) {
86554
86829
  return color;
86555
86830
  }
86556
- const hex = parseHex(color)
86831
+ const hex = parseHex$1(color)
86557
86832
  .map((c) => Math.round(c * opacity + 255 * (1 - opacity)))
86558
86833
  .map((c) => c.toString(16).padStart(2, '0'))
86559
86834
  .join('');
@@ -87465,6 +87740,62 @@ function buildSmartArt3DSpecForElement(element, options = {}) {
87465
87740
  return model.meshes.length > 0 ? model : null;
87466
87741
  }
87467
87742
 
87743
+ /**
87744
+ * The inline-editing layer over a 3D SmartArt view (framework-agnostic).
87745
+ *
87746
+ * `<pptx-three-view>` keeps a SmartArt's 2D SVG only as its fallback, hidden
87747
+ * once the scene is up, so a binding that edits node text on the canvas lays
87748
+ * a second render of the diagram over the scene with its SVG paint hidden:
87749
+ * its `[data-smartart-node-id]` groups still take the double-click and the
87750
+ * textarea it opens is not SVG, so it shows. That layer is an input surface,
87751
+ * not a second copy of the element, so its element markers go.
87752
+ *
87753
+ * @module smartart-3d-edit-layer
87754
+ */
87755
+ /** Element markers a second render of a diagram must not repeat. */
87756
+ const EDIT_LAYER_MARKER_ATTRS = [
87757
+ 'data-element-id',
87758
+ 'data-testid',
87759
+ 'data-pptx-element',
87760
+ 'role',
87761
+ 'aria-label',
87762
+ 'aria-roledescription',
87763
+ ];
87764
+ /** Remove the element markers from `root` and everything under it. */
87765
+ function stripEditLayerMarkers(root) {
87766
+ for (const el of [root, ...root.querySelectorAll('*')]) {
87767
+ for (const attr of EDIT_LAYER_MARKER_ATTRS) {
87768
+ if (el.hasAttribute(attr)) {
87769
+ el.removeAttribute(attr);
87770
+ }
87771
+ }
87772
+ }
87773
+ }
87774
+ /**
87775
+ * The `[data-smartart-node-id]` element under viewport point `(x, y)` inside
87776
+ * `root`, by geometry: the smallest node box containing the point. Unlike
87777
+ * `document.elementsFromPoint`, this finds nodes that hit-testing skips, such
87778
+ * as a hidden layer's `pointer-events: none` groups.
87779
+ */
87780
+ function smartArtNodeAtPoint(root, x, y) {
87781
+ let best = null;
87782
+ let bestArea = Number.POSITIVE_INFINITY;
87783
+ for (const node of root.querySelectorAll('[data-smartart-node-id]')) {
87784
+ const box = node.getBoundingClientRect();
87785
+ const area = box.width * box.height;
87786
+ if (area > 0 &&
87787
+ x >= box.left &&
87788
+ x <= box.right &&
87789
+ y >= box.top &&
87790
+ y <= box.bottom &&
87791
+ area < bestArea) {
87792
+ best = node;
87793
+ bestArea = area;
87794
+ }
87795
+ }
87796
+ return best;
87797
+ }
87798
+
87468
87799
  /** Value-axis label text (`percentStacked` axes read as whole percents). */
87469
87800
  function formatValueLabel(chartData, grouping, v) {
87470
87801
  if (grouping === 'percentStacked') {
@@ -88840,6 +89171,235 @@ function extraConnectionCount(data) {
88840
89171
  return classifyExtraConnections(data).length;
88841
89172
  }
88842
89173
 
89174
+ /**
89175
+ * Pure decision function: authored PowerPoint 3D scene data -> a
89176
+ * framework-neutral three.js scene descriptor.
89177
+ *
89178
+ * `resolveModel3DSceneDescriptor` reads the camera, model transform and lights
89179
+ * parsed by core (`Model3DSceneData`) and returns plain numbers/strings. All
89180
+ * lengths in the descriptor are METRES (EMU / 914400); the three.js applier
89181
+ * ({@link ./model3d-scene-apply}) converts metres into fitted scene units once
89182
+ * the model's size is known. When nothing is authored the descriptor reproduces
89183
+ * the viewer's long-standing default framing and lights.
89184
+ *
89185
+ * NOTE: not yet verified against PowerPoint renders (axis handedness of
89186
+ * `am3d:rot`, ordering of `preTrans`, and orthographic scale are unconfirmed).
89187
+ */
89188
+ const EMU_PER_METER = 914400;
89189
+ /** Default vertical field of view (degrees) used when none is authored. */
89190
+ const DEFAULT_MODEL3D_FOV_DEG = 50;
89191
+ /** The built-in camera (unchanged pre-existing framing). */
89192
+ const DEFAULT_MODEL3D_CAMERA = {
89193
+ framing: 'default',
89194
+ kind: 'perspective',
89195
+ fovDeg: DEFAULT_MODEL3D_FOV_DEG,
89196
+ position: [0, 0, 5],
89197
+ up: [0, 1, 0],
89198
+ target: [0, 0, 0],
89199
+ };
89200
+ /** The built-in lights (unchanged pre-existing rig). */
89201
+ const DEFAULT_MODEL3D_LIGHTS = [
89202
+ { kind: 'ambient', color: '#ffffff', intensity: 0.5 },
89203
+ { kind: 'directional', color: '#ffffff', intensity: 1, position: [5, 5, 5] },
89204
+ { kind: 'directional', color: '#ffffff', intensity: 0.3, position: [-3, -3, 2] },
89205
+ ];
89206
+ const metres = (v, fallback) => v ? [v.x / EMU_PER_METER, v.y / EMU_PER_METER, v.z / EMU_PER_METER] : fallback;
89207
+ function unit(v) {
89208
+ if (!v) {
89209
+ return undefined;
89210
+ }
89211
+ const len = Math.hypot(v.x, v.y, v.z);
89212
+ return len > 0 ? [v.x / len, v.y / len, v.z / len] : undefined;
89213
+ }
89214
+ function resolveCamera(scene) {
89215
+ const cam = scene.camera;
89216
+ const position = cam?.position;
89217
+ if (!cam || !position) {
89218
+ return DEFAULT_MODEL3D_CAMERA;
89219
+ }
89220
+ const fov = cam.fovDeg !== undefined && cam.fovDeg > 0 && cam.fovDeg < 180 ? cam.fovDeg : undefined;
89221
+ return {
89222
+ framing: 'authored',
89223
+ kind: cam.projection,
89224
+ fovDeg: fov ?? DEFAULT_MODEL3D_FOV_DEG,
89225
+ position: metres(position, [0, 0, 5]),
89226
+ up: unit(cam.up) ?? [0, 1, 0],
89227
+ target: metres(cam.lookAt, [0, 0, 0]),
89228
+ };
89229
+ }
89230
+ function resolveLight(light) {
89231
+ const base = {
89232
+ kind: light.kind,
89233
+ color: light.color ?? '#ffffff',
89234
+ intensity: Math.max(0, light.illuminance ?? (light.kind === 'ambient' ? 0.5 : 1)),
89235
+ };
89236
+ if (light.kind === 'ambient') {
89237
+ return base;
89238
+ }
89239
+ return {
89240
+ ...base,
89241
+ ...(light.position ? { position: metres(light.position, [0, 0, 0]) } : {}),
89242
+ ...(light.direction ? { direction: unit(light.direction) } : {}),
89243
+ ...(light.kind === 'spot' && light.spotAngleDeg !== undefined
89244
+ ? { spotAngleDeg: light.spotAngleDeg }
89245
+ : {}),
89246
+ };
89247
+ }
89248
+ function resolveTransform(scene) {
89249
+ const t = scene.transform;
89250
+ if (!t) {
89251
+ return undefined;
89252
+ }
89253
+ const mpu = t.meterPerModelUnit !== undefined && t.meterPerModelUnit > 0 ? t.meterPerModelUnit : undefined;
89254
+ const s = t.scale;
89255
+ const r = t.rotationDeg;
89256
+ return {
89257
+ ...(mpu !== undefined ? { meterPerModelUnit: mpu } : {}),
89258
+ scale: s ? [s.x, s.y, s.z] : [1, 1, 1],
89259
+ rotationDeg: r ? [r.x, r.y, r.z] : [0, 0, 0],
89260
+ postTranslate: metres(t.postTranslate, [0, 0, 0]),
89261
+ };
89262
+ }
89263
+ /**
89264
+ * Turn parsed 3D scene data into a three.js scene descriptor. With no data
89265
+ * (or no authored camera / lights) the matching part falls back to the default
89266
+ * framing / lights, so `resolveModel3DSceneDescriptor(undefined)` equals the
89267
+ * previous hard-coded setup.
89268
+ */
89269
+ function resolveModel3DSceneDescriptor(scene) {
89270
+ if (!scene) {
89271
+ return {
89272
+ authored: false,
89273
+ camera: DEFAULT_MODEL3D_CAMERA,
89274
+ lightsAuthored: false,
89275
+ lights: [...DEFAULT_MODEL3D_LIGHTS],
89276
+ };
89277
+ }
89278
+ const camera = resolveCamera(scene);
89279
+ const transform = resolveTransform(scene);
89280
+ const lights = scene.lights.length > 0 ? scene.lights.map(resolveLight) : [...DEFAULT_MODEL3D_LIGHTS];
89281
+ return {
89282
+ authored: camera.framing === 'authored' || transform !== undefined || scene.lights.length > 0,
89283
+ camera,
89284
+ lightsAuthored: scene.lights.length > 0,
89285
+ ...(transform ? { transform } : {}),
89286
+ lights,
89287
+ };
89288
+ }
89289
+
89290
+ /**
89291
+ * three.js applier for a {@link Model3DSceneDescriptor}.
89292
+ *
89293
+ * Builds the camera, lights and (optional) model wrapper for
89294
+ * `mountModel3D` from the pure descriptor. `three` is passed in by the caller
89295
+ * (it is an optional, dynamically imported peer), so this file only carries
89296
+ * type-only imports.
89297
+ */
89298
+ /** Distance of the built-in camera, and the fallback for authored ones. */
89299
+ const DEFAULT_DISTANCE = 5;
89300
+ const DEG = Math.PI / 180;
89301
+ /**
89302
+ * Scene units per metre. The model is auto-fitted to a 2-unit cube, so one
89303
+ * metre spans `2 / (maxModelDim * meterPerModelUnit)` units. Without an
89304
+ * authored `meterPerModelUnit` the authored camera distance is normalised to
89305
+ * the default distance so the model still fills the view sensibly.
89306
+ */
89307
+ function computeMetresToSceneScale(desc, maxModelDim) {
89308
+ const mpu = desc.transform?.meterPerModelUnit;
89309
+ if (mpu && maxModelDim > 0) {
89310
+ return 2 / (maxModelDim * mpu);
89311
+ }
89312
+ const cam = desc.camera;
89313
+ const dist = Math.hypot(cam.position[0] - cam.target[0], cam.position[1] - cam.target[1], cam.position[2] - cam.target[2]);
89314
+ return dist > 0 ? DEFAULT_DISTANCE / dist : 1;
89315
+ }
89316
+ const scaled = (v, k) => [v[0] * k, v[1] * k, v[2] * k];
89317
+ function buildLight(three, light, k, authored) {
89318
+ const color = new three.Color(light.color);
89319
+ // Default-rig positions are already scene units; authored ones are metres.
89320
+ const pos = light.position ? (authored ? scaled(light.position, k) : light.position) : undefined;
89321
+ let obj;
89322
+ switch (light.kind) {
89323
+ case 'ambient':
89324
+ return new three.AmbientLight(color, light.intensity);
89325
+ case 'point':
89326
+ obj = new three.PointLight(color, light.intensity);
89327
+ break;
89328
+ case 'spot': {
89329
+ const spot = new three.SpotLight(color, light.intensity);
89330
+ if (light.spotAngleDeg !== undefined) {
89331
+ spot.angle = Math.min(Math.PI / 2, Math.max(0.01, light.spotAngleDeg * DEG));
89332
+ }
89333
+ obj = spot;
89334
+ break;
89335
+ }
89336
+ default:
89337
+ obj = new three.DirectionalLight(color, light.intensity);
89338
+ }
89339
+ if (pos) {
89340
+ obj.position.set(pos[0], pos[1], pos[2]);
89341
+ }
89342
+ else if (light.direction) {
89343
+ // No authored position: place the light up-stream of its direction.
89344
+ const d = light.direction;
89345
+ obj.position.set(-d[0] * DEFAULT_DISTANCE, -d[1] * DEFAULT_DISTANCE, -d[2] * DEFAULT_DISTANCE);
89346
+ }
89347
+ return obj;
89348
+ }
89349
+ /** Build camera, lights and model placement for a descriptor. */
89350
+ function buildModel3DRig(three, desc, aspect, maxModelDim) {
89351
+ const authoredCam = desc.camera.framing === 'authored';
89352
+ const k = authoredCam || desc.transform ? computeMetresToSceneScale(desc, maxModelDim) : 1;
89353
+ const pos = authoredCam ? scaled(desc.camera.position, k) : desc.camera.position;
89354
+ const target = authoredCam ? scaled(desc.camera.target, k) : desc.camera.target;
89355
+ const distance = Math.hypot(pos[0] - target[0], pos[1] - target[1], pos[2] - target[2]);
89356
+ const fov = desc.camera.fovDeg || DEFAULT_MODEL3D_FOV_DEG;
89357
+ // Orthographic frustum height chosen to match the perspective view at the
89358
+ // target distance (the authored orthographic scale is not yet mapped).
89359
+ const halfHeight = distance * Math.tan((fov * DEG) / 2);
89360
+ let camera;
89361
+ if (desc.camera.kind === 'orthographic') {
89362
+ camera = new three.OrthographicCamera(-halfHeight * aspect, halfHeight * aspect, halfHeight, -halfHeight, 0.1, 1000);
89363
+ }
89364
+ else {
89365
+ camera = new three.PerspectiveCamera(fov, aspect, 0.1, 1000);
89366
+ }
89367
+ camera.position.set(pos[0], pos[1], pos[2]);
89368
+ if (authoredCam) {
89369
+ camera.up.set(desc.camera.up[0], desc.camera.up[1], desc.camera.up[2]);
89370
+ }
89371
+ camera.lookAt(target[0], target[1], target[2]);
89372
+ const lights = desc.lights.map((l) => buildLight(three, l, k, desc.lightsAuthored));
89373
+ const t = desc.transform;
89374
+ return {
89375
+ camera,
89376
+ lights,
89377
+ distance,
89378
+ placeModel(model) {
89379
+ if (!t) {
89380
+ return model;
89381
+ }
89382
+ const group = new three.Group();
89383
+ group.add(model);
89384
+ group.scale.set(t.scale[0], t.scale[1], t.scale[2]);
89385
+ group.rotation.set(t.rotationDeg[0] * DEG, t.rotationDeg[1] * DEG, t.rotationDeg[2] * DEG);
89386
+ const post = scaled(t.postTranslate, k);
89387
+ group.position.set(post[0], post[1], post[2]);
89388
+ return group;
89389
+ },
89390
+ setAspect(next) {
89391
+ if (camera instanceof three.PerspectiveCamera) {
89392
+ camera.aspect = next;
89393
+ }
89394
+ else {
89395
+ camera.left = -halfHeight * next;
89396
+ camera.right = halfHeight * next;
89397
+ }
89398
+ camera.updateProjectionMatrix();
89399
+ },
89400
+ };
89401
+ }
89402
+
88843
89403
  /**
88844
89404
  * Vanilla three.js GLTF/GLB model scene controller (framework-agnostic).
88845
89405
  *
@@ -88893,7 +89453,6 @@ const THREE_UNAVAILABLE = {
88893
89453
  setInteractive: () => { },
88894
89454
  dispose: () => { },
88895
89455
  };
88896
- const FOV = 50;
88897
89456
  /** Dynamically load `three`; returns `null` when the package is not installed. */
88898
89457
  async function loadThree() {
88899
89458
  try {
@@ -88944,6 +89503,7 @@ function centerAndFit(three, root) {
88944
89503
  const center = new three.Vector3();
88945
89504
  box.getCenter(center);
88946
89505
  root.position.sub(center.multiplyScalar(root.scale.x));
89506
+ return maxDim;
88947
89507
  }
88948
89508
  /**
88949
89509
  * Mount an interactive GLTF/GLB model into `container` and start rendering.
@@ -88972,16 +89532,6 @@ async function mountModel3D(container, modelUrl, options) {
88972
89532
  if (options.background) {
88973
89533
  scene.background = new three.Color(options.background);
88974
89534
  }
88975
- const camera = new three.PerspectiveCamera(FOV, width / height, 0.1, 1000);
88976
- camera.position.set(0, 0, 5);
88977
- camera.lookAt(0, 0, 0);
88978
- scene.add(new three.AmbientLight(0xffffff, 0.5));
88979
- const key = new three.DirectionalLight(0xffffff, 1);
88980
- key.position.set(5, 5, 5);
88981
- scene.add(key);
88982
- const fill = new three.DirectionalLight(0xffffff, 0.3);
88983
- fill.position.set(-3, -3, 2);
88984
- scene.add(fill);
88985
89535
  let gltf;
88986
89536
  try {
88987
89537
  gltf = await loadGltf(new GltfLoaderCtor(), modelUrl);
@@ -88992,8 +89542,14 @@ async function mountModel3D(container, modelUrl, options) {
88992
89542
  return THREE_UNAVAILABLE;
88993
89543
  }
88994
89544
  const model = gltf.scene;
88995
- centerAndFit(three, model);
88996
- scene.add(model);
89545
+ const maxDim = centerAndFit(three, model);
89546
+ const descriptor = resolveModel3DSceneDescriptor(options.scene);
89547
+ const rig = buildModel3DRig(three, descriptor, width / height, maxDim);
89548
+ const camera = rig.camera;
89549
+ for (const light of rig.lights) {
89550
+ scene.add(light);
89551
+ }
89552
+ scene.add(rig.placeModel(model));
88997
89553
  let controls = null;
88998
89554
  const OrbitCtrlCtor = await loadOrbitControlsCtor();
88999
89555
  const enableControls = (on) => {
@@ -89002,8 +89558,8 @@ async function mountModel3D(container, modelUrl, options) {
89002
89558
  controls.enablePan = false;
89003
89559
  controls.enableZoom = true;
89004
89560
  controls.enableRotate = true;
89005
- controls.minDistance = 2;
89006
- controls.maxDistance = 20;
89561
+ controls.minDistance = descriptor.authored ? rig.distance * 0.2 : 2;
89562
+ controls.maxDistance = descriptor.authored ? rig.distance * 4 : 20;
89007
89563
  controls.update();
89008
89564
  }
89009
89565
  else if (!on && controls) {
@@ -89044,8 +89600,7 @@ async function mountModel3D(container, modelUrl, options) {
89044
89600
  resize(w, h) {
89045
89601
  const nextW = Math.max(1, w);
89046
89602
  const nextH = Math.max(1, h);
89047
- camera.aspect = nextW / nextH;
89048
- camera.updateProjectionMatrix();
89603
+ rig.setAspect(nextW / nextH);
89049
89604
  renderer.setSize(nextW, nextH, false);
89050
89605
  canvas.style.width = `${nextW}px`;
89051
89606
  canvas.style.height = `${nextH}px`;
@@ -109347,6 +109902,14 @@ const RIBBON_CATALOG_TAIL_TABS = {
109347
109902
  wordArtStyles: { label: 'WordArt Styles', controls: { gallery: 'WordArt Styles gallery' } },
109348
109903
  },
109349
109904
  pictureFormat: {
109905
+ adjust: {
109906
+ label: 'Adjust',
109907
+ controls: {
109908
+ corrections: 'Corrections gallery',
109909
+ color: 'Color gallery',
109910
+ artisticEffects: 'Artistic Effects gallery',
109911
+ },
109912
+ },
109350
109913
  pictureStyles: {
109351
109914
  label: 'Picture Styles',
109352
109915
  controls: { gallery: 'Picture Styles gallery', pictureEffects: 'Picture Effects gallery' },
@@ -110162,7 +110725,7 @@ function paintDefs(paint, id) {
110162
110725
  }
110163
110726
  return { defs: '', fill: safeColor(paint.color) };
110164
110727
  }
110165
- function filterDefs(effects, id) {
110728
+ function filterDefs$1(effects, id) {
110166
110729
  if (!effects) {
110167
110730
  return { defs: '', attr: '' };
110168
110731
  }
@@ -110200,7 +110763,7 @@ function shapeTileSvg(spec) {
110200
110763
  const w = spec.width - inset * 2;
110201
110764
  const h = spec.height - inset * 2 - (spec.effects?.reflection ? h3(spec) : 0);
110202
110765
  const paint = paintDefs(spec.fill, `${id}-f`);
110203
- const filter = filterDefs(spec.effects, `${id}-x`);
110766
+ const filter = filterDefs$1(spec.effects, `${id}-x`);
110204
110767
  const stroke = spec.stroke && spec.stroke.width > 0
110205
110768
  ? ` stroke="${safeColor(spec.stroke.color, '#000000')}" stroke-width="${num$8(Math.min(spec.stroke.width, 6))}"${spec.stroke.opacity !== undefined && spec.stroke.opacity < 1 ? ` stroke-opacity="${num$8(spec.stroke.opacity)}"` : ''}${spec.stroke.dash ? ` stroke-dasharray="${spec.stroke.dash}"` : ''}`
110206
110769
  : '';
@@ -111022,6 +111585,473 @@ function apply$3(itemId, ctx) {
111022
111585
  }
111023
111586
  const NUMBERING_GALLERY = { build: build$4, apply: apply$3 };
111024
111587
 
111588
+ /**
111589
+ * The Picture Adjust tile: a small stock "photo" (sky, hill, sun, house) with
111590
+ * the preset's preview filter applied, so each Corrections / Color / Artistic
111591
+ * Effects tile shows what the preset does. A CSS filter string carries most
111592
+ * presets; duotone and black-and-white recolors get a real SVG `<filter>`
111593
+ * because CSS filter functions cannot express them. Built only from catalogue
111594
+ * data, never user input.
111595
+ *
111596
+ * @module render/ribbon-galleries/picture-adjust-tile-svg
111597
+ */
111598
+ const PICTURE_ADJUST_TILE = { width: 56, height: 44 };
111599
+ /** Characters a CSS filter list may contain; anything else is dropped. */
111600
+ function safeCss(css) {
111601
+ return /^[\w\s().,%+-]*$/u.test(css) ? css : '';
111602
+ }
111603
+ function hexChannels(color) {
111604
+ const hex = safeColor(color, '#000000').replace('#', '');
111605
+ const n = Number.parseInt(hex.length === 6 ? hex : '000000', 16);
111606
+ return [((n >> 16) & 255) / 255, ((n >> 8) & 255) / 255, (n & 255) / 255];
111607
+ }
111608
+ function filterDefs(id, preview) {
111609
+ const lum = '0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0';
111610
+ if (preview.duotone) {
111611
+ const [dark, light] = [hexChannels(preview.duotone[0]), hexChannels(preview.duotone[1])];
111612
+ const table = (i) => `${dark[i].toFixed(3)} ${light[i].toFixed(3)}`;
111613
+ return `<filter id="${id}" color-interpolation-filters="sRGB"><feColorMatrix type="matrix" values="${lum}"/><feComponentTransfer><feFuncR type="table" tableValues="${table(0)}"/><feFuncG type="table" tableValues="${table(1)}"/><feFuncB type="table" tableValues="${table(2)}"/></feComponentTransfer></filter>`;
111614
+ }
111615
+ if (typeof preview.threshold === 'number') {
111616
+ const t = Math.max(0, Math.min(100, preview.threshold)) / 100;
111617
+ const intercept = (-100 * t).toFixed(2);
111618
+ return `<filter id="${id}" color-interpolation-filters="sRGB"><feColorMatrix type="matrix" values="${lum}"/><feComponentTransfer><feFuncR type="linear" slope="100" intercept="${intercept}"/><feFuncG type="linear" slope="100" intercept="${intercept}"/><feFuncB type="linear" slope="100" intercept="${intercept}"/></feComponentTransfer></filter>`;
111619
+ }
111620
+ return '';
111621
+ }
111622
+ /** One tile: the stock photo under `preview`. `key` keeps filter ids unique per tile. */
111623
+ function pictureAdjustTileSvg(key, preview) {
111624
+ const { width: w, height: h } = PICTURE_ADJUST_TILE;
111625
+ const id = `padj-${svgId(key)}`;
111626
+ const filter = filterDefs(`${id}-f`, preview);
111627
+ const css = preview.css ? safeCss(preview.css) : '';
111628
+ const filterAttr = filter ? ` filter="url(#${id}-f)"` : '';
111629
+ const styleAttr = css ? ` style="filter:${css}"` : '';
111630
+ const defs = `<clipPath id="${id}-c"><rect x="2" y="2" width="${w - 4}" height="${h - 4}" rx="2"/></clipPath><linearGradient id="${id}-s" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#5fa8ef"/><stop offset="1" stop-color="#cfe8ff"/></linearGradient>${filter}`;
111631
+ const photo = `<g clip-path="url(#${id}-c)"><g${filterAttr}${styleAttr}>` +
111632
+ `<rect x="2" y="2" width="${w - 4}" height="${h - 4}" fill="url(#${id}-s)"/>` +
111633
+ `<circle cx="${w - 15}" cy="13" r="5" fill="#ffd23f"/>` +
111634
+ `<path d="M2 ${h - 14} Q18 ${h - 26} 32 ${h - 16} T${w - 2} ${h - 14} V${h - 2} H2 Z" fill="#3f9b4a"/>` +
111635
+ `<path d="M2 ${h - 8} Q22 ${h - 18} ${w - 2} ${h - 7} V${h - 2} H2 Z" fill="#2a7a38"/>` +
111636
+ `<rect x="14" y="${h - 20}" width="10" height="8" fill="#d9534f"/>` +
111637
+ `<path d="M12 ${h - 20} L19 ${h - 26} L26 ${h - 20} Z" fill="#7a3b2e"/>` +
111638
+ `</g></g>`;
111639
+ const frame = `<rect x="1.5" y="1.5" width="${w - 3}" height="${h - 3}" rx="2.5" fill="none" stroke="#8a8886" stroke-width="1"/>`;
111640
+ return svgTile(w, h, defs, photo + frame);
111641
+ }
111642
+
111643
+ function isPictureElement(element) {
111644
+ return element?.type === 'image' || element?.type === 'picture';
111645
+ }
111646
+ /** The picture's image effects (empty when it has none). */
111647
+ function pictureEffects(element) {
111648
+ return element.imageEffects ?? {};
111649
+ }
111650
+ /** `imageEffects` merged with `changes`, dropping keys set to `undefined`. */
111651
+ function mergeImageEffects$1(effects, changes) {
111652
+ const merged = { ...effects, ...changes };
111653
+ for (const key of Object.keys(merged)) {
111654
+ if (merged[key] === undefined) {
111655
+ delete merged[key];
111656
+ }
111657
+ }
111658
+ return merged;
111659
+ }
111660
+ /** Case-insensitive `#RRGGBB` equality. */
111661
+ function sameHex(a, b) {
111662
+ return (a ?? '').replace('#', '').toUpperCase() === b.replace('#', '').toUpperCase();
111663
+ }
111664
+ function toSection(galleryId, section, element) {
111665
+ const effects = element ? pictureEffects(element) : {};
111666
+ const out = {
111667
+ id: section.id,
111668
+ ...(section.titleKey && { titleKey: section.titleKey }),
111669
+ ...(section.title && { title: section.title }),
111670
+ columns: section.columns,
111671
+ tileWidth: PICTURE_ADJUST_TILE.width,
111672
+ tileHeight: PICTURE_ADJUST_TILE.height,
111673
+ items: section.presets.map((preset) => ({
111674
+ id: preset.id,
111675
+ labelKey: preset.labelKey,
111676
+ ...(preset.labelParams && { labelParams: preset.labelParams }),
111677
+ label: preset.label,
111678
+ previewSvg: pictureAdjustTileSvg(`${galleryId}-${preset.id}`, preset.preview),
111679
+ ...(preset.preview.css && { previewFilter: preset.preview.css }),
111680
+ applied: element !== null && preset.applied(effects),
111681
+ })),
111682
+ };
111683
+ return out;
111684
+ }
111685
+ /** Build a gallery module from its title and its presets (which may depend on the theme). */
111686
+ function adjustGalleryModule(id, labelKey, label, sectionsFor) {
111687
+ return {
111688
+ build(ctx) {
111689
+ const element = isPictureElement(ctx.element) ? ctx.element : null;
111690
+ return {
111691
+ id,
111692
+ labelKey,
111693
+ label,
111694
+ disabled: element === null,
111695
+ sections: sectionsFor(ctx).map((section) => toSection(id, section, element)),
111696
+ };
111697
+ },
111698
+ apply(itemId, ctx) {
111699
+ const element = ctx.element;
111700
+ if (!isPictureElement(element)) {
111701
+ return null;
111702
+ }
111703
+ const preset = sectionsFor(ctx)
111704
+ .flatMap((section) => section.presets)
111705
+ .find((candidate) => candidate.id === itemId);
111706
+ if (!preset) {
111707
+ return null;
111708
+ }
111709
+ const effects = pictureEffects(element);
111710
+ return {
111711
+ kind: 'element',
111712
+ elementId: element.id,
111713
+ patch: {
111714
+ imageEffects: mergeImageEffects$1(effects, preset.changes(effects)),
111715
+ },
111716
+ };
111717
+ },
111718
+ };
111719
+ }
111720
+
111721
+ /**
111722
+ * Picture Format > Adjust > Artistic Effects. Offers exactly the effects the
111723
+ * renderer draws AND core serialises as `a14:artistic*` elements (the
111724
+ * inspector's catalogue minus the recolor/correction entries `grayscale`,
111725
+ * `sepia` and `sharpen`, which OOXML does not store as artistic effects and
111726
+ * which live in the Color and Corrections galleries). A pick writes
111727
+ * `imageEffects.artisticEffect`, the same field the inspector gallery writes.
111728
+ *
111729
+ * @module render/ribbon-galleries/picture-artistic-gallery
111730
+ */
111731
+ const KEY$4 = 'pptx.gallery.pictureArtisticEffects';
111732
+ /** Catalogue entries that are Color / Corrections settings in OOXML, not artistic effects. */
111733
+ const NOT_ARTISTIC = new Set(['grayscale', 'sepia', 'sharpen']);
111734
+ /**
111735
+ * Gallery names whose a14 element name is not `artistic` + the capitalised
111736
+ * name (core's `GALLERY_TO_A14`). A saved pick reloads under the a14 name.
111737
+ */
111738
+ const IRREGULAR_A14 = {
111739
+ mosaic: 'artisticMosiaicBubbles',
111740
+ glow_edges: 'artisticGlowEdges',
111741
+ paint: 'artisticPaintBrush',
111742
+ };
111743
+ /** True when a stored `artisticEffect` is gallery effect `name` (either spelling). */
111744
+ function isSameArtisticEffect(stored, name) {
111745
+ if (!stored) {
111746
+ return false;
111747
+ }
111748
+ const a14 = IRREGULAR_A14[name] ?? `artistic${name.charAt(0).toUpperCase()}${name.slice(1)}`;
111749
+ return stored === name || stored === a14;
111750
+ }
111751
+ function artisticPreset(name, labelKey, css) {
111752
+ const none = name === 'none';
111753
+ return {
111754
+ id: none ? 'artisticNone' : name,
111755
+ labelKey,
111756
+ label: name,
111757
+ changes: (fx) => none
111758
+ ? { artisticEffect: undefined, artisticParams: undefined, artisticRadius: undefined }
111759
+ : isSameArtisticEffect(fx.artisticEffect, name)
111760
+ ? {}
111761
+ : { artisticEffect: name, artisticParams: undefined, artisticRadius: undefined },
111762
+ applied: (fx) => (none ? !fx.artisticEffect : isSameArtisticEffect(fx.artisticEffect, name)),
111763
+ preview: { css },
111764
+ };
111765
+ }
111766
+ /** The effect names this gallery offers, in tile order (`none` first). */
111767
+ const PICTURE_ARTISTIC_EFFECT_NAMES = ARTISTIC_EFFECTS.map(([name]) => name).filter((name) => !NOT_ARTISTIC.has(name));
111768
+ function pictureArtisticSections() {
111769
+ return [
111770
+ {
111771
+ id: 'effects',
111772
+ columns: 4,
111773
+ presets: ARTISTIC_EFFECTS.filter(([name]) => !NOT_ARTISTIC.has(name)).map(([name, labelKey, css]) => artisticPreset(name, labelKey, css)),
111774
+ },
111775
+ ];
111776
+ }
111777
+ const PICTURE_ARTISTIC_EFFECTS_GALLERY = adjustGalleryModule('pictureArtisticEffects', `${KEY$4}.title`, 'Artistic Effects', pictureArtisticSections);
111778
+
111779
+ /**
111780
+ * Preset tables for the Picture Format > Adjust galleries (Corrections, Color).
111781
+ * Pure data: each preset carries the value it writes onto the picture's
111782
+ * `imageEffects` (the a14 Corrections / Color fields core already parses,
111783
+ * renders and serialises), in the units the model stores.
111784
+ *
111785
+ * @module render/ribbon-galleries/picture-adjust-catalog
111786
+ */
111787
+ /** Sharpen/Soften presets in percent: negative softens, positive sharpens. */
111788
+ const SHARPEN_SOFTEN_PERCENTS = [-50, -25, 0, 25, 50];
111789
+ /** Brightness / contrast steps in percent, as PowerPoint's 5x5 grid. */
111790
+ const BRIGHTNESS_CONTRAST_STEPS = [-40, -20, 0, 20, 40];
111791
+ /** Colour saturation presets in percent (100 is unchanged). */
111792
+ const SATURATION_PERCENTS = [0, 33, 66, 100, 133, 166, 200, 300, 400];
111793
+ /** Colour temperature presets in Kelvin (6500 is neutral). */
111794
+ const TEMPERATURES_K = [4700, 5300, 5900, 6500, 7200, 8000, 8800, 9600, 10600];
111795
+ /** `a14:saturation/@sat` percent that leaves the picture unchanged. */
111796
+ const NEUTRAL_SATURATION_PERCENT = 100;
111797
+ /** `a14:colorTemperature/@colorTemp` Kelvin value that leaves the picture unchanged. */
111798
+ const NEUTRAL_TEMPERATURE_K = 6500;
111799
+ /** Black and White thresholds in percent (`a:biLevel/@thresh`). */
111800
+ const BI_LEVEL_THRESHOLDS = [25, 50, 75];
111801
+ /** `a:lum` values of PowerPoint's Washout recolor. */
111802
+ const WASHOUT_LUM = { bright: 70, contrast: -70 };
111803
+ /** Sepia as PowerPoint writes it: a black to warm-tan duotone. */
111804
+ const SEPIA_DUOTONE = { color1: '#000000', color2: '#D9C3A5' };
111805
+ /** Theme accent slots offered as duotone recolors, with fallbacks (Office theme). */
111806
+ const RECOLOR_ACCENTS = [
111807
+ { key: 'accent1', fallback: '#156082' },
111808
+ { key: 'accent2', fallback: '#E97132' },
111809
+ { key: 'accent3', fallback: '#196B24' },
111810
+ { key: 'accent4', fallback: '#0F9ED5' },
111811
+ { key: 'accent5', fallback: '#A02B93' },
111812
+ { key: 'accent6', fallback: '#4EA72E' },
111813
+ ];
111814
+ /** Signed percent for a label: `+20`, `-40`, `0`. */
111815
+ function signedPercent(value) {
111816
+ return value > 0 ? `+${value}` : String(value);
111817
+ }
111818
+ function parseHex(color) {
111819
+ const match = /^#?([0-9a-f]{6})$/iu.exec(color.trim());
111820
+ if (!match) {
111821
+ return null;
111822
+ }
111823
+ const n = Number.parseInt(match[1], 16);
111824
+ return [(n >> 16) & 255, (n >> 8) & 255, n & 255];
111825
+ }
111826
+ /** `color` mixed toward `target` by `amount` (0..1), as an upper-case `#RRGGBB`. */
111827
+ function mixHex(color, target, amount) {
111828
+ const a = parseHex(color);
111829
+ const b = parseHex(target);
111830
+ if (!a || !b) {
111831
+ return color;
111832
+ }
111833
+ const channel = (i) => Math.round(a[i] + (b[i] - a[i]) * amount)
111834
+ .toString(16)
111835
+ .padStart(2, '0');
111836
+ return `#${channel(0)}${channel(1)}${channel(2)}`.toUpperCase();
111837
+ }
111838
+ /** The duotone colour pair of an accent recolor: black-to-accent (Dark), shade-to-white (Light). */
111839
+ function accentDuotone(accentHex, variant) {
111840
+ return variant === 'dark'
111841
+ ? { color1: '#000000', color2: accentHex.toUpperCase() }
111842
+ : { color1: mixHex(accentHex, '#000000', 0.45), color2: '#FFFFFF' };
111843
+ }
111844
+ /** Resolve accent `slot` from the deck's theme colour map, else the Office fallback. */
111845
+ function resolveAccentHex(themeColorMap, slot) {
111846
+ const value = themeColorMap?.[slot.key];
111847
+ return value && parseHex(value) ? `#${value.replace('#', '')}`.toUpperCase() : slot.fallback;
111848
+ }
111849
+
111850
+ const KEY$3 = 'pptx.gallery.pictureColor';
111851
+ function saturationPreset(percent) {
111852
+ const sat = percent * 1000;
111853
+ const normal = percent === NEUTRAL_SATURATION_PERCENT;
111854
+ return {
111855
+ id: normal ? 'saturationNormal' : `saturation${percent}`,
111856
+ labelKey: normal ? `${KEY$3}.saturationNormal` : `${KEY$3}.saturation`,
111857
+ ...(!normal && { labelParams: { amount: percent } }),
111858
+ label: normal ? 'Saturation: 100% (Normal)' : `Saturation: ${percent}%`,
111859
+ changes: () => ({ colorSaturation: normal ? undefined : { sat } }),
111860
+ applied: (fx) => (fx.colorSaturation?.sat ?? NEUTRAL_SATURATION_PERCENT * 1000) === sat,
111861
+ preview: { css: getImageCorrectionsFilterTokens({ colorSaturation: { sat } }).join(' ') },
111862
+ };
111863
+ }
111864
+ function tonePreset(kelvin) {
111865
+ const normal = kelvin === NEUTRAL_TEMPERATURE_K;
111866
+ return {
111867
+ id: normal ? 'toneNormal' : `tone${kelvin}`,
111868
+ labelKey: normal ? `${KEY$3}.toneNormal` : `${KEY$3}.tone`,
111869
+ ...(!normal && { labelParams: { kelvin } }),
111870
+ label: normal ? 'Temperature: 6500 K (Normal)' : `Temperature: ${kelvin} K`,
111871
+ changes: () => ({ colorTemperature: normal ? undefined : { colorTemp: kelvin } }),
111872
+ applied: (fx) => (fx.colorTemperature?.colorTemp ?? NEUTRAL_TEMPERATURE_K) === kelvin,
111873
+ preview: {
111874
+ css: getImageCorrectionsFilterTokens({ colorTemperature: { colorTemp: kelvin } }).join(' '),
111875
+ },
111876
+ };
111877
+ }
111878
+ const isWashout = (fx) => fx.lum?.bright === WASHOUT_LUM.bright && fx.lum?.contrast === WASHOUT_LUM.contrast;
111879
+ /** Every recolor field cleared, so a recolor pick replaces the previous one. */
111880
+ function recolorReset(fx) {
111881
+ return {
111882
+ grayscale: undefined,
111883
+ grayscaleRawXml: undefined,
111884
+ duotone: undefined,
111885
+ biLevel: undefined,
111886
+ biLevelRawXml: undefined,
111887
+ colorWash: undefined,
111888
+ ...(isWashout(fx) && { lum: undefined }),
111889
+ };
111890
+ }
111891
+ function duotonePreset(id, labelKey, label, colors, labelParams) {
111892
+ return {
111893
+ id,
111894
+ labelKey,
111895
+ ...(labelParams && { labelParams }),
111896
+ label,
111897
+ changes: (fx) => ({ ...recolorReset(fx), duotone: { ...colors } }),
111898
+ applied: (fx) => sameHex(fx.duotone?.color1, colors.color1) && sameHex(fx.duotone?.color2, colors.color2),
111899
+ preview: { duotone: [colors.color1, colors.color2] },
111900
+ };
111901
+ }
111902
+ function recolorPresets(themeColorMap) {
111903
+ const none = {
111904
+ id: 'recolorNone',
111905
+ labelKey: `${KEY$3}.recolorNone`,
111906
+ label: 'No Recolor',
111907
+ changes: recolorReset,
111908
+ applied: (fx) => !fx.grayscale && !fx.duotone && typeof fx.biLevel !== 'number' && !isWashout(fx),
111909
+ preview: {},
111910
+ };
111911
+ const grayscale = {
111912
+ id: 'recolorGrayscale',
111913
+ labelKey: `${KEY$3}.recolorGrayscale`,
111914
+ label: 'Grayscale',
111915
+ changes: (fx) => ({ ...recolorReset(fx), grayscale: true }),
111916
+ applied: (fx) => Boolean(fx.grayscale),
111917
+ preview: { css: 'grayscale(100%)' },
111918
+ };
111919
+ const washout = {
111920
+ id: 'recolorWashout',
111921
+ labelKey: `${KEY$3}.recolorWashout`,
111922
+ label: 'Washout',
111923
+ changes: (fx) => ({ ...recolorReset(fx), lum: { ...WASHOUT_LUM } }),
111924
+ applied: isWashout,
111925
+ preview: { css: 'brightness(1.7) contrast(0.3)' },
111926
+ };
111927
+ const biLevels = BI_LEVEL_THRESHOLDS.map((percent) => ({
111928
+ id: `recolorBlackWhite${percent}`,
111929
+ labelKey: `${KEY$3}.recolorBlackWhite`,
111930
+ labelParams: { amount: percent },
111931
+ label: `Black and White: ${percent}%`,
111932
+ changes: (fx) => ({ ...recolorReset(fx), biLevel: percent }),
111933
+ applied: (fx) => fx.biLevel === percent,
111934
+ preview: { threshold: percent },
111935
+ }));
111936
+ const accents = RECOLOR_ACCENTS.flatMap((slot, index) => {
111937
+ const hex = resolveAccentHex(themeColorMap, slot);
111938
+ const n = index + 1;
111939
+ return ['dark', 'light'].map((variant) => duotonePreset(`recolorAccent${n}${variant === 'dark' ? 'Dark' : 'Light'}`, `${KEY$3}.recolorAccent${variant === 'dark' ? 'Dark' : 'Light'}`, `Accent ${n}, ${variant === 'dark' ? 'Dark' : 'Light'}`, accentDuotone(hex, variant), { n }));
111940
+ });
111941
+ return [
111942
+ none,
111943
+ grayscale,
111944
+ duotonePreset('recolorSepia', `${KEY$3}.recolorSepia`, 'Sepia', { ...SEPIA_DUOTONE }),
111945
+ washout,
111946
+ ...biLevels,
111947
+ ...accents,
111948
+ ];
111949
+ }
111950
+ /** The Color gallery's sections; accent recolors follow the deck theme. */
111951
+ function pictureColorSections(ctx) {
111952
+ return [
111953
+ {
111954
+ id: 'saturation',
111955
+ titleKey: `${KEY$3}.saturationTitle`,
111956
+ title: 'Color Saturation',
111957
+ columns: 3,
111958
+ presets: SATURATION_PERCENTS.map(saturationPreset),
111959
+ },
111960
+ {
111961
+ id: 'tone',
111962
+ titleKey: `${KEY$3}.toneTitle`,
111963
+ title: 'Color Tone',
111964
+ columns: 3,
111965
+ presets: TEMPERATURES_K.map(tonePreset),
111966
+ },
111967
+ {
111968
+ id: 'recolor',
111969
+ titleKey: `${KEY$3}.recolorTitle`,
111970
+ title: 'Recolor',
111971
+ columns: 4,
111972
+ presets: recolorPresets(ctx.themeColorMap),
111973
+ },
111974
+ ];
111975
+ }
111976
+ const PICTURE_COLOR_GALLERY = adjustGalleryModule('pictureColor', `${KEY$3}.title`, 'Color', pictureColorSections);
111977
+
111978
+ /**
111979
+ * Picture Format > Adjust > Corrections: the Sharpen/Soften presets and
111980
+ * PowerPoint's 5x5 Brightness/Contrast grid (-40% .. +40%). Presets write the
111981
+ * a14 Corrections fields (`sharpenSoften`, `brightnessContrast`) core already
111982
+ * parses, renders and serialises. The neutral preset removes the field.
111983
+ *
111984
+ * @module render/ribbon-galleries/picture-corrections-gallery
111985
+ */
111986
+ const KEY$2 = 'pptx.gallery.pictureCorrections';
111987
+ function sharpenPreset(percent) {
111988
+ const amount = percent * 1000;
111989
+ const abs = Math.abs(percent);
111990
+ const id = percent < 0 ? `soften${abs}` : percent > 0 ? `sharpen${abs}` : 'sharpenNormal';
111991
+ const css = percent < 0
111992
+ ? getImageCorrectionsFilterTokens({ sharpenSoften: { amount } }).join(' ')
111993
+ : // A sharpen is an SVG convolution at render time; a contrast lift previews it.
111994
+ percent > 0
111995
+ ? `contrast(${1 + percent / 200})`
111996
+ : '';
111997
+ return {
111998
+ id,
111999
+ labelKey: percent === 0 ? `${KEY$2}.sharpenNormal` : `${KEY$2}.${percent < 0 ? 'soften' : 'sharpen'}`,
112000
+ ...(percent !== 0 && { labelParams: { amount: abs } }),
112001
+ label: percent === 0 ? 'Sharpen: 0% (Normal)' : `${percent < 0 ? 'Soften' : 'Sharpen'}: ${abs}%`,
112002
+ changes: () => ({ sharpenSoften: percent === 0 ? undefined : { amount } }),
112003
+ applied: (fx) => (fx.sharpenSoften?.amount ?? 0) === amount,
112004
+ preview: { css },
112005
+ };
112006
+ }
112007
+ function brightnessContrastPreset(brightness, contrast) {
112008
+ const bright = brightness * 1000;
112009
+ const cont = contrast * 1000;
112010
+ const normal = brightness === 0 && contrast === 0;
112011
+ return {
112012
+ id: normal ? 'bcNormal' : `bc_b${brightness}_c${contrast}`,
112013
+ labelKey: normal ? `${KEY$2}.brightnessContrastNormal` : `${KEY$2}.brightnessContrast`,
112014
+ ...(!normal && {
112015
+ labelParams: { brightness: signedPercent(brightness), contrast: signedPercent(contrast) },
112016
+ }),
112017
+ label: normal
112018
+ ? 'Brightness: 0% Contrast: 0% (Normal)'
112019
+ : `Brightness: ${signedPercent(brightness)}% Contrast: ${signedPercent(contrast)}%`,
112020
+ changes: () => ({
112021
+ brightnessContrast: normal
112022
+ ? undefined
112023
+ : { ...(bright !== 0 && { bright }), ...(cont !== 0 && { contrast: cont }) },
112024
+ }),
112025
+ applied: (fx) => (fx.brightnessContrast?.bright ?? 0) === bright &&
112026
+ (fx.brightnessContrast?.contrast ?? 0) === cont,
112027
+ preview: {
112028
+ css: getImageCorrectionsFilterTokens({
112029
+ brightnessContrast: { bright, contrast: cont },
112030
+ }).join(' '),
112031
+ },
112032
+ };
112033
+ }
112034
+ /** The Corrections gallery's sections. */
112035
+ function pictureCorrectionsSections() {
112036
+ return [
112037
+ {
112038
+ id: 'sharpenSoften',
112039
+ titleKey: `${KEY$2}.sharpenSoften`,
112040
+ title: 'Sharpen/Soften',
112041
+ columns: 5,
112042
+ presets: SHARPEN_SOFTEN_PERCENTS.map(sharpenPreset),
112043
+ },
112044
+ {
112045
+ id: 'brightnessContrast',
112046
+ titleKey: `${KEY$2}.brightnessContrastTitle`,
112047
+ title: 'Brightness/Contrast',
112048
+ columns: 5,
112049
+ presets: BRIGHTNESS_CONTRAST_STEPS.flatMap((brightness) => BRIGHTNESS_CONTRAST_STEPS.map((contrast) => brightnessContrastPreset(brightness, contrast))),
112050
+ },
112051
+ ];
112052
+ }
112053
+ const PICTURE_CORRECTIONS_GALLERY = adjustGalleryModule('pictureCorrections', `${KEY$2}.title`, 'Corrections', pictureCorrectionsSections);
112054
+
111025
112055
  /**
111026
112056
  * The Picture Styles tile: a small stock "photo" (sky, hill and sun) cut to
111027
112057
  * the style's geometry, framed, shadowed, reflected, soft-edged and tilted
@@ -114398,6 +115428,9 @@ const MODULES = {
114398
115428
  shapeEffects: SHAPE_EFFECTS_GALLERY,
114399
115429
  wordArtStyles: WORDART_STYLES_GALLERY,
114400
115430
  pictureStyles: PICTURE_STYLES_GALLERY,
115431
+ pictureCorrections: PICTURE_CORRECTIONS_GALLERY,
115432
+ pictureColor: PICTURE_COLOR_GALLERY,
115433
+ pictureArtisticEffects: PICTURE_ARTISTIC_EFFECTS_GALLERY,
114401
115434
  bullets: BULLETS_GALLERY,
114402
115435
  numbering: NUMBERING_GALLERY,
114403
115436
  tableStyles: TABLE_STYLES_GALLERY,
@@ -114449,6 +115482,24 @@ const CONTEXTUAL_TAB_GROUPS = {
114449
115482
  },
114450
115483
  ],
114451
115484
  pictureFormat: [
115485
+ {
115486
+ group: 'pictureFormat.adjust',
115487
+ labelKey: 'pptx.ribbon.groupAdjust',
115488
+ label: 'Adjust',
115489
+ galleries: [
115490
+ {
115491
+ gallery: 'pictureCorrections',
115492
+ control: 'pictureFormat.adjust.corrections',
115493
+ mode: 'dropdown',
115494
+ },
115495
+ { gallery: 'pictureColor', control: 'pictureFormat.adjust.color', mode: 'dropdown' },
115496
+ {
115497
+ gallery: 'pictureArtisticEffects',
115498
+ control: 'pictureFormat.adjust.artisticEffects',
115499
+ mode: 'dropdown',
115500
+ },
115501
+ ],
115502
+ },
114452
115503
  {
114453
115504
  group: 'pictureFormat.pictureStyles',
114454
115505
  labelKey: 'pptx.ribbon.groupPictureStyles',
@@ -117418,8 +118469,8 @@ function resetThreeRendererHostForTests() {
117418
118469
  }
117419
118470
 
117420
118471
  const loaders = {
117421
- chart: async () => (await import('./pptx-angular-viewer-chart-3d-view-scene-Cfk7dMVK.mjs')).mountChart3DView,
117422
- smartart: async () => (await import('./pptx-angular-viewer-view-scene-CNlGt3WC.mjs')).mountSmartArt3DView,
118472
+ chart: async () => (await import('./pptx-angular-viewer-chart-3d-view-scene-DWxceh6M.mjs')).mountChart3DView,
118473
+ smartart: async () => (await import('./pptx-angular-viewer-view-scene-BXmy-hp0.mjs')).mountSmartArt3DView,
117423
118474
  };
117424
118475
  /** Resolve the scene factory for a spec kind. */
117425
118476
  async function loadThreeViewScene(kind) {
@@ -127594,7 +128645,7 @@ function createLocalStorageBackend(namespace) {
127594
128645
  /** Try IndexedDB first; fall back to localStorage on any failure. */
127595
128646
  async function resolveBackend(dbName, namespace) {
127596
128647
  try {
127597
- const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-BnV3ANp_.mjs');
128648
+ const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-Dv60g0T7.mjs');
127598
128649
  const db = await openChatDb(dbName);
127599
128650
  return createIdbBackend(db);
127600
128651
  }
@@ -144698,6 +145749,19 @@ function deriveModel3DBlobUrl(element) {
144698
145749
  const model = element;
144699
145750
  return modelDataToBlobUrl(model.modelData, model.modelMimeType);
144700
145751
  }
145752
+ /**
145753
+ * Options handed to the shared `mountModel3D` controller: size, interactivity
145754
+ * and the element's authored camera/transform/lights (`scene`, `undefined`
145755
+ * keeps the default framing).
145756
+ */
145757
+ function buildModel3DMountOptions(element, interactive) {
145758
+ return {
145759
+ width: element.width,
145760
+ height: element.height,
145761
+ interactive,
145762
+ scene: element.type === 'model3d' ? element.scene : undefined,
145763
+ };
145764
+ }
144701
145765
 
144702
145766
  /**
144703
145767
  * Model3DRendererComponent: Angular Model3D renderer with interactive 3D.
@@ -144802,7 +145866,7 @@ class Model3DRendererComponent {
144802
145866
  if (this.mountedUrl === url && this.handle) {
144803
145867
  return;
144804
145868
  }
144805
- this.mount(fn, container, url, this.element().width, this.element().height);
145869
+ this.mount(fn, container, url);
144806
145870
  });
144807
145871
  // Push interactivity toggles to the live handle without re-mounting.
144808
145872
  effect(() => {
@@ -144835,12 +145899,12 @@ class Model3DRendererComponent {
144835
145899
  this.failed.set(true);
144836
145900
  }
144837
145901
  }
144838
- mount(fn, container, url, width, height) {
145902
+ mount(fn, container, url) {
144839
145903
  this.teardownHandle();
144840
- const interactive = this.interactive();
145904
+ const options = buildModel3DMountOptions(this.element(), this.interactive());
144841
145905
  const mountedUrl = url;
144842
145906
  this.mountedUrl = mountedUrl;
144843
- void fn(container, url, { width, height, interactive }).then((handle) => {
145907
+ void fn(container, url, options).then((handle) => {
144844
145908
  // A newer mount (or teardown) superseded this one while loading.
144845
145909
  if (this.mountedUrl !== mountedUrl) {
144846
145910
  handle.dispose();
@@ -145202,20 +146266,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
145202
146266
  function getSmartArtData(element) {
145203
146267
  return element.type === 'smartArt' ? element.smartArtData : undefined;
145204
146268
  }
145205
- /**
145206
- * Locate the topmost element bearing `data-smartart-node-id` in a
145207
- * `document.elementsFromPoint` result (which, unlike a plain hit-test,
145208
- * includes elements with `pointer-events: none` such as the invisible
145209
- * overlay's SVG nodes), or `null` when none does.
145210
- */
145211
- function findSmartArtNodeElementAtPoint(elements) {
145212
- for (const el of elements) {
145213
- if (el.hasAttribute('data-smartart-node-id')) {
145214
- return el;
145215
- }
145216
- }
145217
- return null;
145218
- }
145219
146269
  /** Position a node's bounding rect relative to its container, for the overlaid textarea. */
145220
146270
  function computeNode3DEditBox(nodeRect, containerRect) {
145221
146271
  return {
@@ -145319,22 +146369,26 @@ class SmartArt3DRendererComponent {
145319
146369
  });
145320
146370
  }
145321
146371
  /**
145322
- * Locate the SmartArt node at the click position using `elementsFromPoint`
145323
- * (which includes pointer-events:none SVG elements) and open the inline editor.
146372
+ * Locate the SmartArt node at the click position within the invisible
146373
+ * overlay and open the inline editor. The overlay's node groups are
146374
+ * `pointer-events: none`, which hit-testing (`document.elementsFromPoint`
146375
+ * included) skips, so the node is found by geometry
146376
+ * (`smartArtNodeAtPoint`).
145324
146377
  */
145325
146378
  onOverlayDblClick(event) {
145326
146379
  const container = this.containerEl()?.nativeElement;
145327
146380
  const data = this.smartArtData();
145328
- if (!container || !data) {
146381
+ const overlay = event.currentTarget;
146382
+ if (!container || !data || !(overlay instanceof Element)) {
145329
146383
  return;
145330
146384
  }
145331
- // elementsFromPoint includes pointer-events:none nodes, so this finds the
145332
- // <g data-smartart-node-id="..."> in the invisible overlay SVG.
145333
- const nodeEl = findSmartArtNodeElementAtPoint(document.elementsFromPoint(event.clientX, event.clientY));
146385
+ const nodeEl = smartArtNodeAtPoint(overlay, event.clientX, event.clientY);
145334
146386
  const nodeId = nodeEl?.getAttribute('data-smartart-node-id');
145335
146387
  if (!nodeEl || !nodeId) {
145336
146388
  return;
145337
146389
  }
146390
+ // The editor owns this double-click: the stage must not act on it too.
146391
+ event.stopPropagation();
145338
146392
  const currentText = data.nodes.find((n) => n.id === nodeId)?.text ?? '';
145339
146393
  this.draftText = currentText;
145340
146394
  this.editSettled = false;
@@ -168411,47 +169465,52 @@ const REPEAT_MODE_OPTIONS = [
168411
169465
  ];
168412
169466
  /** Direction options for directional presets (fly in/out, wipe). */
168413
169467
  const DIRECTION_OPTIONS = [
168414
- { value: 'fromTop', label: 'From Top', labelKey: 'pptx.animation.direction.fromTop', arrow: '↓' },
169468
+ {
169469
+ value: 'fromTop',
169470
+ label: 'From Top',
169471
+ labelKey: ANIMATION_DIRECTION_LABEL_KEYS.fromTop,
169472
+ arrow: '↓',
169473
+ },
168415
169474
  {
168416
169475
  value: 'fromBottom',
168417
169476
  label: 'From Bottom',
168418
- labelKey: 'pptx.animation.direction.fromBottom',
169477
+ labelKey: ANIMATION_DIRECTION_LABEL_KEYS.fromBottom,
168419
169478
  arrow: '↑',
168420
169479
  },
168421
169480
  {
168422
169481
  value: 'fromLeft',
168423
169482
  label: 'From Left',
168424
- labelKey: 'pptx.animation.direction.fromLeft',
169483
+ labelKey: ANIMATION_DIRECTION_LABEL_KEYS.fromLeft,
168425
169484
  arrow: '→',
168426
169485
  },
168427
169486
  {
168428
169487
  value: 'fromRight',
168429
169488
  label: 'From Right',
168430
- labelKey: 'pptx.animation.direction.fromRight',
169489
+ labelKey: ANIMATION_DIRECTION_LABEL_KEYS.fromRight,
168431
169490
  arrow: '←',
168432
169491
  },
168433
169492
  {
168434
169493
  value: 'fromTopLeft',
168435
169494
  label: 'From Top Left',
168436
- labelKey: 'pptx.animation.direction.fromTopLeft',
169495
+ labelKey: ANIMATION_DIRECTION_LABEL_KEYS.fromTopLeft,
168437
169496
  arrow: '↘',
168438
169497
  },
168439
169498
  {
168440
169499
  value: 'fromTopRight',
168441
169500
  label: 'From Top Right',
168442
- labelKey: 'pptx.animation.direction.fromTopRight',
169501
+ labelKey: ANIMATION_DIRECTION_LABEL_KEYS.fromTopRight,
168443
169502
  arrow: '↙',
168444
169503
  },
168445
169504
  {
168446
169505
  value: 'fromBottomLeft',
168447
169506
  label: 'From Bottom Left',
168448
- labelKey: 'pptx.animation.direction.fromBottomLeft',
169507
+ labelKey: ANIMATION_DIRECTION_LABEL_KEYS.fromBottomLeft,
168449
169508
  arrow: '↗',
168450
169509
  },
168451
169510
  {
168452
169511
  value: 'fromBottomRight',
168453
169512
  label: 'From Bottom Right',
168454
- labelKey: 'pptx.animation.direction.fromBottomRight',
169513
+ labelKey: ANIMATION_DIRECTION_LABEL_KEYS.fromBottomRight,
168455
169514
  arrow: '↖',
168456
169515
  },
168457
169516
  ];
@@ -173589,7 +174648,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
173589
174648
  }], 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 }] }] } });
173590
174649
 
173591
174650
  // Generated by scripts/inline-shared.mjs from package.json. Do not edit.
173592
- const PPTX_ANGULAR_VIEWER_VERSION = "4.10.1";
174651
+ const PPTX_ANGULAR_VIEWER_VERSION = "4.12.0";
173593
174652
 
173594
174653
  /**
173595
174654
  * account-page.component.ts: File > Account content.
@@ -211918,5 +212977,5 @@ function cn(...values) {
211918
212977
  * Generated bundle index. Do not edit.
211919
212978
  */
211920
212979
 
211921
- export { AiProposalCardComponent as $, smartArt3DEyeInDiagram as A, resolveSmartArt3DLightModel as B, AFTER_ANIMATION_VALUES as C, DEFAULT_PALETTE$1 as D, ALIGN_OPTIONS as E, ANIMATION_PRESET_CATEGORIES as F, AUDIENCE_HASH as G, AUDIENCE_NONCE_KEY as H, AVATAR_COLOR_SWATCHES as I, AXIS_LABEL_COLOR as J, AccessibilityPanelComponent as K, AccessibilityService as L, AccessibilityTextPanelComponent as M, NO_THREE_VIEW_OVERFLOW as N, AccountPageComponent as O, ActionSettingsPanelComponent as P, AdvancedChartEditorComponent as Q, AiChangeOverlayComponent as R, AiChatPanelComponent as S, AiChatService as T, AiComposerComponent as U, AiFocusBarComponent as V, AiFocusHighlightOverlayComponent as W, AiHistoryMenuComponent as X, AiHistoryService as Y, AiMessageListComponent as Z, AiPanelStore as _, appendChartLegendSvg as a, ELEMENT_CONTEXT_MENU_COMMAND_IDS as a$, AiSettingsSectionComponent as a0, AiToolCallCardComponent as a1, AnimationAuthorPanelComponent as a2, AnimationPanelComponent as a3, AnimationPlaybackService as a4, AutosaveRecoveryDialogComponent as a5, AutosaveService as a6, BACKSTAGE_CARD_IDS as a7, BACKSTAGE_PAGE_IDS as a8, BroadcastDialogComponent as a9, CommentsService as aA, ComparePanelComponent as aB, ConnectorRendererComponent as aC, ConnectorTextOverlayComponent as aD, CustomShowsComponent as aE, DEFAULT_BOUNDS as aF, DEFAULT_BROADCAST_SERVER_URL as aG, DEFAULT_CANVAS_HEIGHT as aH, DEFAULT_CANVAS_WIDTH as aI, DEFAULT_COLOR_SCHEME as aJ, DEFAULT_FILL_COLOR$1 as aK, DEFAULT_LAYOUT as aL, DEFAULT_MORPH_DURATION_MS as aM, DEFAULT_PATTERN_FILL_PRESET as aN, DEFAULT_PRINT_SETTINGS as aO, DEFAULT_SLIDE_BACKGROUND as aP, DEFAULT_STROKE_COLOR as aQ, DEFAULT_STYLE as aR, DEFAULT_TABLE_ROW_HEIGHT as aS, DEFAULT_TEXT_COLOR$2 as aT, DEFAULT_VIEWER_PROFILE as aU, DIRECTIONAL_PRESETS as aV, DIRECTION_OPTIONS as aW, DocumentPropertiesCardComponent as aX, EASE as aY, EDITOR_SHORTCUT_ACTION_IDS as aZ, EFFECT_SOUND_CATALOGUE as a_, CANVAS_CONTEXT_MENU_COMMAND_IDS as aa, CHART_EDITOR_STYLES as ab, CINEMATIC_TRANSITION_KEYFRAMES as ac, CURSOR_PALETTE as ad, CanvasFitService as ae, ChartAxisOptionsComponent as af, ChartAxisStyleOptionsComponent as ag, ChartComboTypeOptionsComponent as ah, ChartDataEditorComponent as ai, ChartDataLabelOptionsComponent as aj, ChartDatapointMarkerOptionsComponent as ak, ChartDatapointOptionsComponent as al, ChartDisplayOptionsComponent as am, ChartElementViewComponent as an, ChartErrorBarOptionsComponent as ao, ChartMarkerOptionsComponent as ap, ChartPartSelectionService as aq, ChartPrimitivesComponent as ar, ChartRendererComponent as as, ChartTrendlineOptionsComponent as at, ChartTypeSelectorComponent as au, CollaborationCursorsComponent as av, CollaborationService as aw, ColorChangedImageComponent as ax, CommentMarkersOverlayComponent as ay, CommentsPanelComponent as az, renderChartTextSvg as b, NotesToolbarComponent as b$, EMBEDDED_FONTS_STYLE_ID as b0, EMPHASIS_PRESETS as b1, ENTRANCE_PRESETS as b2, TEMPLATES as b3, EXIT_PRESETS as b4, EditorContextMenuComponent as b5, EditorHistory as b6, EditorStateService as b7, EditorToolbarComponent as b8, EffectsPanelComponent as b9, InsertSmartArtDialogComponent as bA, InspectorPaneHeaderComponent as bB, InspectorPanelComponent as bC, IsMobileService as bD, KeepAnnotationsDialogComponent as bE, LOCALE_CATALOG as bF, LONG_PRESS_DURATION_MS as bG, LONG_PRESS_MOVE_TOLERANCE_PX as bH, LoadContentService as bI, LocalPresencePublisher as bJ, MAX_ZOOM_SCALE as bK, MIN_ZOOM_SCALE as bL, MOTION_PATH_COLUMNS as bM, MediaPreviewComponent as bN, MediaPropertiesPanelComponent as bO, MediaRendererComponent as bP, MediaTrimTimelineComponent as bQ, MobileBottomBarComponent as bR, MobileMenuSheetComponent as bS, MobilePresenterViewComponent as bT, MobileSheetComponent as bU, MobileSlidesSheetComponent as bV, MobileToolbarComponent as bW, ModalDialogComponent as bX, Model3DRendererComponent as bY, NotesHandoutCardComponent as bZ, NotesPanelComponent as b_, ElementRendererComponent as ba, EmbeddedFontsService as bb, EncryptedFileDialogComponent as bc, EquationEditorDialogComponent as bd, EquationRendererComponent as be, EquationTemplateGalleryComponent as bf, ExportProgressModalComponent as bg, ExportService as bh, FieldContextService as bi, FindBarComponent as bj, FindReplaceBarComponent as bk, FollowModeBarComponent as bl, FontEmbeddingListComponent as bm, FontEmbeddingPanelComponent as bn, GALLERY_THEME_PRESETS as bo, GOOGLE_WEBFONTS_LINK_ID as bp, GRIDLINE_COLOR$1 as bq, GoogleWebfontsService as br, GradientPickerComponent as bs, HANDOUT_OPTIONS as bt, HeaderFooterDialogComponent as bu, HyperlinkDialogComponent as bv, INSTANT as bw, ImagePropertiesPanelComponent as bx, InkDrawingService as by, InkRendererComponent as bz, createSvgEl as c, RibbonSlideshowSectionComponent as c$, OPTIONS_PAGE_IDS as c0, OPTIONS_SECTION_IDS as c1, OPTIONS_SETTING_IDS as c2, OleRendererComponent as c3, OutlineViewOverlayComponent as c4, P14_TRANSITION_KEYFRAMES as c5, P14_TRANSITION_KEYFRAMES_2 as c6, P14_TRANSITION_KEYFRAMES_ALL as c7, POWER_POINT_VIEWER_PROVIDERS as c8, PPTX_OPEN_ACCEPT as c9, RESIZE_HANDLES as cA, RIBBON_TAB_IDS as cB, RULER_FONT_SIZE as cC, RULER_THICKNESS as cD, ReadingViewOverlayComponent as cE, RemoteSelectionOverlayComponent as cF, Rendering3DService as cG, RibbonAnimationGalleryComponent as cH, RibbonAnimationsSectionComponent as cI, RibbonArrangeSectionComponent as cJ, RibbonColorPopoverComponent as cK, RibbonComponent as cL, RibbonDesignSectionComponent as cM, RibbonDrawSectionComponent as cN, RibbonDrawingGroupComponent as cO, RibbonEditingSectionComponent as cP, RibbonFileSectionComponent as cQ, RibbonFontControlsComponent as cR, RibbonHomeSectionComponent as cS, RibbonHyperlinkButtonComponent as cT, RibbonInsertFieldsComponent as cU, RibbonInsertSectionComponent as cV, RibbonMotionPathGalleryComponent as cW, RibbonParagraphControlsComponent as cX, RibbonPrimaryRowComponent as cY, RibbonReviewSectionComponent as cZ, RibbonShapeExtrasComponent as c_, PRESENTATION_OPEN_EXTENSIONS as ca, PRESENTER_CHANNEL_NAME as cb, PRESENTER_MSG_ORIGIN as cc, PRESENTER_TIMER_SEGMENT_MS as cd, PX_PER_CM as ce, PX_PER_INCH as cf, PasswordProtectionDialogComponent as cg, PasswordStrengthMeterComponent as ch, PowerPointViewerComponent as ci, PresentToolbarAutoHide as cj, PresentationAnnotationOverlayComponent as ck, PresentationAnnotationsService as cl, PresentationOverlayComponent as cm, PresentationPropertiesPanelComponent as cn, PresentationSettingsCardComponent as co, PresentationSubtitleBarComponent as cp, PresentationToolbarComponent as cq, PresentationTransitionOverlayComponent as cr, PresenterViewComponent as cs, PresenterWindowService as ct, PrintDialogComponent as cu, PrintService as cv, PrintSettingsPanelComponent as cw, PropertiesDialogComponent as cx, RANDOM_ELIGIBLE_TYPES as cy, REPEAT_MODE_OPTIONS as cz, buildBarChart3DHoverTooltip as d, TableSelectionService as d$, RibbonTransitionsSectionComponent as d0, RibbonViewSectionComponent as d1, RulerGuidesService as d2, SEQUENCE_OPTIONS as d3, SEVERITY_GROUPS as d4, SEVERITY_LABELS as d5, DEFAULT_TRANSITION_DURATION_MS$1 as d6, SHORTCUT_REFERENCE_ITEMS as d7, SLIDE_TRANSITION_KEYFRAMES as d8, SLIDE_TRANSITION_KEYFRAMES_CSS as d9, SlideDiffThumbnailsComponent as dA, SlideSizeCardComponent as dB, SlideSorterOverlayComponent as dC, SlideThemeOverridePanelComponent as dD, SlideTransitionCardComponent as dE, SlidesPanelComponent as dF, SmartArt3DRendererComponent as dG, SmartArtPreviewComponent as dH, SmartArtPropertiesComponent as dI, SmartArtRendererComponent as dJ, StatusBarComponent as dK, TABLE_STRUCTURE_TOGGLES as dL, TEXT_3D_BOTTOM_BEVEL_KEYS as dM, TEXT_3D_TOP_BEVEL_KEYS as dN, TEXT_DIRECTION_OPTIONS$1 as dO, THEME_CATALOG as dP, TIMING_CURVE_OPTIONS as dQ, TOOLBAR_BUTTON_IDS as dR, TRANSITION_SPEED_DURATION_MS as dS, TRIGGER_OPTIONS as dT, TYPE_LABELS as dU, TableCellAdvancedFillComponent as dV, TableCellFormattingComponent as dW, TableDataEditorComponent as dX, TablePropertiesComponent as dY, TableRendererComponent as dZ, TableResizeOverlayComponent as d_, DEFAULT_PALETTE as da, PALETTES as db, SMART_ART_COLOR_SCHEMES as dc, SMART_ART_STYLE_OPTIONS as dd, SUB_ITEM_LABEL as de, SVG_WARP_PRESETS as df, SWIPE_MAX_VERTICAL_PX as dg, SWIPE_THRESHOLD_PX as dh, SelectionPaneComponent as di, SetUpSlideShowDialogComponent as dj, SettingsAppearanceTabComponent as dk, SettingsDialogComponent as dl, SettingsLanguageTabComponent as dm, ShareDialogComponent as dn, ShortcutPanelComponent as dp, ShowOptionsFieldsetComponent as dq, ShowSlidesFieldsetComponent as dr, SignatureStrippedDialogComponent as ds, SignaturesPanelComponent as dt, SignaturesService as du, SlideBackgroundCardComponent as dv, SlideCanvasComponent as dw, SlideDefaultInspectorComponent as dx, SlideDiffChangesComponent as dy, SlideDiffRowComponent as dz, roundDragValue as e, applyFormatToElement as e$, TagsCardComponent as e0, Text3DBevelSectionComponent as e1, Text3DPanelComponent as e2, TextAdvancedPanelComponent as e3, ThemeEditorFieldsComponent as e4, ThemeGalleryComponent as e5, ThemeSelectorCardComponent as e6, TitleBarComponent as e7, TitleBarSearchComponent as e8, TransitionDirectionPickerComponent as e9, ViewerPresentationModeService as eA, ViewerThemeGalleryService as eB, ViewerTouchGesturesService as eC, ViewerZoomService as eD, WEBM_MIME_CANDIDATES as eE, WHEEL_SPOKE_COUNTS as eF, WriteBackScheduler as eG, ZERO_LINE_COLOR as eH, ZoomNavigationService as eI, ZoomRendererComponent as eJ, ZoomTargetService as eK, addCategory as eL, addCommentToList as eM, addGradientStopPatch as eN, addItem as eO, addSeries as eP, addSubItem as eQ, advanceStep as eR, affordanceElements as eS, aiToggleVisible as eT, alignPatch as eU, animationFor as eV, animationPresetLabelKey as eW, annotationMapToInkInserts as eX, applyAcceptedDiff as eY, applyAnimationPreset as eZ, applyFindReplacements as e_, TransitionPreviewComponent as ea, VALIGN_OPTIONS as eb, VIEWER_DIALOG_IDS as ec, VIEWER_EXPORT_FORMAT_IDS as ed, VIEWER_FEATURE_IDS as ee, VIEWER_PANEL_IDS as ef, VIEWER_THEME as eg, VersionHistoryPanelComponent as eh, ViewerCanvasEditingService as ei, ViewerCollabCursorService as ej, ViewerCollaborationSessionService as ek, ViewerCollaborationShellService as el, ViewerCompareService as em, ViewerCustomShowsService as en, ViewerCustomizationHandle as eo, ViewerCustomizationService as ep, ViewerDialogsService as eq, ViewerDocumentPropertiesService as er, ViewerExportService as es, ViewerExtraDialogsComponent as et, ViewerFileIOService as eu, ViewerFindReplaceService as ev, ViewerFormatPainterService as ew, ViewerInspectorPanelService as ex, ViewerKeyboardService as ey, ViewerMobileSheetService as ez, buildPerspCamera as f, buildZeroLine as f$, applyMove as f0, applyResize as f1, asMediaElement as f2, assignUserColor as f3, attachShowVisibilityPause as f4, attachTouchGestures as f5, axisTickValues as f6, beginDrawingNodeEdit as f7, beginNodeEdit as f8, bevelSizePatch as f9, buildGridlinesAndLabels as fA, buildHyperlinkPatch as fB, buildInkContainerStyle as fC, buildInkStrokes as fD, buildLegend as fE, buildLiveInkStrokeView as fF, buildMarkTooltip as fG, buildModel3DContainerStyle as fH, buildModel3DViewModel as fI, buildOleActionModel as fJ, buildOleInfoRows as fK, buildPatternFillCss as fL, buildPieViewModel as fM, buildPrintHtmlDocument as fN, buildPropertiesPatch as fO, buildRadarViewModel as fP, buildRegionMapViewModel as fQ, buildSaveSlides as fR, buildShareUrl as fS, buildSmartArtInsertElement as fT, buildSmartArtNodes as fU, buildStockViewModel as fV, buildSurfaceViewModel as fW, buildTableViewModel as fX, buildTreemapViewModel as fY, buildTrimFragment as fZ, buildWaterfallViewModel as f_, boolFromEvent as fa, bringForward as fb, bringToFront as fc, buildBarActions as fd, buildBroadcastConfig as fe, buildBroadcastViewerUrl as ff, buildCategoryLabels as fg, buildCellParagraphs as fh, buildChartViewModel as fi, buildChatLogExport as fj, buildChatLogMarkdown as fk, buildChromeStyle as fl, buildClearHyperlinkPatch as fm, buildClickGroups as fn, buildColStyles as fo, buildCollaborationConfig as fp, buildComboViewModel as fq, buildCssGradientFromShapeStyle as fr, buildDuotoneFilter as fs, buildDuotoneFilterId as ft, buildEmbeddedFontStyles as fu, buildEquationElement as fv, buildEquationSegment as fw, buildFallbackViewModel as fx, buildFontFaceRule as fy, buildGradientFillCss as fz, perspToScreen as g, computeScatterXDomain as g$, buildZoomContainerStyle as g0, buildZoomViewModel as g1, bulletIndentPx as g2, canAddTopLevelNode as g3, canEditSmartArtNodes as g4, canGroupSelection as g5, canRemoveTopLevelNode as g6, canSetStrokeWidth as g7, canStartBroadcast as g8, canStartShare as g9, commitNodeText as gA, computeAlign as gB, computeAxisTitlePrimitives as gC, computeBarRects as gD, computeBubbleRadius as gE, computeCornerHandle as gF, computeDistribute as gG, computeDrawingViewBox as gH, computeErrorBarPrimitives as gI, computeFocusTargets as gJ, computeGridSpacingPx as gK, computeHandleBoxes as gL, computeHandoutLayout as gM, computeIsMobile as gN, computeIsTablet as gO, computeLinePoints as gP, computeLinearRegression as gQ, computePageCount as gR, computePieLayout as gS, computePieSlicePath as gT, computePieSlices as gU, computePlotLayout as gV, computeRSquared as gW, computeRadarPoints as gX, computeResizeHandleBoxes as gY, computeRotateHandleBox as gZ, computeScatterDots as g_, canUngroupSelection as ga, canUseClipboard as gb, captionDisplayText as gc, cellRunStyle as gd, cellStyleToStyleMap as ge, cellTdStyle as gf, changeCountLabel as gg, changeIcon as gh, characterSpacingPatch as gi, chartPreserveAspectRatio as gj, checkFontAvailable as gk, clampCursorPosition as gl, clampGifDimensions as gm, clampIndex as gn, clampNotesFontSize as go, clampScale as gp, clampStep as gq, clearAllLocalViewerData as gr, clearAudienceContent as gs, cn as gt, collectAccessibilityIssues as gu, collectElementText as gv, collectSlideText as gw, collectStoredChats as gx, collectUsedFontFamilies as gy, columnWidthStyle as gz, pieRimPoint as h, forgetSessionDeck as h$, computeSelectionBoxes as h0, computeSingleSelected as h1, computeSlideIndices as h2, computeSnap as h3, computeStackedBarRects as h4, computeStackedValueRange as h5, computeTrendlinePrimitives as h6, computeValueRange as h7, convertOmmlToMathMl as h8, copyFormatFromElement as h9, disableReflectionPatch as hA, disableSoftEdgePatch as hB, duplicateElementById as hC, durationOf as hD, effectsStateOf as hE, enableGlowPatch as hF, enableInnerShadowPatch as hG, enableOuterShadowPatch as hH, enableReflectionPatch as hI, enableSoftEdgePatch as hJ, encodeGif as hK, endShowMediaCleanup as hL, estimatePageCount as hM, exitPresentationFullscreen as hN, exportAiChatLogs as hO, extractPathPoints as hP, eyedropperAvailable as hQ, fillColorOf$1 as hR, findInSlides as hS, findOwningSlideIndex as hT, findSlideIndexByElementId as hU, firstVisibleIndex as hV, fitPolynomial as hW, fitZoom as hX, focusTargetChips as hY, fontMimeForFormat as hZ, fontSizeOf as h_, countAccessibilityIssues as ha, countAnnotationStrokes as hb, createAngularAiBridge as hc, createCustomShow as hd, createImageElementFromFile as he, createSwipeDismissDrag as hf, createWebrtcBundle as hg, createWebsocketBundle as hh, cssObjectToStyleMap as hi, currentColorScheme as hj, currentLayout as hk, currentStyle as hl, defaultCssVars as hm, defaultRadius as hn, defaultThemeColors as ho, deleteElementsByIds as hp, deleteVersion as hq, demoteNode as hr, deriveModel3DBlobUrl as hs, derivePresenceList as ht, describeCollaborationShellState as hu, describeSmartArtBounds as hv, directionPickerState as hw, disableGlowPatch as hx, disableInnerShadowPatch as hy, disableOuterShadowPatch as hz, isChartInteractionArmed as i, injectResolvedCustomization as i$, formatAxisValue as i0, formatBytes as i1, formatCursorLabel as i2, formatElapsed as i3, formatFileSize as i4, formatInlineListStyle as i5, formatPropertyDate as i6, formatTime as i7, fpsToFrameIntervalMs as i8, generateBroadcastRoomId as i9, getResolvedShapeClipPathFor as iA, getSessionTabId as iB, getShapeFillStrokeStyle as iC, getSlideBackgroundStyle as iD, getSlideTransitionAnimations as iE, getSmartArtNodeBounds as iF, getSpeechRecognitionCtor as iG, getTextBlockStyle as iH, getTextWarp as iI, getTouchDistance as iJ, getWarpCategory as iK, getWarpPath as iL, gradientStateFromStyle as iM, gradientStateOf as iN, gradientStatePatch as iO, gradientStopColorCommitPatch as iP, gridColumns as iQ, groupIssuesBySeverity as iR, hasAnimation as iS, hasCopyableFormat as iT, hasExistingLink as iU, hasExitedFullscreen as iV, hasGradientFill as iW, hasPressureVariation as iX, hasVisibleSlideAfter as iY, headerLabel as iZ, imageDimensions as i_, generateCommentId as ia, generateCustomShowId as ib, generatePressureCircles as ic, generateTicks as id, getCinematicTransitionAnimations as ie, getClrChangeParams as ig, getContainerStyle as ih, getDuotoneFilterDef as ii, getEffectSoundAsset as ij, getEffectSoundState as ik, getImageSrc as il, getLocalStorageUsageSummary as im, getOleAriaLabel as io, getOleBadgeLabel as ip, getOleDisplayName as iq, getOleDownloadFileName as ir, getOleTypeColor as is, getOleTypeLabel as it, getP14TransitionAnimations as iu, getPasswordStrength as iv, getPatternSvg as iw, getPlaceholderStyle as ix, getVersions as iy, getResolvedShapeClipPath as iz, computePieChartLayout as j, normalizeFontFormat as j$, inkViewBox as j0, insertTableElementColumn as j1, insertTableElementRow as j2, interpolateWidth as j3, isAudienceTab as j4, isBold as j5, isBrowserOpenableMime as j6, isChildNode as j7, isElementInteractive as j8, isInjectableUrl as j9, mergeCaptionResults as jA, mergeDown as jB, mergeRight as jC, mergeSelection as jD, mergeTablesDirective as jE, moveElementBy as jF, moveNodeDown as jG, moveNodeUp as jH, msToFrameDelayCs as jI, narrowToCircle as jJ, narrowToPolygon as jK, narrowToRect as jL, newChartElement as jM, newEquationElement as jN, newPresetShapeElement as jO, newShapeElement as jP, newSmartArtElement as jQ, newTableElement as jR, newTextElement as jS, nextVisibleIndex as jT, nodeBold as jU, nodeEditBox as jV, nodeFillColor as jW, nodeFontColor as jX, nodeIdFromKey as jY, nodeItalic as jZ, nodeStyle as j_, isItalic as ja, isLegacyBinaryPresentation as jb, isPpactionUrl as jc, isPresenterMessage as jd, isSigned as je, isSupportedPresentationFile as jf, isTextElement as jg, isTwoTableFocus as jh, isUnderline as ji, isUrlSafe as jj, isValidRoomId as jk, isViewportBackgroundPressTarget as jl, isZoomActivationKey as jm, issueTrackKey as jn, issueTypeLabel as jo, keyToLabel as jp, lastVisibleIndex as jq, latexToMathml as jr, layoutConnectorPaints as js, layoutNodeLabels as jt, linePointsToSvgString as ju, lineSpacingPatch as jv, loadAudienceContent as jw, loadSessionDeck as jx, mediaFallbackFor as jy, mediaSurfaceFor as jz, perspScreenToPlaneY as k, resolveHyperlinkHref as k$, normalizeSlidesPerPage as k0, normalizeValue as k1, numFromEvent as k2, oleActionsVisibleFor as k3, ommlToMathml as k4, ooxmlDashToCssBorderStyle as k5, openNativeEyeDropper as k6, overallStatus as k7, paletteColor as k8, parseAudienceNonce as k9, radarAngle as kA, radarRingPoints as kB, readAsDataUrl as kC, recordWebm as kD, registerCrossSlideAudio as kE, rememberSessionDeck as kF, removeAnimation as kG, removeCategory as kH, removeTableElementColumn as kI, removeCommentFromList as kJ, removeElementAnimation as kK, removeGradientStopPatch as kL, removeNode as kM, removeTableElementRow as kN, removeSeries as kO, renderToCanvas as kP, reorderAnimationDown as kQ, reorderAnimationUp as kR, replaceInSlides as kS, replaceMatch as kT, requestPresentationFullscreen as kU, resizeElement as kV, resolveCaptionTracks as kW, resolveChartKind as kX, resolveDirection as kY, resolveDirection8 as kZ, resolveFontVariant as k_, parseNodeTextarea as ka, partitionSlides as kb, patchChartData as kc, patchChartStyle as kd, patchTableData as ke, patchTextStyle as kf, patternPresetOptions as kg, pendingElementStyles as kh, pickColorByClickFallback as ki, pickFile as kj, pickSupportedMimeType as kk, planGifFrames as kl, planVideoSegments as km, pointFromPointerEvent as kn, pointsToSvgPathD as ko, presenceToCursors as kp, presentationBaseName as kq, presentationStageStyle as kr, presenterTimerProgress as ks, presetByLayout as kt, presetsForCategory as ku, pressuresToWidths as kv, prevVisibleIndex as kw, projectDrawingShapes as kx, promoteNode as ky, provideViewerTheme as kz, resolvePieSliceShareValue as l, setEffectSound as l$, resolveInteractiveElementId as l0, resolveLegendAnchorPosition as l1, resolveMediaSrc as l2, resolveOleType as l3, resolveOrientation as l4, resolveParagraphBullet as l5, resolvePresenterNotes as l6, resolveProfileInitial as l7, resolveRegionCode as l8, resolveRibbonCanGroup as l9, segmentFrameCount as lA, selectValue$3 as lB, sendBackward as lC, sendToBack as lD, sequentialColorScale as lE, serializeWriteBack as lF, seriesColor as lG, seriesXValues as lH, setAfterAnimation as lI, setAfterAnimationColor as lJ, setAnimationEmphasis as lK, setAnimationEntrance as lL, setAnimationExit as lM, setAxis as lN, setAxisLogScale as lO, setAxisTitleStyle as lP, setCategoryLabel as lQ, setCellText as lR, setColorScheme as lS, setDataLabels as lT, setDataPointExplosion as lU, setDataPointFill as lV, setDataPointLabel as lW, setDataPointMarker as lX, setDelay as lY, setDirection as lZ, setDuration as l_, resolveSlideAutoAdvanceMs as la, resolveSlideTransition as lb, resolvePalette as lc, resolveThemeCatalogEntry as ld, resolveTransitionDuration as le, resolveTransitionDurationMs as lf, resolveWheelSpokeCount as lg, restoreSessionDeck as lh, revealedElementStyles as li, routeOrthogonalConnector as lj, rowStyle as lk, rulerDragToGuidePosition as ll, rulerHighlight as lm, rulerStripTicks as ln, sampleColorFromSlide as lo, sanitizeColor as lp, sanitizeSlideIndex as lq, sanitizeUserName as lr, saveViewerProfile as ls, savedPresentationFileName as lt, scanAvailableFonts as lu, searchSlides as lv, seedBroadcastFields as lw, seedHyperlinkDraft as lx, seedPropertiesDraft as ly, seedShareFields as lz, hexToRgb as m, toggleNodeItalic as m$, setEffectStockSound as m0, setElementPosition as m1, setGridlineStyle as m2, setLayout as m3, setLegend as m4, setNodeStyle as m5, setNodeText as m6, setRepeatCount as m7, setRepeatMode as m8, setSequence as m9, paletteColour as mA, snapToGridStep as mB, splitCursorCell as mC, splitMergedCell as mD, statusKind as mE, statusLabel$1 as mF, storeAudienceContent as mG, stringFromEvent$5 as mH, strokeColorOf as mI, strokeToInkElement as mJ, strokeWidthOf as mK, styleShadowFilter as mL, surfaceColor as mM, textAdvancedPatch as mN, textAdvancedStateFromStyle as mO, textAdvancedStateOf as mP, textColorOf as mQ, textDirectionPatch as mR, textFontSizePatch as mS, textStyleOf as mT, textStylePatch as mU, themeStyle as mV, themeToCssVars as mW, thumbnailHeight as mX, thumbnailZoom as mY, toggleCommentResolvedInList as mZ, toggleNodeBold as m_, setSeriesChartType as ma, setSeriesColor as mb, setSeriesErrorBars as mc, setSeriesMarker as md, setSeriesName as me, setSeriesTrendline as mf, setSeriesValue as mg, setStyle as mh, setTimingCurve as mi, setTitle as mj, setTrigger as mk, setTriggerShapeId as ml, shapeStylePatch$1 as mm, sheetAfterNavigate as mn, shouldBlockClickAdvance as mo, shouldUseSvgWarp as mp, showDirectionPicker as mq, showsTemplateAffordance as mr, signatureCountLabel as ms, signatureKey as mt, signatureTimestamp as mu, signerName as mv, statusLabel as mw, slideNumberOf as mx, slidesWithReappliedLayout as my, smartArtNodes as mz, smartArt3DGradientColor as n, toggleSheet as n0, topLevelNodeCount as n1, transformSelectedTextCase as n2, translationsEn as n3, updateElementById as n4, updateGlowPatch as n5, updateGradientStopPatch as n6, updateInnerShadowPatch as n7, updateOuterShadowPatch as n8, updateReflectionPatch as n9, vAlignPatch as na, validatePassword as nb, validatePrintSettings as nc, validateRoomId as nd, valueToY as ne, vermilionDarkColors as nf, vermilionDarkTheme as ng, vermilionLightColors as nh, vermilionLightTheme as ni, vermilionRadius as nj, waypointsToPathD as nk, withManualLayouts as nl, worstStatus as nm, zoomTargetSlideIndex as nn, obliqueBarTaper as o, perspBoxMatrix as p, shadeSmartArt3DVertices as q, renderChartLineSvg as r, shade as s, toChatSummary as t, smartArt3DGradientCoordinate as u, threeViewOverflowFromNdc as v, widenPieViewModel as w, hasThreeViewOverflow as x, overflowViewOffset as y, smartArt3DCameraMatrix as z };
211922
- //# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-Dy62s3Dt.mjs.map
212980
+ export { AiProposalCardComponent as $, smartArt3DEyeInDiagram as A, resolveSmartArt3DLightModel as B, AFTER_ANIMATION_VALUES as C, DEFAULT_PALETTE$1 as D, ALIGN_OPTIONS as E, ANIMATION_PRESET_CATEGORIES as F, AUDIENCE_HASH as G, AUDIENCE_NONCE_KEY as H, AVATAR_COLOR_SWATCHES as I, AXIS_LABEL_COLOR as J, AccessibilityPanelComponent as K, AccessibilityService as L, AccessibilityTextPanelComponent as M, NO_THREE_VIEW_OVERFLOW as N, AccountPageComponent as O, ActionSettingsPanelComponent as P, AdvancedChartEditorComponent as Q, AiChangeOverlayComponent as R, AiChatPanelComponent as S, AiChatService as T, AiComposerComponent as U, AiFocusBarComponent as V, AiFocusHighlightOverlayComponent as W, AiHistoryMenuComponent as X, AiHistoryService as Y, AiMessageListComponent as Z, AiPanelStore as _, appendChartLegendSvg as a, ELEMENT_CONTEXT_MENU_COMMAND_IDS as a$, AiSettingsSectionComponent as a0, AiToolCallCardComponent as a1, AnimationAuthorPanelComponent as a2, AnimationPanelComponent as a3, AnimationPlaybackService as a4, AutosaveRecoveryDialogComponent as a5, AutosaveService as a6, BACKSTAGE_CARD_IDS as a7, BACKSTAGE_PAGE_IDS as a8, BroadcastDialogComponent as a9, CommentsService as aA, ComparePanelComponent as aB, ConnectorRendererComponent as aC, ConnectorTextOverlayComponent as aD, CustomShowsComponent as aE, DEFAULT_BOUNDS as aF, DEFAULT_BROADCAST_SERVER_URL as aG, DEFAULT_CANVAS_HEIGHT as aH, DEFAULT_CANVAS_WIDTH as aI, DEFAULT_COLOR_SCHEME as aJ, DEFAULT_FILL_COLOR$1 as aK, DEFAULT_LAYOUT as aL, DEFAULT_MORPH_DURATION_MS as aM, DEFAULT_PATTERN_FILL_PRESET as aN, DEFAULT_PRINT_SETTINGS as aO, DEFAULT_SLIDE_BACKGROUND as aP, DEFAULT_STROKE_COLOR as aQ, DEFAULT_STYLE as aR, DEFAULT_TABLE_ROW_HEIGHT as aS, DEFAULT_TEXT_COLOR$2 as aT, DEFAULT_VIEWER_PROFILE as aU, DIRECTIONAL_PRESETS as aV, DIRECTION_OPTIONS as aW, DocumentPropertiesCardComponent as aX, EASE as aY, EDITOR_SHORTCUT_ACTION_IDS as aZ, EFFECT_SOUND_CATALOGUE as a_, CANVAS_CONTEXT_MENU_COMMAND_IDS as aa, CHART_EDITOR_STYLES as ab, CINEMATIC_TRANSITION_KEYFRAMES as ac, CURSOR_PALETTE as ad, CanvasFitService as ae, ChartAxisOptionsComponent as af, ChartAxisStyleOptionsComponent as ag, ChartComboTypeOptionsComponent as ah, ChartDataEditorComponent as ai, ChartDataLabelOptionsComponent as aj, ChartDatapointMarkerOptionsComponent as ak, ChartDatapointOptionsComponent as al, ChartDisplayOptionsComponent as am, ChartElementViewComponent as an, ChartErrorBarOptionsComponent as ao, ChartMarkerOptionsComponent as ap, ChartPartSelectionService as aq, ChartPrimitivesComponent as ar, ChartRendererComponent as as, ChartTrendlineOptionsComponent as at, ChartTypeSelectorComponent as au, CollaborationCursorsComponent as av, CollaborationService as aw, ColorChangedImageComponent as ax, CommentMarkersOverlayComponent as ay, CommentsPanelComponent as az, renderChartTextSvg as b, NotesToolbarComponent as b$, EMBEDDED_FONTS_STYLE_ID as b0, EMPHASIS_PRESETS as b1, ENTRANCE_PRESETS as b2, TEMPLATES as b3, EXIT_PRESETS as b4, EditorContextMenuComponent as b5, EditorHistory as b6, EditorStateService as b7, EditorToolbarComponent as b8, EffectsPanelComponent as b9, InsertSmartArtDialogComponent as bA, InspectorPaneHeaderComponent as bB, InspectorPanelComponent as bC, IsMobileService as bD, KeepAnnotationsDialogComponent as bE, LOCALE_CATALOG as bF, LONG_PRESS_DURATION_MS as bG, LONG_PRESS_MOVE_TOLERANCE_PX as bH, LoadContentService as bI, LocalPresencePublisher as bJ, MAX_ZOOM_SCALE as bK, MIN_ZOOM_SCALE as bL, MOTION_PATH_COLUMNS as bM, MediaPreviewComponent as bN, MediaPropertiesPanelComponent as bO, MediaRendererComponent as bP, MediaTrimTimelineComponent as bQ, MobileBottomBarComponent as bR, MobileMenuSheetComponent as bS, MobilePresenterViewComponent as bT, MobileSheetComponent as bU, MobileSlidesSheetComponent as bV, MobileToolbarComponent as bW, ModalDialogComponent as bX, Model3DRendererComponent as bY, NotesHandoutCardComponent as bZ, NotesPanelComponent as b_, ElementRendererComponent as ba, EmbeddedFontsService as bb, EncryptedFileDialogComponent as bc, EquationEditorDialogComponent as bd, EquationRendererComponent as be, EquationTemplateGalleryComponent as bf, ExportProgressModalComponent as bg, ExportService as bh, FieldContextService as bi, FindBarComponent as bj, FindReplaceBarComponent as bk, FollowModeBarComponent as bl, FontEmbeddingListComponent as bm, FontEmbeddingPanelComponent as bn, GALLERY_THEME_PRESETS as bo, GOOGLE_WEBFONTS_LINK_ID as bp, GRIDLINE_COLOR$1 as bq, GoogleWebfontsService as br, GradientPickerComponent as bs, HANDOUT_OPTIONS as bt, HeaderFooterDialogComponent as bu, HyperlinkDialogComponent as bv, INSTANT as bw, ImagePropertiesPanelComponent as bx, InkDrawingService as by, InkRendererComponent as bz, createSvgEl as c, RibbonShapeExtrasComponent as c$, OPTIONS_PAGE_IDS as c0, OPTIONS_SECTION_IDS as c1, OPTIONS_SETTING_IDS as c2, OleRendererComponent as c3, OutlineViewOverlayComponent as c4, P14_TRANSITION_KEYFRAMES as c5, P14_TRANSITION_KEYFRAMES_2 as c6, P14_TRANSITION_KEYFRAMES_ALL as c7, PIE_AUTO_INSET_PX as c8, POWER_POINT_VIEWER_PROVIDERS as c9, REPEAT_MODE_OPTIONS as cA, RESIZE_HANDLES as cB, RIBBON_TAB_IDS as cC, RULER_FONT_SIZE as cD, RULER_THICKNESS as cE, ReadingViewOverlayComponent as cF, RemoteSelectionOverlayComponent as cG, Rendering3DService as cH, RibbonAnimationGalleryComponent as cI, RibbonAnimationsSectionComponent as cJ, RibbonArrangeSectionComponent as cK, RibbonColorPopoverComponent as cL, RibbonComponent as cM, RibbonDesignSectionComponent as cN, RibbonDrawSectionComponent as cO, RibbonDrawingGroupComponent as cP, RibbonEditingSectionComponent as cQ, RibbonFileSectionComponent as cR, RibbonFontControlsComponent as cS, RibbonHomeSectionComponent as cT, RibbonHyperlinkButtonComponent as cU, RibbonInsertFieldsComponent as cV, RibbonInsertSectionComponent as cW, RibbonMotionPathGalleryComponent as cX, RibbonParagraphControlsComponent as cY, RibbonPrimaryRowComponent as cZ, RibbonReviewSectionComponent as c_, PPTX_OPEN_ACCEPT as ca, PRESENTATION_OPEN_EXTENSIONS as cb, PRESENTER_CHANNEL_NAME as cc, PRESENTER_MSG_ORIGIN as cd, PRESENTER_TIMER_SEGMENT_MS as ce, PX_PER_CM as cf, PX_PER_INCH as cg, PasswordProtectionDialogComponent as ch, PasswordStrengthMeterComponent as ci, PowerPointViewerComponent as cj, PresentToolbarAutoHide as ck, PresentationAnnotationOverlayComponent as cl, PresentationAnnotationsService as cm, PresentationOverlayComponent as cn, PresentationPropertiesPanelComponent as co, PresentationSettingsCardComponent as cp, PresentationSubtitleBarComponent as cq, PresentationToolbarComponent as cr, PresentationTransitionOverlayComponent as cs, PresenterViewComponent as ct, PresenterWindowService as cu, PrintDialogComponent as cv, PrintService as cw, PrintSettingsPanelComponent as cx, PropertiesDialogComponent as cy, RANDOM_ELIGIBLE_TYPES as cz, buildBarChart3DHoverTooltip as d, TableResizeOverlayComponent as d$, RibbonSlideshowSectionComponent as d0, RibbonTransitionsSectionComponent as d1, RibbonViewSectionComponent as d2, RulerGuidesService as d3, SEQUENCE_OPTIONS as d4, SEVERITY_GROUPS as d5, SEVERITY_LABELS as d6, DEFAULT_TRANSITION_DURATION_MS$1 as d7, SHORTCUT_REFERENCE_ITEMS as d8, SLIDE_TRANSITION_KEYFRAMES as d9, SlideDiffRowComponent as dA, SlideDiffThumbnailsComponent as dB, SlideSizeCardComponent as dC, SlideSorterOverlayComponent as dD, SlideThemeOverridePanelComponent as dE, SlideTransitionCardComponent as dF, SlidesPanelComponent as dG, SmartArt3DRendererComponent as dH, SmartArtPreviewComponent as dI, SmartArtPropertiesComponent as dJ, SmartArtRendererComponent as dK, StatusBarComponent as dL, TABLE_STRUCTURE_TOGGLES as dM, TEXT_3D_BOTTOM_BEVEL_KEYS as dN, TEXT_3D_TOP_BEVEL_KEYS as dO, TEXT_DIRECTION_OPTIONS$1 as dP, THEME_CATALOG as dQ, TIMING_CURVE_OPTIONS as dR, TOOLBAR_BUTTON_IDS as dS, TRANSITION_SPEED_DURATION_MS as dT, TRIGGER_OPTIONS as dU, TYPE_LABELS as dV, TableCellAdvancedFillComponent as dW, TableCellFormattingComponent as dX, TableDataEditorComponent as dY, TablePropertiesComponent as dZ, TableRendererComponent as d_, SLIDE_TRANSITION_KEYFRAMES_CSS as da, DEFAULT_PALETTE as db, PALETTES as dc, SMART_ART_COLOR_SCHEMES as dd, SMART_ART_STYLE_OPTIONS as de, SUB_ITEM_LABEL as df, SVG_WARP_PRESETS as dg, SWIPE_MAX_VERTICAL_PX as dh, SWIPE_THRESHOLD_PX as di, SelectionPaneComponent as dj, SetUpSlideShowDialogComponent as dk, SettingsAppearanceTabComponent as dl, SettingsDialogComponent as dm, SettingsLanguageTabComponent as dn, ShareDialogComponent as dp, ShortcutPanelComponent as dq, ShowOptionsFieldsetComponent as dr, ShowSlidesFieldsetComponent as ds, SignatureStrippedDialogComponent as dt, SignaturesPanelComponent as du, SignaturesService as dv, SlideBackgroundCardComponent as dw, SlideCanvasComponent as dx, SlideDefaultInspectorComponent as dy, SlideDiffChangesComponent as dz, roundDragValue as e, applyFindReplacements as e$, TableSelectionService as e0, TagsCardComponent as e1, Text3DBevelSectionComponent as e2, Text3DPanelComponent as e3, TextAdvancedPanelComponent as e4, ThemeEditorFieldsComponent as e5, ThemeGalleryComponent as e6, ThemeSelectorCardComponent as e7, TitleBarComponent as e8, TitleBarSearchComponent as e9, ViewerMobileSheetService as eA, ViewerPresentationModeService as eB, ViewerThemeGalleryService as eC, ViewerTouchGesturesService as eD, ViewerZoomService as eE, WEBM_MIME_CANDIDATES as eF, WHEEL_SPOKE_COUNTS as eG, WriteBackScheduler as eH, ZERO_LINE_COLOR as eI, ZoomNavigationService as eJ, ZoomRendererComponent as eK, ZoomTargetService as eL, addCategory as eM, addCommentToList as eN, addGradientStopPatch as eO, addItem as eP, addSeries as eQ, addSubItem as eR, advanceStep as eS, affordanceElements as eT, aiToggleVisible as eU, alignPatch as eV, animationFor as eW, animationPresetLabelKey as eX, annotationMapToInkInserts as eY, applyAcceptedDiff as eZ, applyAnimationPreset as e_, TransitionDirectionPickerComponent as ea, TransitionPreviewComponent as eb, VALIGN_OPTIONS as ec, VIEWER_DIALOG_IDS as ed, VIEWER_EXPORT_FORMAT_IDS as ee, VIEWER_FEATURE_IDS as ef, VIEWER_PANEL_IDS as eg, VIEWER_THEME as eh, VersionHistoryPanelComponent as ei, ViewerCanvasEditingService as ej, ViewerCollabCursorService as ek, ViewerCollaborationSessionService as el, ViewerCollaborationShellService as em, ViewerCompareService as en, ViewerCustomShowsService as eo, ViewerCustomizationHandle as ep, ViewerCustomizationService as eq, ViewerDialogsService as er, ViewerDocumentPropertiesService as es, ViewerExportService as et, ViewerExtraDialogsComponent as eu, ViewerFileIOService as ev, ViewerFindReplaceService as ew, ViewerFormatPainterService as ex, ViewerInspectorPanelService as ey, ViewerKeyboardService as ez, buildPerspCamera as f, buildTrimFragment as f$, applyFormatToElement as f0, applyMove as f1, applyResize as f2, asMediaElement as f3, assignUserColor as f4, attachShowVisibilityPause as f5, attachTouchGestures as f6, axisTickValues as f7, beginDrawingNodeEdit as f8, beginNodeEdit as f9, buildGradientFillCss as fA, buildGridlinesAndLabels as fB, buildHyperlinkPatch as fC, buildInkContainerStyle as fD, buildInkStrokes as fE, buildLegend as fF, buildLiveInkStrokeView as fG, buildMarkTooltip as fH, buildModel3DContainerStyle as fI, buildModel3DMountOptions as fJ, buildModel3DViewModel as fK, buildOleActionModel as fL, buildOleInfoRows as fM, buildPatternFillCss as fN, buildPieViewModel as fO, buildPrintHtmlDocument as fP, buildPropertiesPatch as fQ, buildRadarViewModel as fR, buildRegionMapViewModel as fS, buildSaveSlides as fT, buildShareUrl as fU, buildSmartArtInsertElement as fV, buildSmartArtNodes as fW, buildStockViewModel as fX, buildSurfaceViewModel as fY, buildTableViewModel as fZ, buildTreemapViewModel as f_, bevelSizePatch as fa, boolFromEvent as fb, bringForward as fc, bringToFront as fd, buildBarActions as fe, buildBroadcastConfig as ff, buildBroadcastViewerUrl as fg, buildCategoryLabels as fh, buildCellParagraphs as fi, buildChartViewModel as fj, buildChatLogExport as fk, buildChatLogMarkdown as fl, buildChromeStyle as fm, buildClearHyperlinkPatch as fn, buildClickGroups as fo, buildColStyles as fp, buildCollaborationConfig as fq, buildComboViewModel as fr, buildCssGradientFromShapeStyle as fs, buildDuotoneFilter as ft, buildDuotoneFilterId as fu, buildEmbeddedFontStyles as fv, buildEquationElement as fw, buildEquationSegment as fx, buildFallbackViewModel as fy, buildFontFaceRule as fz, perspToScreen as g, computeRotateHandleBox as g$, buildWaterfallViewModel as g0, buildZeroLine as g1, buildZoomContainerStyle as g2, buildZoomViewModel as g3, bulletIndentPx as g4, canAddTopLevelNode as g5, canEditSmartArtNodes as g6, canGroupSelection as g7, canRemoveTopLevelNode as g8, canSetStrokeWidth as g9, collectUsedFontFamilies as gA, columnWidthStyle as gB, commitNodeText as gC, computeAlign as gD, computeAxisTitlePrimitives as gE, computeBarRects as gF, computeBubbleRadius as gG, computeCornerHandle as gH, computeDistribute as gI, computeDrawingViewBox as gJ, computeErrorBarPrimitives as gK, computeFocusTargets as gL, computeGridSpacingPx as gM, computeHandleBoxes as gN, computeHandoutLayout as gO, computeIsMobile as gP, computeIsTablet as gQ, computeLinePoints as gR, computeLinearRegression as gS, computePageCount as gT, computePieLayout as gU, computePieSlicePath as gV, computePieSlices as gW, computePlotLayout as gX, computeRSquared as gY, computeRadarPoints as gZ, computeResizeHandleBoxes as g_, canStartBroadcast as ga, canStartShare as gb, canUngroupSelection as gc, canUseClipboard as gd, captionDisplayText as ge, cellRunStyle as gf, cellStyleToStyleMap as gg, cellTdStyle as gh, changeCountLabel as gi, changeIcon as gj, characterSpacingPatch as gk, chartPreserveAspectRatio as gl, checkFontAvailable as gm, clampCursorPosition as gn, clampGifDimensions as go, clampIndex as gp, clampNotesFontSize as gq, clampScale as gr, clampStep as gs, clearAllLocalViewerData as gt, clearAudienceContent as gu, cn as gv, collectAccessibilityIssues as gw, collectElementText as gx, collectSlideText as gy, collectStoredChats as gz, pieRimPoint as h, fontMimeForFormat as h$, computeScatterDots as h0, computeScatterXDomain as h1, computeSelectionBoxes as h2, computeSingleSelected as h3, computeSlideIndices as h4, computeSnap as h5, computeStackedBarRects as h6, computeStackedValueRange as h7, computeTrendlinePrimitives as h8, computeValueRange as h9, disableInnerShadowPatch as hA, disableOuterShadowPatch as hB, disableReflectionPatch as hC, disableSoftEdgePatch as hD, duplicateElementById as hE, durationOf as hF, effectsStateOf as hG, enableGlowPatch as hH, enableInnerShadowPatch as hI, enableOuterShadowPatch as hJ, enableReflectionPatch as hK, enableSoftEdgePatch as hL, encodeGif as hM, endShowMediaCleanup as hN, estimatePageCount as hO, exitPresentationFullscreen as hP, exportAiChatLogs as hQ, extractPathPoints as hR, eyedropperAvailable as hS, fillColorOf$1 as hT, findInSlides as hU, findOwningSlideIndex as hV, findSlideIndexByElementId as hW, firstVisibleIndex as hX, fitPolynomial as hY, fitZoom as hZ, focusTargetChips as h_, convertOmmlToMathMl as ha, copyFormatFromElement as hb, countAccessibilityIssues as hc, countAnnotationStrokes as hd, createAngularAiBridge as he, createCustomShow as hf, createImageElementFromFile as hg, createSwipeDismissDrag as hh, createWebrtcBundle as hi, createWebsocketBundle as hj, cssObjectToStyleMap as hk, currentColorScheme as hl, currentLayout as hm, currentStyle as hn, defaultCssVars as ho, defaultRadius as hp, defaultThemeColors as hq, deleteElementsByIds as hr, deleteVersion as hs, demoteNode as ht, deriveModel3DBlobUrl as hu, derivePresenceList as hv, describeCollaborationShellState as hw, describeSmartArtBounds as hx, directionPickerState as hy, disableGlowPatch as hz, isChartInteractionArmed as i, headerLabel as i$, fontSizeOf as i0, forgetSessionDeck as i1, formatAxisValue as i2, formatBytes as i3, formatCursorLabel as i4, formatElapsed as i5, formatFileSize as i6, formatInlineListStyle as i7, formatPropertyDate as i8, formatTime as i9, getVersions as iA, getResolvedShapeClipPath as iB, getResolvedShapeClipPathFor as iC, getSessionTabId as iD, getShapeFillStrokeStyle as iE, getSlideBackgroundStyle as iF, getSlideTransitionAnimations as iG, getSmartArtNodeBounds as iH, getSpeechRecognitionCtor as iI, getTextBlockStyle as iJ, getTextWarp as iK, getTouchDistance as iL, getWarpCategory as iM, getWarpPath as iN, gradientStateFromStyle as iO, gradientStateOf as iP, gradientStatePatch as iQ, gradientStopColorCommitPatch as iR, gridColumns as iS, groupIssuesBySeverity as iT, hasAnimation as iU, hasCopyableFormat as iV, hasExistingLink as iW, hasExitedFullscreen as iX, hasGradientFill as iY, hasPressureVariation as iZ, hasVisibleSlideAfter as i_, fpsToFrameIntervalMs as ia, generateBroadcastRoomId as ib, generateCommentId as ic, generateCustomShowId as id, generatePressureCircles as ie, generateTicks as ig, getCinematicTransitionAnimations as ih, getClrChangeParams as ii, getContainerStyle as ij, getDuotoneFilterDef as ik, getEffectSoundAsset as il, getEffectSoundState as im, getImageSrc as io, getLocalStorageUsageSummary as ip, getOleAriaLabel as iq, getOleBadgeLabel as ir, getOleDisplayName as is, getOleDownloadFileName as it, getOleTypeColor as iu, getOleTypeLabel as iv, getP14TransitionAnimations as iw, getPasswordStrength as ix, getPatternSvg as iy, getPlaceholderStyle as iz, computePieChartLayout as j, nodeItalic as j$, imageDimensions as j0, injectResolvedCustomization as j1, inkViewBox as j2, insertTableElementColumn as j3, insertTableElementRow as j4, interpolateWidth as j5, isAudienceTab as j6, isBold as j7, isBrowserOpenableMime as j8, isChildNode as j9, mediaFallbackFor as jA, mediaSurfaceFor as jB, mergeCaptionResults as jC, mergeDown as jD, mergeRight as jE, mergeSelection as jF, mergeTablesDirective as jG, moveElementBy as jH, moveNodeDown as jI, moveNodeUp as jJ, msToFrameDelayCs as jK, narrowToCircle as jL, narrowToPolygon as jM, narrowToRect as jN, newChartElement as jO, newEquationElement as jP, newPresetShapeElement as jQ, newShapeElement as jR, newSmartArtElement as jS, newTableElement as jT, newTextElement as jU, nextVisibleIndex as jV, nodeBold as jW, nodeEditBox as jX, nodeFillColor as jY, nodeFontColor as jZ, nodeIdFromKey as j_, isElementInteractive as ja, isInjectableUrl as jb, isItalic as jc, isLegacyBinaryPresentation as jd, isPpactionUrl as je, isPresenterMessage as jf, isSigned as jg, isSupportedPresentationFile as jh, isTextElement as ji, isTwoTableFocus as jj, isUnderline as jk, isUrlSafe as jl, isValidRoomId as jm, isViewportBackgroundPressTarget as jn, isZoomActivationKey as jo, issueTrackKey as jp, issueTypeLabel as jq, keyToLabel as jr, lastVisibleIndex as js, latexToMathml as jt, layoutConnectorPaints as ju, layoutNodeLabels as jv, linePointsToSvgString as jw, lineSpacingPatch as jx, loadAudienceContent as jy, loadSessionDeck as jz, perspScreenToPlaneY as k, resolveDirection8 as k$, nodeStyle as k0, normalizeFontFormat as k1, normalizeSlidesPerPage as k2, normalizeValue as k3, numFromEvent as k4, oleActionsVisibleFor as k5, ommlToMathml as k6, ooxmlDashToCssBorderStyle as k7, openNativeEyeDropper as k8, overallStatus as k9, promoteNode as kA, provideViewerTheme as kB, radarAngle as kC, radarRingPoints as kD, readAsDataUrl as kE, recordWebm as kF, registerCrossSlideAudio as kG, rememberSessionDeck as kH, removeAnimation as kI, removeCategory as kJ, removeTableElementColumn as kK, removeCommentFromList as kL, removeElementAnimation as kM, removeGradientStopPatch as kN, removeNode as kO, removeTableElementRow as kP, removeSeries as kQ, renderToCanvas as kR, reorderAnimationDown as kS, reorderAnimationUp as kT, replaceInSlides as kU, replaceMatch as kV, requestPresentationFullscreen as kW, resizeElement as kX, resolveCaptionTracks as kY, resolveChartKind as kZ, resolveDirection as k_, paletteColor as ka, parseAudienceNonce as kb, parseNodeTextarea as kc, partitionSlides as kd, patchChartData as ke, patchChartStyle as kf, patchTableData as kg, patchTextStyle as kh, patternPresetOptions as ki, pendingElementStyles as kj, pickColorByClickFallback as kk, pickFile as kl, pickSupportedMimeType as km, planGifFrames as kn, planVideoSegments as ko, pointFromPointerEvent as kp, pointsToSvgPathD as kq, presenceToCursors as kr, presentationBaseName as ks, presentationStageStyle as kt, presenterTimerProgress as ku, presetByLayout as kv, presetsForCategory as kw, pressuresToWidths as kx, prevVisibleIndex as ky, projectDrawingShapes as kz, resolvePieSliceShareValue as l, setDirection as l$, resolveFontVariant as l0, resolveHyperlinkHref as l1, resolveInteractiveElementId as l2, resolveLegendAnchorPosition as l3, resolveMediaSrc as l4, resolveOleType as l5, resolveOrientation as l6, resolveParagraphBullet as l7, resolvePresenterNotes as l8, resolveProfileInitial as l9, seedPropertiesDraft as lA, seedShareFields as lB, segmentFrameCount as lC, selectValue$3 as lD, sendBackward as lE, sendToBack as lF, sequentialColorScale as lG, serializeWriteBack as lH, seriesColor as lI, seriesXValues as lJ, setAfterAnimation as lK, setAfterAnimationColor as lL, setAnimationEmphasis as lM, setAnimationEntrance as lN, setAnimationExit as lO, setAxis as lP, setAxisLogScale as lQ, setAxisTitleStyle as lR, setCategoryLabel as lS, setCellText as lT, setColorScheme as lU, setDataLabels as lV, setDataPointExplosion as lW, setDataPointFill as lX, setDataPointLabel as lY, setDataPointMarker as lZ, setDelay as l_, resolveRegionCode as la, resolveRibbonCanGroup as lb, resolveSlideAutoAdvanceMs as lc, resolveSlideTransition as ld, resolvePalette as le, resolveThemeCatalogEntry as lf, resolveTransitionDuration as lg, resolveTransitionDurationMs as lh, resolveWheelSpokeCount as li, restoreSessionDeck as lj, revealedElementStyles as lk, routeOrthogonalConnector as ll, rowStyle as lm, rulerDragToGuidePosition as ln, rulerHighlight as lo, rulerStripTicks as lp, sampleColorFromSlide as lq, sanitizeColor as lr, sanitizeSlideIndex as ls, sanitizeUserName as lt, saveViewerProfile as lu, savedPresentationFileName as lv, scanAvailableFonts as lw, searchSlides as lx, seedBroadcastFields as ly, seedHyperlinkDraft as lz, hexToRgb as m, toggleCommentResolvedInList as m$, setDuration as m0, setEffectSound as m1, setEffectStockSound as m2, setElementPosition as m3, setGridlineStyle as m4, setLayout as m5, setLegend as m6, setNodeStyle as m7, setNodeText as m8, setRepeatCount as m9, slidesWithReappliedLayout as mA, smartArtNodes as mB, paletteColour as mC, snapToGridStep as mD, splitCursorCell as mE, splitMergedCell as mF, statusKind as mG, statusLabel$1 as mH, storeAudienceContent as mI, stringFromEvent$5 as mJ, strokeColorOf as mK, strokeToInkElement as mL, strokeWidthOf as mM, styleShadowFilter as mN, surfaceColor as mO, textAdvancedPatch as mP, textAdvancedStateFromStyle as mQ, textAdvancedStateOf as mR, textColorOf as mS, textDirectionPatch as mT, textFontSizePatch as mU, textStyleOf as mV, textStylePatch as mW, themeStyle as mX, themeToCssVars as mY, thumbnailHeight as mZ, thumbnailZoom as m_, setRepeatMode as ma, setSequence as mb, setSeriesChartType as mc, setSeriesColor as md, setSeriesErrorBars as me, setSeriesMarker as mf, setSeriesName as mg, setSeriesTrendline as mh, setSeriesValue as mi, setStyle as mj, setTimingCurve as mk, setTitle as ml, setTrigger as mm, setTriggerShapeId as mn, shapeStylePatch$1 as mo, sheetAfterNavigate as mp, shouldBlockClickAdvance as mq, shouldUseSvgWarp as mr, showDirectionPicker as ms, showsTemplateAffordance as mt, signatureCountLabel as mu, signatureKey as mv, signatureTimestamp as mw, signerName as mx, statusLabel as my, slideNumberOf as mz, smartArt3DGradientColor as n, toggleNodeBold as n0, toggleNodeItalic as n1, toggleSheet as n2, topLevelNodeCount as n3, transformSelectedTextCase as n4, translationsEn as n5, updateElementById as n6, updateGlowPatch as n7, updateGradientStopPatch as n8, updateInnerShadowPatch as n9, updateOuterShadowPatch as na, updateReflectionPatch as nb, vAlignPatch as nc, validatePassword as nd, validatePrintSettings as ne, validateRoomId as nf, valueToY as ng, vermilionDarkColors as nh, vermilionDarkTheme as ni, vermilionLightColors as nj, vermilionLightTheme as nk, vermilionRadius as nl, waypointsToPathD as nm, withManualLayouts as nn, worstStatus as no, zoomTargetSlideIndex as np, obliqueBarTaper as o, perspBoxMatrix as p, shadeSmartArt3DVertices as q, renderChartLineSvg as r, shade as s, toChatSummary as t, smartArt3DGradientCoordinate as u, threeViewOverflowFromNdc as v, widenPieViewModel as w, hasThreeViewOverflow as x, overflowViewOffset as y, smartArt3DCameraMatrix as z };
212981
+ //# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-Bi23ofA3.mjs.map