pptx-angular-viewer 1.1.33 → 1.1.35

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.
@@ -1,7 +1,7 @@
1
1
  import { NgStyle, NgClass, NgTemplateOutlet } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
3
  import { InjectionToken, input, output, computed, ChangeDetectionStrategy, Component, signal, Injectable, HostListener, effect, inject, DestroyRef, ElementRef, viewChild, afterNextRender, Injector } from '@angular/core';
4
- import { guideEmuToPx, getShapeClipPath, getAdjustmentAwareShapeClipPath, getShapeClipPathFromPreset, getCloudPathForRendering, hasShapeProperties, applyDrawingColorTransforms as applyDrawingColorTransforms$1, hslToRgb as hslToRgb$1, PRESET_COLOR_MAP, isImageLikeElement, hasTextProperties, MIN_ELEMENT_SIZE as MIN_ELEMENT_SIZE$2, THEME_COLOR_SCHEME_KEYS, getLinkedTextBoxSegments, deobfuscateFont, detectFontFormat, getSubstituteFontFamily, checkMissingAltText, checkMissingSlideTitle, checkLowContrast, checkComplexTables, checkBlankSlide, checkDuplicateTitles, createChartElement, formatCommentTimestamp, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointExplosion, chartDataAddSeries, chartDataRemoveSeries, chartDataAddCategory, chartDataRemoveCategory, chartDataUpdatePoint, chartDataChangeType, PptxHandler, EncryptedFileError, parseSignatureXml, isInkElement, isZoomElement, THEME_PRESETS, applyThemeToData, getAnimationPresetInfo } from 'pptx-viewer-core';
4
+ import { guideEmuToPx, getShapeClipPath, getAdjustmentAwareShapeClipPath, getShapeClipPathFromPreset, getCloudPathForRendering, hasShapeProperties, applyDrawingColorTransforms as applyDrawingColorTransforms$1, hslToRgb as hslToRgb$1, PRESET_COLOR_MAP, isImageLikeElement, hasTextProperties, MIN_ELEMENT_SIZE as MIN_ELEMENT_SIZE$2, THEME_COLOR_SCHEME_KEYS, getLinkedTextBoxSegments, deobfuscateFont, detectFontFormat, getSubstituteFontFamily, checkMissingAltText, checkMissingSlideTitle, checkLowContrast, checkComplexTables, checkBlankSlide, checkDuplicateTitles, createChartElement, formatCommentTimestamp, setChartAxisLogScale, setChartAxisTitleStyle, setChartAxisGridlineStyle, setChartSeriesMarker, setChartSeriesChartType, setChartDataPointFill, setChartDataPointExplosion, chartDataAddSeries, chartDataRemoveSeries, chartDataAddCategory, chartDataRemoveCategory, chartDataUpdatePoint, chartDataChangeType, updateSmartArtNodeText, addSmartArtNodeAsChild, removeSmartArtNode, promoteSmartArtNode, demoteSmartArtNode, reorderSmartArtNode, switchSmartArtLayout, SWITCHABLE_LAYOUT_TYPES, PptxHandler, EncryptedFileError, parseSignatureXml, isInkElement, isZoomElement, THEME_PRESETS, applyThemeToData, getAnimationPresetInfo } from 'pptx-viewer-core';
5
5
  import { jsPDF } from 'jspdf';
6
6
  import html2canvasPro from 'html2canvas-pro';
7
7
  import { DomSanitizer } from '@angular/platform-browser';
@@ -24354,6 +24354,57 @@ const PRESETS = [
24354
24354
  category: 'process',
24355
24355
  defaultItems: ['Phase 1', 'Phase 2', 'Phase 3'],
24356
24356
  },
24357
+ {
24358
+ layout: 'basicTimeline',
24359
+ label: 'Basic Timeline',
24360
+ category: 'process',
24361
+ defaultItems: ['2021', '2022', '2023'],
24362
+ },
24363
+ {
24364
+ layout: 'bendingProcess',
24365
+ label: 'Bending Process',
24366
+ category: 'process',
24367
+ defaultItems: ['Step 1', 'Step 2', 'Step 3', 'Step 4'],
24368
+ },
24369
+ // Relationship: target / matrix / pyramid / funnel / gear families.
24370
+ // These share the dialog's "relationship" sidebar tab (PowerPoint groups
24371
+ // matrix/pyramid under separate tabs, which this gallery folds into one).
24372
+ {
24373
+ layout: 'basicTarget',
24374
+ label: 'Basic Target',
24375
+ category: 'relationship',
24376
+ defaultItems: ['Outer', 'Middle', 'Inner'],
24377
+ },
24378
+ {
24379
+ layout: 'interlockingGears',
24380
+ label: 'Interlocking Gears',
24381
+ category: 'relationship',
24382
+ defaultItems: ['Gear 1', 'Gear 2', 'Gear 3'],
24383
+ },
24384
+ {
24385
+ layout: 'basicMatrix',
24386
+ label: 'Basic Matrix',
24387
+ category: 'relationship',
24388
+ defaultItems: ['Quadrant 1', 'Quadrant 2', 'Quadrant 3', 'Quadrant 4'],
24389
+ },
24390
+ {
24391
+ layout: 'basicPyramid',
24392
+ label: 'Basic Pyramid',
24393
+ category: 'relationship',
24394
+ defaultItems: ['Top', 'Middle', 'Base'],
24395
+ },
24396
+ {
24397
+ layout: 'invertedPyramid',
24398
+ label: 'Inverted Pyramid',
24399
+ category: 'relationship',
24400
+ defaultItems: ['Wide', 'Narrower', 'Tip'],
24401
+ },
24402
+ {
24403
+ layout: 'basicFunnel',
24404
+ label: 'Basic Funnel',
24405
+ category: 'relationship',
24406
+ defaultItems: ['Input 1', 'Input 2', 'Input 3', 'Result'],
24407
+ },
24357
24408
  ];
24358
24409
  /** Sidebar tabs, in display order. `label` is a (best-effort) i18n key. */
