pptx-angular-viewer 2.15.1 → 2.15.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/fesm2022/{pptx-angular-viewer-chat-history-idb-B9FM2kAV.mjs → pptx-angular-viewer-chat-history-idb-Bdm_ufPN.mjs} +2 -2
- package/fesm2022/{pptx-angular-viewer-chat-history-idb-B9FM2kAV.mjs.map → pptx-angular-viewer-chat-history-idb-Bdm_ufPN.mjs.map} +1 -1
- package/fesm2022/{pptx-angular-viewer-pptx-angular-viewer-D_iIqccu.mjs → pptx-angular-viewer-pptx-angular-viewer-BHE3UItD.mjs} +469 -292
- package/fesm2022/{pptx-angular-viewer-pptx-angular-viewer-D_iIqccu.mjs.map → pptx-angular-viewer-pptx-angular-viewer-BHE3UItD.mjs.map} +1 -1
- package/fesm2022/pptx-angular-viewer.mjs +1 -1
- package/package.json +2 -2
- package/types/pptx-angular-viewer.d.ts +40 -8
|
@@ -2,7 +2,7 @@ import { NgStyle, NgTemplateOutlet, NgClass } from '@angular/common';
|
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { InjectionToken, input, output, inject, computed, ChangeDetectionStrategy, Component, signal, Injectable, DestroyRef, Injector, effect, viewChild, ElementRef, HostListener, afterNextRender, Renderer2, ViewEncapsulation, forwardRef, untracked } from '@angular/core';
|
|
4
4
|
import { TranslateService, TranslatePipe, translate } from '@ngx-translate/core';
|
|
5
|
-
import { THEME_PRESETS, guideEmuToPx, getShapeClipPath, getAdjustmentAwareClipPath, getShapeClipPathFromPreset, getCloudPathForRendering, ooxmlGradientAngleToCssDegrees, hasShapeProperties, evaluatePresetShape, MIN_ELEMENT_SIZE as MIN_ELEMENT_SIZE$2, applyDrawingColorTransforms as applyDrawingColorTransforms$1, hslToRgb as hslToRgb$1, PRESET_COLOR_MAP, isImageLikeElement, hasTextProperties, stripXmlOrderSuffix, orderedXmlKey, chartDataAddSeries, chartDataRemoveSeries, chartDataAddCategory, chartDataRemoveCategory, chartDataUpdatePoint, rebuildTableStructureInRawXml, updateCellTextInRawXml, DEFAULT_SCHEME_COLOR_MAP as DEFAULT_SCHEME_COLOR_MAP$1, getLinkedTextBoxSegments, getSubstituteFontFamily, parsePanoseString, deriveSlideTitle, svgPathToPolygons, THEME_COLOR_SCHEME_KEYS, createBuiltinVariables, resolveCoordinate, PptxHandler, deobfuscateFont, detectFontFormat, checkMissingAltText, checkMissingSlideTitle, checkLowContrast, checkComplexTables, checkBlankSlide, checkDuplicateTitles, createChartElement, serializePptxToJson, PPTX_JSON_MIME_TYPE, PptxMarkdownConverter, ThemePresets, formatCommentTimestamp as formatCommentTimestamp$1, EncryptedFileError, parseSignatureXml, cloneSlide as cloneSlide$1, cloneTemplateElementsBySlideId as cloneTemplateElementsBySlideId$1, cloneElement as cloneElement$1, updateSmartArtNodeText, setSmartArtNodeStyle, isInkElement, parseDataUrlToBytes, isZoomElement, SvgExporter, applyThemeToData, pptxActionToElementAction, elementActionToPptxAction, setChartTitle, setChartLegend, setChartDataLabels, setChartAxis, setChartSeriesTrendline, setChartSeriesErrorBars, setChartDataPointLabel, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointMarker, setChartDataPointExplosion, chartDataChangeType, getOleObjectTypeLabel, addSmartArtNodeAsChild, removeSmartArtNode, promoteSmartArtNode, demoteSmartArtNode, reorderSmartArtNode, switchSmartArtLayout, SWITCHABLE_LAYOUT_TYPES, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, applyThemeOverrideToSlide, TRANSITION_VALID_DIRECTIONS } from 'pptx-viewer-core';
|
|
5
|
+
import { THEME_PRESETS, guideEmuToPx, getShapeClipPath, getAdjustmentAwareClipPath, getShapeClipPathFromPreset, getCloudPathForRendering, ooxmlGradientAngleToCssDegrees, hasShapeProperties, evaluatePresetShape, MIN_ELEMENT_SIZE as MIN_ELEMENT_SIZE$2, getElementTextContent, getShapeType, getRoundRectRadiusPx as getRoundRectRadiusPx$1, applyDrawingColorTransforms as applyDrawingColorTransforms$1, hslToRgb as hslToRgb$1, PRESET_COLOR_MAP, isImageLikeElement, hasTextProperties, stripXmlOrderSuffix, orderedXmlKey, chartDataAddSeries, chartDataRemoveSeries, chartDataAddCategory, chartDataRemoveCategory, chartDataUpdatePoint, rebuildTableStructureInRawXml, updateCellTextInRawXml, DEFAULT_SCHEME_COLOR_MAP as DEFAULT_SCHEME_COLOR_MAP$1, getLinkedTextBoxSegments, getSubstituteFontFamily, parsePanoseString, deriveSlideTitle, svgPathToPolygons, THEME_COLOR_SCHEME_KEYS, createBuiltinVariables, resolveCoordinate, PptxHandler, deobfuscateFont, detectFontFormat, checkMissingAltText, checkMissingSlideTitle, checkLowContrast, checkComplexTables, checkBlankSlide, checkDuplicateTitles, createChartElement, serializePptxToJson, PPTX_JSON_MIME_TYPE, PptxMarkdownConverter, ThemePresets, formatCommentTimestamp as formatCommentTimestamp$1, EncryptedFileError, parseSignatureXml, cloneSlide as cloneSlide$1, cloneTemplateElementsBySlideId as cloneTemplateElementsBySlideId$1, cloneElement as cloneElement$1, updateSmartArtNodeText, setSmartArtNodeStyle, isInkElement, parseDataUrlToBytes, isZoomElement, SvgExporter, applyThemeToData, pptxActionToElementAction, elementActionToPptxAction, setChartTitle, setChartLegend, setChartDataLabels, setChartAxis, setChartSeriesTrendline, setChartSeriesErrorBars, setChartDataPointLabel, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointMarker, setChartDataPointExplosion, chartDataChangeType, getOleObjectTypeLabel, addSmartArtNodeAsChild, removeSmartArtNode, promoteSmartArtNode, demoteSmartArtNode, reorderSmartArtNode, switchSmartArtLayout, SWITCHABLE_LAYOUT_TYPES, COLOR_MAP_ALIAS_KEYS, DEFAULT_COLOR_MAP, applyThemeOverrideToSlide, TRANSITION_VALID_DIRECTIONS } from 'pptx-viewer-core';
|
|
6
6
|
import DOMPurify from 'dompurify';
|
|
7
7
|
import { z } from 'zod';
|
|
8
8
|
import * as mcp from 'pptx-viewer-mcp';
|
|
@@ -702,6 +702,134 @@ function getResolvedShapeClipPath(element, width, height) {
|
|
|
702
702
|
const adjustments = element.shapeAdjustments;
|
|
703
703
|
return getResolvedShapeClipPathFor(shapeType, w, h, adjustments);
|
|
704
704
|
}
|
|
705
|
+
/**
|
|
706
|
+
* Preset geometries whose outline is exactly the element's bounding box.
|
|
707
|
+
*
|
|
708
|
+
* Evaluating all 188 presets shows only these two return the unmodified
|
|
709
|
+
* rectangle, so a CSS `clip-path` for them paints identically and serves only
|
|
710
|
+
* to hard-clip overflowing children. PowerPoint never clips a shape's TEXT to
|
|
711
|
+
* its geometry - an overflowing body spills visibly - so stamping this identity
|
|
712
|
+
* clip on the shape container (which also holds the text layer) slices the
|
|
713
|
+
* first and last lines of any overflowing text. With `anchor="ctr"` the damage
|
|
714
|
+
* is symmetric: the top line is cut through the glyphs and the final character
|
|
715
|
+
* is cut off (issue #132, HR deck slide 26).
|
|
716
|
+
*/
|
|
717
|
+
const IDENTITY_RECT_PRESETS = new Set(['rect', 'flowchartprocess']);
|
|
718
|
+
/**
|
|
719
|
+
* Whether `element`'s resolved clip-path would be its own bounding rectangle,
|
|
720
|
+
* i.e. a clip that paints identically but suppresses overflow. Custom-geometry
|
|
721
|
+
* freeforms are never identity clips: their `pathData` outline is the point.
|
|
722
|
+
*
|
|
723
|
+
* @param element The element whose clip-path is being resolved.
|
|
724
|
+
* @returns `true` when the clip can be skipped so overflow stays visible.
|
|
725
|
+
*/
|
|
726
|
+
function isIdentityRectClip(element) {
|
|
727
|
+
const custom = element;
|
|
728
|
+
if (custom.pathData && custom.pathWidth && custom.pathHeight) {
|
|
729
|
+
return false;
|
|
730
|
+
}
|
|
731
|
+
const shapeType = element.shapeType;
|
|
732
|
+
return shapeType !== undefined && IDENTITY_RECT_PRESETS.has(shapeType.toLowerCase());
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
/**
|
|
736
|
+
* Pure connector line-style helpers shared across bindings.
|
|
737
|
+
*
|
|
738
|
+
* Compound (double/triple) parallel-stroke geometry and connector-family
|
|
739
|
+
* classification. No framework imports. The actual SVG `<marker>` / `<path>`
|
|
740
|
+
* emission stays in each binding's view layer.
|
|
741
|
+
*/
|
|
742
|
+
/**
|
|
743
|
+
* Compute perpendicular offsets for compound (double/triple) line styles.
|
|
744
|
+
* Returns an array of offset distances from the centre line in px. A single
|
|
745
|
+
* line style returns `[0]`.
|
|
746
|
+
*
|
|
747
|
+
* @param compoundLine - OOXML `a:ln/@cmpd` value (e.g. `"dbl"`, `"tri"`).
|
|
748
|
+
* @param strokeWidth - The resolved stroke width in pixels.
|
|
749
|
+
*/
|
|
750
|
+
function getCompoundLineOffsets(compoundLine, strokeWidth) {
|
|
751
|
+
if (!compoundLine || compoundLine === 'sng') {
|
|
752
|
+
return [0];
|
|
753
|
+
}
|
|
754
|
+
const gap = Math.max(strokeWidth * 0.6, 1.5);
|
|
755
|
+
if (compoundLine === 'dbl') {
|
|
756
|
+
return [-gap, gap];
|
|
757
|
+
}
|
|
758
|
+
if (compoundLine === 'thickThin') {
|
|
759
|
+
return [-gap * 0.6, gap];
|
|
760
|
+
}
|
|
761
|
+
if (compoundLine === 'thinThick') {
|
|
762
|
+
return [-gap, gap * 0.6];
|
|
763
|
+
}
|
|
764
|
+
if (compoundLine === 'tri') {
|
|
765
|
+
return [-gap, 0, gap];
|
|
766
|
+
}
|
|
767
|
+
return [0];
|
|
768
|
+
}
|
|
769
|
+
/**
|
|
770
|
+
* Compute individual stroke widths for each parallel path in a compound line.
|
|
771
|
+
* The array length matches the one returned by {@link getCompoundLineOffsets}.
|
|
772
|
+
*
|
|
773
|
+
* @param compoundLine - OOXML `a:ln/@cmpd` value.
|
|
774
|
+
* @param strokeWidth - The resolved stroke width in pixels.
|
|
775
|
+
*/
|
|
776
|
+
function getCompoundLineWidths(compoundLine, strokeWidth) {
|
|
777
|
+
const base = Math.max(strokeWidth, 1);
|
|
778
|
+
if (!compoundLine || compoundLine === 'sng') {
|
|
779
|
+
return [base];
|
|
780
|
+
}
|
|
781
|
+
if (compoundLine === 'dbl') {
|
|
782
|
+
return [base * 0.5, base * 0.5];
|
|
783
|
+
}
|
|
784
|
+
if (compoundLine === 'thickThin') {
|
|
785
|
+
return [base * 0.7, base * 0.3];
|
|
786
|
+
}
|
|
787
|
+
if (compoundLine === 'thinThick') {
|
|
788
|
+
return [base * 0.3, base * 0.7];
|
|
789
|
+
}
|
|
790
|
+
if (compoundLine === 'tri') {
|
|
791
|
+
return [base * 0.3, base * 0.4, base * 0.3];
|
|
792
|
+
}
|
|
793
|
+
return [base];
|
|
794
|
+
}
|
|
795
|
+
/**
|
|
796
|
+
* Map an OOXML line-cap token (`a:ln/@cap`) to its SVG `stroke-linecap` value.
|
|
797
|
+
*
|
|
798
|
+
* `flat` -> `butt`, `sq` -> `square`, `rnd` -> `round`. Anything absent or
|
|
799
|
+
* unrecognised falls back to `round`, matching the viewer's historical default.
|
|
800
|
+
*/
|
|
801
|
+
function svgLineCap(lineCap) {
|
|
802
|
+
switch (lineCap) {
|
|
803
|
+
case 'flat':
|
|
804
|
+
return 'butt';
|
|
805
|
+
case 'sq':
|
|
806
|
+
return 'square';
|
|
807
|
+
default:
|
|
808
|
+
return 'round';
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
/**
|
|
812
|
+
* Classify a connector by its OOXML preset shape type (case-insensitive):
|
|
813
|
+
* `bentConnector*` → `"bent"`, `curvedConnector*` → `"curved"`, everything
|
|
814
|
+
* else (incl. `straightConnector1`) → `"straight"`.
|
|
815
|
+
*/
|
|
816
|
+
function connectorKind(shapeType) {
|
|
817
|
+
const t = (shapeType ?? '').toLowerCase();
|
|
818
|
+
if (t.includes('bentconnector')) {
|
|
819
|
+
return 'bent';
|
|
820
|
+
}
|
|
821
|
+
if (t.includes('curvedconnector')) {
|
|
822
|
+
return 'curved';
|
|
823
|
+
}
|
|
824
|
+
return 'straight';
|
|
825
|
+
}
|
|
826
|
+
/**
|
|
827
|
+
* Determine whether a connector `shapeType` requires multi-segment (path)
|
|
828
|
+
* rendering rather than a simple `<line>` element.
|
|
829
|
+
*/
|
|
830
|
+
function connectorNeedsPath(shapeType) {
|
|
831
|
+
return connectorKind(shapeType) !== 'straight';
|
|
832
|
+
}
|
|
705
833
|
|
|
706
834
|
// ---------------------------------------------------------------------------
|
|
707
835
|
// Color primitives (inlined from React `color-core.ts`)
|
|
@@ -1610,289 +1738,6 @@ function resolveComputedFill(ss, element) {
|
|
|
1610
1738
|
return {};
|
|
1611
1739
|
}
|
|
1612
1740
|
|
|
1613
|
-
/** Round to 4 decimals so the emitted markup stays stable and compact. */
|
|
1614
|
-
function round4(value) {
|
|
1615
|
-
return Math.round(value * 10000) / 10000;
|
|
1616
|
-
}
|
|
1617
|
-
/**
|
|
1618
|
-
* Namespace a gradient id to its owning element. SVG ids are document-global,
|
|
1619
|
-
* so two shapes with different gradients would otherwise collide on the first
|
|
1620
|
-
* one rendered; element ids carry `/` and `.` (`ppt/slides/slide2.xml-shape-4`),
|
|
1621
|
-
* which are not valid in a bare `url(#…)` fragment.
|
|
1622
|
-
*/
|
|
1623
|
-
function svgGradientId(elementId, suffix = 'grad') {
|
|
1624
|
-
const seed = String(elementId).replace(/[^a-zA-Z0-9_-]/gu, '_');
|
|
1625
|
-
return `pptx-${suffix}-${seed}`;
|
|
1626
|
-
}
|
|
1627
|
-
/** Convert sanitized 0-100 gradient stops into SVG 0-1 offsets. */
|
|
1628
|
-
function toSvgStops(stops) {
|
|
1629
|
-
return sanitizeGradientStops(stops).map((stop) => ({
|
|
1630
|
-
offset: round4(stop.position / 100),
|
|
1631
|
-
color: stop.color,
|
|
1632
|
-
...(typeof stop.opacity === 'number' ? { opacity: round4(stop.opacity) } : {}),
|
|
1633
|
-
}));
|
|
1634
|
-
}
|
|
1635
|
-
/**
|
|
1636
|
-
* Endpoints of the gradient line for an OOXML `a:lin/@ang`, in
|
|
1637
|
-
* `objectBoundingBox` units.
|
|
1638
|
-
*
|
|
1639
|
-
* `ang` is measured clockwise from the positive x-axis with y pointing down, so
|
|
1640
|
-
* the direction vector is `(cos a, sin a)` with no CSS-style quarter turn: SVG
|
|
1641
|
-
* shares OOXML's axis convention. The line is centred on the box and extended by
|
|
1642
|
-
* `|dx| + |dy|`, the projection of the unit square onto that direction, so the
|
|
1643
|
-
* first and last stops land exactly on the box edges the way PowerPoint draws
|
|
1644
|
-
* them.
|
|
1645
|
-
*
|
|
1646
|
-
* `a:lin/@scaled="1"` (the default) means the angle is measured in the shape's
|
|
1647
|
-
* unit square and then stretched to the real box - which is precisely what
|
|
1648
|
-
* `gradientUnits="objectBoundingBox"` does, so the raw angle is used as-is and
|
|
1649
|
-
* no aspect correction is applied here (unlike the CSS path, where the stretch
|
|
1650
|
-
* has to be simulated).
|
|
1651
|
-
*/
|
|
1652
|
-
function linearEndpoints(angleDegrees) {
|
|
1653
|
-
const radians = (angleDegrees * Math.PI) / 180;
|
|
1654
|
-
const dx = Math.cos(radians);
|
|
1655
|
-
const dy = Math.sin(radians);
|
|
1656
|
-
const span = (Math.abs(dx) + Math.abs(dy)) / 2;
|
|
1657
|
-
return {
|
|
1658
|
-
x1: round4(0.5 - dx * span),
|
|
1659
|
-
y1: round4(0.5 - dy * span),
|
|
1660
|
-
x2: round4(0.5 + dx * span),
|
|
1661
|
-
y2: round4(0.5 + dy * span),
|
|
1662
|
-
};
|
|
1663
|
-
}
|
|
1664
|
-
/** Shared builder behind the fill and stroke entry points. */
|
|
1665
|
-
function buildFromSource(source, id) {
|
|
1666
|
-
const { stops } = source;
|
|
1667
|
-
if (stops.length === 0) {
|
|
1668
|
-
return undefined;
|
|
1669
|
-
}
|
|
1670
|
-
if ((source.type || 'linear') === 'radial') {
|
|
1671
|
-
// Path gradients run from the `fillToRect` outwards, so stop 0 sits at the
|
|
1672
|
-
// centre exactly as an SVG radial gradient's offset 0 does.
|
|
1673
|
-
const { cx, cy } = computeGradientCenter(source.fillToRect, source.focalPoint);
|
|
1674
|
-
const fx = cx / 100;
|
|
1675
|
-
const fy = cy / 100;
|
|
1676
|
-
// Reach the farthest corner of the box, mirroring CSS's default
|
|
1677
|
-
// `farthest-corner` sizing, so the last stop is not cropped mid-shape.
|
|
1678
|
-
const r = Math.hypot(Math.max(fx, 1 - fx), Math.max(fy, 1 - fy));
|
|
1679
|
-
return { kind: 'radial', id, cx: round4(fx), cy: round4(fy), r: round4(r), stops };
|
|
1680
|
-
}
|
|
1681
|
-
const angle = typeof source.angle === 'number' && Number.isFinite(source.angle) ? source.angle : 90;
|
|
1682
|
-
return { kind: 'linear', id, ...linearEndpoints(angle), stops };
|
|
1683
|
-
}
|
|
1684
|
-
/**
|
|
1685
|
-
* Build the SVG paint-server definition for a shape's gradient FILL.
|
|
1686
|
-
*
|
|
1687
|
-
* Returns `undefined` unless the style is a gradient with usable structured
|
|
1688
|
-
* stops; callers keep their solid-colour path in that case (a prebuilt
|
|
1689
|
-
* `fillGradient` CSS string cannot be expressed as an SVG paint server).
|
|
1690
|
-
*
|
|
1691
|
-
* `a:gradFill/@flip` and `a:tileRect` are not modelled: SVG `spreadMethod` has
|
|
1692
|
-
* no per-tile mirror and freeform gradients in practice author neither.
|
|
1693
|
-
*
|
|
1694
|
-
* @param style - The resolved shape style carrying the gradient.
|
|
1695
|
-
* @param elementId - The owning element id, used to namespace the gradient id.
|
|
1696
|
-
*/
|
|
1697
|
-
function buildSvgGradientDef(style, elementId) {
|
|
1698
|
-
if (!style || style.fillMode !== 'gradient') {
|
|
1699
|
-
return undefined;
|
|
1700
|
-
}
|
|
1701
|
-
return buildFromSource({
|
|
1702
|
-
stops: toSvgStops(style.fillGradientStops),
|
|
1703
|
-
type: style.fillGradientType,
|
|
1704
|
-
angle: style.fillGradientAngle,
|
|
1705
|
-
fillToRect: style.fillGradientFillToRect,
|
|
1706
|
-
focalPoint: style.fillGradientFocalPoint,
|
|
1707
|
-
}, svgGradientId(elementId));
|
|
1708
|
-
}
|
|
1709
|
-
/**
|
|
1710
|
-
* Build the SVG paint-server definition for a shape's gradient OUTLINE
|
|
1711
|
-
* (`a:ln/a:gradFill`).
|
|
1712
|
-
*
|
|
1713
|
-
* A CSS `border` can only take one colour, so a gradient outline was painted
|
|
1714
|
-
* with the parser's averaged `strokeColor`: a two-tone outline came out flat and
|
|
1715
|
-
* a fade-to-transparent one came out fully opaque. Stroking an SVG path with
|
|
1716
|
-
* this paint server renders it properly.
|
|
1717
|
-
*
|
|
1718
|
-
* The id is namespaced separately from the fill's, so a shape with BOTH a
|
|
1719
|
-
* gradient fill and a gradient outline gets two distinct paint servers.
|
|
1720
|
-
*/
|
|
1721
|
-
function buildSvgStrokeGradientDef(style, elementId) {
|
|
1722
|
-
if (!style || style.strokeFillMode !== 'gradient') {
|
|
1723
|
-
return undefined;
|
|
1724
|
-
}
|
|
1725
|
-
return buildFromSource({
|
|
1726
|
-
stops: toSvgStops(style.strokeGradientStops),
|
|
1727
|
-
type: style.strokeGradientType,
|
|
1728
|
-
angle: style.strokeGradientAngle,
|
|
1729
|
-
}, svgGradientId(elementId, 'stroke'));
|
|
1730
|
-
}
|
|
1731
|
-
/**
|
|
1732
|
-
* Build the SVG paint-server definition for a shape's pattern OUTLINE
|
|
1733
|
-
* (`a:ln/a:pattFill`).
|
|
1734
|
-
*
|
|
1735
|
-
* A CSS `border` cannot be hatched, so a patterned outline was painted with the
|
|
1736
|
-
* parser's `strokeColor` - the pattern's foreground - as a flat line: the weave
|
|
1737
|
-
* disappeared entirely. Stroking a path with this pattern renders the real tile.
|
|
1738
|
-
*
|
|
1739
|
-
* Returns `undefined` when the outline is not a pattern or the preset is one we
|
|
1740
|
-
* do not draw, so callers keep the solid fallback.
|
|
1741
|
-
*/
|
|
1742
|
-
function buildSvgStrokePatternDef(style, elementId) {
|
|
1743
|
-
if (!style || style.strokeFillMode !== 'pattern' || !style.strokePatternPreset) {
|
|
1744
|
-
return undefined;
|
|
1745
|
-
}
|
|
1746
|
-
const fg = normalizeHexColor$1(style.strokeColor, '#000000');
|
|
1747
|
-
const bg = normalizeHexColor$1(style.strokePatternBackgroundColor, '#ffffff');
|
|
1748
|
-
const tile = getPatternTile(style.strokePatternPreset, fg, bg);
|
|
1749
|
-
if (!tile) {
|
|
1750
|
-
return undefined;
|
|
1751
|
-
}
|
|
1752
|
-
const markup = `<svg xmlns="http://www.w3.org/2000/svg" width="${tile.w}" height="${tile.h}">${tile.inner}</svg>`;
|
|
1753
|
-
return {
|
|
1754
|
-
kind: 'pattern',
|
|
1755
|
-
id: svgGradientId(elementId, 'strokepat'),
|
|
1756
|
-
width: tile.w,
|
|
1757
|
-
height: tile.h,
|
|
1758
|
-
href: `data:image/svg+xml,${encodeURIComponent(markup)}`,
|
|
1759
|
-
};
|
|
1760
|
-
}
|
|
1761
|
-
/** The `fill`/`stroke` attribute value that references a built definition. */
|
|
1762
|
-
function svgGradientFillRef(def) {
|
|
1763
|
-
return `url(#${def.id})`;
|
|
1764
|
-
}
|
|
1765
|
-
/** Escapes a value for safe use inside a double-quoted SVG/HTML attribute. */
|
|
1766
|
-
function escapeAttr$1(value) {
|
|
1767
|
-
return String(value)
|
|
1768
|
-
.replace(/&/gu, '&')
|
|
1769
|
-
.replace(/"/gu, '"')
|
|
1770
|
-
.replace(/</gu, '<')
|
|
1771
|
-
.replace(/>/gu, '>');
|
|
1772
|
-
}
|
|
1773
|
-
/** Coerces a value to a finite number and escapes it, for numeric attributes built into markup. */
|
|
1774
|
-
function numAttr(value) {
|
|
1775
|
-
return escapeAttr$1(String(Number.isFinite(value) ? value : 0));
|
|
1776
|
-
}
|
|
1777
|
-
/**
|
|
1778
|
-
* Serialise a definition to SVG markup, for bindings that build their DOM as a
|
|
1779
|
-
* string (the vanilla renderer) rather than through a component tree.
|
|
1780
|
-
*
|
|
1781
|
-
* Every interpolated field is escaped/coerced here even though upstream
|
|
1782
|
-
* builders already sanitize colours and ids: this is the string-concatenation
|
|
1783
|
-
* boundary that lands in `innerHTML`, so it stays safe on its own regardless
|
|
1784
|
-
* of how a `SvgGradientDef` was constructed.
|
|
1785
|
-
*/
|
|
1786
|
-
function svgGradientMarkup(def) {
|
|
1787
|
-
const id = escapeAttr$1(def.id);
|
|
1788
|
-
const stops = def.stops
|
|
1789
|
-
.map((stop) => `<stop offset="${numAttr(stop.offset)}" stop-color="${escapeAttr$1(stop.color)}"${typeof stop.opacity === 'number' ? ` stop-opacity="${numAttr(stop.opacity)}"` : ''}/>`)
|
|
1790
|
-
.join('');
|
|
1791
|
-
if (def.kind === 'radial') {
|
|
1792
|
-
return `<radialGradient id="${id}" cx="${numAttr(def.cx)}" cy="${numAttr(def.cy)}" r="${numAttr(def.r)}">${stops}</radialGradient>`;
|
|
1793
|
-
}
|
|
1794
|
-
return `<linearGradient id="${id}" x1="${numAttr(def.x1)}" y1="${numAttr(def.y1)}" x2="${numAttr(def.x2)}" y2="${numAttr(def.y2)}">${stops}</linearGradient>`;
|
|
1795
|
-
}
|
|
1796
|
-
|
|
1797
|
-
/**
|
|
1798
|
-
* Pure connector line-style helpers shared across bindings.
|
|
1799
|
-
*
|
|
1800
|
-
* Compound (double/triple) parallel-stroke geometry and connector-family
|
|
1801
|
-
* classification. No framework imports. The actual SVG `<marker>` / `<path>`
|
|
1802
|
-
* emission stays in each binding's view layer.
|
|
1803
|
-
*/
|
|
1804
|
-
/**
|
|
1805
|
-
* Compute perpendicular offsets for compound (double/triple) line styles.
|
|
1806
|
-
* Returns an array of offset distances from the centre line in px. A single
|
|
1807
|
-
* line style returns `[0]`.
|
|
1808
|
-
*
|
|
1809
|
-
* @param compoundLine - OOXML `a:ln/@cmpd` value (e.g. `"dbl"`, `"tri"`).
|
|
1810
|
-
* @param strokeWidth - The resolved stroke width in pixels.
|
|
1811
|
-
*/
|
|
1812
|
-
function getCompoundLineOffsets(compoundLine, strokeWidth) {
|
|
1813
|
-
if (!compoundLine || compoundLine === 'sng') {
|
|
1814
|
-
return [0];
|
|
1815
|
-
}
|
|
1816
|
-
const gap = Math.max(strokeWidth * 0.6, 1.5);
|
|
1817
|
-
if (compoundLine === 'dbl') {
|
|
1818
|
-
return [-gap, gap];
|
|
1819
|
-
}
|
|
1820
|
-
if (compoundLine === 'thickThin') {
|
|
1821
|
-
return [-gap * 0.6, gap];
|
|
1822
|
-
}
|
|
1823
|
-
if (compoundLine === 'thinThick') {
|
|
1824
|
-
return [-gap, gap * 0.6];
|
|
1825
|
-
}
|
|
1826
|
-
if (compoundLine === 'tri') {
|
|
1827
|
-
return [-gap, 0, gap];
|
|
1828
|
-
}
|
|
1829
|
-
return [0];
|
|
1830
|
-
}
|
|
1831
|
-
/**
|
|
1832
|
-
* Compute individual stroke widths for each parallel path in a compound line.
|
|
1833
|
-
* The array length matches the one returned by {@link getCompoundLineOffsets}.
|
|
1834
|
-
*
|
|
1835
|
-
* @param compoundLine - OOXML `a:ln/@cmpd` value.
|
|
1836
|
-
* @param strokeWidth - The resolved stroke width in pixels.
|
|
1837
|
-
*/
|
|
1838
|
-
function getCompoundLineWidths(compoundLine, strokeWidth) {
|
|
1839
|
-
const base = Math.max(strokeWidth, 1);
|
|
1840
|
-
if (!compoundLine || compoundLine === 'sng') {
|
|
1841
|
-
return [base];
|
|
1842
|
-
}
|
|
1843
|
-
if (compoundLine === 'dbl') {
|
|
1844
|
-
return [base * 0.5, base * 0.5];
|
|
1845
|
-
}
|
|
1846
|
-
if (compoundLine === 'thickThin') {
|
|
1847
|
-
return [base * 0.7, base * 0.3];
|
|
1848
|
-
}
|
|
1849
|
-
if (compoundLine === 'thinThick') {
|
|
1850
|
-
return [base * 0.3, base * 0.7];
|
|
1851
|
-
}
|
|
1852
|
-
if (compoundLine === 'tri') {
|
|
1853
|
-
return [base * 0.3, base * 0.4, base * 0.3];
|
|
1854
|
-
}
|
|
1855
|
-
return [base];
|
|
1856
|
-
}
|
|
1857
|
-
/**
|
|
1858
|
-
* Map an OOXML line-cap token (`a:ln/@cap`) to its SVG `stroke-linecap` value.
|
|
1859
|
-
*
|
|
1860
|
-
* `flat` -> `butt`, `sq` -> `square`, `rnd` -> `round`. Anything absent or
|
|
1861
|
-
* unrecognised falls back to `round`, matching the viewer's historical default.
|
|
1862
|
-
*/
|
|
1863
|
-
function svgLineCap(lineCap) {
|
|
1864
|
-
switch (lineCap) {
|
|
1865
|
-
case 'flat':
|
|
1866
|
-
return 'butt';
|
|
1867
|
-
case 'sq':
|
|
1868
|
-
return 'square';
|
|
1869
|
-
default:
|
|
1870
|
-
return 'round';
|
|
1871
|
-
}
|
|
1872
|
-
}
|
|
1873
|
-
/**
|
|
1874
|
-
* Classify a connector by its OOXML preset shape type (case-insensitive):
|
|
1875
|
-
* `bentConnector*` → `"bent"`, `curvedConnector*` → `"curved"`, everything
|
|
1876
|
-
* else (incl. `straightConnector1`) → `"straight"`.
|
|
1877
|
-
*/
|
|
1878
|
-
function connectorKind(shapeType) {
|
|
1879
|
-
const t = (shapeType ?? '').toLowerCase();
|
|
1880
|
-
if (t.includes('bentconnector')) {
|
|
1881
|
-
return 'bent';
|
|
1882
|
-
}
|
|
1883
|
-
if (t.includes('curvedconnector')) {
|
|
1884
|
-
return 'curved';
|
|
1885
|
-
}
|
|
1886
|
-
return 'straight';
|
|
1887
|
-
}
|
|
1888
|
-
/**
|
|
1889
|
-
* Determine whether a connector `shapeType` requires multi-segment (path)
|
|
1890
|
-
* rendering rather than a simple `<line>` element.
|
|
1891
|
-
*/
|
|
1892
|
-
function connectorNeedsPath(shapeType) {
|
|
1893
|
-
return connectorKind(shapeType) !== 'straight';
|
|
1894
|
-
}
|
|
1895
|
-
|
|
1896
1741
|
/**
|
|
1897
1742
|
* Normalizes a raw stroke dash type string to a valid `StrokeDashType` enum value.
|
|
1898
1743
|
* Performs case-insensitive matching against all OOXML dash types.
|
|
@@ -2268,6 +2113,190 @@ function strokeOnlyPresetPathData(element) {
|
|
|
2268
2113
|
return stroked.length > 0 ? stroked.join(' ') : undefined;
|
|
2269
2114
|
}
|
|
2270
2115
|
|
|
2116
|
+
/** Round to 4 decimals so the emitted markup stays stable and compact. */
|
|
2117
|
+
function round4(value) {
|
|
2118
|
+
return Math.round(value * 10000) / 10000;
|
|
2119
|
+
}
|
|
2120
|
+
/**
|
|
2121
|
+
* Namespace a gradient id to its owning element. SVG ids are document-global,
|
|
2122
|
+
* so two shapes with different gradients would otherwise collide on the first
|
|
2123
|
+
* one rendered; element ids carry `/` and `.` (`ppt/slides/slide2.xml-shape-4`),
|
|
2124
|
+
* which are not valid in a bare `url(#…)` fragment.
|
|
2125
|
+
*/
|
|
2126
|
+
function svgGradientId(elementId, suffix = 'grad') {
|
|
2127
|
+
const seed = String(elementId).replace(/[^a-zA-Z0-9_-]/gu, '_');
|
|
2128
|
+
return `pptx-${suffix}-${seed}`;
|
|
2129
|
+
}
|
|
2130
|
+
/** Convert sanitized 0-100 gradient stops into SVG 0-1 offsets. */
|
|
2131
|
+
function toSvgStops(stops) {
|
|
2132
|
+
return sanitizeGradientStops(stops).map((stop) => ({
|
|
2133
|
+
offset: round4(stop.position / 100),
|
|
2134
|
+
color: stop.color,
|
|
2135
|
+
...(typeof stop.opacity === 'number' ? { opacity: round4(stop.opacity) } : {}),
|
|
2136
|
+
}));
|
|
2137
|
+
}
|
|
2138
|
+
/**
|
|
2139
|
+
* Endpoints of the gradient line for an OOXML `a:lin/@ang`, in
|
|
2140
|
+
* `objectBoundingBox` units.
|
|
2141
|
+
*
|
|
2142
|
+
* `ang` is measured clockwise from the positive x-axis with y pointing down, so
|
|
2143
|
+
* the direction vector is `(cos a, sin a)` with no CSS-style quarter turn: SVG
|
|
2144
|
+
* shares OOXML's axis convention. The line is centred on the box and extended by
|
|
2145
|
+
* `|dx| + |dy|`, the projection of the unit square onto that direction, so the
|
|
2146
|
+
* first and last stops land exactly on the box edges the way PowerPoint draws
|
|
2147
|
+
* them.
|
|
2148
|
+
*
|
|
2149
|
+
* `a:lin/@scaled="1"` (the default) means the angle is measured in the shape's
|
|
2150
|
+
* unit square and then stretched to the real box - which is precisely what
|
|
2151
|
+
* `gradientUnits="objectBoundingBox"` does, so the raw angle is used as-is and
|
|
2152
|
+
* no aspect correction is applied here (unlike the CSS path, where the stretch
|
|
2153
|
+
* has to be simulated).
|
|
2154
|
+
*/
|
|
2155
|
+
function linearEndpoints(angleDegrees) {
|
|
2156
|
+
const radians = (angleDegrees * Math.PI) / 180;
|
|
2157
|
+
const dx = Math.cos(radians);
|
|
2158
|
+
const dy = Math.sin(radians);
|
|
2159
|
+
const span = (Math.abs(dx) + Math.abs(dy)) / 2;
|
|
2160
|
+
return {
|
|
2161
|
+
x1: round4(0.5 - dx * span),
|
|
2162
|
+
y1: round4(0.5 - dy * span),
|
|
2163
|
+
x2: round4(0.5 + dx * span),
|
|
2164
|
+
y2: round4(0.5 + dy * span),
|
|
2165
|
+
};
|
|
2166
|
+
}
|
|
2167
|
+
/** Shared builder behind the fill and stroke entry points. */
|
|
2168
|
+
function buildFromSource(source, id) {
|
|
2169
|
+
const { stops } = source;
|
|
2170
|
+
if (stops.length === 0) {
|
|
2171
|
+
return undefined;
|
|
2172
|
+
}
|
|
2173
|
+
if ((source.type || 'linear') === 'radial') {
|
|
2174
|
+
// Path gradients run from the `fillToRect` outwards, so stop 0 sits at the
|
|
2175
|
+
// centre exactly as an SVG radial gradient's offset 0 does.
|
|
2176
|
+
const { cx, cy } = computeGradientCenter(source.fillToRect, source.focalPoint);
|
|
2177
|
+
const fx = cx / 100;
|
|
2178
|
+
const fy = cy / 100;
|
|
2179
|
+
// Reach the farthest corner of the box, mirroring CSS's default
|
|
2180
|
+
// `farthest-corner` sizing, so the last stop is not cropped mid-shape.
|
|
2181
|
+
const r = Math.hypot(Math.max(fx, 1 - fx), Math.max(fy, 1 - fy));
|
|
2182
|
+
return { kind: 'radial', id, cx: round4(fx), cy: round4(fy), r: round4(r), stops };
|
|
2183
|
+
}
|
|
2184
|
+
const angle = typeof source.angle === 'number' && Number.isFinite(source.angle) ? source.angle : 90;
|
|
2185
|
+
return { kind: 'linear', id, ...linearEndpoints(angle), stops };
|
|
2186
|
+
}
|
|
2187
|
+
/**
|
|
2188
|
+
* Build the SVG paint-server definition for a shape's gradient FILL.
|
|
2189
|
+
*
|
|
2190
|
+
* Returns `undefined` unless the style is a gradient with usable structured
|
|
2191
|
+
* stops; callers keep their solid-colour path in that case (a prebuilt
|
|
2192
|
+
* `fillGradient` CSS string cannot be expressed as an SVG paint server).
|
|
2193
|
+
*
|
|
2194
|
+
* `a:gradFill/@flip` and `a:tileRect` are not modelled: SVG `spreadMethod` has
|
|
2195
|
+
* no per-tile mirror and freeform gradients in practice author neither.
|
|
2196
|
+
*
|
|
2197
|
+
* @param style - The resolved shape style carrying the gradient.
|
|
2198
|
+
* @param elementId - The owning element id, used to namespace the gradient id.
|
|
2199
|
+
*/
|
|
2200
|
+
function buildSvgGradientDef(style, elementId) {
|
|
2201
|
+
if (!style || style.fillMode !== 'gradient') {
|
|
2202
|
+
return undefined;
|
|
2203
|
+
}
|
|
2204
|
+
return buildFromSource({
|
|
2205
|
+
stops: toSvgStops(style.fillGradientStops),
|
|
2206
|
+
type: style.fillGradientType,
|
|
2207
|
+
angle: style.fillGradientAngle,
|
|
2208
|
+
fillToRect: style.fillGradientFillToRect,
|
|
2209
|
+
focalPoint: style.fillGradientFocalPoint,
|
|
2210
|
+
}, svgGradientId(elementId));
|
|
2211
|
+
}
|
|
2212
|
+
/**
|
|
2213
|
+
* Build the SVG paint-server definition for a shape's gradient OUTLINE
|
|
2214
|
+
* (`a:ln/a:gradFill`).
|
|
2215
|
+
*
|
|
2216
|
+
* A CSS `border` can only take one colour, so a gradient outline was painted
|
|
2217
|
+
* with the parser's averaged `strokeColor`: a two-tone outline came out flat and
|
|
2218
|
+
* a fade-to-transparent one came out fully opaque. Stroking an SVG path with
|
|
2219
|
+
* this paint server renders it properly.
|
|
2220
|
+
*
|
|
2221
|
+
* The id is namespaced separately from the fill's, so a shape with BOTH a
|
|
2222
|
+
* gradient fill and a gradient outline gets two distinct paint servers.
|
|
2223
|
+
*/
|
|
2224
|
+
function buildSvgStrokeGradientDef(style, elementId) {
|
|
2225
|
+
if (!style || style.strokeFillMode !== 'gradient') {
|
|
2226
|
+
return undefined;
|
|
2227
|
+
}
|
|
2228
|
+
return buildFromSource({
|
|
2229
|
+
stops: toSvgStops(style.strokeGradientStops),
|
|
2230
|
+
type: style.strokeGradientType,
|
|
2231
|
+
angle: style.strokeGradientAngle,
|
|
2232
|
+
}, svgGradientId(elementId, 'stroke'));
|
|
2233
|
+
}
|
|
2234
|
+
/**
|
|
2235
|
+
* Build the SVG paint-server definition for a shape's pattern OUTLINE
|
|
2236
|
+
* (`a:ln/a:pattFill`).
|
|
2237
|
+
*
|
|
2238
|
+
* A CSS `border` cannot be hatched, so a patterned outline was painted with the
|
|
2239
|
+
* parser's `strokeColor` - the pattern's foreground - as a flat line: the weave
|
|
2240
|
+
* disappeared entirely. Stroking a path with this pattern renders the real tile.
|
|
2241
|
+
*
|
|
2242
|
+
* Returns `undefined` when the outline is not a pattern or the preset is one we
|
|
2243
|
+
* do not draw, so callers keep the solid fallback.
|
|
2244
|
+
*/
|
|
2245
|
+
function buildSvgStrokePatternDef(style, elementId) {
|
|
2246
|
+
if (!style || style.strokeFillMode !== 'pattern' || !style.strokePatternPreset) {
|
|
2247
|
+
return undefined;
|
|
2248
|
+
}
|
|
2249
|
+
const fg = normalizeHexColor$1(style.strokeColor, '#000000');
|
|
2250
|
+
const bg = normalizeHexColor$1(style.strokePatternBackgroundColor, '#ffffff');
|
|
2251
|
+
const tile = getPatternTile(style.strokePatternPreset, fg, bg);
|
|
2252
|
+
if (!tile) {
|
|
2253
|
+
return undefined;
|
|
2254
|
+
}
|
|
2255
|
+
const markup = `<svg xmlns="http://www.w3.org/2000/svg" width="${tile.w}" height="${tile.h}">${tile.inner}</svg>`;
|
|
2256
|
+
return {
|
|
2257
|
+
kind: 'pattern',
|
|
2258
|
+
id: svgGradientId(elementId, 'strokepat'),
|
|
2259
|
+
width: tile.w,
|
|
2260
|
+
height: tile.h,
|
|
2261
|
+
href: `data:image/svg+xml,${encodeURIComponent(markup)}`,
|
|
2262
|
+
};
|
|
2263
|
+
}
|
|
2264
|
+
/** The `fill`/`stroke` attribute value that references a built definition. */
|
|
2265
|
+
function svgGradientFillRef(def) {
|
|
2266
|
+
return `url(#${def.id})`;
|
|
2267
|
+
}
|
|
2268
|
+
/** Escapes a value for safe use inside a double-quoted SVG/HTML attribute. */
|
|
2269
|
+
function escapeAttr$1(value) {
|
|
2270
|
+
return String(value)
|
|
2271
|
+
.replace(/&/gu, '&')
|
|
2272
|
+
.replace(/"/gu, '"')
|
|
2273
|
+
.replace(/</gu, '<')
|
|
2274
|
+
.replace(/>/gu, '>');
|
|
2275
|
+
}
|
|
2276
|
+
/** Coerces a value to a finite number and escapes it, for numeric attributes built into markup. */
|
|
2277
|
+
function numAttr(value) {
|
|
2278
|
+
return escapeAttr$1(String(Number.isFinite(value) ? value : 0));
|
|
2279
|
+
}
|
|
2280
|
+
/**
|
|
2281
|
+
* Serialise a definition to SVG markup, for bindings that build their DOM as a
|
|
2282
|
+
* string (the vanilla renderer) rather than through a component tree.
|
|
2283
|
+
*
|
|
2284
|
+
* Every interpolated field is escaped/coerced here even though upstream
|
|
2285
|
+
* builders already sanitize colours and ids: this is the string-concatenation
|
|
2286
|
+
* boundary that lands in `innerHTML`, so it stays safe on its own regardless
|
|
2287
|
+
* of how a `SvgGradientDef` was constructed.
|
|
2288
|
+
*/
|
|
2289
|
+
function svgGradientMarkup(def) {
|
|
2290
|
+
const id = escapeAttr$1(def.id);
|
|
2291
|
+
const stops = def.stops
|
|
2292
|
+
.map((stop) => `<stop offset="${numAttr(stop.offset)}" stop-color="${escapeAttr$1(stop.color)}"${typeof stop.opacity === 'number' ? ` stop-opacity="${numAttr(stop.opacity)}"` : ''}/>`)
|
|
2293
|
+
.join('');
|
|
2294
|
+
if (def.kind === 'radial') {
|
|
2295
|
+
return `<radialGradient id="${id}" cx="${numAttr(def.cx)}" cy="${numAttr(def.cy)}" r="${numAttr(def.r)}">${stops}</radialGradient>`;
|
|
2296
|
+
}
|
|
2297
|
+
return `<linearGradient id="${id}" x1="${numAttr(def.x1)}" y1="${numAttr(def.y1)}" x2="${numAttr(def.x2)}" y2="${numAttr(def.y2)}">${stops}</linearGradient>`;
|
|
2298
|
+
}
|
|
2299
|
+
|
|
2271
2300
|
/**
|
|
2272
2301
|
* Width PowerPoint paints an open preset with when the shape declares no line
|
|
2273
2302
|
* width at all. Matches the connector renderers, which have always defaulted a
|
|
@@ -2410,6 +2439,111 @@ function suppressesCssBorder(element) {
|
|
|
2410
2439
|
return buildStrokeOutline(element) !== undefined;
|
|
2411
2440
|
}
|
|
2412
2441
|
|
|
2442
|
+
/**
|
|
2443
|
+
* Narrowest a hollow frame's outline hit band may be, in px.
|
|
2444
|
+
*
|
|
2445
|
+
* WHY a floor: a hairline frame is one or two px of ink, and a target that thin
|
|
2446
|
+
* cannot be hit with a mouse, never mind a finger. Matches the generosity
|
|
2447
|
+
* `connector-hit-target` already applies to a line.
|
|
2448
|
+
*/
|
|
2449
|
+
const HOLLOW_HIT_MIN_WIDTH = 10;
|
|
2450
|
+
/**
|
|
2451
|
+
* Whether PowerPoint would let a click fall THROUGH this shape's interior.
|
|
2452
|
+
*
|
|
2453
|
+
* True only for a shape that has no fill of any kind and carries no text, i.e.
|
|
2454
|
+
* a pure frame.
|
|
2455
|
+
*
|
|
2456
|
+
* @param element The element to test.
|
|
2457
|
+
* @returns `true` when the interior should not capture pointer events.
|
|
2458
|
+
*/
|
|
2459
|
+
function isHollowShapeElement(element) {
|
|
2460
|
+
if (element.type !== 'shape' || !hasShapeProperties(element)) {
|
|
2461
|
+
return false;
|
|
2462
|
+
}
|
|
2463
|
+
const style = element.shapeStyle;
|
|
2464
|
+
const filled = (style?.fillColor !== undefined && style.fillColor !== 'transparent') ||
|
|
2465
|
+
style?.fillMode === 'gradient' ||
|
|
2466
|
+
style?.fillMode === 'pattern' ||
|
|
2467
|
+
style?.fillMode === 'image' ||
|
|
2468
|
+
style?.fillMode === 'group' ||
|
|
2469
|
+
Boolean(style?.fillGradient);
|
|
2470
|
+
if (filled) {
|
|
2471
|
+
return false;
|
|
2472
|
+
}
|
|
2473
|
+
return getElementTextContent(element).trim() === '';
|
|
2474
|
+
}
|
|
2475
|
+
/**
|
|
2476
|
+
* Build the transparent outline hit target for a hollow shape.
|
|
2477
|
+
*
|
|
2478
|
+
* @param element The element to build a target for.
|
|
2479
|
+
* @returns The outline path and band width, or `undefined` when the element is
|
|
2480
|
+
* not hollow (in which case its box should hit-test normally).
|
|
2481
|
+
*/
|
|
2482
|
+
function buildHollowHitOutline(element) {
|
|
2483
|
+
if (!isHollowShapeElement(element)) {
|
|
2484
|
+
return undefined;
|
|
2485
|
+
}
|
|
2486
|
+
const d = outlinePathData(getResolvedShapeClipPath(element), element.width, element.height);
|
|
2487
|
+
if (!d) {
|
|
2488
|
+
return undefined;
|
|
2489
|
+
}
|
|
2490
|
+
const strokeWidth = hasShapeProperties(element) ? (element.shapeStyle?.strokeWidth ?? 0) : 0;
|
|
2491
|
+
return { d, strokeWidth: Math.max(strokeWidth * 3, HOLLOW_HIT_MIN_WIDTH) };
|
|
2492
|
+
}
|
|
2493
|
+
|
|
2494
|
+
/** Cylinder's CSS radius approximation (per-axis, so it survives non-square). */
|
|
2495
|
+
const CYLINDER_RADIUS = '48% / 12%';
|
|
2496
|
+
/** Below this, a roundRect's radius is not worth emitting. */
|
|
2497
|
+
const MIN_ROUND_RECT_RADIUS_PX = 0.01;
|
|
2498
|
+
/**
|
|
2499
|
+
* Resolve a shape element's geometry to a neutral painting decision.
|
|
2500
|
+
*
|
|
2501
|
+
* Order is load-bearing and matches PowerPoint's own precedence: connectors and
|
|
2502
|
+
* open presets never get a box, the two cheap radius approximations win over a
|
|
2503
|
+
* clip-path, and `line`/`cylinder` are consulted only once the evaluator has
|
|
2504
|
+
* declined to produce geometry.
|
|
2505
|
+
*
|
|
2506
|
+
* @param element The shape-like element to resolve.
|
|
2507
|
+
* @returns The decision a binding should apply to its style object.
|
|
2508
|
+
*/
|
|
2509
|
+
function resolveShapeGeometry(element) {
|
|
2510
|
+
const shapeType = getShapeType(element.shapeType);
|
|
2511
|
+
if (element.type === 'connector' || shapeType === 'connector') {
|
|
2512
|
+
return { kind: 'bare' };
|
|
2513
|
+
}
|
|
2514
|
+
// Open presets have no region to fill and no box to outline; the clip in
|
|
2515
|
+
// particular encloses zero area and would clip the stroked overlay away.
|
|
2516
|
+
if (isStrokeOnlyPresetElement(element)) {
|
|
2517
|
+
return { kind: 'strokeOnly' };
|
|
2518
|
+
}
|
|
2519
|
+
if (shapeType === 'roundRect' && hasShapeProperties(element)) {
|
|
2520
|
+
const radiusPx = getRoundRectRadiusPx$1(element);
|
|
2521
|
+
return radiusPx > MIN_ROUND_RECT_RADIUS_PX
|
|
2522
|
+
? { kind: 'borderRadius', radius: `${radiusPx}px` }
|
|
2523
|
+
: { kind: 'none' };
|
|
2524
|
+
}
|
|
2525
|
+
// `50%`, never a large px value: CSS clamps over-large radii by scaling them
|
|
2526
|
+
// all down uniformly, so a px radius collapses to half the SHORT side on
|
|
2527
|
+
// every corner and paints a pill with flat long edges.
|
|
2528
|
+
if (shapeType === 'ellipse') {
|
|
2529
|
+
return { kind: 'borderRadius', radius: '50%' };
|
|
2530
|
+
}
|
|
2531
|
+
// A rect preset's clip is its own bounding box: skip it so overflowing text
|
|
2532
|
+
// spills visibly (as PowerPoint does) instead of being sliced.
|
|
2533
|
+
const clipPath = isIdentityRectClip(element) ? undefined : getResolvedShapeClipPath(element);
|
|
2534
|
+
if (clipPath) {
|
|
2535
|
+
return { kind: 'clipPath', clipPath };
|
|
2536
|
+
}
|
|
2537
|
+
if (shapeType === 'line') {
|
|
2538
|
+
const authored = element.shapeStyle?.strokeWidth;
|
|
2539
|
+
return { kind: 'lineEdge', strokeWidth: Math.max(Math.max(0, authored ?? 0), 2) };
|
|
2540
|
+
}
|
|
2541
|
+
if (shapeType === 'cylinder') {
|
|
2542
|
+
return { kind: 'borderRadius', radius: CYLINDER_RADIUS };
|
|
2543
|
+
}
|
|
2544
|
+
return { kind: 'none' };
|
|
2545
|
+
}
|
|
2546
|
+
|
|
2413
2547
|
/**
|
|
2414
2548
|
* Should this shape/picture outline be painted at all?
|
|
2415
2549
|
*
|
|
@@ -10192,6 +10326,14 @@ function buildMultiLevelCategoryLabels(categoryLabels, categoryLevels, sourceInd
|
|
|
10192
10326
|
// Band height tracks the rendered px size (axis.fontSize is parsed in points).
|
|
10193
10327
|
const fontPx = axis?.fontSize !== undefined ? chartFontPx(axis.fontSize) : DEFAULT_CHART_TEXT_PX;
|
|
10194
10328
|
const bandHeight = Math.max(fontPx, 8) + 4;
|
|
10329
|
+
// `SvgText.y` is the ALPHABETIC BASELINE (this is the one label emitter that
|
|
10330
|
+
// does not set `dominant-baseline`), so `offset` - the gap `c:lblOffset` asks
|
|
10331
|
+
// for between the axis and its labels - only becomes a real gap once the
|
|
10332
|
+
// glyph ascent is added below the axis, or the descent removed above it.
|
|
10333
|
+
// Without this the ink of a label under the axis starts ~0.8 em higher than
|
|
10334
|
+
// intended and crowds the plot: measured against PowerPoint the gap was 1.2px
|
|
10335
|
+
// where it should be 17.6px.
|
|
10336
|
+
const baselineShift = labelsAbove ? -0.2 * fontPx : 0.8 * fontPx;
|
|
10195
10337
|
return levels.flatMap((level, levelIndex) => {
|
|
10196
10338
|
const values = sourceIndices.map((sourceIndex) => level[sourceIndex] ?? '');
|
|
10197
10339
|
return groupedLabels(values).flatMap((group) => {
|
|
@@ -10204,7 +10346,7 @@ function buildMultiLevelCategoryLabels(categoryLabels, categoryLevels, sourceInd
|
|
|
10204
10346
|
{
|
|
10205
10347
|
kind: 'text',
|
|
10206
10348
|
x: (startX + endX) / 2,
|
|
10207
|
-
y: labelY + direction * (offset + levelIndex * bandHeight),
|
|
10349
|
+
y: labelY + direction * (offset + levelIndex * bandHeight) + baselineShift,
|
|
10208
10350
|
text: group.text,
|
|
10209
10351
|
textAnchor,
|
|
10210
10352
|
...chartAxisTextStyle(axis),
|
|
@@ -14525,6 +14667,25 @@ function formatAxisValue(val, formatCode) {
|
|
|
14525
14667
|
* viewer-first single-axis layout; the secondary-axis / data-table reservations
|
|
14526
14668
|
* only apply when explicitly requested.
|
|
14527
14669
|
*/
|
|
14670
|
+
/**
|
|
14671
|
+
* Vertical space to reserve under the plot for the category axis: the gap
|
|
14672
|
+
* `c:lblOffset` asks for, plus one line box of the axis font.
|
|
14673
|
+
*
|
|
14674
|
+
* The old flat 24 px was calibrated when chart text was drawn pt-as-px. Once
|
|
14675
|
+
* `chartFontPx` scaled every label by 4/3, an 11.95 pt axis no longer fitted in
|
|
14676
|
+
* 24 px and its labels were pushed back up onto the plot. The `Math.max(24, …)`
|
|
14677
|
+
* floor keeps the previous behaviour for default-font and axis-less charts, so
|
|
14678
|
+
* only oversized-font charts move.
|
|
14679
|
+
*
|
|
14680
|
+
* @param chartData The chart whose category axis is being measured.
|
|
14681
|
+
* @returns Pixels to reserve below the plot area.
|
|
14682
|
+
*/
|
|
14683
|
+
function categoryAxisBand(chartData) {
|
|
14684
|
+
const axis = chartData.axes?.find((candidate) => candidate.axisType === 'catAx' || candidate.axisType === 'dateAx');
|
|
14685
|
+
const fontPx = axis?.fontSize !== undefined ? chartFontPx(axis.fontSize) : DEFAULT_CHART_TEXT_PX;
|
|
14686
|
+
const offset = 4 + 8 * ((axis?.labelOffset ?? 100) / 100);
|
|
14687
|
+
return Math.max(24, offset + fontPx * 1.2);
|
|
14688
|
+
}
|
|
14528
14689
|
function computePlotLayout(elementWidth, elementHeight, chartData, hasAxes, options) {
|
|
14529
14690
|
// The SVG viewBox must equal the element's frame box exactly: bindings render
|
|
14530
14691
|
// it with `preserveAspectRatio="none"`, so ANY minimum here (historically
|
|
@@ -14535,7 +14696,7 @@ function computePlotLayout(elementWidth, elementHeight, chartData, hasAxes, opti
|
|
|
14535
14696
|
let plotLeft = hasAxes ? 48 : 8;
|
|
14536
14697
|
let plotTop = 8;
|
|
14537
14698
|
let plotRight = svgWidth - 8;
|
|
14538
|
-
let plotBottom = svgHeight - (hasAxes ?
|
|
14699
|
+
let plotBottom = svgHeight - (hasAxes ? categoryAxisBand(chartData) : 8);
|
|
14539
14700
|
const style = chartData.style;
|
|
14540
14701
|
const legendPos = style?.legendPosition ?? 'b';
|
|
14541
14702
|
if (style?.hasTitle) {
|
|
@@ -63645,7 +63806,7 @@ function createLocalStorageBackend(namespace) {
|
|
|
63645
63806
|
/** Try IndexedDB first; fall back to localStorage on any failure. */
|
|
63646
63807
|
async function resolveBackend(dbName, namespace) {
|
|
63647
63808
|
try {
|
|
63648
|
-
const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-
|
|
63809
|
+
const { openChatDb, createIdbBackend } = await import('./pptx-angular-viewer-chat-history-idb-Bdm_ufPN.mjs');
|
|
63649
63810
|
const db = await openChatDb(dbName);
|
|
63650
63811
|
return createIdbBackend(db);
|
|
63651
63812
|
}
|
|
@@ -74906,6 +75067,13 @@ function getShapeFillStrokeStyle(el, parentGroupFill, animatesFill, animatesStro
|
|
|
74906
75067
|
// every other preset geometry falls back to an SVG `clip-path` derived from
|
|
74907
75068
|
// the core geometry engine (mirrors the Vue port's cascade). Plain
|
|
74908
75069
|
// rectangles resolve to `undefined` and stay unclipped.
|
|
75070
|
+
// An unfilled, textless shape is a FRAME: PowerPoint hit-tests it on its
|
|
75071
|
+
// outline only, so its interior must not swallow clicks meant for what it is
|
|
75072
|
+
// drawn over. ShapeEffectOverlay paints a transparent pointer-events:stroke
|
|
75073
|
+
// band that opts the outline back in.
|
|
75074
|
+
if (isHollowShapeElement(el)) {
|
|
75075
|
+
style['pointer-events'] = 'none';
|
|
75076
|
+
}
|
|
74909
75077
|
const shapeType = 'shapeType' in el ? el.shapeType : undefined;
|
|
74910
75078
|
if (shapeType === 'ellipse' || shapeType === 'circle') {
|
|
74911
75079
|
style['border-radius'] = '50%';
|
|
@@ -74915,7 +75083,9 @@ function getShapeFillStrokeStyle(el, parentGroupFill, animatesFill, animatesStro
|
|
|
74915
75083
|
style['border-radius'] = px$1(Math.min(el.width, el.height) * 0.1);
|
|
74916
75084
|
return style;
|
|
74917
75085
|
}
|
|
74918
|
-
|
|
75086
|
+
// A rect preset's clip is its own box: skip it so overflowing text spills
|
|
75087
|
+
// visibly (as PowerPoint does) instead of being sliced.
|
|
75088
|
+
const clipPath = isIdentityRectClip(el) ? undefined : getResolvedShapeClipPath(el);
|
|
74919
75089
|
if (clipPath) {
|
|
74920
75090
|
style['clip-path'] = clipPath;
|
|
74921
75091
|
}
|
|
@@ -78074,6 +78244,13 @@ class ElementRendererComponent {
|
|
|
78074
78244
|
/** viewBox in the element's PAINTED box, which the path data is authored in. */
|
|
78075
78245
|
outlineViewBox = computed(() => strokeOutlineViewBox(this.element()), /* @ts-ignore */
|
|
78076
78246
|
...(ngDevMode ? [{ debugName: "outlineViewBox" }] : /* istanbul ignore next */ []));
|
|
78247
|
+
/**
|
|
78248
|
+
* Transparent outline hit band for an unfilled, textless shape. Its container
|
|
78249
|
+
* is `pointer-events: none` so clicks fall through to whatever it is drawn
|
|
78250
|
+
* over; this opts the OUTLINE back in (same trick as the connector target).
|
|
78251
|
+
*/
|
|
78252
|
+
hollowHit = computed(() => buildHollowHitOutline(this.element()), /* @ts-ignore */
|
|
78253
|
+
...(ngDevMode ? [{ debugName: "hollowHit" }] : /* istanbul ignore next */ []));
|
|
78077
78254
|
fillOverlay = computed(() => getEffectFillOverlay(this.element()), /* @ts-ignore */
|
|
78078
78255
|
...(ngDevMode ? [{ debugName: "fillOverlay" }] : /* istanbul ignore next */ []));
|
|
78079
78256
|
/**
|
|
@@ -78389,7 +78566,7 @@ class ElementRendererComponent {
|
|
|
78389
78566
|
}, /* @ts-ignore */
|
|
78390
78567
|
...(ngDevMode ? [{ debugName: "placeholderLabel" }] : /* istanbul ignore next */ []));
|
|
78391
78568
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: ElementRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
78392
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.0", type: ElementRendererComponent, isStandalone: true, selector: "pptx-element-renderer", inputs: { element: { classPropertyName: "element", publicName: "element", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, obstacles: { classPropertyName: "obstacles", publicName: "obstacles", isSignal: true, isRequired: false, transformFunction: null }, canvasWidth: { classPropertyName: "canvasWidth", publicName: "canvasWidth", isSignal: true, isRequired: false, transformFunction: null }, canvasHeight: { classPropertyName: "canvasHeight", publicName: "canvasHeight", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, marked: { classPropertyName: "marked", publicName: "marked", isSignal: true, isRequired: false, transformFunction: null }, presenting: { classPropertyName: "presenting", publicName: "presenting", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, fieldContext: { classPropertyName: "fieldContext", publicName: "fieldContext", isSignal: true, isRequired: false, transformFunction: null }, slideElements: { classPropertyName: "slideElements", publicName: "slideElements", isSignal: true, isRequired: false, transformFunction: null }, editTemplateMode: { classPropertyName: "editTemplateMode", publicName: "editTemplateMode", isSignal: true, isRequired: false, transformFunction: null }, parentGroupFill: { classPropertyName: "parentGroupFill", publicName: "parentGroupFill", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { cellCommit: "cellCommit", tableChange: "tableChange" }, host: { classAttribute: "contents" }, ngImport: i0, template: "@switch (true) {\n\t@case (isHidden()) {\n\t\t<!--\n\t\t\tHidden via the Selection Pane: draw nothing, exactly as PowerPoint\n\t\t\tdoes. This is the FIRST case on purpose - @switch takes the first\n\t\t\tmatch, so one empty branch suppresses every element type at once\n\t\t\twithout wrapping (and re-indenting) the whole template. The host\n\t\t\tcarries \\`display: contents\\`, so an empty component collapses.\n\t\t\tRendering nothing (rather than an invisible box) is what keeps the\n\t\t\telement out of hit-testing, the tab order and the export raster; it\n\t\t\tstays listed in and selectable from the Selection Pane, which reads\n\t\t\tthe slide model rather than the DOM.\n\t\t-->\n\t}\n\t@case (element().type === 'connector') {\n\t\t<pptx-connector-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[obstacles]=\"obstacles()\"\n\t\t\t[canvasWidth]=\"canvasWidth()\"\n\t\t\t[canvasHeight]=\"canvasHeight()\"\n\t\t\t[interactive]=\"interactive()\"\n\t\t\t[marked]=\"elementMarked()\"\n\t\t\t[animationState]=\"animationState()\"\n\t\t/>\n\t}\n\t@case (element().type === 'ink') {\n\t\t<!--\n\t\t\tThis renderer (and zoom / model3d / 3D SmartArt below) positions its\n\t\t\town root box, so it takes the neutral element marker\n\t\t\t(data-pptx-element) as an input instead of being wrapped in a marked\n\t\t\tbox the way chart / table / OLE are: an outer positioned box would\n\t\t\toffset it twice.\n\t\t-->\n\t\t<pptx-ink-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[replay]=\"presenting()\"\n\t\t\t[markElement]=\"elementMarked()\"\n\t\t/>\n\t}\n\t@case (element().type === 'zoom') {\n\t\t<pptx-zoom-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[markElement]=\"elementMarked()\"\n\t\t/>\n\t}\n\t@case (element().type === 'model3d') {\n\t\t<pptx-model3d-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[markElement]=\"elementMarked()\"\n\t\t/>\n\t}\n\t@case (element().type === 'smartArt' && smartArt3D()) {\n\t\t<pptx-smart-art-3d-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[canEdit]=\"interactive() && editable()\"\n\t\t\t[markElement]=\"elementMarked()\"\n\t\t/>\n\t}\n\t@case (element().type === 'smartArt') {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-smartart\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t<pptx-smart-art-renderer\n\t\t\t\t[element]=\"element()\"\n\t\t\t\t[editable]=\"interactive() && editable()\"\n\t\t\t\t[animationState]=\"animationState()\"\n\t\t\t/>\n\t\t</div>\n\t}\n\t@case (element().type === 'ole') {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-ole\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t<pptx-ole-renderer [element]=\"element()\" />\n\t\t</div>\n\t}\n\t@case (element().type === 'chart') {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-chart\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t<pptx-chart-element-view\n\t\t\t\t[element]=\"element()\"\n\t\t\t\t[editable]=\"interactive() && editable()\"\n\t\t\t\t[animationState]=\"animationState()\"\n\t\t\t/>\n\t\t</div>\n\t}\n\t@case (element().type === 'table') {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-table\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t<pptx-table-renderer\n\t\t\t\t[element]=\"element()\"\n\t\t\t\t[editable]=\"interactive() && editable()\"\n\t\t\t\t(cellCommit)=\"cellCommit.emit({ id: element().id, commit: $event })\"\n\t\t\t\t(tableChange)=\"tableChange.emit($event)\"\n\t\t\t/>\n\t\t</div>\n\t}\n\t@case (element().type === 'group') {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-group\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t@for (child of children(); track child.id) {\n\t\t\t\t<pptx-element-renderer\n\t\t\t\t\t[element]=\"child\"\n\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t[zIndex]=\"$index\"\n\t\t\t\t\t[interactive]=\"interactive()\"\n\t\t\t\t\t[marked]=\"marked()\"\n\t\t\t\t\t[presenting]=\"presenting()\"\n\t\t\t\t\t[fieldContext]=\"fieldContext()\"\n\t\t\t\t\t[slideElements]=\"slideElements()\"\n\t\t\t\t\t[parentGroupFill]=\"childParentGroupFill()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t</div>\n\t}\n\t@case (isImageLike()) {\n\t\t<pptx-image-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[interactive]=\"interactive()\"\n\t\t\t[marked]=\"elementMarked()\"\n\t\t/>\n\t}\n\t@case (element().type === 'media') {\n\t\t<pptx-media-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[interactive]=\"interactive()\"\n\t\t\t[marked]=\"elementMarked()\"\n\t\t\t[presenting]=\"presenting()\"\n\t\t\t[placeholderLabel]=\"placeholderLabel()\"\n\t\t/>\n\t}\n\t@case (isShapeLike()) {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-shape\"\n\t\t\t[ngStyle]=\"shapeContainerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t@if (fillOverlay(); as ov) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-fill-overlay\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tstyle=\"position: absolute; inset: 0; pointer-events: none\"\n\t\t\t\t\t[style.background]=\"ov.color\"\n\t\t\t\t\t[style.mix-blend-mode]=\"ov.blendMode\"\n\t\t\t\t></div>\n\t\t\t}\n\t\t\t<!-- Stroked outline: a CSS border takes one flat colour, and cannot\n\t\t\t outline an open preset (`line`, `arc`) at all. -->\n\t\t\t@if (gradientOutline(); as go) {\n\t\t\t\t<svg\n\t\t\t\t\tclass=\"pptx-ng-gradient-outline\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t[attr.viewBox]=\"outlineViewBox()\"\n\t\t\t\t\tpreserveAspectRatio=\"none\"\n\t\t\t\t\tstyle=\"\n\t\t\t\t\t\tposition: absolute;\n\t\t\t\t\t\tinset: 0;\n\t\t\t\t\t\twidth: 100%;\n\t\t\t\t\t\theight: 100%;\n\t\t\t\t\t\toverflow: visible;\n\t\t\t\t\t\tpointer-events: none;\n\t\t\t\t\t\"\n\t\t\t\t>\n\t\t\t\t\t@if (go.paint; as paint) {\n\t\t\t\t\t\t<defs>\n\t\t\t\t\t\t\t@if (paint.kind === 'pattern') {\n\t\t\t\t\t\t\t\t<pattern\n\t\t\t\t\t\t\t\t\t[attr.id]=\"paint.id\"\n\t\t\t\t\t\t\t\t\t[attr.width]=\"paint.width\"\n\t\t\t\t\t\t\t\t\t[attr.height]=\"paint.height\"\n\t\t\t\t\t\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<image\n\t\t\t\t\t\t\t\t\t\t[attr.href]=\"paint.href\"\n\t\t\t\t\t\t\t\t\t\t[attr.width]=\"paint.width\"\n\t\t\t\t\t\t\t\t\t\t[attr.height]=\"paint.height\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</pattern>\n\t\t\t\t\t\t\t} @else if (paint.kind === 'radial') {\n\t\t\t\t\t\t\t\t<radialGradient\n\t\t\t\t\t\t\t\t\t[attr.id]=\"paint.id\"\n\t\t\t\t\t\t\t\t\t[attr.cx]=\"paint.cx\"\n\t\t\t\t\t\t\t\t\t[attr.cy]=\"paint.cy\"\n\t\t\t\t\t\t\t\t\t[attr.r]=\"paint.r\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t@for (stop of paint.stops; track $index) {\n\t\t\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\t\t\t[attr.offset]=\"stop.offset\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-color]=\"stop.color\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-opacity]=\"stop.opacity\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</radialGradient>\n\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t<linearGradient\n\t\t\t\t\t\t\t\t\t[attr.id]=\"paint.id\"\n\t\t\t\t\t\t\t\t\t[attr.x1]=\"paint.x1\"\n\t\t\t\t\t\t\t\t\t[attr.y1]=\"paint.y1\"\n\t\t\t\t\t\t\t\t\t[attr.x2]=\"paint.x2\"\n\t\t\t\t\t\t\t\t\t[attr.y2]=\"paint.y2\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t@for (stop of paint.stops; track $index) {\n\t\t\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\t\t\t[attr.offset]=\"stop.offset\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-color]=\"stop.color\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-opacity]=\"stop.opacity\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</defs>\n\t\t\t\t\t}\n\t\t\t\t\t@for (strand of go.strands; track $index) {\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t[attr.d]=\"go.d\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t[attr.stroke]=\"go.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"strand.strokeWidth\"\n\t\t\t\t\t\t\t[attr.stroke-dasharray]=\"go.dashArray\"\n\t\t\t\t\t\t\t[attr.stroke-linecap]=\"go.lineCap\"\n\t\t\t\t\t\t\t[attr.stroke-linejoin]=\"go.lineJoin\"\n\t\t\t\t\t\t\t[style.transform]=\"\n\t\t\t\t\t\t\t\tstrand.offset !== 0 ? 'translate(0, ' + strand.offset + 'px)' : null\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t</svg>\n\t\t\t}\n\t\t\t@if (pathWarp(); as warp) {\n\t\t\t\t<svg\n\t\t\t\t\t[attr.width]=\"warp.width\"\n\t\t\t\t\t[attr.height]=\"warp.height\"\n\t\t\t\t\t[attr.viewBox]=\"'0 0 ' + warp.width + ' ' + warp.height\"\n\t\t\t\t\tstyle=\"position: absolute; inset: 0; overflow: visible; pointer-events: none\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t@for (line of warp.pathLines; track line.pathId) {\n\t\t\t\t\t\t\t<path [attr.id]=\"line.pathId\" [attr.d]=\"line.d\" fill=\"none\" />\n\t\t\t\t\t\t}\n\t\t\t\t\t</defs>\n\t\t\t\t\t@for (line of warp.pathLines; track line.pathId) {\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t[attr.font-size]=\"warp.baseFontSize\"\n\t\t\t\t\t\t\t[attr.font-family]=\"warp.baseFontFamily\"\n\t\t\t\t\t\t\t[attr.fill]=\"warp.baseColor\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<textPath\n\t\t\t\t\t\t\t\t[attr.href]=\"'#' + line.pathId\"\n\t\t\t\t\t\t\t\t[attr.startOffset]=\"warp.startOffset\"\n\t\t\t\t\t\t\t\t[attr.text-anchor]=\"warp.textAnchor\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t@for (seg of line.segments; track $index) {\n\t\t\t\t\t\t\t\t\t<tspan\n\t\t\t\t\t\t\t\t\t\t[attr.fill]=\"seg.style?.color ?? warp.baseColor\"\n\t\t\t\t\t\t\t\t\t\t[attr.font-weight]=\"seg.style?.bold ? 700 : 400\"\n\t\t\t\t\t\t\t\t\t\t[attr.font-style]=\"seg.style?.italic ? 'italic' : 'normal'\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{{ seg.text }}\n\t\t\t\t\t\t\t\t\t</tspan>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</textPath>\n\t\t\t\t\t\t</text>\n\t\t\t\t\t}\n\t\t\t\t</svg>\n\t\t\t} @else if (hasText()) {\n\t\t\t\t<div class=\"pptx-ng-text\" [ngStyle]=\"warpedTextStyle()\">\n\t\t\t\t\t@for (para of paragraphs(); track $index) {\n\t\t\t\t\t\t<p\n\t\t\t\t\t\t\tclass=\"pptx-ng-para\"\n\t\t\t\t\t\t\t[style.padding-left.px]=\"para.indentPx\"\n\t\t\t\t\t\t\t[style.text-indent.px]=\"para.textIndentPx ?? null\"\n\t\t\t\t\t\t\t[style.line-height]=\"para.lineHeight ?? null\"\n\t\t\t\t\t\t\t[style.margin-top.px]=\"para.spaceBeforePx ?? null\"\n\t\t\t\t\t\t\t[style.margin-bottom.px]=\"para.spaceAfterPx ?? null\"\n\t\t\t\t\t\t\t[style.font-size.px]=\"para.strutFontSizePx ?? null\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@if (para.bulletPicture?.src) {\n\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-bullet-image\"\n\t\t\t\t\t\t\t\t\t[src]=\"para.bulletPicture.src\"\n\t\t\t\t\t\t\t\t\t[alt]=\"para.bulletPicture.accessibleLabel\"\n\t\t\t\t\t\t\t\t\t[style.width.px]=\"para.bulletPicture.sizePx\"\n\t\t\t\t\t\t\t\t\t[style.height.px]=\"para.bulletPicture.sizePx\"\n\t\t\t\t\t\t\t\t\tstyle=\"\n\t\t\t\t\t\t\t\t\t\tdisplay: inline-block;\n\t\t\t\t\t\t\t\t\t\tvertical-align: middle;\n\t\t\t\t\t\t\t\t\t\tmargin-inline-end: 4px;\n\t\t\t\t\t\t\t\t\t\tobject-fit: contain;\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t} @else if (para.bulletMarker) {\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-bullet\"\n\t\t\t\t\t\t\t\t\t[ngStyle]=\"para.bulletStyle\"\n\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"para.bulletPicture?.accessibleLabel ?? null\"\n\t\t\t\t\t\t\t\t\t>{{ para.bulletMarker }}</span\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t@if (textBuildSpecs()[$index]; as spec) {\n\t\t\t\t\t\t\t\t<!-- Staged text build: render the split pieces so each one\n\t\t\t\t\t\t\t\t carries its own sub-animation. -->\n\t\t\t\t\t\t\t\t@if (spec.granularity === 'paragraph') {\n\t\t\t\t\t\t\t\t\t<span [attr.data-anim-id]=\"spec.animId\" [ngStyle]=\"buildSpanStyle(spec)\">{{\n\t\t\t\t\t\t\t\t\t\tparagraphText(para)\n\t\t\t\t\t\t\t\t\t}}</span>\n\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t@for (span of spec.spans ?? []; track $index) {\n\t\t\t\t\t\t\t\t\t\t<span [attr.data-anim-id]=\"span.animId\" [ngStyle]=\"buildSpanStyle(span)\">{{\n\t\t\t\t\t\t\t\t\t\t\tspan.text\n\t\t\t\t\t\t\t\t\t\t}}</span>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t@for (run of para.runs; track $index) {\n\t\t\t\t\t\t\t\t\t@if (run.equationXml) {\n\t\t\t\t\t\t\t\t\t\t<pptx-equation-renderer\n\t\t\t\t\t\t\t\t\t\t\t[equationXml]=\"run.equationXml\"\n\t\t\t\t\t\t\t\t\t\t\t[equationNumber]=\"run.equationNumber\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t} @else if (\n\t\t\t\t\t\t\t\t\t\trun.text ===\n\t\t\t\t\t\t\t\t\t\t'\n'\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t} @else if (run.href) {\n\t\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-link\"\n\t\t\t\t\t\t\t\t\t\t\t[href]=\"run.href\"\n\t\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.title]=\"run.tooltip ?? null\"\n\t\t\t\t\t\t\t\t\t\t\t[ngStyle]=\"run.style\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ run.text }}</a\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t<span [ngStyle]=\"run.style\">{{ run.text }}</span>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t@if (para.isEmpty) {\n\t\t\t\t\t\t\t\t<!-- An authored blank line has no runs, so without this the\n\t\t\t\t\t\t\t\t <p> collapses to zero height and the gap a deck puts\n\t\t\t\t\t\t\t\t between a heading and its bullet list disappears. -->\n\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t}\n\t@default {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-unsupported\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t<div class=\"pptx-ng-placeholder\">{{ placeholderLabel() }}</div>\n\t\t</div>\n\t}\n}\n\n<!-- Soft-edge feather <filter> def, referenced via filter: url(#soft-edge-<id>). -->\n@if (softEdgeFilter(); as sef) {\n\t<svg\n\t\twidth=\"0\"\n\t\theight=\"0\"\n\t\taria-hidden=\"true\"\n\t\tstyle=\"position: absolute; width: 0; height: 0; overflow: hidden\"\n\t>\n\t\t<defs>\n\t\t\t<filter\n\t\t\t\t[attr.id]=\"sef.id\"\n\t\t\t\tx=\"-20%\"\n\t\t\t\ty=\"-20%\"\n\t\t\t\twidth=\"140%\"\n\t\t\t\theight=\"140%\"\n\t\t\t\tcolor-interpolation-filters=\"sRGB\"\n\t\t\t>\n\t\t\t\t<feGaussianBlur in=\"SourceAlpha\" [attr.stdDeviation]=\"sef.radius\" result=\"softEdgeAlpha\" />\n\t\t\t\t<feComposite in=\"SourceGraphic\" in2=\"softEdgeAlpha\" operator=\"in\" />\n\t\t\t</filter>\n\t\t</defs>\n\t</svg>\n}\n\n<!-- Duotone image-effect <filter> def, referenced via filter: url(#id). -->\n@if (duotoneFilter(); as df) {\n\t<svg\n\t\twidth=\"0\"\n\t\theight=\"0\"\n\t\taria-hidden=\"true\"\n\t\tstyle=\"position: absolute; width: 0; height: 0; overflow: hidden\"\n\t>\n\t\t<defs>\n\t\t\t<filter [attr.id]=\"df.id\" color-interpolation-filters=\"sRGB\">\n\t\t\t\t<feColorMatrix type=\"matrix\" [attr.values]=\"df.primitives[0].values\" />\n\t\t\t\t<feComponentTransfer>\n\t\t\t\t\t<feFuncR\n\t\t\t\t\t\ttype=\"linear\"\n\t\t\t\t\t\t[attr.slope]=\"df.primitives[1].channels[0].slope\"\n\t\t\t\t\t\t[attr.intercept]=\"df.primitives[1].channels[0].intercept\"\n\t\t\t\t\t/>\n\t\t\t\t\t<feFuncG\n\t\t\t\t\t\ttype=\"linear\"\n\t\t\t\t\t\t[attr.slope]=\"df.primitives[1].channels[1].slope\"\n\t\t\t\t\t\t[attr.intercept]=\"df.primitives[1].channels[1].intercept\"\n\t\t\t\t\t/>\n\t\t\t\t\t<feFuncB\n\t\t\t\t\t\ttype=\"linear\"\n\t\t\t\t\t\t[attr.slope]=\"df.primitives[1].channels[2].slope\"\n\t\t\t\t\t\t[attr.intercept]=\"df.primitives[1].channels[2].intercept\"\n\t\t\t\t\t/>\n\t\t\t\t</feComponentTransfer>\n\t\t\t</filter>\n\t\t</defs>\n\t</svg>\n}\n", dependencies: [{ kind: "component", type: ElementRendererComponent, selector: "pptx-element-renderer", inputs: ["element", "mediaDataUrls", "zIndex", "obstacles", "canvasWidth", "canvasHeight", "interactive", "marked", "presenting", "editable", "fieldContext", "slideElements", "editTemplateMode", "parentGroupFill"], outputs: ["cellCommit", "tableChange"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ConnectorRendererComponent, selector: "pptx-connector-renderer", inputs: ["element", "zIndex", "obstacles", "canvasWidth", "canvasHeight", "interactive", "marked", "animationState"] }, { kind: "component", type: TableRendererComponent, selector: "pptx-table-renderer", inputs: ["element", "editable"], outputs: ["cellCommit", "tableChange"] }, { kind: "component", type: ChartElementViewComponent, selector: "pptx-chart-element-view", inputs: ["element", "editable", "animationState"] }, { kind: "component", type: SmartArtRendererComponent, selector: "pptx-smart-art-renderer", inputs: ["element", "editable", "animationState"] }, { kind: "component", type: SmartArt3DRendererComponent, selector: "pptx-smart-art-3d-renderer", inputs: ["element", "zIndex", "canEdit", "markElement"] }, { kind: "component", type: InkRendererComponent, selector: "pptx-ink-renderer", inputs: ["element", "zIndex", "mediaDataUrls", "replay", "markElement"] }, { kind: "component", type: MediaRendererComponent, selector: "pptx-media-renderer", inputs: ["element", "mediaDataUrls", "zIndex", "interactive", "marked", "presenting", "placeholderLabel"] }, { kind: "component", type: OleRendererComponent, selector: "pptx-ole-renderer", inputs: ["element"] }, { kind: "component", type: Model3DRendererComponent, selector: "pptx-model3d-renderer", inputs: ["element", "zIndex", "mediaDataUrls", "interactive", "markElement"] }, { kind: "component", type: ZoomRendererComponent, selector: "pptx-zoom-renderer", inputs: ["element", "zIndex", "mediaDataUrls", "markElement"] }, { kind: "component", type: EquationRendererComponent, selector: "pptx-equation-renderer", inputs: ["equationXml", "equationNumber"] }, { kind: "component", type: ImageRendererComponent, selector: "pptx-image-renderer", inputs: ["element", "mediaDataUrls", "zIndex", "interactive", "marked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
78569
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.0", type: ElementRendererComponent, isStandalone: true, selector: "pptx-element-renderer", inputs: { element: { classPropertyName: "element", publicName: "element", isSignal: true, isRequired: true, transformFunction: null }, mediaDataUrls: { classPropertyName: "mediaDataUrls", publicName: "mediaDataUrls", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, obstacles: { classPropertyName: "obstacles", publicName: "obstacles", isSignal: true, isRequired: false, transformFunction: null }, canvasWidth: { classPropertyName: "canvasWidth", publicName: "canvasWidth", isSignal: true, isRequired: false, transformFunction: null }, canvasHeight: { classPropertyName: "canvasHeight", publicName: "canvasHeight", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "interactive", isSignal: true, isRequired: false, transformFunction: null }, marked: { classPropertyName: "marked", publicName: "marked", isSignal: true, isRequired: false, transformFunction: null }, presenting: { classPropertyName: "presenting", publicName: "presenting", isSignal: true, isRequired: false, transformFunction: null }, editable: { classPropertyName: "editable", publicName: "editable", isSignal: true, isRequired: false, transformFunction: null }, fieldContext: { classPropertyName: "fieldContext", publicName: "fieldContext", isSignal: true, isRequired: false, transformFunction: null }, slideElements: { classPropertyName: "slideElements", publicName: "slideElements", isSignal: true, isRequired: false, transformFunction: null }, editTemplateMode: { classPropertyName: "editTemplateMode", publicName: "editTemplateMode", isSignal: true, isRequired: false, transformFunction: null }, parentGroupFill: { classPropertyName: "parentGroupFill", publicName: "parentGroupFill", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { cellCommit: "cellCommit", tableChange: "tableChange" }, host: { classAttribute: "contents" }, ngImport: i0, template: "@switch (true) {\n\t@case (isHidden()) {\n\t\t<!--\n\t\t\tHidden via the Selection Pane: draw nothing, exactly as PowerPoint\n\t\t\tdoes. This is the FIRST case on purpose - @switch takes the first\n\t\t\tmatch, so one empty branch suppresses every element type at once\n\t\t\twithout wrapping (and re-indenting) the whole template. The host\n\t\t\tcarries \\`display: contents\\`, so an empty component collapses.\n\t\t\tRendering nothing (rather than an invisible box) is what keeps the\n\t\t\telement out of hit-testing, the tab order and the export raster; it\n\t\t\tstays listed in and selectable from the Selection Pane, which reads\n\t\t\tthe slide model rather than the DOM.\n\t\t-->\n\t}\n\t@case (element().type === 'connector') {\n\t\t<pptx-connector-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[obstacles]=\"obstacles()\"\n\t\t\t[canvasWidth]=\"canvasWidth()\"\n\t\t\t[canvasHeight]=\"canvasHeight()\"\n\t\t\t[interactive]=\"interactive()\"\n\t\t\t[marked]=\"elementMarked()\"\n\t\t\t[animationState]=\"animationState()\"\n\t\t/>\n\t}\n\t@case (element().type === 'ink') {\n\t\t<!--\n\t\t\tThis renderer (and zoom / model3d / 3D SmartArt below) positions its\n\t\t\town root box, so it takes the neutral element marker\n\t\t\t(data-pptx-element) as an input instead of being wrapped in a marked\n\t\t\tbox the way chart / table / OLE are: an outer positioned box would\n\t\t\toffset it twice.\n\t\t-->\n\t\t<pptx-ink-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[replay]=\"presenting()\"\n\t\t\t[markElement]=\"elementMarked()\"\n\t\t/>\n\t}\n\t@case (element().type === 'zoom') {\n\t\t<pptx-zoom-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[markElement]=\"elementMarked()\"\n\t\t/>\n\t}\n\t@case (element().type === 'model3d') {\n\t\t<pptx-model3d-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[markElement]=\"elementMarked()\"\n\t\t/>\n\t}\n\t@case (element().type === 'smartArt' && smartArt3D()) {\n\t\t<pptx-smart-art-3d-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[canEdit]=\"interactive() && editable()\"\n\t\t\t[markElement]=\"elementMarked()\"\n\t\t/>\n\t}\n\t@case (element().type === 'smartArt') {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-smartart\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t<pptx-smart-art-renderer\n\t\t\t\t[element]=\"element()\"\n\t\t\t\t[editable]=\"interactive() && editable()\"\n\t\t\t\t[animationState]=\"animationState()\"\n\t\t\t/>\n\t\t</div>\n\t}\n\t@case (element().type === 'ole') {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-ole\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t<pptx-ole-renderer [element]=\"element()\" />\n\t\t</div>\n\t}\n\t@case (element().type === 'chart') {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-chart\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t<pptx-chart-element-view\n\t\t\t\t[element]=\"element()\"\n\t\t\t\t[editable]=\"interactive() && editable()\"\n\t\t\t\t[animationState]=\"animationState()\"\n\t\t\t/>\n\t\t</div>\n\t}\n\t@case (element().type === 'table') {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-table\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t<pptx-table-renderer\n\t\t\t\t[element]=\"element()\"\n\t\t\t\t[editable]=\"interactive() && editable()\"\n\t\t\t\t(cellCommit)=\"cellCommit.emit({ id: element().id, commit: $event })\"\n\t\t\t\t(tableChange)=\"tableChange.emit($event)\"\n\t\t\t/>\n\t\t</div>\n\t}\n\t@case (element().type === 'group') {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-group\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t@for (child of children(); track child.id) {\n\t\t\t\t<pptx-element-renderer\n\t\t\t\t\t[element]=\"child\"\n\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t[zIndex]=\"$index\"\n\t\t\t\t\t[interactive]=\"interactive()\"\n\t\t\t\t\t[marked]=\"marked()\"\n\t\t\t\t\t[presenting]=\"presenting()\"\n\t\t\t\t\t[fieldContext]=\"fieldContext()\"\n\t\t\t\t\t[slideElements]=\"slideElements()\"\n\t\t\t\t\t[parentGroupFill]=\"childParentGroupFill()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t</div>\n\t}\n\t@case (isImageLike()) {\n\t\t<pptx-image-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[interactive]=\"interactive()\"\n\t\t\t[marked]=\"elementMarked()\"\n\t\t/>\n\t}\n\t@case (element().type === 'media') {\n\t\t<pptx-media-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[interactive]=\"interactive()\"\n\t\t\t[marked]=\"elementMarked()\"\n\t\t\t[presenting]=\"presenting()\"\n\t\t\t[placeholderLabel]=\"placeholderLabel()\"\n\t\t/>\n\t}\n\t@case (isShapeLike()) {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-shape\"\n\t\t\t[ngStyle]=\"shapeContainerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t@if (fillOverlay(); as ov) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-fill-overlay\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tstyle=\"position: absolute; inset: 0; pointer-events: none\"\n\t\t\t\t\t[style.background]=\"ov.color\"\n\t\t\t\t\t[style.mix-blend-mode]=\"ov.blendMode\"\n\t\t\t\t></div>\n\t\t\t}\n\t\t\t<!-- Hollow frame hit target: an unfilled, textless shape is hit-tested\n\t\t\t on its outline only, so its interior lets clicks through. -->\n\t\t\t@if (hollowHit(); as hit) {\n\t\t\t\t<svg\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t[attr.viewBox]=\"outlineViewBox()\"\n\t\t\t\t\tpreserveAspectRatio=\"none\"\n\t\t\t\t\tstyle=\"\n\t\t\t\t\t\tposition: absolute;\n\t\t\t\t\t\tinset: 0;\n\t\t\t\t\t\twidth: 100%;\n\t\t\t\t\t\theight: 100%;\n\t\t\t\t\t\toverflow: visible;\n\t\t\t\t\t\tpointer-events: none;\n\t\t\t\t\t\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\t[attr.d]=\"hit.d\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"transparent\"\n\t\t\t\t\t\t[attr.stroke-width]=\"hit.strokeWidth\"\n\t\t\t\t\t\tstyle=\"pointer-events: stroke\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t}\n\t\t\t<!-- Stroked outline: a CSS border takes one flat colour, and cannot\n\t\t\t outline an open preset (`line`, `arc`) at all. -->\n\t\t\t@if (gradientOutline(); as go) {\n\t\t\t\t<svg\n\t\t\t\t\tclass=\"pptx-ng-gradient-outline\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t[attr.viewBox]=\"outlineViewBox()\"\n\t\t\t\t\tpreserveAspectRatio=\"none\"\n\t\t\t\t\tstyle=\"\n\t\t\t\t\t\tposition: absolute;\n\t\t\t\t\t\tinset: 0;\n\t\t\t\t\t\twidth: 100%;\n\t\t\t\t\t\theight: 100%;\n\t\t\t\t\t\toverflow: visible;\n\t\t\t\t\t\tpointer-events: none;\n\t\t\t\t\t\"\n\t\t\t\t>\n\t\t\t\t\t@if (go.paint; as paint) {\n\t\t\t\t\t\t<defs>\n\t\t\t\t\t\t\t@if (paint.kind === 'pattern') {\n\t\t\t\t\t\t\t\t<pattern\n\t\t\t\t\t\t\t\t\t[attr.id]=\"paint.id\"\n\t\t\t\t\t\t\t\t\t[attr.width]=\"paint.width\"\n\t\t\t\t\t\t\t\t\t[attr.height]=\"paint.height\"\n\t\t\t\t\t\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<image\n\t\t\t\t\t\t\t\t\t\t[attr.href]=\"paint.href\"\n\t\t\t\t\t\t\t\t\t\t[attr.width]=\"paint.width\"\n\t\t\t\t\t\t\t\t\t\t[attr.height]=\"paint.height\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</pattern>\n\t\t\t\t\t\t\t} @else if (paint.kind === 'radial') {\n\t\t\t\t\t\t\t\t<radialGradient\n\t\t\t\t\t\t\t\t\t[attr.id]=\"paint.id\"\n\t\t\t\t\t\t\t\t\t[attr.cx]=\"paint.cx\"\n\t\t\t\t\t\t\t\t\t[attr.cy]=\"paint.cy\"\n\t\t\t\t\t\t\t\t\t[attr.r]=\"paint.r\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t@for (stop of paint.stops; track $index) {\n\t\t\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\t\t\t[attr.offset]=\"stop.offset\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-color]=\"stop.color\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-opacity]=\"stop.opacity\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</radialGradient>\n\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t<linearGradient\n\t\t\t\t\t\t\t\t\t[attr.id]=\"paint.id\"\n\t\t\t\t\t\t\t\t\t[attr.x1]=\"paint.x1\"\n\t\t\t\t\t\t\t\t\t[attr.y1]=\"paint.y1\"\n\t\t\t\t\t\t\t\t\t[attr.x2]=\"paint.x2\"\n\t\t\t\t\t\t\t\t\t[attr.y2]=\"paint.y2\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t@for (stop of paint.stops; track $index) {\n\t\t\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\t\t\t[attr.offset]=\"stop.offset\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-color]=\"stop.color\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-opacity]=\"stop.opacity\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</defs>\n\t\t\t\t\t}\n\t\t\t\t\t@for (strand of go.strands; track $index) {\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t[attr.d]=\"go.d\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t[attr.stroke]=\"go.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"strand.strokeWidth\"\n\t\t\t\t\t\t\t[attr.stroke-dasharray]=\"go.dashArray\"\n\t\t\t\t\t\t\t[attr.stroke-linecap]=\"go.lineCap\"\n\t\t\t\t\t\t\t[attr.stroke-linejoin]=\"go.lineJoin\"\n\t\t\t\t\t\t\t[style.transform]=\"\n\t\t\t\t\t\t\t\tstrand.offset !== 0 ? 'translate(0, ' + strand.offset + 'px)' : null\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t</svg>\n\t\t\t}\n\t\t\t@if (pathWarp(); as warp) {\n\t\t\t\t<svg\n\t\t\t\t\t[attr.width]=\"warp.width\"\n\t\t\t\t\t[attr.height]=\"warp.height\"\n\t\t\t\t\t[attr.viewBox]=\"'0 0 ' + warp.width + ' ' + warp.height\"\n\t\t\t\t\tstyle=\"position: absolute; inset: 0; overflow: visible; pointer-events: none\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t@for (line of warp.pathLines; track line.pathId) {\n\t\t\t\t\t\t\t<path [attr.id]=\"line.pathId\" [attr.d]=\"line.d\" fill=\"none\" />\n\t\t\t\t\t\t}\n\t\t\t\t\t</defs>\n\t\t\t\t\t@for (line of warp.pathLines; track line.pathId) {\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t[attr.font-size]=\"warp.baseFontSize\"\n\t\t\t\t\t\t\t[attr.font-family]=\"warp.baseFontFamily\"\n\t\t\t\t\t\t\t[attr.fill]=\"warp.baseColor\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<textPath\n\t\t\t\t\t\t\t\t[attr.href]=\"'#' + line.pathId\"\n\t\t\t\t\t\t\t\t[attr.startOffset]=\"warp.startOffset\"\n\t\t\t\t\t\t\t\t[attr.text-anchor]=\"warp.textAnchor\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t@for (seg of line.segments; track $index) {\n\t\t\t\t\t\t\t\t\t<tspan\n\t\t\t\t\t\t\t\t\t\t[attr.fill]=\"seg.style?.color ?? warp.baseColor\"\n\t\t\t\t\t\t\t\t\t\t[attr.font-weight]=\"seg.style?.bold ? 700 : 400\"\n\t\t\t\t\t\t\t\t\t\t[attr.font-style]=\"seg.style?.italic ? 'italic' : 'normal'\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{{ seg.text }}\n\t\t\t\t\t\t\t\t\t</tspan>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</textPath>\n\t\t\t\t\t\t</text>\n\t\t\t\t\t}\n\t\t\t\t</svg>\n\t\t\t} @else if (hasText()) {\n\t\t\t\t<div class=\"pptx-ng-text\" [ngStyle]=\"warpedTextStyle()\">\n\t\t\t\t\t@for (para of paragraphs(); track $index) {\n\t\t\t\t\t\t<p\n\t\t\t\t\t\t\tclass=\"pptx-ng-para\"\n\t\t\t\t\t\t\t[style.padding-left.px]=\"para.indentPx\"\n\t\t\t\t\t\t\t[style.text-indent.px]=\"para.textIndentPx ?? null\"\n\t\t\t\t\t\t\t[style.line-height]=\"para.lineHeight ?? null\"\n\t\t\t\t\t\t\t[style.margin-top.px]=\"para.spaceBeforePx ?? null\"\n\t\t\t\t\t\t\t[style.margin-bottom.px]=\"para.spaceAfterPx ?? null\"\n\t\t\t\t\t\t\t[style.font-size.px]=\"para.strutFontSizePx ?? null\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@if (para.bulletPicture?.src) {\n\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-bullet-image\"\n\t\t\t\t\t\t\t\t\t[src]=\"para.bulletPicture.src\"\n\t\t\t\t\t\t\t\t\t[alt]=\"para.bulletPicture.accessibleLabel\"\n\t\t\t\t\t\t\t\t\t[style.width.px]=\"para.bulletPicture.sizePx\"\n\t\t\t\t\t\t\t\t\t[style.height.px]=\"para.bulletPicture.sizePx\"\n\t\t\t\t\t\t\t\t\tstyle=\"\n\t\t\t\t\t\t\t\t\t\tdisplay: inline-block;\n\t\t\t\t\t\t\t\t\t\tvertical-align: middle;\n\t\t\t\t\t\t\t\t\t\tmargin-inline-end: 4px;\n\t\t\t\t\t\t\t\t\t\tobject-fit: contain;\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t} @else if (para.bulletMarker) {\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-bullet\"\n\t\t\t\t\t\t\t\t\t[ngStyle]=\"para.bulletStyle\"\n\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"para.bulletPicture?.accessibleLabel ?? null\"\n\t\t\t\t\t\t\t\t\t>{{ para.bulletMarker }}</span\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t@if (textBuildSpecs()[$index]; as spec) {\n\t\t\t\t\t\t\t\t<!-- Staged text build: render the split pieces so each one\n\t\t\t\t\t\t\t\t carries its own sub-animation. -->\n\t\t\t\t\t\t\t\t@if (spec.granularity === 'paragraph') {\n\t\t\t\t\t\t\t\t\t<span [attr.data-anim-id]=\"spec.animId\" [ngStyle]=\"buildSpanStyle(spec)\">{{\n\t\t\t\t\t\t\t\t\t\tparagraphText(para)\n\t\t\t\t\t\t\t\t\t}}</span>\n\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t@for (span of spec.spans ?? []; track $index) {\n\t\t\t\t\t\t\t\t\t\t<span [attr.data-anim-id]=\"span.animId\" [ngStyle]=\"buildSpanStyle(span)\">{{\n\t\t\t\t\t\t\t\t\t\t\tspan.text\n\t\t\t\t\t\t\t\t\t\t}}</span>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t@for (run of para.runs; track $index) {\n\t\t\t\t\t\t\t\t\t@if (run.equationXml) {\n\t\t\t\t\t\t\t\t\t\t<pptx-equation-renderer\n\t\t\t\t\t\t\t\t\t\t\t[equationXml]=\"run.equationXml\"\n\t\t\t\t\t\t\t\t\t\t\t[equationNumber]=\"run.equationNumber\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t} @else if (\n\t\t\t\t\t\t\t\t\t\trun.text ===\n\t\t\t\t\t\t\t\t\t\t'\n'\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t} @else if (run.href) {\n\t\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-link\"\n\t\t\t\t\t\t\t\t\t\t\t[href]=\"run.href\"\n\t\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.title]=\"run.tooltip ?? null\"\n\t\t\t\t\t\t\t\t\t\t\t[ngStyle]=\"run.style\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ run.text }}</a\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t<span [ngStyle]=\"run.style\">{{ run.text }}</span>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t@if (para.isEmpty) {\n\t\t\t\t\t\t\t\t<!-- An authored blank line has no runs, so without this the\n\t\t\t\t\t\t\t\t <p> collapses to zero height and the gap a deck puts\n\t\t\t\t\t\t\t\t between a heading and its bullet list disappears. -->\n\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t}\n\t@default {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-unsupported\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t<div class=\"pptx-ng-placeholder\">{{ placeholderLabel() }}</div>\n\t\t</div>\n\t}\n}\n\n<!-- Soft-edge feather <filter> def, referenced via filter: url(#soft-edge-<id>). -->\n@if (softEdgeFilter(); as sef) {\n\t<svg\n\t\twidth=\"0\"\n\t\theight=\"0\"\n\t\taria-hidden=\"true\"\n\t\tstyle=\"position: absolute; width: 0; height: 0; overflow: hidden\"\n\t>\n\t\t<defs>\n\t\t\t<filter\n\t\t\t\t[attr.id]=\"sef.id\"\n\t\t\t\tx=\"-20%\"\n\t\t\t\ty=\"-20%\"\n\t\t\t\twidth=\"140%\"\n\t\t\t\theight=\"140%\"\n\t\t\t\tcolor-interpolation-filters=\"sRGB\"\n\t\t\t>\n\t\t\t\t<feGaussianBlur in=\"SourceAlpha\" [attr.stdDeviation]=\"sef.radius\" result=\"softEdgeAlpha\" />\n\t\t\t\t<feComposite in=\"SourceGraphic\" in2=\"softEdgeAlpha\" operator=\"in\" />\n\t\t\t</filter>\n\t\t</defs>\n\t</svg>\n}\n\n<!-- Duotone image-effect <filter> def, referenced via filter: url(#id). -->\n@if (duotoneFilter(); as df) {\n\t<svg\n\t\twidth=\"0\"\n\t\theight=\"0\"\n\t\taria-hidden=\"true\"\n\t\tstyle=\"position: absolute; width: 0; height: 0; overflow: hidden\"\n\t>\n\t\t<defs>\n\t\t\t<filter [attr.id]=\"df.id\" color-interpolation-filters=\"sRGB\">\n\t\t\t\t<feColorMatrix type=\"matrix\" [attr.values]=\"df.primitives[0].values\" />\n\t\t\t\t<feComponentTransfer>\n\t\t\t\t\t<feFuncR\n\t\t\t\t\t\ttype=\"linear\"\n\t\t\t\t\t\t[attr.slope]=\"df.primitives[1].channels[0].slope\"\n\t\t\t\t\t\t[attr.intercept]=\"df.primitives[1].channels[0].intercept\"\n\t\t\t\t\t/>\n\t\t\t\t\t<feFuncG\n\t\t\t\t\t\ttype=\"linear\"\n\t\t\t\t\t\t[attr.slope]=\"df.primitives[1].channels[1].slope\"\n\t\t\t\t\t\t[attr.intercept]=\"df.primitives[1].channels[1].intercept\"\n\t\t\t\t\t/>\n\t\t\t\t\t<feFuncB\n\t\t\t\t\t\ttype=\"linear\"\n\t\t\t\t\t\t[attr.slope]=\"df.primitives[1].channels[2].slope\"\n\t\t\t\t\t\t[attr.intercept]=\"df.primitives[1].channels[2].intercept\"\n\t\t\t\t\t/>\n\t\t\t\t</feComponentTransfer>\n\t\t\t</filter>\n\t\t</defs>\n\t</svg>\n}\n", dependencies: [{ kind: "component", type: ElementRendererComponent, selector: "pptx-element-renderer", inputs: ["element", "mediaDataUrls", "zIndex", "obstacles", "canvasWidth", "canvasHeight", "interactive", "marked", "presenting", "editable", "fieldContext", "slideElements", "editTemplateMode", "parentGroupFill"], outputs: ["cellCommit", "tableChange"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ConnectorRendererComponent, selector: "pptx-connector-renderer", inputs: ["element", "zIndex", "obstacles", "canvasWidth", "canvasHeight", "interactive", "marked", "animationState"] }, { kind: "component", type: TableRendererComponent, selector: "pptx-table-renderer", inputs: ["element", "editable"], outputs: ["cellCommit", "tableChange"] }, { kind: "component", type: ChartElementViewComponent, selector: "pptx-chart-element-view", inputs: ["element", "editable", "animationState"] }, { kind: "component", type: SmartArtRendererComponent, selector: "pptx-smart-art-renderer", inputs: ["element", "editable", "animationState"] }, { kind: "component", type: SmartArt3DRendererComponent, selector: "pptx-smart-art-3d-renderer", inputs: ["element", "zIndex", "canEdit", "markElement"] }, { kind: "component", type: InkRendererComponent, selector: "pptx-ink-renderer", inputs: ["element", "zIndex", "mediaDataUrls", "replay", "markElement"] }, { kind: "component", type: MediaRendererComponent, selector: "pptx-media-renderer", inputs: ["element", "mediaDataUrls", "zIndex", "interactive", "marked", "presenting", "placeholderLabel"] }, { kind: "component", type: OleRendererComponent, selector: "pptx-ole-renderer", inputs: ["element"] }, { kind: "component", type: Model3DRendererComponent, selector: "pptx-model3d-renderer", inputs: ["element", "zIndex", "mediaDataUrls", "interactive", "markElement"] }, { kind: "component", type: ZoomRendererComponent, selector: "pptx-zoom-renderer", inputs: ["element", "zIndex", "mediaDataUrls", "markElement"] }, { kind: "component", type: EquationRendererComponent, selector: "pptx-equation-renderer", inputs: ["equationXml", "equationNumber"] }, { kind: "component", type: ImageRendererComponent, selector: "pptx-image-renderer", inputs: ["element", "mediaDataUrls", "zIndex", "interactive", "marked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
78393
78570
|
}
|
|
78394
78571
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: ElementRendererComponent, decorators: [{
|
|
78395
78572
|
type: Component,
|
|
@@ -78407,7 +78584,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
|
|
|
78407
78584
|
ZoomRendererComponent,
|
|
78408
78585
|
EquationRendererComponent,
|
|
78409
78586
|
ImageRendererComponent,
|
|
78410
|
-
], template: "@switch (true) {\n\t@case (isHidden()) {\n\t\t<!--\n\t\t\tHidden via the Selection Pane: draw nothing, exactly as PowerPoint\n\t\t\tdoes. This is the FIRST case on purpose - @switch takes the first\n\t\t\tmatch, so one empty branch suppresses every element type at once\n\t\t\twithout wrapping (and re-indenting) the whole template. The host\n\t\t\tcarries \\`display: contents\\`, so an empty component collapses.\n\t\t\tRendering nothing (rather than an invisible box) is what keeps the\n\t\t\telement out of hit-testing, the tab order and the export raster; it\n\t\t\tstays listed in and selectable from the Selection Pane, which reads\n\t\t\tthe slide model rather than the DOM.\n\t\t-->\n\t}\n\t@case (element().type === 'connector') {\n\t\t<pptx-connector-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[obstacles]=\"obstacles()\"\n\t\t\t[canvasWidth]=\"canvasWidth()\"\n\t\t\t[canvasHeight]=\"canvasHeight()\"\n\t\t\t[interactive]=\"interactive()\"\n\t\t\t[marked]=\"elementMarked()\"\n\t\t\t[animationState]=\"animationState()\"\n\t\t/>\n\t}\n\t@case (element().type === 'ink') {\n\t\t<!--\n\t\t\tThis renderer (and zoom / model3d / 3D SmartArt below) positions its\n\t\t\town root box, so it takes the neutral element marker\n\t\t\t(data-pptx-element) as an input instead of being wrapped in a marked\n\t\t\tbox the way chart / table / OLE are: an outer positioned box would\n\t\t\toffset it twice.\n\t\t-->\n\t\t<pptx-ink-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[replay]=\"presenting()\"\n\t\t\t[markElement]=\"elementMarked()\"\n\t\t/>\n\t}\n\t@case (element().type === 'zoom') {\n\t\t<pptx-zoom-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[markElement]=\"elementMarked()\"\n\t\t/>\n\t}\n\t@case (element().type === 'model3d') {\n\t\t<pptx-model3d-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[markElement]=\"elementMarked()\"\n\t\t/>\n\t}\n\t@case (element().type === 'smartArt' && smartArt3D()) {\n\t\t<pptx-smart-art-3d-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[canEdit]=\"interactive() && editable()\"\n\t\t\t[markElement]=\"elementMarked()\"\n\t\t/>\n\t}\n\t@case (element().type === 'smartArt') {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-smartart\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t<pptx-smart-art-renderer\n\t\t\t\t[element]=\"element()\"\n\t\t\t\t[editable]=\"interactive() && editable()\"\n\t\t\t\t[animationState]=\"animationState()\"\n\t\t\t/>\n\t\t</div>\n\t}\n\t@case (element().type === 'ole') {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-ole\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t<pptx-ole-renderer [element]=\"element()\" />\n\t\t</div>\n\t}\n\t@case (element().type === 'chart') {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-chart\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t<pptx-chart-element-view\n\t\t\t\t[element]=\"element()\"\n\t\t\t\t[editable]=\"interactive() && editable()\"\n\t\t\t\t[animationState]=\"animationState()\"\n\t\t\t/>\n\t\t</div>\n\t}\n\t@case (element().type === 'table') {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-table\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t<pptx-table-renderer\n\t\t\t\t[element]=\"element()\"\n\t\t\t\t[editable]=\"interactive() && editable()\"\n\t\t\t\t(cellCommit)=\"cellCommit.emit({ id: element().id, commit: $event })\"\n\t\t\t\t(tableChange)=\"tableChange.emit($event)\"\n\t\t\t/>\n\t\t</div>\n\t}\n\t@case (element().type === 'group') {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-group\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t@for (child of children(); track child.id) {\n\t\t\t\t<pptx-element-renderer\n\t\t\t\t\t[element]=\"child\"\n\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t[zIndex]=\"$index\"\n\t\t\t\t\t[interactive]=\"interactive()\"\n\t\t\t\t\t[marked]=\"marked()\"\n\t\t\t\t\t[presenting]=\"presenting()\"\n\t\t\t\t\t[fieldContext]=\"fieldContext()\"\n\t\t\t\t\t[slideElements]=\"slideElements()\"\n\t\t\t\t\t[parentGroupFill]=\"childParentGroupFill()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t</div>\n\t}\n\t@case (isImageLike()) {\n\t\t<pptx-image-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[interactive]=\"interactive()\"\n\t\t\t[marked]=\"elementMarked()\"\n\t\t/>\n\t}\n\t@case (element().type === 'media') {\n\t\t<pptx-media-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[interactive]=\"interactive()\"\n\t\t\t[marked]=\"elementMarked()\"\n\t\t\t[presenting]=\"presenting()\"\n\t\t\t[placeholderLabel]=\"placeholderLabel()\"\n\t\t/>\n\t}\n\t@case (isShapeLike()) {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-shape\"\n\t\t\t[ngStyle]=\"shapeContainerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t@if (fillOverlay(); as ov) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-fill-overlay\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tstyle=\"position: absolute; inset: 0; pointer-events: none\"\n\t\t\t\t\t[style.background]=\"ov.color\"\n\t\t\t\t\t[style.mix-blend-mode]=\"ov.blendMode\"\n\t\t\t\t></div>\n\t\t\t}\n\t\t\t<!-- Stroked outline: a CSS border takes one flat colour, and cannot\n\t\t\t outline an open preset (`line`, `arc`) at all. -->\n\t\t\t@if (gradientOutline(); as go) {\n\t\t\t\t<svg\n\t\t\t\t\tclass=\"pptx-ng-gradient-outline\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t[attr.viewBox]=\"outlineViewBox()\"\n\t\t\t\t\tpreserveAspectRatio=\"none\"\n\t\t\t\t\tstyle=\"\n\t\t\t\t\t\tposition: absolute;\n\t\t\t\t\t\tinset: 0;\n\t\t\t\t\t\twidth: 100%;\n\t\t\t\t\t\theight: 100%;\n\t\t\t\t\t\toverflow: visible;\n\t\t\t\t\t\tpointer-events: none;\n\t\t\t\t\t\"\n\t\t\t\t>\n\t\t\t\t\t@if (go.paint; as paint) {\n\t\t\t\t\t\t<defs>\n\t\t\t\t\t\t\t@if (paint.kind === 'pattern') {\n\t\t\t\t\t\t\t\t<pattern\n\t\t\t\t\t\t\t\t\t[attr.id]=\"paint.id\"\n\t\t\t\t\t\t\t\t\t[attr.width]=\"paint.width\"\n\t\t\t\t\t\t\t\t\t[attr.height]=\"paint.height\"\n\t\t\t\t\t\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<image\n\t\t\t\t\t\t\t\t\t\t[attr.href]=\"paint.href\"\n\t\t\t\t\t\t\t\t\t\t[attr.width]=\"paint.width\"\n\t\t\t\t\t\t\t\t\t\t[attr.height]=\"paint.height\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</pattern>\n\t\t\t\t\t\t\t} @else if (paint.kind === 'radial') {\n\t\t\t\t\t\t\t\t<radialGradient\n\t\t\t\t\t\t\t\t\t[attr.id]=\"paint.id\"\n\t\t\t\t\t\t\t\t\t[attr.cx]=\"paint.cx\"\n\t\t\t\t\t\t\t\t\t[attr.cy]=\"paint.cy\"\n\t\t\t\t\t\t\t\t\t[attr.r]=\"paint.r\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t@for (stop of paint.stops; track $index) {\n\t\t\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\t\t\t[attr.offset]=\"stop.offset\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-color]=\"stop.color\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-opacity]=\"stop.opacity\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</radialGradient>\n\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t<linearGradient\n\t\t\t\t\t\t\t\t\t[attr.id]=\"paint.id\"\n\t\t\t\t\t\t\t\t\t[attr.x1]=\"paint.x1\"\n\t\t\t\t\t\t\t\t\t[attr.y1]=\"paint.y1\"\n\t\t\t\t\t\t\t\t\t[attr.x2]=\"paint.x2\"\n\t\t\t\t\t\t\t\t\t[attr.y2]=\"paint.y2\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t@for (stop of paint.stops; track $index) {\n\t\t\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\t\t\t[attr.offset]=\"stop.offset\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-color]=\"stop.color\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-opacity]=\"stop.opacity\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</defs>\n\t\t\t\t\t}\n\t\t\t\t\t@for (strand of go.strands; track $index) {\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t[attr.d]=\"go.d\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t[attr.stroke]=\"go.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"strand.strokeWidth\"\n\t\t\t\t\t\t\t[attr.stroke-dasharray]=\"go.dashArray\"\n\t\t\t\t\t\t\t[attr.stroke-linecap]=\"go.lineCap\"\n\t\t\t\t\t\t\t[attr.stroke-linejoin]=\"go.lineJoin\"\n\t\t\t\t\t\t\t[style.transform]=\"\n\t\t\t\t\t\t\t\tstrand.offset !== 0 ? 'translate(0, ' + strand.offset + 'px)' : null\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t</svg>\n\t\t\t}\n\t\t\t@if (pathWarp(); as warp) {\n\t\t\t\t<svg\n\t\t\t\t\t[attr.width]=\"warp.width\"\n\t\t\t\t\t[attr.height]=\"warp.height\"\n\t\t\t\t\t[attr.viewBox]=\"'0 0 ' + warp.width + ' ' + warp.height\"\n\t\t\t\t\tstyle=\"position: absolute; inset: 0; overflow: visible; pointer-events: none\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t@for (line of warp.pathLines; track line.pathId) {\n\t\t\t\t\t\t\t<path [attr.id]=\"line.pathId\" [attr.d]=\"line.d\" fill=\"none\" />\n\t\t\t\t\t\t}\n\t\t\t\t\t</defs>\n\t\t\t\t\t@for (line of warp.pathLines; track line.pathId) {\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t[attr.font-size]=\"warp.baseFontSize\"\n\t\t\t\t\t\t\t[attr.font-family]=\"warp.baseFontFamily\"\n\t\t\t\t\t\t\t[attr.fill]=\"warp.baseColor\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<textPath\n\t\t\t\t\t\t\t\t[attr.href]=\"'#' + line.pathId\"\n\t\t\t\t\t\t\t\t[attr.startOffset]=\"warp.startOffset\"\n\t\t\t\t\t\t\t\t[attr.text-anchor]=\"warp.textAnchor\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t@for (seg of line.segments; track $index) {\n\t\t\t\t\t\t\t\t\t<tspan\n\t\t\t\t\t\t\t\t\t\t[attr.fill]=\"seg.style?.color ?? warp.baseColor\"\n\t\t\t\t\t\t\t\t\t\t[attr.font-weight]=\"seg.style?.bold ? 700 : 400\"\n\t\t\t\t\t\t\t\t\t\t[attr.font-style]=\"seg.style?.italic ? 'italic' : 'normal'\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{{ seg.text }}\n\t\t\t\t\t\t\t\t\t</tspan>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</textPath>\n\t\t\t\t\t\t</text>\n\t\t\t\t\t}\n\t\t\t\t</svg>\n\t\t\t} @else if (hasText()) {\n\t\t\t\t<div class=\"pptx-ng-text\" [ngStyle]=\"warpedTextStyle()\">\n\t\t\t\t\t@for (para of paragraphs(); track $index) {\n\t\t\t\t\t\t<p\n\t\t\t\t\t\t\tclass=\"pptx-ng-para\"\n\t\t\t\t\t\t\t[style.padding-left.px]=\"para.indentPx\"\n\t\t\t\t\t\t\t[style.text-indent.px]=\"para.textIndentPx ?? null\"\n\t\t\t\t\t\t\t[style.line-height]=\"para.lineHeight ?? null\"\n\t\t\t\t\t\t\t[style.margin-top.px]=\"para.spaceBeforePx ?? null\"\n\t\t\t\t\t\t\t[style.margin-bottom.px]=\"para.spaceAfterPx ?? null\"\n\t\t\t\t\t\t\t[style.font-size.px]=\"para.strutFontSizePx ?? null\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@if (para.bulletPicture?.src) {\n\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-bullet-image\"\n\t\t\t\t\t\t\t\t\t[src]=\"para.bulletPicture.src\"\n\t\t\t\t\t\t\t\t\t[alt]=\"para.bulletPicture.accessibleLabel\"\n\t\t\t\t\t\t\t\t\t[style.width.px]=\"para.bulletPicture.sizePx\"\n\t\t\t\t\t\t\t\t\t[style.height.px]=\"para.bulletPicture.sizePx\"\n\t\t\t\t\t\t\t\t\tstyle=\"\n\t\t\t\t\t\t\t\t\t\tdisplay: inline-block;\n\t\t\t\t\t\t\t\t\t\tvertical-align: middle;\n\t\t\t\t\t\t\t\t\t\tmargin-inline-end: 4px;\n\t\t\t\t\t\t\t\t\t\tobject-fit: contain;\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t} @else if (para.bulletMarker) {\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-bullet\"\n\t\t\t\t\t\t\t\t\t[ngStyle]=\"para.bulletStyle\"\n\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"para.bulletPicture?.accessibleLabel ?? null\"\n\t\t\t\t\t\t\t\t\t>{{ para.bulletMarker }}</span\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t@if (textBuildSpecs()[$index]; as spec) {\n\t\t\t\t\t\t\t\t<!-- Staged text build: render the split pieces so each one\n\t\t\t\t\t\t\t\t carries its own sub-animation. -->\n\t\t\t\t\t\t\t\t@if (spec.granularity === 'paragraph') {\n\t\t\t\t\t\t\t\t\t<span [attr.data-anim-id]=\"spec.animId\" [ngStyle]=\"buildSpanStyle(spec)\">{{\n\t\t\t\t\t\t\t\t\t\tparagraphText(para)\n\t\t\t\t\t\t\t\t\t}}</span>\n\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t@for (span of spec.spans ?? []; track $index) {\n\t\t\t\t\t\t\t\t\t\t<span [attr.data-anim-id]=\"span.animId\" [ngStyle]=\"buildSpanStyle(span)\">{{\n\t\t\t\t\t\t\t\t\t\t\tspan.text\n\t\t\t\t\t\t\t\t\t\t}}</span>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t@for (run of para.runs; track $index) {\n\t\t\t\t\t\t\t\t\t@if (run.equationXml) {\n\t\t\t\t\t\t\t\t\t\t<pptx-equation-renderer\n\t\t\t\t\t\t\t\t\t\t\t[equationXml]=\"run.equationXml\"\n\t\t\t\t\t\t\t\t\t\t\t[equationNumber]=\"run.equationNumber\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t} @else if (\n\t\t\t\t\t\t\t\t\t\trun.text ===\n\t\t\t\t\t\t\t\t\t\t'\n'\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t} @else if (run.href) {\n\t\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-link\"\n\t\t\t\t\t\t\t\t\t\t\t[href]=\"run.href\"\n\t\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.title]=\"run.tooltip ?? null\"\n\t\t\t\t\t\t\t\t\t\t\t[ngStyle]=\"run.style\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ run.text }}</a\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t<span [ngStyle]=\"run.style\">{{ run.text }}</span>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t@if (para.isEmpty) {\n\t\t\t\t\t\t\t\t<!-- An authored blank line has no runs, so without this the\n\t\t\t\t\t\t\t\t <p> collapses to zero height and the gap a deck puts\n\t\t\t\t\t\t\t\t between a heading and its bullet list disappears. -->\n\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t}\n\t@default {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-unsupported\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t<div class=\"pptx-ng-placeholder\">{{ placeholderLabel() }}</div>\n\t\t</div>\n\t}\n}\n\n<!-- Soft-edge feather <filter> def, referenced via filter: url(#soft-edge-<id>). -->\n@if (softEdgeFilter(); as sef) {\n\t<svg\n\t\twidth=\"0\"\n\t\theight=\"0\"\n\t\taria-hidden=\"true\"\n\t\tstyle=\"position: absolute; width: 0; height: 0; overflow: hidden\"\n\t>\n\t\t<defs>\n\t\t\t<filter\n\t\t\t\t[attr.id]=\"sef.id\"\n\t\t\t\tx=\"-20%\"\n\t\t\t\ty=\"-20%\"\n\t\t\t\twidth=\"140%\"\n\t\t\t\theight=\"140%\"\n\t\t\t\tcolor-interpolation-filters=\"sRGB\"\n\t\t\t>\n\t\t\t\t<feGaussianBlur in=\"SourceAlpha\" [attr.stdDeviation]=\"sef.radius\" result=\"softEdgeAlpha\" />\n\t\t\t\t<feComposite in=\"SourceGraphic\" in2=\"softEdgeAlpha\" operator=\"in\" />\n\t\t\t</filter>\n\t\t</defs>\n\t</svg>\n}\n\n<!-- Duotone image-effect <filter> def, referenced via filter: url(#id). -->\n@if (duotoneFilter(); as df) {\n\t<svg\n\t\twidth=\"0\"\n\t\theight=\"0\"\n\t\taria-hidden=\"true\"\n\t\tstyle=\"position: absolute; width: 0; height: 0; overflow: hidden\"\n\t>\n\t\t<defs>\n\t\t\t<filter [attr.id]=\"df.id\" color-interpolation-filters=\"sRGB\">\n\t\t\t\t<feColorMatrix type=\"matrix\" [attr.values]=\"df.primitives[0].values\" />\n\t\t\t\t<feComponentTransfer>\n\t\t\t\t\t<feFuncR\n\t\t\t\t\t\ttype=\"linear\"\n\t\t\t\t\t\t[attr.slope]=\"df.primitives[1].channels[0].slope\"\n\t\t\t\t\t\t[attr.intercept]=\"df.primitives[1].channels[0].intercept\"\n\t\t\t\t\t/>\n\t\t\t\t\t<feFuncG\n\t\t\t\t\t\ttype=\"linear\"\n\t\t\t\t\t\t[attr.slope]=\"df.primitives[1].channels[1].slope\"\n\t\t\t\t\t\t[attr.intercept]=\"df.primitives[1].channels[1].intercept\"\n\t\t\t\t\t/>\n\t\t\t\t\t<feFuncB\n\t\t\t\t\t\ttype=\"linear\"\n\t\t\t\t\t\t[attr.slope]=\"df.primitives[1].channels[2].slope\"\n\t\t\t\t\t\t[attr.intercept]=\"df.primitives[1].channels[2].intercept\"\n\t\t\t\t\t/>\n\t\t\t\t</feComponentTransfer>\n\t\t\t</filter>\n\t\t</defs>\n\t</svg>\n}\n" }]
|
|
78587
|
+
], template: "@switch (true) {\n\t@case (isHidden()) {\n\t\t<!--\n\t\t\tHidden via the Selection Pane: draw nothing, exactly as PowerPoint\n\t\t\tdoes. This is the FIRST case on purpose - @switch takes the first\n\t\t\tmatch, so one empty branch suppresses every element type at once\n\t\t\twithout wrapping (and re-indenting) the whole template. The host\n\t\t\tcarries \\`display: contents\\`, so an empty component collapses.\n\t\t\tRendering nothing (rather than an invisible box) is what keeps the\n\t\t\telement out of hit-testing, the tab order and the export raster; it\n\t\t\tstays listed in and selectable from the Selection Pane, which reads\n\t\t\tthe slide model rather than the DOM.\n\t\t-->\n\t}\n\t@case (element().type === 'connector') {\n\t\t<pptx-connector-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[obstacles]=\"obstacles()\"\n\t\t\t[canvasWidth]=\"canvasWidth()\"\n\t\t\t[canvasHeight]=\"canvasHeight()\"\n\t\t\t[interactive]=\"interactive()\"\n\t\t\t[marked]=\"elementMarked()\"\n\t\t\t[animationState]=\"animationState()\"\n\t\t/>\n\t}\n\t@case (element().type === 'ink') {\n\t\t<!--\n\t\t\tThis renderer (and zoom / model3d / 3D SmartArt below) positions its\n\t\t\town root box, so it takes the neutral element marker\n\t\t\t(data-pptx-element) as an input instead of being wrapped in a marked\n\t\t\tbox the way chart / table / OLE are: an outer positioned box would\n\t\t\toffset it twice.\n\t\t-->\n\t\t<pptx-ink-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[replay]=\"presenting()\"\n\t\t\t[markElement]=\"elementMarked()\"\n\t\t/>\n\t}\n\t@case (element().type === 'zoom') {\n\t\t<pptx-zoom-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[markElement]=\"elementMarked()\"\n\t\t/>\n\t}\n\t@case (element().type === 'model3d') {\n\t\t<pptx-model3d-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[markElement]=\"elementMarked()\"\n\t\t/>\n\t}\n\t@case (element().type === 'smartArt' && smartArt3D()) {\n\t\t<pptx-smart-art-3d-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[canEdit]=\"interactive() && editable()\"\n\t\t\t[markElement]=\"elementMarked()\"\n\t\t/>\n\t}\n\t@case (element().type === 'smartArt') {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-smartart\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t<pptx-smart-art-renderer\n\t\t\t\t[element]=\"element()\"\n\t\t\t\t[editable]=\"interactive() && editable()\"\n\t\t\t\t[animationState]=\"animationState()\"\n\t\t\t/>\n\t\t</div>\n\t}\n\t@case (element().type === 'ole') {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-ole\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t<pptx-ole-renderer [element]=\"element()\" />\n\t\t</div>\n\t}\n\t@case (element().type === 'chart') {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-chart\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t<pptx-chart-element-view\n\t\t\t\t[element]=\"element()\"\n\t\t\t\t[editable]=\"interactive() && editable()\"\n\t\t\t\t[animationState]=\"animationState()\"\n\t\t\t/>\n\t\t</div>\n\t}\n\t@case (element().type === 'table') {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-table\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t<pptx-table-renderer\n\t\t\t\t[element]=\"element()\"\n\t\t\t\t[editable]=\"interactive() && editable()\"\n\t\t\t\t(cellCommit)=\"cellCommit.emit({ id: element().id, commit: $event })\"\n\t\t\t\t(tableChange)=\"tableChange.emit($event)\"\n\t\t\t/>\n\t\t</div>\n\t}\n\t@case (element().type === 'group') {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-group\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t@for (child of children(); track child.id) {\n\t\t\t\t<pptx-element-renderer\n\t\t\t\t\t[element]=\"child\"\n\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t[zIndex]=\"$index\"\n\t\t\t\t\t[interactive]=\"interactive()\"\n\t\t\t\t\t[marked]=\"marked()\"\n\t\t\t\t\t[presenting]=\"presenting()\"\n\t\t\t\t\t[fieldContext]=\"fieldContext()\"\n\t\t\t\t\t[slideElements]=\"slideElements()\"\n\t\t\t\t\t[parentGroupFill]=\"childParentGroupFill()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t</div>\n\t}\n\t@case (isImageLike()) {\n\t\t<pptx-image-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[interactive]=\"interactive()\"\n\t\t\t[marked]=\"elementMarked()\"\n\t\t/>\n\t}\n\t@case (element().type === 'media') {\n\t\t<pptx-media-renderer\n\t\t\t[element]=\"element()\"\n\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t[interactive]=\"interactive()\"\n\t\t\t[marked]=\"elementMarked()\"\n\t\t\t[presenting]=\"presenting()\"\n\t\t\t[placeholderLabel]=\"placeholderLabel()\"\n\t\t/>\n\t}\n\t@case (isShapeLike()) {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-shape\"\n\t\t\t[ngStyle]=\"shapeContainerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t@if (fillOverlay(); as ov) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-fill-overlay\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tstyle=\"position: absolute; inset: 0; pointer-events: none\"\n\t\t\t\t\t[style.background]=\"ov.color\"\n\t\t\t\t\t[style.mix-blend-mode]=\"ov.blendMode\"\n\t\t\t\t></div>\n\t\t\t}\n\t\t\t<!-- Hollow frame hit target: an unfilled, textless shape is hit-tested\n\t\t\t on its outline only, so its interior lets clicks through. -->\n\t\t\t@if (hollowHit(); as hit) {\n\t\t\t\t<svg\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t[attr.viewBox]=\"outlineViewBox()\"\n\t\t\t\t\tpreserveAspectRatio=\"none\"\n\t\t\t\t\tstyle=\"\n\t\t\t\t\t\tposition: absolute;\n\t\t\t\t\t\tinset: 0;\n\t\t\t\t\t\twidth: 100%;\n\t\t\t\t\t\theight: 100%;\n\t\t\t\t\t\toverflow: visible;\n\t\t\t\t\t\tpointer-events: none;\n\t\t\t\t\t\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\t[attr.d]=\"hit.d\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"transparent\"\n\t\t\t\t\t\t[attr.stroke-width]=\"hit.strokeWidth\"\n\t\t\t\t\t\tstyle=\"pointer-events: stroke\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t}\n\t\t\t<!-- Stroked outline: a CSS border takes one flat colour, and cannot\n\t\t\t outline an open preset (`line`, `arc`) at all. -->\n\t\t\t@if (gradientOutline(); as go) {\n\t\t\t\t<svg\n\t\t\t\t\tclass=\"pptx-ng-gradient-outline\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t[attr.viewBox]=\"outlineViewBox()\"\n\t\t\t\t\tpreserveAspectRatio=\"none\"\n\t\t\t\t\tstyle=\"\n\t\t\t\t\t\tposition: absolute;\n\t\t\t\t\t\tinset: 0;\n\t\t\t\t\t\twidth: 100%;\n\t\t\t\t\t\theight: 100%;\n\t\t\t\t\t\toverflow: visible;\n\t\t\t\t\t\tpointer-events: none;\n\t\t\t\t\t\"\n\t\t\t\t>\n\t\t\t\t\t@if (go.paint; as paint) {\n\t\t\t\t\t\t<defs>\n\t\t\t\t\t\t\t@if (paint.kind === 'pattern') {\n\t\t\t\t\t\t\t\t<pattern\n\t\t\t\t\t\t\t\t\t[attr.id]=\"paint.id\"\n\t\t\t\t\t\t\t\t\t[attr.width]=\"paint.width\"\n\t\t\t\t\t\t\t\t\t[attr.height]=\"paint.height\"\n\t\t\t\t\t\t\t\t\tpatternUnits=\"userSpaceOnUse\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<image\n\t\t\t\t\t\t\t\t\t\t[attr.href]=\"paint.href\"\n\t\t\t\t\t\t\t\t\t\t[attr.width]=\"paint.width\"\n\t\t\t\t\t\t\t\t\t\t[attr.height]=\"paint.height\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</pattern>\n\t\t\t\t\t\t\t} @else if (paint.kind === 'radial') {\n\t\t\t\t\t\t\t\t<radialGradient\n\t\t\t\t\t\t\t\t\t[attr.id]=\"paint.id\"\n\t\t\t\t\t\t\t\t\t[attr.cx]=\"paint.cx\"\n\t\t\t\t\t\t\t\t\t[attr.cy]=\"paint.cy\"\n\t\t\t\t\t\t\t\t\t[attr.r]=\"paint.r\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t@for (stop of paint.stops; track $index) {\n\t\t\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\t\t\t[attr.offset]=\"stop.offset\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-color]=\"stop.color\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-opacity]=\"stop.opacity\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</radialGradient>\n\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t<linearGradient\n\t\t\t\t\t\t\t\t\t[attr.id]=\"paint.id\"\n\t\t\t\t\t\t\t\t\t[attr.x1]=\"paint.x1\"\n\t\t\t\t\t\t\t\t\t[attr.y1]=\"paint.y1\"\n\t\t\t\t\t\t\t\t\t[attr.x2]=\"paint.x2\"\n\t\t\t\t\t\t\t\t\t[attr.y2]=\"paint.y2\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t@for (stop of paint.stops; track $index) {\n\t\t\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\t\t\t[attr.offset]=\"stop.offset\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-color]=\"stop.color\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.stop-opacity]=\"stop.opacity\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</defs>\n\t\t\t\t\t}\n\t\t\t\t\t@for (strand of go.strands; track $index) {\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t[attr.d]=\"go.d\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t[attr.stroke]=\"go.stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"strand.strokeWidth\"\n\t\t\t\t\t\t\t[attr.stroke-dasharray]=\"go.dashArray\"\n\t\t\t\t\t\t\t[attr.stroke-linecap]=\"go.lineCap\"\n\t\t\t\t\t\t\t[attr.stroke-linejoin]=\"go.lineJoin\"\n\t\t\t\t\t\t\t[style.transform]=\"\n\t\t\t\t\t\t\t\tstrand.offset !== 0 ? 'translate(0, ' + strand.offset + 'px)' : null\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t</svg>\n\t\t\t}\n\t\t\t@if (pathWarp(); as warp) {\n\t\t\t\t<svg\n\t\t\t\t\t[attr.width]=\"warp.width\"\n\t\t\t\t\t[attr.height]=\"warp.height\"\n\t\t\t\t\t[attr.viewBox]=\"'0 0 ' + warp.width + ' ' + warp.height\"\n\t\t\t\t\tstyle=\"position: absolute; inset: 0; overflow: visible; pointer-events: none\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t>\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t@for (line of warp.pathLines; track line.pathId) {\n\t\t\t\t\t\t\t<path [attr.id]=\"line.pathId\" [attr.d]=\"line.d\" fill=\"none\" />\n\t\t\t\t\t\t}\n\t\t\t\t\t</defs>\n\t\t\t\t\t@for (line of warp.pathLines; track line.pathId) {\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t[attr.font-size]=\"warp.baseFontSize\"\n\t\t\t\t\t\t\t[attr.font-family]=\"warp.baseFontFamily\"\n\t\t\t\t\t\t\t[attr.fill]=\"warp.baseColor\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<textPath\n\t\t\t\t\t\t\t\t[attr.href]=\"'#' + line.pathId\"\n\t\t\t\t\t\t\t\t[attr.startOffset]=\"warp.startOffset\"\n\t\t\t\t\t\t\t\t[attr.text-anchor]=\"warp.textAnchor\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t@for (seg of line.segments; track $index) {\n\t\t\t\t\t\t\t\t\t<tspan\n\t\t\t\t\t\t\t\t\t\t[attr.fill]=\"seg.style?.color ?? warp.baseColor\"\n\t\t\t\t\t\t\t\t\t\t[attr.font-weight]=\"seg.style?.bold ? 700 : 400\"\n\t\t\t\t\t\t\t\t\t\t[attr.font-style]=\"seg.style?.italic ? 'italic' : 'normal'\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{{ seg.text }}\n\t\t\t\t\t\t\t\t\t</tspan>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</textPath>\n\t\t\t\t\t\t</text>\n\t\t\t\t\t}\n\t\t\t\t</svg>\n\t\t\t} @else if (hasText()) {\n\t\t\t\t<div class=\"pptx-ng-text\" [ngStyle]=\"warpedTextStyle()\">\n\t\t\t\t\t@for (para of paragraphs(); track $index) {\n\t\t\t\t\t\t<p\n\t\t\t\t\t\t\tclass=\"pptx-ng-para\"\n\t\t\t\t\t\t\t[style.padding-left.px]=\"para.indentPx\"\n\t\t\t\t\t\t\t[style.text-indent.px]=\"para.textIndentPx ?? null\"\n\t\t\t\t\t\t\t[style.line-height]=\"para.lineHeight ?? null\"\n\t\t\t\t\t\t\t[style.margin-top.px]=\"para.spaceBeforePx ?? null\"\n\t\t\t\t\t\t\t[style.margin-bottom.px]=\"para.spaceAfterPx ?? null\"\n\t\t\t\t\t\t\t[style.font-size.px]=\"para.strutFontSizePx ?? null\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@if (para.bulletPicture?.src) {\n\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-bullet-image\"\n\t\t\t\t\t\t\t\t\t[src]=\"para.bulletPicture.src\"\n\t\t\t\t\t\t\t\t\t[alt]=\"para.bulletPicture.accessibleLabel\"\n\t\t\t\t\t\t\t\t\t[style.width.px]=\"para.bulletPicture.sizePx\"\n\t\t\t\t\t\t\t\t\t[style.height.px]=\"para.bulletPicture.sizePx\"\n\t\t\t\t\t\t\t\t\tstyle=\"\n\t\t\t\t\t\t\t\t\t\tdisplay: inline-block;\n\t\t\t\t\t\t\t\t\t\tvertical-align: middle;\n\t\t\t\t\t\t\t\t\t\tmargin-inline-end: 4px;\n\t\t\t\t\t\t\t\t\t\tobject-fit: contain;\n\t\t\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t} @else if (para.bulletMarker) {\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-bullet\"\n\t\t\t\t\t\t\t\t\t[ngStyle]=\"para.bulletStyle\"\n\t\t\t\t\t\t\t\t\t[attr.aria-label]=\"para.bulletPicture?.accessibleLabel ?? null\"\n\t\t\t\t\t\t\t\t\t>{{ para.bulletMarker }}</span\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t@if (textBuildSpecs()[$index]; as spec) {\n\t\t\t\t\t\t\t\t<!-- Staged text build: render the split pieces so each one\n\t\t\t\t\t\t\t\t carries its own sub-animation. -->\n\t\t\t\t\t\t\t\t@if (spec.granularity === 'paragraph') {\n\t\t\t\t\t\t\t\t\t<span [attr.data-anim-id]=\"spec.animId\" [ngStyle]=\"buildSpanStyle(spec)\">{{\n\t\t\t\t\t\t\t\t\t\tparagraphText(para)\n\t\t\t\t\t\t\t\t\t}}</span>\n\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t@for (span of spec.spans ?? []; track $index) {\n\t\t\t\t\t\t\t\t\t\t<span [attr.data-anim-id]=\"span.animId\" [ngStyle]=\"buildSpanStyle(span)\">{{\n\t\t\t\t\t\t\t\t\t\t\tspan.text\n\t\t\t\t\t\t\t\t\t\t}}</span>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t@for (run of para.runs; track $index) {\n\t\t\t\t\t\t\t\t\t@if (run.equationXml) {\n\t\t\t\t\t\t\t\t\t\t<pptx-equation-renderer\n\t\t\t\t\t\t\t\t\t\t\t[equationXml]=\"run.equationXml\"\n\t\t\t\t\t\t\t\t\t\t\t[equationNumber]=\"run.equationNumber\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t} @else if (\n\t\t\t\t\t\t\t\t\t\trun.text ===\n\t\t\t\t\t\t\t\t\t\t'\n'\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t} @else if (run.href) {\n\t\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-link\"\n\t\t\t\t\t\t\t\t\t\t\t[href]=\"run.href\"\n\t\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.title]=\"run.tooltip ?? null\"\n\t\t\t\t\t\t\t\t\t\t\t[ngStyle]=\"run.style\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ run.text }}</a\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t\t<span [ngStyle]=\"run.style\">{{ run.text }}</span>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t@if (para.isEmpty) {\n\t\t\t\t\t\t\t\t<!-- An authored blank line has no runs, so without this the\n\t\t\t\t\t\t\t\t <p> collapses to zero height and the gap a deck puts\n\t\t\t\t\t\t\t\t between a heading and its bullet list disappears. -->\n\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t}\n\t@default {\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-unsupported\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-pptx-element]=\"elementMarked() ? 'true' : null\"\n\t\t>\n\t\t\t<div class=\"pptx-ng-placeholder\">{{ placeholderLabel() }}</div>\n\t\t</div>\n\t}\n}\n\n<!-- Soft-edge feather <filter> def, referenced via filter: url(#soft-edge-<id>). -->\n@if (softEdgeFilter(); as sef) {\n\t<svg\n\t\twidth=\"0\"\n\t\theight=\"0\"\n\t\taria-hidden=\"true\"\n\t\tstyle=\"position: absolute; width: 0; height: 0; overflow: hidden\"\n\t>\n\t\t<defs>\n\t\t\t<filter\n\t\t\t\t[attr.id]=\"sef.id\"\n\t\t\t\tx=\"-20%\"\n\t\t\t\ty=\"-20%\"\n\t\t\t\twidth=\"140%\"\n\t\t\t\theight=\"140%\"\n\t\t\t\tcolor-interpolation-filters=\"sRGB\"\n\t\t\t>\n\t\t\t\t<feGaussianBlur in=\"SourceAlpha\" [attr.stdDeviation]=\"sef.radius\" result=\"softEdgeAlpha\" />\n\t\t\t\t<feComposite in=\"SourceGraphic\" in2=\"softEdgeAlpha\" operator=\"in\" />\n\t\t\t</filter>\n\t\t</defs>\n\t</svg>\n}\n\n<!-- Duotone image-effect <filter> def, referenced via filter: url(#id). -->\n@if (duotoneFilter(); as df) {\n\t<svg\n\t\twidth=\"0\"\n\t\theight=\"0\"\n\t\taria-hidden=\"true\"\n\t\tstyle=\"position: absolute; width: 0; height: 0; overflow: hidden\"\n\t>\n\t\t<defs>\n\t\t\t<filter [attr.id]=\"df.id\" color-interpolation-filters=\"sRGB\">\n\t\t\t\t<feColorMatrix type=\"matrix\" [attr.values]=\"df.primitives[0].values\" />\n\t\t\t\t<feComponentTransfer>\n\t\t\t\t\t<feFuncR\n\t\t\t\t\t\ttype=\"linear\"\n\t\t\t\t\t\t[attr.slope]=\"df.primitives[1].channels[0].slope\"\n\t\t\t\t\t\t[attr.intercept]=\"df.primitives[1].channels[0].intercept\"\n\t\t\t\t\t/>\n\t\t\t\t\t<feFuncG\n\t\t\t\t\t\ttype=\"linear\"\n\t\t\t\t\t\t[attr.slope]=\"df.primitives[1].channels[1].slope\"\n\t\t\t\t\t\t[attr.intercept]=\"df.primitives[1].channels[1].intercept\"\n\t\t\t\t\t/>\n\t\t\t\t\t<feFuncB\n\t\t\t\t\t\ttype=\"linear\"\n\t\t\t\t\t\t[attr.slope]=\"df.primitives[1].channels[2].slope\"\n\t\t\t\t\t\t[attr.intercept]=\"df.primitives[1].channels[2].intercept\"\n\t\t\t\t\t/>\n\t\t\t\t</feComponentTransfer>\n\t\t\t</filter>\n\t\t</defs>\n\t</svg>\n}\n" }]
|
|
78411
78588
|
}], propDecorators: { element: [{ type: i0.Input, args: [{ isSignal: true, alias: "element", required: true }] }], mediaDataUrls: [{ type: i0.Input, args: [{ isSignal: true, alias: "mediaDataUrls", required: false }] }], zIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "zIndex", required: false }] }], obstacles: [{ type: i0.Input, args: [{ isSignal: true, alias: "obstacles", required: false }] }], canvasWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasWidth", required: false }] }], canvasHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasHeight", required: false }] }], interactive: [{ type: i0.Input, args: [{ isSignal: true, alias: "interactive", required: false }] }], marked: [{ type: i0.Input, args: [{ isSignal: true, alias: "marked", required: false }] }], presenting: [{ type: i0.Input, args: [{ isSignal: true, alias: "presenting", required: false }] }], editable: [{ type: i0.Input, args: [{ isSignal: true, alias: "editable", required: false }] }], fieldContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "fieldContext", required: false }] }], slideElements: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideElements", required: false }] }], editTemplateMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "editTemplateMode", required: false }] }], parentGroupFill: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentGroupFill", required: false }] }], cellCommit: [{ type: i0.Output, args: ["cellCommit"] }], tableChange: [{ type: i0.Output, args: ["tableChange"] }] } });
|
|
78412
78589
|
|
|
78413
78590
|
/**
|
|
@@ -95141,7 +95318,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
|
|
|
95141
95318
|
}], propDecorators: { canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], slideIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "slideIndex", required: false }] }] } });
|
|
95142
95319
|
|
|
95143
95320
|
// Generated by scripts/inline-shared.mjs from package.json. Do not edit.
|
|
95144
|
-
const PPTX_ANGULAR_VIEWER_VERSION = "2.15.
|
|
95321
|
+
const PPTX_ANGULAR_VIEWER_VERSION = "2.15.2";
|
|
95145
95322
|
|
|
95146
95323
|
/**
|
|
95147
95324
|
* account-page.component.ts: File > Account content.
|
|
@@ -127079,4 +127256,4 @@ function cn(...values) {
|
|
|
127079
127256
|
*/
|
|
127080
127257
|
|
|
127081
127258
|
export { CommentsService as $, ALIGN_OPTIONS as A, AnimationPlaybackService as B, AutosaveService as C, BroadcastDialogComponent as D, CHART_EDITOR_STYLES as E, CURSOR_PALETTE as F, CanvasFitService as G, ChartAxisOptionsComponent as H, ChartAxisStyleOptionsComponent as I, ChartComboTypeOptionsComponent as J, ChartDataEditorComponent as K, ChartDataLabelOptionsComponent as L, ChartDatapointMarkerOptionsComponent as M, ChartDatapointOptionsComponent as N, ChartDisplayOptionsComponent as O, ChartElementViewComponent as P, ChartErrorBarOptionsComponent as Q, ChartMarkerOptionsComponent as R, ChartPartSelectionService as S, ChartPrimitivesComponent as T, ChartRendererComponent as U, ChartTrendlineOptionsComponent as V, CollaborationCursorsComponent as W, CollaborationService as X, ColorChangedImageComponent as Y, CommentMarkersOverlayComponent as Z, CommentsPanelComponent as _, ANIMATION_PRESET_CATEGORIES as a, IsMobileService as a$, ComparePanelComponent as a0, ConnectorRendererComponent as a1, ConnectorTextOverlayComponent as a2, CustomShowsComponent as a3, DATA_TABLE_HEADER_H as a4, DATA_TABLE_KEY_W as a5, DATA_TABLE_PADDING as a6, DATA_TABLE_ROW_H as a7, DEFAULT_BOUNDS as a8, DEFAULT_BROADCAST_SERVER_URL as a9, EffectsPanelComponent as aA, ElementRendererComponent as aB, EmbeddedFontsService as aC, EncryptedFileDialogComponent as aD, EquationEditorDialogComponent as aE, EquationRendererComponent as aF, EquationTemplateGalleryComponent as aG, ExportProgressModalComponent as aH, ExportService as aI, FieldContextService as aJ, FindBarComponent as aK, FindReplaceBarComponent as aL, FollowModeBarComponent as aM, FontEmbeddingListComponent as aN, FontEmbeddingPanelComponent as aO, GALLERY_THEME_PRESETS as aP, GRIDLINE_COLOR as aQ, GradientPickerComponent as aR, HANDOUT_OPTIONS as aS, HeaderFooterDialogComponent as aT, HyperlinkDialogComponent as aU, ImagePropertiesPanelComponent as aV, InkDrawingService as aW, InkRendererComponent as aX, InsertSmartArtDialogComponent as aY, InspectorPaneHeaderComponent as aZ, InspectorPanelComponent as a_, DEFAULT_CANVAS_HEIGHT as aa, DEFAULT_CANVAS_WIDTH as ab, DEFAULT_COLOR_SCHEME as ac, DEFAULT_FILL_COLOR as ad, DEFAULT_LAYOUT as ae, DEFAULT_PALETTE$1 as af, DEFAULT_PATTERN_FILL_PRESET as ag, DEFAULT_PRINT_SETTINGS as ah, DEFAULT_SLIDE_BACKGROUND as ai, DEFAULT_STROKE_COLOR as aj, DEFAULT_STYLE as ak, DEFAULT_TABLE_ROW_HEIGHT as al, DEFAULT_TEXT_COLOR$1 as am, DEFAULT_VIEWER_PROFILE as an, DIRECTIONAL_PRESETS as ao, DIRECTION_OPTIONS as ap, DocumentPropertiesCardComponent as aq, EMBEDDED_FONTS_STYLE_ID as ar, EMPHASIS_PRESETS as as, ENTRANCE_PRESETS as at, TEMPLATES as au, EXIT_PRESETS as av, EditorContextMenuComponent as aw, EditorHistory as ax, EditorStateService as ay, EditorToolbarComponent as az, AUDIENCE_HASH as b, RibbonDrawingGroupComponent as b$, KeepAnnotationsDialogComponent as b0, LOCALE_CATALOG as b1, LONG_PRESS_DURATION_MS as b2, LONG_PRESS_MOVE_TOLERANCE_PX as b3, LoadContentService as b4, LocalPresencePublisher as b5, MAX_ZOOM_SCALE as b6, MIN_ZOOM_SCALE as b7, MOTION_PATH_COLUMNS as b8, MediaPreviewComponent as b9, PresentationAnnotationOverlayComponent as bA, PresentationAnnotationsService as bB, PresentationOverlayComponent as bC, PresentationPropertiesPanelComponent as bD, PresentationSettingsCardComponent as bE, PresentationSubtitleBarComponent as bF, PresentationToolbarComponent as bG, PresentationTransitionOverlayComponent as bH, PresenterViewComponent as bI, PresenterWindowService as bJ, PrintDialogComponent as bK, PrintService as bL, PrintSettingsPanelComponent as bM, PropertiesDialogComponent as bN, REPEAT_MODE_OPTIONS as bO, RESIZE_HANDLES as bP, RULER_FONT_SIZE as bQ, RULER_THICKNESS as bR, ReadingViewOverlayComponent as bS, RemoteSelectionOverlayComponent as bT, RibbonAnimationGalleryComponent as bU, RibbonAnimationsSectionComponent as bV, RibbonArrangeSectionComponent as bW, RibbonColorPopoverComponent as bX, RibbonComponent as bY, RibbonDesignSectionComponent as bZ, RibbonDrawSectionComponent as b_, MediaPropertiesPanelComponent as ba, MediaRendererComponent as bb, MediaTrimTimelineComponent as bc, MobileBottomBarComponent as bd, MobileMenuSheetComponent as be, MobilePresenterViewComponent as bf, MobileSheetComponent as bg, MobileSlidesSheetComponent as bh, MobileToolbarComponent as bi, ModalDialogComponent as bj, Model3DRendererComponent as bk, NotesHandoutCardComponent as bl, NotesPanelComponent as bm, NotesToolbarComponent as bn, OleRendererComponent as bo, OutlineViewOverlayComponent as bp, POWER_POINT_VIEWER_PROVIDERS as bq, PRESENTER_CHANNEL_NAME as br, PRESENTER_MSG_ORIGIN as bs, PRESENTER_TIMER_SEGMENT_MS as bt, PX_PER_CM as bu, PX_PER_INCH as bv, PasswordProtectionDialogComponent as bw, PasswordStrengthMeterComponent as bx, PowerPointViewerComponent as by, PresentToolbarAutoHide as bz, AUDIENCE_NONCE_KEY as c, TIMING_CURVE_OPTIONS as c$, RibbonEditingSectionComponent as c0, RibbonFileSectionComponent as c1, RibbonFontControlsComponent as c2, RibbonHomeSectionComponent as c3, RibbonHyperlinkButtonComponent as c4, RibbonInsertFieldsComponent as c5, RibbonInsertSectionComponent as c6, RibbonMotionPathGalleryComponent as c7, RibbonParagraphControlsComponent as c8, RibbonPrimaryRowComponent as c9, ShowOptionsFieldsetComponent as cA, ShowSlidesFieldsetComponent as cB, SignatureStrippedDialogComponent as cC, SignaturesPanelComponent as cD, SignaturesService as cE, SlideBackgroundCardComponent as cF, SlideCanvasComponent as cG, SlideDefaultInspectorComponent as cH, SlideDiffChangesComponent as cI, SlideDiffRowComponent as cJ, SlideDiffThumbnailsComponent as cK, SlideSizeCardComponent as cL, SlideSorterOverlayComponent as cM, SlideThemeOverridePanelComponent as cN, SlideTransitionCardComponent as cO, SlidesPanelComponent as cP, SmartArt3DRendererComponent as cQ, SmartArt3DService as cR, SmartArtPreviewComponent as cS, SmartArtPropertiesComponent as cT, SmartArtRendererComponent as cU, StatusBarComponent as cV, TABLE_STRUCTURE_TOGGLES as cW, TEXT_3D_BOTTOM_BEVEL_KEYS as cX, TEXT_3D_TOP_BEVEL_KEYS as cY, TEXT_DIRECTION_OPTIONS$1 as cZ, THEME_CATALOG as c_, RibbonReviewSectionComponent as ca, RibbonShapeExtrasComponent as cb, RibbonSlideshowSectionComponent as cc, RibbonTransitionsSectionComponent as cd, RibbonViewSectionComponent as ce, RulerGuidesService as cf, SEQUENCE_OPTIONS as cg, SEVERITY_GROUPS as ch, SEVERITY_LABELS as ci, SHORTCUT_REFERENCE_ITEMS as cj, SLIDE_TRANSITION_KEYFRAMES as ck, DEFAULT_PALETTE as cl, PALETTES$1 as cm, SMART_ART_COLOR_SCHEMES as cn, SMART_ART_STYLE_OPTIONS as co, SUB_ITEM_LABEL as cp, SVG_WARP_PRESETS as cq, SWIPE_MAX_VERTICAL_PX as cr, SWIPE_THRESHOLD_PX as cs, SelectionPaneComponent as ct, SetUpSlideShowDialogComponent as cu, SettingsAppearanceTabComponent as cv, SettingsDialogComponent as cw, SettingsLanguageTabComponent as cx, ShareDialogComponent as cy, ShortcutPanelComponent as cz, AVATAR_COLOR_SWATCHES as d, applyAnimationPreset as d$, TRIGGER_OPTIONS as d0, TYPE_LABELS as d1, TableCellAdvancedFillComponent as d2, TableCellFormattingComponent as d3, TableDataEditorComponent as d4, TablePropertiesComponent as d5, TableRendererComponent as d6, TableResizeOverlayComponent as d7, TableSelectionService as d8, TagsCardComponent as d9, ViewerInspectorPanelService as dA, ViewerKeyboardService as dB, ViewerMobileSheetService as dC, ViewerPresentationModeService as dD, ViewerThemeGalleryService as dE, ViewerTouchGesturesService as dF, ViewerZoomService as dG, WEBM_MIME_CANDIDATES as dH, WriteBackScheduler as dI, ZERO_LINE_COLOR as dJ, ZoomNavigationService as dK, ZoomRendererComponent as dL, ZoomTargetService as dM, addCategory as dN, addCommentToList as dO, addGradientStopPatch as dP, addItem as dQ, addSeries as dR, addSubItem as dS, advanceStep as dT, affordanceElements as dU, aiToggleVisible as dV, alignPatch as dW, animationFor as dX, animationPresetLabelKey as dY, annotationMapToInkInserts as dZ, applyAcceptedDiff as d_, Text3DBevelSectionComponent as da, Text3DPanelComponent as db, TextAdvancedPanelComponent as dc, ThemeEditorFieldsComponent as dd, ThemeGalleryComponent as de, ThemeSelectorCardComponent as df, TitleBarComponent as dg, TitleBarSearchComponent as dh, TransitionDirectionPickerComponent as di, TransitionPreviewComponent as dj, VALIGN_OPTIONS as dk, VIEWER_THEME as dl, VersionHistoryPanelComponent as dm, ViewerCanvasEditingService as dn, ViewerCollabCursorService as dp, ViewerCollaborationSessionService as dq, ViewerCompareService as dr, ViewerCustomShowsService as ds, ViewerDialogsService as dt, ViewerDocumentPropertiesService as du, ViewerExportService as dv, ViewerExtraDialogsComponent as dw, ViewerFileIOService as dx, ViewerFindReplaceService as dy, ViewerFormatPainterService as dz, AXIS_LABEL_COLOR as e, buildZoomViewModel as e$, applyFindReplacements as e0, applyFormatToElement as e1, applyMove as e2, applyResize as e3, applyTableStylePreset as e4, asMediaElement as e5, assignUserColor as e6, attachShowVisibilityPause as e7, attachTouchGestures as e8, axisTickValues as e9, buildFontFaceRule as eA, buildGradientFillCss as eB, buildGridlinesAndLabels as eC, buildHyperlinkPatch as eD, buildInkContainerStyle as eE, buildInkStrokes as eF, buildLegend as eG, buildModel3DContainerStyle as eH, buildModel3DViewModel as eI, buildOleActionModel as eJ, buildOleInfoRows as eK, buildPatternFillCss as eL, buildPrintHtmlDocument as eM, buildPropertiesPatch as eN, buildRegionMapViewModel as eO, buildSaveSlides as eP, buildShareUrl as eQ, buildSmartArtInsertElement as eR, buildSmartArtNodes as eS, buildStockViewModel as eT, buildSurfaceViewModel as eU, buildTableViewModel as eV, buildTreemapViewModel as eW, buildTrimFragment as eX, buildWaterfallViewModel as eY, buildZeroLine as eZ, buildZoomContainerStyle as e_, beginNodeEdit as ea, bevelSizePatch as eb, boolFromEvent as ec, bringForward as ed, bringToFront as ee, buildBarActions as ef, buildBroadcastConfig as eg, buildBroadcastViewerUrl as eh, buildCategoryLabels as ei, buildCellParagraphs as ej, buildChartViewModel as ek, buildChatLogExport as el, buildChatLogMarkdown as em, buildChromeStyle as en, buildClearHyperlinkPatch as eo, buildClickGroups as ep, buildColStyles as eq, buildCollaborationConfig as er, buildComboViewModel as es, buildCssGradientFromShapeStyle as et, buildDuotoneFilter as eu, buildDuotoneFilterId as ev, buildEmbeddedFontStyles as ew, buildEquationElement as ex, buildEquationSegment as ey, buildFallbackViewModel as ez, AccessibilityPanelComponent as f, computeTextLines as f$, bulletIndentPx as f0, canAddTopLevelNode as f1, canGroupSelection as f2, canRemoveTopLevelNode as f3, canSetStrokeWidth as f4, canStartBroadcast as f5, canStartShare as f6, canUngroupSelection as f7, canUseClipboard as f8, captionDisplayText as f9, computeBubbleRadius as fA, computeCornerHandle as fB, computeDataTablePrimitives as fC, computeDistribute as fD, computeDrawingViewBox as fE, computeErrorBarPrimitives as fF, computeFocusTargets as fG, computeHandleBoxes as fH, computeHandoutLayout as fI, computeIsMobile as fJ, computeIsTablet as fK, computeLinePoints as fL, computeLinearRegression as fM, computePageCount as fN, computePieLayout as fO, computePieSlicePath as fP, computePieSlices as fQ, computePlotLayout as fR, computeRSquared as fS, computeRadarPoints as fT, computeScatterDots as fU, computeSelectionBoxes as fV, computeSingleSelected as fW, computeSlideIndices as fX, computeSnap as fY, computeStackedBarRects as fZ, computeStackedValueRange as f_, cellRunStyle as fa, cellStyleToStyleMap as fb, cellTdStyle as fc, changeCountLabel as fd, changeIcon as fe, characterSpacingPatch as ff, checkFontAvailable as fg, clampCursorPosition as fh, clampGifDimensions as fi, clampIndex as fj, clampNotesFontSize as fk, clampScale as fl, clampStep as fm, clearAllLocalViewerData as fn, clearAudienceContent as fo, cn as fp, collectAccessibilityIssues as fq, collectElementText as fr, collectSlideText as fs, collectStoredChats as ft, collectUsedFontFamilies as fu, columnWidthStyle as fv, commitNodeText as fw, computeAlign as fx, computeAxisTitlePrimitives as fy, computeBarRects as fz, AccessibilityService as g, formatPropertyDate as g$, computeTrendlinePrimitives as g0, computeValueRange as g1, convertOmmlToMathMl as g2, copyFormatFromElement as g3, countAccessibilityIssues as g4, countAnnotationStrokes as g5, createAngularAiBridge as g6, createCustomShow as g7, createSwipeDismissDrag as g8, createWebrtcBundle as g9, enableSoftEdgePatch as gA, encodeGif as gB, endShowMediaCleanup as gC, estimatePageCount as gD, evenColumnWidths as gE, evenRowHeights as gF, exitPresentationFullscreen as gG, exportAiChatLogs as gH, extractPathPoints as gI, eyedropperAvailable as gJ, fillColorOf as gK, findInSlides as gL, findOwningSlideIndex as gM, findSlideIndexByElementId as gN, firstVisibleIndex as gO, fitPolynomial as gP, fitZoom as gQ, focusTargetChips as gR, fontMimeForFormat as gS, fontSizeOf as gT, forgetSessionDeck as gU, formatAutoNumber as gV, formatAxisValue as gW, formatBytes as gX, formatCursorLabel as gY, formatElapsed as gZ, formatFileSize as g_, createWebsocketBundle as ga, cssObjectToStyleMap as gb, currentColorScheme as gc, currentLayout as gd, currentStyle as ge, defaultCssVars as gf, defaultRadius as gg, defaultThemeColors as gh, deleteElementsByIds as gi, deleteVersion as gj, demoteNode as gk, deriveModel3DBlobUrl as gl, derivePresenceList as gm, describeSmartArtBounds as gn, disableGlowPatch as go, disableInnerShadowPatch as gp, disableOuterShadowPatch as gq, disableReflectionPatch as gr, disableSoftEdgePatch as gs, duplicateElementById as gt, durationOf as gu, effectsStateOf as gv, enableGlowPatch as gw, enableInnerShadowPatch as gx, enableOuterShadowPatch as gy, enableReflectionPatch as gz, AccountPageComponent as h, isSigned as h$, formatTime as h0, fpsToFrameIntervalMs as h1, generateBroadcastRoomId as h2, generateCommentId as h3, generateCustomShowId as h4, generatePressureCircles as h5, generateTicks as h6, getClrChangeParams as h7, getContainerStyle as h8, getDuotoneFilterDef as h9, gradientStateOf as hA, gradientStatePatch as hB, gridColumns as hC, groupElements as hD, groupIssuesBySeverity as hE, hasAnimation as hF, hasCopyableFormat as hG, hasExistingLink as hH, hasExitedFullscreen as hI, hasGradientFill as hJ, hasPressureVariation as hK, hasVisibleSlideAfter as hL, headerLabel as hM, imageDimensions as hN, inkViewBox as hO, insertTableElementColumn as hP, insertTableElementRow as hQ, interpolateWidth as hR, isAudienceTab as hS, isBold as hT, isBrowserOpenableMime as hU, isChildNode as hV, isElementInteractive as hW, isInjectableUrl as hX, isItalic as hY, isPpactionUrl as hZ, isPresenterMessage as h_, getImageSrc as ha, getLocalStorageUsageSummary as hb, getOleAriaLabel as hc, getOleBadgeLabel as hd, getOleDisplayName as he, getOleDownloadFileName as hf, getOleTypeColor as hg, getOleTypeLabel as hh, getPasswordStrength as hi, getPatternSvg as hj, getPlaceholderStyle as hk, getVersions as hl, getResolvedShapeClipPath as hm, getResolvedShapeClipPathFor as hn, getSessionTabId as ho, getShapeFillStrokeStyle as hp, getSlideBackgroundStyle as hq, getSlideTransitionAnimations as hr, getSmartArtNodeBounds as hs, getSpeechRecognitionCtor as ht, getTextBlockStyle as hu, getTextWarp as hv, getTouchDistance as hw, getWarpCategory as hx, getWarpPath as hy, gradientStateFromStyle as hz, ActionSettingsPanelComponent as i, pickFile as i$, isTextElement as i0, isTwoTableFocus as i1, isUnderline as i2, isUrlSafe as i3, isValidRoomId as i4, isViewportBackgroundPressTarget as i5, isZoomActivationKey as i6, issueTrackKey as i7, issueTypeLabel as i8, keyToLabel as i9, nextVisibleIndex as iA, nodeBold as iB, nodeEditBox as iC, nodeFillColor as iD, nodeFontColor as iE, nodeIdFromKey as iF, nodeItalic as iG, nodeStyle as iH, normalizeFontFormat as iI, normalizeSlidesPerPage as iJ, normalizeValue as iK, numFromEvent as iL, ommlToMathml as iM, ooxmlDashToCssBorderStyle as iN, openNativeEyeDropper as iO, overallStatus as iP, paletteColor as iQ, parseAudienceNonce as iR, parseNodeTextarea as iS, partitionSlides as iT, patchChartData as iU, patchChartStyle as iV, patchTableData as iW, patchTextStyle as iX, patternPresetOptions as iY, pendingElementStyles as iZ, pickColorByClickFallback as i_, lastVisibleIndex as ia, latexToMathml as ib, linePointsToSvgString as ic, lineSpacingPatch as id, loadAudienceContent as ie, loadSessionDeck as ig, mergeCaptionResults as ih, mergeDown as ii, mergeRight as ij, mergeSelection as ik, moveElementBy as il, moveNodeDown as im, moveNodeUp as io, msToFrameDelayCs as ip, narrowToCircle as iq, narrowToPolygon as ir, narrowToRect as is, newChartElement as it, newEquationElement as iu, newPresetShapeElement as iv, newShapeElement as iw, newSmartArtElement as ix, newTableElement as iy, newTextElement as iz, AdvancedChartEditorComponent as j, saveViewerProfile as j$, pickSupportedMimeType as j0, planGifFrames as j1, planVideoSegments as j2, pointsToSvgPathD as j3, presenceToCursors as j4, presentationStageStyle as j5, presenterTimerProgress as j6, presetByLayout as j7, presetsForCategory as j8, pressuresToWidths as j9, resizeElement as jA, resolveCaptionTracks as jB, resolveChartKind as jC, resolveFontVariant as jD, resolveHyperlinkHref as jE, resolveInteractiveElementId as jF, resolveMediaSrc as jG, resolveOleType as jH, resolveParagraphBullet as jI, resolvePresenterNotes as jJ, resolveProfileInitial as jK, resolveRegionCode as jL, resolveSlideAutoAdvanceMs as jM, resolvePalette as jN, resolveThemeCatalogEntry as jO, resolveTransitionDuration as jP, restoreSessionDeck as jQ, revealedElementStyles as jR, routeOrthogonalConnector as jS, rowStyle as jT, rulerDragToGuidePosition as jU, rulerHighlight as jV, rulerStripTicks as jW, sampleColorFromSlide as jX, sanitizeColor as jY, sanitizeSlideIndex as jZ, sanitizeUserName as j_, prevVisibleIndex as ja, projectDrawingShapes as jb, promoteNode as jc, provideViewerTheme as jd, radarAngle as je, radarRingPoints as jf, readAsDataUrl as jg, recordWebm as jh, redistributeColumnWidth as ji, registerCrossSlideAudio as jj, rememberSessionDeck as jk, removeAnimation as jl, removeCategory as jm, removeTableElementColumn as jn, removeCommentFromList as jo, removeElementAnimation as jp, removeGradientStopPatch as jq, removeNode as jr, removeTableElementRow as js, removeSeries as jt, renderToCanvas as ju, reorderAnimationDown as jv, reorderAnimationUp as jw, replaceInSlides as jx, replaceMatch as jy, requestPresentationFullscreen as jz, AiChangeOverlayComponent as k, smartArtNodes as k$, scanAvailableFonts as k0, searchSlides as k1, seedBroadcastFields as k2, seedHyperlinkDraft as k3, seedPropertiesDraft as k4, seedShareFields as k5, segmentFrameCount as k6, selectValue$2 as k7, sendBackward as k8, sendToBack as k9, setRepeatCount as kA, setRepeatMode as kB, setSequence as kC, setSeriesChartType as kD, setSeriesColor as kE, setSeriesErrorBars as kF, setSeriesMarker as kG, setSeriesName as kH, setSeriesTrendline as kI, setSeriesValue as kJ, setStyle as kK, setTimingCurve as kL, setTitle as kM, setTrigger as kN, setTriggerShapeId as kO, shapeStylePatch as kP, sheetAfterNavigate as kQ, shouldBlockClickAdvance as kR, shouldUseSvgWarp as kS, showDirectionPicker as kT, showsTemplateAffordance as kU, signatureCountLabel as kV, signatureKey as kW, signatureTimestamp as kX, signerName as kY, statusLabel as kZ, slideNumberOf as k_, sequentialColorScale as ka, serializeWriteBack as kb, seriesColor as kc, setAnimationEmphasis as kd, setAnimationEntrance as ke, setAnimationExit as kf, setAxis as kg, setAxisLogScale as kh, setAxisTitleStyle as ki, setCategoryLabel as kj, setCellText as kk, setColorScheme as kl, setDataLabels as km, setDataPointExplosion as kn, setDataPointFill as ko, setDataPointLabel as kp, setDataPointMarker as kq, setDelay as kr, setDirection as ks, setDuration as kt, setElementPosition as ku, setGridlineStyle as kv, setLayout as kw, setLegend as kx, setNodeStyle as ky, setNodeText as kz, AiChatPanelComponent as l, paletteColour as l0, snapToGridStep as l1, splitCursorCell as l2, splitMergedCell as l3, statusKind as l4, statusLabel$1 as l5, storeAudienceContent as l6, stringFromEvent$5 as l7, strokeColorOf as l8, strokeToInkElement as l9, updateReflectionPatch as lA, vAlignPatch as lB, validatePassword as lC, validatePrintSettings as lD, validateRoomId as lE, valueToY as lF, vermilionDarkColors as lG, vermilionDarkTheme as lH, vermilionLightColors as lI, vermilionLightTheme as lJ, vermilionRadius as lK, waypointsToPathD as lL, worstStatus as lM, zoomTargetSlideIndex as lN, strokeWidthOf as la, styleShadowFilter as lb, textAdvancedPatch as lc, textAdvancedStateFromStyle as ld, textAdvancedStateOf as le, textColorOf as lf, textDirectionPatch as lg, textStyleOf as lh, textStylePatch as li, themeStyle as lj, themeToCssVars as lk, thumbnailHeight as ll, thumbnailZoom as lm, toggleCommentResolvedInList as ln, toggleNodeBold as lo, toggleNodeItalic as lp, toggleSheet as lq, topLevelNodeCount as lr, transformSelectedTextCase as ls, translationsEn as lt, ungroupElements as lu, updateElementById as lv, updateGlowPatch as lw, updateGradientStopPatch as lx, updateInnerShadowPatch as ly, updateOuterShadowPatch as lz, AiChatService as m, AiComposerComponent as n, AiFocusBarComponent as o, AiFocusHighlightOverlayComponent as p, AiHistoryMenuComponent as q, AiHistoryService as r, AiMessageListComponent as s, toChatSummary as t, AiPanelStore as u, AiProposalCardComponent as v, AiSettingsSectionComponent as w, AiToolCallCardComponent as x, AnimationAuthorPanelComponent as y, AnimationPanelComponent as z };
|
|
127082
|
-
//# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-
|
|
127259
|
+
//# sourceMappingURL=pptx-angular-viewer-pptx-angular-viewer-BHE3UItD.mjs.map
|