24359
24410
  const CATEGORIES = [
@@ -35190,6 +35241,555 @@ function stringFromEvent$2(event) {
35190
35241
  * preserves the historical Angular import surface.
35191
35242
  */
35192
35243
 
35244
+ /**
35245
+ * smart-art-properties-helpers.ts: pure logic for the Angular SmartArt inspector.
35246
+ *
35247
+ * The presentational `SmartArtPropertiesComponent` is intentionally thin: every
35248
+ * mutation it performs is delegated to one of the pure functions below, which in
35249
+ * turn wrap the framework-agnostic SmartArt editing operations re-exported from
35250
+ * `editor-insert.ts` (sourced from `pptx-viewer-core`). Keeping this logic out of
35251
+ * the component lets it be unit-tested in plain vitest (the Angular package's
35252
+ * vitest setup has no Angular compiler, so TestBed component tests are not
35253
+ * available - see PORTING.md).
35254
+ *
35255
+ * Mirrors the React inspector:
35256
+ * packages/react/src/viewer/components/inspector/SmartArtPropertiesPanel.tsx
35257
+ * packages/react/src/viewer/components/inspector/SmartArtLayoutSwitcher.tsx
35258
+ *
35259
+ * @module angular-viewer/smart-art-properties-helpers
35260
+ */
35261
+ // ── Option constants (mirror the React panel) ───────────────────────────────
35262
+ /** Selectable colour schemes, in display order. */
35263
+ const SMART_ART_COLOR_SCHEMES = [
35264
+ 'colorful1',
35265
+ 'colorful2',
35266
+ 'colorful3',
35267
+ 'monochromatic1',
35268
+ 'monochromatic2',
35269
+ ];
35270
+ /** Selectable style intensities, in display order. */
35271
+ const SMART_ART_STYLE_OPTIONS = [
35272
+ 'flat',
35273
+ 'moderate',
35274
+ 'intense',
35275
+ ];
35276
+ /** Default colour scheme used when the data has none set. */
35277
+ const DEFAULT_COLOR_SCHEME = 'colorful1';
35278
+ /** Default style used when the data has none set. */
35279
+ const DEFAULT_STYLE = 'flat';
35280
+ /** Default resolved layout used when the data has none set. */
35281
+ const DEFAULT_LAYOUT = 'list';
35282
+ /** Default label for a newly added sub-item (matches the React panel). */
35283
+ const SUB_ITEM_LABEL = 'Sub-item';
35284
+ // ── Read helpers ─────────────────────────────────────────────────────────────
35285
+ /** The diagram's nodes, or an empty array when none are present. */
35286
+ function smartArtNodes(data) {
35287
+ return data.nodes ?? [];
35288
+ }
35289
+ /** Whether a node has a parent (is a child / sub-item). */
35290
+ function isChildNode(node) {
35291
+ return Boolean(node.parentId);
35292
+ }
35293
+ /** Current colour scheme, falling back to the default. */
35294
+ function currentColorScheme(data) {
35295
+ return data.colorScheme ?? DEFAULT_COLOR_SCHEME;
35296
+ }
35297
+ /** Current style intensity, falling back to the default. */
35298
+ function currentStyle(data) {
35299
+ return data.style ?? DEFAULT_STYLE;
35300
+ }
35301
+ /** Current resolved layout, falling back to the default. */
35302
+ function currentLayout(data) {
35303
+ return data.resolvedLayoutType ?? DEFAULT_LAYOUT;
35304
+ }
35305
+ // ── Mutation helpers (all return new immutable PptxSmartArtData) ──────────────
35306
+ /** Update a single node's text. */
35307
+ function setNodeText(data, nodeId, text) {
35308
+ return updateSmartArtNodeText(data, nodeId, text);
35309
+ }
35310
+ /** Append a new top-level item. */
35311
+ function addItem(data) {
35312
+ return addSmartArtNodeAsChild(data);
35313
+ }
35314
+ /** Add a sub-item beneath the given parent node. */
35315
+ function addSubItem(data, parentId) {
35316
+ return addSmartArtNodeAsChild(data, parentId, SUB_ITEM_LABEL);
35317
+ }
35318
+ /** Remove a node by id (no-op when it would empty the diagram). */
35319
+ function removeNode(data, nodeId) {
35320
+ if (smartArtNodes(data).length <= 1) {
35321
+ return data;
35322
+ }
35323
+ return removeSmartArtNode(data, nodeId);
35324
+ }
35325
+ /** Promote a node up one level in the hierarchy. */
35326
+ function promoteNode(data, nodeId) {
35327
+ return promoteSmartArtNode(data, nodeId);
35328
+ }
35329
+ /** Demote a node beneath its preceding sibling. */
35330
+ function demoteNode(data, nodeId) {
35331
+ return demoteSmartArtNode(data, nodeId);
35332
+ }
35333
+ /** Move a node up among its siblings. */
35334
+ function moveNodeUp(data, nodeId) {
35335
+ return reorderSmartArtNode(data, nodeId, -1);
35336
+ }
35337
+ /** Move a node down among its siblings. */
35338
+ function moveNodeDown(data, nodeId) {
35339
+ return reorderSmartArtNode(data, nodeId, 1);
35340
+ }
35341
+ /** Apply a new colour scheme; clears stale drawing shapes for reflow. */
35342
+ function setColorScheme(data, scheme) {
35343
+ return { ...data, colorScheme: scheme, drawingShapes: undefined };
35344
+ }
35345
+ /** Apply a new style intensity; clears stale drawing shapes for reflow. */
35346
+ function setStyle(data, style) {
35347
+ return { ...data, style, drawingShapes: undefined };
35348
+ }
35349
+ /**
35350
+ * Switch the diagram to a new layout, preserving node data and connections.
35351
+ * Returns the original data unchanged when the target equals the current layout.
35352
+ */
35353
+ function setLayout(data, layout) {
35354
+ if (currentLayout(data) === layout) {
35355
+ return data;
35356
+ }
35357
+ return switchSmartArtLayout(data, layout);
35358
+ }
35359
+
35360
+ /**
35361
+ * smart-art-properties.component.ts: SmartArt editing inspector (Angular).
35362
+ *
35363
+ * Selector: `pptx-smart-art-properties`
35364
+ *
35365
+ * Presentational panel for editing a selected SmartArt element's data model:
35366
+ * per-node text editing, add item / add sub-item, remove, promote / demote,
35367
+ * reorder up / down, colour-scheme select, style toggle (flat / moderate /
35368
+ * intense), and a layout switcher. All mutations are delegated to the pure
35369
+ * helpers in `smart-art-properties-helpers.ts` (which wrap the core editing ops
35370
+ * re-exported via `editor-insert.ts`); no editing logic lives here. Every edit
35371
+ * is emitted as a complete new `PptxSmartArtData` via `smartArtDataChange`, so
35372
+ * the parent (`InspectorPanelComponent`) can commit it through
35373
+ * `EditorStateService.updateElement()` as a single undo/redo history entry.
35374
+ *
35375
+ * Ported from the React inspector:
35376
+ * packages/react/src/viewer/components/inspector/SmartArtPropertiesPanel.tsx
35377
+ * packages/react/src/viewer/components/inspector/SmartArtLayoutSwitcher.tsx
35378
+ *
35379
+ * Usage:
35380
+ * ```html
35381
+ * <pptx-smart-art-properties
35382
+ * [smartArtData]="data"
35383
+ * [canEdit]="canEdit"
35384
+ * (smartArtDataChange)="onSmartArtChange($event)"
35385
+ * />
35386
+ * ```
35387
+ *
35388
+ * @module angular-viewer/smart-art-properties
35389
+ */
35390
+ class SmartArtPropertiesComponent {
35391
+ /** The SmartArt data model being edited. */
35392
+ smartArtData = input.required(/* @ts-ignore */
35393
+ ...(ngDevMode ? [{ debugName: "smartArtData" }] : /* istanbul ignore next */ []));
35394
+ /** Whether editing is enabled (read-only when false). */
35395
+ canEdit = input(true, /* @ts-ignore */
35396
+ ...(ngDevMode ? [{ debugName: "canEdit" }] : /* istanbul ignore next */ []));
35397
+ /** Emits a complete new data model after any edit. */
35398
+ smartArtDataChange = output();
35399
+ // ── Static option lists (template-bound) ─────────────────────────────────
35400
+ layoutTypes = SWITCHABLE_LAYOUT_TYPES;
35401
+ colorSchemes = SMART_ART_COLOR_SCHEMES;
35402
+ styleOptions = SMART_ART_STYLE_OPTIONS;
35403
+ // ── Derived state ─────────────────────────────────────────────────────────
35404
+ nodes = computed(() => smartArtNodes(this.smartArtData()), /* @ts-ignore */
35405
+ ...(ngDevMode ? [{ debugName: "nodes" }] : /* istanbul ignore next */ []));
35406
+ activeLayout = computed(() => currentLayout(this.smartArtData()), /* @ts-ignore */
35407
+ ...(ngDevMode ? [{ debugName: "activeLayout" }] : /* istanbul ignore next */ []));
35408
+ activeColorScheme = computed(() => currentColorScheme(this.smartArtData()), /* @ts-ignore */
35409
+ ...(ngDevMode ? [{ debugName: "activeColorScheme" }] : /* istanbul ignore next */ []));
35410
+ activeStyle = computed(() => currentStyle(this.smartArtData()), /* @ts-ignore */
35411
+ ...(ngDevMode ? [{ debugName: "activeStyle" }] : /* istanbul ignore next */ []));
35412
+ isChild = isChildNode;
35413
+ // ── Event handlers (each emits a fresh data model) ───────────────────────
35414
+ onLayout(layout) {
35415
+ this.commit(setLayout(this.smartArtData(), layout));
35416
+ }
35417
+ onColorScheme(event) {
35418
+ const value = selectValue(event);
35419
+ if (value === null) {
35420
+ return;
35421
+ }
35422
+ this.commit(setColorScheme(this.smartArtData(), value));
35423
+ }
35424
+ onStyle(style) {
35425
+ this.commit(setStyle(this.smartArtData(), style));
35426
+ }
35427
+ onAddItem() {
35428
+ this.commit(addItem(this.smartArtData()));
35429
+ }
35430
+ onAddSubItem(parentId) {
35431
+ this.commit(addSubItem(this.smartArtData(), parentId));
35432
+ }
35433
+ onRemove(nodeId) {
35434
+ this.commit(removeNode(this.smartArtData(), nodeId));
35435
+ }
35436
+ onPromote(nodeId) {
35437
+ this.commit(promoteNode(this.smartArtData(), nodeId));
35438
+ }
35439
+ onDemote(nodeId) {
35440
+ this.commit(demoteNode(this.smartArtData(), nodeId));
35441
+ }
35442
+ onMoveUp(nodeId) {
35443
+ this.commit(moveNodeUp(this.smartArtData(), nodeId));
35444
+ }
35445
+ onMoveDown(nodeId) {
35446
+ this.commit(moveNodeDown(this.smartArtData(), nodeId));
35447
+ }
35448
+ onNodeText(event, nodeId) {
35449
+ const value = inputValue(event);
35450
+ if (value === null) {
35451
+ return;
35452
+ }
35453
+ this.commit(setNodeText(this.smartArtData(), nodeId, value));
35454
+ }
35455
+ onNodeKeydown(event, nodeId) {
35456
+ if (event.key !== 'Tab') {
35457
+ return;
35458
+ }
35459
+ event.preventDefault();
35460
+ const next = event.shiftKey
35461
+ ? promoteNode(this.smartArtData(), nodeId)
35462
+ : demoteNode(this.smartArtData(), nodeId);
35463
+ this.commit(next);
35464
+ }
35465
+ /** Emit a new data model only when it differs from the current one. */
35466
+ commit(next) {
35467
+ if (!this.canEdit() || next === this.smartArtData()) {
35468
+ return;
35469
+ }
35470
+ this.smartArtDataChange.emit(next);
35471
+ }
35472
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: SmartArtPropertiesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
35473
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: SmartArtPropertiesComponent, isStandalone: true, selector: "pptx-smart-art-properties", inputs: { smartArtData: { classPropertyName: "smartArtData", publicName: "smartArtData", isSignal: true, isRequired: true, transformFunction: null }, canEdit: { classPropertyName: "canEdit", publicName: "canEdit", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { smartArtDataChange: "smartArtDataChange" }, ngImport: i0, template: `
35474
+ <section class="pptx-sa-props" aria-label="SmartArt properties">
35475
+ <h3 class="pptx-sa-props__heading">SmartArt</h3>
35476
+
35477
+ <!-- ── Layout switcher ──────────────────────────────────────────── -->
35478
+ <div class="pptx-sa-props__field">
35479
+ <span class="pptx-sa-props__label">Layout</span>
35480
+ <div class="pptx-sa-props__layouts" role="group" aria-label="Switch layout">
35481
+ @for (layout of layoutTypes; track layout) {
35482
+ <button
35483
+ type="button"
35484
+ class="pptx-sa-props__layout"
35485
+ [class.is-active]="activeLayout() === layout"
35486
+ [disabled]="!canEdit()"
35487
+ [attr.aria-pressed]="activeLayout() === layout"
35488
+ (click)="onLayout(layout)"
35489
+ >
35490
+ {{ layout }}
35491
+ </button>
35492
+ }
35493
+ </div>
35494
+ </div>
35495
+
35496
+ <!-- ── Colour scheme ────────────────────────────────────────────── -->
35497
+ <label class="pptx-sa-props__field">
35498
+ <span class="pptx-sa-props__label">Color scheme</span>
35499
+ <select
35500
+ class="pptx-sa-props__select"
35501
+ [disabled]="!canEdit()"
35502
+ [value]="activeColorScheme()"
35503
+ (change)="onColorScheme($event)"
35504
+ >
35505
+ @for (scheme of colorSchemes; track scheme) {
35506
+ <option [value]="scheme">{{ scheme }}</option>
35507
+ }
35508
+ </select>
35509
+ </label>
35510
+
35511
+ <!-- ── Style intensity ──────────────────────────────────────────── -->
35512
+ <div class="pptx-sa-props__field">
35513
+ <span class="pptx-sa-props__label">Style</span>
35514
+ <div class="pptx-sa-props__styles" role="group" aria-label="Style intensity">
35515
+ @for (styleOpt of styleOptions; track styleOpt) {
35516
+ <button
35517
+ type="button"
35518
+ class="pptx-sa-props__style"
35519
+ [class.is-active]="activeStyle() === styleOpt"
35520
+ [disabled]="!canEdit()"
35521
+ [attr.aria-pressed]="activeStyle() === styleOpt"
35522
+ (click)="onStyle(styleOpt)"
35523
+ >
35524
+ {{ styleOpt }}
35525
+ </button>
35526
+ }
35527
+ </div>
35528
+ </div>
35529
+
35530
+ <!-- ── Text pane / node list ────────────────────────────────────── -->
35531
+ <div class="pptx-sa-props__pane-header">
35532
+ <span class="pptx-sa-props__label">Text pane ({{ nodes().length }})</span>
35533
+ <button
35534
+ type="button"
35535
+ class="pptx-sa-props__btn"
35536
+ [disabled]="!canEdit()"
35537
+ (click)="onAddItem()"
35538
+ >
35539
+ + Item
35540
+ </button>
35541
+ </div>
35542
+
35543
+ <ul class="pptx-sa-props__nodes" role="list">
35544
+ @for (node of nodes(); track node.id; let i = $index) {
35545
+ <li
35546
+ class="pptx-sa-props__node"
35547
+ [class.pptx-sa-props__node--child]="isChild(node)"
35548
+ [attr.data-node-id]="node.id"
35549
+ >
35550
+ <span class="pptx-sa-props__bullet">{{ isChild(node) ? '•' : i + 1 }}</span>
35551
+ <input
35552
+ type="text"
35553
+ class="pptx-sa-props__node-input"
35554
+ [disabled]="!canEdit()"
35555
+ [value]="node.text"
35556
+ placeholder="Type here"
35557
+ (change)="onNodeText($event, node.id)"
35558
+ (keydown)="onNodeKeydown($event, node.id)"
35559
+ />
35560
+ <div class="pptx-sa-props__node-actions">
35561
+ @if (!isChild(node)) {
35562
+ <button
35563
+ type="button"
35564
+ class="pptx-sa-props__icon"
35565
+ title="Add sub-item"
35566
+ [disabled]="!canEdit()"
35567
+ (click)="onAddSubItem(node.id)"
35568
+ >
35569
+ +Sub
35570
+ </button>
35571
+ }
35572
+ <button
35573
+ type="button"
35574
+ class="pptx-sa-props__icon"
35575
+ title="Promote"
35576
+ [disabled]="!canEdit() || isChild(node) === false"
35577
+ (click)="onPromote(node.id)"
35578
+ >
35579
+ &#8592;
35580
+ </button>
35581
+ <button
35582
+ type="button"
35583
+ class="pptx-sa-props__icon"
35584
+ title="Demote"
35585
+ [disabled]="!canEdit()"
35586
+ (click)="onDemote(node.id)"
35587
+ >
35588
+ &#8594;
35589
+ </button>
35590
+ <button
35591
+ type="button"
35592
+ class="pptx-sa-props__icon"
35593
+ title="Move up"
35594
+ [disabled]="!canEdit()"
35595
+ (click)="onMoveUp(node.id)"
35596
+ >
35597
+ &#8593;
35598
+ </button>
35599
+ <button
35600
+ type="button"
35601
+ class="pptx-sa-props__icon"
35602
+ title="Move down"
35603
+ [disabled]="!canEdit()"
35604
+ (click)="onMoveDown(node.id)"
35605
+ >
35606
+ &#8595;
35607
+ </button>
35608
+ <button
35609
+ type="button"
35610
+ class="pptx-sa-props__icon pptx-sa-props__icon--danger"
35611
+ title="Remove"
35612
+ [disabled]="!canEdit() || nodes().length <= 1"
35613
+ (click)="onRemove(node.id)"
35614
+ >
35615
+ &times;
35616
+ </button>
35617
+ </div>
35618
+ </li>
35619
+ }
35620
+ </ul>
35621
+
35622
+ <p class="pptx-sa-props__hint">Tab to demote, Shift+Tab to promote.</p>
35623
+ </section>
35624
+ `, isInline: true, styles: [".pptx-sa-props{display:flex;flex-direction:column;gap:.4rem;padding:.5rem 0}.pptx-sa-props__heading{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--pptx-inspector-muted, #888);margin:0}.pptx-sa-props__field{display:flex;flex-direction:column;gap:.2rem}.pptx-sa-props__label{font-size:10px;color:var(--pptx-inspector-muted, #888)}.pptx-sa-props__layouts,.pptx-sa-props__styles{display:flex;flex-wrap:wrap;gap:.25rem}.pptx-sa-props__layout,.pptx-sa-props__style,.pptx-sa-props__btn,.pptx-sa-props__icon{background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;cursor:pointer;font-size:10px;padding:2px 6px;white-space:nowrap}.pptx-sa-props__layout,.pptx-sa-props__style{flex:1 0 auto;text-transform:capitalize}.pptx-sa-props__layout.is-active,.pptx-sa-props__style.is-active{background:var(--pptx-inspector-active, #0078d4);border-color:var(--pptx-inspector-active, #0078d4);color:#fff}.pptx-sa-props__select{background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;padding:2px 4px;font-size:11px}.pptx-sa-props__pane-header{display:flex;align-items:center;justify-content:space-between;gap:.35rem;margin-top:.2rem}.pptx-sa-props__nodes{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.2rem;max-height:14rem;overflow-y:auto}.pptx-sa-props__node{display:flex;align-items:center;gap:.25rem;padding:2px;border:1px solid var(--pptx-inspector-border, #333);border-radius:3px}.pptx-sa-props__node--child{margin-left:1rem;border-color:var(--pptx-inspector-border, #2a2a2a)}.pptx-sa-props__bullet{font-size:9px;color:var(--pptx-inspector-muted, #888);min-width:12px;text-align:center;flex-shrink:0}.pptx-sa-props__node-input{flex:1;min-width:0;background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;padding:2px 4px;font-size:11px}.pptx-sa-props__node-actions{display:flex;gap:1px;flex-shrink:0}.pptx-sa-props__icon{padding:1px 3px;font-size:10px;line-height:1.2}.pptx-sa-props__icon--danger{color:var(--pptx-inspector-danger, #f47c7c)}.pptx-sa-props__layout:disabled,.pptx-sa-props__style:disabled,.pptx-sa-props__btn:disabled,.pptx-sa-props__icon:disabled,.pptx-sa-props__select:disabled,.pptx-sa-props__node-input:disabled{opacity:.45;cursor:not-allowed}.pptx-sa-props__hint{font-size:9px;color:var(--pptx-inspector-muted, #888);margin:.1rem 0 0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
35625
+ }
35626
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: SmartArtPropertiesComponent, decorators: [{
35627
+ type: Component,
35628
+ args: [{ selector: 'pptx-smart-art-properties', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
35629
+ <section class="pptx-sa-props" aria-label="SmartArt properties">
35630
+ <h3 class="pptx-sa-props__heading">SmartArt</h3>
35631
+
35632
+ <!-- ── Layout switcher ──────────────────────────────────────────── -->
35633
+ <div class="pptx-sa-props__field">
35634
+ <span class="pptx-sa-props__label">Layout</span>
35635
+ <div class="pptx-sa-props__layouts" role="group" aria-label="Switch layout">
35636
+ @for (layout of layoutTypes; track layout) {
35637
+ <button
35638
+ type="button"
35639
+ class="pptx-sa-props__layout"
35640
+ [class.is-active]="activeLayout() === layout"
35641
+ [disabled]="!canEdit()"
35642
+ [attr.aria-pressed]="activeLayout() === layout"
35643
+ (click)="onLayout(layout)"
35644
+ >
35645
+ {{ layout }}
35646
+ </button>
35647
+ }
35648
+ </div>
35649
+ </div>
35650
+
35651
+ <!-- ── Colour scheme ────────────────────────────────────────────── -->
35652
+ <label class="pptx-sa-props__field">
35653
+ <span class="pptx-sa-props__label">Color scheme</span>
35654
+ <select
35655
+ class="pptx-sa-props__select"
35656
+ [disabled]="!canEdit()"
35657
+ [value]="activeColorScheme()"
35658
+ (change)="onColorScheme($event)"
35659
+ >
35660
+ @for (scheme of colorSchemes; track scheme) {
35661
+ <option [value]="scheme">{{ scheme }}</option>
35662
+ }
35663
+ </select>
35664
+ </label>
35665
+
35666
+ <!-- ── Style intensity ──────────────────────────────────────────── -->
35667
+ <div class="pptx-sa-props__field">
35668
+ <span class="pptx-sa-props__label">Style</span>
35669
+ <div class="pptx-sa-props__styles" role="group" aria-label="Style intensity">
35670
+ @for (styleOpt of styleOptions; track styleOpt) {
35671
+ <button
35672
+ type="button"
35673
+ class="pptx-sa-props__style"
35674
+ [class.is-active]="activeStyle() === styleOpt"
35675
+ [disabled]="!canEdit()"
35676
+ [attr.aria-pressed]="activeStyle() === styleOpt"
35677
+ (click)="onStyle(styleOpt)"
35678
+ >
35679
+ {{ styleOpt }}
35680
+ </button>
35681
+ }
35682
+ </div>
35683
+ </div>
35684
+
35685
+ <!-- ── Text pane / node list ────────────────────────────────────── -->
35686
+ <div class="pptx-sa-props__pane-header">
35687
+ <span class="pptx-sa-props__label">Text pane ({{ nodes().length }})</span>
35688
+ <button
35689
+ type="button"
35690
+ class="pptx-sa-props__btn"
35691
+ [disabled]="!canEdit()"
35692
+ (click)="onAddItem()"
35693
+ >
35694
+ + Item
35695
+ </button>
35696
+ </div>
35697
+
35698
+ <ul class="pptx-sa-props__nodes" role="list">
35699
+ @for (node of nodes(); track node.id; let i = $index) {
35700
+ <li
35701
+ class="pptx-sa-props__node"
35702
+ [class.pptx-sa-props__node--child]="isChild(node)"
35703
+ [attr.data-node-id]="node.id"
35704
+ >
35705
+ <span class="pptx-sa-props__bullet">{{ isChild(node) ? '•' : i + 1 }}</span>
35706
+ <input
35707
+ type="text"
35708
+ class="pptx-sa-props__node-input"
35709
+ [disabled]="!canEdit()"
35710
+ [value]="node.text"
35711
+ placeholder="Type here"
35712
+ (change)="onNodeText($event, node.id)"
35713
+ (keydown)="onNodeKeydown($event, node.id)"
35714
+ />
35715
+ <div class="pptx-sa-props__node-actions">
35716
+ @if (!isChild(node)) {
35717
+ <button
35718
+ type="button"
35719
+ class="pptx-sa-props__icon"
35720
+ title="Add sub-item"
35721
+ [disabled]="!canEdit()"
35722
+ (click)="onAddSubItem(node.id)"
35723
+ >
35724
+ +Sub
35725
+ </button>
35726
+ }
35727
+ <button
35728
+ type="button"
35729
+ class="pptx-sa-props__icon"
35730
+ title="Promote"
35731
+ [disabled]="!canEdit() || isChild(node) === false"
35732
+ (click)="onPromote(node.id)"
35733
+ >
35734
+ &#8592;
35735
+ </button>
35736
+ <button
35737
+ type="button"
35738
+ class="pptx-sa-props__icon"
35739
+ title="Demote"
35740
+ [disabled]="!canEdit()"
35741
+ (click)="onDemote(node.id)"
35742
+ >
35743
+ &#8594;
35744
+ </button>
35745
+ <button
35746
+ type="button"
35747
+ class="pptx-sa-props__icon"
35748
+ title="Move up"
35749
+ [disabled]="!canEdit()"
35750
+ (click)="onMoveUp(node.id)"
35751
+ >
35752
+ &#8593;
35753
+ </button>
35754
+ <button
35755
+ type="button"
35756
+ class="pptx-sa-props__icon"
35757
+ title="Move down"
35758
+ [disabled]="!canEdit()"
35759
+ (click)="onMoveDown(node.id)"
35760
+ >
35761
+ &#8595;
35762
+ </button>
35763
+ <button
35764
+ type="button"
35765
+ class="pptx-sa-props__icon pptx-sa-props__icon--danger"
35766
+ title="Remove"
35767
+ [disabled]="!canEdit() || nodes().length <= 1"
35768
+ (click)="onRemove(node.id)"
35769
+ >
35770
+ &times;
35771
+ </button>
35772
+ </div>
35773
+ </li>
35774
+ }
35775
+ </ul>
35776
+
35777
+ <p class="pptx-sa-props__hint">Tab to demote, Shift+Tab to promote.</p>
35778
+ </section>
35779
+ `, styles: [".pptx-sa-props{display:flex;flex-direction:column;gap:.4rem;padding:.5rem 0}.pptx-sa-props__heading{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--pptx-inspector-muted, #888);margin:0}.pptx-sa-props__field{display:flex;flex-direction:column;gap:.2rem}.pptx-sa-props__label{font-size:10px;color:var(--pptx-inspector-muted, #888)}.pptx-sa-props__layouts,.pptx-sa-props__styles{display:flex;flex-wrap:wrap;gap:.25rem}.pptx-sa-props__layout,.pptx-sa-props__style,.pptx-sa-props__btn,.pptx-sa-props__icon{background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;cursor:pointer;font-size:10px;padding:2px 6px;white-space:nowrap}.pptx-sa-props__layout,.pptx-sa-props__style{flex:1 0 auto;text-transform:capitalize}.pptx-sa-props__layout.is-active,.pptx-sa-props__style.is-active{background:var(--pptx-inspector-active, #0078d4);border-color:var(--pptx-inspector-active, #0078d4);color:#fff}.pptx-sa-props__select{background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;padding:2px 4px;font-size:11px}.pptx-sa-props__pane-header{display:flex;align-items:center;justify-content:space-between;gap:.35rem;margin-top:.2rem}.pptx-sa-props__nodes{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.2rem;max-height:14rem;overflow-y:auto}.pptx-sa-props__node{display:flex;align-items:center;gap:.25rem;padding:2px;border:1px solid var(--pptx-inspector-border, #333);border-radius:3px}.pptx-sa-props__node--child{margin-left:1rem;border-color:var(--pptx-inspector-border, #2a2a2a)}.pptx-sa-props__bullet{font-size:9px;color:var(--pptx-inspector-muted, #888);min-width:12px;text-align:center;flex-shrink:0}.pptx-sa-props__node-input{flex:1;min-width:0;background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;padding:2px 4px;font-size:11px}.pptx-sa-props__node-actions{display:flex;gap:1px;flex-shrink:0}.pptx-sa-props__icon{padding:1px 3px;font-size:10px;line-height:1.2}.pptx-sa-props__icon--danger{color:var(--pptx-inspector-danger, #f47c7c)}.pptx-sa-props__layout:disabled,.pptx-sa-props__style:disabled,.pptx-sa-props__btn:disabled,.pptx-sa-props__icon:disabled,.pptx-sa-props__select:disabled,.pptx-sa-props__node-input:disabled{opacity:.45;cursor:not-allowed}.pptx-sa-props__hint{font-size:9px;color:var(--pptx-inspector-muted, #888);margin:.1rem 0 0}\n"] }]
35780
+ }], propDecorators: { smartArtData: [{ type: i0.Input, args: [{ isSignal: true, alias: "smartArtData", required: true }] }], canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], smartArtDataChange: [{ type: i0.Output, args: ["smartArtDataChange"] }] } });
35781
+ // ── Module-private helpers ───────────────────────────────────────────────────
35782
+ /** Read the value of a `<select>` change event. */
35783
+ function selectValue(event) {
35784
+ const target = event.target;
35785
+ return target instanceof HTMLSelectElement ? target.value : null;
35786
+ }
35787
+ /** Read the value of an `<input>` change event. */
35788
+ function inputValue(event) {
35789
+ const target = event.target;
35790
+ return target instanceof HTMLInputElement ? target.value : null;
35791
+ }
35792
+
35193
35793
  /**
35194
35794
  * table-data-helpers.ts: Pure immutable helpers for table data editing.
35195
35795
  *
@@ -36385,6 +36985,23 @@ class InspectorPanelComponent {
36385
36985
  /** The selected element narrowed to a chart, or undefined. */
36386
36986
  chartEl = computed(() => this.el().type === 'chart' ? this.el() : undefined, /* @ts-ignore */
36387
36987
  ...(ngDevMode ? [{ debugName: "chartEl" }] : /* istanbul ignore next */ []));
36988
+ /** The selected element narrowed to SmartArt, or undefined. */
36989
+ smartArtEl = computed(() => this.el().type === 'smartArt' ? this.el() : undefined, /* @ts-ignore */
36990
+ ...(ngDevMode ? [{ debugName: "smartArtEl" }] : /* istanbul ignore next */ []));
36991
+ /** The selected SmartArt element's data model, or undefined. */
36992
+ smartArtData = computed(() => this.smartArtEl()?.smartArtData, /* @ts-ignore */
36993
+ ...(ngDevMode ? [{ debugName: "smartArtData" }] : /* istanbul ignore next */ []));
36994
+ /**
36995
+ * Commit an updated SmartArt data model as one history entry. Patching only
36996
+ * `smartArtData` routes through the same `EditorStateService.updateElement`
36997
+ * path as every other inspector section, so undo/redo and persistence work
36998
+ * identically.
36999
+ */
37000
+ onSmartArtDataChange(smartArtData) {
37001
+ this.editor.updateElement(this.slideIndex(), this.el().id, {
37002
+ smartArtData,
37003
+ });
37004
+ }
36388
37005
  /** Commit a partial-element patch from an advanced sub-panel as one history entry. */
36389
37006
  onPatch(patch) {
36390
37007
  this.editor.updateElement(this.slideIndex(), this.el().id, patch);
@@ -36740,6 +37357,16 @@ class InspectorPanelComponent {
36740
37357
  </details>
36741
37358
  }
36742
37359
 
37360
+ <!-- ── SmartArt editing ───────────────────────────────────────────── -->
37361
+ @if (smartArtData(); as sa) {
37362
+ <section class="pptx-ng-inspector__section">
37363
+ <pptx-smart-art-properties
37364
+ [smartArtData]="sa"
37365
+ (smartArtDataChange)="onSmartArtDataChange($event)"
37366
+ />
37367
+ </section>
37368
+ }
37369
+
36743
37370
  <!-- ── Animation authoring ────────────────────────────────────────── -->
36744
37371
  <details class="pptx-ng-inspector__details">
36745
37372
  <summary class="pptx-ng-inspector__summary">Animation</summary>
@@ -36771,7 +37398,7 @@ class InspectorPanelComponent {
36771
37398
  </div>
36772
37399
  </section>
36773
37400
  </aside>
36774
- `, isInline: true, styles: [".pptx-ng-inspector{display:flex;flex-direction:column;gap:0;padding:.5rem;background:var(--pptx-inspector-bg, #1e1e1e);color:var(--pptx-inspector-fg, #e0e0e0);font-size:12px;min-width:220px;overflow-y:auto}.pptx-ng-inspector__section{padding:.5rem 0;border-bottom:1px solid var(--pptx-inspector-border, #333)}.pptx-ng-inspector__section:last-child{border-bottom:none}.pptx-ng-inspector__heading{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--pptx-inspector-muted, #888);margin:0 0 .35rem}.pptx-ng-inspector__details{border-bottom:1px solid var(--pptx-inspector-border, #333)}.pptx-ng-inspector__summary{padding:.5rem 0;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--pptx-inspector-muted, #888);cursor:pointer;-webkit-user-select:none;user-select:none}.pptx-ng-inspector__row{display:flex;align-items:center;gap:.35rem;margin-bottom:.35rem}.pptx-ng-inspector__row:last-child{margin-bottom:0}.pptx-ng-inspector__row--toggles{gap:.25rem}.pptx-ng-inspector__label{font-size:10px;color:var(--pptx-inspector-muted, #888);min-width:32px;text-align:right;flex-shrink:0}.pptx-ng-inspector__input{background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;padding:2px 4px;font-size:12px}.pptx-ng-inspector__input--number{width:62px;text-align:right}.pptx-ng-inspector__color{width:32px;height:22px;border:1px solid var(--pptx-inspector-border, #444);border-radius:3px;padding:1px;cursor:pointer;background:transparent;flex-shrink:0}.pptx-ng-inspector__toggle{width:26px;height:22px;background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:12px}@media(pointer:coarse),(max-width:640px){.pptx-ng-inspector{width:100%;min-width:0;box-sizing:border-box;font-size:14px}.pptx-ng-inspector__row{flex-wrap:wrap;gap:.5rem}.pptx-ng-inspector__label{min-width:28px}.pptx-ng-inspector__input{flex:1 1 auto;min-height:40px;font-size:16px;padding:6px 8px}.pptx-ng-inspector__input--number{width:auto;min-width:72px}.pptx-ng-inspector__color{width:44px;height:40px}.pptx-ng-inspector__toggle{min-width:44px;width:auto;flex:1 1 auto;height:40px;font-size:15px}.pptx-ng-inspector__btn{min-height:40px;padding:8px 10px;font-size:13px}}.pptx-ng-inspector__toggle.is-active{background:var(--pptx-inspector-active, #0078d4);border-color:var(--pptx-inspector-active, #0078d4);color:#fff}.pptx-ng-inspector__btn{flex:1;padding:3px 6px;background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;cursor:pointer;font-size:11px;white-space:nowrap}.pptx-ng-inspector__btn:hover{background:var(--pptx-inspector-hover, #3a3a3a)}.pptx-ng-inspector__btn--danger{color:var(--pptx-inspector-danger, #f47c7c);border-color:var(--pptx-inspector-danger-border, #6b2a2a)}.pptx-ng-inspector__btn--danger:hover{background:var(--pptx-inspector-danger-hover, #4a1a1a)}\n"], dependencies: [{ kind: "component", type: GradientPickerComponent, selector: "pptx-gradient-picker", inputs: ["element"], outputs: ["patch"] }, { kind: "component", type: EffectsPanelComponent, selector: "pptx-effects-panel", inputs: ["element"], outputs: ["patch"] }, { kind: "component", type: TextAdvancedPanelComponent, selector: "pptx-text-advanced-panel", inputs: ["element"], outputs: ["patch"] }, { kind: "component", type: TableDataEditorComponent, selector: "pptx-table-data-editor", inputs: ["element", "canEdit"], outputs: ["elementChange"] }, { kind: "component", type: ChartDataEditorComponent, selector: "pptx-chart-data-editor", inputs: ["element", "canEdit"], outputs: ["elementChange"] }, { kind: "component", type: AnimationAuthorPanelComponent, selector: "pptx-animation-author-panel", inputs: ["element", "slideIndex", "animations", "canEdit"], outputs: ["animationsChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
37401
+ `, isInline: true, styles: [".pptx-ng-inspector{display:flex;flex-direction:column;gap:0;padding:.5rem;background:var(--pptx-inspector-bg, #1e1e1e);color:var(--pptx-inspector-fg, #e0e0e0);font-size:12px;min-width:220px;overflow-y:auto}.pptx-ng-inspector__section{padding:.5rem 0;border-bottom:1px solid var(--pptx-inspector-border, #333)}.pptx-ng-inspector__section:last-child{border-bottom:none}.pptx-ng-inspector__heading{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--pptx-inspector-muted, #888);margin:0 0 .35rem}.pptx-ng-inspector__details{border-bottom:1px solid var(--pptx-inspector-border, #333)}.pptx-ng-inspector__summary{padding:.5rem 0;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--pptx-inspector-muted, #888);cursor:pointer;-webkit-user-select:none;user-select:none}.pptx-ng-inspector__row{display:flex;align-items:center;gap:.35rem;margin-bottom:.35rem}.pptx-ng-inspector__row:last-child{margin-bottom:0}.pptx-ng-inspector__row--toggles{gap:.25rem}.pptx-ng-inspector__label{font-size:10px;color:var(--pptx-inspector-muted, #888);min-width:32px;text-align:right;flex-shrink:0}.pptx-ng-inspector__input{background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;padding:2px 4px;font-size:12px}.pptx-ng-inspector__input--number{width:62px;text-align:right}.pptx-ng-inspector__color{width:32px;height:22px;border:1px solid var(--pptx-inspector-border, #444);border-radius:3px;padding:1px;cursor:pointer;background:transparent;flex-shrink:0}.pptx-ng-inspector__toggle{width:26px;height:22px;background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:12px}@media(pointer:coarse),(max-width:640px){.pptx-ng-inspector{width:100%;min-width:0;box-sizing:border-box;font-size:14px}.pptx-ng-inspector__row{flex-wrap:wrap;gap:.5rem}.pptx-ng-inspector__label{min-width:28px}.pptx-ng-inspector__input{flex:1 1 auto;min-height:40px;font-size:16px;padding:6px 8px}.pptx-ng-inspector__input--number{width:auto;min-width:72px}.pptx-ng-inspector__color{width:44px;height:40px}.pptx-ng-inspector__toggle{min-width:44px;width:auto;flex:1 1 auto;height:40px;font-size:15px}.pptx-ng-inspector__btn{min-height:40px;padding:8px 10px;font-size:13px}}.pptx-ng-inspector__toggle.is-active{background:var(--pptx-inspector-active, #0078d4);border-color:var(--pptx-inspector-active, #0078d4);color:#fff}.pptx-ng-inspector__btn{flex:1;padding:3px 6px;background:var(--pptx-inspector-input-bg, #2d2d2d);border:1px solid var(--pptx-inspector-border, #444);color:inherit;border-radius:3px;cursor:pointer;font-size:11px;white-space:nowrap}.pptx-ng-inspector__btn:hover{background:var(--pptx-inspector-hover, #3a3a3a)}.pptx-ng-inspector__btn--danger{color:var(--pptx-inspector-danger, #f47c7c);border-color:var(--pptx-inspector-danger-border, #6b2a2a)}.pptx-ng-inspector__btn--danger:hover{background:var(--pptx-inspector-danger-hover, #4a1a1a)}\n"], dependencies: [{ kind: "component", type: GradientPickerComponent, selector: "pptx-gradient-picker", inputs: ["element"], outputs: ["patch"] }, { kind: "component", type: EffectsPanelComponent, selector: "pptx-effects-panel", inputs: ["element"], outputs: ["patch"] }, { kind: "component", type: TextAdvancedPanelComponent, selector: "pptx-text-advanced-panel", inputs: ["element"], outputs: ["patch"] }, { kind: "component", type: TableDataEditorComponent, selector: "pptx-table-data-editor", inputs: ["element", "canEdit"], outputs: ["elementChange"] }, { kind: "component", type: ChartDataEditorComponent, selector: "pptx-chart-data-editor", inputs: ["element", "canEdit"], outputs: ["elementChange"] }, { kind: "component", type: SmartArtPropertiesComponent, selector: "pptx-smart-art-properties", inputs: ["smartArtData", "canEdit"], outputs: ["smartArtDataChange"] }, { kind: "component", type: AnimationAuthorPanelComponent, selector: "pptx-animation-author-panel", inputs: ["element", "slideIndex", "animations", "canEdit"], outputs: ["animationsChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
36775
37402
  }
36776
37403
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: InspectorPanelComponent, decorators: [{
36777
37404
  type: Component,
@@ -36781,6 +37408,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
36781
37408
  TextAdvancedPanelComponent,
36782
37409
  TableDataEditorComponent,
36783
37410
  ChartDataEditorComponent,
37411
+ SmartArtPropertiesComponent,
36784
37412
  AnimationAuthorPanelComponent,
36785
37413
  ], template: `
36786
37414
  <!--
@@ -37034,6 +37662,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
37034
37662
  </details>
37035
37663
  }
37036
37664
 
37665
+ <!-- ── SmartArt editing ───────────────────────────────────────────── -->
37666
+ @if (smartArtData(); as sa) {
37667
+ <section class="pptx-ng-inspector__section">
37668
+ <pptx-smart-art-properties
37669
+ [smartArtData]="sa"
37670
+ (smartArtDataChange)="onSmartArtDataChange($event)"
37671
+ />
37672
+ </section>
37673
+ }
37674
+
37037
37675
  <!-- ── Animation authoring ────────────────────────────────────────── -->
37038
37676
  <details class="pptx-ng-inspector__details">
37039
37677
  <summary class="pptx-ng-inspector__summary">Animation</summary>