pptx-angular-viewer 1.1.10 → 1.1.11
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/fesm2022/pptx-angular-viewer.mjs +16969 -478
- package/fesm2022/pptx-angular-viewer.mjs.map +1 -1
- package/package.json +4 -2
- package/pptx-angular-viewer.css +270 -0
- package/types/pptx-angular-viewer.d.ts +2040 -16
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pptx-angular-viewer.mjs","sources":["../../src/internal/shared-src/theme/defaults.ts","../../src/internal/shared-src/theme/css-vars.ts","../../src/internal/shared-src/loader/load-content-helpers.ts","../../src/internal/shared-src/types.ts","../../src/internal/shared-src/constants.ts","../../src/internal/shared-src/index.ts","../../src/internal/shared.ts","../../src/theme/viewer-theme.ts","../../src/viewer/load-content.service.ts","../../src/viewer/element-style.ts","../../src/viewer/element-renderer.component.ts","../../src/viewer/slide-canvas.component.ts","../../src/viewer/power-point-viewer.component.ts","../../src/viewer/constants.ts","../../src/utils.ts","../../src/public-api.ts","../../src/pptx-angular-viewer.ts"],"sourcesContent":["import type { ViewerThemeColors } from './types';\n\n/**\n * Default dark-theme color values.\n *\n * These correspond to the built-in dark UI of the PowerPoint viewer and\n * use Tailwind's gray palette as the neutral scale with indigo as the\n * primary accent.\n */\nexport const defaultThemeColors: ViewerThemeColors = {\n\tbackground: '#030712', // gray-950\n\tforeground: '#f3f4f6', // gray-100\n\n\tcard: '#111827', // gray-900\n\tcardForeground: '#f3f4f6', // gray-100\n\n\tpopover: '#111827', // gray-900\n\tpopoverForeground: '#f3f4f6', // gray-100\n\n\tprimary: '#6366f1', // indigo-500\n\tprimaryForeground: '#ffffff', // white\n\n\tsecondary: '#1f2937', // gray-800\n\tsecondaryForeground: '#f3f4f6', // gray-100\n\n\tmuted: '#1f2937', // gray-800\n\tmutedForeground: '#9ca3af', // gray-400\n\n\taccent: '#1f2937', // gray-800\n\taccentForeground: '#f3f4f6', // gray-100\n\n\tdestructive: '#ef4444', // red-500\n\tdestructiveForeground: '#ffffff', // white\n\n\tborder: '#374151', // gray-700\n\tinput: '#374151', // gray-700\n\tring: '#6366f1', // indigo-500\n};\n\n/** Default border-radius. */\nexport const defaultRadius = '0.5rem';\n","import { defaultThemeColors, defaultRadius } from './defaults';\nimport type { ViewerTheme, ViewerThemeColors } from './types';\n\n/**\n * Map from camelCase ViewerThemeColors keys to kebab-case CSS custom\n * property suffixes (the part after `--pptx-`).\n */\nconst COLOR_KEY_TO_CSS: Record<keyof ViewerThemeColors, string> = {\n\tbackground: 'background',\n\tforeground: 'foreground',\n\tcard: 'card',\n\tcardForeground: 'card-foreground',\n\tpopover: 'popover',\n\tpopoverForeground: 'popover-foreground',\n\tprimary: 'primary',\n\tprimaryForeground: 'primary-foreground',\n\tsecondary: 'secondary',\n\tsecondaryForeground: 'secondary-foreground',\n\tmuted: 'muted',\n\tmutedForeground: 'muted-foreground',\n\taccent: 'accent',\n\taccentForeground: 'accent-foreground',\n\tdestructive: 'destructive',\n\tdestructiveForeground: 'destructive-foreground',\n\tborder: 'border',\n\tinput: 'input',\n\tring: 'ring',\n};\n\n/**\n * Convert a `ViewerTheme` into a flat `Record<string, string>` of CSS\n * custom properties (including the `--` prefix) ready to be spread onto\n * a `style` attribute.\n *\n * Only properties that differ from the built-in defaults are emitted when\n * `omitDefaults` is true (the default).\n */\nexport function themeToCssVars(\n\ttheme: ViewerTheme | undefined,\n\tomitDefaults = false,\n): Record<string, string> {\n\tconst vars: Record<string, string> = {};\n\n\tif (!theme) {\n\t\treturn vars;\n\t}\n\n\t// ── Colors ───────────────────────────────────────────────────────\n\tconst colors = theme.colors;\n\tif (colors) {\n\t\tfor (const [key, cssSuffix] of Object.entries(COLOR_KEY_TO_CSS)) {\n\t\t\tconst value = colors[key as keyof ViewerThemeColors];\n\t\t\tif (value === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (omitDefaults && value === defaultThemeColors[key as keyof ViewerThemeColors]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvars[`--pptx-${cssSuffix}`] = value;\n\t\t}\n\t}\n\n\t// ── Radius ───────────────────────────────────────────────────────\n\tif (theme.radius !== undefined) {\n\t\tif (!omitDefaults || theme.radius !== defaultRadius) {\n\t\t\tvars['--pptx-radius'] = theme.radius;\n\t\t}\n\t}\n\n\t// ── Escape-hatch custom properties ───────────────────────────────\n\tif (theme.cssVars) {\n\t\tfor (const [key, value] of Object.entries(theme.cssVars)) {\n\t\t\tvars[key] = value;\n\t\t}\n\t}\n\n\treturn vars;\n}\n\n/**\n * Build the complete set of CSS custom properties with all defaults.\n * Useful for generating a full fallback stylesheet.\n */\nexport function defaultCssVars(): Record<string, string> {\n\tconst vars: Record<string, string> = {};\n\n\tfor (const [key, cssSuffix] of Object.entries(COLOR_KEY_TO_CSS)) {\n\t\tvars[`--pptx-${cssSuffix}`] = defaultThemeColors[key as keyof ViewerThemeColors];\n\t}\n\tvars['--pptx-radius'] = defaultRadius;\n\n\treturn vars;\n}\n","/**\n * Pure helper functions for the viewer load pipeline.\n *\n * Framework-agnostic — shared by the React, Vue, and Angular bindings. These\n * were duplicated verbatim across `packages/react` and `packages/vue`; this is\n * now the single canonical copy.\n */\nimport type {\n\tMediaPptxElement,\n\tPicturePptxElement,\n\tPptxElement,\n\tPptxDrawingGuide,\n\tPptxSlide,\n} from 'pptx-viewer-core';\nimport { guideEmuToPx } from 'pptx-viewer-core';\n\nexport interface GuideEntry {\n\tid: string;\n\taxis: 'h' | 'v';\n\tposition: number;\n}\n\n/** An element that may carry an image path needing Blob URL resolution. */\nexport interface ImagePathElement {\n\telement: PptxElement;\n\tfield: 'imageData' | 'svgData' | 'posterFrameData';\n\tpath: string;\n}\n\n/**\n * Recursively walks an element tree and pushes every media element\n * into the supplied collector array.\n */\nexport function collectMediaElements(elements: PptxElement[], collector: MediaPptxElement[]): void {\n\tfor (const element of elements) {\n\t\tif (element.type === 'media') {\n\t\t\tcollector.push(element);\n\t\t\tcontinue;\n\t\t}\n\t\tif (element.type === 'group' && element.children?.length) {\n\t\t\tcollectMediaElements(element.children, collector);\n\t\t}\n\t}\n}\n\n/**\n * Collect all unique image archive paths across all slides that need\n * to be resolved to displayable URLs (Blob URLs).\n *\n * This covers:\n * - Picture elements (`imageData`, `svgData`)\n * - Media poster frames (`posterFrameData`)\n *\n * Returns the set of unique archive paths, plus a list of element/field\n * references that need to be updated once each path resolves.\n */\nexport function collectImagePaths(slides: PptxSlide[]): {\n\tpaths: Set<string>;\n\trefs: ImagePathElement[];\n} {\n\tconst paths = new Set<string>();\n\tconst refs: ImagePathElement[] = [];\n\n\tconst walkElements = (elements: PptxElement[]) => {\n\t\tfor (const el of elements) {\n\t\t\tif (el.type === 'picture' || el.type === 'image') {\n\t\t\t\tconst pic = el as PicturePptxElement;\n\t\t\t\tif (pic.imagePath && !pic.imageData && !isExternalUrl(pic.imagePath)) {\n\t\t\t\t\tpaths.add(pic.imagePath);\n\t\t\t\t\trefs.push({ element: el, field: 'imageData', path: pic.imagePath });\n\t\t\t\t}\n\t\t\t\tif (pic.svgPath && !pic.svgData && !isExternalUrl(pic.svgPath)) {\n\t\t\t\t\tpaths.add(pic.svgPath);\n\t\t\t\t\trefs.push({ element: el, field: 'svgData', path: pic.svgPath });\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (el.type === 'media') {\n\t\t\t\tconst media = el as MediaPptxElement;\n\t\t\t\tif (\n\t\t\t\t\tmedia.posterFramePath &&\n\t\t\t\t\t!media.posterFrameData &&\n\t\t\t\t\t!isExternalUrl(media.posterFramePath)\n\t\t\t\t) {\n\t\t\t\t\tpaths.add(media.posterFramePath);\n\t\t\t\t\trefs.push({\n\t\t\t\t\t\telement: el,\n\t\t\t\t\t\tfield: 'posterFrameData',\n\t\t\t\t\t\tpath: media.posterFramePath,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (el.type === 'group' && el.children?.length) {\n\t\t\t\twalkElements(el.children);\n\t\t\t}\n\t\t}\n\t};\n\n\tfor (const slide of slides) {\n\t\twalkElements(slide.elements);\n\t}\n\n\treturn { paths, refs };\n}\n\nfunction isExternalUrl(path: string): boolean {\n\treturn (\n\t\tpath.startsWith('http://') ||\n\t\tpath.startsWith('https://') ||\n\t\tpath.startsWith('data:') ||\n\t\tpath.startsWith('blob:')\n\t);\n}\n\n/**\n * Converts raw EMU-based drawing guides from the parsed presentation\n * and the first slide into pixel-based `GuideEntry` objects.\n */\nexport function buildInitialGuides(\n\tpresentationGuides: PptxDrawingGuide[] | undefined,\n\tfirstSlideGuides: PptxDrawingGuide[] | undefined,\n): GuideEntry[] {\n\tconst guides: GuideEntry[] = [];\n\tif (presentationGuides) {\n\t\tfor (const g of presentationGuides) {\n\t\t\tguides.push({\n\t\t\t\tid: g.id,\n\t\t\t\taxis: g.orientation === 'horz' ? 'h' : 'v',\n\t\t\t\tposition: guideEmuToPx(g.positionEmu),\n\t\t\t});\n\t\t}\n\t}\n\tif (firstSlideGuides) {\n\t\tfor (const g of firstSlideGuides) {\n\t\t\tguides.push({\n\t\t\t\tid: g.id,\n\t\t\t\taxis: g.orientation === 'horz' ? 'h' : 'v',\n\t\t\t\tposition: guideEmuToPx(g.positionEmu),\n\t\t\t});\n\t\t}\n\t}\n\treturn guides;\n}\n","/**\n * Framework-agnostic public types shared by the viewer bindings.\n *\n * These were duplicated in the React (`types-ui.ts`) and Vue (`viewer/types.ts`)\n * packages; this is the canonical copy. Each binding layers its own\n * framework-specific prop/event/handle types on top of these.\n */\n\n/** Canvas dimensions in pixels. */\nexport interface CanvasSize {\n\twidth: number;\n\theight: number;\n}\n\n/** Collaboration role within a session. */\nexport type CollaborationRole = 'owner' | 'collaborator' | 'viewer';\n\n/**\n * Real-time collaboration configuration.\n *\n * The collaboration runtime (Yjs) is not yet ported to every binding — this\n * type exists so the public prop surface stays identical across React, Vue,\n * and Angular.\n */\nexport interface CollaborationConfig {\n\t/** Unique identifier for the collaboration room (alphanumeric, hyphens, underscores). */\n\troomId: string;\n\t/** WebSocket server URL for the Yjs provider (e.g. \"wss://collab.example.com\"). */\n\tserverUrl: string;\n\t/** Display name for the local user. */\n\tuserName: string;\n\t/** Avatar URL for the local user (optional). */\n\tuserAvatar?: string;\n\t/** Hex colour for the local user's cursor/presence indicator. */\n\tuserColor?: string;\n\t/** Optional authentication token sent with the WebSocket handshake. */\n\tauthToken?: string;\n\t/** Role in the session — defaults to `'collaborator'`. */\n\trole?: CollaborationRole;\n}\n","/**\n * Scalar viewer defaults shared by the UI bindings.\n *\n * Subset of the React package's `constants/scalar.ts` that the Vue and Angular\n * viewers also need. Additional constant groups (toolbar presets, shape styles,\n * transitions, etc.) remain per-binding until those features are ported.\n */\n\n/** Default slide canvas width in pixels when the file declares none. */\nexport const DEFAULT_CANVAS_WIDTH = 1280;\n/** Default slide canvas height in pixels when the file declares none. */\nexport const DEFAULT_CANVAS_HEIGHT = 720;\n\n/** Fallback text colour. */\nexport const DEFAULT_TEXT_COLOR = '#111827';\n/** Fallback shape fill colour. */\nexport const DEFAULT_FILL_COLOR = '#3b82f6';\n/** Fallback shape stroke colour. */\nexport const DEFAULT_STROKE_COLOR = '#1f2937';\n","/**\n * pptx-viewer-shared — framework-agnostic viewer logic shared by the\n * React (`pptx-viewer`), Vue (`pptx-vue-viewer`), and Angular\n * (`pptx-angular-viewer`) bindings.\n *\n * Everything exported here is pure TypeScript (no framework imports), so each\n * UI binding consumes one copy instead of duplicating it.\n *\n * Current surface:\n * - theme: ViewerTheme types, default palette, CSS-variable helpers.\n * - loader: load-pipeline helpers (media/image collection, guides).\n * - types: CanvasSize, CollaborationConfig, CollaborationRole.\n * - constants: scalar viewer defaults (canvas size, fallback colours).\n *\n * Roadmap (see packages/angular/PORTING.md and packages/vue/PORTING.md):\n * color resolution, geometry/clip-paths, connector routing, animation\n * timeline engine, table-merge math, morph matching, export data helpers.\n */\nexport * from './theme';\nexport * from './loader';\nexport * from './types';\nexport * from './constants';\n","/**\n * Internal re-export of `pptx-viewer-shared`.\n *\n * `pptx-viewer-shared` is an INTERNAL, non-published package (`\"private\": true`).\n * Its source is vendored into `./shared-src` at build time by\n * `scripts/inline-shared.mjs` (a generated, git-ignored directory), so the\n * shared code compiles as part of THIS library and ships **inlined** in the\n * published FESM. As a result `pptx-viewer-shared` never appears in the\n * published `package.json`.\n *\n * All Angular sources import shared symbols from THIS barrel, never from the\n * bare `'pptx-viewer-shared'` specifier (which ng-packagr would externalize).\n */\nexport * from './shared-src/index';\n","import { InjectionToken } from '@angular/core';\nimport type { Provider } from '@angular/core';\n\nimport { themeToCssVars } from '../internal/shared';\nimport type { ViewerTheme } from '../internal/shared';\n\n/**\n * Theme system for the Angular PowerPoint viewer.\n *\n * Angular counterpart of the React `ViewerThemeProvider` / `useViewerTheme`\n * context and the Vue `provide`/`inject` theme provider. The `ViewerTheme`\n * type, default palette, and `themeToCssVars` helper are framework-agnostic\n * and live in `pptx-viewer-shared`.\n */\n\n/** DI token carrying the active `ViewerTheme` (or `undefined`). */\nexport const VIEWER_THEME = new InjectionToken<ViewerTheme | undefined>('PPTX_VIEWER_THEME');\n\n/**\n * Provide a `ViewerTheme` to a subtree.\n *\n * Typically you do **not** need this — passing a `theme` input to\n * `<pptx-viewer>` is sufficient. Use this to share a theme across multiple\n * viewers or a wider component subtree.\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [provideViewerTheme({ colors: { primary: '#6366f1' } })],\n * });\n * ```\n */\nexport function provideViewerTheme(theme: ViewerTheme | undefined): Provider {\n\treturn { provide: VIEWER_THEME, useValue: theme };\n}\n\n/**\n * Build an `[ngStyle]`-compatible map of CSS custom properties for a theme.\n * Returns an empty object when the theme contributes no variables.\n */\nexport function themeStyle(theme: ViewerTheme | undefined): Record<string, string> {\n\tif (!theme) {\n\t\treturn {};\n\t}\n\treturn themeToCssVars(theme);\n}\n","import { DestroyRef, Injectable, computed, inject, signal } from '@angular/core';\nimport type {\n\tMediaPptxElement,\n\tPptxElement,\n\tPptxSlide,\n\tPptxSlideMaster,\n\tPptxTheme,\n} from 'pptx-viewer-core';\nimport { EncryptedFileError, PptxHandler } from 'pptx-viewer-core';\n\nimport {\n\tDEFAULT_CANVAS_HEIGHT,\n\tDEFAULT_CANVAS_WIDTH,\n\tcollectImagePaths,\n\tcollectMediaElements,\n} from '../internal/shared';\nimport type { CanvasSize } from '../internal/shared';\n\n/**\n * `LoadContentService` — Angular port of the React `useLoadContent` hook and\n * the Vue `useLoadContent` composable.\n *\n * Parses `.pptx` bytes into reactive signals via the framework-agnostic\n * `PptxHandler` from `pptx-viewer-core`. All heavy lifting (ZIP, XML parse,\n * theme/master/layout resolution, media extraction) lives in core and the\n * pure helpers live in `pptx-viewer-shared`; this service only wires the async\n * load into Angular signals and manages Blob-URL / handler lifecycle.\n *\n * Provide it at the component level so its lifetime tracks the host viewer:\n * `@Component({ providers: [LoadContentService] })`.\n *\n * This is the viewer-first subset; the React hook also populated ~25 extra\n * pieces of presentation metadata (sections, custom shows, embedded fonts,\n * digital signatures, …). Those are tracked in PORTING.md and added here as\n * the corresponding features are ported.\n */\n@Injectable()\nexport class LoadContentService {\n\t/** Parsed slides (with image Blob URLs patched in). */\n\treadonly slides = signal<PptxSlide[]>([]);\n\t/** Slide canvas size in pixels. */\n\treadonly canvasSize = signal<CanvasSize>({\n\t\twidth: DEFAULT_CANVAS_WIDTH,\n\t\theight: DEFAULT_CANVAS_HEIGHT,\n\t});\n\t/** Resolved presentation theme. */\n\treadonly theme = signal<PptxTheme | undefined>(undefined);\n\t/** Slide masters (for placeholder/background resolution). */\n\treadonly slideMasters = signal<PptxSlideMaster[]>([]);\n\t/** Archive-path → displayable URL map for media + poster frames. */\n\treadonly mediaDataUrls = signal<Map<string, string>>(new Map());\n\t/** True while a load is in flight. */\n\treadonly loading = signal(false);\n\t/** Error message from the last failed load, or null. */\n\treadonly error = signal<string | null>(null);\n\t/** True when the file is password-protected and could not be opened. */\n\treadonly isEncrypted = signal(false);\n\n\t/** Number of loaded slides. */\n\treadonly slideCount = computed(() => this.slides().length);\n\n\tprivate handler: PptxHandler | null = null;\n\tprivate renderToken = 0;\n\tprivate activeBlobUrls: string[] = [];\n\n\tconstructor() {\n\t\tinject(DestroyRef).onDestroy(() => {\n\t\t\tthis.renderToken++;\n\t\t\tthis.revokeBlobUrls(this.activeBlobUrls);\n\t\t\tthis.revokeBlobUrls(Array.from(this.mediaDataUrls().values()));\n\t\t\tthis.disposeHandler();\n\t\t});\n\t}\n\n\t/** Serialise the current presentation back to `.pptx` bytes. */\n\tasync getContent(): Promise<Uint8Array> {\n\t\tif (!this.handler) {\n\t\t\tthrow new Error('No presentation is loaded.');\n\t\t}\n\t\treturn this.handler.save(this.slides());\n\t}\n\n\t/** Parse the supplied `.pptx` bytes into the reactive signals. */\n\tasync load(raw: Uint8Array | ArrayBuffer | null | undefined): Promise<void> {\n\t\tif (!raw) {\n\t\t\treturn;\n\t\t}\n\t\tconst token = ++this.renderToken;\n\t\tconst loadBlobUrls: string[] = [];\n\n\t\ttry {\n\t\t\tthis.loading.set(true);\n\t\t\tthis.error.set(null);\n\t\t\tthis.isEncrypted.set(false);\n\n\t\t\tconst buffer =\n\t\t\t\traw instanceof Uint8Array\n\t\t\t\t\t? raw.buffer.slice(raw.byteOffset, raw.byteOffset + raw.byteLength)\n\t\t\t\t\t: raw;\n\n\t\t\tconst fileSizeMB = buffer instanceof ArrayBuffer ? buffer.byteLength / (1024 * 1024) : 0;\n\t\t\tif (fileSizeMB > 50) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[pptx] Large file detected (${fileSizeMB.toFixed(1)} MB). ` +\n\t\t\t\t\t\t`Loading may use significant memory.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst previousHandler = this.handler;\n\t\t\tconst newHandler = new PptxHandler();\n\t\t\tconst parsed = await newHandler.load(buffer as ArrayBuffer);\n\t\t\tif (token !== this.renderToken) {\n\t\t\t\tnewHandler.dispose();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpreviousHandler?.dispose();\n\n\t\t\t// ── Resolve media Blob URLs (audio/video + poster frames) ──\n\t\t\tconst mediaElements: MediaPptxElement[] = [];\n\t\t\tfor (const slide of parsed.slides) {\n\t\t\t\tcollectMediaElements(slide.elements, mediaElements);\n\t\t\t}\n\t\t\tthis.revokeBlobUrls(Array.from(this.mediaDataUrls().values()));\n\t\t\tconst nextMediaUrls = new Map<string, string>();\n\t\t\tawait Promise.all(\n\t\t\t\tmediaElements.map(async (mediaElement) => {\n\t\t\t\t\tconst mediaPath = mediaElement.mediaPath;\n\t\t\t\t\tif (!mediaPath) {\n\t\t\t\t\t\tmediaElement.mediaMissing = true;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst isAudioVideo =\n\t\t\t\t\t\t\tmediaElement.mediaType === 'audio' || mediaElement.mediaType === 'video';\n\t\t\t\t\t\tif (isAudioVideo) {\n\t\t\t\t\t\t\tconst arrayBuffer = await newHandler.getMediaArrayBuffer(mediaPath);\n\t\t\t\t\t\t\tif (arrayBuffer) {\n\t\t\t\t\t\t\t\tconst mimeType = mediaElement.mediaMimeType || 'application/octet-stream';\n\t\t\t\t\t\t\t\tconst blob = new Blob([arrayBuffer], { type: mimeType });\n\t\t\t\t\t\t\t\tconst blobUrl = URL.createObjectURL(blob);\n\t\t\t\t\t\t\t\tloadBlobUrls.push(blobUrl);\n\t\t\t\t\t\t\t\tnextMediaUrls.set(mediaPath, blobUrl);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tmediaElement.mediaMissing = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst dataUrl = await newHandler.getImageData(mediaPath);\n\t\t\t\t\t\t\tif (dataUrl) {\n\t\t\t\t\t\t\t\tnextMediaUrls.set(mediaPath, dataUrl);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tmediaElement.mediaMissing = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tmediaElement.mediaMissing = true;\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\t// ── Resolve lazily-loaded picture Blob URLs ──\n\t\t\tconst { paths: imagePaths, refs: imageRefs } = collectImagePaths(parsed.slides);\n\t\t\tlet nextSlides = parsed.slides;\n\t\t\tif (imagePaths.size > 0) {\n\t\t\t\tconst resolvedMap = new Map<string, string>();\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tArray.from(imagePaths).map(async (path) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst url = await newHandler.getImageData(path);\n\t\t\t\t\t\t\tif (url) {\n\t\t\t\t\t\t\t\tresolvedMap.set(path, url);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Non-critical: image will show as broken.\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tconst elementPatches = new Map<string, Record<string, string>>();\n\t\t\t\tfor (const refEntry of imageRefs) {\n\t\t\t\t\tconst url = resolvedMap.get(refEntry.path);\n\t\t\t\t\tif (!url) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst id = refEntry.element.id;\n\t\t\t\t\tconst existing = elementPatches.get(id) ?? {};\n\t\t\t\t\texisting[refEntry.field] = url;\n\t\t\t\t\telementPatches.set(id, existing);\n\t\t\t\t}\n\n\t\t\t\tif (elementPatches.size > 0) {\n\t\t\t\t\tconst patchElements = (elements: PptxElement[]): PptxElement[] => {\n\t\t\t\t\t\tlet mutated = false;\n\t\t\t\t\t\tconst next = elements.map((el) => {\n\t\t\t\t\t\t\tlet updated = el;\n\t\t\t\t\t\t\tconst patch = elementPatches.get(el.id);\n\t\t\t\t\t\t\tif (patch) {\n\t\t\t\t\t\t\t\tupdated = { ...el, ...patch } as PptxElement;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (updated.type === 'group' && updated.children?.length) {\n\t\t\t\t\t\t\t\tconst newChildren = patchElements(updated.children);\n\t\t\t\t\t\t\t\tif (newChildren !== updated.children) {\n\t\t\t\t\t\t\t\t\tupdated = { ...updated, children: newChildren };\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (updated !== el) {\n\t\t\t\t\t\t\t\tmutated = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn updated;\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn mutated ? next : elements;\n\t\t\t\t\t};\n\t\t\t\t\tnextSlides = parsed.slides.map((s) => {\n\t\t\t\t\t\tconst newElements = patchElements(s.elements);\n\t\t\t\t\t\treturn newElements === s.elements ? s : { ...s, elements: newElements };\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Commit reactive state.\n\t\t\tthis.revokeBlobUrls(this.activeBlobUrls);\n\t\t\tthis.activeBlobUrls = loadBlobUrls;\n\t\t\tthis.handler = newHandler;\n\t\t\tthis.slides.set(nextSlides);\n\t\t\tthis.mediaDataUrls.set(nextMediaUrls);\n\t\t\tthis.canvasSize.set({\n\t\t\t\twidth: parsed.width ?? DEFAULT_CANVAS_WIDTH,\n\t\t\t\theight: parsed.height ?? DEFAULT_CANVAS_HEIGHT,\n\t\t\t});\n\t\t\tthis.theme.set(parsed.theme);\n\t\t\tthis.slideMasters.set(parsed.slideMasters ?? []);\n\t\t} catch (err) {\n\t\t\tif (token === this.renderToken) {\n\t\t\t\tif (err instanceof EncryptedFileError) {\n\t\t\t\t\tthis.isEncrypted.set(true);\n\t\t\t\t} else {\n\t\t\t\t\tthis.error.set(err instanceof Error ? err.message : String(err));\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tif (token === this.renderToken) {\n\t\t\t\tthis.loading.set(false);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate disposeHandler(): void {\n\t\tif (this.handler) {\n\t\t\tthis.handler.dispose();\n\t\t\tthis.handler = null;\n\t\t}\n\t}\n\n\tprivate revokeBlobUrls(urls: string[]): void {\n\t\tfor (const url of urls) {\n\t\t\tif (url.startsWith('blob:')) {\n\t\t\t\tURL.revokeObjectURL(url);\n\t\t\t}\n\t\t}\n\t}\n}\n","import type { PptxElement } from 'pptx-viewer-core';\nimport { hasShapeProperties, hasTextProperties } from 'pptx-viewer-core';\n\nimport { DEFAULT_STROKE_COLOR, DEFAULT_TEXT_COLOR } from '../internal/shared';\n\n/**\n * Basic, framework-agnostic style computation for slide elements, returning\n * `[ngStyle]`-compatible maps.\n *\n * This mirrors the Vue package's `element-style.ts` (and a deliberately small\n * subset of the React `viewer/utils/*` style layer). It is enough to position\n * and paint text boxes, basic preset shapes, images, and image/gradient fills\n * (the latter via the parser's prebuilt CSS gradient string). Advanced visuals\n * (the structured gradient builder, pattern fills, custom geometry clip-paths,\n * shadows, 3D, image effects, text warp) are tracked in PORTING.md.\n *\n * Long term the *logic* here is a shared-extraction candidate — only the\n * return type (CSS map shape) differs per framework — so a future refactor\n * could hoist a neutral core into `pptx-viewer-shared`.\n */\n\n/** `[ngStyle]`-compatible style map. */\nexport type StyleMap = Record<string, string | number>;\n\n/** Map a number to a CSS pixel string. */\nconst px = (n: number): string => `${n}px`;\n\n/**\n * Absolute container style: position, size, rotation, flip, opacity, z-index.\n * Mirrors the essentials of the React `getContainerStyle`.\n */\nexport function getContainerStyle(el: PptxElement, zIndex: number): StyleMap {\n\tconst transforms: string[] = [];\n\tif (el.rotation) {\n\t\ttransforms.push(`rotate(${el.rotation}deg)`);\n\t}\n\tif (el.flipHorizontal) {\n\t\ttransforms.push('scaleX(-1)');\n\t}\n\tif (el.flipVertical) {\n\t\ttransforms.push('scaleY(-1)');\n\t}\n\n\tconst style: StyleMap = {\n\t\tposition: 'absolute',\n\t\tleft: px(el.x),\n\t\ttop: px(el.y),\n\t\twidth: px(el.width),\n\t\theight: px(el.height),\n\t\t'z-index': zIndex,\n\t\t'box-sizing': 'border-box',\n\t};\n\tif (transforms.length > 0) {\n\t\tstyle['transform'] = transforms.join(' ');\n\t}\n\tif (typeof el.opacity === 'number') {\n\t\tstyle['opacity'] = el.opacity;\n\t}\n\tif (el.hidden) {\n\t\tstyle['display'] = 'none';\n\t}\n\treturn style;\n}\n\n/**\n * Fill / stroke / corner-radius for shape-like elements. Returns an empty\n * object when the element carries no shape styling.\n */\nexport function getShapeFillStrokeStyle(el: PptxElement): StyleMap {\n\tif (!hasShapeProperties(el)) {\n\t\treturn {};\n\t}\n\tconst ss = el.shapeStyle;\n\tconst style: StyleMap = {};\n\n\tif (ss) {\n\t\t// Fill resolution order mirrors the React `getShapeVisualStyle` and the\n\t\t// Vue port: image fill → gradient → solid colour. Pattern fills\n\t\t// (SVG-based) and the richer structured gradient builder\n\t\t// (`color-gradient.ts`) remain shared-extraction candidates — see\n\t\t// PORTING.md.\n\t\tconst imageFillUrl = ss.fillMode === 'image' && ss.fillImageUrl ? ss.fillImageUrl : undefined;\n\t\t// `fillGradient` is a prebuilt CSS gradient string from the parser.\n\t\tconst gradient = ss.fillMode === 'gradient' || ss.fillGradient ? ss.fillGradient : undefined;\n\n\t\tif (imageFillUrl) {\n\t\t\tstyle['background-color'] = 'transparent';\n\t\t\tstyle['background-image'] = `url(${imageFillUrl})`;\n\t\t\tstyle['background-repeat'] = ss.fillImageMode === 'tile' ? 'repeat' : 'no-repeat';\n\t\t\tstyle['background-size'] = ss.fillImageMode === 'tile' ? 'auto' : '100% 100%';\n\t\t} else if (gradient) {\n\t\t\tstyle['background-image'] = gradient;\n\t\t} else if (ss.fillColor && ss.fillColor !== 'transparent' && ss.fillMode !== 'none') {\n\t\t\tstyle['background-color'] = ss.fillColor;\n\t\t}\n\n\t\t// Stroke.\n\t\tconst strokeWidth = Math.max(0, ss.strokeWidth ?? 0);\n\t\tif (strokeWidth > 0) {\n\t\t\tconst dash =\n\t\t\t\tss.strokeDash && ss.strokeDash !== 'solid'\n\t\t\t\t\t? ss.strokeDash === 'dot' || ss.strokeDash === 'sysDot'\n\t\t\t\t\t\t? 'dotted'\n\t\t\t\t\t\t: 'dashed'\n\t\t\t\t\t: 'solid';\n\t\t\tstyle['border'] = `${px(strokeWidth)} ${dash} ${ss.strokeColor ?? DEFAULT_STROKE_COLOR}`;\n\t\t}\n\t}\n\n\t// Corner radius — approximate common preset geometries.\n\tconst shapeType = 'shapeType' in el ? el.shapeType : undefined;\n\tif (shapeType === 'ellipse' || shapeType === 'circle') {\n\t\tstyle['border-radius'] = '50%';\n\t} else if (shapeType === 'roundRect') {\n\t\tstyle['border-radius'] = px(Math.min(el.width, el.height) * 0.1);\n\t}\n\n\treturn style;\n}\n\n/**\n * Text block style for elements that carry text. Mirrors the essentials of the\n * React `getTextStyleForElement`.\n */\nexport function getTextBlockStyle(el: PptxElement): StyleMap {\n\tif (!hasTextProperties(el)) {\n\t\treturn {};\n\t}\n\tconst ts = el.textStyle;\n\tconst style: StyleMap = {\n\t\tdisplay: 'flex',\n\t\t'flex-direction': 'column',\n\t\twidth: '100%',\n\t\theight: '100%',\n\t\toverflow: 'hidden',\n\t\t'white-space': 'pre-wrap',\n\t\t'word-break': 'break-word',\n\t};\n\tif (!ts) {\n\t\tstyle['color'] = DEFAULT_TEXT_COLOR;\n\t\treturn style;\n\t}\n\n\tstyle['color'] = ts.color ?? DEFAULT_TEXT_COLOR;\n\tif (ts.fontFamily) {\n\t\tstyle['font-family'] = ts.fontFamily;\n\t}\n\tif (typeof ts.fontSize === 'number') {\n\t\tstyle['font-size'] = `${ts.fontSize}pt`;\n\t}\n\tif (ts.bold) {\n\t\tstyle['font-weight'] = 'bold';\n\t}\n\tif (ts.italic) {\n\t\tstyle['font-style'] = 'italic';\n\t}\n\n\tconst decorations: string[] = [];\n\tif (ts.underline) {\n\t\tdecorations.push('underline');\n\t}\n\tif (ts.strikethrough) {\n\t\tdecorations.push('line-through');\n\t}\n\tif (decorations.length > 0) {\n\t\tstyle['text-decoration'] = decorations.join(' ');\n\t}\n\n\tswitch (ts.align) {\n\t\tcase 'center':\n\t\t\tstyle['text-align'] = 'center';\n\t\t\tbreak;\n\t\tcase 'right':\n\t\t\tstyle['text-align'] = 'right';\n\t\t\tbreak;\n\t\tcase 'justify':\n\t\t\tstyle['text-align'] = 'justify';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tstyle['text-align'] = 'left';\n\t}\n\n\tswitch (ts.vAlign) {\n\t\tcase 'middle':\n\t\t\tstyle['justify-content'] = 'center';\n\t\t\tbreak;\n\t\tcase 'bottom':\n\t\t\tstyle['justify-content'] = 'flex-end';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tstyle['justify-content'] = 'flex-start';\n\t}\n\n\treturn style;\n}\n\n/** Resolve a displayable image source for picture/image/media poster frames. */\nexport function getImageSrc(\n\tel: PptxElement,\n\tmediaDataUrls: Map<string, string>,\n): string | undefined {\n\tif (el.type === 'picture' || el.type === 'image') {\n\t\treturn el.imageData ?? (el.imagePath ? mediaDataUrls.get(el.imagePath) : undefined);\n\t}\n\tif (el.type === 'media') {\n\t\treturn (\n\t\t\tel.posterFrameData ?? (el.posterFramePath ? mediaDataUrls.get(el.posterFramePath) : undefined)\n\t\t);\n\t}\n\treturn undefined;\n}\n","import { NgStyle } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { PptxElement, TextSegment } from 'pptx-viewer-core';\nimport { hasTextProperties } from 'pptx-viewer-core';\n\nimport {\n\tgetContainerStyle,\n\tgetImageSrc,\n\tgetShapeFillStrokeStyle,\n\tgetTextBlockStyle,\n} from './element-style';\nimport type { StyleMap } from './element-style';\n\ninterface TextRun {\n\ttext: string;\n\tstyle: StyleMap;\n}\n\n/**\n * ElementRendererComponent — Angular port of the React `ElementRenderer.tsx`\n * and the Vue `ElementRenderer.vue`.\n *\n * Renders a single slide element by its `type` discriminant (viewer-first\n * subset):\n * - `text` / `shape` → positioned box with fill/stroke + rich text\n * - `picture` / `image` → `<img>`\n * - `media` → poster frame (`<img>`) — playback TODO\n * - `group` → recursive children (self-referencing selector)\n * - everything else → labelled placeholder (TODO, see PORTING.md)\n *\n * Interaction (selection, resize, inline editing), connectors, charts, tables,\n * SmartArt, ink, OLE, and 3D are not yet ported.\n */\n@Component({\n\tselector: 'pptx-element-renderer',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\timports: [NgStyle],\n\ttemplate: `\n\t\t@switch (true) {\n\t\t\t@case (element().type === 'group') {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-element pptx-ng-group\"\n\t\t\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t\t>\n\t\t\t\t\t@for (child of children(); track child.id) {\n\t\t\t\t\t\t<pptx-element-renderer\n\t\t\t\t\t\t\t[element]=\"child\"\n\t\t\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t\t\t[zIndex]=\"$index\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case (isImageLike()) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-element pptx-ng-image\"\n\t\t\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t\t>\n\t\t\t\t\t@if (imageSrc()) {\n\t\t\t\t\t\t<img [src]=\"imageSrc()\" alt=\"\" class=\"pptx-ng-img\" />\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case (element().type === 'media') {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-element pptx-ng-media\"\n\t\t\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t\t>\n\t\t\t\t\t@if (imageSrc()) {\n\t\t\t\t\t\t<img [src]=\"imageSrc()\" alt=\"\" class=\"pptx-ng-img\" />\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<div class=\"pptx-ng-placeholder\">{{ placeholderLabel() }}</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case (isShapeLike()) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-element pptx-ng-shape\"\n\t\t\t\t\t[ngStyle]=\"shapeContainerStyle()\"\n\t\t\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t\t>\n\t\t\t\t\t@if (hasText()) {\n\t\t\t\t\t\t<div class=\"pptx-ng-text\" [ngStyle]=\"textStyle()\">\n\t\t\t\t\t\t\t@for (para of paragraphs(); track $index) {\n\t\t\t\t\t\t\t\t<p class=\"pptx-ng-para\">\n\t\t\t\t\t\t\t\t\t@for (run of para; track $index) {\n\t\t\t\t\t\t\t\t\t\t@if (\n\t\t\t\t\t\t\t\t\t\t\trun.text ===\n\t\t\t\t\t\t\t\t\t\t\t'\n'\n\t\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t\t} @else {\n\t\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\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@default {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-element pptx-ng-unsupported\"\n\t\t\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t\t>\n\t\t\t\t\t<div class=\"pptx-ng-placeholder\">{{ placeholderLabel() }}</div>\n\t\t\t\t</div>\n\t\t\t}\n\t\t}\n\t`,\n})\nexport class ElementRendererComponent {\n\treadonly element = input.required<PptxElement>();\n\treadonly mediaDataUrls = input<Map<string, string>>(new Map());\n\treadonly zIndex = input<number>(0);\n\n\treadonly containerStyle = computed<StyleMap>(() =>\n\t\tgetContainerStyle(this.element(), this.zIndex()),\n\t);\n\treadonly shapeContainerStyle = computed<StyleMap>(() => ({\n\t\t...this.containerStyle(),\n\t\t...getShapeFillStrokeStyle(this.element()),\n\t}));\n\treadonly textStyle = computed<StyleMap>(() => getTextBlockStyle(this.element()));\n\treadonly imageSrc = computed(() => getImageSrc(this.element(), this.mediaDataUrls()));\n\n\treadonly children = computed<PptxElement[]>(() => {\n\t\tconst el = this.element();\n\t\treturn el.type === 'group' ? (el.children ?? []) : [];\n\t});\n\n\treadonly isShapeLike = computed(\n\t\t() => this.element().type === 'text' || this.element().type === 'shape',\n\t);\n\treadonly isImageLike = computed(\n\t\t() => this.element().type === 'picture' || this.element().type === 'image',\n\t);\n\n\treadonly paragraphs = computed<TextRun[][]>(() => {\n\t\tconst el = this.element();\n\t\tif (!hasTextProperties(el)) {\n\t\t\treturn [];\n\t\t}\n\t\tconst segments = el.textSegments;\n\t\tif (!segments || segments.length === 0) {\n\t\t\treturn el.text ? [[{ text: el.text, style: {} }]] : [];\n\t\t}\n\t\tconst out: TextRun[][] = [[]];\n\t\tfor (const seg of segments) {\n\t\t\tif (seg.isParagraphBreak) {\n\t\t\t\tout.push([]);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst current = out[out.length - 1];\n\t\t\tconst text = seg.isLineBreak ? '\\n' : seg.text;\n\t\t\tif (text) {\n\t\t\t\tcurrent.push({ text, style: this.segmentStyle(seg) });\n\t\t\t}\n\t\t}\n\t\treturn out.filter((p) => p.length > 0 || out.length === 1);\n\t});\n\n\treadonly hasText = computed(() => this.paragraphs().some((p) => p.length > 0));\n\n\treadonly placeholderLabel = computed(() => {\n\t\tconst map: Record<string, string> = {\n\t\t\ttable: 'Table',\n\t\t\tchart: 'Chart',\n\t\t\tsmartArt: 'SmartArt',\n\t\t\tconnector: 'Connector',\n\t\t\tgroup: 'Group',\n\t\t\tmedia: 'Media',\n\t\t\tink: 'Ink',\n\t\t\tole: 'Embedded object',\n\t\t\tmodel3d: '3D model',\n\t\t\tzoom: 'Zoom',\n\t\t};\n\t\treturn map[this.element().type] ?? this.element().type;\n\t});\n\n\tprivate segmentStyle(seg: TextSegment): StyleMap {\n\t\tconst s = seg.style ?? {};\n\t\tconst style: StyleMap = {};\n\t\tif (s.fontFamily) {\n\t\t\tstyle['font-family'] = s.fontFamily;\n\t\t}\n\t\tif (typeof s.fontSize === 'number') {\n\t\t\tstyle['font-size'] = `${s.fontSize}pt`;\n\t\t}\n\t\tif (s.color) {\n\t\t\tstyle['color'] = s.color;\n\t\t}\n\t\tif (s.bold) {\n\t\t\tstyle['font-weight'] = 'bold';\n\t\t}\n\t\tif (s.italic) {\n\t\t\tstyle['font-style'] = 'italic';\n\t\t}\n\t\tconst deco: string[] = [];\n\t\tif (s.underline) {\n\t\t\tdeco.push('underline');\n\t\t}\n\t\tif (s.strikethrough) {\n\t\t\tdeco.push('line-through');\n\t\t}\n\t\tif (deco.length > 0) {\n\t\t\tstyle['text-decoration'] = deco.join(' ');\n\t\t}\n\t\treturn style;\n\t}\n}\n","import { NgStyle } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { PptxSlide } from 'pptx-viewer-core';\n\nimport type { CanvasSize } from '../internal/shared';\nimport { ElementRendererComponent } from './element-renderer.component';\nimport type { StyleMap } from './element-style';\n\n/**\n * SlideCanvasComponent — Angular port of the React `SlideCanvas.tsx` and Vue\n * `SlideCanvas.vue` (viewer-first subset).\n *\n * Renders the active slide as a fixed-size stage scaled by `zoom`, with each\n * element absolutely positioned. The React version additionally layered in\n * rulers, grid, guides, marquee/selection, connector-creation, drawing, and\n * collaboration overlays — all tracked in PORTING.md.\n */\n@Component({\n\tselector: 'pptx-slide-canvas',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\timports: [NgStyle, ElementRendererComponent],\n\ttemplate: `\n\t\t<div class=\"pptx-ng-canvas-viewport\">\n\t\t\t<div class=\"pptx-ng-canvas-wrapper\" [ngStyle]=\"wrapperStyle()\">\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-canvas-stage\"\n\t\t\t\t\trole=\"region\"\n\t\t\t\t\taria-roledescription=\"slide\"\n\t\t\t\t\t[ngStyle]=\"stageStyle()\"\n\t\t\t\t>\n\t\t\t\t\t@for (element of elements(); track element.id; let i = $index) {\n\t\t\t\t\t\t<pptx-element-renderer\n\t\t\t\t\t\t\t[element]=\"element\"\n\t\t\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t\t\t[zIndex]=\"i\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t`,\n})\nexport class SlideCanvasComponent {\n\treadonly slide = input<PptxSlide | undefined>(undefined);\n\treadonly canvasSize = input.required<CanvasSize>();\n\treadonly mediaDataUrls = input<Map<string, string>>(new Map());\n\treadonly zoom = input<number>(1);\n\n\treadonly elements = computed(() => this.slide()?.elements ?? []);\n\n\treadonly wrapperStyle = computed<StyleMap>(() => {\n\t\tconst scale = this.zoom();\n\t\tconst size = this.canvasSize();\n\t\treturn {\n\t\t\twidth: `${size.width * scale}px`,\n\t\t\theight: `${size.height * scale}px`,\n\t\t\tposition: 'relative',\n\t\t\tmargin: '1rem auto',\n\t\t};\n\t});\n\n\treadonly stageStyle = computed<StyleMap>(() => {\n\t\tconst scale = this.zoom();\n\t\tconst size = this.canvasSize();\n\t\tconst slide = this.slide();\n\t\tconst style: StyleMap = {\n\t\t\twidth: `${size.width}px`,\n\t\t\theight: `${size.height}px`,\n\t\t\ttransform: `scale(${scale})`,\n\t\t\t'transform-origin': 'top left',\n\t\t\tposition: 'relative',\n\t\t\toverflow: 'hidden',\n\t\t\t'background-color':\n\t\t\t\tslide?.backgroundColor && slide.backgroundColor !== 'transparent'\n\t\t\t\t\t? slide.backgroundColor\n\t\t\t\t\t: '#ffffff',\n\t\t\t'background-size': '100% 100%',\n\t\t\t'box-shadow': '0 10px 40px rgba(0, 0, 0, 0.35)',\n\t\t};\n\t\tif (slide?.backgroundImage) {\n\t\t\tstyle['background-image'] = `url(${slide.backgroundImage})`;\n\t\t}\n\t\treturn style;\n\t});\n}\n","import { NgClass, NgStyle } from '@angular/common';\nimport {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\teffect,\n\tinject,\n\tinput,\n\toutput,\n\tsignal,\n} from '@angular/core';\n\nimport type { ViewerTheme } from '../internal/shared';\nimport { themeStyle } from '../theme/viewer-theme';\nimport { LoadContentService } from './load-content.service';\nimport { SlideCanvasComponent } from './slide-canvas.component';\nimport type { CollaborationConfig } from './types';\n\nconst ZOOM_STEP = 0.1;\nconst ZOOM_MIN = 0.2;\nconst ZOOM_MAX = 3;\n\n/**\n * PowerPointViewerComponent — Angular port of the React `PowerPointViewer.tsx`\n * and Vue `PowerPointViewer.vue`.\n *\n * Top-level orchestrator that loads `.pptx` bytes and renders the slides with\n * navigation and zoom. This is the viewer-first milestone of the port: the\n * React component additionally composes a full editor (toolbar, inspector\n * panels, dialogs, presentation mode, collaboration, export). The roadmap and\n * per-area status live in `packages/angular/PORTING.md`.\n *\n * Conventions vs. React/Vue:\n * - React `forwardRef` handle / Vue `defineExpose` → public {@link getContent}\n * method (reach it via a template ref or `viewChild`).\n * - React callback props / Vue emits → Angular `output()` events.\n * - React theme context / Vue provide-inject → `themeStyle` CSS vars applied to\n * the root element (app-wide sharing via `provideViewerTheme`).\n */\n@Component({\n\tselector: 'pptx-viewer',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tproviders: [LoadContentService],\n\timports: [NgClass, NgStyle, SlideCanvasComponent],\n\ttemplate: `\n\t\t<div class=\"pptx-ng-viewer\" [ngClass]=\"class()\" [ngStyle]=\"rootStyle()\">\n\t\t\t@if (loader.loading()) {\n\t\t\t\t<div class=\"pptx-ng-state pptx-ng-loading\">\n\t\t\t\t\t<div class=\"pptx-ng-spinner\" aria-hidden=\"true\"></div>\n\t\t\t\t\t<p>Loading presentation…</p>\n\t\t\t\t</div>\n\t\t\t} @else if (loader.isEncrypted()) {\n\t\t\t\t<div class=\"pptx-ng-state pptx-ng-error\">\n\t\t\t\t\t<p>This presentation is password-protected and cannot be opened.</p>\n\t\t\t\t</div>\n\t\t\t} @else if (loader.error()) {\n\t\t\t\t<div class=\"pptx-ng-state pptx-ng-error\">\n\t\t\t\t\t<p>Failed to load presentation.</p>\n\t\t\t\t\t<pre class=\"pptx-ng-error-detail\">{{ loader.error() }}</pre>\n\t\t\t\t</div>\n\t\t\t} @else {\n\t\t\t\t<header class=\"pptx-ng-toolbar\">\n\t\t\t\t\t<div class=\"pptx-ng-nav\">\n\t\t\t\t\t\t<button type=\"button\" [disabled]=\"activeSlideIndex() <= 0\" (click)=\"goPrev()\">‹</button>\n\t\t\t\t\t\t<span class=\"pptx-ng-slide-counter\">\n\t\t\t\t\t\t\t{{ slideCount() === 0 ? 0 : activeSlideIndex() + 1 }} / {{ slideCount() }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t[disabled]=\"activeSlideIndex() >= slideCount() - 1\"\n\t\t\t\t\t\t\t(click)=\"goNext()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t›\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"pptx-ng-zoom\">\n\t\t\t\t\t\t<button type=\"button\" (click)=\"zoomOut()\">−</button>\n\t\t\t\t\t\t<button type=\"button\" class=\"pptx-ng-zoom-value\" (click)=\"zoomReset()\">\n\t\t\t\t\t\t\t{{ zoomPercent() }}%\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button type=\"button\" (click)=\"zoomIn()\">+</button>\n\t\t\t\t\t</div>\n\t\t\t\t</header>\n\n\t\t\t\t<div class=\"pptx-ng-body\">\n\t\t\t\t\t<nav class=\"pptx-ng-thumbnails\" aria-label=\"Slides\">\n\t\t\t\t\t\t@for (slide of loader.slides(); track slide.id; let i = $index) {\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"pptx-ng-thumb\"\n\t\t\t\t\t\t\t\t[class.is-active]=\"i === activeSlideIndex()\"\n\t\t\t\t\t\t\t\t(click)=\"goTo(i)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span class=\"pptx-ng-thumb-index\">{{ i + 1 }}</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t}\n\t\t\t\t\t</nav>\n\n\t\t\t\t\t<main class=\"pptx-ng-main\">\n\t\t\t\t\t\t<pptx-slide-canvas\n\t\t\t\t\t\t\t[slide]=\"activeSlide()\"\n\t\t\t\t\t\t\t[canvasSize]=\"loader.canvasSize()\"\n\t\t\t\t\t\t\t[mediaDataUrls]=\"loader.mediaDataUrls()\"\n\t\t\t\t\t\t\t[zoom]=\"zoom()\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</main>\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t`,\n})\nexport class PowerPointViewerComponent {\n\t/** PowerPoint content as Uint8Array (or ArrayBuffer). */\n\treadonly content = input<Uint8Array | ArrayBuffer | null>(null);\n\t/** Whether editing actions are enabled. (Editor chrome not yet ported.) */\n\treadonly canEdit = input<boolean>(false);\n\t/** Optional class applied to the root element. */\n\treadonly class = input<string>('');\n\t/** Theme configuration for customising the viewer's appearance. */\n\treadonly theme = input<ViewerTheme | undefined>(undefined);\n\t/** Optional real-time collaboration config (accepted for API parity; not yet implemented). */\n\treadonly collaboration = input<CollaborationConfig | undefined>(undefined);\n\n\t/** Fired when the active slide changes. */\n\treadonly activeSlideChange = output<number>();\n\t/** Fired when the unsaved-changes flag toggles. (Editing not yet ported.) */\n\treadonly dirtyChange = output<boolean>();\n\t/** Fired when the in-memory content changes after edits. (Editing not yet ported.) */\n\treadonly contentChange = output<Uint8Array>();\n\n\tprotected readonly loader = inject(LoadContentService);\n\n\tprotected readonly activeSlideIndex = signal(0);\n\tprotected readonly slideCount = this.loader.slideCount;\n\tprotected readonly activeSlide = computed(() => this.loader.slides()[this.activeSlideIndex()]);\n\tprotected readonly rootStyle = computed(() => themeStyle(this.theme()));\n\n\tprotected readonly zoom = signal(1);\n\tprotected readonly zoomPercent = computed(() => Math.round(this.zoom() * 100));\n\n\tconstructor() {\n\t\t// Load whenever the `content` input changes.\n\t\teffect(() => {\n\t\t\tconst content = this.content();\n\t\t\tvoid this.loader.load(content);\n\t\t});\n\n\t\t// Reset to the first slide whenever a new presentation finishes loading.\n\t\teffect(() => {\n\t\t\t// Read slides to track; reset index out of band.\n\t\t\tthis.loader.slides();\n\t\t\tthis.activeSlideIndex.set(0);\n\t\t});\n\n\t\t// Emit navigation changes.\n\t\teffect(() => {\n\t\t\tthis.activeSlideChange.emit(this.activeSlideIndex());\n\t\t});\n\t}\n\n\t/** Serialise the current presentation to `.pptx` bytes (imperative handle). */\n\tgetContent(): Promise<Uint8Array> {\n\t\treturn this.loader.getContent();\n\t}\n\n\tgoTo(index: number): void {\n\t\tif (index < 0 || index >= this.slideCount()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.activeSlideIndex.set(index);\n\t}\n\tgoPrev(): void {\n\t\tthis.goTo(this.activeSlideIndex() - 1);\n\t}\n\tgoNext(): void {\n\t\tthis.goTo(this.activeSlideIndex() + 1);\n\t}\n\n\tzoomIn(): void {\n\t\tthis.zoom.set(Math.min(ZOOM_MAX, Number((this.zoom() + ZOOM_STEP).toFixed(2))));\n\t}\n\tzoomOut(): void {\n\t\tthis.zoom.set(Math.max(ZOOM_MIN, Number((this.zoom() - ZOOM_STEP).toFixed(2))));\n\t}\n\tzoomReset(): void {\n\t\tthis.zoom.set(1);\n\t}\n}\n","/**\n * Scalar viewer defaults — shared across the React, Vue, and Angular bindings\n * via `pptx-viewer-shared`. Re-exported here for ergonomic local imports.\n */\nexport {\n\tDEFAULT_CANVAS_WIDTH,\n\tDEFAULT_CANVAS_HEIGHT,\n\tDEFAULT_TEXT_COLOR,\n\tDEFAULT_FILL_COLOR,\n\tDEFAULT_STROKE_COLOR,\n} from '../internal/shared';\n","/**\n * Join class values into a single space-separated string, skipping falsy\n * entries. A dependency-free analogue of the React/Vue packages' `cn`\n * (clsx + tailwind-merge); the Angular viewer uses plain scoped CSS rather\n * than Tailwind utility classes, so de-duplication is not required.\n */\nexport type ClassValue = string | number | false | null | undefined;\n\nexport function cn(...values: ClassValue[]): string {\n\treturn values.filter((v): v is string | number => Boolean(v)).join(' ');\n}\n","/**\n * Public API surface for `pptx-angular-viewer`.\n *\n * Angular counterpart of the React `pptx-viewer` and Vue `pptx-vue-viewer`\n * packages. Wraps the framework-agnostic `pptx-viewer-core` engine and shares\n * cross-framework logic via `pptx-viewer-shared`.\n */\nexport * from './viewer';\nexport * from './theme';\nexport { cn, type ClassValue } from './utils';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pptx-angular-viewer.mjs","sources":["../../src/internal/shared-src/theme/defaults.ts","../../src/internal/shared-src/theme/css-vars.ts","../../src/internal/shared-src/loader/load-content-helpers.ts","../../src/internal/shared-src/types.ts","../../src/internal/shared-src/constants.ts","../../src/internal/shared-src/render/shape-geometry.ts","../../src/internal/shared-src/render/fill-style.ts","../../src/internal/shared-src/render/visual-effects.ts","../../src/internal/shared-src/render/image-effects.ts","../../src/internal/shared-src/render/text-warp.ts","../../src/internal/shared-src/render/omml-to-mathml.ts","../../src/internal/shared-src/render/chart-helpers.ts","../../src/internal/shared-src/render/animation-css.ts","../../src/internal/shared-src/render/element-align.ts","../../src/internal/shared-src/render/element-interaction.ts","../../src/internal/shared-src/render/index.ts","../../src/internal/shared-src/index.ts","../../src/internal/shared.ts","../../src/theme/viewer-theme.ts","../../src/viewer/align-distribute.ts","../../src/viewer/editor-history.ts","../../src/viewer/element-operations.ts","../../src/viewer/group-ops.ts","../../src/viewer/editor-state.service.ts","../../src/viewer/editor-context-menu.component.ts","../../src/viewer/editor-insert.ts","../../src/viewer/editor-toolbar.component.ts","../../src/viewer/export-helpers.ts","../../src/lib/canvas-export.ts","../../src/viewer/export.service.ts","../../src/viewer/slide-search.ts","../../src/viewer/find-bar.component.ts","../../src/viewer/inspector-helpers.ts","../../src/viewer/inspector-panel.component.ts","../../src/viewer/load-content.service.ts","../../src/viewer/presentation-overlay-helpers.ts","../../src/viewer/drag-resize.ts","../../src/viewer/chart-renderer-helpers.ts","../../src/viewer/chart-renderer.component.ts","../../src/viewer/connector-path.ts","../../src/viewer/connector-renderer.component.ts","../../src/viewer/constants.ts","../../src/viewer/visual-effects.ts","../../src/viewer/color-gradient.ts","../../src/viewer/color-patterns.ts","../../src/viewer/shape-geometry.ts","../../src/viewer/element-style.ts","../../src/viewer/omml-to-mathml.ts","../../src/viewer/equation-renderer.component.ts","../../src/viewer/hyperlink.ts","../../src/viewer/ink-renderer-helpers.ts","../../src/viewer/ink-renderer.component.ts","../../src/viewer/model3d-renderer-helpers.ts","../../src/viewer/model3d-renderer.component.ts","../../src/viewer/ole-renderer-helpers.ts","../../src/viewer/ole-renderer.component.ts","../../src/viewer/smart-art-layouts.ts","../../src/viewer/smart-art-renderer-helpers.ts","../../src/viewer/smart-art-renderer.component.ts","../../src/viewer/table-renderer-helpers.ts","../../src/viewer/table-renderer.component.ts","../../src/viewer/text-bullets.ts","../../src/viewer/zoom-renderer-helpers.ts","../../src/viewer/zoom-renderer.component.ts","../../src/viewer/element-renderer.component.ts","../../src/viewer/slide-background.ts","../../src/viewer/snap-guides.ts","../../src/viewer/slide-canvas.component.ts","../../src/viewer/presentation-overlay.component.ts","../../src/viewer/slide-sorter-overlay-helpers.ts","../../src/viewer/slide-sorter-overlay.component.ts","../../src/viewer/slides-panel.component.ts","../../src/viewer/power-point-viewer.component.ts","../../src/utils.ts","../../src/public-api.ts","../../src/pptx-angular-viewer.ts"],"sourcesContent":["import type { ViewerThemeColors } from './types';\n\n/**\n * Default dark-theme color values.\n *\n * These correspond to the built-in dark UI of the PowerPoint viewer and\n * use Tailwind's gray palette as the neutral scale with indigo as the\n * primary accent.\n */\nexport const defaultThemeColors: ViewerThemeColors = {\n\tbackground: '#030712', // gray-950\n\tforeground: '#f3f4f6', // gray-100\n\n\tcard: '#111827', // gray-900\n\tcardForeground: '#f3f4f6', // gray-100\n\n\tpopover: '#111827', // gray-900\n\tpopoverForeground: '#f3f4f6', // gray-100\n\n\tprimary: '#6366f1', // indigo-500\n\tprimaryForeground: '#ffffff', // white\n\n\tsecondary: '#1f2937', // gray-800\n\tsecondaryForeground: '#f3f4f6', // gray-100\n\n\tmuted: '#1f2937', // gray-800\n\tmutedForeground: '#9ca3af', // gray-400\n\n\taccent: '#1f2937', // gray-800\n\taccentForeground: '#f3f4f6', // gray-100\n\n\tdestructive: '#ef4444', // red-500\n\tdestructiveForeground: '#ffffff', // white\n\n\tborder: '#374151', // gray-700\n\tinput: '#374151', // gray-700\n\tring: '#6366f1', // indigo-500\n};\n\n/** Default border-radius. */\nexport const defaultRadius = '0.5rem';\n","import { defaultThemeColors, defaultRadius } from './defaults';\nimport type { ViewerTheme, ViewerThemeColors } from './types';\n\n/**\n * Map from camelCase ViewerThemeColors keys to kebab-case CSS custom\n * property suffixes (the part after `--pptx-`).\n */\nconst COLOR_KEY_TO_CSS: Record<keyof ViewerThemeColors, string> = {\n\tbackground: 'background',\n\tforeground: 'foreground',\n\tcard: 'card',\n\tcardForeground: 'card-foreground',\n\tpopover: 'popover',\n\tpopoverForeground: 'popover-foreground',\n\tprimary: 'primary',\n\tprimaryForeground: 'primary-foreground',\n\tsecondary: 'secondary',\n\tsecondaryForeground: 'secondary-foreground',\n\tmuted: 'muted',\n\tmutedForeground: 'muted-foreground',\n\taccent: 'accent',\n\taccentForeground: 'accent-foreground',\n\tdestructive: 'destructive',\n\tdestructiveForeground: 'destructive-foreground',\n\tborder: 'border',\n\tinput: 'input',\n\tring: 'ring',\n};\n\n/**\n * Convert a `ViewerTheme` into a flat `Record<string, string>` of CSS\n * custom properties (including the `--` prefix) ready to be spread onto\n * a `style` attribute.\n *\n * Only properties that differ from the built-in defaults are emitted when\n * `omitDefaults` is true (the default).\n */\nexport function themeToCssVars(\n\ttheme: ViewerTheme | undefined,\n\tomitDefaults = false,\n): Record<string, string> {\n\tconst vars: Record<string, string> = {};\n\n\tif (!theme) {\n\t\treturn vars;\n\t}\n\n\t// ── Colors ───────────────────────────────────────────────────────\n\tconst colors = theme.colors;\n\tif (colors) {\n\t\tfor (const [key, cssSuffix] of Object.entries(COLOR_KEY_TO_CSS)) {\n\t\t\tconst value = colors[key as keyof ViewerThemeColors];\n\t\t\tif (value === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (omitDefaults && value === defaultThemeColors[key as keyof ViewerThemeColors]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvars[`--pptx-${cssSuffix}`] = value;\n\t\t}\n\t}\n\n\t// ── Radius ───────────────────────────────────────────────────────\n\tif (theme.radius !== undefined) {\n\t\tif (!omitDefaults || theme.radius !== defaultRadius) {\n\t\t\tvars['--pptx-radius'] = theme.radius;\n\t\t}\n\t}\n\n\t// ── Escape-hatch custom properties ───────────────────────────────\n\tif (theme.cssVars) {\n\t\tfor (const [key, value] of Object.entries(theme.cssVars)) {\n\t\t\tvars[key] = value;\n\t\t}\n\t}\n\n\treturn vars;\n}\n\n/**\n * Build the complete set of CSS custom properties with all defaults.\n * Useful for generating a full fallback stylesheet.\n */\nexport function defaultCssVars(): Record<string, string> {\n\tconst vars: Record<string, string> = {};\n\n\tfor (const [key, cssSuffix] of Object.entries(COLOR_KEY_TO_CSS)) {\n\t\tvars[`--pptx-${cssSuffix}`] = defaultThemeColors[key as keyof ViewerThemeColors];\n\t}\n\tvars['--pptx-radius'] = defaultRadius;\n\n\treturn vars;\n}\n","/**\n * Pure helper functions for the viewer load pipeline.\n *\n * Framework-agnostic — shared by the React, Vue, and Angular bindings. These\n * were duplicated verbatim across `packages/react` and `packages/vue`; this is\n * now the single canonical copy.\n */\nimport type {\n\tMediaPptxElement,\n\tPicturePptxElement,\n\tPptxElement,\n\tPptxDrawingGuide,\n\tPptxSlide,\n} from 'pptx-viewer-core';\nimport { guideEmuToPx } from 'pptx-viewer-core';\n\nexport interface GuideEntry {\n\tid: string;\n\taxis: 'h' | 'v';\n\tposition: number;\n}\n\n/** An element that may carry an image path needing Blob URL resolution. */\nexport interface ImagePathElement {\n\telement: PptxElement;\n\tfield: 'imageData' | 'svgData' | 'posterFrameData';\n\tpath: string;\n}\n\n/**\n * Recursively walks an element tree and pushes every media element\n * into the supplied collector array.\n */\nexport function collectMediaElements(elements: PptxElement[], collector: MediaPptxElement[]): void {\n\tfor (const element of elements) {\n\t\tif (element.type === 'media') {\n\t\t\tcollector.push(element);\n\t\t\tcontinue;\n\t\t}\n\t\tif (element.type === 'group' && element.children?.length) {\n\t\t\tcollectMediaElements(element.children, collector);\n\t\t}\n\t}\n}\n\n/**\n * Collect all unique image archive paths across all slides that need\n * to be resolved to displayable URLs (Blob URLs).\n *\n * This covers:\n * - Picture elements (`imageData`, `svgData`)\n * - Media poster frames (`posterFrameData`)\n *\n * Returns the set of unique archive paths, plus a list of element/field\n * references that need to be updated once each path resolves.\n */\nexport function collectImagePaths(slides: PptxSlide[]): {\n\tpaths: Set<string>;\n\trefs: ImagePathElement[];\n} {\n\tconst paths = new Set<string>();\n\tconst refs: ImagePathElement[] = [];\n\n\tconst walkElements = (elements: PptxElement[]) => {\n\t\tfor (const el of elements) {\n\t\t\tif (el.type === 'picture' || el.type === 'image') {\n\t\t\t\tconst pic = el as PicturePptxElement;\n\t\t\t\tif (pic.imagePath && !pic.imageData && !isExternalUrl(pic.imagePath)) {\n\t\t\t\t\tpaths.add(pic.imagePath);\n\t\t\t\t\trefs.push({ element: el, field: 'imageData', path: pic.imagePath });\n\t\t\t\t}\n\t\t\t\tif (pic.svgPath && !pic.svgData && !isExternalUrl(pic.svgPath)) {\n\t\t\t\t\tpaths.add(pic.svgPath);\n\t\t\t\t\trefs.push({ element: el, field: 'svgData', path: pic.svgPath });\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (el.type === 'media') {\n\t\t\t\tconst media = el as MediaPptxElement;\n\t\t\t\tif (\n\t\t\t\t\tmedia.posterFramePath &&\n\t\t\t\t\t!media.posterFrameData &&\n\t\t\t\t\t!isExternalUrl(media.posterFramePath)\n\t\t\t\t) {\n\t\t\t\t\tpaths.add(media.posterFramePath);\n\t\t\t\t\trefs.push({\n\t\t\t\t\t\telement: el,\n\t\t\t\t\t\tfield: 'posterFrameData',\n\t\t\t\t\t\tpath: media.posterFramePath,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (el.type === 'group' && el.children?.length) {\n\t\t\t\twalkElements(el.children);\n\t\t\t}\n\t\t}\n\t};\n\n\tfor (const slide of slides) {\n\t\twalkElements(slide.elements);\n\t}\n\n\treturn { paths, refs };\n}\n\nfunction isExternalUrl(path: string): boolean {\n\treturn (\n\t\tpath.startsWith('http://') ||\n\t\tpath.startsWith('https://') ||\n\t\tpath.startsWith('data:') ||\n\t\tpath.startsWith('blob:')\n\t);\n}\n\n/**\n * Converts raw EMU-based drawing guides from the parsed presentation\n * and the first slide into pixel-based `GuideEntry` objects.\n */\nexport function buildInitialGuides(\n\tpresentationGuides: PptxDrawingGuide[] | undefined,\n\tfirstSlideGuides: PptxDrawingGuide[] | undefined,\n): GuideEntry[] {\n\tconst guides: GuideEntry[] = [];\n\tif (presentationGuides) {\n\t\tfor (const g of presentationGuides) {\n\t\t\tguides.push({\n\t\t\t\tid: g.id,\n\t\t\t\taxis: g.orientation === 'horz' ? 'h' : 'v',\n\t\t\t\tposition: guideEmuToPx(g.positionEmu),\n\t\t\t});\n\t\t}\n\t}\n\tif (firstSlideGuides) {\n\t\tfor (const g of firstSlideGuides) {\n\t\t\tguides.push({\n\t\t\t\tid: g.id,\n\t\t\t\taxis: g.orientation === 'horz' ? 'h' : 'v',\n\t\t\t\tposition: guideEmuToPx(g.positionEmu),\n\t\t\t});\n\t\t}\n\t}\n\treturn guides;\n}\n","/**\n * Framework-agnostic public types shared by the viewer bindings.\n *\n * These were duplicated in the React (`types-ui.ts`) and Vue (`viewer/types.ts`)\n * packages; this is the canonical copy. Each binding layers its own\n * framework-specific prop/event/handle types on top of these.\n */\n\n/** Canvas dimensions in pixels. */\nexport interface CanvasSize {\n\twidth: number;\n\theight: number;\n}\n\n/** Collaboration role within a session. */\nexport type CollaborationRole = 'owner' | 'collaborator' | 'viewer';\n\n/**\n * Real-time collaboration configuration.\n *\n * The collaboration runtime (Yjs) is not yet ported to every binding — this\n * type exists so the public prop surface stays identical across React, Vue,\n * and Angular.\n */\nexport interface CollaborationConfig {\n\t/** Unique identifier for the collaboration room (alphanumeric, hyphens, underscores). */\n\troomId: string;\n\t/** WebSocket server URL for the Yjs provider (e.g. \"wss://collab.example.com\"). */\n\tserverUrl: string;\n\t/** Display name for the local user. */\n\tuserName: string;\n\t/** Avatar URL for the local user (optional). */\n\tuserAvatar?: string;\n\t/** Hex colour for the local user's cursor/presence indicator. */\n\tuserColor?: string;\n\t/** Optional authentication token sent with the WebSocket handshake. */\n\tauthToken?: string;\n\t/** Role in the session — defaults to `'collaborator'`. */\n\trole?: CollaborationRole;\n}\n","/**\n * Scalar viewer defaults shared by the UI bindings.\n *\n * Subset of the React package's `constants/scalar.ts` that the Vue and Angular\n * viewers also need. Additional constant groups (toolbar presets, shape styles,\n * transitions, etc.) remain per-binding until those features are ported.\n */\n\n/** Default slide canvas width in pixels when the file declares none. */\nexport const DEFAULT_CANVAS_WIDTH = 1280;\n/** Default slide canvas height in pixels when the file declares none. */\nexport const DEFAULT_CANVAS_HEIGHT = 720;\n\n/** Fallback text colour. */\nexport const DEFAULT_TEXT_COLOR = '#111827';\n/** Fallback shape fill colour. */\nexport const DEFAULT_FILL_COLOR = '#3b82f6';\n/** Fallback shape stroke colour. */\nexport const DEFAULT_STROKE_COLOR = '#1f2937';\n","/**\n * Shape geometry helpers — Vue port of the React package's\n * `viewer/utils/resolved-shape-clip-path.ts` cascade.\n *\n * All the heavy lifting (the ECMA-376 preset evaluator, the adjustment-aware\n * table, the cubic-Bezier cloud paths, and the static preset clip-path table)\n * already lives in `pptx-viewer-core` and is framework-agnostic, so — unlike\n * the React package, which keeps a local polygon fallback — the Vue binding\n * imports those entry points directly. No `pptx-viewer-shared` extraction is\n * required here.\n *\n * The resolution priority mirrors React exactly:\n *\n * 1. **Adjustment-aware** — when `shapeAdjustments` exist, consult\n * {@link getAdjustmentAwareShapeClipPath} so `pie`, `arc`, `donut`,\n * `blockArc`, and wedge callouts respond to their adjustment values.\n * 2. **Spec-correct preset evaluator** — {@link getShapeClipPathFromPreset}\n * produces a `path('…')` clip-path for any shape in the preset table.\n * 3. **Cloud Bezier path** — {@link getCloudPathForRendering} for\n * `cloud` / `cloudCallout`.\n * 4. **Static preset table** — {@link getShapeClipPath} as the final\n * fallback (core's comprehensive `PRESET_SHAPE_CLIP_PATHS`).\n */\nimport type { PptxElement } from 'pptx-viewer-core';\nimport {\n\tgetAdjustmentAwareShapeClipPath,\n\tgetCloudPathForRendering,\n\tgetShapeClipPath,\n\tgetShapeClipPathFromPreset,\n} from 'pptx-viewer-core';\n\n/**\n * Resolve the best available CSS `clip-path` value for a shape type at a given\n * pixel size. Implements the priority cascade described in the module\n * docstring. Returns `undefined` when the shape needs no clipping.\n *\n * @param shapeType The OOXML preset geometry name (case-insensitive).\n * @param width Element width in pixels (must be > 0 for path output).\n * @param height Element height in pixels (must be > 0 for path output).\n * @param adjustments Optional `shapeAdjustments` record from the element.\n */\nexport function getResolvedShapeClipPathFor(\n\tshapeType: string | undefined,\n\twidth: number,\n\theight: number,\n\tadjustments?: Record<string, number>,\n): string | undefined {\n\tif (!shapeType) {\n\t\treturn undefined;\n\t}\n\t// Without finite, positive dimensions the path/evaluator entry points can't\n\t// produce meaningful geometry; fall straight back to the static table.\n\tif (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {\n\t\treturn getShapeClipPath(shapeType);\n\t}\n\n\t// 1. Adjustment-aware path — only when adjustments are actually supplied.\n\tif (adjustments && Object.keys(adjustments).length > 0) {\n\t\tconst adjusted = getAdjustmentAwareShapeClipPath(shapeType, width, height, adjustments);\n\t\tif (adjusted !== undefined) {\n\t\t\treturn adjusted;\n\t\t}\n\t}\n\n\t// 2. Spec-correct ECMA-376 preset evaluator.\n\tconst fromPreset = getShapeClipPathFromPreset(shapeType, width, height, adjustments);\n\tif (fromPreset !== undefined) {\n\t\treturn fromPreset;\n\t}\n\n\t// 3. Cubic-Bezier cloud / cloudCallout path (DPI-stable lobes).\n\tconst cloud = getCloudPathForRendering(shapeType, width, height);\n\tif (cloud !== undefined) {\n\t\treturn cloud;\n\t}\n\n\t// 4. Final fallback: core's static preset clip-path table.\n\treturn getShapeClipPath(shapeType);\n}\n\n/**\n * Element-level convenience wrapper. Pulls `shapeType`, `width`, `height`, and\n * `shapeAdjustments` off a {@link PptxElement} and delegates to\n * {@link getResolvedShapeClipPathFor}.\n *\n * @param element The PPTX element to resolve a clip-path for.\n * @param width Optional width override (pixels). Defaults to `element.width`.\n * @param height Optional height override (pixels). Defaults to `element.height`.\n */\nexport function getResolvedShapeClipPath(\n\telement: PptxElement,\n\twidth?: number,\n\theight?: number,\n): string | undefined {\n\tconst shapeType = (element as { shapeType?: string }).shapeType;\n\tif (!shapeType) {\n\t\treturn undefined;\n\t}\n\tconst w = typeof width === 'number' ? width : element.width;\n\tconst h = typeof height === 'number' ? height : element.height;\n\tconst adjustments = (element as { shapeAdjustments?: Record<string, number> }).shapeAdjustments;\n\treturn getResolvedShapeClipPathFor(shapeType, w, h, adjustments);\n}\n","/**\n * Framework-agnostic fill resolver for the Vue viewer.\n *\n * Ports the rich structured gradient and pattern-fill logic from the React\n * package (`viewer/utils/color-gradient.ts`, `color-patterns.ts`,\n * `color-core.ts`) into a pure, unit-testable TypeScript module. It converts\n * structured OOXML gradient and pattern-fill data on a `ShapeStyle` into CSS\n * background declarations.\n *\n * Three public entry points:\n * - {@link buildGradientCss} — structured gradient → CSS gradient string\n * - {@link buildPatternFill} — OOXML preset pattern → CSS background image\n * - {@link getComputedFillStyle} — aggregate resolver (image → gradient →\n * pattern → solid), mirroring the React\n * `getShapeVisualStyle` fill ordering.\n *\n * Gradient rendering follows ECMA-376 Part 1, §20.1.8.35 (gradFill) and\n * §20.1.8.49 (pathFill). Pattern presets follow §20.1.10.33\n * (ST_PresetPatternVal).\n */\nimport type { PptxElement, ShapeStyle } from 'pptx-viewer-core';\nimport { hasShapeProperties } from 'pptx-viewer-core';\n\nimport { DEFAULT_FILL_COLOR } from '../constants';\n\n// ---------------------------------------------------------------------------\n// Color primitives (inlined from React `color-core.ts`)\n// ---------------------------------------------------------------------------\n\n/**\n * Normalizes an arbitrary colour string to a 6-digit hex value (`#RRGGBB`).\n * Returns the fallback when the input is missing, \"transparent\", or invalid.\n */\nexport function normalizeHexColor(value: string | undefined, fallback: string): string {\n\tif (!value || value === 'transparent') {\n\t\treturn fallback;\n\t}\n\tconst candidate = value.startsWith('#') ? value : `#${value}`;\n\treturn /^#[0-9A-Fa-f]{6}$/u.test(candidate) ? candidate : fallback;\n}\n\n/** Clamps a numeric value to the [0, 1] range. */\nexport function clampUnitInterval(value: number): number {\n\treturn Math.min(1, Math.max(0, value));\n}\n\n/** Parses a 6-digit hex colour into R/G/B channels (0-255), or `null`. */\nfunction hexToRgbChannels(color: string): { r: number; g: number; b: number } | null {\n\tconst normalized = color.replace('#', '');\n\tif (!/^[0-9a-fA-F]{6}$/u.test(normalized)) {\n\t\treturn null;\n\t}\n\treturn {\n\t\tr: Number.parseInt(normalized.slice(0, 2), 16),\n\t\tg: Number.parseInt(normalized.slice(2, 4), 16),\n\t\tb: Number.parseInt(normalized.slice(4, 6), 16),\n\t};\n}\n\n/**\n * Converts a hex colour to an `rgba()` CSS string with the given opacity.\n * If `opacity` is `undefined`, the original hex colour is returned unchanged.\n */\nexport function colorWithOpacity(color: string, opacity: number | undefined): string {\n\tif (opacity === undefined) {\n\t\treturn color;\n\t}\n\tconst rgb = hexToRgbChannels(color);\n\tif (!rgb) {\n\t\treturn color;\n\t}\n\treturn `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${clampUnitInterval(opacity)})`;\n}\n\n// ---------------------------------------------------------------------------\n// Gradient stop sanitization & conversion (from React `color-gradient.ts`)\n// ---------------------------------------------------------------------------\n\ntype GradientStop = NonNullable<ShapeStyle['fillGradientStops']>[number];\ntype SanitizedStop = { color: string; position: number; opacity?: number };\n\n/**\n * Validates, normalizes, and sorts an array of gradient stops. Filters out\n * invalid entries (missing color/position), clamps positions to 0-100,\n * normalizes colours, and sorts by ascending position.\n */\nexport function sanitizeGradientStops(\n\tstops: ShapeStyle['fillGradientStops'] | undefined,\n): SanitizedStop[] {\n\tif (!stops || stops.length === 0) {\n\t\treturn [];\n\t}\n\treturn stops\n\t\t.filter(\n\t\t\t(stop: GradientStop) =>\n\t\t\t\ttypeof stop?.color === 'string' &&\n\t\t\t\tString(stop.color).trim().length > 0 &&\n\t\t\t\ttypeof stop?.position === 'number' &&\n\t\t\t\tNumber.isFinite(stop.position),\n\t\t)\n\t\t.map((stop: GradientStop) => ({\n\t\t\tcolor: normalizeHexColor(String(stop.color), DEFAULT_FILL_COLOR),\n\t\t\tposition: Math.max(0, Math.min(100, stop.position)),\n\t\t\topacity:\n\t\t\t\ttypeof stop.opacity === 'number' && Number.isFinite(stop.opacity)\n\t\t\t\t\t? clampUnitInterval(stop.opacity)\n\t\t\t\t\t: undefined,\n\t\t}))\n\t\t.sort((left, right) => left.position - right.position);\n}\n\n/**\n * Converts an OOXML gradient angle to a normalised CSS angle in degrees.\n * The Vue parser already pre-converts to plain degrees; when `alreadyDegrees`\n * is false the input is treated as 60000ths of a degree.\n */\nexport function convertOoxmlAngleToCss(ooxmlAngle: number, alreadyDegrees = true): number {\n\tconst deg = alreadyDegrees ? ooxmlAngle : ooxmlAngle / 60000;\n\treturn ((deg % 360) + 360) % 360;\n}\n\n/**\n * Converts a single gradient stop to a CSS gradient color-stop string,\n * applying opacity via `rgba()` when present.\n */\nexport function toCssGradientStop(stop: SanitizedStop): string {\n\tconst color =\n\t\ttypeof stop.opacity === 'number' ? colorWithOpacity(stop.color, stop.opacity) : stop.color;\n\tconst pos = Math.max(0, Math.min(100, stop.position));\n\tconst posStr = pos === Math.round(pos) ? `${pos}%` : `${pos.toFixed(1)}%`;\n\treturn `${color} ${posStr}`;\n}\n\n/**\n * Computes the gradient center (as percentages) from a fillToRect and an\n * optional focalPoint offset.\n */\nfunction computeGradientCenter(\n\tfillToRect?: ShapeStyle['fillGradientFillToRect'],\n\tfocalPoint?: ShapeStyle['fillGradientFocalPoint'],\n): { cx: number; cy: number } {\n\tif (fillToRect) {\n\t\tconst { l, t, r, b } = fillToRect;\n\t\tlet cx = ((l + (1 - r)) / 2) * 100;\n\t\tlet cy = ((t + (1 - b)) / 2) * 100;\n\t\tif (focalPoint) {\n\t\t\tconst fpX = focalPoint.x * 100;\n\t\t\tconst fpY = focalPoint.y * 100;\n\t\t\tcx = (cx + fpX) / 2;\n\t\t\tcy = (cy + fpY) / 2;\n\t\t}\n\t\treturn { cx, cy };\n\t}\n\tif (focalPoint) {\n\t\treturn { cx: focalPoint.x * 100, cy: focalPoint.y * 100 };\n\t}\n\treturn { cx: 50, cy: 50 };\n}\n\n/** Builds a CSS radial-gradient for `path=\"circle\"` gradients. */\nfunction buildCirclePathGradient(\n\tstops: SanitizedStop[],\n\tfocalPoint?: ShapeStyle['fillGradientFocalPoint'],\n\tfillToRect?: ShapeStyle['fillGradientFillToRect'],\n): string {\n\tconst stopStr = stops.map(toCssGradientStop).join(', ');\n\tconst { cx, cy } = computeGradientCenter(fillToRect, focalPoint);\n\n\tconst posX =\n\t\tMath.round(cx) === 50 && !focalPoint && !fillToRect ? 'center' : `${Math.round(cx)}%`;\n\tconst posY =\n\t\tMath.round(cy) === 50 && !focalPoint && !fillToRect ? 'center' : `${Math.round(cy)}%`;\n\n\tif (fillToRect) {\n\t\tconst radius = Math.max(cx, 100 - cx, cy, 100 - cy);\n\t\treturn `radial-gradient(circle ${Math.round(radius)}% at ${posX} ${posY}, ${stopStr})`;\n\t}\n\treturn `radial-gradient(circle at ${posX} ${posY}, ${stopStr})`;\n}\n\n/** Builds a CSS radial-gradient for `path=\"rect\"` gradients. */\nfunction buildRectPathGradient(\n\tstops: SanitizedStop[],\n\tfocalPoint?: ShapeStyle['fillGradientFocalPoint'],\n\tfillToRect?: ShapeStyle['fillGradientFillToRect'],\n): string {\n\tconst stopStr = stops.map(toCssGradientStop).join(', ');\n\n\tif (fillToRect) {\n\t\tconst { l, t, r, b } = fillToRect;\n\t\tconst { cx, cy } = computeGradientCenter(fillToRect, focalPoint);\n\n\t\tconst semiX = Math.max(cx, 100 - cx);\n\t\tconst semiY = Math.max(cy, 100 - cy);\n\t\tconst posX = `${Math.round(cx)}%`;\n\t\tconst posY = `${Math.round(cy)}%`;\n\n\t\tconst innerHalfW = ((1 - l - r) / 2) * 100;\n\t\tconst innerHalfH = ((1 - t - b) / 2) * 100;\n\n\t\tif (innerHalfW > 0.5 && innerHalfH > 0.5 && Math.abs(semiX - semiY) > 1) {\n\t\t\tconst aspect = innerHalfW / innerHalfH;\n\t\t\tconst adjustedSemiX = Math.round(semiY * aspect);\n\t\t\tconst adjustedSemiY = Math.round(semiY);\n\t\t\treturn `radial-gradient(${adjustedSemiX}% ${adjustedSemiY}% at ${posX} ${posY}, ${stopStr})`;\n\t\t}\n\t\treturn `radial-gradient(${Math.round(semiX)}% ${Math.round(semiY)}% at ${posX} ${posY}, ${stopStr})`;\n\t}\n\n\tconst posX = focalPoint ? `${Math.round(focalPoint.x * 100)}%` : 'center';\n\tconst posY = focalPoint ? `${Math.round(focalPoint.y * 100)}%` : 'center';\n\treturn `radial-gradient(ellipse at ${posX} ${posY}, ${stopStr})`;\n}\n\n/** Builds a CSS gradient approximation for `path=\"shape\"` gradients. */\nfunction buildShapePathGradient(\n\tstops: SanitizedStop[],\n\tfocalPoint?: ShapeStyle['fillGradientFocalPoint'],\n\tfillToRect?: ShapeStyle['fillGradientFillToRect'],\n): string {\n\tconst stopStr = stops.map(toCssGradientStop).join(', ');\n\n\tif (fillToRect) {\n\t\tconst { l, t, r, b } = fillToRect;\n\t\tconst { cx, cy } = computeGradientCenter(fillToRect, focalPoint);\n\n\t\tconst posX = `${Math.round(cx)}%`;\n\t\tconst posY = `${Math.round(cy)}%`;\n\t\tconst semiX = Math.max(cx, 100 - cx);\n\t\tconst semiY = Math.max(cy, 100 - cy);\n\n\t\tconst innerHalfW = ((1 - l - r) / 2) * 100;\n\t\tconst innerHalfH = ((1 - t - b) / 2) * 100;\n\n\t\tif (innerHalfW > 0.5 && innerHalfH > 0.5 && Math.abs(innerHalfW - innerHalfH) > 1) {\n\t\t\tconst aspect = innerHalfW / innerHalfH;\n\t\t\tconst adjustedSemiX = Math.round(Math.max(semiX, semiY * aspect));\n\t\t\tconst adjustedSemiY = Math.round(Math.max(semiY, semiX / aspect));\n\t\t\treturn `radial-gradient(${adjustedSemiX}% ${adjustedSemiY}% at ${posX} ${posY}, ${stopStr})`;\n\t\t}\n\t\tif (semiX > 0.5 || semiY > 0.5) {\n\t\t\treturn `radial-gradient(${Math.round(semiX)}% ${Math.round(semiY)}% at ${posX} ${posY}, ${stopStr})`;\n\t\t}\n\t\treturn `radial-gradient(farthest-side at ${posX} ${posY}, ${stopStr})`;\n\t}\n\n\tconst { cx, cy } = computeGradientCenter(undefined, focalPoint);\n\tconst posX = focalPoint ? `${Math.round(cx)}%` : 'center';\n\tconst posY = focalPoint ? `${Math.round(cy)}%` : 'center';\n\treturn `radial-gradient(farthest-side at ${posX} ${posY}, ${stopStr})`;\n}\n\n/**\n * Converts a structured OOXML gradient on a `ShapeStyle` to a CSS\n * `linear-gradient(...)` / `radial-gradient(...)` string.\n *\n * Falls back to the prebuilt `style.fillGradient` string when no structured\n * stops are present, and returns `undefined` when there is no gradient fill.\n *\n * @param gradient - The shape style carrying gradient configuration.\n * @returns A CSS gradient string, or `undefined`.\n */\nexport function buildGradientCss(gradient: ShapeStyle | undefined): string | undefined {\n\tif (!gradient || gradient.fillMode !== 'gradient') {\n\t\treturn undefined;\n\t}\n\n\tconst stops = sanitizeGradientStops(gradient.fillGradientStops);\n\tif (stops.length === 0) {\n\t\treturn gradient.fillGradient;\n\t}\n\n\tconst gradientType = gradient.fillGradientType || 'linear';\n\tif (gradientType === 'radial') {\n\t\tconst pathType = gradient.fillGradientPathType || 'circle';\n\t\tconst fp = gradient.fillGradientFocalPoint;\n\t\tconst ftr = gradient.fillGradientFillToRect;\n\n\t\tif (pathType === 'rect') {\n\t\t\treturn buildRectPathGradient(stops, fp, ftr);\n\t\t}\n\t\tif (pathType === 'shape') {\n\t\t\treturn buildShapePathGradient(stops, fp, ftr);\n\t\t}\n\t\treturn buildCirclePathGradient(stops, fp, ftr);\n\t}\n\n\tconst normalizedAngle =\n\t\ttypeof gradient.fillGradientAngle === 'number' && Number.isFinite(gradient.fillGradientAngle)\n\t\t\t? gradient.fillGradientAngle\n\t\t\t: 90;\n\treturn `linear-gradient(${Math.round(normalizedAngle)}deg, ${stops\n\t\t.map(toCssGradientStop)\n\t\t.join(', ')})`;\n}\n\n// ---------------------------------------------------------------------------\n// Pattern fills (from React `color-patterns.ts`)\n// ---------------------------------------------------------------------------\n\n/**\n * Generates a tiled inline SVG markup string approximating an OOXML preset\n * pattern (ST_PresetPatternVal). Patterns paint a foreground (`fg`) on a\n * background (`bg`) fill. Returns `null` for unknown presets.\n *\n * Reference: ECMA-376 Part 1, §20.1.10.33.\n */\nexport function getPatternSvg(preset: string, fg: string, bg: string): string | null {\n\tconst s = 8;\n\tconst xmlns = 'http://www.w3.org/2000/svg';\n\tconst svg = (w: number, h: number, inner: string) =>\n\t\t`<svg xmlns=\"${xmlns}\" width=\"${w}\" height=\"${h}\">${inner}</svg>`;\n\tconst rect = (x: number, y: number, w: number, h: number, fill: string) =>\n\t\t`<rect x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${h}\" fill=\"${fill}\"/>`;\n\tconst bgRect = (w: number, h: number) => rect(0, 0, w, h, bg);\n\tconst line = (\n\t\tx1: number,\n\t\ty1: number,\n\t\tx2: number,\n\t\ty2: number,\n\t\tstroke: string,\n\t\tsw: number,\n\t\textra = '',\n\t) =>\n\t\t`<line x1=\"${x1}\" y1=\"${y1}\" x2=\"${x2}\" y2=\"${y2}\" stroke=\"${stroke}\" stroke-width=\"${sw}\"${extra}/>`;\n\tconst circle = (cx: number, cy: number, r: number, fill: string) =>\n\t\t`<circle cx=\"${cx}\" cy=\"${cy}\" r=\"${r}\" fill=\"${fill}\"/>`;\n\n\tswitch (preset) {\n\t\t// ── Percentage fills ──────────────────────────────────────────────\n\t\tcase 'pct5':\n\t\t\treturn svg(s, s, bgRect(s, s) + rect(0, 0, 1, 1, fg));\n\t\tcase 'pct10':\n\t\t\treturn svg(s, s, bgRect(s, s) + rect(0, 0, 1, 1, fg) + rect(4, 4, 1, 1, fg));\n\t\tcase 'pct20':\n\t\t\treturn svg(4, 4, bgRect(4, 4) + rect(0, 0, 1, 1, fg) + rect(2, 2, 1, 1, fg));\n\t\tcase 'pct25':\n\t\t\treturn svg(\n\t\t\t\t4,\n\t\t\t\t4,\n\t\t\t\tbgRect(4, 4) +\n\t\t\t\t\trect(0, 0, 1, 1, fg) +\n\t\t\t\t\trect(2, 0, 1, 1, fg) +\n\t\t\t\t\trect(1, 2, 1, 1, fg) +\n\t\t\t\t\trect(3, 2, 1, 1, fg),\n\t\t\t);\n\t\tcase 'pct30':\n\t\t\treturn svg(\n\t\t\t\t4,\n\t\t\t\t4,\n\t\t\t\tbgRect(4, 4) +\n\t\t\t\t\trect(0, 0, 1, 1, fg) +\n\t\t\t\t\trect(2, 0, 1, 1, fg) +\n\t\t\t\t\trect(1, 1, 1, 1, fg) +\n\t\t\t\t\trect(3, 1, 1, 1, fg) +\n\t\t\t\t\trect(0, 2, 1, 1, fg) +\n\t\t\t\t\trect(2, 2, 1, 1, fg),\n\t\t\t);\n\t\tcase 'pct40':\n\t\t\treturn svg(\n\t\t\t\t4,\n\t\t\t\t4,\n\t\t\t\tbgRect(4, 4) +\n\t\t\t\t\trect(0, 0, 2, 1, fg) +\n\t\t\t\t\trect(1, 1, 1, 1, fg) +\n\t\t\t\t\trect(3, 1, 1, 1, fg) +\n\t\t\t\t\trect(0, 2, 2, 1, fg) +\n\t\t\t\t\trect(1, 3, 1, 1, fg) +\n\t\t\t\t\trect(3, 3, 1, 1, fg),\n\t\t\t);\n\t\tcase 'pct50':\n\t\t\treturn svg(2, 2, bgRect(2, 2) + rect(0, 0, 1, 1, fg) + rect(1, 1, 1, 1, fg));\n\t\tcase 'pct60':\n\t\t\treturn svg(4, 4, rect(0, 0, 4, 4, fg) + rect(0, 0, 2, 1, bg) + rect(1, 2, 2, 1, bg));\n\t\tcase 'pct70':\n\t\t\treturn svg(\n\t\t\t\t4,\n\t\t\t\t4,\n\t\t\t\trect(0, 0, 4, 4, fg) +\n\t\t\t\t\trect(0, 0, 1, 1, bg) +\n\t\t\t\t\trect(2, 0, 1, 1, bg) +\n\t\t\t\t\trect(1, 2, 1, 1, bg) +\n\t\t\t\t\trect(3, 2, 1, 1, bg),\n\t\t\t);\n\t\tcase 'pct75':\n\t\t\treturn svg(4, 4, rect(0, 0, 4, 4, fg) + rect(0, 0, 1, 1, bg) + rect(2, 2, 1, 1, bg));\n\t\tcase 'pct80':\n\t\t\treturn svg(4, 4, rect(0, 0, 4, 4, fg) + rect(0, 0, 1, 1, bg));\n\t\tcase 'pct90':\n\t\t\treturn svg(s, s, rect(0, 0, s, s, fg) + rect(0, 0, 1, 1, bg));\n\n\t\t// ── Horizontal lines ─────────────────────────────────────────────\n\t\tcase 'horz':\n\t\t\treturn svg(s, s, bgRect(s, s) + rect(0, 3, s, 2, fg));\n\t\tcase 'ltHorz':\n\t\t\treturn svg(s, s, bgRect(s, s) + rect(0, 0, s, 1, fg));\n\t\tcase 'dkHorz':\n\t\t\treturn svg(s, s, bgRect(s, s) + rect(0, 0, s, 4, fg));\n\t\tcase 'narHorz':\n\t\t\treturn svg(s, 4, bgRect(s, 4) + rect(0, 0, s, 1, fg) + rect(0, 2, s, 1, fg));\n\t\tcase 'wdHorz':\n\t\t\treturn svg(s, 12, bgRect(s, 12) + rect(0, 0, s, 2, fg));\n\n\t\t// ── Vertical lines ───────────────────────────────────────────────\n\t\tcase 'vert':\n\t\t\treturn svg(s, s, bgRect(s, s) + rect(3, 0, 2, s, fg));\n\t\tcase 'ltVert':\n\t\t\treturn svg(s, s, bgRect(s, s) + rect(0, 0, 1, s, fg));\n\t\tcase 'dkVert':\n\t\t\treturn svg(s, s, bgRect(s, s) + rect(0, 0, 4, s, fg));\n\t\tcase 'narVert':\n\t\t\treturn svg(4, s, bgRect(4, s) + rect(0, 0, 1, s, fg) + rect(2, 0, 1, s, fg));\n\t\tcase 'wdVert':\n\t\t\treturn svg(12, s, bgRect(12, s) + rect(0, 0, 2, s, fg));\n\n\t\t// ── Dash lines ───────────────────────────────────────────────────\n\t\tcase 'dashHorz':\n\t\t\treturn svg(s, 4, bgRect(s, 4) + rect(0, 0, 4, 1, fg));\n\t\tcase 'dashVert':\n\t\t\treturn svg(4, s, bgRect(4, s) + rect(0, 0, 1, 4, fg));\n\n\t\t// ── Cross / grid ─────────────────────────────────────────────────\n\t\tcase 'cross':\n\t\t\treturn svg(s, s, bgRect(s, s) + rect(3, 0, 2, s, fg) + rect(0, 3, s, 2, fg));\n\n\t\t// ── Diagonal lines (down) ────────────────────────────────────────\n\t\tcase 'dnDiag':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbgRect(s, s) +\n\t\t\t\t\tline(0, 0, s, s, fg, 2) +\n\t\t\t\t\tline(-s, 0, 0, s, fg, 2) +\n\t\t\t\t\tline(s, 0, s * 2, s, fg, 2),\n\t\t\t);\n\t\tcase 'ltDnDiag':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbgRect(s, s) +\n\t\t\t\t\tline(0, 0, s, s, fg, 1) +\n\t\t\t\t\tline(-s, 0, 0, s, fg, 1) +\n\t\t\t\t\tline(s, 0, s * 2, s, fg, 1),\n\t\t\t);\n\t\tcase 'dkDnDiag':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbgRect(s, s) +\n\t\t\t\t\tline(0, 0, s, s, fg, 3) +\n\t\t\t\t\tline(-s, 0, 0, s, fg, 3) +\n\t\t\t\t\tline(s, 0, s * 2, s, fg, 3),\n\t\t\t);\n\t\tcase 'wdDnDiag':\n\t\t\treturn svg(\n\t\t\t\t12,\n\t\t\t\t12,\n\t\t\t\tbgRect(12, 12) +\n\t\t\t\t\tline(0, 0, 12, 12, fg, 4) +\n\t\t\t\t\tline(-12, 0, 0, 12, fg, 4) +\n\t\t\t\t\tline(12, 0, 24, 12, fg, 4),\n\t\t\t);\n\t\tcase 'dashDnDiag':\n\t\t\treturn svg(s, s, bgRect(s, s) + line(0, 0, s, s, fg, 1, ' stroke-dasharray=\"4,4\"'));\n\n\t\t// ── Diagonal lines (up) ──────────────────────────────────────────\n\t\tcase 'upDiag':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbgRect(s, s) +\n\t\t\t\t\tline(0, s, s, 0, fg, 2) +\n\t\t\t\t\tline(-s, s, 0, 0, fg, 2) +\n\t\t\t\t\tline(s, s, s * 2, 0, fg, 2),\n\t\t\t);\n\t\tcase 'ltUpDiag':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbgRect(s, s) +\n\t\t\t\t\tline(0, s, s, 0, fg, 1) +\n\t\t\t\t\tline(-s, s, 0, 0, fg, 1) +\n\t\t\t\t\tline(s, s, s * 2, 0, fg, 1),\n\t\t\t);\n\t\tcase 'dkUpDiag':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbgRect(s, s) +\n\t\t\t\t\tline(0, s, s, 0, fg, 3) +\n\t\t\t\t\tline(-s, s, 0, 0, fg, 3) +\n\t\t\t\t\tline(s, s, s * 2, 0, fg, 3),\n\t\t\t);\n\t\tcase 'wdUpDiag':\n\t\t\treturn svg(\n\t\t\t\t12,\n\t\t\t\t12,\n\t\t\t\tbgRect(12, 12) +\n\t\t\t\t\tline(0, 12, 12, 0, fg, 4) +\n\t\t\t\t\tline(-12, 12, 0, 0, fg, 4) +\n\t\t\t\t\tline(12, 12, 24, 0, fg, 4),\n\t\t\t);\n\t\tcase 'dashUpDiag':\n\t\t\treturn svg(s, s, bgRect(s, s) + line(0, s, s, 0, fg, 1, ' stroke-dasharray=\"4,4\"'));\n\n\t\t// ── Diagonal cross ───────────────────────────────────────────────\n\t\tcase 'diagCross':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbgRect(s, s) +\n\t\t\t\t\tline(0, 0, s, s, fg, 1) +\n\t\t\t\t\tline(-s, 0, 0, s, fg, 1) +\n\t\t\t\t\tline(s, 0, s * 2, s, fg, 1) +\n\t\t\t\t\tline(0, s, s, 0, fg, 1) +\n\t\t\t\t\tline(-s, s, 0, 0, fg, 1) +\n\t\t\t\t\tline(s, s, s * 2, 0, fg, 1),\n\t\t\t);\n\n\t\t// ── Checkerboard ─────────────────────────────────────────────────\n\t\tcase 'smCheck':\n\t\t\treturn svg(4, 4, bgRect(4, 4) + rect(0, 0, 2, 2, fg) + rect(2, 2, 2, 2, fg));\n\t\tcase 'lgCheck':\n\t\t\treturn svg(s, s, bgRect(s, s) + rect(0, 0, 4, 4, fg) + rect(4, 4, 4, 4, fg));\n\n\t\t// ── Grids ────────────────────────────────────────────────────────\n\t\tcase 'smGrid':\n\t\t\treturn svg(s, s, bgRect(s, s) + rect(0, 0, s, 1, fg) + rect(0, 0, 1, s, fg));\n\t\tcase 'lgGrid':\n\t\t\treturn svg(16, 16, bgRect(16, 16) + rect(0, 0, 16, 1, fg) + rect(0, 0, 1, 16, fg));\n\t\tcase 'dotGrid':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbgRect(s, s) +\n\t\t\t\t\tcircle(0, 0, 0.5, fg) +\n\t\t\t\t\tcircle(4, 0, 0.5, fg) +\n\t\t\t\t\tcircle(0, 4, 0.5, fg) +\n\t\t\t\t\tcircle(4, 4, 0.5, fg) +\n\t\t\t\t\trect(0, 0, s, 0.5, fg) +\n\t\t\t\t\trect(0, 0, 0.5, s, fg),\n\t\t\t);\n\n\t\t// ── Confetti ─────────────────────────────────────────────────────\n\t\tcase 'smConfetti':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbgRect(s, s) +\n\t\t\t\t\trect(1, 0, 1, 1, fg) +\n\t\t\t\t\trect(5, 1, 1, 1, fg) +\n\t\t\t\t\trect(3, 3, 1, 1, fg) +\n\t\t\t\t\trect(7, 2, 1, 1, fg) +\n\t\t\t\t\trect(0, 5, 1, 1, fg) +\n\t\t\t\t\trect(4, 6, 1, 1, fg) +\n\t\t\t\t\trect(2, 7, 1, 1, fg) +\n\t\t\t\t\trect(6, 5, 1, 1, fg),\n\t\t\t);\n\t\tcase 'lgConfetti':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbgRect(s, s) +\n\t\t\t\t\trect(0, 0, 2, 2, fg) +\n\t\t\t\t\trect(5, 1, 2, 2, fg) +\n\t\t\t\t\trect(2, 4, 2, 2, fg) +\n\t\t\t\t\trect(6, 5, 2, 2, fg),\n\t\t\t);\n\n\t\t// ── Brick ────────────────────────────────────────────────────────\n\t\tcase 'horzBrick':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbgRect(s, s) +\n\t\t\t\t\trect(0, 0, s, 1, fg) +\n\t\t\t\t\trect(0, 0, 1, 4, fg) +\n\t\t\t\t\trect(0, 4, s, 1, fg) +\n\t\t\t\t\trect(4, 4, 1, 4, fg),\n\t\t\t);\n\t\tcase 'diagBrick':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbgRect(s, s) + line(0, 4, 4, 0, fg, 1) + line(4, s, s, 4, fg, 1) + line(0, s, s, 0, fg, 1),\n\t\t\t);\n\n\t\t// ── Diamond ──────────────────────────────────────────────────────\n\t\tcase 'solidDmnd':\n\t\t\treturn svg(s, s, `${bgRect(s, s)}<polygon points=\"4,0 8,4 4,8 0,4\" fill=\"${fg}\"/>`);\n\t\tcase 'openDmnd':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbgRect(s, s) +\n\t\t\t\t\tline(4, 0, s, 4, fg, 1) +\n\t\t\t\t\tline(s, 4, 4, s, fg, 1) +\n\t\t\t\t\tline(4, s, 0, 4, fg, 1) +\n\t\t\t\t\tline(0, 4, 4, 0, fg, 1),\n\t\t\t);\n\t\tcase 'dotDmnd':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbgRect(s, s) +\n\t\t\t\t\tcircle(4, 0, 0.75, fg) +\n\t\t\t\t\tcircle(s, 4, 0.75, fg) +\n\t\t\t\t\tcircle(4, s, 0.75, fg) +\n\t\t\t\t\tcircle(0, 4, 0.75, fg) +\n\t\t\t\t\tcircle(4, 4, 0.75, fg),\n\t\t\t);\n\n\t\t// ── Plaid ────────────────────────────────────────────────────────\n\t\tcase 'plaid':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbgRect(s, s) +\n\t\t\t\t\trect(0, 0, 4, 4, fg) +\n\t\t\t\t\trect(0, 0, s, 1, fg) +\n\t\t\t\t\trect(0, 2, s, 1, fg) +\n\t\t\t\t\trect(0, 0, 1, s, fg) +\n\t\t\t\t\trect(2, 0, 1, s, fg),\n\t\t\t);\n\n\t\t// ── Sphere ───────────────────────────────────────────────────────\n\t\tcase 'sphere': {\n\t\t\tconst defs = `<defs><radialGradient id=\"sph\" cx=\"35%\" cy=\"35%\" r=\"60%\"><stop offset=\"0%\" stop-color=\"${bg}\" stop-opacity=\"0.8\"/><stop offset=\"100%\" stop-color=\"${fg}\" stop-opacity=\"1\"/></radialGradient></defs>`;\n\t\t\treturn svg(s, s, `${bgRect(s, s)}${defs}<circle cx=\"4\" cy=\"4\" r=\"3.5\" fill=\"url(#sph)\"/>`);\n\t\t}\n\n\t\t// ── Weave ────────────────────────────────────────────────────────\n\t\tcase 'weave':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbgRect(s, s) +\n\t\t\t\t\tline(0, 0, 4, 4, fg, 1.5) +\n\t\t\t\t\tline(4, 4, 0, s, fg, 1.5) +\n\t\t\t\t\tline(s, 0, 4, 4, fg, 1.5) +\n\t\t\t\t\tline(4, 4, s, s, fg, 1.5) +\n\t\t\t\t\tline(4, 0, s, 4, fg, 1.5) +\n\t\t\t\t\tline(0, 4, 4, s, fg, 1.5),\n\t\t\t);\n\n\t\t// ── Divot ────────────────────────────────────────────────────────\n\t\tcase 'divot':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbgRect(s, s) +\n\t\t\t\t\tline(2, 1, 2, 3, fg, 1) +\n\t\t\t\t\tline(1, 2, 3, 2, fg, 1) +\n\t\t\t\t\tline(6, 5, 6, 7, fg, 1) +\n\t\t\t\t\tline(5, 6, 7, 6, fg, 1),\n\t\t\t);\n\n\t\t// ── Shingle ──────────────────────────────────────────────────────\n\t\tcase 'shingle':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbgRect(s, s) + line(0, 0, s, s, fg, 1) + line(0, s, 4, 4, fg, 1) + rect(0, 7, s, 1, fg),\n\t\t\t);\n\n\t\t// ── Wave ─────────────────────────────────────────────────────────\n\t\tcase 'wave':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\t`${bgRect(s, s)}<path d=\"M0,2 Q2,0 4,2 Q6,4 8,2\" stroke=\"${fg}\" stroke-width=\"1\" fill=\"none\"/><path d=\"M0,6 Q2,4 4,6 Q6,8 8,6\" stroke=\"${fg}\" stroke-width=\"1\" fill=\"none\"/>`,\n\t\t\t);\n\n\t\t// ── Trellis ──────────────────────────────────────────────────────\n\t\tcase 'trellis':\n\t\t\treturn svg(\n\t\t\t\t4,\n\t\t\t\t4,\n\t\t\t\tbgRect(4, 4) +\n\t\t\t\t\trect(0, 0, 4, 1, fg) +\n\t\t\t\t\trect(0, 2, 4, 1, fg) +\n\t\t\t\t\trect(0, 0, 1, 4, fg) +\n\t\t\t\t\trect(2, 0, 1, 4, fg),\n\t\t\t);\n\n\t\t// ── ZigZag ───────────────────────────────────────────────────────\n\t\tcase 'zigZag':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\t`${bgRect(s, s)}<path d=\"M0,4 L2,0 L4,4 L6,0 L8,4\" stroke=\"${fg}\" stroke-width=\"1\" fill=\"none\"/><path d=\"M0,8 L2,4 L4,8 L6,4 L8,8\" stroke=\"${fg}\" stroke-width=\"1\" fill=\"none\"/>`,\n\t\t\t);\n\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\n/** Result of {@link buildPatternFill}. */\nexport interface PatternFillResult {\n\t/** CSS `background-image` value (inline SVG data-URI). */\n\tbackgroundImage?: string;\n\t/** Resolved pattern background colour (hex), used as the CSS `backgroundColor`. */\n\tbackgroundColor?: string;\n\t/**\n\t * Optional SVG `<defs>`/filter markup that a renderer can inject into a\n\t * shared `<svg>` element. Self-contained data-URI patterns do not need\n\t * this, so it is `undefined` for every current preset; it exists as the\n\t * extension hook for presets that cannot be expressed as a tiled data-URI.\n\t */\n\tsvgFilter?: { id: string; markup: string };\n}\n\n/**\n * Converts an OOXML preset pattern fill (`a:pattFill` — foreground/background\n * colour plus a preset such as `pct50`, `ltHorz`, `cross`, …) to a CSS\n * background built from an inline SVG data-URI.\n *\n * Mirrors React `buildPatternFillCss`, but accepts a `ShapeStyle` plus the\n * owning element id so future filter-based presets can emit a uniquely-named\n * `svgFilter`. Returns `undefined` when the style is not a pattern fill or the\n * preset is unknown.\n *\n * @param pattern - The shape style carrying pattern configuration.\n * @param elementId - The owning element id (namespaces any emitted filter id).\n */\nexport function buildPatternFill(\n\tpattern: ShapeStyle | undefined,\n\telementId: string,\n): PatternFillResult | undefined {\n\tif (!pattern || pattern.fillMode !== 'pattern' || !pattern.fillPatternPreset) {\n\t\treturn undefined;\n\t}\n\n\tconst fg = normalizeHexColor(pattern.fillColor, '#000000');\n\tconst bg = normalizeHexColor(pattern.fillPatternBackgroundColor, '#ffffff');\n\tconst preset = pattern.fillPatternPreset;\n\n\tconst svgPattern = getPatternSvg(preset, fg, bg);\n\tif (!svgPattern) {\n\t\treturn undefined;\n\t}\n\n\tconst encoded = encodeURIComponent(svgPattern);\n\t// `elementId` is reserved for namespacing future filter-based presets; the\n\t// current presets are fully self-contained data-URIs so no defs are emitted.\n\tvoid elementId;\n\treturn {\n\t\tbackgroundImage: `url(\"data:image/svg+xml,${encoded}\")`,\n\t\tbackgroundColor: bg,\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// Aggregate fill resolver\n// ---------------------------------------------------------------------------\n\n/** Result of {@link getComputedFillStyle}. */\nexport interface ComputedFillStyle {\n\tbackgroundColor?: string;\n\tbackgroundImage?: string;\n\tbackgroundSize?: string;\n\tbackgroundRepeat?: string;\n\t/** Carried through for renderers that need to inject pattern defs. */\n\tsvgFilter?: { id: string; markup: string };\n}\n\n/**\n * Aggregate fill resolver. Resolves the element's fill in the exact order the\n * React `getShapeVisualStyle` uses:\n *\n * 1. image fill (`fillMode === \"image\"` + `fillImageUrl`)\n * 2. gradient (structured `fillGradientStops`, falling back to the\n * prebuilt `fillGradient` string)\n * 3. pattern (`fillMode === \"pattern\"` + preset)\n * 4. solid (`fillColor`, unless `fillMode === \"none\"`)\n *\n * Returns `undefined` when the element carries no shape styling, and an\n * empty-ish object when no fill applies (so callers can spread the result\n * safely).\n *\n * @param element - The PPTX element to resolve a fill for.\n */\nexport function getComputedFillStyle(element: PptxElement): ComputedFillStyle | undefined {\n\tif (!hasShapeProperties(element)) {\n\t\treturn undefined;\n\t}\n\tconst ss = element.shapeStyle;\n\tif (!ss) {\n\t\treturn {};\n\t}\n\n\t// 1. Image fill — highest priority.\n\tconst imageFillUrl = ss.fillMode === 'image' && ss.fillImageUrl ? ss.fillImageUrl : undefined;\n\tif (imageFillUrl) {\n\t\tconst tile = ss.fillImageMode === 'tile';\n\t\treturn {\n\t\t\tbackgroundColor: 'transparent',\n\t\t\tbackgroundImage: `url(${imageFillUrl})`,\n\t\t\tbackgroundRepeat: tile ? 'repeat' : 'no-repeat',\n\t\t\tbackgroundSize: tile ? 'auto' : '100% 100%',\n\t\t};\n\t}\n\n\t// 2. Gradient (structured, with prebuilt-string fallback).\n\tconst gradient =\n\t\tbuildGradientCss(ss) ?? (ss.fillMode === 'gradient' ? ss.fillGradient : undefined);\n\tif (gradient) {\n\t\treturn { backgroundImage: gradient };\n\t}\n\n\t// 3. Pattern fill.\n\tconst pattern = buildPatternFill(ss, element.id);\n\tif (pattern) {\n\t\treturn {\n\t\t\tbackgroundColor: pattern.backgroundColor,\n\t\t\tbackgroundImage: pattern.backgroundImage,\n\t\t\tbackgroundRepeat: 'repeat',\n\t\t\tbackgroundSize: 'auto',\n\t\t\tsvgFilter: pattern.svgFilter,\n\t\t};\n\t}\n\n\t// 4. Solid fill.\n\tif (ss.fillColor && ss.fillColor !== 'transparent' && ss.fillMode !== 'none') {\n\t\treturn { backgroundColor: colorWithOpacity(ss.fillColor, ss.fillOpacity) };\n\t}\n\n\treturn {};\n}\n","/**\n * Visual effects composable — pure CSS computation for OOXML shape/image effects.\n *\n * Mirrors the React `pptx-viewer` effect layer (shape-visual-style.ts +\n * color-core.ts + effect-dag-filters.ts) without any React/Vue runtime\n * dependency. Everything here is a pure function so it can be unit-tested\n * without mounting a component, then wired into `element-style.ts` /\n * `ElementRenderer.vue` by the integrator.\n *\n * It covers, for shapes/connectors/images:\n * - **Outer shadow** → CSS `box-shadow`\n * - **Inner shadow** → CSS `inset` `box-shadow`\n * - **Multi-layer shadow** → comma-joined `box-shadow` (from `shadows[]`)\n * - **Outer glow** → CSS `filter: drop-shadow(...)` (simple path) and\n * optional layered `box-shadow` (high-fidelity path)\n * - **Soft edges / blur** → CSS `filter: blur(...)`\n * - **Reflection** → Chromium `-webkit-box-reflect`\n * - **Effect DAG** → CSS `filter` (grayscale/biLevel/lum/hsl/tint…),\n * `opacity`, `mix-blend-mode`, + optional duotone\n * `<filter>` SVG markup (high-fidelity path)\n *\n * Units/precedence match the React implementation: spatial values are already\n * in px on `ShapeStyle` (pre-converted from EMU by core), angles are degrees,\n * alpha is 0–1. The EMU constants are re-exported from core for callers that\n * need to convert raw values themselves.\n *\n * @module viewer/composables/visual-effects\n */\n\nimport type { PptxElement, ShapeStyle } from 'pptx-viewer-core';\nimport { isImageLikeElement } from 'pptx-viewer-core';\n\n// ── Low-level colour helpers (ported from React color-core.ts) ─────────────\n\nconst DEFAULT_SHADOW_COLOR = '#000000';\nconst DEFAULT_GLOW_COLOR = '#ffff00';\n\n/** Clamp a numeric value to the [0, 1] range. */\nfunction clampUnitInterval(value: number): number {\n\treturn Math.min(1, Math.max(0, value));\n}\n\n/**\n * Normalize an arbitrary colour string to a 6-digit hex value (`#RRGGBB`).\n * Returns `fallback` when the input is missing, \"transparent\", or invalid.\n */\nfunction normalizeHexColor(value: string | undefined, fallback: string): string {\n\tif (!value || value === 'transparent') {\n\t\treturn fallback;\n\t}\n\tconst candidate = value.startsWith('#') ? value : `#${value}`;\n\treturn /^#[0-9A-Fa-f]{6}$/u.test(candidate) ? candidate : fallback;\n}\n\n/** Parse a 6-digit hex colour into 0–255 R/G/B channels, or `null` if invalid. */\nfunction hexToRgbChannels(color: string): { r: number; g: number; b: number } | null {\n\tconst normalized = color.replace('#', '');\n\tif (!/^[0-9a-fA-F]{6}$/u.test(normalized)) {\n\t\treturn null;\n\t}\n\treturn {\n\t\tr: Number.parseInt(normalized.slice(0, 2), 16),\n\t\tg: Number.parseInt(normalized.slice(2, 4), 16),\n\t\tb: Number.parseInt(normalized.slice(4, 6), 16),\n\t};\n}\n\n/**\n * Convert a hex colour to an `rgba()` string with the given opacity. When\n * `opacity` is `undefined` the original colour is returned unchanged.\n */\nfunction colorWithOpacity(color: string, opacity: number | undefined): string {\n\tif (opacity === undefined) {\n\t\treturn color;\n\t}\n\tconst rgb = hexToRgbChannels(color);\n\tif (!rgb) {\n\t\treturn color;\n\t}\n\treturn `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${clampUnitInterval(opacity)})`;\n}\n\n// ── Outer / inner / multi-layer shadow (box-shadow) ────────────────────────\n\n/**\n * Build a CSS `box-shadow` value from the single outer-shadow properties on a\n * {@link ShapeStyle}. Supports both angle/distance and direct x/y offset modes.\n * Returns `undefined` when no shadow colour is defined.\n */\nexport function getOuterShadowCss(style: ShapeStyle | undefined): string | undefined {\n\tif (!style?.shadowColor || style.shadowColor === 'transparent') {\n\t\treturn undefined;\n\t}\n\n\tlet offsetX: number;\n\tlet offsetY: number;\n\tif (typeof style.shadowAngle === 'number' && typeof style.shadowDistance === 'number') {\n\t\tconst angleRad = (style.shadowAngle * Math.PI) / 180;\n\t\toffsetX = Math.cos(angleRad) * style.shadowDistance;\n\t\toffsetY = Math.sin(angleRad) * style.shadowDistance;\n\t} else {\n\t\toffsetX =\n\t\t\ttypeof style.shadowOffsetX === 'number' && Number.isFinite(style.shadowOffsetX)\n\t\t\t\t? style.shadowOffsetX\n\t\t\t\t: 4;\n\t\toffsetY =\n\t\t\ttypeof style.shadowOffsetY === 'number' && Number.isFinite(style.shadowOffsetY)\n\t\t\t\t? style.shadowOffsetY\n\t\t\t\t: 4;\n\t}\n\n\tconst blur =\n\t\ttypeof style.shadowBlur === 'number' && Number.isFinite(style.shadowBlur)\n\t\t\t? Math.max(0, style.shadowBlur)\n\t\t\t: 6;\n\tconst opacity =\n\t\ttypeof style.shadowOpacity === 'number' && Number.isFinite(style.shadowOpacity)\n\t\t\t? clampUnitInterval(style.shadowOpacity)\n\t\t\t: 0.35;\n\n\treturn `${Math.round(offsetX)}px ${Math.round(offsetY)}px ${Math.round(blur)}px ${colorWithOpacity(\n\t\tnormalizeHexColor(style.shadowColor, DEFAULT_SHADOW_COLOR),\n\t\topacity,\n\t)}`;\n}\n\n/**\n * Build a CSS `inset` `box-shadow` value from the inner-shadow properties on a\n * {@link ShapeStyle}. Returns `undefined` when no inner-shadow colour is set.\n */\nexport function getInnerShadowCss(style: ShapeStyle | undefined): string | undefined {\n\tif (!style?.innerShadowColor || style.innerShadowColor === 'transparent') {\n\t\treturn undefined;\n\t}\n\tconst offsetX =\n\t\ttypeof style.innerShadowOffsetX === 'number' && Number.isFinite(style.innerShadowOffsetX)\n\t\t\t? style.innerShadowOffsetX\n\t\t\t: 0;\n\tconst offsetY =\n\t\ttypeof style.innerShadowOffsetY === 'number' && Number.isFinite(style.innerShadowOffsetY)\n\t\t\t? style.innerShadowOffsetY\n\t\t\t: 0;\n\tconst blur =\n\t\ttypeof style.innerShadowBlur === 'number' && Number.isFinite(style.innerShadowBlur)\n\t\t\t? Math.max(0, style.innerShadowBlur)\n\t\t\t: 6;\n\tconst opacity =\n\t\ttypeof style.innerShadowOpacity === 'number' && Number.isFinite(style.innerShadowOpacity)\n\t\t\t? clampUnitInterval(style.innerShadowOpacity)\n\t\t\t: 0.5;\n\n\treturn `inset ${Math.round(offsetX)}px ${Math.round(offsetY)}px ${Math.round(blur)}px ${colorWithOpacity(\n\t\tnormalizeHexColor(style.innerShadowColor, DEFAULT_SHADOW_COLOR),\n\t\topacity,\n\t)}`;\n}\n\n/**\n * Build a comma-joined CSS `box-shadow` string for all layers in the `shadows`\n * array (PowerPoint compound outer shadows). Returns `undefined` when empty.\n */\nexport function getMultiLayerShadowCss(style: ShapeStyle | undefined): string | undefined {\n\tif (!style?.shadows || style.shadows.length === 0) {\n\t\treturn undefined;\n\t}\n\tconst parts: string[] = [];\n\tfor (const shadow of style.shadows) {\n\t\tif (!shadow.color || shadow.color === 'transparent') {\n\t\t\tcontinue;\n\t\t}\n\t\tconst angleRad = ((shadow.angle ?? 0) * Math.PI) / 180;\n\t\tconst dist = shadow.distance ?? 0;\n\t\tconst offsetX = Math.round(Math.cos(angleRad) * dist);\n\t\tconst offsetY = Math.round(Math.sin(angleRad) * dist);\n\t\tconst blur = Math.round(Math.max(0, shadow.blur ?? 6));\n\t\tconst opacity = clampUnitInterval(shadow.opacity ?? 0.35);\n\t\tconst color = colorWithOpacity(normalizeHexColor(shadow.color, DEFAULT_SHADOW_COLOR), opacity);\n\t\tparts.push(`${offsetX}px ${offsetY}px ${blur}px ${color}`);\n\t}\n\treturn parts.length > 0 ? parts.join(', ') : undefined;\n}\n\n/**\n * Build a high-fidelity layered `box-shadow` for a glow effect (3 concentric\n * shadows at increasing radius / decreasing opacity). This supplements the\n * filter-based glow from {@link getEffectFilterCss}. Returns `undefined` when\n * no glow is configured.\n */\nexport function getGlowBoxShadowCss(\n\tcolor: string | undefined,\n\tradius: number | undefined,\n\topacity: number | undefined,\n): string | undefined {\n\tif (!color || color === 'transparent' || !radius || radius <= 0) {\n\t\treturn undefined;\n\t}\n\tconst baseOpacity = typeof opacity === 'number' ? clampUnitInterval(opacity) : 0.75;\n\tconst normalizedColor = normalizeHexColor(color, DEFAULT_GLOW_COLOR);\n\n\tconst r1 = Math.round(radius * 0.33);\n\tconst c1 = colorWithOpacity(normalizedColor, baseOpacity);\n\tconst r2 = Math.round(radius * 0.66);\n\tconst c2 = colorWithOpacity(normalizedColor, baseOpacity * 0.6);\n\tconst r3 = Math.round(radius);\n\tconst c3 = colorWithOpacity(normalizedColor, baseOpacity * 0.3);\n\n\treturn `0 0 ${r1}px ${c1}, 0 0 ${r2}px ${c2}, 0 0 ${r3}px ${c3}`;\n}\n\n/**\n * Combine outer-shadow, multi-layer shadow, inner-shadow and (optionally) the\n * layered glow into a single CSS `box-shadow` value, with the same precedence\n * as the React `getShapeVisualStyle`:\n * multi-layer (if any) **else** single outer-shadow, then inner-shadow,\n * then layered glow.\n *\n * @returns A `box-shadow` value string, or `undefined` if nothing applies.\n */\nexport function getBoxShadowCss(\n\tstyle: ShapeStyle | undefined,\n\toptions: { includeGlow?: boolean } = {},\n): string | undefined {\n\tif (!style) {\n\t\treturn undefined;\n\t}\n\tconst parts: string[] = [];\n\n\tconst multiLayer = getMultiLayerShadowCss(style);\n\tif (multiLayer) {\n\t\tparts.push(multiLayer);\n\t} else {\n\t\tconst outer = getOuterShadowCss(style);\n\t\tif (outer) {\n\t\t\tparts.push(outer);\n\t\t}\n\t}\n\n\tconst inner = getInnerShadowCss(style);\n\tif (inner) {\n\t\tparts.push(inner);\n\t}\n\n\tif (options.includeGlow !== false) {\n\t\tconst glow = getGlowBoxShadowCss(style.glowColor, style.glowRadius, style.glowOpacity);\n\t\tif (glow) {\n\t\t\tparts.push(glow);\n\t\t}\n\t}\n\n\treturn parts.length > 0 ? parts.join(', ') : undefined;\n}\n\n// ── Glow / soft-edge / blur / DAG (CSS filter) ─────────────────────────────\n\n/**\n * Map effect-DAG properties on a {@link ShapeStyle} to CSS `filter` functions.\n * Ported verbatim from the React `getEffectDagCssFilter`. Returns `undefined`\n * when no DAG filters apply.\n *\n * @param style - The shape style carrying the `dag*` fields.\n * @param elementId - Element ID, used only for the duotone `url(#…)` reference.\n */\nexport function getEffectDagCssFilter(\n\tstyle: ShapeStyle | undefined,\n\telementId?: string,\n): string | undefined {\n\tif (!style) {\n\t\treturn undefined;\n\t}\n\tconst filters: string[] = [];\n\n\tif (style.dagGrayscale) {\n\t\tfilters.push('grayscale(1)');\n\t}\n\n\tif (typeof style.dagBiLevel === 'number') {\n\t\tconst thresh = Math.max(0, Math.min(100, style.dagBiLevel));\n\t\tfilters.push(thresh > 50 ? 'contrast(1000)' : 'contrast(0.01)');\n\t}\n\n\tif (typeof style.dagLumBrightness === 'number' || typeof style.dagLumContrast === 'number') {\n\t\tconst bright = style.dagLumBrightness ?? 0;\n\t\tconst contrast = style.dagLumContrast ?? 0;\n\t\tif (bright !== 0) {\n\t\t\tfilters.push(`brightness(${1 + bright / 100})`);\n\t\t}\n\t\tif (contrast !== 0) {\n\t\t\tfilters.push(`contrast(${1 + contrast / 100})`);\n\t\t}\n\t}\n\n\tif (typeof style.dagHslHue === 'number' && style.dagHslHue !== 0) {\n\t\tfilters.push(`hue-rotate(${style.dagHslHue}deg)`);\n\t}\n\tif (typeof style.dagHslSaturation === 'number' && style.dagHslSaturation !== 100) {\n\t\tfilters.push(`saturate(${style.dagHslSaturation / 100})`);\n\t}\n\tif (typeof style.dagHslLuminance === 'number' && style.dagHslLuminance !== 0) {\n\t\tfilters.push(`brightness(${1 + style.dagHslLuminance / 100})`);\n\t}\n\n\tif (typeof style.dagAlphaModFix === 'number') {\n\t\tconst alpha = clampUnitInterval(style.dagAlphaModFix / 100);\n\t\tfilters.push(`opacity(${alpha})`);\n\t}\n\n\tif (typeof style.dagTintHue === 'number' || typeof style.dagTintAmount === 'number') {\n\t\tconst hue = style.dagTintHue ?? 0;\n\t\tconst amt = Math.max(0, Math.min(100, style.dagTintAmount ?? 50));\n\t\tfilters.push(`sepia(${amt / 100}) hue-rotate(${hue}deg)`);\n\t}\n\n\tif (style.dagDuotone && elementId) {\n\t\tfilters.push(`url(#${getDuotoneFilterId(elementId)})`);\n\t}\n\n\treturn filters.length > 0 ? filters.join(' ') : undefined;\n}\n\n/**\n * Build the CSS `filter` value for the \"simple\" effect path of a shape/image\n * {@link ShapeStyle}: outer glow (`drop-shadow`), soft edges (`blur`),\n * standalone blur (`blur`), and effect-DAG adjustments.\n *\n * Mirrors the `filterParts` assembly in the React `getShapeVisualStyle`.\n * Returns `undefined` when no filter applies.\n *\n * @param style - The shape style.\n * @param elementId - Element ID, forwarded to the DAG duotone reference.\n */\nexport function getEffectFilterCss(\n\tstyle: ShapeStyle | undefined,\n\telementId?: string,\n): string | undefined {\n\tif (!style) {\n\t\treturn undefined;\n\t}\n\tconst parts: string[] = [];\n\n\t// Outer glow → drop-shadow\n\tif (style.glowColor && style.glowColor !== 'transparent' && style.glowRadius) {\n\t\tconst glowOpacity = typeof style.glowOpacity === 'number' ? style.glowOpacity : 0.75;\n\t\tconst glowRad = Math.round(Math.max(0, style.glowRadius));\n\t\tconst glowCol = colorWithOpacity(\n\t\t\tnormalizeHexColor(style.glowColor, DEFAULT_GLOW_COLOR),\n\t\t\tglowOpacity,\n\t\t);\n\t\tparts.push(`drop-shadow(0 0 ${glowRad}px ${glowCol})`);\n\t}\n\n\t// Soft edges → blur\n\tif (typeof style.softEdgeRadius === 'number' && style.softEdgeRadius > 0) {\n\t\tparts.push(`blur(${Math.round(style.softEdgeRadius)}px)`);\n\t}\n\n\t// Standalone blur effect (a:blur)\n\tif (typeof style.blurRadius === 'number' && style.blurRadius > 0) {\n\t\tparts.push(`blur(${Math.round(style.blurRadius)}px)`);\n\t}\n\n\t// Effect-DAG image adjustments\n\tconst dagFilter = getEffectDagCssFilter(style, elementId);\n\tif (dagFilter) {\n\t\tparts.push(dagFilter);\n\t}\n\n\treturn parts.length > 0 ? parts.join(' ') : undefined;\n}\n\n// ── Reflection (-webkit-box-reflect) ───────────────────────────────────────\n\n/**\n * Result of {@link getReflectionCss}: the `-webkit-box-reflect` value plus the\n * raw inputs (useful for tests / alternative renderers).\n *\n * Note: `-webkit-box-reflect` is Chromium/WebKit only — Firefox does not\n * support it. The React viewer accepts this limitation; a pseudo-element\n * fallback would be needed for full cross-browser fidelity.\n */\nexport interface ReflectionCss {\n\t/** The `-webkit-box-reflect` CSS value. */\n\twebkitBoxReflect: string;\n\tdistance: number;\n\tstartOpacity: number;\n\tendOpacity: number;\n\tfadeLength: number;\n\tblurRadius: number;\n}\n\n/**\n * Build the `-webkit-box-reflect` value for a reflection effect. `fadeLength`\n * is in px (the React caller derives it from `reflectionEndPosition × height`).\n */\nexport function buildReflectionCssValue(\n\tdistance: number,\n\tstartOpacity: number,\n\tendOpacity: number,\n\tfadeLength: number,\n\tblurRadius = 0,\n): string {\n\tconst effectiveFadeLength = fadeLength + blurRadius * 2;\n\tconst midOpacity = (startOpacity + endOpacity) / 2;\n\tconst midPoint = Math.round(effectiveFadeLength * 0.5);\n\n\tif (blurRadius > 0) {\n\t\treturn (\n\t\t\t`below ${Math.round(distance)}px linear-gradient(to bottom, ` +\n\t\t\t`rgba(255,255,255,${startOpacity}), ` +\n\t\t\t`rgba(255,255,255,${midOpacity}) ${midPoint}px, ` +\n\t\t\t`rgba(255,255,255,${endOpacity}) ${effectiveFadeLength}px)`\n\t\t);\n\t}\n\n\treturn `below ${Math.round(distance)}px linear-gradient(to bottom, rgba(255,255,255,${startOpacity}), rgba(255,255,255,${endOpacity}) ${fadeLength}px)`;\n}\n\n/**\n * Compute the reflection CSS for a {@link ShapeStyle} given the element height\n * (needed to convert `reflectionEndPosition` fraction → px fade length).\n * Mirrors the reflection block in the React `getShapeVisualStyle`.\n *\n * @returns A {@link ReflectionCss}, or `undefined` when no reflection applies.\n */\nexport function getReflectionCss(\n\tstyle: ShapeStyle | undefined,\n\telementHeight: number,\n): ReflectionCss | undefined {\n\tif (!style) {\n\t\treturn undefined;\n\t}\n\tconst hasReflection =\n\t\t(typeof style.reflectionStartOpacity === 'number' && style.reflectionStartOpacity > 0) ||\n\t\t(typeof style.reflectionDistance === 'number' && style.reflectionDistance > 0) ||\n\t\t(typeof style.reflectionBlurRadius === 'number' && style.reflectionBlurRadius > 0);\n\tif (!hasReflection) {\n\t\treturn undefined;\n\t}\n\n\tconst distance = style.reflectionDistance ?? 0;\n\tconst startOpacity =\n\t\ttypeof style.reflectionStartOpacity === 'number' ? style.reflectionStartOpacity : 0.5;\n\tconst endOpacity =\n\t\ttypeof style.reflectionEndOpacity === 'number' ? style.reflectionEndOpacity : 0;\n\tconst fadeLength =\n\t\ttypeof style.reflectionEndPosition === 'number'\n\t\t\t? Math.round(style.reflectionEndPosition * Math.max(elementHeight, 1))\n\t\t\t: 100;\n\tconst blurRadius =\n\t\ttypeof style.reflectionBlurRadius === 'number' ? style.reflectionBlurRadius : 0;\n\n\treturn {\n\t\twebkitBoxReflect: buildReflectionCssValue(\n\t\t\tdistance,\n\t\t\tstartOpacity,\n\t\t\tendOpacity,\n\t\t\tfadeLength,\n\t\t\tblurRadius,\n\t\t),\n\t\tdistance,\n\t\tstartOpacity,\n\t\tendOpacity,\n\t\tfadeLength,\n\t\tblurRadius,\n\t};\n}\n\n// ── DAG opacity & blend mode ───────────────────────────────────────────────\n\n/** Extract CSS `opacity` (0–1) from `dagAlphaModFix`, or `undefined`. */\nexport function getEffectDagOpacity(style: ShapeStyle | undefined): number | undefined {\n\tif (!style || typeof style.dagAlphaModFix !== 'number') {\n\t\treturn undefined;\n\t}\n\treturn clampUnitInterval(style.dagAlphaModFix / 100);\n}\n\n/** Map `dagFillOverlayBlend` to a CSS `mix-blend-mode`, or `undefined`. */\nexport function getEffectDagBlendMode(\n\tblend: ShapeStyle['dagFillOverlayBlend'],\n): string | undefined {\n\tswitch (blend) {\n\t\tcase 'mult':\n\t\t\treturn 'multiply';\n\t\tcase 'screen':\n\t\t\treturn 'screen';\n\t\tcase 'darken':\n\t\t\treturn 'darken';\n\t\tcase 'lighten':\n\t\t\treturn 'lighten';\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\n// ── High-fidelity duotone SVG <filter> markup (secondary path) ─────────────\n\n/** Stable SVG filter id for a DAG duotone effect on a given element. */\nexport function getDuotoneFilterId(elementId: string): string {\n\treturn `dag-duotone-${elementId}`;\n}\n\n/** Parse a hex colour to normalised 0–1 RGB components (invalid → 0). */\nfunction hexToRgbUnit(hex: string): { r: number; g: number; b: number } {\n\tconst clean = hex.replace('#', '');\n\tconst r = Number.parseInt(clean.substring(0, 2), 16) / 255;\n\tconst g = Number.parseInt(clean.substring(2, 4), 16) / 255;\n\tconst b = Number.parseInt(clean.substring(4, 6), 16) / 255;\n\treturn {\n\t\tr: Number.isFinite(r) ? r : 0,\n\t\tg: Number.isFinite(g) ? g : 0,\n\t\tb: Number.isFinite(b) ? b : 0,\n\t};\n}\n\n/**\n * A high-fidelity SVG `<filter>` definition: the filter `id`, a `filter:\n * url(#id)` reference for callers, and the `<filter>` markup to inject into a\n * `<defs>` (or a standalone hidden `<svg>`). Optional/secondary to the CSS\n * path.\n */\nexport interface SvgFilterDefinition {\n\t/** The `<filter>` element id. */\n\tid: string;\n\t/** A ready-to-use `filter: url(#id)` CSS reference. */\n\tcssReference: string;\n\t/** The `<filter>…</filter>` markup (no wrapping `<svg>`/`<defs>`). */\n\tfilterMarkup: string;\n}\n\n/**\n * Build the duotone `<filter>` markup (BT.709 grayscale → linear ramp between\n * two colours) for the high-fidelity DAG path. Returns `undefined` when the\n * style has no `dagDuotone`.\n *\n * Inject `filterMarkup` once into an SVG `<defs>` and apply `cssReference` as\n * the element's `filter` (or append it to {@link getEffectFilterCss}'s result).\n */\nexport function getDuotoneSvgFilter(\n\tstyle: ShapeStyle | undefined,\n\telementId: string,\n): SvgFilterDefinition | undefined {\n\tif (!style?.dagDuotone) {\n\t\treturn undefined;\n\t}\n\tconst id = getDuotoneFilterId(elementId);\n\tconst c1 = hexToRgbUnit(style.dagDuotone.color1);\n\tconst c2 = hexToRgbUnit(style.dagDuotone.color2);\n\n\tconst grayscaleMatrix = [\n\t\t0.2126, 0.7152, 0.0722, 0, 0, 0.2126, 0.7152, 0.0722, 0, 0, 0.2126, 0.7152, 0.0722, 0, 0, 0, 0,\n\t\t0, 1, 0,\n\t].join(' ');\n\n\tconst slopeR = c2.r - c1.r;\n\tconst slopeG = c2.g - c1.g;\n\tconst slopeB = c2.b - c1.b;\n\n\tconst filterMarkup = [\n\t\t`<filter id=\"${id}\" color-interpolation-filters=\"sRGB\">`,\n\t\t`<feColorMatrix type=\"matrix\" values=\"${grayscaleMatrix}\"/>`,\n\t\t`<feComponentTransfer>`,\n\t\t`<feFuncR type=\"linear\" slope=\"${slopeR}\" intercept=\"${c1.r}\"/>`,\n\t\t`<feFuncG type=\"linear\" slope=\"${slopeG}\" intercept=\"${c1.g}\"/>`,\n\t\t`<feFuncB type=\"linear\" slope=\"${slopeB}\" intercept=\"${c1.b}\"/>`,\n\t\t`</feComponentTransfer>`,\n\t\t`</filter>`,\n\t].join('');\n\n\treturn { id, cssReference: `url(#${id})`, filterMarkup };\n}\n\n// ── Aggregate convenience API ──────────────────────────────────────────────\n\n/**\n * The full set of CSS effect properties for a shape/image element, ready to be\n * spread onto a Vue `CSSProperties`-style object by the integrator. Every field\n * is optional and omitted when the corresponding effect is absent.\n */\nexport interface ComputedEffectStyle {\n\t/** Combined outer/inner/multi-layer/glow `box-shadow`. */\n\tboxShadow?: string;\n\t/** Combined glow/soft-edge/blur/DAG `filter`. */\n\tfilter?: string;\n\t/** `-webkit-box-reflect` (Chromium/WebKit only). */\n\twebkitBoxReflect?: string;\n\t/** Overall `opacity` from `dagAlphaModFix`. */\n\topacity?: number;\n\t/** `mix-blend-mode` from `dagFillOverlayBlend`. */\n\tmixBlendMode?: string;\n}\n\n/**\n * Compute every CSS effect property for an element in one call. The element is\n * used to read `shapeStyle`, the element id (for DAG filter refs), and the\n * height (for reflection fade length). Image effects (`imageEffects`) are NOT\n * handled here — see {@link hasImageEffects} and the React `image-effects` /\n * `shape-visual-effects` modules (deferred, see return notes).\n *\n * @returns A {@link ComputedEffectStyle}; all-undefined when no effects apply.\n */\nexport function getComputedEffectStyle(\n\telement: PptxElement,\n\toptions: { includeGlowBoxShadow?: boolean } = {},\n): ComputedEffectStyle {\n\tconst style = 'shapeStyle' in element ? element.shapeStyle : undefined;\n\tconst result: ComputedEffectStyle = {};\n\tif (!style) {\n\t\treturn result;\n\t}\n\n\tconst boxShadow = getBoxShadowCss(style, { includeGlow: options.includeGlowBoxShadow });\n\tif (boxShadow) {\n\t\tresult.boxShadow = boxShadow;\n\t}\n\n\tconst filter = getEffectFilterCss(style, element.id);\n\tif (filter) {\n\t\tresult.filter = filter;\n\t}\n\n\tconst reflection = getReflectionCss(style, element.height);\n\tif (reflection) {\n\t\tresult.webkitBoxReflect = reflection.webkitBoxReflect;\n\t}\n\n\tconst opacity = getEffectDagOpacity(style);\n\tif (opacity !== undefined) {\n\t\tresult.opacity = opacity;\n\t}\n\n\tconst blend = getEffectDagBlendMode(style.dagFillOverlayBlend);\n\tif (blend) {\n\t\tresult.mixBlendMode = blend;\n\t}\n\n\treturn result;\n}\n\n/** Whether an element carries any (recolour/artistic) image effects. */\nexport function hasImageEffects(element: PptxElement): boolean {\n\treturn isImageLikeElement(element) && Boolean(element.imageEffects);\n}\n","import type { PptxElement, PptxImageEffects } from 'pptx-viewer-core';\nimport { isImageLikeElement } from 'pptx-viewer-core';\n\n/**\n * Image-effects composable — Vue port of the React `viewer/utils` image-effect\n * layer (`shape-visual-effects.ts`, `duotone-effects.ts`,\n * `shape-visual-filters.tsx`, `artistic-effects.tsx`).\n *\n * It maps the parsed OOXML {@link PptxImageEffects} on a `picture`/`image`\n * element to:\n * - a CSS `filter:` string (brightness/contrast/saturate/grayscale/blur and\n * CSS-only artistic approximations), and\n * - any inline SVG `<filter>` definitions (duotone, advanced alpha primitives,\n * complex artistic effects) referenced from that CSS string via `url(#id)`.\n *\n * Every function here is pure and unit-testable without mounting a component.\n * The integrator binds the returned CSS `filter` onto the `<img>` and injects\n * the SVG `<filter>` markup once per element (see module docs at bottom).\n *\n * Precedence, unit conversions, and filter IDs intentionally mirror the React\n * implementation so the two bindings render identically.\n */\n\n// ── Public types ────────────────────────────────────────────────────────────\n\n/** An inline SVG `<filter>` definition to inject so a `url(#id)` reference resolves. */\nexport interface ImageSvgFilterDefinition {\n\t/** The `id` attribute of the `<filter>` (matches the `url(#id)` reference). */\n\tid: string;\n\t/**\n\t * Inner markup of the `<filter>` element (the `<fe*>` primitives only).\n\t * Wrap it in `<svg width=\"0\" height=\"0\"><defs><filter id=…>…</filter></defs></svg>`.\n\t */\n\tmarkup: string;\n}\n\n/** Aggregate result of {@link getComputedImageStyle}. */\nexport interface ComputedImageStyle {\n\t/** CSS `filter` value, or `undefined` when the element has no image effects. */\n\tfilter?: string;\n\t/** Overall opacity (0–1) derived from `alphaModFix`, or `undefined`. */\n\topacity?: number;\n\t/** SVG `<filter>` defs that must be injected for the CSS `url(#…)` refs to resolve. */\n\tsvgFilters: ImageSvgFilterDefinition[];\n}\n\n// ── Internal helpers ────────────────────────────────────────────────────────\n\n/** Clamp a number to the inclusive `[lo, hi]` range. */\nfunction clamp(v: number, lo: number, hi: number): number {\n\treturn v < lo ? lo : v > hi ? hi : v;\n}\n\n/** Normalize a radius value (0–100) to a 0–1 float for proportional scaling. */\nfunction normalizeRadius01(radius: number): number {\n\treturn clamp(radius / 100, 0, 1);\n}\n\n/** Parse a hex colour (`#RRGGBB` or `RRGGBB`) to normalised 0–1 RGB components. */\nfunction hexToRgbUnit(hex: string): { r: number; g: number; b: number } {\n\tconst clean = hex.replace(/^#/u, '');\n\tconst r = parseInt(clean.substring(0, 2), 16) / 255;\n\tconst g = parseInt(clean.substring(2, 4), 16) / 255;\n\tconst b = parseInt(clean.substring(4, 6), 16) / 255;\n\treturn {\n\t\tr: Number.isFinite(r) ? r : 0,\n\t\tg: Number.isFinite(g) ? g : 0,\n\t\tb: Number.isFinite(b) ? b : 0,\n\t};\n}\n\n/** Get the image effects off an element, or `undefined` for non-image elements. */\nfunction getEffects(element: PptxElement): PptxImageEffects | undefined {\n\tif (!isImageLikeElement(element)) {\n\t\treturn undefined;\n\t}\n\treturn element.imageEffects;\n}\n\n// ── Filter ID generators (mirror the React util IDs) ────────────────────────\n\n/** Stable SVG filter ID for a duotone effect on an element. */\nexport function getImageDuotoneFilterId(elementId: string): string {\n\treturn `duotone-${elementId}`;\n}\n\n/** Stable SVG filter ID for the advanced-alpha / colour primitives filter. */\nexport function getImageAlphaFilterId(elementId: string): string {\n\treturn `imgalpha-${elementId}`;\n}\n\n/** Stable SVG filter ID for a complex artistic effect on an element. */\nexport function getArtisticFilterId(elementId: string): string {\n\treturn `artistic-fx-${elementId}`;\n}\n\n// ── Artistic effects requiring SVG filters ──────────────────────────────────\n\n/**\n * Set of artistic effect names that require an SVG `<filter>` definition.\n * All others are approximated with CSS-only filter functions.\n */\nconst SVG_FILTER_EFFECTS = new Set<string>([\n\t'artisticFilmGrain',\n\t'filmGrain',\n\t'artisticCutout',\n\t'cutout',\n\t'artisticCement',\n\t'cement',\n\t'artisticTexturizer',\n\t'texturizer',\n\t'artisticCrisscrossEtching',\n\t'crisscrossEtching',\n\t'artisticMosaic',\n\t'artisticMosaicBubbles',\n\t'mosaicBubbles',\n\t'mosaic',\n\t'artisticGlowEdges',\n\t'glowEdges',\n\t'glow_edges',\n\t'artisticChalkSketch',\n\t'chalkSketch',\n\t'chalk',\n\t'artisticPencilSketch',\n\t'pencilSketch',\n\t'artisticPencilGrayscale',\n\t'pencilGrayscale',\n\t'grayPencil',\n]);\n\n/** Whether an artistic effect name needs an inline SVG `<filter>` (vs pure CSS). */\nexport function needsSvgArtisticFilter(effectName: string | undefined): boolean {\n\tif (!effectName) {\n\t\treturn false;\n\t}\n\treturn SVG_FILTER_EFFECTS.has(effectName);\n}\n\n// ── Advanced-alpha detection ────────────────────────────────────────────────\n\n/**\n * Returns true when the element has any blip-side alpha primitive or advanced\n * colour effect that CSS filters can't express (alphaInv, alphaCeiling,\n * alphaFloor, alphaRepl, alphaBiLevel, biLevel, lum, hsl with sat, tint,\n * clrRepl, alphaModFix). Brightness/contrast/saturation/grayscale/duotone are\n * still handled via CSS filters in {@link getImageFilterCss}.\n */\nexport function hasAdvancedImageAlphaEffects(element: PptxElement): boolean {\n\tconst e = getEffects(element);\n\tif (!e) {\n\t\treturn false;\n\t}\n\treturn Boolean(\n\t\ttypeof e.alphaModFix === 'number' ||\n\t\te.alphaInv ||\n\t\te.alphaCeiling ||\n\t\te.alphaFloor ||\n\t\ttypeof e.alphaRepl === 'number' ||\n\t\ttypeof e.alphaBiLevel === 'number' ||\n\t\ttypeof e.biLevel === 'number' ||\n\t\t(e.lum && (typeof e.lum.bright === 'number' || typeof e.lum.contrast === 'number')) ||\n\t\t(e.hsl && (typeof e.hsl.sat === 'number' || typeof e.hsl.lum === 'number')) ||\n\t\t(e.tint && typeof e.tint.amt === 'number') ||\n\t\te.clrRepl,\n\t);\n}\n\n// ── CSS filter string ───────────────────────────────────────────────────────\n\n/**\n * Build the CSS `filter:` string for an element's image effects.\n *\n * Mirrors React's `getImageEffectsFilter`: brightness/contrast/saturate are\n * OOXML hundredths-of-percent → CSS multipliers; grayscale → `grayscale(100%)`;\n * duotone / advanced-alpha / complex-artistic effects append a `url(#id)`\n * reference to an SVG `<filter>` that {@link getImageSvgFilters} produces.\n *\n * @param element The slide element (must be `picture`/`image` to yield a value).\n * @param options `excludeDuotone` skips the duotone `url(#…)` ref (e.g. when a\n * canvas path handles duotone instead).\n * @returns The CSS filter value, or `undefined` when there are no effects.\n */\nexport function getImageFilterCss(\n\telement: PptxElement,\n\toptions?: { excludeDuotone?: boolean },\n): string | undefined {\n\tconst effects = getEffects(element);\n\tif (!effects) {\n\t\treturn undefined;\n\t}\n\n\tconst filters: string[] = [];\n\n\t// Brightness: OOXML hundredths-of-percent → CSS multiplier\n\tif (typeof effects.brightness === 'number' && effects.brightness !== 0) {\n\t\tfilters.push(`brightness(${Math.max(0, 1 + effects.brightness / 100)})`);\n\t}\n\t// Contrast: OOXML hundredths-of-percent → CSS multiplier\n\tif (typeof effects.contrast === 'number' && effects.contrast !== 0) {\n\t\tfilters.push(`contrast(${Math.max(0, 1 + effects.contrast / 100)})`);\n\t}\n\t// Saturation: -100..100 → CSS saturate() multiplier\n\tif (typeof effects.saturation === 'number' && effects.saturation !== 0) {\n\t\tfilters.push(`saturate(${Math.max(0, 1 + effects.saturation / 100)})`);\n\t}\n\t// Grayscale\n\tif (effects.grayscale) {\n\t\tfilters.push('grayscale(100%)');\n\t}\n\t// Duotone: reference inline SVG filter (rendered by getImageSvgFilters).\n\tif (effects.duotone && !options?.excludeDuotone) {\n\t\tfilters.push(`url(#${getImageDuotoneFilterId(element.id)})`);\n\t}\n\t// Advanced alpha primitives + biLevel/lum/hsl(sat,lum)/tint/clrRepl that\n\t// CSS filters can't express; rendered by getImageSvgFilters().\n\tif (hasAdvancedImageAlphaEffects(element)) {\n\t\tfilters.push(`url(#${getImageAlphaFilterId(element.id)})`);\n\t}\n\t// Artistic effects: complex ones reference the SVG filter; simple ones use\n\t// CSS filter functions directly.\n\tif (effects.artisticEffect) {\n\t\tconst radius = effects.artisticRadius ?? 5;\n\n\t\tif (needsSvgArtisticFilter(effects.artisticEffect)) {\n\t\t\tfilters.push(`url(#${getArtisticFilterId(element.id)})`);\n\t\t} else {\n\t\t\tfilters.push(buildSimpleArtisticCss(effects.artisticEffect, radius));\n\t\t}\n\t}\n\n\t// Bi-level: 1-bit black/white threshold via extreme contrast + brightness.\n\tif (typeof effects.biLevel === 'number') {\n\t\tconst thresh = clamp(effects.biLevel, 0, 100);\n\t\tfilters.push(`grayscale(100%) contrast(1000%) brightness(${thresh}%)`);\n\t}\n\n\treturn filters.length > 0 ? filters.join(' ') : undefined;\n}\n\n/** CSS-only approximations for the simpler artistic effects. */\nfunction buildSimpleArtisticCss(effect: string, radius: number): string {\n\tswitch (effect) {\n\t\tcase 'blur':\n\t\tcase 'glassEffect':\n\t\t\treturn `blur(${Math.min(radius, 20)}px)`;\n\t\tcase 'artisticBlur':\n\t\t\treturn `blur(${Math.min(radius, 20)}px)`;\n\t\tcase 'artisticGaussianBlur':\n\t\t\treturn `blur(${Math.min(Math.round(radius * 1.2), 24)}px)`;\n\n\t\tcase 'lineDrawing':\n\t\t\treturn 'grayscale(100%) contrast(150%)';\n\t\tcase 'artisticLineDrawing':\n\t\t\treturn 'grayscale(100%) contrast(150%)';\n\n\t\tcase 'paintStrokes':\n\t\tcase 'watercolorSponge':\n\t\t\treturn `blur(${Math.min(radius, 8)}px) saturate(140%) brightness(105%)`;\n\t\tcase 'artisticPaintStrokes':\n\t\t\treturn `blur(${Math.min(radius, 8)}px) saturate(140%) brightness(105%)`;\n\t\tcase 'artisticWatercolorSponge':\n\t\t\treturn `blur(${Math.min(radius, 8)}px) saturate(150%) brightness(108%)`;\n\t\tcase 'artisticPaint':\n\t\tcase 'paint':\n\t\t\treturn `blur(${Math.min(radius, 5)}px) saturate(160%) contrast(110%)`;\n\t\tcase 'artisticPaintBrush':\n\t\tcase 'paintBrush':\n\t\t\treturn `blur(${Math.min(radius, 6)}px) saturate(130%)`;\n\n\t\tcase 'photocopy':\n\t\t\treturn 'grayscale(100%) contrast(200%) brightness(120%)';\n\t\tcase 'artisticPhotocopy':\n\t\t\treturn 'grayscale(100%) contrast(200%) brightness(120%)';\n\n\t\tcase 'pastelsSmooth':\n\t\tcase 'pastels':\n\t\t\treturn `blur(${Math.min(radius, 6)}px) saturate(85%) brightness(105%)`;\n\t\tcase 'artisticPastelsSmooth':\n\t\tcase 'artisticPastels':\n\t\t\treturn `blur(${Math.min(radius, 6)}px) saturate(85%) brightness(105%)`;\n\n\t\tcase 'artisticMarker':\n\t\tcase 'marker':\n\t\t\treturn 'contrast(130%) saturate(150%)';\n\n\t\tcase 'artisticPlasticWrap':\n\t\tcase 'plasticWrap':\n\t\t\treturn 'contrast(150%) brightness(115%) saturate(80%)';\n\n\t\tcase 'artisticLightScreen':\n\t\tcase 'lightScreen':\n\t\t\treturn `brightness(${1.2 + normalizeRadius01(radius) * 0.3}) saturate(${Math.max(\n\t\t\t\t0.5,\n\t\t\t\t0.8 - normalizeRadius01(radius) * 0.3,\n\t\t\t)})`;\n\n\t\tcase 'artisticGlowDiffused':\n\t\tcase 'glowDiffused':\n\t\t\treturn `blur(${Math.min(radius, 6)}px) brightness(${1.15 + normalizeRadius01(radius) * 0.15})`;\n\n\t\tcase 'artisticSharpenEdges':\n\t\tcase 'sharpen':\n\t\t\treturn 'contrast(160%) brightness(105%)';\n\n\t\tcase 'glass':\n\t\tcase 'artisticGlass':\n\t\t\treturn `blur(${Math.min(radius, 6)}px) brightness(110%)`;\n\n\t\tdefault:\n\t\t\treturn 'contrast(105%) saturate(105%)';\n\t}\n}\n\n// ── Opacity ─────────────────────────────────────────────────────────────────\n\n/**\n * Extract overall image opacity from the `alphaModFix` effect.\n * Returns a 0–1 value for CSS `opacity`, or `undefined` if not set.\n */\nexport function getImageEffectsOpacity(element: PptxElement): number | undefined {\n\tconst effects = getEffects(element);\n\tif (!effects) {\n\t\treturn undefined;\n\t}\n\tif (typeof effects.alphaModFix === 'number') {\n\t\treturn clamp(effects.alphaModFix / 100, 0, 1);\n\t}\n\treturn undefined;\n}\n\n// ── Duotone SVG filter ──────────────────────────────────────────────────────\n\n/** BT.601 luminance feColorMatrix values (RGB → grayscale luminance). */\nconst GRAYSCALE_LUMINANCE_MATRIX = [\n\t0.2126, 0.7152, 0.0722, 0, 0, 0.2126, 0.7152, 0.0722, 0, 0, 0.2126, 0.7152, 0.0722, 0, 0, 0, 0, 0,\n\t1, 0,\n].join(' ');\n\n/**\n * Build the inner `<filter>` markup for a duotone colour mapping: convert to\n * grayscale luminance, then linearly remap 0→color1 (shadows) and 1→color2\n * (highlights) per channel. Mirrors React's `renderDuotoneSvgFilter`.\n */\nfunction buildDuotoneFilterMarkup(color1: string, color2: string): string {\n\tconst c1 = hexToRgbUnit(color1);\n\tconst c2 = hexToRgbUnit(color2);\n\treturn (\n\t\t`<feColorMatrix type=\"matrix\" values=\"${GRAYSCALE_LUMINANCE_MATRIX}\"/>` +\n\t\t'<feComponentTransfer>' +\n\t\t`<feFuncR type=\"linear\" slope=\"${c2.r - c1.r}\" intercept=\"${c1.r}\"/>` +\n\t\t`<feFuncG type=\"linear\" slope=\"${c2.g - c1.g}\" intercept=\"${c1.g}\"/>` +\n\t\t`<feFuncB type=\"linear\" slope=\"${c2.b - c1.b}\" intercept=\"${c1.b}\"/>` +\n\t\t'</feComponentTransfer>'\n\t);\n}\n\n/**\n * High-fidelity duotone SVG filter for an image element.\n *\n * @returns The filter `id`, the matching `cssReference` (`url(#id)`), and the\n * inner `filterMarkup` to inject — or `undefined` when the element has\n * no duotone effect.\n */\nexport function getDuotoneImageFilter(\n\telement: PptxElement,\n\telementId: string = isImageLikeElement(element) ? element.id : '',\n): { id: string; cssReference: string; filterMarkup: string } | undefined {\n\tconst effects = getEffects(element);\n\tif (!effects?.duotone) {\n\t\treturn undefined;\n\t}\n\tconst id = getImageDuotoneFilterId(elementId);\n\treturn {\n\t\tid,\n\t\tcssReference: `url(#${id})`,\n\t\tfilterMarkup: buildDuotoneFilterMarkup(effects.duotone.color1, effects.duotone.color2),\n\t};\n}\n\n// ── Advanced alpha / colour primitives SVG filter ───────────────────────────\n\n/**\n * Build the inner `<filter>` markup covering the blip-side alpha primitives and\n * advanced colour effects that CSS filters can't express. Mirrors React's\n * `renderImageAlphaSvgFilter` (chained `in`/`result` primitives).\n *\n * @returns The markup, or `undefined` when no such primitives are present.\n */\nfunction buildImageAlphaFilterMarkup(effects: PptxImageEffects): string | undefined {\n\tconst parts: string[] = [];\n\tlet resultIdx = 0;\n\tlet inputRef = 'SourceGraphic';\n\tconst next = (build: (input: string, output: string) => string): void => {\n\t\tconst output = `r${resultIdx++}`;\n\t\tparts.push(build(inputRef, output));\n\t\tinputRef = output;\n\t};\n\n\tif (typeof effects.alphaModFix === 'number') {\n\t\tconst mul = clamp(effects.alphaModFix / 100, 0, 1);\n\t\tnext(\n\t\t\t(inp, out) =>\n\t\t\t\t`<feColorMatrix in=\"${inp}\" result=\"${out}\" type=\"matrix\" ` +\n\t\t\t\t`values=\"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 ${mul} 0\"/>`,\n\t\t);\n\t}\n\n\tif (effects.alphaInv) {\n\t\tnext(\n\t\t\t(inp, out) =>\n\t\t\t\t`<feComponentTransfer in=\"${inp}\" result=\"${out}\">` +\n\t\t\t\t'<feFuncA type=\"linear\" slope=\"-1\" intercept=\"1\"/>' +\n\t\t\t\t'</feComponentTransfer>',\n\t\t);\n\t}\n\n\tif (effects.alphaCeiling) {\n\t\tnext(\n\t\t\t(inp, out) =>\n\t\t\t\t`<feComponentTransfer in=\"${inp}\" result=\"${out}\">` +\n\t\t\t\t'<feFuncA type=\"discrete\" tableValues=\"0 1 1 1 1 1 1 1 1 1\"/>' +\n\t\t\t\t'</feComponentTransfer>',\n\t\t);\n\t}\n\n\tif (effects.alphaFloor) {\n\t\tnext(\n\t\t\t(inp, out) =>\n\t\t\t\t`<feComponentTransfer in=\"${inp}\" result=\"${out}\">` +\n\t\t\t\t'<feFuncA type=\"discrete\" tableValues=\"0 0 0 0 0 0 0 0 0 1\"/>' +\n\t\t\t\t'</feComponentTransfer>',\n\t\t);\n\t}\n\n\tif (typeof effects.alphaRepl === 'number') {\n\t\tconst a = clamp(effects.alphaRepl / 100, 0, 1);\n\t\tnext(\n\t\t\t(inp, out) =>\n\t\t\t\t`<feComponentTransfer in=\"${inp}\" result=\"${out}\">` +\n\t\t\t\t`<feFuncA type=\"linear\" slope=\"0\" intercept=\"${a}\"/>` +\n\t\t\t\t'</feComponentTransfer>',\n\t\t);\n\t}\n\n\tif (typeof effects.alphaBiLevel === 'number') {\n\t\tconst t = clamp(effects.alphaBiLevel / 100, 0, 1);\n\t\tconst table = Array.from({ length: 10 }, (_, i) => (i / 10 >= t ? '1' : '0')).join(' ');\n\t\tnext(\n\t\t\t(inp, out) =>\n\t\t\t\t`<feComponentTransfer in=\"${inp}\" result=\"${out}\">` +\n\t\t\t\t`<feFuncA type=\"discrete\" tableValues=\"${table}\"/>` +\n\t\t\t\t'</feComponentTransfer>',\n\t\t);\n\t}\n\n\tif (typeof effects.biLevel === 'number') {\n\t\t// grayscale, then threshold each channel.\n\t\tnext((inp, out) => `<feColorMatrix in=\"${inp}\" result=\"${out}\" type=\"saturate\" values=\"0\"/>`);\n\t\tconst tbl = '0 1';\n\t\tnext(\n\t\t\t(inp, out) =>\n\t\t\t\t`<feComponentTransfer in=\"${inp}\" result=\"${out}\">` +\n\t\t\t\t`<feFuncR type=\"discrete\" tableValues=\"${tbl}\"/>` +\n\t\t\t\t`<feFuncG type=\"discrete\" tableValues=\"${tbl}\"/>` +\n\t\t\t\t`<feFuncB type=\"discrete\" tableValues=\"${tbl}\"/>` +\n\t\t\t\t'</feComponentTransfer>',\n\t\t);\n\t}\n\n\tif (\n\t\teffects.lum &&\n\t\t(typeof effects.lum.bright === 'number' || typeof effects.lum.contrast === 'number')\n\t) {\n\t\tconst b = (effects.lum.bright ?? 0) / 100;\n\t\tconst c = 1 + (effects.lum.contrast ?? 0) / 100;\n\t\tconst slope = c;\n\t\tconst intercept = b + (1 - c) / 2;\n\t\tnext(\n\t\t\t(inp, out) =>\n\t\t\t\t`<feComponentTransfer in=\"${inp}\" result=\"${out}\">` +\n\t\t\t\t`<feFuncR type=\"linear\" slope=\"${slope}\" intercept=\"${intercept}\"/>` +\n\t\t\t\t`<feFuncG type=\"linear\" slope=\"${slope}\" intercept=\"${intercept}\"/>` +\n\t\t\t\t`<feFuncB type=\"linear\" slope=\"${slope}\" intercept=\"${intercept}\"/>` +\n\t\t\t\t'</feComponentTransfer>',\n\t\t);\n\t}\n\n\tif (effects.hsl && typeof effects.hsl.sat === 'number') {\n\t\tconst v = clamp(1 + effects.hsl.sat / 100, 0, 2);\n\t\tnext(\n\t\t\t(inp, out) => `<feColorMatrix in=\"${inp}\" result=\"${out}\" type=\"saturate\" values=\"${v}\"/>`,\n\t\t);\n\t}\n\n\tif (effects.tint && typeof effects.tint.amt === 'number' && effects.tint.amt < 0) {\n\t\tconst v = clamp(1 + effects.tint.amt / 100, 0, 1);\n\t\tnext(\n\t\t\t(inp, out) => `<feColorMatrix in=\"${inp}\" result=\"${out}\" type=\"saturate\" values=\"${v}\"/>`,\n\t\t);\n\t}\n\n\tif (effects.clrRepl) {\n\t\tconst c = hexToRgbUnit(effects.clrRepl.color);\n\t\tnext(\n\t\t\t(inp, out) =>\n\t\t\t\t`<feColorMatrix in=\"${inp}\" result=\"${out}\" type=\"matrix\" ` +\n\t\t\t\t`values=\"0 0 0 0 ${c.r} 0 0 0 0 ${c.g} 0 0 0 0 ${c.b} 0 0 0 1 0\"/>`,\n\t\t);\n\t}\n\n\treturn parts.length > 0 ? parts.join('') : undefined;\n}\n\n/**\n * Advanced alpha / colour primitives SVG filter for an image element.\n *\n * @returns The filter `id`, its `cssReference`, and the inner `filterMarkup`,\n * or `undefined` when no advanced primitives apply.\n */\nexport function getImageAlphaFilter(\n\telement: PptxElement,\n\telementId: string = isImageLikeElement(element) ? element.id : '',\n): { id: string; cssReference: string; filterMarkup: string } | undefined {\n\tconst effects = getEffects(element);\n\tif (!effects || !hasAdvancedImageAlphaEffects(element)) {\n\t\treturn undefined;\n\t}\n\tconst markup = buildImageAlphaFilterMarkup(effects);\n\tif (!markup) {\n\t\treturn undefined;\n\t}\n\tconst id = getImageAlphaFilterId(elementId);\n\treturn { id, cssReference: `url(#${id})`, filterMarkup: markup };\n}\n\n// ── Artistic SVG filter ─────────────────────────────────────────────────────\n\n/**\n * Build an SVG `tableValues` string for `feFunc*.type=discrete` posterization:\n * `steps` evenly-spaced discrete levels across the 0–1 range, padded to 256.\n */\nfunction buildDiscreteTable(steps: number): string {\n\tconst values: number[] = [];\n\tfor (let i = 0; i < steps; i++) {\n\t\tconst v = Math.round((i / (steps - 1)) * 100) / 100;\n\t\tconst count = Math.ceil(256 / steps);\n\t\tfor (let j = 0; j < count; j++) {\n\t\t\tvalues.push(v);\n\t\t}\n\t}\n\treturn values.slice(0, 256).join(' ');\n}\n\n/**\n * Build the inner `<filter>` markup for a complex artistic effect.\n * Mirrors React's `buildFilterPrimitives`. Returns `undefined` for effects that\n * don't need an SVG filter (handled via CSS instead).\n */\nfunction buildArtisticFilterMarkup(effectName: string, radius: number): string | undefined {\n\tconst normalizedRadius = clamp(radius, 0, 100) / 100;\n\n\tswitch (effectName) {\n\t\tcase 'artisticFilmGrain':\n\t\tcase 'filmGrain': {\n\t\t\tconst freq = 0.5 + normalizedRadius * 0.5;\n\t\t\tconst opacity = 0.15 + normalizedRadius * 0.25;\n\t\t\treturn (\n\t\t\t\t`<feTurbulence type=\"fractalNoise\" baseFrequency=\"${freq}\" numOctaves=\"4\" seed=\"1\" stitchTiles=\"stitch\" result=\"grain\"/>` +\n\t\t\t\t'<feColorMatrix in=\"grain\" type=\"saturate\" values=\"0\" result=\"grainGray\"/>' +\n\t\t\t\t'<feBlend in=\"SourceGraphic\" in2=\"grainGray\" mode=\"overlay\"/>' +\n\t\t\t\t'<feComponentTransfer>' +\n\t\t\t\t`<feFuncR type=\"linear\" slope=\"${1 + opacity * 0.3}\" intercept=\"${opacity * 0.02}\"/>` +\n\t\t\t\t`<feFuncG type=\"linear\" slope=\"${1 + opacity * 0.3}\" intercept=\"${opacity * 0.02}\"/>` +\n\t\t\t\t`<feFuncB type=\"linear\" slope=\"${1 + opacity * 0.3}\" intercept=\"${opacity * 0.02}\"/>` +\n\t\t\t\t'</feComponentTransfer>'\n\t\t\t);\n\t\t}\n\n\t\tcase 'artisticCutout':\n\t\tcase 'cutout': {\n\t\t\tconst steps = Math.max(2, Math.round(4 + normalizedRadius * 4));\n\t\t\tconst tableValues = buildDiscreteTable(steps);\n\t\t\treturn (\n\t\t\t\t'<feComponentTransfer>' +\n\t\t\t\t`<feFuncR type=\"discrete\" tableValues=\"${tableValues}\"/>` +\n\t\t\t\t`<feFuncG type=\"discrete\" tableValues=\"${tableValues}\"/>` +\n\t\t\t\t`<feFuncB type=\"discrete\" tableValues=\"${tableValues}\"/>` +\n\t\t\t\t'</feComponentTransfer>'\n\t\t\t);\n\t\t}\n\n\t\tcase 'artisticCement':\n\t\tcase 'cement': {\n\t\t\tconst freq = 1.5 + normalizedRadius * 2.5;\n\t\t\tconst desat = Math.max(0, 0.4 - normalizedRadius * 0.3);\n\t\t\treturn (\n\t\t\t\t`<feColorMatrix type=\"saturate\" values=\"${desat}\" result=\"desat\"/>` +\n\t\t\t\t`<feTurbulence type=\"fractalNoise\" baseFrequency=\"${freq}\" numOctaves=\"5\" seed=\"2\" stitchTiles=\"stitch\" result=\"cementNoise\"/>` +\n\t\t\t\t'<feColorMatrix in=\"cementNoise\" type=\"saturate\" values=\"0\" result=\"cementGray\"/>' +\n\t\t\t\t'<feBlend in=\"desat\" in2=\"cementGray\" mode=\"multiply\"/>' +\n\t\t\t\t'<feComponentTransfer>' +\n\t\t\t\t'<feFuncR type=\"linear\" slope=\"1.2\" intercept=\"0\"/>' +\n\t\t\t\t'<feFuncG type=\"linear\" slope=\"1.2\" intercept=\"0\"/>' +\n\t\t\t\t'<feFuncB type=\"linear\" slope=\"1.2\" intercept=\"0\"/>' +\n\t\t\t\t'</feComponentTransfer>'\n\t\t\t);\n\t\t}\n\n\t\tcase 'artisticTexturizer':\n\t\tcase 'texturizer': {\n\t\t\tconst freq = 2.0 + normalizedRadius * 3.0;\n\t\t\treturn (\n\t\t\t\t`<feTurbulence type=\"fractalNoise\" baseFrequency=\"${freq}\" numOctaves=\"3\" seed=\"3\" stitchTiles=\"stitch\" result=\"texNoise\"/>` +\n\t\t\t\t'<feColorMatrix in=\"texNoise\" type=\"saturate\" values=\"0\" result=\"texGray\"/>' +\n\t\t\t\t'<feBlend in=\"SourceGraphic\" in2=\"texGray\" mode=\"overlay\"/>' +\n\t\t\t\t'<feComponentTransfer>' +\n\t\t\t\t'<feFuncR type=\"linear\" slope=\"1.1\" intercept=\"0.02\"/>' +\n\t\t\t\t'<feFuncG type=\"linear\" slope=\"1.1\" intercept=\"0.02\"/>' +\n\t\t\t\t'<feFuncB type=\"linear\" slope=\"1.1\" intercept=\"0.02\"/>' +\n\t\t\t\t'</feComponentTransfer>'\n\t\t\t);\n\t\t}\n\n\t\tcase 'artisticCrisscrossEtching':\n\t\tcase 'crisscrossEtching': {\n\t\t\tconst freq = 0.08 + normalizedRadius * 0.12;\n\t\t\treturn (\n\t\t\t\t'<feColorMatrix type=\"saturate\" values=\"0\" result=\"gray\"/>' +\n\t\t\t\t`<feTurbulence type=\"turbulence\" baseFrequency=\"${freq} ${freq * 3}\" numOctaves=\"1\" seed=\"7\" result=\"lines\"/>` +\n\t\t\t\t'<feColorMatrix in=\"lines\" type=\"saturate\" values=\"0\" result=\"linesGray\"/>' +\n\t\t\t\t'<feBlend in=\"gray\" in2=\"linesGray\" mode=\"multiply\"/>' +\n\t\t\t\t'<feComponentTransfer>' +\n\t\t\t\t'<feFuncR type=\"linear\" slope=\"1.3\" intercept=\"-0.05\"/>' +\n\t\t\t\t'<feFuncG type=\"linear\" slope=\"1.3\" intercept=\"-0.05\"/>' +\n\t\t\t\t'<feFuncB type=\"linear\" slope=\"1.3\" intercept=\"-0.05\"/>' +\n\t\t\t\t'</feComponentTransfer>'\n\t\t\t);\n\t\t}\n\n\t\tcase 'artisticMosaic':\n\t\tcase 'artisticMosaicBubbles':\n\t\tcase 'mosaicBubbles':\n\t\tcase 'mosaic': {\n\t\t\tconst blurAmount = Math.max(2, Math.round(radius * 0.8));\n\t\t\tconst freq = 0.02 + normalizedRadius * 0.03;\n\t\t\treturn (\n\t\t\t\t`<feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"${blurAmount}\" result=\"blurred\"/>` +\n\t\t\t\t`<feTurbulence type=\"turbulence\" baseFrequency=\"${freq}\" numOctaves=\"1\" seed=\"4\" result=\"cells\"/>` +\n\t\t\t\t`<feDisplacementMap in=\"blurred\" in2=\"cells\" scale=\"${blurAmount * 0.5}\" xChannelSelector=\"R\" yChannelSelector=\"G\" result=\"mosaic\"/>` +\n\t\t\t\t'<feComponentTransfer in=\"mosaic\">' +\n\t\t\t\t'<feFuncR type=\"linear\" slope=\"1.05\" intercept=\"0\"/>' +\n\t\t\t\t'<feFuncG type=\"linear\" slope=\"1.05\" intercept=\"0\"/>' +\n\t\t\t\t'<feFuncB type=\"linear\" slope=\"1.05\" intercept=\"0\"/>' +\n\t\t\t\t'</feComponentTransfer>'\n\t\t\t);\n\t\t}\n\n\t\tcase 'artisticGlowEdges':\n\t\tcase 'glowEdges':\n\t\tcase 'glow_edges': {\n\t\t\tconst edgeBlur = Math.max(1, Math.round(normalizedRadius * 3));\n\t\t\treturn (\n\t\t\t\t'<feColorMatrix type=\"matrix\" values=\"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\" result=\"inverted\"/>' +\n\t\t\t\t`<feGaussianBlur in=\"inverted\" stdDeviation=\"${edgeBlur}\" result=\"blurredInv\"/>` +\n\t\t\t\t'<feBlend in=\"SourceGraphic\" in2=\"blurredInv\" mode=\"screen\"/>' +\n\t\t\t\t'<feComponentTransfer>' +\n\t\t\t\t'<feFuncR type=\"linear\" slope=\"2\" intercept=\"-0.3\"/>' +\n\t\t\t\t'<feFuncG type=\"linear\" slope=\"2\" intercept=\"-0.3\"/>' +\n\t\t\t\t'<feFuncB type=\"linear\" slope=\"2\" intercept=\"-0.3\"/>' +\n\t\t\t\t'</feComponentTransfer>'\n\t\t\t);\n\t\t}\n\n\t\tcase 'artisticChalkSketch':\n\t\tcase 'chalkSketch':\n\t\tcase 'chalk': {\n\t\t\tconst freq = 1.0 + normalizedRadius * 2.0;\n\t\t\tconst desat = Math.max(0, 0.2 - normalizedRadius * 0.2);\n\t\t\treturn (\n\t\t\t\t`<feColorMatrix type=\"saturate\" values=\"${desat}\" result=\"gray\"/>` +\n\t\t\t\t`<feTurbulence type=\"fractalNoise\" baseFrequency=\"${freq}\" numOctaves=\"4\" seed=\"5\" stitchTiles=\"stitch\" result=\"chalkTex\"/>` +\n\t\t\t\t'<feColorMatrix in=\"chalkTex\" type=\"saturate\" values=\"0\" result=\"chalkGray\"/>' +\n\t\t\t\t'<feBlend in=\"gray\" in2=\"chalkGray\" mode=\"overlay\"/>' +\n\t\t\t\t'<feComponentTransfer>' +\n\t\t\t\t'<feFuncR type=\"linear\" slope=\"1.5\" intercept=\"0.05\"/>' +\n\t\t\t\t'<feFuncG type=\"linear\" slope=\"1.5\" intercept=\"0.05\"/>' +\n\t\t\t\t'<feFuncB type=\"linear\" slope=\"1.5\" intercept=\"0.05\"/>' +\n\t\t\t\t'</feComponentTransfer>'\n\t\t\t);\n\t\t}\n\n\t\tcase 'artisticPencilSketch':\n\t\tcase 'pencilSketch': {\n\t\t\tconst blurAmt = Math.max(3, Math.round(4 + normalizedRadius * 8));\n\t\t\treturn (\n\t\t\t\t'<feColorMatrix type=\"saturate\" values=\"0\" result=\"gray\"/>' +\n\t\t\t\t'<feColorMatrix in=\"gray\" type=\"matrix\" values=\"-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0\" result=\"invGray\"/>' +\n\t\t\t\t`<feGaussianBlur in=\"invGray\" stdDeviation=\"${blurAmt}\" result=\"blurInv\"/>` +\n\t\t\t\t'<feBlend in=\"blurInv\" in2=\"gray\" mode=\"screen\" result=\"sketch\"/>' +\n\t\t\t\t'<feComponentTransfer in=\"sketch\">' +\n\t\t\t\t'<feFuncR type=\"linear\" slope=\"1.6\" intercept=\"-0.15\"/>' +\n\t\t\t\t'<feFuncG type=\"linear\" slope=\"1.6\" intercept=\"-0.15\"/>' +\n\t\t\t\t'<feFuncB type=\"linear\" slope=\"1.6\" intercept=\"-0.15\"/>' +\n\t\t\t\t'</feComponentTransfer>'\n\t\t\t);\n\t\t}\n\n\t\tcase 'artisticPencilGrayscale':\n\t\tcase 'pencilGrayscale':\n\t\tcase 'grayPencil': {\n\t\t\tconst sharpenBlur = Math.max(0.5, 1 + normalizedRadius * 2);\n\t\t\treturn (\n\t\t\t\t'<feColorMatrix type=\"saturate\" values=\"0\" result=\"gray\"/>' +\n\t\t\t\t`<feGaussianBlur in=\"gray\" stdDeviation=\"${sharpenBlur}\" result=\"grayBlur\"/>` +\n\t\t\t\t'<feComposite in=\"gray\" in2=\"grayBlur\" operator=\"arithmetic\" k1=\"0\" k2=\"1.5\" k3=\"-0.5\" k4=\"0\"/>'\n\t\t\t);\n\t\t}\n\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\n/**\n * Complex artistic SVG filter for an image element.\n *\n * @returns The filter `id`, its `cssReference`, and the inner `filterMarkup`,\n * or `undefined` when the element's artistic effect (if any) is handled\n * via CSS rather than an SVG filter.\n */\nexport function getArtisticImageFilter(\n\telement: PptxElement,\n\telementId: string = isImageLikeElement(element) ? element.id : '',\n): { id: string; cssReference: string; filterMarkup: string } | undefined {\n\tconst effects = getEffects(element);\n\tif (!effects?.artisticEffect || !needsSvgArtisticFilter(effects.artisticEffect)) {\n\t\treturn undefined;\n\t}\n\tconst markup = buildArtisticFilterMarkup(effects.artisticEffect, effects.artisticRadius ?? 5);\n\tif (!markup) {\n\t\treturn undefined;\n\t}\n\tconst id = getArtisticFilterId(elementId);\n\treturn { id, cssReference: `url(#${id})`, filterMarkup: markup };\n}\n\n// ── Aggregate ───────────────────────────────────────────────────────────────\n\n/**\n * Collect every SVG `<filter>` definition an element's image effects require\n * (duotone, advanced alpha, complex artistic) in the same order their `url(#…)`\n * references are appended in {@link getImageFilterCss}.\n */\nexport function getImageSvgFilters(element: PptxElement): ImageSvgFilterDefinition[] {\n\tconst defs: ImageSvgFilterDefinition[] = [];\n\tconst duotone = getDuotoneImageFilter(element);\n\tif (duotone) {\n\t\tdefs.push({ id: duotone.id, markup: duotone.filterMarkup });\n\t}\n\tconst alpha = getImageAlphaFilter(element);\n\tif (alpha) {\n\t\tdefs.push({ id: alpha.id, markup: alpha.filterMarkup });\n\t}\n\tconst artistic = getArtisticImageFilter(element);\n\tif (artistic) {\n\t\tdefs.push({ id: artistic.id, markup: artistic.filterMarkup });\n\t}\n\treturn defs;\n}\n\n/**\n * Aggregate computed style for an image element's effects: the CSS `filter`\n * string, an optional `opacity`, and the SVG `<filter>` defs to inject so the\n * `url(#…)` references in `filter` resolve.\n *\n * Returns empty/undefined fields for non-image elements or elements with no\n * effects, so it is always safe to spread onto an `<img>`.\n */\nexport function getComputedImageStyle(element: PptxElement): ComputedImageStyle {\n\treturn {\n\t\tfilter: getImageFilterCss(element),\n\t\topacity: getImageEffectsOpacity(element),\n\t\tsvgFilters: getImageSvgFilters(element),\n\t};\n}\n","/**\n * Text warp / WordArt logic — Vue port of the React\n * `viewer/utils/warp-path-generators.ts` + `text-warp-classifier.ts`.\n *\n * Pure, framework-agnostic helpers that classify an OOXML `prstTxWarp` preset\n * and build the SVG path `d` attribute for a single warped text baseline.\n *\n * A text element signals WordArt via `element.textStyle.textWarpPreset`\n * (`a:bodyPr/a:prstTxWarp/@prst`), with optional `textWarpAdj` / `textWarpAdj2`\n * adjustment values (raw OOXML 1/60000th units). Use {@link hasTextWarp} to\n * detect a warped element and {@link shouldUseSvgWarp} to decide whether the\n * SVG `<textPath>` renderer applies.\n */\nimport type { PptxElement, PptxTextWarpPreset } from 'pptx-viewer-core';\nimport { hasTextProperties } from 'pptx-viewer-core';\n\n// ── Classifier ──────────────────────────────────────────────────────────\n\n/**\n * Rendering-strategy category for a warp preset.\n * - `path`: renders along an SVG `<textPath>` (arcs, waves, circles…)\n * - `envelope`: non-uniform vertical stretch (inflate/deflate/can)\n * - `simple`: basic 2D transforms (slant, fade, cascade)\n * - `none`: no warp (`textNoShape`, `textPlain`, unknown)\n */\nexport type WarpCategory = 'path' | 'envelope' | 'simple' | 'none';\n\nconst NONE_PRESETS: ReadonlySet<string> = new Set(['textNoShape', 'textPlain']);\n\n/** Presets that render best with SVG textPath along curved/circular paths. */\nconst PATH_PRESETS: ReadonlySet<string> = new Set([\n\t'textArchUp',\n\t'textArchDown',\n\t'textCircle',\n\t'textWave1',\n\t'textWave2',\n\t'textWave4',\n\t'textDoubleWave1',\n\t'textCurveUp',\n\t'textCurveDown',\n\t'textArchUpPour',\n\t'textArchDownPour',\n\t'textCirclePour',\n\t'textButton',\n\t'textButtonPour',\n\t'textRingInside',\n\t'textRingOutside',\n\t'textTriangle',\n\t'textTriangleInverted',\n\t'textChevron',\n\t'textChevronInverted',\n\t'textStop',\n]);\n\n/** Presets that stretch text non-uniformly per line (inflate/deflate/can). */\nconst ENVELOPE_PRESETS: ReadonlySet<string> = new Set([\n\t'textInflate',\n\t'textDeflate',\n\t'textInflateBottom',\n\t'textInflateTop',\n\t'textDeflateBottom',\n\t'textDeflateTop',\n\t'textDeflateInflate',\n\t'textDeflateInflateDeflate',\n\t'textCanUp',\n\t'textCanDown',\n]);\n\n/** Presets approximated by basic 2D transforms (slant, fade, cascade). */\nconst SIMPLE_PRESETS: ReadonlySet<string> = new Set([\n\t'textSlantUp',\n\t'textSlantDown',\n\t'textFadeRight',\n\t'textFadeLeft',\n\t'textFadeUp',\n\t'textFadeDown',\n\t'textCascadeUp',\n\t'textCascadeDown',\n]);\n\n/**\n * Classify a warp preset into a rendering-strategy category.\n *\n * Returns `'none'` for empty/unknown presets so callers can skip rendering\n * without an explicit allowlist check.\n */\nexport function classifyTextWarp(preset: string | undefined): WarpCategory {\n\tif (!preset || NONE_PRESETS.has(preset)) {\n\t\treturn 'none';\n\t}\n\tif (PATH_PRESETS.has(preset)) {\n\t\treturn 'path';\n\t}\n\tif (ENVELOPE_PRESETS.has(preset)) {\n\t\treturn 'envelope';\n\t}\n\tif (SIMPLE_PRESETS.has(preset)) {\n\t\treturn 'simple';\n\t}\n\treturn 'none';\n}\n\n/** All classified warp presets (excludes `none`). */\nexport const ALL_CLASSIFIED_PRESETS: ReadonlySet<string> = new Set([\n\t...NONE_PRESETS,\n\t...PATH_PRESETS,\n\t...ENVELOPE_PRESETS,\n\t...SIMPLE_PRESETS,\n]);\n\n// ── Path generators ─────────────────────────────────────────────────────\n\n/** Produces an SVG path `d` attribute for a single text line at vertical\n * position `t` (0 = top, 1 = bottom). Optional adj/adj2 are raw OOXML units. */\nexport type WarpPathGenerator = (\n\tw: number,\n\th: number,\n\tt: number,\n\tadj?: number,\n\tadj2?: number,\n) => string;\n\n/** Presets that require SVG textPath rendering (all others fall back to flat). */\nexport const SVG_WARP_PRESETS: ReadonlySet<string> = new Set([\n\t// Priority 1\n\t'textArchUp',\n\t'textArchDown',\n\t'textCircle',\n\t'textWave1',\n\t'textInflate',\n\t'textDeflate',\n\t'textCurveUp',\n\t'textCurveDown',\n\t// Priority 2\n\t'textWave2',\n\t'textWave4',\n\t'textDoubleWave1',\n\t'textCanUp',\n\t'textCanDown',\n\t'textButton',\n\t'textRingInside',\n\t'textRingOutside',\n\t'textCascadeUp',\n\t'textCascadeDown',\n\t// Priority 3\n\t'textTriangle',\n\t'textTriangleInverted',\n\t'textStop',\n\t'textChevron',\n\t'textChevronInverted',\n\t'textInflateBottom',\n\t'textInflateTop',\n\t'textDeflateBottom',\n\t'textDeflateTop',\n\t// Priority 4 – slant, fade, pour, and compound deflate/inflate\n\t'textSlantUp',\n\t'textSlantDown',\n\t'textFadeRight',\n\t'textFadeLeft',\n\t'textFadeUp',\n\t'textFadeDown',\n\t'textArchUpPour',\n\t'textArchDownPour',\n\t'textCirclePour',\n\t'textButtonPour',\n\t'textDeflateInflate',\n\t'textDeflateInflateDeflate',\n]);\n\nconst clamp4 = (n: number): number => Math.max(0, Math.min(n, 4));\n\n// ── Priority 1 ──────────────────────────────────────────────────────────\n\n/** Concentric upward arcs. t=0 is the tallest arch. */\nfunction archUpPath(w: number, h: number, t: number, adj?: number): string {\n\tconst adjNorm = adj !== undefined ? Math.max(0, Math.min(adj / 21600000, 1)) : 0.5;\n\tconst maxArch = (0.85 * adjNorm) / 0.5;\n\tconst archH = h * Math.max(0, maxArch - t * 0.7);\n\tif (archH < 1) {\n\t\treturn `M 0,${h} L ${w},${h}`;\n\t}\n\treturn `M 0,${h} A ${w / 2},${archH} 0 0,1 ${w},${h}`;\n}\n\n/** Concentric downward arcs. t=1 is the deepest. */\nfunction archDownPath(w: number, h: number, t: number, adj?: number): string {\n\tconst adjNorm = adj !== undefined ? Math.max(0, Math.min(adj / 21600000, 1)) : 0.5;\n\tconst baseDepth = (0.15 * adjNorm) / 0.5;\n\tconst archH = h * (baseDepth + t * 0.7);\n\tif (archH < 1) {\n\t\treturn `M 0,0 L ${w},0`;\n\t}\n\treturn `M 0,0 A ${w / 2},${archH} 0 0,0 ${w},0`;\n}\n\n/** Full ellipse — concentric ellipses shrink towards centre. */\nfunction circlePath(w: number, h: number, t: number, adj?: number): string {\n\tconst cx = w / 2;\n\tconst cy = h / 2;\n\tconst adjNorm = adj !== undefined ? Math.max(0, Math.min(adj / 21600000, 1)) : 0.5;\n\tconst baseScale = 0.45 + adjNorm * 1.1;\n\tconst scale = Math.min(1, baseScale) - t * 0.55;\n\tconst rx = Math.max(1, (w / 2) * scale);\n\tconst ry = Math.max(1, (h / 2) * scale);\n\treturn (\n\t\t`M ${cx},${cy - ry} ` +\n\t\t`A ${rx},${ry} 0 1,1 ${cx},${cy + ry} ` +\n\t\t`A ${rx},${ry} 0 1,1 ${cx},${cy - ry}`\n\t);\n}\n\n/** Single sine-wave via cubic Bézier. */\nfunction wave1Path(w: number, h: number, t: number, adj?: number, adj2?: number): string {\n\tconst yMid = h * (0.25 + t * 0.5);\n\tconst adjFactor = adj !== undefined ? adj / 12500 : 1;\n\tconst amp = h * 0.2 * clamp4(adjFactor);\n\tconst hShift = adj2 !== undefined ? (adj2 / 100000) * w * 0.3 : 0;\n\tconst cp1x = w / 3 + hShift;\n\tconst cp2x = (2 * w) / 3 + hShift;\n\treturn `M 0,${yMid} C ${cp1x},${yMid - amp} ${cp2x},${yMid + amp} ${w},${yMid}`;\n}\n\n/** Inflate — top lines bow up, bottom lines bow down. */\nfunction inflatePath(w: number, h: number, t: number, adj?: number): string {\n\tconst yBase = h * (0.15 + t * 0.7);\n\tconst adjFactor = adj !== undefined ? adj / 18750 : 1;\n\tconst bulge = h * 0.3 * (1 - 2 * t) * clamp4(adjFactor);\n\treturn `M 0,${yBase} Q ${w / 2},${yBase - bulge} ${w},${yBase}`;\n}\n\n/** Deflate — opposite of inflate. */\nfunction deflatePath(w: number, h: number, t: number, adj?: number): string {\n\tconst yBase = h * (0.15 + t * 0.7);\n\tconst adjFactor = adj !== undefined ? adj / 18750 : 1;\n\tconst pinch = h * 0.3 * (2 * t - 1) * clamp4(adjFactor);\n\treturn `M 0,${yBase} Q ${w / 2},${yBase - pinch} ${w},${yBase}`;\n}\n\n/** Gentle upward curve. */\nfunction curveUpPath(w: number, h: number, t: number, adj?: number): string {\n\tconst yBase = h * (0.35 + t * 0.55);\n\tconst adjFactor = adj !== undefined ? adj / 45977 : 1;\n\tconst curve = h * 0.4 * (1 - t * 0.3) * clamp4(adjFactor);\n\treturn `M 0,${yBase} Q ${w / 2},${yBase - curve} ${w},${yBase}`;\n}\n\n/** Gentle downward curve. */\nfunction curveDownPath(w: number, h: number, t: number, adj?: number): string {\n\tconst yBase = h * (0.1 + t * 0.55);\n\tconst adjFactor = adj !== undefined ? adj / 45977 : 1;\n\tconst curve = h * 0.4 * (1 - (1 - t) * 0.3) * clamp4(adjFactor);\n\treturn `M 0,${yBase} Q ${w / 2},${yBase + curve} ${w},${yBase}`;\n}\n\n// ── Priority 2 ──────────────────────────────────────────────────────────\n\n/** Inverted single wave (phase-shifted wave1). */\nfunction wave2Path(w: number, h: number, t: number, adj?: number, adj2?: number): string {\n\tconst yMid = h * (0.25 + t * 0.5);\n\tconst adjFactor = adj !== undefined ? adj / 12500 : 1;\n\tconst amp = h * 0.2 * clamp4(adjFactor);\n\tconst hShift = adj2 !== undefined ? (adj2 / 100000) * w * 0.3 : 0;\n\tconst cp1x = w / 3 + hShift;\n\tconst cp2x = (2 * w) / 3 + hShift;\n\treturn `M 0,${yMid} C ${cp1x},${yMid + amp} ${cp2x},${yMid - amp} ${w},${yMid}`;\n}\n\n/** Double wave — two full cycles. */\nfunction wave4Path(w: number, h: number, t: number, adj?: number, adj2?: number): string {\n\tconst yMid = h * (0.25 + t * 0.5);\n\tconst adjFactor = adj !== undefined ? adj / 12500 : 1;\n\tconst amp = h * 0.15 * clamp4(adjFactor);\n\tconst hShift = adj2 !== undefined ? (adj2 / 100000) * w * 0.15 : 0;\n\tconst q = w / 4;\n\treturn (\n\t\t`M 0,${yMid} ` +\n\t\t`C ${q + hShift},${yMid - amp} ${2 * q + hShift},${yMid + amp} ${w / 2},${yMid} ` +\n\t\t`C ${w / 2 + q + hShift},${yMid - amp} ${w - q + hShift},${yMid + amp} ${w},${yMid}`\n\t);\n}\n\n/** Double wave with alternating rhythm. */\nfunction doubleWave1Path(w: number, h: number, t: number, adj?: number, adj2?: number): string {\n\tconst yMid = h * (0.25 + t * 0.5);\n\tconst adjFactor = adj !== undefined ? adj / 6250 : 1;\n\tconst amp = h * 0.18 * clamp4(adjFactor);\n\tconst hShift = adj2 !== undefined ? (adj2 / 100000) * w * 0.15 : 0;\n\tconst q = w / 4;\n\treturn (\n\t\t`M 0,${yMid} ` +\n\t\t`C ${q + hShift},${yMid - amp} ${2 * q + hShift},${yMid + amp} ${w / 2},${yMid} ` +\n\t\t`C ${w / 2 + q + hShift},${yMid + amp} ${w - q + hShift},${yMid - amp} ${w},${yMid}`\n\t);\n}\n\n/** Cylindrical text — upward. */\nfunction canUpPath(w: number, h: number, t: number, adj?: number): string {\n\tconst adjFactor = adj !== undefined ? adj / 18750 : 1;\n\tconst curvature = clamp4(adjFactor);\n\tconst archH = h * (0.35 - t * 0.25) * curvature;\n\tif (archH < 1) {\n\t\treturn `M 0,${h} L ${w},${h}`;\n\t}\n\treturn `M 0,${h} A ${w / 2},${archH} 0 0,1 ${w},${h}`;\n}\n\n/** Cylindrical text — downward. */\nfunction canDownPath(w: number, h: number, t: number, adj?: number): string {\n\tconst adjFactor = adj !== undefined ? adj / 18750 : 1;\n\tconst curvature = clamp4(adjFactor);\n\tconst archH = h * (0.1 + t * 0.25) * curvature;\n\tif (archH < 1) {\n\t\treturn `M 0,0 L ${w},0`;\n\t}\n\treturn `M 0,0 A ${w / 2},${archH} 0 0,0 ${w},0`;\n}\n\n/** Button — convex top / concave bottom. */\nfunction buttonPath(w: number, h: number, t: number, adj?: number): string {\n\tconst yBase = h * (0.1 + t * 0.8);\n\tconst adjFactor = adj !== undefined ? adj / 18750 : 1;\n\tconst bulge = h * 0.15 * (1 - 2 * t) * clamp4(adjFactor);\n\treturn `M 0,${yBase} Q ${w / 2},${yBase - bulge} ${w},${yBase}`;\n}\n\n/** Ring inside — concentric ellipses scaled inward. */\nfunction ringInsidePath(w: number, h: number, t: number, adj?: number): string {\n\tconst cx = w / 2;\n\tconst cy = h / 2;\n\tconst adjFactor = adj !== undefined ? adj / 18750 : 1;\n\tconst thickness = 0.35 * clamp4(adjFactor);\n\tconst scale = 0.7 - t * thickness;\n\tconst rx = Math.max(1, (w / 2) * scale);\n\tconst ry = Math.max(1, (h / 2) * scale);\n\treturn (\n\t\t`M ${cx},${cy - ry} ` +\n\t\t`A ${rx},${ry} 0 1,1 ${cx},${cy + ry} ` +\n\t\t`A ${rx},${ry} 0 1,1 ${cx},${cy - ry}`\n\t);\n}\n\n/** Ring outside — concentric ellipses scaled outward. */\nfunction ringOutsidePath(w: number, h: number, t: number, adj?: number): string {\n\tconst cx = w / 2;\n\tconst cy = h / 2;\n\tconst adjFactor = adj !== undefined ? adj / 18750 : 1;\n\tconst thickness = 0.35 * clamp4(adjFactor);\n\tconst scale = 1 - t * thickness;\n\tconst rx = Math.max(1, (w / 2) * scale);\n\tconst ry = Math.max(1, (h / 2) * scale);\n\treturn (\n\t\t`M ${cx},${cy - ry} ` +\n\t\t`A ${rx},${ry} 0 1,1 ${cx},${cy + ry} ` +\n\t\t`A ${rx},${ry} 0 1,1 ${cx},${cy - ry}`\n\t);\n}\n\n/** Cascading up — lines tilt from lower-left to upper-right. */\nfunction cascadeUpPath(w: number, h: number, t: number, adj?: number): string {\n\tconst adjFactor = adj !== undefined ? adj / 44444 : 1;\n\tconst tilt = 0.2 * clamp4(adjFactor);\n\tconst yMid = h * (0.2 + t * 0.6);\n\tconst yStart = yMid + (h * tilt) / 2;\n\tconst yEnd = yMid - (h * tilt) / 2;\n\treturn `M 0,${yStart} L ${w},${yEnd}`;\n}\n\n/** Cascading down — lines tilt from upper-left to lower-right. */\nfunction cascadeDownPath(w: number, h: number, t: number, adj?: number): string {\n\tconst adjFactor = adj !== undefined ? adj / 44444 : 1;\n\tconst tilt = 0.2 * clamp4(adjFactor);\n\tconst yMid = h * (0.2 + t * 0.6);\n\tconst yStart = yMid - (h * tilt) / 2;\n\tconst yEnd = yMid + (h * tilt) / 2;\n\treturn `M 0,${yStart} L ${w},${yEnd}`;\n}\n\n// ── Priority 3 ──────────────────────────────────────────────────────────\n\n/** Triangle / trapezoid — top line narrow, bottom line full width. */\nfunction trianglePath(w: number, h: number, t: number, adj?: number): string {\n\tconst adjRatio = adj !== undefined ? adj / 100000 : 0.5;\n\tconst narrowW = w * (1 - Math.max(0, Math.min(adjRatio, 1))) * 0.3;\n\tconst lineW = narrowW + t * (w - narrowW);\n\tconst xStart = (w - lineW) / 2;\n\tconst yBase = h * (0.1 + t * 0.8);\n\treturn `M ${xStart},${yBase} L ${xStart + lineW},${yBase}`;\n}\n\n/** Inverted triangle — top line full width, bottom line narrow. */\nfunction triangleInvertedPath(w: number, h: number, t: number, adj?: number): string {\n\tconst adjRatio = adj !== undefined ? adj / 100000 : 0.5;\n\tconst narrowW = w * (1 - Math.max(0, Math.min(adjRatio, 1))) * 0.3;\n\tconst lineW = w - t * (w - narrowW);\n\tconst xStart = (w - lineW) / 2;\n\tconst yBase = h * (0.1 + t * 0.8);\n\treturn `M ${xStart},${yBase} L ${xStart + lineW},${yBase}`;\n}\n\n/** Stop / octagon — lines narrow at top and bottom, widest in centre. */\nfunction stopPath(w: number, h: number, t: number, adj?: number): string {\n\tconst adjFactor = adj !== undefined ? adj / 25000 : 1;\n\tconst insetScale = clamp4(adjFactor);\n\tconst inset = w * 0.15 * (1 - (1 - 2 * Math.abs(t - 0.5)) ** 2) * insetScale;\n\tconst yBase = h * (0.1 + t * 0.8);\n\treturn `M ${inset},${yBase} L ${w - inset},${yBase}`;\n}\n\n/** Chevron — V-shape pointing down. */\nfunction chevronPath(w: number, h: number, t: number, adj?: number): string {\n\tconst yBase = h * (0.15 + t * 0.7);\n\tconst adjFactor = adj !== undefined ? adj / 25000 : 1;\n\tconst dip = h * 0.2 * (1 - t) * clamp4(adjFactor);\n\treturn `M 0,${yBase} L ${w / 2},${yBase + dip} L ${w},${yBase}`;\n}\n\n/** Inverted chevron — V-shape pointing up. */\nfunction chevronInvertedPath(w: number, h: number, t: number, adj?: number): string {\n\tconst yBase = h * (0.15 + t * 0.7);\n\tconst adjFactor = adj !== undefined ? adj / 25000 : 1;\n\tconst rise = h * 0.2 * t * clamp4(adjFactor);\n\treturn `M 0,${yBase} L ${w / 2},${yBase - rise} L ${w},${yBase}`;\n}\n\n/** Inflate bottom only. */\nfunction inflateBottomPath(w: number, h: number, t: number, adj?: number): string {\n\tconst yBase = h * (0.15 + t * 0.7);\n\tconst adjFactor = adj !== undefined ? adj / 18750 : 1;\n\tconst bulge = t > 0.4 ? h * 0.25 * ((t - 0.4) / 0.6) * clamp4(adjFactor) : 0;\n\treturn `M 0,${yBase} Q ${w / 2},${yBase + bulge} ${w},${yBase}`;\n}\n\n/** Inflate top only. */\nfunction inflateTopPath(w: number, h: number, t: number, adj?: number): string {\n\tconst yBase = h * (0.15 + t * 0.7);\n\tconst adjFactor = adj !== undefined ? adj / 18750 : 1;\n\tconst bulge = t < 0.6 ? h * 0.25 * ((0.6 - t) / 0.6) * clamp4(adjFactor) : 0;\n\treturn `M 0,${yBase} Q ${w / 2},${yBase - bulge} ${w},${yBase}`;\n}\n\n/** Deflate bottom only. */\nfunction deflateBottomPath(w: number, h: number, t: number, adj?: number): string {\n\tconst yBase = h * (0.15 + t * 0.7);\n\tconst adjFactor = adj !== undefined ? adj / 18750 : 1;\n\tconst pinch = t > 0.4 ? h * 0.2 * ((t - 0.4) / 0.6) * clamp4(adjFactor) : 0;\n\treturn `M 0,${yBase} Q ${w / 2},${yBase - pinch} ${w},${yBase}`;\n}\n\n/** Deflate top only. */\nfunction deflateTopPath(w: number, h: number, t: number, adj?: number): string {\n\tconst yBase = h * (0.15 + t * 0.7);\n\tconst adjFactor = adj !== undefined ? adj / 18750 : 1;\n\tconst pinch = t < 0.6 ? h * 0.2 * ((0.6 - t) / 0.6) * clamp4(adjFactor) : 0;\n\treturn `M 0,${yBase} Q ${w / 2},${yBase + pinch} ${w},${yBase}`;\n}\n\n// ── Priority 4 ──────────────────────────────────────────────────────────\n\n/** Slant up — baseline rises from left to right. */\nfunction slantUpPath(w: number, h: number, t: number, adj?: number): string {\n\tconst adjFactor = adj !== undefined ? adj / 55000 : 1;\n\tconst slant = 0.25 * clamp4(adjFactor);\n\tconst yMid = h * (0.175 + t * 0.55);\n\tconst yStart = yMid + (h * slant) / 2;\n\tconst yEnd = yMid - (h * slant) / 2;\n\treturn `M 0,${yStart} L ${w},${yEnd}`;\n}\n\n/** Slant down — baseline falls from left to right. */\nfunction slantDownPath(w: number, h: number, t: number, adj?: number): string {\n\tconst adjFactor = adj !== undefined ? adj / 55000 : 1;\n\tconst slant = 0.25 * clamp4(adjFactor);\n\tconst yMid = h * (0.175 + t * 0.55);\n\tconst yStart = yMid - (h * slant) / 2;\n\tconst yEnd = yMid + (h * slant) / 2;\n\treturn `M 0,${yStart} L ${w},${yEnd}`;\n}\n\n/** Fade right — text narrows towards the right (trapezoid). */\nfunction fadeRightPath(w: number, h: number, t: number, adj?: number): string {\n\tconst adjFactor = adj !== undefined ? adj / 50000 : 1;\n\tconst squeezeScale = clamp4(adjFactor);\n\tconst yLeft = h * (0.1 + t * 0.8);\n\tconst squeeze = 0.35 * (1 - 2 * t) * squeezeScale;\n\tconst yRight = h * (0.5 + squeeze * 0.4);\n\treturn `M 0,${yLeft} L ${w},${yRight}`;\n}\n\n/** Fade left — text narrows towards the left (trapezoid). */\nfunction fadeLeftPath(w: number, h: number, t: number, adj?: number): string {\n\tconst adjFactor = adj !== undefined ? adj / 50000 : 1;\n\tconst squeezeScale = clamp4(adjFactor);\n\tconst squeeze = 0.35 * (1 - 2 * t) * squeezeScale;\n\tconst yLeft = h * (0.5 + squeeze * 0.4);\n\tconst yRight = h * (0.1 + t * 0.8);\n\treturn `M 0,${yLeft} L ${w},${yRight}`;\n}\n\n/** Fade up — text narrows towards the top. */\nfunction fadeUpPath(w: number, h: number, t: number, adj?: number): string {\n\tconst adjFactor = adj !== undefined ? adj / 50000 : 1;\n\tconst taperScale = clamp4(adjFactor);\n\tconst narrowFraction = 1 - 0.7 * taperScale;\n\tconst narrowW = w * Math.max(0, narrowFraction);\n\tconst lineW = narrowW + t * (w - narrowW);\n\tconst xStart = (w - lineW) / 2;\n\tconst yBase = h * (0.1 + t * 0.8);\n\treturn `M ${xStart},${yBase} L ${xStart + lineW},${yBase}`;\n}\n\n/** Fade down — text narrows towards the bottom. */\nfunction fadeDownPath(w: number, h: number, t: number, adj?: number): string {\n\tconst adjFactor = adj !== undefined ? adj / 50000 : 1;\n\tconst taperScale = clamp4(adjFactor);\n\tconst narrowFraction = 1 - 0.7 * taperScale;\n\tconst narrowW = w * Math.max(0, narrowFraction);\n\tconst lineW = w - t * (w - narrowW);\n\tconst xStart = (w - lineW) / 2;\n\tconst yBase = h * (0.1 + t * 0.8);\n\treturn `M ${xStart},${yBase} L ${xStart + lineW},${yBase}`;\n}\n\n/** Arch up pour — hollowed arch upward. */\nfunction archUpPourPath(w: number, h: number, t: number, adj?: number): string {\n\tconst adjNorm = adj !== undefined ? Math.max(0, Math.min(adj / 21600000, 1)) : 0.5;\n\tconst maxArch = (0.7 * adjNorm) / 0.5;\n\tconst archH = h * Math.max(0, maxArch - t * 0.5);\n\tif (archH < 1) {\n\t\treturn `M 0,${h} L ${w},${h}`;\n\t}\n\treturn `M 0,${h} A ${w / 2},${archH} 0 0,1 ${w},${h}`;\n}\n\n/** Arch down pour — hollowed arch downward. */\nfunction archDownPourPath(w: number, h: number, t: number, adj?: number): string {\n\tconst adjNorm = adj !== undefined ? Math.max(0, Math.min(adj / 21600000, 1)) : 0.5;\n\tconst baseDepth = (0.2 * adjNorm) / 0.5;\n\tconst archH = h * (baseDepth + t * 0.5);\n\tif (archH < 1) {\n\t\treturn `M 0,0 L ${w},0`;\n\t}\n\treturn `M 0,0 A ${w / 2},${archH} 0 0,0 ${w},0`;\n}\n\n/** Circle pour — concentric ellipses with an inner gap. */\nfunction circlePourPath(w: number, h: number, t: number, adj?: number): string {\n\tconst cx = w / 2;\n\tconst cy = h / 2;\n\tconst adjNorm = adj !== undefined ? Math.max(0, Math.min(adj / 21600000, 1)) : 0.5;\n\tconst baseScale = 0.35 + Number(adjNorm);\n\tconst scale = Math.min(1, baseScale) - t * 0.45;\n\tconst rx = Math.max(1, (w / 2) * scale);\n\tconst ry = Math.max(1, (h / 2) * scale);\n\treturn (\n\t\t`M ${cx},${cy - ry} ` +\n\t\t`A ${rx},${ry} 0 1,1 ${cx},${cy + ry} ` +\n\t\t`A ${rx},${ry} 0 1,1 ${cx},${cy - ry}`\n\t);\n}\n\n/** Button pour — convex top / concave bottom with larger margins. */\nfunction buttonPourPath(w: number, h: number, t: number, adj?: number): string {\n\tconst yBase = h * (0.15 + t * 0.7);\n\tconst adjFactor = adj !== undefined ? adj / 18750 : 1;\n\tconst bulge = h * 0.12 * (1 - 2 * t) * clamp4(adjFactor);\n\treturn `M 0,${yBase} Q ${w / 2},${yBase - bulge} ${w},${yBase}`;\n}\n\n/** Deflate-inflate — pinched in centre top/bottom, expanded at edges. */\nfunction deflateInflatePath(w: number, h: number, t: number, adj?: number): string {\n\tconst yBase = h * (0.15 + t * 0.7);\n\tconst adjFactor = adj !== undefined ? adj / 18750 : 1;\n\tconst factor = Math.sin(t * Math.PI);\n\tconst bulge = h * 0.2 * (factor - 0.5) * clamp4(adjFactor);\n\treturn `M 0,${yBase} Q ${w / 2},${yBase - bulge} ${w},${yBase}`;\n}\n\n/** Deflate-inflate-deflate — triple oscillation. */\nfunction deflateInflateDeflatePath(w: number, h: number, t: number, adj?: number): string {\n\tconst yBase = h * (0.15 + t * 0.7);\n\tconst adjFactor = adj !== undefined ? adj / 18750 : 1;\n\tconst ampScale = clamp4(adjFactor);\n\tconst factor = Math.sin(t * Math.PI * 2);\n\tconst bulge = h * 0.15 * factor * ampScale;\n\tconst q1 = w / 3;\n\tconst q2 = (2 * w) / 3;\n\treturn (\n\t\t`M 0,${yBase} ` +\n\t\t`Q ${q1},${yBase - bulge} ${w / 2},${yBase} ` +\n\t\t`Q ${q2},${yBase + bulge} ${w},${yBase}`\n\t);\n}\n\n// ── Generator look-up table ─────────────────────────────────────────────\n\nexport const WARP_PATH_GENERATORS: Readonly<Record<string, WarpPathGenerator>> = {\n\ttextArchUp: archUpPath,\n\ttextArchDown: archDownPath,\n\ttextCircle: circlePath,\n\ttextWave1: wave1Path,\n\ttextInflate: inflatePath,\n\ttextDeflate: deflatePath,\n\ttextCurveUp: curveUpPath,\n\ttextCurveDown: curveDownPath,\n\ttextWave2: wave2Path,\n\ttextWave4: wave4Path,\n\ttextDoubleWave1: doubleWave1Path,\n\ttextCanUp: canUpPath,\n\ttextCanDown: canDownPath,\n\ttextButton: buttonPath,\n\ttextRingInside: ringInsidePath,\n\ttextRingOutside: ringOutsidePath,\n\ttextCascadeUp: cascadeUpPath,\n\ttextCascadeDown: cascadeDownPath,\n\ttextTriangle: trianglePath,\n\ttextTriangleInverted: triangleInvertedPath,\n\ttextStop: stopPath,\n\ttextChevron: chevronPath,\n\ttextChevronInverted: chevronInvertedPath,\n\ttextInflateBottom: inflateBottomPath,\n\ttextInflateTop: inflateTopPath,\n\ttextDeflateBottom: deflateBottomPath,\n\ttextDeflateTop: deflateTopPath,\n\ttextSlantUp: slantUpPath,\n\ttextSlantDown: slantDownPath,\n\ttextFadeRight: fadeRightPath,\n\ttextFadeLeft: fadeLeftPath,\n\ttextFadeUp: fadeUpPath,\n\ttextFadeDown: fadeDownPath,\n\ttextArchUpPour: archUpPourPath,\n\ttextArchDownPour: archDownPourPath,\n\ttextCirclePour: circlePourPath,\n\ttextButtonPour: buttonPourPath,\n\ttextDeflateInflate: deflateInflatePath,\n\ttextDeflateInflateDeflate: deflateInflateDeflatePath,\n};\n\n// ── Public API ──────────────────────────────────────────────────────────\n\n/** Returns `true` when the preset should use SVG `<textPath>` rendering. */\nexport function shouldUseSvgWarp(preset: PptxTextWarpPreset | undefined): boolean {\n\tif (!preset || preset === 'textNoShape' || preset === 'textPlain') {\n\t\treturn false;\n\t}\n\treturn SVG_WARP_PRESETS.has(preset);\n}\n\n/**\n * Predicate: does this element carry a WordArt/text-warp preset that the SVG\n * `<textPath>` renderer should handle? The warp field lives on\n * `element.textStyle.textWarpPreset`.\n */\nexport function hasTextWarp(element: PptxElement): boolean {\n\tif (!hasTextProperties(element)) {\n\t\treturn false;\n\t}\n\treturn shouldUseSvgWarp(element.textStyle?.textWarpPreset);\n}\n\n/**\n * Build the SVG path `d` attribute for a warp preset at a given line position.\n *\n * @param preset OOXML `prstTxWarp` preset name.\n * @param width Box width in px.\n * @param height Box height in px.\n * @param lineIndex Zero-based index of the line/paragraph.\n * @param lineCount Total number of lines/paragraphs.\n * @param adj Optional primary adjustment (raw OOXML 1/60000th units).\n * @param adj2 Optional secondary adjustment (raw OOXML 1/60000th units).\n */\nexport function buildWarpPath(\n\tpreset: PptxTextWarpPreset,\n\twidth: number,\n\theight: number,\n\tlineIndex: number,\n\tlineCount: number,\n\tadj?: number,\n\tadj2?: number,\n): string {\n\tconst t = lineCount <= 1 ? 0.5 : lineIndex / (lineCount - 1);\n\tconst generator = WARP_PATH_GENERATORS[preset];\n\tif (generator) {\n\t\treturn generator(width, height, t, adj, adj2);\n\t}\n\tconst y = height * (0.2 + t * 0.6);\n\treturn `M 0,${y} L ${width},${y}`;\n}\n","/**\n * omml-to-mathml.ts — pure OMML → MathML conversion.\n *\n * Vue port of the React `viewer/utils/omml-to-mathml.ts` (+ its `omml-helpers`\n * and `omml-converters` split), consolidated into a single self-contained,\n * framework-agnostic module. No Vue/DOM dependencies.\n *\n * Converts Office MathML (OMML) XML objects — as parsed by fast-xml-parser\n * during PPTX load (attributes prefixed with `@_`) — into standard MathML\n * markup strings (`<math>…</math>`) that browsers render natively.\n *\n * `pptx-viewer-core` does NOT ship an OMML→MathML converter (its\n * `OmmlLatexConverter` only does OMML↔LaTeX), so this logic is ported here.\n */\n\nimport type { XmlObject } from 'pptx-viewer-core';\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\n/**\n * A parsed OMML node. Structurally a parsed-XML object: attributes live under\n * `@_`-prefixed keys, children under their (namespaced) tag name, text under\n * `#text` (or a collapsed bare string). Aliased to core's `XmlObject`.\n */\nexport type OmmlNode = XmlObject;\n\n/** Function that converts all children of an OMML container to MathML. */\ntype ChildrenConverter = (node: OmmlNode) => string;\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\n/** Safely retrieve a child node, always returning an object (never undefined). */\nfunction child(node: OmmlNode | undefined, key: string): OmmlNode {\n\tif (!node) {\n\t\treturn {};\n\t}\n\tconst v = node[key];\n\tif (v && typeof v === 'object' && !Array.isArray(v)) {\n\t\treturn v as OmmlNode;\n\t}\n\treturn {};\n}\n\n/** Ensure a value is an array of OmmlNode. */\nfunction ensureArray(value: OmmlNode[keyof OmmlNode]): OmmlNode[] {\n\tif (value === undefined || value === null) {\n\t\treturn [];\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn value as OmmlNode[];\n\t}\n\tif (typeof value === 'object') {\n\t\treturn [value as OmmlNode];\n\t}\n\treturn [];\n}\n\n/** Read a string attribute from a node. */\nfunction attr(node: OmmlNode | undefined, name: string): string {\n\tif (!node) {\n\t\treturn '';\n\t}\n\tconst v = node[`@_${name}`];\n\treturn typeof v === 'string' ? v : v !== undefined ? String(v) : '';\n}\n\n/** Read the `@_val` attribute (extremely common in OMML property nodes). */\nfunction val(node: OmmlNode | undefined): string {\n\treturn attr(node, 'val');\n}\n\n/** Escape angle brackets and ampersands for safe embedding in MathML. */\nfunction escapeXml(text: string): string {\n\treturn text.replace(/&/gu, '&').replace(/</gu, '<').replace(/>/gu, '>');\n}\n\n/** Read an `m:t` text run value (object/string/number) as a string. */\nfunction readText(node: OmmlNode): string {\n\tconst textNode = node['m:t'];\n\tif (typeof textNode === 'string') {\n\t\treturn textNode;\n\t}\n\tif (typeof textNode === 'number' || typeof textNode === 'boolean') {\n\t\treturn String(textNode);\n\t}\n\tif (textNode && typeof textNode === 'object' && !Array.isArray(textNode)) {\n\t\tconst inner = (textNode as OmmlNode)['#text'];\n\t\treturn typeof inner === 'string' ? inner : '';\n\t}\n\treturn '';\n}\n\n// ── Character classification ────────────────────────────────────────────────\n\n/** Set of characters treated as mathematical operators. */\nconst OPERATOR_CHARS = new Set([\n\t'+',\n\t'-',\n\t'−',\n\t'±',\n\t'∓',\n\t'×',\n\t'÷',\n\t'·',\n\t'=',\n\t'≠',\n\t'≈',\n\t'≡',\n\t'≤',\n\t'≥',\n\t'<',\n\t'>',\n\t'≪',\n\t'≫',\n\t'∈',\n\t'∉',\n\t'⊂',\n\t'⊃',\n\t'⊆',\n\t'⊇',\n\t'∪',\n\t'∩',\n\t'→',\n\t'←',\n\t'↔',\n\t'⇒',\n\t'⇐',\n\t'⇔',\n\t'∞',\n\t'∴',\n\t'∵',\n\t'∝',\n\t'∀',\n\t'∃',\n\t',',\n\t';',\n\t':',\n\t'!',\n\t'?',\n\t'.',\n\t'|',\n\t'/',\n\t'\\\\',\n\t\"'\",\n\t'(',\n\t')',\n\t'[',\n\t']',\n\t'{',\n\t'}',\n\t'⟨',\n\t'⟩',\n]);\n\nfunction isOperator(ch: string): boolean {\n\treturn OPERATOR_CHARS.has(ch.trim());\n}\n\nfunction isNumeric(text: string): boolean {\n\treturn /^[0-9]+(?:[.,][0-9]+)?$/u.test(text.trim());\n}\n\n// ── Unicode accent map (m:acc) ──────────────────────────────────────────────\n\nconst ACCENT_MAP: Record<string, string> = {\n\t'̂': '^', // combining circumflex → hat\n\t'̃': '~', // combining tilde\n\t'̄': '¯', // combining macron → bar\n\t'̅': '¯', // combining overline → bar\n\t'̇': '˙', // combining dot above\n\t'̈': '¨', // combining diaeresis\n\t'̌': 'ˇ', // combining caron\n\t'̲': '_', // combining underbar\n\t'⃗': '→', // combining right arrow above → →\n\t'^': '^',\n\t'~': '~',\n\t'¯': '¯',\n\t'˙': '˙',\n\t'¨': '¨',\n\tˇ: 'ˇ',\n};\n\n// ── Nary operator map ───────────────────────────────────────────────────────\n\nconst NARY_CHAR_MAP: Record<string, string> = {\n\t'∑': '∑', // ∑\n\t'∏': '∏', // ∏\n\t'∫': '∫', // ∫\n\t'∬': '∬', // ∬\n\t'∭': '∭', // ∭\n\t'∮': '∮', // ∮\n\t'∐': '∐', // ∐\n\t'⋀': '⋀', // ⋀\n\t'⋁': '⋁', // ⋁\n\t'⋂': '⋂', // ⋂\n\t'⋃': '⋃', // ⋃\n};\n\n// ── Delimiter bracket maps ──────────────────────────────────────────────────\n\nconst DELIM_BEGIN_MAP: Record<string, string> = {\n\t'(': '(',\n\t'[': '[',\n\t'{': '{',\n\t'|': '|',\n\t'‖': '‖',\n\t'⟨': '⟨',\n\t'⌈': '⌈',\n\t'⌊': '⌊',\n};\n\nconst DELIM_END_MAP: Record<string, string> = {\n\t')': ')',\n\t']': ']',\n\t'}': '}',\n\t'|': '|',\n\t'‖': '‖',\n\t'⟩': '⟩',\n\t'⌉': '⌉',\n\t'⌋': '⌋',\n};\n\n// ── Element converters ──────────────────────────────────────────────────────\n\n/** m:r — text run: classify as identifier, number, or operator. */\nfunction convertRun(node: OmmlNode): string {\n\tconst text = readText(node);\n\tif (text.length === 0) {\n\t\treturn '';\n\t}\n\n\tconst escaped = escapeXml(text);\n\tconst rPr = child(node, 'm:rPr');\n\tconst norVal = val(child(rPr, 'm:nor'));\n\tconst isNormal = norVal === '1' || norVal === 'on' || norVal === 'true';\n\n\tif (isNumeric(text)) {\n\t\treturn `<mn>${escaped}</mn>`;\n\t}\n\tif (isOperator(text)) {\n\t\treturn `<mo>${escaped}</mo>`;\n\t}\n\tif (isNormal) {\n\t\treturn `<mi mathvariant=\"normal\">${escaped}</mi>`;\n\t}\n\treturn `<mi>${escaped}</mi>`;\n}\n\n/** m:f — fraction. */\nfunction convertFraction(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst fPr = child(node, 'm:fPr');\n\tconst fracType = val(child(fPr, 'm:type'));\n\tconst num = `<mrow>${cc(child(node, 'm:num'))}</mrow>`;\n\tconst den = `<mrow>${cc(child(node, 'm:den'))}</mrow>`;\n\n\tif (fracType === 'lin') {\n\t\treturn `<mrow>${num}<mo>/</mo>${den}</mrow>`;\n\t}\n\tif (fracType === 'noBar') {\n\t\treturn `<mfrac linethickness=\"0\">${num}${den}</mfrac>`;\n\t}\n\treturn `<mfrac>${num}${den}</mfrac>`;\n}\n\n/** m:rad — radical: square root or nth root. */\nfunction convertRadical(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst radPr = child(node, 'm:radPr');\n\tconst degHide = val(child(radPr, 'm:degHide'));\n\tconst base = cc(child(node, 'm:e'));\n\tconst degree = cc(child(node, 'm:deg'));\n\n\tif (degHide === '1' || degHide === 'on' || degHide === 'true' || degree.length === 0) {\n\t\treturn `<msqrt><mrow>${base}</mrow></msqrt>`;\n\t}\n\treturn `<mroot><mrow>${base}</mrow><mrow>${degree}</mrow></mroot>`;\n}\n\n/** m:sSup — superscript. */\nfunction convertSuperscript(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst base = cc(child(node, 'm:e'));\n\tconst sup = cc(child(node, 'm:sup'));\n\treturn `<msup><mrow>${base}</mrow><mrow>${sup}</mrow></msup>`;\n}\n\n/** m:sSub — subscript. */\nfunction convertSubscript(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst base = cc(child(node, 'm:e'));\n\tconst sub = cc(child(node, 'm:sub'));\n\treturn `<msub><mrow>${base}</mrow><mrow>${sub}</mrow></msub>`;\n}\n\n/** m:sSubSup — simultaneous subscript and superscript. */\nfunction convertSubSup(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst base = cc(child(node, 'm:e'));\n\tconst sub = cc(child(node, 'm:sub'));\n\tconst sup = cc(child(node, 'm:sup'));\n\treturn `<msubsup><mrow>${base}</mrow><mrow>${sub}</mrow><mrow>${sup}</mrow></msubsup>`;\n}\n\n/** m:sPre — pre-sub-superscript (e.g. isotope notation). */\nfunction convertPreSubSup(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst base = cc(child(node, 'm:e'));\n\tconst sub = cc(child(node, 'm:sub'));\n\tconst sup = cc(child(node, 'm:sup'));\n\treturn `<mmultiscripts><mrow>${base}</mrow><mprescripts/><mrow>${sub}</mrow><mrow>${sup}</mrow></mmultiscripts>`;\n}\n\n/** m:nary — n-ary operator (sum, integral, product, etc.). */\nfunction convertNary(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst naryPr = child(node, 'm:naryPr');\n\tconst chrVal = val(child(naryPr, 'm:chr'));\n\tconst limLocVal = val(child(naryPr, 'm:limLoc'));\n\tconst subHide = val(child(naryPr, 'm:subHide'));\n\tconst supHide = val(child(naryPr, 'm:supHide'));\n\n\tconst operatorChar = chrVal ? NARY_CHAR_MAP[chrVal] || chrVal : '∫';\n\n\tconst sub = cc(child(node, 'm:sub'));\n\tconst sup = cc(child(node, 'm:sup'));\n\tconst base = cc(child(node, 'm:e'));\n\n\tconst showSub = subHide !== '1' && subHide !== 'on' && subHide !== 'true' && sub.length > 0;\n\tconst showSup = supHide !== '1' && supHide !== 'on' && supHide !== 'true' && sup.length > 0;\n\n\tlet result: string;\n\tif (showSub && showSup) {\n\t\tif (limLocVal === 'undOvr') {\n\t\t\tresult = `<munderover><mo>${escapeXml(operatorChar)}</mo><mrow>${sub}</mrow><mrow>${sup}</mrow></munderover>`;\n\t\t} else {\n\t\t\tresult = `<msubsup><mo>${escapeXml(operatorChar)}</mo><mrow>${sub}</mrow><mrow>${sup}</mrow></msubsup>`;\n\t\t}\n\t} else if (showSub) {\n\t\tif (limLocVal === 'undOvr') {\n\t\t\tresult = `<munder><mo>${escapeXml(operatorChar)}</mo><mrow>${sub}</mrow></munder>`;\n\t\t} else {\n\t\t\tresult = `<msub><mo>${escapeXml(operatorChar)}</mo><mrow>${sub}</mrow></msub>`;\n\t\t}\n\t} else if (showSup) {\n\t\tif (limLocVal === 'undOvr') {\n\t\t\tresult = `<mover><mo>${escapeXml(operatorChar)}</mo><mrow>${sup}</mrow></mover>`;\n\t\t} else {\n\t\t\tresult = `<msup><mo>${escapeXml(operatorChar)}</mo><mrow>${sup}</mrow></msup>`;\n\t\t}\n\t} else {\n\t\tresult = `<mo>${escapeXml(operatorChar)}</mo>`;\n\t}\n\n\treturn `<mrow>${result}<mrow>${base}</mrow></mrow>`;\n}\n\n/** m:d — delimiter (parentheses, brackets, pipes, etc.). */\nfunction convertDelimiter(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst dPr = child(node, 'm:dPr');\n\tconst begChrVal = val(child(dPr, 'm:begChr'));\n\tconst endChrVal = val(child(dPr, 'm:endChr'));\n\tconst sepChrVal = val(child(dPr, 'm:sepChr'));\n\n\tconst open = begChrVal.length > 0 ? begChrVal : '(';\n\tconst close = endChrVal.length > 0 ? endChrVal : ')';\n\tconst separator = sepChrVal.length > 0 ? sepChrVal : '';\n\n\tconst openChar = DELIM_BEGIN_MAP[open] || open;\n\tconst closeChar = DELIM_END_MAP[close] || close;\n\n\tconst elements = ensureArray(node['m:e']);\n\tconst parts: string[] = [];\n\tfor (let i = 0; i < elements.length; i++) {\n\t\tif (i > 0 && separator.length > 0) {\n\t\t\tparts.push(`<mo>${escapeXml(separator)}</mo>`);\n\t\t}\n\t\tparts.push(`<mrow>${cc(elements[i])}</mrow>`);\n\t}\n\n\tconst openMo = open ? `<mo>${escapeXml(openChar)}</mo>` : '<mo></mo>';\n\tconst closeMo = close ? `<mo>${escapeXml(closeChar)}</mo>` : '<mo></mo>';\n\n\treturn `<mrow>${openMo}${parts.join('')}${closeMo}</mrow>`;\n}\n\n/** m:m — matrix / array layout. */\nfunction convertMatrix(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst rows = ensureArray(node['m:mr']);\n\tconst tableRows: string[] = [];\n\n\tfor (const row of rows) {\n\t\tconst cells = ensureArray(row['m:e']);\n\t\tconst tdParts: string[] = [];\n\t\tfor (const cell of cells) {\n\t\t\ttdParts.push(`<mtd><mrow>${cc(cell)}</mrow></mtd>`);\n\t\t}\n\t\ttableRows.push(`<mtr>${tdParts.join('')}</mtr>`);\n\t}\n\n\treturn `<mrow><mo>[</mo><mtable>${tableRows.join('')}</mtable><mo>]</mo></mrow>`;\n}\n\n/** m:acc — accent mark (hat, bar, tilde, dot, etc.). */\nfunction convertAccent(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst accPr = child(node, 'm:accPr');\n\tconst chrVal = val(child(accPr, 'm:chr'));\n\tconst base = cc(child(node, 'm:e'));\n\n\tconst accentChar = chrVal.length > 0 ? ACCENT_MAP[chrVal] || chrVal : '̂';\n\n\treturn `<mover accent=\"true\"><mrow>${base}</mrow><mo>${escapeXml(accentChar)}</mo></mover>`;\n}\n\n/** m:bar — overbar or underbar. */\nfunction convertBar(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst barPr = child(node, 'm:barPr');\n\tconst posVal = val(child(barPr, 'm:pos'));\n\tconst base = cc(child(node, 'm:e'));\n\n\tif (posVal === 'bot') {\n\t\treturn `<munder><mrow>${base}</mrow><mo>¯</mo></munder>`;\n\t}\n\treturn `<mover><mrow>${base}</mrow><mo>¯</mo></mover>`;\n}\n\n/** m:limLow — lower limit. */\nfunction convertLimLow(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst base = cc(child(node, 'm:e'));\n\tconst lim = cc(child(node, 'm:lim'));\n\treturn `<munder><mrow>${base}</mrow><mrow>${lim}</mrow></munder>`;\n}\n\n/** m:limUpp — upper limit. */\nfunction convertLimUpp(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst base = cc(child(node, 'm:e'));\n\tconst lim = cc(child(node, 'm:lim'));\n\treturn `<mover><mrow>${base}</mrow><mrow>${lim}</mrow></mover>`;\n}\n\n/** m:groupChr — grouping character (brace under/over). */\nfunction convertGroupChr(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst grpPr = child(node, 'm:groupChrPr');\n\tconst chrVal = val(child(grpPr, 'm:chr'));\n\tconst posVal = val(child(grpPr, 'm:pos'));\n\tconst base = cc(child(node, 'm:e'));\n\n\tconst chr = chrVal.length > 0 ? chrVal : '⏟';\n\n\tif (posVal === 'top') {\n\t\treturn `<mover><mrow>${base}</mrow><mo>${escapeXml(chr)}</mo></mover>`;\n\t}\n\treturn `<munder><mrow>${base}</mrow><mo>${escapeXml(chr)}</mo></munder>`;\n}\n\n/** m:eqArr — equation array (aligned equations). */\nfunction convertEqArr(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst elements = ensureArray(node['m:e']);\n\tconst rows: string[] = [];\n\n\tfor (const el of elements) {\n\t\trows.push(`<mtr><mtd><mrow>${cc(el)}</mrow></mtd></mtr>`);\n\t}\n\n\treturn `<mtable columnalign=\"left\">${rows.join('')}</mtable>`;\n}\n\n/** m:box / m:borderBox — grouping box (transparent container). */\nfunction convertBox(node: OmmlNode, cc: ChildrenConverter): string {\n\treturn `<mrow>${cc(child(node, 'm:e'))}</mrow>`;\n}\n\n/** m:func — function application (sin, cos, log, lim, etc.). */\nfunction convertFunc(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst fName = cc(child(node, 'm:fName'));\n\tconst base = cc(child(node, 'm:e'));\n\treturn `<mrow>${fName}<mo>⁡</mo><mrow>${base}</mrow></mrow>`;\n}\n\n// ── Dispatch ────────────────────────────────────────────────────────────────\n\n/** Convert all child elements of an OMML container to MathML. */\nfunction convertChildren(node: OmmlNode): string {\n\tif (!node || typeof node !== 'object') {\n\t\treturn '';\n\t}\n\tconst parts: string[] = [];\n\n\tfor (const key of Object.keys(node)) {\n\t\tif (key.startsWith('@_')) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (key === 'm:oMathPara') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst items = ensureArray(node[key]);\n\t\tfor (const item of items) {\n\t\t\tconst result = convertElement(key, item);\n\t\t\tif (result) {\n\t\t\t\tparts.push(result);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn parts.join('');\n}\n\n/** Convert a single OMML element by tag name. */\nfunction convertElement(tag: string, node: OmmlNode): string {\n\tswitch (tag) {\n\t\tcase 'm:r':\n\t\t\treturn convertRun(node);\n\t\tcase 'm:f':\n\t\t\treturn convertFraction(node, convertChildren);\n\t\tcase 'm:rad':\n\t\t\treturn convertRadical(node, convertChildren);\n\t\tcase 'm:sSup':\n\t\t\treturn convertSuperscript(node, convertChildren);\n\t\tcase 'm:sSub':\n\t\t\treturn convertSubscript(node, convertChildren);\n\t\tcase 'm:sSubSup':\n\t\t\treturn convertSubSup(node, convertChildren);\n\t\tcase 'm:sPre':\n\t\t\treturn convertPreSubSup(node, convertChildren);\n\t\tcase 'm:nary':\n\t\t\treturn convertNary(node, convertChildren);\n\t\tcase 'm:d':\n\t\t\treturn convertDelimiter(node, convertChildren);\n\t\tcase 'm:m':\n\t\t\treturn convertMatrix(node, convertChildren);\n\t\tcase 'm:acc':\n\t\t\treturn convertAccent(node, convertChildren);\n\t\tcase 'm:bar':\n\t\t\treturn convertBar(node, convertChildren);\n\t\tcase 'm:limLow':\n\t\t\treturn convertLimLow(node, convertChildren);\n\t\tcase 'm:limUpp':\n\t\t\treturn convertLimUpp(node, convertChildren);\n\t\tcase 'm:groupChr':\n\t\t\treturn convertGroupChr(node, convertChildren);\n\t\tcase 'm:eqArr':\n\t\t\treturn convertEqArr(node, convertChildren);\n\t\tcase 'm:box':\n\t\t\treturn convertBox(node, convertChildren);\n\t\tcase 'm:borderBox':\n\t\t\treturn convertBox(node, convertChildren);\n\t\tcase 'm:func':\n\t\t\treturn convertFunc(node, convertChildren);\n\t\tcase 'm:oMath':\n\t\t\treturn `<mrow>${convertChildren(node)}</mrow>`;\n\t\tdefault:\n\t\t\t// TODO: defer exotic constructs (m:phant, m:sSubSupPr edge cases,\n\t\t\t// m:argPr scaling, etc.) — passthrough as empty for now.\n\t\t\treturn '';\n\t}\n}\n\n/** Locate all `m:oMath` root elements inside an OMML wrapper node. */\nfunction findOmathRoots(node: OmmlNode): OmmlNode[] {\n\tif (node['m:oMath']) {\n\t\treturn ensureArray(node['m:oMath']);\n\t}\n\tconst para = node['m:oMathPara'];\n\tif (para) {\n\t\tconst paraNode = Array.isArray(para) ? (para[0] as OmmlNode) : (para as OmmlNode);\n\t\tif (paraNode['m:oMath']) {\n\t\t\treturn ensureArray(paraNode['m:oMath']);\n\t\t}\n\t}\n\tif (node['m:r'] || node['m:f'] || node['m:rad'] || node['m:sSup'] || node['m:sSub']) {\n\t\treturn [node];\n\t}\n\treturn [];\n}\n\n// ── Public API ──────────────────────────────────────────────────────────────\n\n/**\n * Convert an OMML XML node (from fast-xml-parser) into a MathML string.\n *\n * Accepts the object at the `<a14:m>` / `<m:oMathPara>` level or directly at\n * `<m:oMath>`. Returns a `<math>` element string, or empty string if the input\n * is empty / unparseable.\n */\nexport function convertOmmlToMathMl(ommlNode: OmmlNode): string {\n\tif (!ommlNode || typeof ommlNode !== 'object') {\n\t\treturn '';\n\t}\n\n\tconst oMaths = findOmathRoots(ommlNode);\n\tif (oMaths.length === 0) {\n\t\treturn '';\n\t}\n\n\tconst innerParts = oMaths.map((om) => convertChildren(om));\n\tconst inner = innerParts.join('');\n\tif (inner.length === 0) {\n\t\treturn '';\n\t}\n\n\treturn `<math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"inline\">${inner}</math>`;\n}\n\n/**\n * Convenience alias used by the Vue viewer: `ommlToMathml(omml)`.\n *\n * Accepts the parsed OMML object (the shape stored on\n * {@link TextSegment.equationXml}) or a raw OMML markup string. String inputs\n * are not re-parsed here (no XML parser dependency in this pure module) — they\n * are returned wrapped so callers can still surface raw markup if needed.\n */\nexport function ommlToMathml(omml: OmmlNode | string): string {\n\tif (typeof omml === 'string') {\n\t\t// A bare string cannot be meaningfully walked without a parser; the\n\t\t// viewer always passes the parsed object. Return empty to stay pure.\n\t\treturn '';\n\t}\n\treturn convertOmmlToMathMl(omml);\n}\n","import type {\n\tPptxChartData,\n\tPptxChartSeries,\n\tPptxChartStyle,\n\tPptxChartAxisFormatting,\n} from 'pptx-viewer-core';\n\n/**\n * Framework-agnostic chart helpers — a focused Vue port of the React package's\n * `viewer/utils/chart-helpers.ts`, `chart-layout.ts`, and\n * `chart-style-palettes.ts`.\n *\n * Only the pieces the common-type renderers (bar / column / stacked / line /\n * area / pie / doughnut) and the shared chrome need are ported here. Advanced\n * features (log axes, secondary axes, display units, data tables, overlays)\n * are intentionally omitted — see the `// TODO(vue):` markers in\n * `ChartRenderer.vue`.\n *\n * These small pure helpers are an extraction candidate: long-term they (and\n * their React counterparts) should live in a shared, framework-agnostic\n * package so all three UI bindings reuse one implementation.\n */\n\n// ── Style palettes ───────────────────────────────────────────────\n\nconst ACCENT1 = '#4472C4';\nconst ACCENT2 = '#ED7D31';\nconst ACCENT3 = '#A5A5A5';\nconst ACCENT4 = '#FFC000';\nconst ACCENT5 = '#5B9BD5';\nconst ACCENT6 = '#70AD47';\n\nconst ACCENTS = [ACCENT1, ACCENT2, ACCENT3, ACCENT4, ACCENT5, ACCENT6];\n\n/** The default fallback palette used when no chart style is specified. */\nexport const DEFAULT_CHART_PALETTE: ReadonlyArray<string> = [\n\t'#3b82f6',\n\t'#22c55e',\n\t'#f97316',\n\t'#eab308',\n\t'#a855f7',\n\t'#ec4899',\n\t'#14b8a6',\n\t'#f43f5e',\n];\n\n/** Parse a hex colour string (#RRGGBB) into [r, g, b]. */\nfunction hexToRgb(hex: string): [number, number, number] {\n\tconst h = hex.replace('#', '');\n\treturn [\n\t\tparseInt(h.substring(0, 2), 16),\n\t\tparseInt(h.substring(2, 4), 16),\n\t\tparseInt(h.substring(4, 6), 16),\n\t];\n}\n\n/** Convert [r, g, b] back to #RRGGBB. */\nfunction rgbToHex(r: number, g: number, b: number): string {\n\tconst clamp = (v: number): number => Math.max(0, Math.min(255, Math.round(v)));\n\treturn `#${clamp(r).toString(16).padStart(2, '0')}${clamp(g)\n\t\t.toString(16)\n\t\t.padStart(2, '0')}${clamp(b).toString(16).padStart(2, '0')}`;\n}\n\n/** Apply a tint (lighten towards white). `amount` in [0, 1]. */\nfunction tint(hex: string, amount: number): string {\n\tconst [r, g, b] = hexToRgb(hex);\n\treturn rgbToHex(r + (255 - r) * amount, g + (255 - g) * amount, b + (255 - b) * amount);\n}\n\n/** Apply a shade (darken towards black). `amount` in [0, 1]. */\nfunction shade(hex: string, amount: number): string {\n\tconst [r, g, b] = hexToRgb(hex);\n\treturn rgbToHex(r * (1 - amount), g * (1 - amount), b * (1 - amount));\n}\n\nfunction colorfulSequential(offset: number): string[] {\n\tconst out: string[] = [];\n\tfor (let i = 0; i < 8; i++) {\n\t\tout.push(ACCENTS[(i + offset) % ACCENTS.length]);\n\t}\n\treturn out;\n}\n\nfunction monochromaticRamp(base: string): string[] {\n\treturn [\n\t\tshade(base, 0.5),\n\t\tshade(base, 0.35),\n\t\tshade(base, 0.15),\n\t\tbase,\n\t\ttint(base, 0.2),\n\t\ttint(base, 0.4),\n\t\ttint(base, 0.6),\n\t\ttint(base, 0.8),\n\t];\n}\n\nfunction colorfulVariant(offset: number, tintAmount: number): string[] {\n\treturn ACCENTS.map((_, i) => {\n\t\tconst idx = (i + offset) % ACCENTS.length;\n\t\treturn tintAmount > 0 ? tint(ACCENTS[idx], tintAmount) : shade(ACCENTS[idx], -tintAmount);\n\t}).concat([\n\t\ttint(ACCENTS[offset % ACCENTS.length], 0.4),\n\t\tshade(ACCENTS[(offset + 1) % ACCENTS.length], 0.2),\n\t]);\n}\n\nfunction darkPalette(offset: number, shadeAmount: number): string[] {\n\treturn colorfulSequential(offset).map((c) => shade(c, shadeAmount));\n}\n\nfunction tonedPalette(offset: number, tintAmount: number): string[] {\n\treturn colorfulSequential(offset).map((c) => tint(c, tintAmount));\n}\n\nfunction buildPalette(styleId: number): string[] {\n\tconst id = Math.max(1, Math.min(48, styleId));\n\tif (id <= 8) {\n\t\treturn colorfulSequential(id - 1);\n\t}\n\tif (id <= 16) {\n\t\tconst accentIdx = (id - 9) % ACCENTS.length;\n\t\treturn monochromaticRamp(ACCENTS[accentIdx]);\n\t}\n\tif (id <= 24) {\n\t\tconst sub = id - 17;\n\t\tconst tintAmt = sub < 4 ? sub * 0.1 : -(sub - 4) * 0.1;\n\t\treturn colorfulVariant(sub, tintAmt);\n\t}\n\tif (id <= 32) {\n\t\tconst sub = id - 25;\n\t\treturn darkPalette(sub, 0.25 + (sub % 4) * 0.1);\n\t}\n\tif (id <= 40) {\n\t\tconst sub = id - 33;\n\t\treturn tonedPalette(sub, 0.15 + (sub % 4) * 0.08);\n\t}\n\tconst sub = id - 41;\n\treturn tonedPalette(sub, 0.4 + (sub % 4) * 0.1);\n}\n\nconst paletteCache = new Map<number, string[]>();\n\n/**\n * Get the colour palette for a chart style index (1–48). Falls back to the\n * default palette when undefined or out of range.\n */\nexport function getChartStylePalette(styleId?: number): ReadonlyArray<string> {\n\tif (styleId === undefined || styleId < 1 || styleId > 48) {\n\t\treturn DEFAULT_CHART_PALETTE;\n\t}\n\tlet palette = paletteCache.get(styleId);\n\tif (!palette) {\n\t\tpalette = buildPalette(styleId);\n\t\tpaletteCache.set(styleId, palette);\n\t}\n\treturn palette;\n}\n\n/** Resolve a series colour: explicit colour → parsed palette → style palette. */\nexport function seriesColor(\n\tseries: PptxChartSeries,\n\tindex: number,\n\tstyleId?: number,\n\tcolorPalette?: string[],\n): string {\n\tif (series.color) {\n\t\treturn series.color;\n\t}\n\tif (colorPalette && colorPalette.length > 0) {\n\t\treturn colorPalette[index % colorPalette.length];\n\t}\n\tconst palette = getChartStylePalette(styleId);\n\treturn palette[index % palette.length];\n}\n\n/** Palette colour for an index with no series object (e.g. per-slice pie colouring). */\nexport function paletteColor(index: number, styleId?: number, colorPalette?: string[]): string {\n\tif (colorPalette && colorPalette.length > 0) {\n\t\treturn colorPalette[index % colorPalette.length];\n\t}\n\tconst palette = getChartStylePalette(styleId);\n\treturn palette[index % palette.length];\n}\n\n// ── Value range ──────────────────────────────────────────────────\n\nexport interface ValueRange {\n\tmin: number;\n\tmax: number;\n\tspan: number;\n}\n\n/** Compute a Y-axis range that always includes zero. */\nexport function computeValueRange(series: ReadonlyArray<PptxChartSeries>): ValueRange {\n\tconst allValues = series.flatMap((s) => s.values);\n\tif (allValues.length === 0) {\n\t\treturn { min: 0, max: 1, span: 1 };\n\t}\n\tconst dataMin = Math.min(...allValues);\n\tconst dataMax = Math.max(...allValues);\n\tconst min = Math.min(dataMin, 0);\n\tconst max = Math.max(dataMax, 0);\n\tconst span = Math.max(max - min, 1);\n\treturn { min, max, span };\n}\n\n/** Map a data value to a Y pixel coordinate (top = max, bottom = min). */\nexport function valueToY(val: number, range: ValueRange, topY: number, bottomY: number): number {\n\tconst usable = bottomY - topY;\n\treturn bottomY - ((val - range.min) / range.span) * usable;\n}\n\n/** Compact axis-value formatting (1.2K / 3.4M / integer / one-decimal). */\nexport function formatAxisValue(val: number): string {\n\tif (Math.abs(val) >= 1_000_000) {\n\t\treturn `${(val / 1_000_000).toFixed(1)}M`;\n\t}\n\tif (Math.abs(val) >= 1_000) {\n\t\treturn `${(val / 1_000).toFixed(1)}K`;\n\t}\n\tif (Number.isInteger(val)) {\n\t\treturn String(val);\n\t}\n\treturn val.toFixed(1);\n}\n\n// ── Layout ───────────────────────────────────────────────────────\n\nexport interface PlotLayout {\n\tplotLeft: number;\n\tplotTop: number;\n\tplotRight: number;\n\tplotBottom: number;\n\tplotWidth: number;\n\tplotHeight: number;\n\tsvgWidth: number;\n\tsvgHeight: number;\n}\n\n/**\n * Compute the plot rectangle within the SVG, reserving room for axes, title,\n * and legend. Mirrors the React `computeLayout` (without the secondary-axis /\n * data-table extensions, which the deferred chart types would need).\n */\nexport function computeLayout(\n\telementWidth: number,\n\telementHeight: number,\n\tstyle: PptxChartStyle | undefined,\n\thasAxes: boolean,\n\tlegendPos: string,\n): PlotLayout {\n\tconst svgWidth = Math.max(320, elementWidth);\n\tconst svgHeight = Math.max(180, elementHeight);\n\tlet plotLeft = hasAxes ? 48 : 8;\n\tlet plotTop = 8;\n\tlet plotRight = svgWidth - 8;\n\tlet plotBottom = svgHeight - (hasAxes ? 24 : 8);\n\n\tif (style?.hasTitle) {\n\t\tplotTop += 20;\n\t}\n\tif (style?.hasLegend) {\n\t\tif (legendPos === 'b') {\n\t\t\tplotBottom -= 20;\n\t\t} else if (legendPos === 't') {\n\t\t\tplotTop += 20;\n\t\t} else if (legendPos === 'r') {\n\t\t\tplotRight -= 80;\n\t\t} else if (legendPos === 'l') {\n\t\t\tplotLeft += 80;\n\t\t}\n\t}\n\n\tconst pw = Math.max(plotRight - plotLeft, 1);\n\tconst ph = Math.max(plotBottom - plotTop, 1);\n\treturn {\n\t\tplotLeft,\n\t\tplotTop,\n\t\tplotRight: plotLeft + pw,\n\t\tplotBottom: plotTop + ph,\n\t\tplotWidth: pw,\n\t\tplotHeight: ph,\n\t\tsvgWidth,\n\t\tsvgHeight,\n\t};\n}\n\n// ── Derived helpers ──────────────────────────────────────────────\n\n/** Find the primary value-axis formatting (non-right, or first valAx). */\nexport function getPrimaryValueAxis(\n\taxes: PptxChartAxisFormatting[] | undefined,\n): PptxChartAxisFormatting | undefined {\n\tif (!axes) {\n\t\treturn undefined;\n\t}\n\treturn (\n\t\taxes.find((a) => a.axisType === 'valAx' && a.axPos !== 'r') ??\n\t\taxes.find((a) => a.axisType === 'valAx')\n\t);\n}\n\n/**\n * Resolve category labels for a chart: use the declared categories, otherwise\n * synthesise 1-based labels for the longest series.\n */\nexport function resolveCategoryLabels(chartData: PptxChartData): string[] {\n\tif (chartData.categories.length > 0) {\n\t\treturn chartData.categories;\n\t}\n\tconst longest = chartData.series.reduce((max, s) => Math.max(max, s.values.length), 0);\n\treturn Array.from({ length: longest }, (_, i) => String(i + 1));\n}\n","/**\n * `animation-css` — pure mapping from a core animation preset to CSS.\n *\n * Given a high-level {@link PptxElementAnimation} (an entrance / emphasis /\n * exit preset id plus `durationMs` / `delayMs`), this module produces the CSS\n * needed to play that effect:\n *\n * - {@link resolveAnimationCss} returns the `animation-name` plus an inline\n * `style` map (`animation-name` / `-duration` / `-delay` / `-fill-mode` /\n * `-timing-function`) to apply to the rendered element.\n * - {@link ANIMATION_KEYFRAMES_CSS} is the full set of `@keyframes`\n * definitions referenced by those animation names, ready to inject once via\n * a single `<style>` element.\n *\n * The {@link PptxElementAnimation} entrance / exit / emphasis fields carry a\n * {@link PptxAnimationPreset} string (e.g. `\"fadeIn\"`, `\"flyIn\"`, `\"spin\"`),\n * not the editor catalog `entr.N` ids — so this module maps those string\n * presets. Unknown / unmapped presets fall back to a sensible default (fade).\n *\n * This module is intentionally framework-light: it has no Vue imports and is a\n * pure function of its inputs, which keeps it trivially unit-testable and\n * reusable by the playback composable.\n *\n * @module composables/animation-css\n */\n\nimport type {\n\tPptxAnimationPreset,\n\tPptxAnimationTimingCurve,\n\tPptxElementAnimation,\n} from 'pptx-viewer-core';\n\n/**\n * The kind of effect a {@link PptxElementAnimation} is playing. Determines the\n * default CSS `animation-fill-mode` and the initial (pre-play) visibility.\n */\nexport type AnimationKind = 'entrance' | 'emphasis' | 'exit';\n\n/**\n * Result of mapping a {@link PptxElementAnimation} to CSS.\n */\nexport interface AnimationCssResult {\n\t/** The `@keyframes` name to reference (always present in {@link ANIMATION_KEYFRAMES_CSS}). */\n\tanimationName: string;\n\t/**\n\t * Inline CSS properties to apply to the element. Keys are kebab-case CSS\n\t * property names (`animation-name`, `animation-duration`, …) so the map can\n\t * be spread directly onto an element `style` object or serialised as-is.\n\t */\n\tstyle: Record<string, string>;\n\t/** Which effect bucket this animation belongs to. */\n\tkind: AnimationKind;\n}\n\n/** Prefix applied to every generated `@keyframes` name to avoid collisions. */\nconst KEYFRAME_PREFIX = 'pptx-vue';\n\n/** Fallback keyframe name used for unknown / unmapped presets. */\nconst FALLBACK_ENTRANCE = `${KEYFRAME_PREFIX}-fadeIn`;\nconst FALLBACK_EXIT = `${KEYFRAME_PREFIX}-fadeOut`;\nconst FALLBACK_EMPHASIS = `${KEYFRAME_PREFIX}-pulse`;\n\n/**\n * Default duration (ms) per effect kind, used when a preset omits `durationMs`.\n * Mirrors PowerPoint's typical defaults.\n */\nconst DEFAULT_DURATION_MS: Record<AnimationKind, number> = {\n\tentrance: 500,\n\temphasis: 1000,\n\texit: 500,\n};\n\n/**\n * CSS `animation-fill-mode` per effect kind. Entrance effects hold their final\n * state (`forwards`) so the element stays visible; emphasis effects return to\n * the base state (`none`); exit effects hold their hidden final state.\n */\nconst FILL_MODE: Record<AnimationKind, string> = {\n\tentrance: 'forwards',\n\temphasis: 'none',\n\texit: 'forwards',\n};\n\n/**\n * Maps a {@link PptxAnimationTimingCurve} to a CSS `animation-timing-function`.\n */\nfunction timingFunction(curve: PptxAnimationTimingCurve | undefined): string {\n\tswitch (curve) {\n\t\tcase 'linear':\n\t\t\treturn 'linear';\n\t\tcase 'ease-in':\n\t\t\treturn 'ease-in';\n\t\tcase 'ease-out':\n\t\t\treturn 'ease-out';\n\t\tcase 'ease':\n\t\t\treturn 'ease';\n\t\tdefault:\n\t\t\treturn 'ease';\n\t}\n}\n\n/**\n * Maps an entrance {@link PptxAnimationPreset} to a keyframe short-name (without\n * the {@link KEYFRAME_PREFIX}). Returns `undefined` for presets that aren't\n * entrance effects so callers can fall back.\n */\nfunction entranceKeyframe(preset: PptxAnimationPreset): string | undefined {\n\tswitch (preset) {\n\t\tcase 'appear':\n\t\t\treturn 'appear';\n\t\tcase 'fadeIn':\n\t\t\treturn 'fadeIn';\n\t\tcase 'flyIn':\n\t\t\treturn 'flyIn';\n\t\tcase 'zoomIn':\n\t\t\treturn 'zoomIn';\n\t\tcase 'bounceIn':\n\t\t\treturn 'bounceIn';\n\t\tcase 'wipeIn':\n\t\t\treturn 'wipeIn';\n\t\tcase 'splitIn':\n\t\t\treturn 'splitIn';\n\t\tcase 'dissolveIn':\n\t\t\treturn 'dissolveIn';\n\t\tcase 'wheelIn':\n\t\t\treturn 'wheelIn';\n\t\tcase 'blindsIn':\n\t\t\treturn 'blindsIn';\n\t\tcase 'boxIn':\n\t\t\treturn 'boxIn';\n\t\tcase 'floatIn':\n\t\t\treturn 'floatIn';\n\t\tcase 'riseUp':\n\t\t\treturn 'riseUp';\n\t\tcase 'swivel':\n\t\t\treturn 'swivel';\n\t\tcase 'expandIn':\n\t\t\treturn 'expandIn';\n\t\tcase 'checkerboardIn':\n\t\t\treturn 'checkerboardIn';\n\t\tcase 'flashIn':\n\t\t\treturn 'flashIn';\n\t\tcase 'peekIn':\n\t\t\treturn 'peekIn';\n\t\tcase 'randomBarsIn':\n\t\t\treturn 'randomBarsIn';\n\t\tcase 'spinnerIn':\n\t\t\treturn 'spinnerIn';\n\t\tcase 'growTurnIn':\n\t\t\treturn 'growTurnIn';\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\n/**\n * Maps an exit {@link PptxAnimationPreset} to a keyframe short-name.\n */\nfunction exitKeyframe(preset: PptxAnimationPreset): string | undefined {\n\tswitch (preset) {\n\t\tcase 'disappear':\n\t\t\treturn 'disappear';\n\t\tcase 'fadeOut':\n\t\t\treturn 'fadeOut';\n\t\tcase 'flyOut':\n\t\t\treturn 'flyOut';\n\t\tcase 'zoomOut':\n\t\t\treturn 'zoomOut';\n\t\tcase 'bounceOut':\n\t\t\treturn 'bounceOut';\n\t\tcase 'wipeOut':\n\t\t\treturn 'wipeOut';\n\t\tcase 'shrinkOut':\n\t\t\treturn 'shrinkOut';\n\t\tcase 'dissolveOut':\n\t\t\treturn 'dissolveOut';\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\n/**\n * Maps an emphasis {@link PptxAnimationPreset} to a keyframe short-name.\n */\nfunction emphasisKeyframe(preset: PptxAnimationPreset): string | undefined {\n\tswitch (preset) {\n\t\tcase 'spin':\n\t\t\treturn 'spin';\n\t\tcase 'pulse':\n\t\t\treturn 'pulse';\n\t\tcase 'colorWave':\n\t\t\treturn 'colorWave';\n\t\tcase 'bounce':\n\t\t\treturn 'bounce';\n\t\tcase 'flash':\n\t\t\treturn 'flash';\n\t\tcase 'growShrink':\n\t\t\treturn 'growShrink';\n\t\tcase 'teeter':\n\t\t\treturn 'teeter';\n\t\tcase 'transparency':\n\t\t\treturn 'transparency';\n\t\tcase 'boldFlash':\n\t\t\treturn 'boldFlash';\n\t\tcase 'wave':\n\t\t\treturn 'wave';\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\n/**\n * Determines the active effect kind + raw preset for an animation. Entrance\n * takes precedence over emphasis, which takes precedence over exit, matching\n * the order PowerPoint plays a single element's first effect.\n */\nfunction activeEffect(\n\tanimation: PptxElementAnimation,\n): { kind: AnimationKind; preset: PptxAnimationPreset } | undefined {\n\tif (animation.entrance && animation.entrance !== 'none') {\n\t\treturn { kind: 'entrance', preset: animation.entrance };\n\t}\n\tif (animation.emphasis && animation.emphasis !== 'none') {\n\t\treturn { kind: 'emphasis', preset: animation.emphasis };\n\t}\n\tif (animation.exit && animation.exit !== 'none') {\n\t\treturn { kind: 'exit', preset: animation.exit };\n\t}\n\treturn undefined;\n}\n\n/**\n * Resolves the prefixed keyframe name for a `(kind, preset)` pair, falling back\n * to the kind's default (fade for entrance/exit, pulse for emphasis) when the\n * preset isn't recognised.\n */\nfunction resolveKeyframeName(kind: AnimationKind, preset: PptxAnimationPreset): string {\n\tif (kind === 'entrance') {\n\t\tconst name = entranceKeyframe(preset);\n\t\treturn name ? `${KEYFRAME_PREFIX}-${name}` : FALLBACK_ENTRANCE;\n\t}\n\tif (kind === 'exit') {\n\t\tconst name = exitKeyframe(preset);\n\t\treturn name ? `${KEYFRAME_PREFIX}-${name}` : FALLBACK_EXIT;\n\t}\n\tconst name = emphasisKeyframe(preset);\n\treturn name ? `${KEYFRAME_PREFIX}-${name}` : FALLBACK_EMPHASIS;\n}\n\n/**\n * Maps a single {@link PptxElementAnimation} to the CSS required to play it.\n *\n * The returned {@link AnimationCssResult.style} map is suitable to spread onto\n * an element's inline style. The referenced `animation-name` is always one of\n * the keyframes contained in {@link ANIMATION_KEYFRAMES_CSS}.\n *\n * @example\n * ```ts\n * resolveAnimationCss({ elementId: \"t1\", entrance: \"fadeIn\", durationMs: 600 });\n * // => { animationName: \"pptx-vue-fadeIn\", kind: \"entrance\",\n * // style: { \"animation-name\": \"pptx-vue-fadeIn\", \"animation-duration\": \"600ms\", ... } }\n * ```\n */\nexport function resolveAnimationCss(\n\tanimation: PptxElementAnimation,\n): AnimationCssResult | undefined {\n\tconst effect = activeEffect(animation);\n\tif (!effect) {\n\t\treturn undefined;\n\t}\n\n\tconst { kind, preset } = effect;\n\tconst animationName = resolveKeyframeName(kind, preset);\n\tconst durationMs = animation.durationMs ?? DEFAULT_DURATION_MS[kind];\n\tconst delayMs = animation.delayMs ?? 0;\n\tconst fillMode = FILL_MODE[kind];\n\tconst timing = timingFunction(animation.timingCurve);\n\n\tconst repeat = animation.repeatCount;\n\tconst iterationCount =\n\t\trepeat === undefined ? '1' : repeat === Infinity ? 'infinite' : String(repeat);\n\n\tconst style: Record<string, string> = {\n\t\t'animation-name': animationName,\n\t\t'animation-duration': `${durationMs}ms`,\n\t\t'animation-delay': `${delayMs}ms`,\n\t\t'animation-timing-function': timing,\n\t\t'animation-fill-mode': fillMode,\n\t\t'animation-iteration-count': iterationCount,\n\t};\n\n\treturn { animationName, style, kind };\n}\n\n/**\n * Returns the inline style an element should carry *before* its entrance\n * animation plays — i.e. hidden. Emphasis / exit effects start from the\n * element's normal visible state, so they return an empty map.\n *\n * Useful for pre-seeding elements that have a pending entrance so they don't\n * flash visible for a frame before playback begins.\n */\nexport function initialHiddenStyle(animation: PptxElementAnimation): Record<string, string> {\n\tconst effect = activeEffect(animation);\n\tif (effect?.kind === 'entrance') {\n\t\treturn { opacity: '0' };\n\t}\n\treturn {};\n}\n\n// ==========================================================================\n// @keyframes definitions\n// ==========================================================================\n\n/**\n * All `@keyframes` blocks referenced by {@link resolveAnimationCss}. Inject this\n * once into a single `<style>` element in the presentation host. Every name is\n * prefixed with `pptx-vue-` to avoid collisions with host-page styles.\n */\nexport const ANIMATION_KEYFRAMES_CSS = `\n/* ── Entrance ── */\n@keyframes ${KEYFRAME_PREFIX}-appear {\n\tfrom { opacity: 0; }\n\tto { opacity: 1; }\n}\n@keyframes ${KEYFRAME_PREFIX}-fadeIn {\n\tfrom { opacity: 0; }\n\tto { opacity: 1; }\n}\n@keyframes ${KEYFRAME_PREFIX}-flyIn {\n\tfrom { opacity: 0; transform: translateY(40px); }\n\tto { opacity: 1; transform: translateY(0); }\n}\n@keyframes ${KEYFRAME_PREFIX}-zoomIn {\n\tfrom { opacity: 0; transform: scale(0.3); }\n\tto { opacity: 1; transform: scale(1); }\n}\n@keyframes ${KEYFRAME_PREFIX}-bounceIn {\n\t0% { opacity: 0; transform: scale(0.3); }\n\t50% { opacity: 1; transform: scale(1.08); }\n\t70% { transform: scale(0.95); }\n\t100% { opacity: 1; transform: scale(1); }\n}\n@keyframes ${KEYFRAME_PREFIX}-wipeIn {\n\tfrom { clip-path: inset(0 100% 0 0); opacity: 1; }\n\tto { clip-path: inset(0 0 0 0); opacity: 1; }\n}\n@keyframes ${KEYFRAME_PREFIX}-splitIn {\n\tfrom { clip-path: inset(50% 0 50% 0); opacity: 1; }\n\tto { clip-path: inset(0 0 0 0); opacity: 1; }\n}\n@keyframes ${KEYFRAME_PREFIX}-dissolveIn {\n\t0% { opacity: 0; filter: blur(8px); }\n\t100% { opacity: 1; filter: blur(0); }\n}\n@keyframes ${KEYFRAME_PREFIX}-wheelIn {\n\tfrom { opacity: 0; transform: rotate(-360deg) scale(0.5); }\n\tto { opacity: 1; transform: rotate(0deg) scale(1); }\n}\n@keyframes ${KEYFRAME_PREFIX}-blindsIn {\n\tfrom { clip-path: inset(0 0 100% 0); opacity: 1; }\n\tto { clip-path: inset(0 0 0 0); opacity: 1; }\n}\n@keyframes ${KEYFRAME_PREFIX}-boxIn {\n\tfrom { clip-path: inset(50% 50% 50% 50%); opacity: 1; }\n\tto { clip-path: inset(0 0 0 0); opacity: 1; }\n}\n@keyframes ${KEYFRAME_PREFIX}-floatIn {\n\tfrom { opacity: 0; transform: translateY(40px); }\n\tto { opacity: 1; transform: translateY(0); }\n}\n@keyframes ${KEYFRAME_PREFIX}-riseUp {\n\tfrom { opacity: 0; transform: translateY(60px); }\n\tto { opacity: 1; transform: translateY(0); }\n}\n@keyframes ${KEYFRAME_PREFIX}-swivel {\n\tfrom { opacity: 0; transform: rotateY(-90deg); }\n\tto { opacity: 1; transform: rotateY(0deg); }\n}\n@keyframes ${KEYFRAME_PREFIX}-expandIn {\n\tfrom { opacity: 0; transform: scale(0, 0); }\n\tto { opacity: 1; transform: scale(1, 1); }\n}\n@keyframes ${KEYFRAME_PREFIX}-checkerboardIn {\n\t0% { opacity: 0; }\n\t50% { opacity: 0.5; }\n\t100% { opacity: 1; }\n}\n@keyframes ${KEYFRAME_PREFIX}-flashIn {\n\t0% { opacity: 0; }\n\t25% { opacity: 1; }\n\t50% { opacity: 0; }\n\t75% { opacity: 1; }\n\t100% { opacity: 1; }\n}\n@keyframes ${KEYFRAME_PREFIX}-peekIn {\n\tfrom { clip-path: inset(100% 0 0 0); opacity: 1; }\n\tto { clip-path: inset(0 0 0 0); opacity: 1; }\n}\n@keyframes ${KEYFRAME_PREFIX}-randomBarsIn {\n\t0% { clip-path: inset(0 100% 0 0); opacity: 1; }\n\t30% { clip-path: inset(0 60% 0 0); opacity: 1; }\n\t60% { clip-path: inset(0 30% 0 0); opacity: 1; }\n\t100% { clip-path: inset(0 0 0 0); opacity: 1; }\n}\n@keyframes ${KEYFRAME_PREFIX}-spinnerIn {\n\tfrom { opacity: 0; transform: rotate(-720deg) scale(0.4); }\n\tto { opacity: 1; transform: rotate(0deg) scale(1); }\n}\n@keyframes ${KEYFRAME_PREFIX}-growTurnIn {\n\tfrom { opacity: 0; transform: rotate(-90deg) scale(0.4); }\n\tto { opacity: 1; transform: rotate(0deg) scale(1); }\n}\n\n/* ── Exit ── */\n@keyframes ${KEYFRAME_PREFIX}-disappear {\n\tfrom { opacity: 1; }\n\tto { opacity: 0; }\n}\n@keyframes ${KEYFRAME_PREFIX}-fadeOut {\n\tfrom { opacity: 1; }\n\tto { opacity: 0; }\n}\n@keyframes ${KEYFRAME_PREFIX}-flyOut {\n\tfrom { opacity: 1; transform: translateY(0); }\n\tto { opacity: 0; transform: translateY(40px); }\n}\n@keyframes ${KEYFRAME_PREFIX}-zoomOut {\n\tfrom { opacity: 1; transform: scale(1); }\n\tto { opacity: 0; transform: scale(0.3); }\n}\n@keyframes ${KEYFRAME_PREFIX}-bounceOut {\n\t0% { opacity: 1; transform: scale(1); }\n\t25% { transform: scale(1.08); }\n\t100% { opacity: 0; transform: scale(0.3); }\n}\n@keyframes ${KEYFRAME_PREFIX}-wipeOut {\n\tfrom { clip-path: inset(0 0 0 0); opacity: 1; }\n\tto { clip-path: inset(0 0 0 100%); opacity: 0; }\n}\n@keyframes ${KEYFRAME_PREFIX}-shrinkOut {\n\tfrom { opacity: 1; transform: scale(1); }\n\tto { opacity: 0; transform: scale(0); }\n}\n@keyframes ${KEYFRAME_PREFIX}-dissolveOut {\n\tfrom { opacity: 1; filter: blur(0); }\n\tto { opacity: 0; filter: blur(8px); }\n}\n\n/* ── Emphasis ── */\n@keyframes ${KEYFRAME_PREFIX}-spin {\n\tfrom { transform: rotate(0deg); }\n\tto { transform: rotate(360deg); }\n}\n@keyframes ${KEYFRAME_PREFIX}-pulse {\n\t0% { transform: scale(1); }\n\t25% { transform: scale(1.1); }\n\t50% { transform: scale(1); }\n\t75% { transform: scale(1.1); }\n\t100% { transform: scale(1); }\n}\n@keyframes ${KEYFRAME_PREFIX}-colorWave {\n\t0% { filter: hue-rotate(0deg); }\n\t50% { filter: hue-rotate(180deg); }\n\t100% { filter: hue-rotate(360deg); }\n}\n@keyframes ${KEYFRAME_PREFIX}-bounce {\n\t0% { transform: translateY(0); }\n\t20% { transform: translateY(-20px); }\n\t40% { transform: translateY(0); }\n\t60% { transform: translateY(-10px); }\n\t80% { transform: translateY(0); }\n\t100% { transform: translateY(0); }\n}\n@keyframes ${KEYFRAME_PREFIX}-flash {\n\t0% { opacity: 1; }\n\t25% { opacity: 0; }\n\t50% { opacity: 1; }\n\t75% { opacity: 0; }\n\t100% { opacity: 1; }\n}\n@keyframes ${KEYFRAME_PREFIX}-growShrink {\n\t0% { transform: scale(1); }\n\t50% { transform: scale(1.25); }\n\t100% { transform: scale(1); }\n}\n@keyframes ${KEYFRAME_PREFIX}-teeter {\n\t0% { transform: rotate(0deg); }\n\t25% { transform: rotate(5deg); }\n\t50% { transform: rotate(0deg); }\n\t75% { transform: rotate(-5deg); }\n\t100% { transform: rotate(0deg); }\n}\n@keyframes ${KEYFRAME_PREFIX}-transparency {\n\t0% { opacity: 1; }\n\t50% { opacity: 0.4; }\n\t100% { opacity: 1; }\n}\n@keyframes ${KEYFRAME_PREFIX}-boldFlash {\n\t0% { font-weight: inherit; }\n\t25% { font-weight: 900; }\n\t50% { font-weight: inherit; }\n\t75% { font-weight: 900; }\n\t100% { font-weight: inherit; }\n}\n@keyframes ${KEYFRAME_PREFIX}-wave {\n\t0% { transform: translateY(0); }\n\t25% { transform: translateY(-8px); }\n\t50% { transform: translateY(0); }\n\t75% { transform: translateY(8px); }\n\t100% { transform: translateY(0); }\n}\n`.trim();\n","/**\n * Pure geometry helpers for the align / distribute editor operations.\n *\n * These functions operate over a list of slide elements (anything carrying the\n * `{ id, x, y, width, height }` bounding-box fields of {@link PptxElement}) and\n * return a `Map` keyed by element `id` describing the *new* position(s) for the\n * elements that need to move. Elements that already sit on the target edge (or\n * the two outer-most elements during distribution) are still included with\n * their unchanged coordinate so callers can apply the whole map uniformly — the\n * map only ever contains the axis that the operation touches.\n *\n * The helpers are deliberately framework-agnostic: no DOM, no Vue reactivity,\n * no side effects. The host wires them into the editor by feeding the current\n * selection in and applying the returned `Map` via its element-transform\n * operation (one batched history entry per call).\n */\n\n/** Edge / centre that {@link alignElements} can snap a selection to. */\nexport type AlignEdge = 'left' | 'centerH' | 'right' | 'top' | 'middle' | 'bottom';\n\n/** Axis along which {@link distributeElements} evenly spaces a selection. */\nexport type DistributeAxis = 'horizontal' | 'vertical';\n\n/** New position for a single element. Only the affected axis is populated. */\nexport interface ElementPosition {\n\tx?: number;\n\ty?: number;\n}\n\n/**\n * The minimal bounding-box shape the helpers need. {@link PptxElement} already\n * satisfies this, but accepting the structural subset keeps the helpers usable\n * (and testable) with plain geometry objects too.\n */\nexport interface BoundingBoxElement {\n\tid: string;\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n}\n\n/**\n * Align every element in the selection to a shared edge (or centre line) of the\n * selection's overall bounding box.\n *\n * - `left` / `right` / `centerH` move elements horizontally (set `x`).\n * - `top` / `bottom` / `middle` move elements vertically (set `y`).\n *\n * The selection's bounding box is the union of all element boxes. A selection\n * of fewer than two elements has nothing to align against, so an empty map is\n * returned.\n *\n * @param elements - The selected elements.\n * @param edge - The edge / centre line to align to.\n * @returns A `Map<id, {x?, y?}>` of new positions (only the touched axis set).\n */\nexport function alignElements(\n\telements: readonly BoundingBoxElement[],\n\tedge: AlignEdge,\n): Map<string, ElementPosition> {\n\tconst result = new Map<string, ElementPosition>();\n\tif (elements.length < 2) {\n\t\treturn result;\n\t}\n\n\tconst minX = Math.min(...elements.map((e) => e.x));\n\tconst minY = Math.min(...elements.map((e) => e.y));\n\tconst maxX = Math.max(...elements.map((e) => e.x + e.width));\n\tconst maxY = Math.max(...elements.map((e) => e.y + e.height));\n\tconst centerX = (minX + maxX) / 2;\n\tconst centerY = (minY + maxY) / 2;\n\n\tfor (const el of elements) {\n\t\tswitch (edge) {\n\t\t\tcase 'left':\n\t\t\t\tresult.set(el.id, { x: minX });\n\t\t\t\tbreak;\n\t\t\tcase 'right':\n\t\t\t\tresult.set(el.id, { x: maxX - el.width });\n\t\t\t\tbreak;\n\t\t\tcase 'centerH':\n\t\t\t\tresult.set(el.id, { x: centerX - el.width / 2 });\n\t\t\t\tbreak;\n\t\t\tcase 'top':\n\t\t\t\tresult.set(el.id, { y: minY });\n\t\t\t\tbreak;\n\t\t\tcase 'bottom':\n\t\t\t\tresult.set(el.id, { y: maxY - el.height });\n\t\t\t\tbreak;\n\t\t\tcase 'middle':\n\t\t\t\tresult.set(el.id, { y: centerY - el.height / 2 });\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * Distribute a selection so the gaps between adjacent elements are equal,\n * pinning the two outer-most elements in place.\n *\n * Elements are ordered by their leading edge on the chosen axis. The free space\n * — total span minus the sum of element sizes — is divided evenly into the gaps\n * between consecutive elements, then each interior element's leading edge is\n * placed accordingly. The first and last elements keep their positions.\n *\n * Distribution needs at least three elements to be meaningful (two outer +\n * one interior to move); fewer returns an empty map.\n *\n * @param elements - The selected elements.\n * @param axis - `'horizontal'` distributes along `x`; `'vertical'` along `y`.\n * @returns A `Map<id, {x?, y?}>` of new positions (only the touched axis set).\n */\nexport function distributeElements(\n\telements: readonly BoundingBoxElement[],\n\taxis: DistributeAxis,\n): Map<string, ElementPosition> {\n\tconst result = new Map<string, ElementPosition>();\n\tif (elements.length < 3) {\n\t\treturn result;\n\t}\n\n\tconst horizontal = axis === 'horizontal';\n\tconst start = (e: BoundingBoxElement): number => (horizontal ? e.x : e.y);\n\tconst size = (e: BoundingBoxElement): number => (horizontal ? e.width : e.height);\n\n\tconst sorted = [...elements].sort((a, b) => start(a) - start(b));\n\tconst first = sorted[0]!;\n\tconst last = sorted[sorted.length - 1]!;\n\n\tconst span = start(last) + size(last) - start(first);\n\tconst totalSize = sorted.reduce((sum, e) => sum + size(e), 0);\n\tconst gap = (span - totalSize) / (sorted.length - 1);\n\n\tlet cursor = start(first);\n\tfor (const el of sorted) {\n\t\tconst pos = cursor;\n\t\tif (horizontal) {\n\t\t\tresult.set(el.id, { x: pos });\n\t\t} else {\n\t\t\tresult.set(el.id, { y: pos });\n\t\t}\n\t\tcursor += size(el) + gap;\n\t}\n\n\treturn result;\n}\n","/**\n * element-interaction — PURE geometry helpers for the editing interaction\n * overlay (drag / resize / rotate). No DOM, no Vue: everything here is plain\n * math so it can be unit-tested in isolation.\n *\n * Coordinate spaces\n * -----------------\n * - \"screen px\": raw pointer movement reported by `PointerEvent.clientX/Y`,\n * measured on the *scaled* slide canvas.\n * - \"element px\": the slide's own unscaled coordinate space, which is what\n * `PptxElement.x/y/width/height` use. To convert a screen delta into an\n * element delta you divide by the `zoom` (the canvas scale factor).\n *\n * Rotation handling\n * -----------------\n * When an element is rotated, its local axes are rotated too. A drag along the\n * screen X axis must therefore be projected onto the element's local axes\n * before being applied to width/height (resize) — but a plain *move* (drag of\n * the whole box) is unaffected by rotation because the box position is stored\n * axis-aligned. Resize math here rotates the screen delta into element-local\n * space, applies the per-handle resize, then leaves x/y as the new top-left of\n * the axis-aligned bounding box (matching the React implementation, which keeps\n * the resize math in element-local space via the element's CSS transform).\n */\nimport { MIN_ELEMENT_SIZE } from 'pptx-viewer-core';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Axis-aligned box in element (unscaled) coordinate space, plus rotation. */\nexport interface InteractionBox {\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n\t/** Degrees. Defaults to 0 when omitted. */\n\trotation?: number;\n}\n\n/** Result of a drag/resize/rotate computation. */\nexport interface BoxTransform {\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n\trotation: number;\n}\n\n/** The eight resize handles, named by compass direction. */\nexport type ResizeHandleId = 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w';\n\nexport const RESIZE_HANDLES: readonly ResizeHandleId[] = [\n\t'nw',\n\t'n',\n\t'ne',\n\t'e',\n\t'se',\n\t's',\n\t'sw',\n\t'w',\n] as const;\n\nexport interface Point {\n\tx: number;\n\ty: number;\n}\n\nexport interface ResizeOptions {\n\t/** Minimum width/height in element px. Defaults to `MIN_ELEMENT_SIZE`. */\n\tminSize?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst DEG_TO_RAD = Math.PI / 180;\nconst RAD_TO_DEG = 180 / Math.PI;\n\nfunction rotationOf(box: InteractionBox): number {\n\treturn box.rotation ?? 0;\n}\n\n/**\n * Rotate a screen-space delta into element-local space.\n *\n * Given a vector expressed in the canvas (screen) frame and the element's\n * rotation in degrees, return the same vector expressed in the element's local\n * (un-rotated) frame. This is the inverse rotation of `rotationDeg`.\n */\nexport function rotateDelta(dx: number, dy: number, rotationDeg: number): Point {\n\tif (!rotationDeg) {\n\t\treturn { x: dx, y: dy };\n\t}\n\tconst rad = -rotationDeg * DEG_TO_RAD;\n\tconst cos = Math.cos(rad);\n\tconst sin = Math.sin(rad);\n\treturn {\n\t\tx: dx * cos - dy * sin,\n\t\ty: dx * sin + dy * cos,\n\t};\n}\n\n/** Center point of a box in element coordinates. */\nexport function boxCenter(box: InteractionBox): Point {\n\treturn { x: box.x + box.width / 2, y: box.y + box.height / 2 };\n}\n\n// ---------------------------------------------------------------------------\n// Drag (move)\n// ---------------------------------------------------------------------------\n\n/**\n * Apply a screen-space pointer delta as a plain move of the whole box.\n *\n * Position is stored axis-aligned, so rotation does NOT affect a move — we only\n * scale the screen delta down by `zoom` to get element px.\n */\nexport function applyDragDelta(\n\tbox: InteractionBox,\n\tdxScreen: number,\n\tdyScreen: number,\n\tzoom: number,\n): BoxTransform {\n\tconst scale = zoom || 1;\n\treturn {\n\t\tx: box.x + dxScreen / scale,\n\t\ty: box.y + dyScreen / scale,\n\t\twidth: box.width,\n\t\theight: box.height,\n\t\trotation: rotationOf(box),\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// Resize\n// ---------------------------------------------------------------------------\n\n/**\n * Compute the new geometry for a resize drag on a given handle.\n *\n * `dxScreen`/`dyScreen` are the *total* pointer delta from the gesture start,\n * in screen px. They are scaled by `zoom` into element px and (when the element\n * is rotated) rotated into the element's local frame so the handle behaves\n * intuitively. The min-size clamp uses `opts.minSize` (default\n * `MIN_ELEMENT_SIZE`).\n *\n * The returned box keeps the element's `rotation` unchanged. x/y describe the\n * new axis-aligned top-left in element space; for rotated elements this matches\n * the React behaviour of resizing in local space under a CSS transform.\n */\nexport function applyResize(\n\tbox: InteractionBox,\n\thandle: ResizeHandleId,\n\tdxScreen: number,\n\tdyScreen: number,\n\tzoom: number,\n\topts: ResizeOptions = {},\n): BoxTransform {\n\tconst scale = zoom || 1;\n\tconst minSize = opts.minSize ?? MIN_ELEMENT_SIZE;\n\tconst rotation = rotationOf(box);\n\n\t// Screen delta -> element px -> element-local frame.\n\tconst local = rotateDelta(dxScreen / scale, dyScreen / scale, rotation);\n\tconst dx = local.x;\n\tconst dy = local.y;\n\n\tlet newX = box.x;\n\tlet newY = box.y;\n\tlet newW = box.width;\n\tlet newH = box.height;\n\n\tconst affectsLeft = handle === 'nw' || handle === 'w' || handle === 'sw';\n\tconst affectsRight = handle === 'ne' || handle === 'e' || handle === 'se';\n\tconst affectsTop = handle === 'nw' || handle === 'n' || handle === 'ne';\n\tconst affectsBottom = handle === 'sw' || handle === 's' || handle === 'se';\n\n\tif (affectsRight) {\n\t\tnewW = Math.max(minSize, box.width + dx);\n\t} else if (affectsLeft) {\n\t\tnewW = Math.max(minSize, box.width - dx);\n\t\tnewX = box.x + (box.width - newW);\n\t}\n\n\tif (affectsBottom) {\n\t\tnewH = Math.max(minSize, box.height + dy);\n\t} else if (affectsTop) {\n\t\tnewH = Math.max(minSize, box.height - dy);\n\t\tnewY = box.y + (box.height - newH);\n\t}\n\n\treturn { x: newX, y: newY, width: newW, height: newH, rotation };\n}\n\n// ---------------------------------------------------------------------------\n// Rotation\n// ---------------------------------------------------------------------------\n\n/**\n * Compute the rotation angle (degrees) for a pointer relative to a center.\n *\n * 0deg points straight up (the rotate handle sits above the element), matching\n * the screen \"up = -Y\" convention. The result is normalised to [0, 360).\n */\nexport function computeRotation(center: Point, pointer: Point): number {\n\tconst dx = pointer.x - center.x;\n\tconst dy = pointer.y - center.y;\n\t// atan2(dx, -dy): 0 when pointer is directly above center, increasing\n\t// clockwise (the visual direction of a positive CSS rotation).\n\tconst deg = Math.atan2(dx, -dy) * RAD_TO_DEG;\n\treturn ((deg % 360) + 360) % 360;\n}\n\n/**\n * Snap an angle to the nearest `step` degrees when within `tolerance`.\n * Used for Shift-to-snap rotation (e.g. step = 15). Returns the original angle\n * when no snap target is close enough.\n */\nexport function snapAngle(angleDeg: number, step = 15, tolerance = step / 2): number {\n\tconst nearest = Math.round(angleDeg / step) * step;\n\tif (Math.abs(angleDeg - nearest) <= tolerance) {\n\t\treturn ((nearest % 360) + 360) % 360;\n\t}\n\treturn angleDeg;\n}\n","/**\n * Framework-agnostic rendering & editing helpers shared by the React, Vue, and\n * Angular `pptx-viewer` bindings. Pure TypeScript (no framework imports) — each\n * binding consumes one copy instead of duplicating it.\n *\n * - geometry: `shape-geometry` (preset clip-path cascade over core).\n * - fills: `fill-style` (image/gradient/pattern/solid → CSS).\n * - effects: `visual-effects` (shadow/glow/reflection/DAG), `image-effects`.\n * - text: `text-warp` (WordArt paths), `omml-to-mathml` (equations).\n * - charts: `chart-helpers` (layout/palette/axis math).\n * - animation: `animation-css` (preset → CSS keyframes).\n * - editing: `element-align` (align/distribute), `element-interaction`\n * (drag/resize/rotate math).\n */\nexport * from './shape-geometry';\nexport * from './fill-style';\nexport * from './visual-effects';\nexport * from './image-effects';\nexport * from './text-warp';\nexport * from './omml-to-mathml';\nexport * from './chart-helpers';\nexport * from './animation-css';\nexport * from './element-align';\nexport * from './element-interaction';\n","/**\n * pptx-viewer-shared — framework-agnostic viewer logic shared by the\n * React (`pptx-viewer`), Vue (`pptx-vue-viewer`), and Angular\n * (`pptx-angular-viewer`) bindings.\n *\n * Everything exported here is pure TypeScript (no framework imports), so each\n * UI binding consumes one copy instead of duplicating it.\n *\n * Current surface:\n * - theme: ViewerTheme types, default palette, CSS-variable helpers.\n * - loader: load-pipeline helpers (media/image collection, guides).\n * - types: CanvasSize, CollaborationConfig, CollaborationRole.\n * - constants: scalar viewer defaults (canvas size, fallback colours).\n *\n * Roadmap (see packages/angular/PORTING.md and packages/vue/PORTING.md):\n * color resolution, geometry/clip-paths, connector routing, animation\n * timeline engine, table-merge math, morph matching, export data helpers.\n */\nexport * from './theme';\nexport * from './loader';\nexport * from './types';\nexport * from './constants';\nexport * from './render';\n","/**\n * Internal re-export of `pptx-viewer-shared`.\n *\n * `pptx-viewer-shared` is an INTERNAL, non-published package (`\"private\": true`).\n * Its source is vendored into `./shared-src` at build time by\n * `scripts/inline-shared.mjs` (a generated, git-ignored directory), so the\n * shared code compiles as part of THIS library and ships **inlined** in the\n * published FESM. As a result `pptx-viewer-shared` never appears in the\n * published `package.json`.\n *\n * All Angular sources import shared symbols from THIS barrel, never from the\n * bare `'pptx-viewer-shared'` specifier (which ng-packagr would externalize).\n */\nexport * from './shared-src/index';\n","import { InjectionToken } from '@angular/core';\nimport type { Provider } from '@angular/core';\n\nimport { themeToCssVars } from '../internal/shared';\nimport type { ViewerTheme } from '../internal/shared';\n\n/**\n * Theme system for the Angular PowerPoint viewer.\n *\n * Angular counterpart of the React `ViewerThemeProvider` / `useViewerTheme`\n * context and the Vue `provide`/`inject` theme provider. The `ViewerTheme`\n * type, default palette, and `themeToCssVars` helper are framework-agnostic\n * and live in `pptx-viewer-shared`.\n */\n\n/** DI token carrying the active `ViewerTheme` (or `undefined`). */\nexport const VIEWER_THEME = new InjectionToken<ViewerTheme | undefined>('PPTX_VIEWER_THEME');\n\n/**\n * Provide a `ViewerTheme` to a subtree.\n *\n * Typically you do **not** need this — passing a `theme` input to\n * `<pptx-viewer>` is sufficient. Use this to share a theme across multiple\n * viewers or a wider component subtree.\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [provideViewerTheme({ colors: { primary: '#6366f1' } })],\n * });\n * ```\n */\nexport function provideViewerTheme(theme: ViewerTheme | undefined): Provider {\n\treturn { provide: VIEWER_THEME, useValue: theme };\n}\n\n/**\n * Build an `[ngStyle]`-compatible map of CSS custom properties for a theme.\n * Returns an empty object when the theme contributes no variables.\n */\nexport function themeStyle(theme: ViewerTheme | undefined): Record<string, string> {\n\tif (!theme) {\n\t\treturn {};\n\t}\n\treturn themeToCssVars(theme);\n}\n","/**\n * Pure geometry helpers for aligning and distributing selected editor elements.\n *\n * No Angular imports, no DOM, no side effects — only data in, data out.\n * All inputs are treated as immutable.\n */\n\n/** Horizontal or vertical alignment mode. */\nexport type AlignMode = 'left' | 'centerH' | 'right' | 'top' | 'middle' | 'bottom';\n\n/** Axis along which to distribute spacing evenly. */\nexport type DistributeMode = 'horizontal' | 'vertical';\n\n/** An axis-aligned bounding box with a stable element id. */\nexport interface AlignBox {\n\tid: string;\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n}\n\n/** The partial position update for a single element. */\nexport interface PositionUpdate {\n\tx?: number;\n\ty?: number;\n}\n\n/**\n * Compute new positions to align every box to the group bounding box.\n *\n * Horizontal modes (`left`, `centerH`, `right`) return `{ x }`.\n * Vertical modes (`top`, `middle`, `bottom`) return `{ y }`.\n *\n * Returns an empty map when fewer than 2 boxes are supplied — there is\n * nothing to align with only one (or zero) selection members.\n */\nexport function computeAlign(\n\tboxes: readonly AlignBox[],\n\tmode: AlignMode,\n): Map<string, PositionUpdate> {\n\tif (boxes.length < 2) {\n\t\treturn new Map<string, PositionUpdate>();\n\t}\n\n\t// Group bounding box extents.\n\tlet groupLeft = boxes[0].x;\n\tlet groupTop = boxes[0].y;\n\tlet groupRight = boxes[0].x + boxes[0].width;\n\tlet groupBottom = boxes[0].y + boxes[0].height;\n\n\tfor (let i = 1; i < boxes.length; i++) {\n\t\tconst b = boxes[i];\n\t\tif (b.x < groupLeft) {\n\t\t\tgroupLeft = b.x;\n\t\t}\n\t\tif (b.y < groupTop) {\n\t\t\tgroupTop = b.y;\n\t\t}\n\t\tif (b.x + b.width > groupRight) {\n\t\t\tgroupRight = b.x + b.width;\n\t\t}\n\t\tif (b.y + b.height > groupBottom) {\n\t\t\tgroupBottom = b.y + b.height;\n\t\t}\n\t}\n\n\tconst groupCenterH = groupLeft + (groupRight - groupLeft) / 2;\n\tconst groupCenterV = groupTop + (groupBottom - groupTop) / 2;\n\n\tconst result = new Map<string, PositionUpdate>();\n\n\tfor (const box of boxes) {\n\t\tswitch (mode) {\n\t\t\tcase 'left': {\n\t\t\t\tconst newX = groupLeft;\n\t\t\t\tif (newX !== box.x) {\n\t\t\t\t\tresult.set(box.id, { x: newX });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'centerH': {\n\t\t\t\tconst newX = groupCenterH - box.width / 2;\n\t\t\t\tif (newX !== box.x) {\n\t\t\t\t\tresult.set(box.id, { x: newX });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'right': {\n\t\t\t\tconst newX = groupRight - box.width;\n\t\t\t\tif (newX !== box.x) {\n\t\t\t\t\tresult.set(box.id, { x: newX });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'top': {\n\t\t\t\tconst newY = groupTop;\n\t\t\t\tif (newY !== box.y) {\n\t\t\t\t\tresult.set(box.id, { y: newY });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'middle': {\n\t\t\t\tconst newY = groupCenterV - box.height / 2;\n\t\t\t\tif (newY !== box.y) {\n\t\t\t\t\tresult.set(box.id, { y: newY });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'bottom': {\n\t\t\t\tconst newY = groupBottom - box.height;\n\t\t\t\tif (newY !== box.y) {\n\t\t\t\t\tresult.set(box.id, { y: newY });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * Compute new positions to distribute boxes with equal gaps along an axis.\n *\n * The two extreme boxes (smallest and largest leading-edge coordinate) are\n * kept fixed; inner boxes are repositioned so the gaps between consecutive\n * boxes (sorted by position) are equal.\n *\n * `horizontal` distributes along X; `vertical` distributes along Y.\n *\n * Returns an empty map when fewer than 3 boxes are supplied — with only 2\n * boxes every arrangement already has exactly one gap, so there is nothing\n * to equalise.\n */\nexport function computeDistribute(\n\tboxes: readonly AlignBox[],\n\tmode: DistributeMode,\n): Map<string, PositionUpdate> {\n\tif (boxes.length < 3) {\n\t\treturn new Map<string, PositionUpdate>();\n\t}\n\n\tconst result = new Map<string, PositionUpdate>();\n\n\tif (mode === 'horizontal') {\n\t\t// Sort by left edge (x).\n\t\tconst sorted = boxes.slice().sort((a, b) => a.x - b.x);\n\n\t\tconst firstBox = sorted[0];\n\t\tconst lastBox = sorted[sorted.length - 1];\n\n\t\tconst spanStart = firstBox.x;\n\t\tconst spanEnd = lastBox.x + lastBox.width;\n\n\t\t// Total width consumed by all boxes.\n\t\tlet totalBoxWidth = 0;\n\t\tfor (const box of sorted) {\n\t\t\ttotalBoxWidth += box.width;\n\t\t}\n\n\t\tconst totalGapSpace = spanEnd - spanStart - totalBoxWidth;\n\t\tconst gapCount = sorted.length - 1;\n\t\tconst gap = totalGapSpace / gapCount;\n\n\t\tlet cursor = spanStart;\n\t\tfor (let i = 0; i < sorted.length; i++) {\n\t\t\tconst box = sorted[i];\n\t\t\tconst newX = cursor;\n\t\t\tif (newX !== box.x) {\n\t\t\t\tresult.set(box.id, { x: newX });\n\t\t\t}\n\t\t\tcursor += box.width + gap;\n\t\t}\n\t} else {\n\t\t// Vertical: sort by top edge (y).\n\t\tconst sorted = boxes.slice().sort((a, b) => a.y - b.y);\n\n\t\tconst firstBox = sorted[0];\n\t\tconst lastBox = sorted[sorted.length - 1];\n\n\t\tconst spanStart = firstBox.y;\n\t\tconst spanEnd = lastBox.y + lastBox.height;\n\n\t\tlet totalBoxHeight = 0;\n\t\tfor (const box of sorted) {\n\t\t\ttotalBoxHeight += box.height;\n\t\t}\n\n\t\tconst totalGapSpace = spanEnd - spanStart - totalBoxHeight;\n\t\tconst gapCount = sorted.length - 1;\n\t\tconst gap = totalGapSpace / gapCount;\n\n\t\tlet cursor = spanStart;\n\t\tfor (let i = 0; i < sorted.length; i++) {\n\t\t\tconst box = sorted[i];\n\t\t\tconst newY = cursor;\n\t\t\tif (newY !== box.y) {\n\t\t\t\tresult.set(box.id, { y: newY });\n\t\t\t}\n\t\t\tcursor += box.height + gap;\n\t\t}\n\t}\n\n\treturn result;\n}\n","/**\n * editor-history.ts — Generic undo/redo history stack.\n *\n * Framework-agnostic: no Angular, React, or any other framework imports.\n * Designed to be consumed by an Angular service (e.g. EditorStateService).\n *\n * ## Snapshot semantics (PRE-mutation model)\n *\n * `record(snapshot, label)` must be called with the snapshot taken BEFORE the\n * caller applies its mutation. The class never deep-clones values: the caller\n * is responsible for passing already-cloned / immutable snapshots so that\n * mutations to the live state do not retroactively corrupt stored history\n * entries.\n *\n * ## Example usage inside EditorStateService\n *\n * // before mutating:\n * this.history.record(this.currentSnapshot(), 'Move element');\n * // apply mutation to the live signal …\n *\n * // undo:\n * const result = this.history.undo(this.currentSnapshot());\n * if (result) this.applySnapshot(result.snapshot);\n *\n * // redo:\n * const result = this.history.redo(this.currentSnapshot());\n * if (result) this.applySnapshot(result.snapshot);\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface HistoryEntry<T> {\n\treadonly snapshot: T;\n\treadonly label: string;\n}\n\nexport interface UndoRedoResult<T> {\n\treadonly snapshot: T;\n\treadonly label: string;\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface EditorHistoryOptions {\n\t/**\n\t * Maximum number of past entries kept on the undo stack.\n\t * When exceeded, the oldest entry is silently dropped.\n\t * @default 100\n\t */\n\tmaxDepth?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Class\n// ---------------------------------------------------------------------------\n\n/**\n * Generic undo/redo history stack.\n *\n * `T` is the snapshot type; the caller decides what constitutes a snapshot\n * (e.g. `PptxSlide[]`, a plain state object, etc.).\n *\n * No deep-cloning is performed inside this class — the caller must pass\n * already-cloned snapshots.\n */\nexport class EditorHistory<T> {\n\tprivate readonly _maxDepth: number;\n\tprivate readonly _past: HistoryEntry<T>[] = [];\n\tprivate readonly _future: HistoryEntry<T>[] = [];\n\n\tconstructor(options?: EditorHistoryOptions) {\n\t\tthis._maxDepth = options?.maxDepth ?? 100;\n\t}\n\n\t// -- Getters --------------------------------------------------------------\n\n\t/** True when at least one undo step is available. */\n\tget canUndo(): boolean {\n\t\treturn this._past.length > 0;\n\t}\n\n\t/** True when at least one redo step is available. */\n\tget canRedo(): boolean {\n\t\treturn this._future.length > 0;\n\t}\n\n\t/**\n\t * Label of the most-recently recorded entry (the action that would be\n\t * undone on the next `undo()` call), or `undefined` when the stack is\n\t * empty.\n\t */\n\tget undoLabel(): string | undefined {\n\t\tif (this._past.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn this._past[this._past.length - 1].label;\n\t}\n\n\t/**\n\t * Label of the most-recently undone entry (the action that would be\n\t * redone on the next `redo()` call), or `undefined` when the redo stack\n\t * is empty.\n\t */\n\tget redoLabel(): string | undefined {\n\t\tif (this._future.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn this._future[this._future.length - 1].label;\n\t}\n\n\t/** Number of entries currently on the undo (past) stack. */\n\tget depth(): number {\n\t\treturn this._past.length;\n\t}\n\n\t// -- Mutations ------------------------------------------------------------\n\n\t/**\n\t * Push `snapshot` (taken **before** the caller's mutation) onto the undo\n\t * stack with the given `label`, then clear the redo stack.\n\t *\n\t * When the stack length exceeds `maxDepth`, the oldest entry is dropped.\n\t *\n\t * The caller must pass an already-cloned snapshot — this method does NOT\n\t * deep-clone.\n\t */\n\trecord(snapshot: T, label: string): void {\n\t\tthis._past.push({ snapshot, label });\n\n\t\tif (this._past.length > this._maxDepth) {\n\t\t\tthis._past.shift();\n\t\t}\n\n\t\t// New record always invalidates the redo stack.\n\t\tthis._future.length = 0;\n\t}\n\n\t/**\n\t * Undo the last recorded action.\n\t *\n\t * Pops the top of the past stack, pushes `current` onto the future stack\n\t * (so it can be redone), and returns the popped entry so the caller can\n\t * restore it.\n\t *\n\t * Returns `undefined` when there is nothing to undo (`canUndo === false`).\n\t *\n\t * The caller must pass an already-cloned snapshot for `current` — this\n\t * method does NOT deep-clone.\n\t */\n\tundo(current: T): UndoRedoResult<T> | undefined {\n\t\tconst entry = this._past.pop();\n\n\t\tif (entry === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tthis._future.push({ snapshot: current, label: entry.label });\n\n\t\treturn { snapshot: entry.snapshot, label: entry.label };\n\t}\n\n\t/**\n\t * Redo the last undone action.\n\t *\n\t * Pops the top of the future stack, pushes `current` back onto the past\n\t * stack, and returns the popped entry so the caller can restore it.\n\t *\n\t * Returns `undefined` when there is nothing to redo (`canRedo === false`).\n\t *\n\t * The caller must pass an already-cloned snapshot for `current` — this\n\t * method does NOT deep-clone.\n\t */\n\tredo(current: T): UndoRedoResult<T> | undefined {\n\t\tconst entry = this._future.pop();\n\n\t\tif (entry === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tthis._past.push({ snapshot: current, label: entry.label });\n\n\t\treturn { snapshot: entry.snapshot, label: entry.label };\n\t}\n\n\t/**\n\t * Clear both the undo and redo stacks, resetting history to an empty\n\t * state.\n\t */\n\tclear(): void {\n\t\tthis._past.length = 0;\n\t\tthis._future.length = 0;\n\t}\n}\n","/**\n * element-operations — Pure array-transformation functions for slide elements.\n *\n * All functions are framework-agnostic (no Angular imports). Each takes a\n * `readonly PptxElement[]` representing the ordered element list for a slide\n * (array index 0 = back, last index = front/top in paint order) and returns a\n * NEW array — the input is never mutated.\n *\n * Callers supply a `newId` wherever a new element identity is needed, keeping\n * these functions deterministic and side-effect-free.\n *\n * Usage in an Angular service:\n * history.snapshot();\n * slides.update(s => replaceSlideElements(s, idx, ops(s[idx].elements, …)));\n */\n\nimport type { PptxElement } from 'pptx-viewer-core';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Smallest permitted width or height after a resize operation (in EMU or px). */\nconst MIN_ELEMENT_SIZE = 1;\n\n/** Default nudge offset applied when duplicating an element (same units as x/y). */\nconst DEFAULT_DUPLICATE_OFFSET = 20;\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Return a shallow copy of `el` with `patch` merged in, preserving the\n * discriminant `type` field even if `patch` accidentally carries a different\n * one (the cast is safe because we re-assert the original type).\n */\nfunction mergeElement(el: PptxElement, patch: Partial<PptxElement>): PptxElement {\n\treturn { ...el, ...patch, type: el.type } as PptxElement;\n}\n\n/**\n * Return a shallow copy of `elements` with every element unchanged except the\n * one whose `id === targetId`, which is replaced by `replacer(el)`.\n * If no element matches, the original array is returned (no allocation).\n */\nfunction mapById(\n\telements: readonly PptxElement[],\n\ttargetId: string,\n\treplacer: (el: PptxElement) => PptxElement,\n): PptxElement[] {\n\tlet matched = false;\n\tconst next = elements.map((el) => {\n\t\tif (el.id !== targetId) {\n\t\t\treturn el;\n\t\t}\n\t\tmatched = true;\n\t\treturn replacer(el);\n\t});\n\treturn matched ? next : (elements as PptxElement[]);\n}\n\n// ---------------------------------------------------------------------------\n// Exported pure operations\n// ---------------------------------------------------------------------------\n\n/**\n * Shallow-merge `patch` onto the element with `id`.\n * The discriminant `type` is always preserved from the original element.\n *\n * @example\n * updateElementById(elements, 'el1', { x: 50, hidden: true })\n */\nexport function updateElementById(\n\telements: readonly PptxElement[],\n\tid: string,\n\tpatch: Partial<PptxElement>,\n): PptxElement[] {\n\treturn mapById(elements, id, (el) => mergeElement(el, patch));\n}\n\n/**\n * Translate the element by `(dx, dy)` relative to its current position.\n *\n * @example\n * moveElementBy(elements, 'el1', 10, -5)\n */\nexport function moveElementBy(\n\telements: readonly PptxElement[],\n\tid: string,\n\tdx: number,\n\tdy: number,\n): PptxElement[] {\n\treturn mapById(elements, id, (el) => mergeElement(el, { x: el.x + dx, y: el.y + dy }));\n}\n\n/**\n * Set the absolute position of the element with `id`.\n *\n * @example\n * setElementPosition(elements, 'el1', 100, 200)\n */\nexport function setElementPosition(\n\telements: readonly PptxElement[],\n\tid: string,\n\tx: number,\n\ty: number,\n): PptxElement[] {\n\treturn mapById(elements, id, (el) => mergeElement(el, { x, y }));\n}\n\n/**\n * Set the size of the element with `id`, clamping both dimensions to at\n * least `MIN_ELEMENT_SIZE` (mirrors React's min-size guard).\n *\n * @example\n * resizeElement(elements, 'el1', 300, 150)\n */\nexport function resizeElement(\n\telements: readonly PptxElement[],\n\tid: string,\n\twidth: number,\n\theight: number,\n): PptxElement[] {\n\tconst w = Math.max(MIN_ELEMENT_SIZE, width);\n\tconst h = Math.max(MIN_ELEMENT_SIZE, height);\n\treturn mapById(elements, id, (el) => mergeElement(el, { width: w, height: h }));\n}\n\n/**\n * Remove all elements whose `id` is contained in `ids`.\n * Elements not in `ids` are returned in their original order.\n *\n * @example\n * deleteElementsByIds(elements, ['el1', 'el3'])\n */\nexport function deleteElementsByIds(\n\telements: readonly PptxElement[],\n\tids: readonly string[],\n): PptxElement[] {\n\tif (ids.length === 0) {\n\t\treturn elements as PptxElement[];\n\t}\n\tconst idSet = new Set<string>(ids);\n\treturn elements.filter((el) => !idSet.has(el.id));\n}\n\n/**\n * Insert a copy of the element with `id` at the end of the array, using\n * `newId` as the copy's identity. The copy is nudged by `offset` on both\n * axes so it does not exactly overlap the original.\n *\n * The caller is responsible for supplying a unique `newId` — keeping this\n * function pure and deterministic.\n *\n * @example\n * duplicateElementById(elements, 'el1', crypto.randomUUID(), 20)\n */\nexport function duplicateElementById(\n\telements: readonly PptxElement[],\n\tid: string,\n\tnewId: string,\n\toffset: number = DEFAULT_DUPLICATE_OFFSET,\n): PptxElement[] {\n\tconst source = elements.find((el) => el.id === id);\n\tif (source === undefined) {\n\t\treturn elements as PptxElement[];\n\t}\n\tconst copy: PptxElement = mergeElement(source, {\n\t\tid: newId,\n\t\tx: source.x + offset,\n\t\ty: source.y + offset,\n\t});\n\treturn [...elements, copy];\n}\n\n// ---------------------------------------------------------------------------\n// Z-order operations (array order = paint order: index 0 = back, last = front)\n// ---------------------------------------------------------------------------\n\n/**\n * Move the element with `id` to the end of the array (top/front in paint order).\n *\n * @example\n * bringToFront(elements, 'el1')\n */\nexport function bringToFront(elements: readonly PptxElement[], id: string): PptxElement[] {\n\tconst idx = elements.findIndex((el) => el.id === id);\n\tif (idx === -1 || idx === elements.length - 1) {\n\t\treturn elements as PptxElement[];\n\t}\n\tconst el = elements[idx];\n\tconst rest = elements.filter((_, i) => i !== idx);\n\treturn [...rest, el];\n}\n\n/**\n * Move the element with `id` to index 0 (bottom/back in paint order).\n *\n * @example\n * sendToBack(elements, 'el1')\n */\nexport function sendToBack(elements: readonly PptxElement[], id: string): PptxElement[] {\n\tconst idx = elements.findIndex((el) => el.id === id);\n\tif (idx === -1 || idx === 0) {\n\t\treturn elements as PptxElement[];\n\t}\n\tconst el = elements[idx];\n\tconst rest = elements.filter((_, i) => i !== idx);\n\treturn [el, ...rest];\n}\n\n/**\n * Swap the element with `id` with the element one position higher in the\n * array (one step toward the front/top). No-op if already at the top.\n *\n * @example\n * bringForward(elements, 'el1')\n */\nexport function bringForward(elements: readonly PptxElement[], id: string): PptxElement[] {\n\tconst idx = elements.findIndex((el) => el.id === id);\n\tif (idx === -1 || idx === elements.length - 1) {\n\t\treturn elements as PptxElement[];\n\t}\n\tconst next = [...elements];\n\tconst tmp = next[idx];\n\tnext[idx] = next[idx + 1];\n\tnext[idx + 1] = tmp;\n\treturn next;\n}\n\n/**\n * Swap the element with `id` with the element one position lower in the\n * array (one step toward the back/bottom). No-op if already at the bottom.\n *\n * @example\n * sendBackward(elements, 'el1')\n */\nexport function sendBackward(elements: readonly PptxElement[], id: string): PptxElement[] {\n\tconst idx = elements.findIndex((el) => el.id === id);\n\tif (idx === -1 || idx === 0) {\n\t\treturn elements as PptxElement[];\n\t}\n\tconst next = [...elements];\n\tconst tmp = next[idx];\n\tnext[idx] = next[idx - 1];\n\tnext[idx - 1] = tmp;\n\treturn next;\n}\n","/**\n * group-ops — Pure, immutable group/ungroup operations for the slide element tree.\n *\n * No Angular imports. No mutation of inputs. No `any` types.\n *\n * Coordinate system (verified from the renderer):\n * - The group <div> is positioned at (group.x, group.y) in slide space.\n * - Each child is positioned at (child.x, child.y) RELATIVE to the group's\n * top-left corner inside that div.\n *\n * Therefore:\n * - grouping → child slide-absolute → child group-relative:\n * childRelX = childAbsX - groupX\n * - ungrouping → child group-relative → child slide-absolute:\n * childAbsX = childRelX + groupX\n */\n\nimport type { GroupPptxElement, PptxElement } from 'pptx-viewer-core';\n\n// ---------------------------------------------------------------------------\n// Result types\n// ---------------------------------------------------------------------------\n\nexport interface GroupResult {\n\t/** New element array for the slide (same length - N + 1). */\n\telements: PptxElement[];\n\t/**\n\t * The id of the newly-created group element, or `null` when the operation\n\t * was a no-op (fewer than 2 matching ids found).\n\t */\n\tgroupId: string | null;\n}\n\nexport interface UngroupResult {\n\t/** New element array for the slide. */\n\telements: PptxElement[];\n\t/** The child ids that were actually applied (one per child, in order). */\n\tchildIds: string[];\n}\n\n// ---------------------------------------------------------------------------\n// groupElements\n// ---------------------------------------------------------------------------\n\n/**\n * Gather the elements whose `id` is in `ids` (preserving their existing array\n * order), compute the union bounding box, build a new `group` element whose\n * `children` are positioned relative to the group's top-left corner, remove\n * the originals, and insert the group where the topmost (lowest-index) grouped\n * element was.\n *\n * Requires ≥ 2 ids that actually exist in `elements`; otherwise returns the\n * original array unchanged and `groupId: null`.\n *\n * The caller supplies `groupId` for determinism (the service passes its\n * `newId()` result).\n */\nexport function groupElements(\n\telements: readonly PptxElement[],\n\tids: readonly string[],\n\tgroupId: string,\n): GroupResult {\n\t// Build a fast lookup set.\n\tconst idSet = new Set<string>(ids);\n\n\t// Collect matched elements in their existing array order, tracking the\n\t// index of the first (topmost in the array = furthest back in paint order)\n\t// matched element so we know where to insert the group.\n\tconst gathered: PptxElement[] = [];\n\tlet insertionIndex = -1;\n\n\tfor (let i = 0; i < elements.length; i++) {\n\t\tconst el = elements[i];\n\t\tif (idSet.has(el.id)) {\n\t\t\tgathered.push(el);\n\t\t\tif (insertionIndex === -1) {\n\t\t\t\tinsertionIndex = i;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Need at least 2 matched elements to form a meaningful group.\n\tif (gathered.length < 2) {\n\t\treturn { elements: [...elements], groupId: null };\n\t}\n\n\t// Compute the union bounding box in slide-absolute coordinates.\n\tlet minX = gathered[0].x;\n\tlet minY = gathered[0].y;\n\tlet maxX = gathered[0].x + gathered[0].width;\n\tlet maxY = gathered[0].y + gathered[0].height;\n\n\tfor (let i = 1; i < gathered.length; i++) {\n\t\tconst el = gathered[i];\n\t\tif (el.x < minX) {\n\t\t\tminX = el.x;\n\t\t}\n\t\tif (el.y < minY) {\n\t\t\tminY = el.y;\n\t\t}\n\t\tconst rx = el.x + el.width;\n\t\tconst ry = el.y + el.height;\n\t\tif (rx > maxX) {\n\t\t\tmaxX = rx;\n\t\t}\n\t\tif (ry > maxY) {\n\t\t\tmaxY = ry;\n\t\t}\n\t}\n\n\tconst groupX = minX;\n\tconst groupY = minY;\n\tconst groupWidth = maxX - minX;\n\tconst groupHeight = maxY - minY;\n\n\t// Convert each child to group-relative coordinates.\n\tconst children: PptxElement[] = gathered.map((el) => ({\n\t\t...el,\n\t\tx: el.x - groupX,\n\t\ty: el.y - groupY,\n\t}));\n\n\tconst group: GroupPptxElement = {\n\t\ttype: 'group',\n\t\tid: groupId,\n\t\tname: 'Group',\n\t\tx: groupX,\n\t\ty: groupY,\n\t\twidth: groupWidth,\n\t\theight: groupHeight,\n\t\tchildren,\n\t};\n\n\t// Build the new array: keep all non-grouped elements, insert the group at\n\t// the position where the first matched element was.\n\tconst remaining: PptxElement[] = elements.filter((el) => !idSet.has(el.id));\n\n\t// `insertionIndex` is the position in the *original* array. After removing\n\t// N grouped elements (all before or at that index minus those removed before\n\t// it), we need the adjusted position in `remaining`.\n\t// Count how many non-grouped elements appear before `insertionIndex`.\n\tlet adjustedIndex = 0;\n\tfor (let i = 0; i < insertionIndex; i++) {\n\t\tif (!idSet.has(elements[i].id)) {\n\t\t\tadjustedIndex++;\n\t\t}\n\t}\n\n\tconst result: PptxElement[] = [\n\t\t...remaining.slice(0, adjustedIndex),\n\t\tgroup,\n\t\t...remaining.slice(adjustedIndex),\n\t];\n\n\treturn { elements: result, groupId };\n}\n\n// ---------------------------------------------------------------------------\n// ungroupElements\n// ---------------------------------------------------------------------------\n\n/**\n * Find the group element identified by `groupId` in `elements`. If found and\n * it is a `group`, replace it in-place with its children, each converted back\n * to slide-absolute coordinates (childX + groupX, childY + groupY) and\n * assigned a fresh id from the `childIds` array (one per child, in order).\n *\n * If the element is not found or is not a group, returns the original inputs\n * unchanged.\n *\n * The caller supplies `childIds` for determinism (the service passes one\n * `newId()` result per child).\n */\nexport function ungroupElements(\n\telements: readonly PptxElement[],\n\tgroupId: string,\n\tchildIds: readonly string[],\n): UngroupResult {\n\tconst groupIndex = elements.findIndex((el) => el.id === groupId);\n\tif (groupIndex === -1) {\n\t\treturn { elements: [...elements], childIds: [] };\n\t}\n\n\tconst candidate = elements[groupIndex];\n\tif (candidate.type !== 'group') {\n\t\treturn { elements: [...elements], childIds: [] };\n\t}\n\n\tconst group = candidate;\n\tconst usedChildIds: string[] = [];\n\n\t// Convert each child from group-relative to slide-absolute coordinates and\n\t// assign the supplied child id.\n\tconst expanded: PptxElement[] = group.children.map((child, index) => {\n\t\tconst newChildId = childIds[index] ?? child.id;\n\t\tusedChildIds.push(newChildId);\n\t\treturn {\n\t\t\t...child,\n\t\t\tid: newChildId,\n\t\t\tx: child.x + group.x,\n\t\t\ty: child.y + group.y,\n\t\t};\n\t});\n\n\t// Splice the group out and spread the children in its place.\n\tconst result: PptxElement[] = [\n\t\t...elements.slice(0, groupIndex),\n\t\t...expanded,\n\t\t...elements.slice(groupIndex + 1),\n\t];\n\n\treturn { elements: result, childIds: usedChildIds };\n}\n","/**\n * EditorStateService — signal-based editing state for the Angular viewer.\n *\n * The Angular counterpart of React's `useEditorOperations` / `useViewerState`\n * editing layer: it holds an editable copy of the slides, the current\n * selection, and an undo/redo history, and exposes element operations that\n * record a history snapshot before each mutation.\n *\n * Pure logic is delegated to `element-operations.ts` (immutable array\n * transforms) and `editor-history.ts` (generic snapshot stack); this service\n * only wires them to Angular signals. Provide it at the component level:\n * `@Component({ providers: [EditorStateService] })`.\n */\n\nimport { computed, Injectable, signal } from '@angular/core';\nimport type { PptxElement, PptxSlide } from 'pptx-viewer-core';\n\nimport { computeAlign, computeDistribute } from './align-distribute';\nimport type { AlignMode, DistributeMode } from './align-distribute';\nimport { EditorHistory } from './editor-history';\nimport {\n\tbringForward,\n\tbringToFront,\n\tdeleteElementsByIds,\n\tduplicateElementById,\n\tmoveElementBy,\n\tresizeElement,\n\tsendBackward,\n\tsendToBack,\n\tsetElementPosition,\n\tupdateElementById,\n} from './element-operations';\nimport { groupElements, ungroupElements } from './group-ops';\n\n/** Default nudge distance (px) for arrow-key moves. */\nconst NUDGE_STEP = 1;\n/** Offset (px) applied to a duplicated element so it is visible. */\nconst DUPLICATE_OFFSET = 12;\n\n@Injectable()\nexport class EditorStateService {\n\tprivate readonly history = new EditorHistory<readonly PptxSlide[]>();\n\n\t/** The editable slide deck (a clone of the loaded presentation). */\n\treadonly slides = signal<readonly PptxSlide[]>([]);\n\t/** Ids of the currently selected elements (on the active slide). */\n\treadonly selectedIds = signal<readonly string[]>([]);\n\t/** Whether the deck has unsaved edits. */\n\treadonly dirty = signal(false);\n\n\treadonly canUndo = signal(false);\n\treadonly canRedo = signal(false);\n\treadonly undoLabel = signal<string | undefined>(undefined);\n\treadonly redoLabel = signal<string | undefined>(undefined);\n\n\treadonly hasSelection = computed(() => this.selectedIds().length > 0);\n\n\t/** Replace the editable deck (clones the source); resets selection + history. */\n\tsetSlides(slides: readonly PptxSlide[]): void {\n\t\tthis.slides.set(this.clone(slides));\n\t\tthis.selectedIds.set([]);\n\t\tthis.history.clear();\n\t\tthis.dirty.set(false);\n\t\tthis.syncHistory();\n\t}\n\n\t/** Current editable slides as a fresh (cloned) array. */\n\tsnapshot(): readonly PptxSlide[] {\n\t\treturn this.clone(this.slides());\n\t}\n\n\t// ── Selection ───────────────────────────────────────────────────────────\n\n\tselect(ids: readonly string[]): void {\n\t\tthis.selectedIds.set([...ids]);\n\t}\n\n\ttoggleSelect(id: string, additive: boolean): void {\n\t\tconst current = this.selectedIds();\n\t\tif (!additive) {\n\t\t\tthis.selectedIds.set(current.includes(id) && current.length === 1 ? [] : [id]);\n\t\t\treturn;\n\t\t}\n\t\tthis.selectedIds.set(current.includes(id) ? current.filter((x) => x !== id) : [...current, id]);\n\t}\n\n\tclearSelection(): void {\n\t\tthis.selectedIds.set([]);\n\t}\n\n\t/** Select every element on a slide. */\n\tselectAll(slideIndex: number): void {\n\t\tconst slide = this.slides()[slideIndex];\n\t\tif (slide) {\n\t\t\tthis.selectedIds.set(slide.elements.map((el) => el.id));\n\t\t}\n\t}\n\n\tisSelected(id: string): boolean {\n\t\treturn this.selectedIds().includes(id);\n\t}\n\n\t// ── Element operations (each records a history snapshot) ─────────────────\n\n\tmoveSelectedBy(slideIndex: number, dx: number, dy: number): void {\n\t\tconst ids = this.selectedIds();\n\t\tif (ids.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tthis.commit('Move', slideIndex, (els) =>\n\t\t\tids.reduce<PptxElement[]>((acc, id) => moveElementBy(acc, id, dx, dy), [...els]),\n\t\t);\n\t}\n\n\tnudgeSelected(slideIndex: number, dirX: number, dirY: number): void {\n\t\tthis.moveSelectedBy(slideIndex, dirX * NUDGE_STEP, dirY * NUDGE_STEP);\n\t}\n\n\tsetPosition(slideIndex: number, id: string, x: number, y: number): void {\n\t\tthis.commit('Move', slideIndex, (els) => setElementPosition(els, id, x, y));\n\t}\n\n\tresize(slideIndex: number, id: string, width: number, height: number): void {\n\t\tthis.commit('Resize', slideIndex, (els) => resizeElement(els, id, width, height));\n\t}\n\n\tupdateElement(slideIndex: number, id: string, patch: Partial<PptxElement>): void {\n\t\tthis.commit('Edit', slideIndex, (els) => updateElementById(els, id, patch));\n\t}\n\n\tdeleteSelected(slideIndex: number): void {\n\t\tconst ids = this.selectedIds();\n\t\tif (ids.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tthis.commit('Delete', slideIndex, (els) => deleteElementsByIds(els, ids));\n\t\tthis.selectedIds.set([]);\n\t}\n\n\tduplicateSelected(slideIndex: number): void {\n\t\tconst ids = this.selectedIds();\n\t\tif (ids.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst newIds: string[] = [];\n\t\tthis.commit('Duplicate', slideIndex, (els) =>\n\t\t\tids.reduce<PptxElement[]>(\n\t\t\t\t(acc, id) => {\n\t\t\t\t\tconst newId = this.newId();\n\t\t\t\t\tnewIds.push(newId);\n\t\t\t\t\treturn duplicateElementById(acc, id, newId, DUPLICATE_OFFSET);\n\t\t\t\t},\n\t\t\t\t[...els],\n\t\t\t),\n\t\t);\n\t\tthis.selectedIds.set(newIds);\n\t}\n\n\tbringSelectedToFront(slideIndex: number): void {\n\t\tthis.zOrder(slideIndex, 'Bring to front', bringToFront);\n\t}\n\tsendSelectedToBack(slideIndex: number): void {\n\t\tthis.zOrder(slideIndex, 'Send to back', sendToBack);\n\t}\n\tbringSelectedForward(slideIndex: number): void {\n\t\tthis.zOrder(slideIndex, 'Bring forward', bringForward);\n\t}\n\tsendSelectedBackward(slideIndex: number): void {\n\t\tthis.zOrder(slideIndex, 'Send backward', sendBackward);\n\t}\n\n\t// ── Interactive transform (drag / resize: one history entry per gesture) ──\n\n\t/** Record a single history snapshot at the start of a drag/resize gesture. */\n\tbeginTransform(label: string): void {\n\t\tthis.history.record(this.clone(this.slides()), label);\n\t\tthis.dirty.set(true);\n\t\tthis.syncHistory();\n\t}\n\n\t/**\n\t * Apply a live transform during a gesture WITHOUT recording history (the\n\t * gesture's snapshot was taken in {@link beginTransform}). Accepts any subset\n\t * of x/y/width/height.\n\t */\n\tapplyTransform(\n\t\tslideIndex: number,\n\t\tid: string,\n\t\tbox: { x?: number; y?: number; width?: number; height?: number; rotation?: number },\n\t): void {\n\t\tconst slides = this.slides();\n\t\tif (!slides[slideIndex]) {\n\t\t\treturn;\n\t\t}\n\t\tthis.slides.set(\n\t\t\tslides.map((slide, i) =>\n\t\t\t\ti === slideIndex\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...slide,\n\t\t\t\t\t\t\telements: updateElementById(slide.elements, id, box as Partial<PptxElement>),\n\t\t\t\t\t\t}\n\t\t\t\t\t: slide,\n\t\t\t),\n\t\t);\n\t}\n\n\t// ── Undo / redo ──────────────────────────────────────────────────────────\n\n\tundo(): void {\n\t\tconst result = this.history.undo(this.clone(this.slides()));\n\t\tif (result) {\n\t\t\tthis.slides.set(result.snapshot);\n\t\t\tthis.dirty.set(true);\n\t\t\tthis.selectedIds.set([]);\n\t\t\tthis.syncHistory();\n\t\t}\n\t}\n\n\tredo(): void {\n\t\tconst result = this.history.redo(this.clone(this.slides()));\n\t\tif (result) {\n\t\t\tthis.slides.set(result.snapshot);\n\t\t\tthis.dirty.set(true);\n\t\t\tthis.selectedIds.set([]);\n\t\t\tthis.syncHistory();\n\t\t}\n\t}\n\n\t// ── Align / distribute (multi-selection) ─────────────────────────────────\n\n\t/** Align the selected elements within their group bounds (one history entry). */\n\talignSelected(slideIndex: number, mode: AlignMode): void {\n\t\tthis.applyPositionMap(slideIndex, `Align ${mode}`, (boxes) => computeAlign(boxes, mode));\n\t}\n\n\t/** Evenly distribute the selected elements along an axis (one history entry). */\n\tdistributeSelected(slideIndex: number, mode: DistributeMode): void {\n\t\tthis.applyPositionMap(slideIndex, 'Distribute', (boxes) => computeDistribute(boxes, mode));\n\t}\n\n\tprivate applyPositionMap(\n\t\tslideIndex: number,\n\t\tlabel: string,\n\t\tcompute: (\n\t\t\tboxes: { id: string; x: number; y: number; width: number; height: number }[],\n\t\t) => Map<string, { x?: number; y?: number }>,\n\t): void {\n\t\tconst ids = new Set(this.selectedIds());\n\t\tconst slide = this.slides()[slideIndex];\n\t\tif (!slide) {\n\t\t\treturn;\n\t\t}\n\t\tconst boxes = slide.elements\n\t\t\t.filter((el) => ids.has(el.id))\n\t\t\t.map((el) => ({ id: el.id, x: el.x, y: el.y, width: el.width, height: el.height }));\n\t\tconst map = compute(boxes);\n\t\tif (map.size === 0) {\n\t\t\treturn;\n\t\t}\n\t\tthis.history.record(this.clone(this.slides()), label);\n\t\tthis.slides.set(\n\t\t\tthis.slides().map((s, i) =>\n\t\t\t\ti === slideIndex\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...s,\n\t\t\t\t\t\t\telements: s.elements.map((el) => {\n\t\t\t\t\t\t\t\tconst pos = map.get(el.id);\n\t\t\t\t\t\t\t\treturn pos ? { ...el, x: pos.x ?? el.x, y: pos.y ?? el.y } : el;\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t}\n\t\t\t\t\t: s,\n\t\t\t),\n\t\t);\n\t\tthis.dirty.set(true);\n\t\tthis.syncHistory();\n\t}\n\n\t// ── Group / ungroup ──────────────────────────────────────────────────────\n\n\t/** Group the selected elements into a single group element. */\n\tgroupSelected(slideIndex: number): void {\n\t\tconst ids = this.selectedIds();\n\t\tif (ids.length < 2) {\n\t\t\treturn;\n\t\t}\n\t\tconst slides = this.slides();\n\t\tconst slide = slides[slideIndex];\n\t\tif (!slide) {\n\t\t\treturn;\n\t\t}\n\t\tconst { elements, groupId } = groupElements(slide.elements, ids, this.newId());\n\t\tif (!groupId) {\n\t\t\treturn;\n\t\t}\n\t\tthis.history.record(this.clone(slides), 'Group');\n\t\tthis.slides.set(slides.map((s, i) => (i === slideIndex ? { ...s, elements } : s)));\n\t\tthis.selectedIds.set([groupId]);\n\t\tthis.dirty.set(true);\n\t\tthis.syncHistory();\n\t}\n\n\t/** Ungroup the single selected group back into its children. */\n\tungroupSelected(slideIndex: number): void {\n\t\tconst ids = this.selectedIds();\n\t\tif (ids.length !== 1) {\n\t\t\treturn;\n\t\t}\n\t\tconst slides = this.slides();\n\t\tconst slide = slides[slideIndex];\n\t\tif (!slide) {\n\t\t\treturn;\n\t\t}\n\t\tconst group = slide.elements.find((el) => el.id === ids[0]);\n\t\tif (!group || group.type !== 'group') {\n\t\t\treturn;\n\t\t}\n\t\tconst childIds = (group.children ?? []).map(() => this.newId());\n\t\tconst { elements, childIds: used } = ungroupElements(slide.elements, ids[0], childIds);\n\t\tthis.history.record(this.clone(slides), 'Ungroup');\n\t\tthis.slides.set(slides.map((s, i) => (i === slideIndex ? { ...s, elements } : s)));\n\t\tthis.selectedIds.set(used);\n\t\tthis.dirty.set(true);\n\t\tthis.syncHistory();\n\t}\n\n\t// ── Clipboard ──────────────────────────────────────────────────────────────\n\n\tprivate clipboard: PptxElement[] = [];\n\t/** Whether the clipboard holds copied elements (enables paste). */\n\treadonly hasClipboard = signal(false);\n\n\t/** Copy the selected elements to the in-memory clipboard. */\n\tcopySelected(slideIndex: number): void {\n\t\tconst ids = new Set(this.selectedIds());\n\t\tconst slide = this.slides()[slideIndex];\n\t\tif (!slide) {\n\t\t\treturn;\n\t\t}\n\t\tconst picked = slide.elements.filter((el) => ids.has(el.id));\n\t\tif (picked.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tthis.clipboard = this.clone(picked);\n\t\tthis.hasClipboard.set(true);\n\t}\n\n\t/** Copy then delete the selected elements. */\n\tcutSelected(slideIndex: number): void {\n\t\tthis.copySelected(slideIndex);\n\t\tthis.deleteSelected(slideIndex);\n\t}\n\n\t/** Paste clipboard elements onto a slide (offset + fresh ids) and select them. */\n\tpaste(slideIndex: number): void {\n\t\tif (this.clipboard.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst slides = this.slides();\n\t\tif (!slides[slideIndex]) {\n\t\t\treturn;\n\t\t}\n\t\tthis.history.record(this.clone(slides), 'Paste');\n\t\tconst newIds: string[] = [];\n\t\tconst additions = this.clipboard.map((el) => {\n\t\t\tconst id = this.newId();\n\t\t\tnewIds.push(id);\n\t\t\treturn { ...this.clone(el), id, x: el.x + 12, y: el.y + 12 };\n\t\t});\n\t\tthis.slides.set(\n\t\t\tslides.map((slide, i) =>\n\t\t\t\ti === slideIndex ? { ...slide, elements: [...slide.elements, ...additions] } : slide,\n\t\t\t),\n\t\t);\n\t\tthis.selectedIds.set(newIds);\n\t\tthis.dirty.set(true);\n\t\tthis.syncHistory();\n\t}\n\n\t// ── Element insertion ────────────────────────────────────────────────────\n\n\t/** Append a new element to a slide (records history) and select it. */\n\taddElement(slideIndex: number, element: PptxElement): void {\n\t\tconst slides = this.slides();\n\t\tif (!slides[slideIndex]) {\n\t\t\treturn;\n\t\t}\n\t\tconst withId: PptxElement = { ...element, id: element.id || this.newId() };\n\t\tthis.history.record(this.clone(slides), 'Insert');\n\t\tthis.slides.set(\n\t\t\tslides.map((slide, i) =>\n\t\t\t\ti === slideIndex ? { ...slide, elements: [...slide.elements, withId] } : slide,\n\t\t\t),\n\t\t);\n\t\tthis.selectedIds.set([withId.id]);\n\t\tthis.dirty.set(true);\n\t\tthis.syncHistory();\n\t}\n\n\t// ── Slide operations ─────────────────────────────────────────────────────\n\n\t/** Patch slide-level properties (background, notes, …); one history entry. */\n\tupdateSlide(slideIndex: number, patch: Partial<PptxSlide>): void {\n\t\tconst slides = this.slides();\n\t\tif (!slides[slideIndex]) {\n\t\t\treturn;\n\t\t}\n\t\tthis.history.record(this.clone(slides), 'Slide properties');\n\t\tthis.slides.set(slides.map((s, i) => (i === slideIndex ? { ...s, ...patch } : s)));\n\t\tthis.dirty.set(true);\n\t\tthis.syncHistory();\n\t}\n\n\t/** Insert a blank slide after `afterIndex` (records history). */\n\taddSlide(afterIndex: number): void {\n\t\tconst slides = this.slides();\n\t\tthis.history.record(this.clone(slides), 'Add slide');\n\t\tconst id = this.newId();\n\t\tconst blank = { id, rId: id, slideNumber: 0, elements: [] } as PptxSlide;\n\t\tconst next = [...slides];\n\t\tnext.splice(Math.min(afterIndex + 1, next.length), 0, blank);\n\t\tthis.slides.set(this.renumber(next));\n\t\tthis.selectedIds.set([]);\n\t\tthis.dirty.set(true);\n\t\tthis.syncHistory();\n\t}\n\n\t/** Delete a slide (keeps at least one; records history). */\n\tdeleteSlide(index: number): void {\n\t\tconst slides = this.slides();\n\t\tif (slides.length <= 1 || !slides[index]) {\n\t\t\treturn;\n\t\t}\n\t\tthis.history.record(this.clone(slides), 'Delete slide');\n\t\tthis.slides.set(this.renumber(slides.filter((_, i) => i !== index)));\n\t\tthis.selectedIds.set([]);\n\t\tthis.dirty.set(true);\n\t\tthis.syncHistory();\n\t}\n\n\t/** Duplicate a slide, inserting the copy after it (records history). */\n\tduplicateSlide(index: number): void {\n\t\tconst slides = this.slides();\n\t\tif (!slides[index]) {\n\t\t\treturn;\n\t\t}\n\t\tthis.history.record(this.clone(slides), 'Duplicate slide');\n\t\tconst id = this.newId();\n\t\tconst copy: PptxSlide = { ...this.clone(slides[index]), id, rId: id };\n\t\tconst next = [...slides];\n\t\tnext.splice(index + 1, 0, copy);\n\t\tthis.slides.set(this.renumber(next));\n\t\tthis.dirty.set(true);\n\t\tthis.syncHistory();\n\t}\n\n\t/** Reorder a slide from `from` to `to` (records history). */\n\tmoveSlide(from: number, to: number): void {\n\t\tconst slides = this.slides();\n\t\tif (from === to || !slides[from] || to < 0 || to >= slides.length) {\n\t\t\treturn;\n\t\t}\n\t\tthis.history.record(this.clone(slides), 'Move slide');\n\t\tconst next = [...slides];\n\t\tconst [moved] = next.splice(from, 1);\n\t\tnext.splice(to, 0, moved);\n\t\tthis.slides.set(this.renumber(next));\n\t\tthis.dirty.set(true);\n\t\tthis.syncHistory();\n\t}\n\n\t// ── Internals ────────────────────────────────────────────────────────────\n\n\tprivate renumber(slides: readonly PptxSlide[]): PptxSlide[] {\n\t\treturn slides.map((slide, i) => ({ ...slide, slideNumber: i + 1 }));\n\t}\n\n\tprivate zOrder(\n\t\tslideIndex: number,\n\t\tlabel: string,\n\t\top: (els: readonly PptxElement[], id: string) => PptxElement[],\n\t): void {\n\t\tconst ids = this.selectedIds();\n\t\tif (ids.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tthis.commit(label, slideIndex, (els) =>\n\t\t\tids.reduce<PptxElement[]>((acc, id) => op(acc, id), [...els]),\n\t\t);\n\t}\n\n\tprivate commit(\n\t\tlabel: string,\n\t\tslideIndex: number,\n\t\tmutate: (elements: readonly PptxElement[]) => PptxElement[],\n\t): void {\n\t\tconst slides = this.slides();\n\t\tconst target = slides[slideIndex];\n\t\tif (!target) {\n\t\t\treturn;\n\t\t}\n\t\t// Record the pre-mutation snapshot, then apply.\n\t\tthis.history.record(this.clone(slides), label);\n\t\tthis.slides.set(\n\t\t\tslides.map((slide, i) =>\n\t\t\t\ti === slideIndex ? { ...slide, elements: mutate(slide.elements) } : slide,\n\t\t\t),\n\t\t);\n\t\tthis.dirty.set(true);\n\t\tthis.syncHistory();\n\t}\n\n\tprivate syncHistory(): void {\n\t\tthis.canUndo.set(this.history.canUndo);\n\t\tthis.canRedo.set(this.history.canRedo);\n\t\tthis.undoLabel.set(this.history.undoLabel);\n\t\tthis.redoLabel.set(this.history.redoLabel);\n\t}\n\n\tprivate clone<T>(value: T): T {\n\t\treturn structuredClone(value);\n\t}\n\n\tprivate newId(): string {\n\t\tconst c = globalThis.crypto;\n\t\tif (c && typeof c.randomUUID === 'function') {\n\t\t\treturn `el-${c.randomUUID()}`;\n\t\t}\n\t\t// Fallback id (no crypto): index-free uniqueness via a monotonic counter.\n\t\tthis.idCounter += 1;\n\t\treturn `el-${this.idCounter}`;\n\t}\n\n\tprivate idCounter = 0;\n}\n","/**\n * editor-context-menu.component.ts — Right-click context menu for the Angular\n * PPTX editor.\n *\n * Selector: `pptx-editor-context-menu`\n *\n * Renders a small floating panel at (x, y) viewport coordinates, wired to\n * EditorStateService. Closes on:\n * - Escape key (via @HostListener)\n * - A pointerdown event whose target is outside this component's host element\n * (also via @HostListener — the very first outside-pointerdown that would\n * have opened the menu is guarded by Angular's own event-propagation order:\n * the host is mounted before the listener fires, so `!host.contains(target)`\n * is always correct without any extra first-event guard).\n *\n * Usage:\n * ```html\n * @if (canEdit() && contextMenu(); as m) {\n * <pptx-editor-context-menu\n * [x]=\"m.x\"\n * [y]=\"m.y\"\n * [slideIndex]=\"activeSlideIndex()\"\n * (closed)=\"contextMenu.set(null)\"\n * />\n * }\n * ```\n */\n\nimport {\n\tChangeDetectionStrategy,\n\tComponent,\n\tElementRef,\n\tHostListener,\n\tinject,\n\tinput,\n\toutput,\n} from '@angular/core';\n\nimport { EditorStateService } from './editor-state.service';\n\n@Component({\n\tselector: 'pptx-editor-context-menu',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplate: `\n\t\t<ul class=\"pptx-ctx__menu\" role=\"menu\" aria-label=\"Context menu\">\n\t\t\t<!-- ── Clipboard ─────────────────────────────────────────────────────── -->\n\t\t\t<li role=\"none\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ctx__item\"\n\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t[disabled]=\"!editor.hasSelection()\"\n\t\t\t\t\t(click)=\"onCut()\"\n\t\t\t\t>\n\t\t\t\t\tCut\n\t\t\t\t</button>\n\t\t\t</li>\n\t\t\t<li role=\"none\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ctx__item\"\n\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t[disabled]=\"!editor.hasSelection()\"\n\t\t\t\t\t(click)=\"onCopy()\"\n\t\t\t\t>\n\t\t\t\t\tCopy\n\t\t\t\t</button>\n\t\t\t</li>\n\t\t\t<li role=\"none\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ctx__item\"\n\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t[disabled]=\"!editor.hasClipboard()\"\n\t\t\t\t\t(click)=\"onPaste()\"\n\t\t\t\t>\n\t\t\t\t\tPaste\n\t\t\t\t</button>\n\t\t\t</li>\n\n\t\t\t<!-- ── Divider ───────────────────────────────────────────────────────── -->\n\t\t\t<li role=\"separator\" class=\"pptx-ctx__divider\"></li>\n\n\t\t\t<!-- ── Element actions ───────────────────────────────────────────────── -->\n\t\t\t<li role=\"none\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ctx__item\"\n\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t[disabled]=\"!editor.hasSelection()\"\n\t\t\t\t\t(click)=\"onDuplicate()\"\n\t\t\t\t>\n\t\t\t\t\tDuplicate\n\t\t\t\t</button>\n\t\t\t</li>\n\t\t\t<li role=\"none\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ctx__item pptx-ctx__item--danger\"\n\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t[disabled]=\"!editor.hasSelection()\"\n\t\t\t\t\t(click)=\"onDelete()\"\n\t\t\t\t>\n\t\t\t\t\tDelete\n\t\t\t\t</button>\n\t\t\t</li>\n\n\t\t\t<!-- ── Divider ───────────────────────────────────────────────────────── -->\n\t\t\t<li role=\"separator\" class=\"pptx-ctx__divider\"></li>\n\n\t\t\t<!-- ── Z-order ───────────────────────────────────────────────────────── -->\n\t\t\t<li role=\"none\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ctx__item\"\n\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t[disabled]=\"!editor.hasSelection()\"\n\t\t\t\t\t(click)=\"onBringToFront()\"\n\t\t\t\t>\n\t\t\t\t\tBring to Front\n\t\t\t\t</button>\n\t\t\t</li>\n\t\t\t<li role=\"none\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ctx__item\"\n\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t[disabled]=\"!editor.hasSelection()\"\n\t\t\t\t\t(click)=\"onSendToBack()\"\n\t\t\t\t>\n\t\t\t\t\tSend to Back\n\t\t\t\t</button>\n\t\t\t</li>\n\t\t\t<li role=\"none\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ctx__item\"\n\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t[disabled]=\"!editor.hasSelection()\"\n\t\t\t\t\t(click)=\"onBringForward()\"\n\t\t\t\t>\n\t\t\t\t\tBring Forward\n\t\t\t\t</button>\n\t\t\t</li>\n\t\t\t<li role=\"none\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ctx__item\"\n\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t[disabled]=\"!editor.hasSelection()\"\n\t\t\t\t\t(click)=\"onSendBackward()\"\n\t\t\t\t>\n\t\t\t\t\tSend Backward\n\t\t\t\t</button>\n\t\t\t</li>\n\t\t</ul>\n\t`,\n\tstyles: `\n\t\t:host {\n\t\t\tposition: fixed;\n\t\t\tleft: var(--pptx-ctx-x, 0px);\n\t\t\ttop: var(--pptx-ctx-y, 0px);\n\t\t\tz-index: 9000;\n\t\t\tdisplay: block;\n\t\t}\n\n\t\t.pptx-ctx__menu {\n\t\t\tlist-style: none;\n\t\t\tmargin: 0;\n\t\t\tpadding: 4px 0;\n\t\t\tmin-width: 160px;\n\t\t\tbackground: var(--pptx-ctx-bg, #252526);\n\t\t\tcolor: var(--pptx-ctx-fg, #e0e0e0);\n\t\t\tborder: 1px solid var(--pptx-ctx-border, #454545);\n\t\t\tborder-radius: 4px;\n\t\t\tbox-shadow:\n\t\t\t\t0 4px 12px rgba(0, 0, 0, 0.4),\n\t\t\t\t0 1px 3px rgba(0, 0, 0, 0.3);\n\t\t\tfont-size: 13px;\n\t\t\tuser-select: none;\n\t\t}\n\n\t\t.pptx-ctx__item {\n\t\t\tdisplay: block;\n\t\t\twidth: 100%;\n\t\t\tpadding: 5px 14px;\n\t\t\tbackground: transparent;\n\t\t\tborder: none;\n\t\t\tcolor: inherit;\n\t\t\ttext-align: left;\n\t\t\tcursor: pointer;\n\t\t\tfont-size: inherit;\n\t\t\twhite-space: nowrap;\n\t\t}\n\n\t\t.pptx-ctx__item:hover:not(:disabled) {\n\t\t\tbackground: var(--pptx-ctx-hover, #094771);\n\t\t\tcolor: var(--pptx-ctx-hover-fg, #ffffff);\n\t\t}\n\n\t\t.pptx-ctx__item:disabled {\n\t\t\topacity: 0.4;\n\t\t\tpointer-events: none;\n\t\t\tcursor: default;\n\t\t}\n\n\t\t.pptx-ctx__item--danger {\n\t\t\tcolor: var(--pptx-ctx-danger, #f47c7c);\n\t\t}\n\n\t\t.pptx-ctx__item--danger:hover:not(:disabled) {\n\t\t\tbackground: var(--pptx-ctx-danger-hover, #4a1a1a);\n\t\t\tcolor: var(--pptx-ctx-danger-fg, #ffaaaa);\n\t\t}\n\n\t\t.pptx-ctx__divider {\n\t\t\theight: 1px;\n\t\t\tbackground: var(--pptx-ctx-divider, #454545);\n\t\t\tmargin: 3px 0;\n\t\t}\n\t`,\n\thost: {\n\t\t'[style.--pptx-ctx-x]': 'x() + \"px\"',\n\t\t'[style.--pptx-ctx-y]': 'y() + \"px\"',\n\t},\n})\nexport class EditorContextMenuComponent {\n\t/** Horizontal viewport coordinate (px) of the top-left corner of the menu. */\n\treadonly x = input.required<number>();\n\t/** Vertical viewport coordinate (px) of the top-left corner of the menu. */\n\treadonly y = input.required<number>();\n\t/** Zero-based index of the slide being edited. */\n\treadonly slideIndex = input.required<number>();\n\n\t/** Emitted when the menu should close (Escape or outside click). */\n\treadonly closed = output<void>();\n\n\tprotected readonly editor = inject(EditorStateService);\n\tprivate readonly host = inject(ElementRef) as ElementRef<HTMLElement>;\n\n\t// ── Close triggers ───────────────────────────────────────────────────────\n\n\t@HostListener('document:keydown.escape')\n\tonEscape(): void {\n\t\tthis.closed.emit();\n\t}\n\n\t@HostListener('document:pointerdown', ['$event'])\n\tonDocumentPointerDown(event: PointerEvent): void {\n\t\tconst target = event.target;\n\t\tif (!(target instanceof Node)) {\n\t\t\treturn;\n\t\t}\n\t\tif (!this.host.nativeElement.contains(target)) {\n\t\t\tthis.closed.emit();\n\t\t}\n\t}\n\n\t// ── Menu item actions ────────────────────────────────────────────────────\n\n\tprotected onCut(): void {\n\t\tthis.editor.cutSelected(this.slideIndex());\n\t\tthis.closed.emit();\n\t}\n\n\tprotected onCopy(): void {\n\t\tthis.editor.copySelected(this.slideIndex());\n\t\tthis.closed.emit();\n\t}\n\n\tprotected onPaste(): void {\n\t\tthis.editor.paste(this.slideIndex());\n\t\tthis.closed.emit();\n\t}\n\n\tprotected onDuplicate(): void {\n\t\tthis.editor.duplicateSelected(this.slideIndex());\n\t\tthis.closed.emit();\n\t}\n\n\tprotected onDelete(): void {\n\t\tthis.editor.deleteSelected(this.slideIndex());\n\t\tthis.closed.emit();\n\t}\n\n\tprotected onBringToFront(): void {\n\t\tthis.editor.bringSelectedToFront(this.slideIndex());\n\t\tthis.closed.emit();\n\t}\n\n\tprotected onSendToBack(): void {\n\t\tthis.editor.sendSelectedToBack(this.slideIndex());\n\t\tthis.closed.emit();\n\t}\n\n\tprotected onBringForward(): void {\n\t\tthis.editor.bringSelectedForward(this.slideIndex());\n\t\tthis.closed.emit();\n\t}\n\n\tprotected onSendBackward(): void {\n\t\tthis.editor.sendSelectedBackward(this.slideIndex());\n\t\tthis.closed.emit();\n\t}\n}\n","/**\n * editor-insert.ts — Pure factory functions for creating new slide elements.\n *\n * Framework-agnostic: no Angular imports. Each factory returns a `PptxElement`\n * with `id: ''` so that `EditorStateService.addElement` can assign a real id\n * before persisting the element.\n *\n * Default position/size places elements near the slide centre (slides are\n * typically 960 × 540 px in the viewer's coordinate space).\n */\n\nimport type { PptxElement } from 'pptx-viewer-core';\n\n/** Default x position for newly inserted elements (px). */\nconst DEFAULT_X = 100;\n/** Default y position for newly inserted elements (px). */\nconst DEFAULT_Y = 100;\n/** Default width for newly inserted text boxes (px). */\nconst TEXT_WIDTH = 200;\n/** Default height for newly inserted text boxes (px). */\nconst TEXT_HEIGHT = 60;\n/** Default width for newly inserted shapes (px). */\nconst SHAPE_WIDTH = 200;\n/** Default height for newly inserted shapes (px). */\nconst SHAPE_HEIGHT = 120;\n\n/**\n * Create a new text box element with sensible defaults.\n *\n * @param x - Left position in pixels (default: 100).\n * @param y - Top position in pixels (default: 100).\n */\nexport function newTextElement(x: number = DEFAULT_X, y: number = DEFAULT_Y): PptxElement {\n\treturn {\n\t\ttype: 'text',\n\t\tid: '',\n\t\tname: 'Text Box',\n\t\tx,\n\t\ty,\n\t\twidth: TEXT_WIDTH,\n\t\theight: TEXT_HEIGHT,\n\t\ttext: 'Text',\n\t\ttextStyle: {\n\t\t\tcolor: '#000000',\n\t\t\tfontSize: 18,\n\t\t},\n\t} as PptxElement;\n}\n\n/**\n * Create a new shape element with sensible defaults.\n *\n * @param shapeType - Preset geometry: `'rect'`, `'ellipse'`, or `'line'`.\n * @param x - Left position in pixels (default: 100).\n * @param y - Top position in pixels (default: 100).\n */\nexport function newShapeElement(\n\tshapeType: 'rect' | 'ellipse' | 'line',\n\tx: number = DEFAULT_X,\n\ty: number = DEFAULT_Y,\n): PptxElement {\n\treturn {\n\t\ttype: 'shape',\n\t\tid: '',\n\t\tname: shapeType.charAt(0).toUpperCase() + shapeType.slice(1),\n\t\tx,\n\t\ty,\n\t\twidth: SHAPE_WIDTH,\n\t\theight: SHAPE_HEIGHT,\n\t\tshapeType,\n\t\tshapeStyle: {\n\t\t\tfillColor: '#4f86ff',\n\t\t\tstrokeColor: '#1e3a8a',\n\t\t\tstrokeWidth: 1,\n\t\t},\n\t} as PptxElement;\n}\n","/**\n * editor-toolbar.component.ts — Horizontal insert/format toolbar for the\n * Angular PPTX editor.\n *\n * Selector: `pptx-editor-toolbar`\n *\n * Renders two groups separated by a visual divider:\n * 1. Insert — Text box, Rectangle, Ellipse, Line\n * 2. Arrange / Selection — Duplicate, Delete, Bring to Front, Send to Back,\n * Bring Forward, Send Backward\n *\n * All arrange/selection actions are disabled when no element is selected.\n * Insert actions always remain enabled.\n *\n * Usage:\n * ```html\n * <pptx-editor-toolbar [slideIndex]=\"activeSlideIndex()\" />\n * ```\n */\n\nimport { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\n\nimport { newShapeElement, newTextElement } from './editor-insert';\nimport { EditorStateService } from './editor-state.service';\n\n@Component({\n\tselector: 'pptx-editor-toolbar',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplate: `\n\t\t<div class=\"pptx-ng-toolbar\" role=\"toolbar\" aria-label=\"Editor toolbar\">\n\t\t\t<!-- ── Insert group ──────────────────────────────────────────────────── -->\n\t\t\t<div class=\"pptx-ng-toolbar__group\" role=\"group\" aria-label=\"Insert\">\n\t\t\t\t<span class=\"pptx-ng-toolbar__group-label\">Insert</span>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-toolbar__btn\"\n\t\t\t\t\ttitle=\"Insert Text Box\"\n\t\t\t\t\t(click)=\"onInsertText()\"\n\t\t\t\t>\n\t\t\t\t\tT\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-toolbar__btn\"\n\t\t\t\t\ttitle=\"Insert Rectangle\"\n\t\t\t\t\t(click)=\"onInsertShape('rect')\"\n\t\t\t\t>\n\t\t\t\t\t▭\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-toolbar__btn\"\n\t\t\t\t\ttitle=\"Insert Ellipse\"\n\t\t\t\t\t(click)=\"onInsertShape('ellipse')\"\n\t\t\t\t>\n\t\t\t\t\t⬭\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-toolbar__btn\"\n\t\t\t\t\ttitle=\"Insert Line\"\n\t\t\t\t\t(click)=\"onInsertShape('line')\"\n\t\t\t\t>\n\t\t\t\t\t╱\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<!-- ── Divider ────────────────────────────────────────────────────────── -->\n\t\t\t<div class=\"pptx-ng-toolbar__divider\" role=\"separator\" aria-orientation=\"vertical\"></div>\n\n\t\t\t<!-- ── Arrange / Selection group ─────────────────────────────────────── -->\n\t\t\t<div class=\"pptx-ng-toolbar__group\" role=\"group\" aria-label=\"Arrange\">\n\t\t\t\t<span class=\"pptx-ng-toolbar__group-label\">Arrange</span>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-toolbar__btn\"\n\t\t\t\t\ttitle=\"Duplicate\"\n\t\t\t\t\t[disabled]=\"!editor.hasSelection()\"\n\t\t\t\t\t(click)=\"editor.duplicateSelected(slideIndex())\"\n\t\t\t\t>\n\t\t\t\t\t⧉\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-toolbar__btn pptx-ng-toolbar__btn--danger\"\n\t\t\t\t\ttitle=\"Delete\"\n\t\t\t\t\t[disabled]=\"!editor.hasSelection()\"\n\t\t\t\t\t(click)=\"editor.deleteSelected(slideIndex())\"\n\t\t\t\t>\n\t\t\t\t\t✕\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-toolbar__btn\"\n\t\t\t\t\ttitle=\"Bring to Front\"\n\t\t\t\t\t[disabled]=\"!editor.hasSelection()\"\n\t\t\t\t\t(click)=\"editor.bringSelectedToFront(slideIndex())\"\n\t\t\t\t>\n\t\t\t\t\t⤒\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-toolbar__btn\"\n\t\t\t\t\ttitle=\"Send to Back\"\n\t\t\t\t\t[disabled]=\"!editor.hasSelection()\"\n\t\t\t\t\t(click)=\"editor.sendSelectedToBack(slideIndex())\"\n\t\t\t\t>\n\t\t\t\t\t⤓\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-toolbar__btn\"\n\t\t\t\t\ttitle=\"Bring Forward\"\n\t\t\t\t\t[disabled]=\"!editor.hasSelection()\"\n\t\t\t\t\t(click)=\"editor.bringSelectedForward(slideIndex())\"\n\t\t\t\t>\n\t\t\t\t\t↑\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-toolbar__btn\"\n\t\t\t\t\ttitle=\"Send Backward\"\n\t\t\t\t\t[disabled]=\"!editor.hasSelection()\"\n\t\t\t\t\t(click)=\"editor.sendSelectedBackward(slideIndex())\"\n\t\t\t\t>\n\t\t\t\t\t↓\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-toolbar__btn\"\n\t\t\t\t\ttitle=\"Group\"\n\t\t\t\t\t[disabled]=\"!canGroup()\"\n\t\t\t\t\t(click)=\"editor.groupSelected(slideIndex())\"\n\t\t\t\t>\n\t\t\t\t\t⊡\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-toolbar__btn\"\n\t\t\t\t\ttitle=\"Ungroup\"\n\t\t\t\t\t[disabled]=\"!canUngroup()\"\n\t\t\t\t\t(click)=\"editor.ungroupSelected(slideIndex())\"\n\t\t\t\t>\n\t\t\t\t\t⊠\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class=\"pptx-ng-toolbar__divider\" role=\"separator\" aria-orientation=\"vertical\"></div>\n\n\t\t\t<div class=\"pptx-ng-toolbar__group\" role=\"group\" aria-label=\"Align\">\n\t\t\t\t<span class=\"pptx-ng-toolbar__group-label\">Align</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-toolbar__btn\"\n\t\t\t\t\ttitle=\"Align Left\"\n\t\t\t\t\t[disabled]=\"!canAlign()\"\n\t\t\t\t\t(click)=\"editor.alignSelected(slideIndex(), 'left')\"\n\t\t\t\t>\n\t\t\t\t\t⊣\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-toolbar__btn\"\n\t\t\t\t\ttitle=\"Align Centre\"\n\t\t\t\t\t[disabled]=\"!canAlign()\"\n\t\t\t\t\t(click)=\"editor.alignSelected(slideIndex(), 'centerH')\"\n\t\t\t\t>\n\t\t\t\t\t⊟\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-toolbar__btn\"\n\t\t\t\t\ttitle=\"Align Right\"\n\t\t\t\t\t[disabled]=\"!canAlign()\"\n\t\t\t\t\t(click)=\"editor.alignSelected(slideIndex(), 'right')\"\n\t\t\t\t>\n\t\t\t\t\t⊢\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-toolbar__btn\"\n\t\t\t\t\ttitle=\"Align Top\"\n\t\t\t\t\t[disabled]=\"!canAlign()\"\n\t\t\t\t\t(click)=\"editor.alignSelected(slideIndex(), 'top')\"\n\t\t\t\t>\n\t\t\t\t\t⊤\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-toolbar__btn\"\n\t\t\t\t\ttitle=\"Align Middle\"\n\t\t\t\t\t[disabled]=\"!canAlign()\"\n\t\t\t\t\t(click)=\"editor.alignSelected(slideIndex(), 'middle')\"\n\t\t\t\t>\n\t\t\t\t\t⊞\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-toolbar__btn\"\n\t\t\t\t\ttitle=\"Align Bottom\"\n\t\t\t\t\t[disabled]=\"!canAlign()\"\n\t\t\t\t\t(click)=\"editor.alignSelected(slideIndex(), 'bottom')\"\n\t\t\t\t>\n\t\t\t\t\t⊥\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-toolbar__btn\"\n\t\t\t\t\ttitle=\"Distribute Horizontally\"\n\t\t\t\t\t[disabled]=\"!canDistribute()\"\n\t\t\t\t\t(click)=\"editor.distributeSelected(slideIndex(), 'horizontal')\"\n\t\t\t\t>\n\t\t\t\t\t↔\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-toolbar__btn\"\n\t\t\t\t\ttitle=\"Distribute Vertically\"\n\t\t\t\t\t[disabled]=\"!canDistribute()\"\n\t\t\t\t\t(click)=\"editor.distributeSelected(slideIndex(), 'vertical')\"\n\t\t\t\t>\n\t\t\t\t\t↕\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t`,\n\tstyles: `\n\t\t.pptx-ng-toolbar {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\talign-items: center;\n\t\t\tgap: 0;\n\t\t\tpadding: 4px 8px;\n\t\t\tbackground: var(--pptx-toolbar-bg, #1e1e1e);\n\t\t\tcolor: var(--pptx-toolbar-fg, #e0e0e0);\n\t\t\tborder-bottom: 1px solid var(--pptx-toolbar-border, #333);\n\t\t\tmin-height: 36px;\n\t\t\tuser-select: none;\n\t\t}\n\n\t\t.pptx-ng-toolbar__group {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\talign-items: center;\n\t\t\tgap: 2px;\n\t\t}\n\n\t\t.pptx-ng-toolbar__group-label {\n\t\t\tfont-size: 10px;\n\t\t\tcolor: var(--pptx-toolbar-muted, #888);\n\t\t\ttext-transform: uppercase;\n\t\t\tletter-spacing: 0.05em;\n\t\t\tpadding: 0 6px 0 4px;\n\t\t\tflex-shrink: 0;\n\t\t}\n\n\t\t.pptx-ng-toolbar__divider {\n\t\t\twidth: 1px;\n\t\t\theight: 20px;\n\t\t\tbackground: var(--pptx-toolbar-border, #444);\n\t\t\tmargin: 0 6px;\n\t\t\tflex-shrink: 0;\n\t\t}\n\n\t\t.pptx-ng-toolbar__btn {\n\t\t\tdisplay: inline-flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\twidth: 28px;\n\t\t\theight: 26px;\n\t\t\tpadding: 0;\n\t\t\tbackground: transparent;\n\t\t\tborder: 1px solid transparent;\n\t\t\tborder-radius: 3px;\n\t\t\tcolor: inherit;\n\t\t\tfont-size: 14px;\n\t\t\tcursor: pointer;\n\t\t\ttransition:\n\t\t\t\tbackground 0.1s,\n\t\t\t\tborder-color 0.1s;\n\t\t\tflex-shrink: 0;\n\t\t}\n\n\t\t.pptx-ng-toolbar__btn:hover:not(:disabled) {\n\t\t\tbackground: var(--pptx-toolbar-hover, #3a3a3a);\n\t\t\tborder-color: var(--pptx-toolbar-border, #555);\n\t\t}\n\n\t\t.pptx-ng-toolbar__btn:active:not(:disabled) {\n\t\t\tbackground: var(--pptx-toolbar-active-bg, #2a2a2a);\n\t\t}\n\n\t\t.pptx-ng-toolbar__btn:disabled {\n\t\t\topacity: 0.35;\n\t\t\tcursor: default;\n\t\t}\n\n\t\t.pptx-ng-toolbar__btn--danger:not(:disabled) {\n\t\t\tcolor: var(--pptx-toolbar-danger, #f47c7c);\n\t\t}\n\n\t\t.pptx-ng-toolbar__btn--danger:hover:not(:disabled) {\n\t\t\tbackground: var(--pptx-toolbar-danger-hover, #4a1a1a);\n\t\t\tborder-color: var(--pptx-toolbar-danger-border, #6b2a2a);\n\t\t}\n\t`,\n})\nexport class EditorToolbarComponent {\n\t/** Zero-based index of the slide being edited. */\n\treadonly slideIndex = input.required<number>();\n\n\tprotected readonly editor = inject(EditorStateService);\n\n\t/** Align needs ≥2 selected elements; distribute needs ≥3. */\n\tprotected readonly canAlign = computed(() => this.editor.selectedIds().length >= 2);\n\tprotected readonly canDistribute = computed(() => this.editor.selectedIds().length >= 3);\n\t/** Group needs ≥2 selected; ungroup needs exactly one selected group. */\n\tprotected readonly canGroup = computed(() => this.editor.selectedIds().length >= 2);\n\tprotected readonly canUngroup = computed(() => {\n\t\tconst ids = this.editor.selectedIds();\n\t\tif (ids.length !== 1) {\n\t\t\treturn false;\n\t\t}\n\t\tconst slide = this.editor.slides()[this.slideIndex()];\n\t\treturn slide?.elements.find((el) => el.id === ids[0])?.type === 'group';\n\t});\n\n\tprotected onInsertText(): void {\n\t\tthis.editor.addElement(this.slideIndex(), newTextElement());\n\t}\n\n\tprotected onInsertShape(shapeType: 'rect' | 'ellipse' | 'line'): void {\n\t\tthis.editor.addElement(this.slideIndex(), newShapeElement(shapeType));\n\t}\n}\n","/**\n * Pure export helper utilities — no Angular, no DOM, no jsPDF, no html2canvas.\n *\n * These are extracted from the service so that they can be unit-tested in\n * isolation and potentially reused by other parts of the package.\n *\n * All page-size values are in **points (pt)** — the unit used natively by\n * jsPDF. 1 pt = 1/72 inch. The slide pixel dimensions passed in are treated\n * as a logical size for aspect-ratio maths only; the resulting PDF pages are\n * scaled to fit within standard A4.\n */\n\n/* ------------------------------------------------------------------ */\n/* Orientation helpers */\n/* ------------------------------------------------------------------ */\n\n/**\n * Determine jsPDF page orientation from the slide's pixel width and height.\n *\n * - If `w > h` → `'landscape'`\n * - If `w <= h` → `'portrait'`\n *\n * @param w - Slide canvas width in pixels (or any consistent unit).\n * @param h - Slide canvas height in pixels (or any consistent unit).\n */\nexport function pdfOrientation(w: number, h: number): 'landscape' | 'portrait' {\n\treturn w > h ? 'landscape' : 'portrait';\n}\n\n/* ------------------------------------------------------------------ */\n/* Page-size helper */\n/* ------------------------------------------------------------------ */\n\n/** A4 dimensions in points (pt). */\nconst A4_PT_W = 841.89;\nconst A4_PT_H = 595.28;\n\n/**\n * Compute the jsPDF page dimensions (in **pt**) for the slide, preserving the\n * slide aspect ratio within A4 bounds.\n *\n * The returned `{ width, height }` are the MediaBox dimensions to pass to\n * `new jsPDF({ unit: 'pt', format: [width, height] })`. The orientation\n * field mirrors {@link pdfOrientation}.\n *\n * When the slide is landscape (`w > h`):\n * - page width = A4 landscape width (841.89 pt)\n * - page height = A4 landscape height (595.28 pt)\n * When portrait:\n * - page width = A4 portrait width (595.28 pt)\n * - page height = A4 portrait height (841.89 pt)\n *\n * @param w - Slide canvas width in pixels.\n * @param h - Slide canvas height in pixels.\n * @returns `{ width, height, orientation }` all in pt.\n */\nexport function pdfPageSize(\n\tw: number,\n\th: number,\n): { width: number; height: number; orientation: 'landscape' | 'portrait' } {\n\tconst orientation = pdfOrientation(w, h);\n\tif (orientation === 'landscape') {\n\t\treturn { width: A4_PT_W, height: A4_PT_H, orientation };\n\t}\n\treturn { width: A4_PT_H, height: A4_PT_W, orientation };\n}\n\n/* ------------------------------------------------------------------ */\n/* File-name helpers */\n/* ------------------------------------------------------------------ */\n\n/**\n * Sanitize a file-name by replacing characters that are unsafe on Windows,\n * macOS, and Linux file systems with an underscore.\n *\n * Stripped characters: `\\ / : * ? \" < > |` and ASCII control codes (0–31).\n *\n * @param name - Raw file name (may include path-unsafe chars).\n * @returns Sanitized file name safe for all major operating systems.\n */\nexport function sanitizeFileName(name: string): string {\n\t// eslint-disable-next-line no-control-regex\n\treturn name.replace(/[\\\\/:*?\"<>|\\x00-\\x1F]/gu, '_');\n}\n\n/**\n * Build a per-slide file name from a base name, 1-based slide index, and\n * extension.\n *\n * @example\n * slideFileName('deck', 2, 'png') // → 'deck-2.png'\n * slideFileName('my deck!', 3, 'pdf') // → 'my deck!-3.pdf' (sanitize separately if needed)\n *\n * @param baseName - Presentation base name (without extension).\n * @param index - 1-based slide number.\n * @param ext - File extension **without** the leading dot.\n * @returns Composed file name string.\n */\nexport function slideFileName(baseName: string, index: number, ext: string): string {\n\treturn `${baseName}-${index}.${ext}`;\n}\n","/**\n * Canvas Export Utilities\n *\n * Provides a safe wrapper around html2canvas that resolves modern CSS colour\n * functions (oklch, oklab, lch, lab, color()) into rgb()/hex before rendering.\n *\n * html2canvas ≤ 1.x includes its own CSS parser that cannot handle these\n * newer colour spaces, causing \"Attempting to parse an unsupported color\n * function\" errors.\n *\n * Modern Chrome (111+) returns oklch/oklab values from `getComputedStyle()`\n * rather than converting them to rgb, so simply re-setting computed values\n * as inline styles is *not* sufficient. Instead we convert every unsupported\n * colour value to sRGB via the Canvas 2D API (`ctx.fillStyle` always\n * serialises to `#rrggbb` or `rgba()`), then inline the result.\n *\n * Additionally, Tailwind CSS v4 declares all colour tokens as oklch() custom\n * properties on :root, so we patch `<style>` elements in the cloned document\n * to replace those definitions as well.\n *\n * CSS preprocessing: Beyond colour conversion, the onclone callback also\n * applies a full CSS preprocessing pipeline to flatten backdrop-filter,\n * mix-blend-mode, 3D transforms, and other CSS features that html2canvas\n * cannot handle.\n */\n/* eslint-disable require-unicode-regexp, prefer-named-capture-group -- these\n are ASCII-only CSS-token regexes (colour functions, transform tokens,\n units); the `u` flag and named groups are stylistic noise here, and the\n React source omits them too. */\nimport html2canvasPro from 'html2canvas-pro';\nimport type { Options as Html2CanvasOptions } from 'html2canvas-pro';\n\n/* ------------------------------------------------------------------ */\n/* Blob URL → data URL conversion */\n/* ------------------------------------------------------------------ */\n\n/**\n * Convert a single `blob:` URL to a `data:` URL via fetch + FileReader.\n * Returns `null` if the conversion fails (e.g. revoked blob).\n */\nasync function blobUrlToDataUrl(blobUrl: string): Promise<string | null> {\n\ttry {\n\t\tconst response = await fetch(blobUrl);\n\t\tconst blob = await response.blob();\n\t\treturn await new Promise<string>((resolve, reject) => {\n\t\t\tconst reader = new FileReader();\n\t\t\treader.onloadend = () => resolve(reader.result as string);\n\t\t\treader.onerror = reject;\n\t\t\treader.readAsDataURL(blob);\n\t\t});\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Find all `blob:` URLs in the cloned DOM and replace them with `data:` URLs.\n *\n * Why this is needed:\n * html2canvas-pro's OriginChecker parses blob URLs via an `<a>` element,\n * which reports `protocol = \"blob:\"` instead of the nested origin. This\n * makes blob URLs appear cross-origin, so `useCORS: true` causes\n * `crossOrigin = \"anonymous\"` to be set on the Image loader. Blob URLs\n * don't serve CORS headers → the image load fails silently.\n *\n * Additionally, for `<img>` elements html2canvas reads\n * `img.currentSrc || img.src`. The cloned img may have already loaded\n * the blob URL before onclone fires, so `currentSrc` still returns the\n * old blob URL even after we update `src`. To defeat this, we must\n * **replace** the element entirely so the new element has an empty\n * `currentSrc`.\n *\n * Data URLs are recognised as inline images by html2canvas and bypass\n * the CORS/origin machinery entirely.\n */\nasync function convertBlobUrlsToDataUrls(root: HTMLElement): Promise<void> {\n\tconst promises: Promise<void>[] = [];\n\n\t// 1. <img> elements with blob: src — REPLACE the element to clear currentSrc\n\tconst images = root.querySelectorAll<HTMLImageElement>('img[src^=\"blob:\"]');\n\tfor (const img of images) {\n\t\tconst blobUrl = img.src;\n\t\tpromises.push(\n\t\t\tblobUrlToDataUrl(blobUrl).then((dataUrl) => {\n\t\t\t\tif (!dataUrl) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\t// Build a fresh <img> so that currentSrc is empty and html2canvas\n\t\t\t\t// reads our data URL from .src instead.\n\t\t\t\tconst replacement = img.ownerDocument.createElement('img');\n\t\t\t\tfor (const attr of Array.from(img.attributes)) {\n\t\t\t\t\tif (attr.name !== 'src') {\n\t\t\t\t\t\treplacement.setAttribute(attr.name, attr.value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treplacement.src = dataUrl;\n\t\t\t\t// Preserve inline styles\n\t\t\t\treplacement.style.cssText = img.style.cssText;\n\t\t\t\timg.parentNode?.replaceChild(replacement, img);\n\t\t\t\treturn undefined;\n\t\t\t}),\n\t\t);\n\t}\n\n\t// 2. Elements with background-image containing blob: URLs\n\t// (CSS background-image has no currentSrc issue — style replacement works)\n\tconst allElements = root.querySelectorAll('*');\n\tfor (const el of allElements) {\n\t\tconst htmlEl = el as HTMLElement;\n\t\tconst bg = htmlEl.style.backgroundImage;\n\t\tif (bg && bg.includes('blob:')) {\n\t\t\tconst match = bg.match(/url\\([\"']?(blob:[^\"')]+)[\"']?\\)/);\n\t\t\tif (match) {\n\t\t\t\tconst blobUrl = match[1];\n\t\t\t\tpromises.push(\n\t\t\t\t\tblobUrlToDataUrl(blobUrl).then((dataUrl) => {\n\t\t\t\t\t\tif (dataUrl) {\n\t\t\t\t\t\t\thtmlEl.style.backgroundImage = bg.replace(blobUrl, dataUrl);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// 3. Check the root element itself for background-image blob URLs\n\tconst rootBg = root.style.backgroundImage;\n\tif (rootBg && rootBg.includes('blob:')) {\n\t\tconst match = rootBg.match(/url\\([\"']?(blob:[^\"')]+)[\"']?\\)/);\n\t\tif (match) {\n\t\t\tconst blobUrl = match[1];\n\t\t\tpromises.push(\n\t\t\t\tblobUrlToDataUrl(blobUrl).then((dataUrl) => {\n\t\t\t\t\tif (dataUrl) {\n\t\t\t\t\t\troot.style.backgroundImage = rootBg.replace(blobUrl, dataUrl);\n\t\t\t\t\t}\n\t\t\t\t\treturn undefined;\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\tawait Promise.all(promises);\n}\n\n/* ------------------------------------------------------------------ */\n/* Colour detection */\n/* ------------------------------------------------------------------ */\n\n/** Matches colour functions that html2canvas cannot parse. */\nconst UNSUPPORTED_COLOR_RE = /oklch|oklab|lch\\(|lab\\(|color\\(/i;\n\n/**\n * Matches full colour-function calls for regex replacement inside\n * complex CSS values (gradients, shadows, stylesheet text).\n * Handles one level of nested parentheses (e.g. `calc()` inside\n * colour functions).\n */\nconst UNSUPPORTED_COLOR_FN_RE = /(?:oklch|oklab|lch|lab|color)\\([^)]*(?:\\([^)]*\\)[^)]*)*\\)/gi;\n\n/* ------------------------------------------------------------------ */\n/* Canvas 2D colour conversion */\n/* ------------------------------------------------------------------ */\n\n/**\n * Lazily-created scratch Canvas 2D context. The Canvas API always\n * serialises colours in sRGB, so any modern colour space round-trips\n * to `#rrggbb` (opaque) or `rgba(r,g,b,a)` (translucent).\n */\nlet _scratchCtx: CanvasRenderingContext2D | null | undefined;\n\nfunction getScratchCtx(): CanvasRenderingContext2D | null {\n\tif (_scratchCtx === undefined) {\n\t\t_scratchCtx = document.createElement('canvas').getContext('2d');\n\t}\n\treturn _scratchCtx;\n}\n\n/**\n * Convert a single CSS colour value to an sRGB hex or `rgba()` string.\n * Returns the original value unchanged when the input is invalid or the\n * Canvas API is unavailable.\n */\nfunction resolveColorToSrgb(value: string): string {\n\tconst ctx = getScratchCtx();\n\tif (!ctx) {\n\t\treturn value;\n\t}\n\n\tconst SENTINEL = '#020304';\n\tctx.fillStyle = SENTINEL;\n\tctx.fillStyle = value.trim();\n\tconst result = ctx.fillStyle;\n\t// Canvas ignores invalid colours — fillStyle stays at the sentinel.\n\treturn result === SENTINEL ? value : result;\n}\n\n/**\n * Replace every unsupported colour-function call inside an arbitrary\n * CSS value string (gradients, box-shadow, stylesheet text, …).\n */\nfunction replaceUnsupportedColors(value: string): string {\n\tif (!UNSUPPORTED_COLOR_RE.test(value)) {\n\t\treturn value;\n\t}\n\treturn value.replace(UNSUPPORTED_COLOR_FN_RE, (match) => resolveColorToSrgb(match));\n}\n\n/* ------------------------------------------------------------------ */\n/* Property lists */\n/* ------------------------------------------------------------------ */\n\n/**\n * Simple colour properties whose computed value is a single colour.\n * We convert the entire value via `resolveColorToSrgb`.\n */\nconst COLOR_PROPERTIES: readonly string[] = [\n\t'color',\n\t'background-color',\n\t'border-top-color',\n\t'border-right-color',\n\t'border-bottom-color',\n\t'border-left-color',\n\t'outline-color',\n\t'text-decoration-color',\n\t'column-rule-color',\n\t'caret-color',\n\t'accent-color',\n\t'text-emphasis-color',\n\t'fill',\n\t'stroke',\n\t'stop-color',\n\t'flood-color',\n\t'lighting-color',\n] as const;\n\n/**\n * Properties whose computed values may embed colour functions inside\n * more complex syntax (gradients, shadows, images). We use regex\n * replacement within the value string.\n */\nconst COMPLEX_COLOR_PROPERTIES: readonly string[] = [\n\t'box-shadow',\n\t'text-shadow',\n\t'background-image',\n\t'background',\n\t'border-image',\n] as const;\n\n/* ------------------------------------------------------------------ */\n/* Walk the cloned DOM and convert colours to sRGB */\n/* ------------------------------------------------------------------ */\n\n/**\n * Walks every element inside `root` and converts any computed colour\n * value that uses an unsupported colour function into sRGB, then\n * inlines the result so html2canvas only sees rgb()/hex.\n */\nfunction resolveUnsupportedColours(root: HTMLElement): void {\n\tconst elements = root.querySelectorAll('*');\n\n\tconst resolve = (el: Element) => {\n\t\tconst htmlEl = el as HTMLElement;\n\t\tif (!htmlEl.style) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst computed = window.getComputedStyle(htmlEl);\n\n\t\t// Simple colour properties — convert the whole value.\n\t\tfor (const prop of COLOR_PROPERTIES) {\n\t\t\tconst value = computed.getPropertyValue(prop);\n\t\t\tif (value && UNSUPPORTED_COLOR_RE.test(value)) {\n\t\t\t\thtmlEl.style.setProperty(prop, resolveColorToSrgb(value));\n\t\t\t}\n\t\t}\n\n\t\t// Complex properties — replace colour functions in-place.\n\t\tfor (const prop of COMPLEX_COLOR_PROPERTIES) {\n\t\t\tconst value = computed.getPropertyValue(prop);\n\t\t\tif (value && UNSUPPORTED_COLOR_RE.test(value)) {\n\t\t\t\thtmlEl.style.setProperty(prop, replaceUnsupportedColors(value));\n\t\t\t}\n\t\t}\n\n\t\t// CSS custom properties on this element (inline `--*` vars).\n\t\tconst inlineStyle = htmlEl.style;\n\t\tfor (let i = 0; i < inlineStyle.length; i++) {\n\t\t\tconst prop = inlineStyle[i];\n\t\t\tif (!prop.startsWith('--')) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst value = inlineStyle.getPropertyValue(prop);\n\t\t\tif (value && UNSUPPORTED_COLOR_RE.test(value)) {\n\t\t\t\tinlineStyle.setProperty(prop, replaceUnsupportedColors(value));\n\t\t\t}\n\t\t}\n\t};\n\n\tresolve(root);\n\telements.forEach(resolve);\n}\n\n/* ------------------------------------------------------------------ */\n/* CSS custom-property cleanup on <html> / <body> / :root */\n/* ------------------------------------------------------------------ */\n\n/**\n * Tailwind v4 themes define colour tokens as oklch() on :root / <body>.\n * Resolve any inline custom properties whose values are unsupported\n * colour functions to sRGB equivalents.\n */\nfunction resolveRootCustomProperties(doc: Document): void {\n\tconst targets = [doc.documentElement, doc.body];\n\n\tfor (const target of targets) {\n\t\tif (!target) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst inlineStyle = target.style;\n\n\t\tfor (let i = 0; i < inlineStyle.length; i++) {\n\t\t\tconst prop = inlineStyle[i];\n\t\t\tif (!prop.startsWith('--')) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst value = inlineStyle.getPropertyValue(prop);\n\t\t\tif (value && UNSUPPORTED_COLOR_RE.test(value)) {\n\t\t\t\tinlineStyle.setProperty(prop, replaceUnsupportedColors(value));\n\t\t\t}\n\t\t}\n\t}\n}\n\n/* ------------------------------------------------------------------ */\n/* Stylesheet patching */\n/* ------------------------------------------------------------------ */\n\n/**\n * Patch `<style>` elements in the cloned document, replacing oklch()\n * and other unsupported colour-function calls with sRGB equivalents.\n *\n * This catches CSS custom-property declarations on :root (e.g. from\n * Tailwind v4's `--color-*` tokens) that are defined in stylesheets\n * and thus not reachable via `element.style`.\n */\nfunction patchStylesheets(doc: Document): void {\n\tconst styles = doc.querySelectorAll('style');\n\tfor (const style of styles) {\n\t\tconst text = style.textContent ?? '';\n\t\tif (!UNSUPPORTED_COLOR_RE.test(text)) {\n\t\t\tcontinue;\n\t\t}\n\t\tstyle.textContent = text.replace(UNSUPPORTED_COLOR_FN_RE, (match) => resolveColorToSrgb(match));\n\t}\n}\n\n/* ------------------------------------------------------------------ */\n/* CSS preprocessing — flatten html2canvas-incompatible features */\n/* ------------------------------------------------------------------ */\n\n/** Matches 3D transform functions in a CSS transform value. */\nconst TRANSFORM_3D_RE =\n\t/(?:translate3d|rotate3d|scale3d|matrix3d|perspective|translateZ|rotateX|rotateY|scaleZ)\\s*\\([^)]*\\)/gi;\n\n/** Mapping of blend modes to approximate opacity values. */\nconst BLEND_MODE_OPACITY_MAP: Record<string, number> = {\n\tmultiply: 0.85,\n\tscreen: 0.9,\n\toverlay: 0.8,\n\tdarken: 0.9,\n\tlighten: 0.9,\n\t'color-dodge': 0.85,\n\t'color-burn': 0.85,\n\t'hard-light': 0.8,\n\t'soft-light': 0.9,\n\tdifference: 0.7,\n\texclusion: 0.75,\n\thue: 0.85,\n\tsaturation: 0.85,\n\tcolor: 0.85,\n\tluminosity: 0.85,\n};\n\n/**\n * Flatten a 3D CSS transform string to its 2D equivalent.\n * Returns `\"none\"` if all 3D parts are removed and nothing 2D remains.\n */\nfunction flatten3dTransform(transformValue: string): string {\n\tif (!transformValue || transformValue === 'none') {\n\t\treturn transformValue;\n\t}\n\n\tTRANSFORM_3D_RE.lastIndex = 0;\n\tif (!TRANSFORM_3D_RE.test(transformValue)) {\n\t\treturn transformValue;\n\t}\n\tTRANSFORM_3D_RE.lastIndex = 0;\n\n\tlet result = transformValue;\n\n\tresult = result.replace(\n\t\t/translate3d\\(\\s*([^,]+)\\s*,\\s*([^,]+)\\s*,\\s*[^)]+\\)/gi,\n\t\t'translate($1, $2)',\n\t);\n\tresult = result.replace(/translateZ\\([^)]*\\)/gi, '');\n\tresult = result.replace(/scale3d\\(\\s*([^,]+)\\s*,\\s*([^,]+)\\s*,\\s*[^)]+\\)/gi, 'scale($1, $2)');\n\tresult = result.replace(/scaleZ\\([^)]*\\)/gi, '');\n\tresult = result.replace(/rotate[XY]\\([^)]*\\)/gi, '');\n\tresult = result.replace(/rotate3d\\([^)]*\\)/giu, '');\n\tresult = result.replace(/perspective\\([^)]*\\)/giu, '');\n\tresult = result.replace(/matrix3d\\(([^)]*)\\)/giu, (_match, args: string) => {\n\t\tconst vals = args.split(',').map((v: string) => parseFloat(v.trim()));\n\t\tif (vals.length === 16 && vals.every((v: number) => !isNaN(v))) {\n\t\t\treturn `matrix(${vals[0]}, ${vals[1]}, ${vals[4]}, ${vals[5]}, ${vals[12]}, ${vals[13]})`;\n\t\t}\n\t\treturn '';\n\t});\n\n\tresult = result.replace(/\\s{2,}/gu, ' ').trim();\n\tif (!result || result === 'matrix(1, 0, 0, 1, 0, 0)') {\n\t\treturn 'none';\n\t}\n\treturn result;\n}\n\n/**\n * Apply all CSS preprocessing steps to a cloned DOM subtree so that\n * html2canvas can render it correctly.\n *\n * Steps applied:\n * 1. Resolve `var()` references for common colour/layout properties.\n * 2. Flatten `backdrop-filter` to a background-colour approximation.\n * 3. Replace `mix-blend-mode` with an opacity fallback.\n * 4. Flatten 3D transforms to 2D equivalents.\n * 5. Remove/approximate CSS features html2canvas cannot handle.\n */\nfunction preprocessCssForCapture(root: HTMLElement): void {\n\tconst view = root.ownerDocument?.defaultView ?? window;\n\tconst elements = root.querySelectorAll('*');\n\n\tconst VAR_DEPENDENT_PROPERTIES: readonly string[] = [\n\t\t'color',\n\t\t'background-color',\n\t\t'background',\n\t\t'background-image',\n\t\t'border-color',\n\t\t'border-top-color',\n\t\t'border-right-color',\n\t\t'border-bottom-color',\n\t\t'border-left-color',\n\t\t'outline-color',\n\t\t'box-shadow',\n\t\t'text-shadow',\n\t\t'opacity',\n\t\t'font-size',\n\t\t'line-height',\n\t\t'letter-spacing',\n\t\t'border-radius',\n\t\t'padding',\n\t\t'margin',\n\t\t'gap',\n\t\t'width',\n\t\t'height',\n\t\t'max-width',\n\t\t'max-height',\n\t\t'min-width',\n\t\t'min-height',\n\t\t'fill',\n\t\t'stroke',\n\t\t'stop-color',\n\t] as const;\n\n\tconst processEl = (el: Element) => {\n\t\tconst htmlEl = el as HTMLElement;\n\t\tif (!htmlEl.style) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst computed = view.getComputedStyle(htmlEl);\n\n\t\t// Step 1: Resolve var() references.\n\t\tfor (const prop of VAR_DEPENDENT_PROPERTIES) {\n\t\t\tconst inlineValue = htmlEl.style.getPropertyValue(prop);\n\t\t\tif (inlineValue && inlineValue.includes('var(')) {\n\t\t\t\tconst computedValue = computed.getPropertyValue(prop);\n\t\t\t\tif (computedValue) {\n\t\t\t\t\thtmlEl.style.setProperty(prop, computedValue);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Step 2: Flatten backdrop-filter.\n\t\tconst backdropFilter =\n\t\t\tcomputed.getPropertyValue('backdrop-filter') ||\n\t\t\tcomputed.getPropertyValue('-webkit-backdrop-filter');\n\t\tif (backdropFilter && backdropFilter !== 'none') {\n\t\t\tconst blurMatch = backdropFilter.match(/blur\\(\\s*([\\d.]+)\\s*px\\s*\\)/iu);\n\t\t\tconst blurPx = blurMatch ? parseFloat(blurMatch[1]) : 0;\n\t\t\thtmlEl.style.setProperty('backdrop-filter', 'none');\n\t\t\thtmlEl.style.setProperty('-webkit-backdrop-filter', 'none');\n\t\t\tif (blurPx > 0) {\n\t\t\t\tconst currentBg = computed.getPropertyValue('background-color');\n\t\t\t\tif (!currentBg || currentBg === 'transparent' || currentBg === 'rgba(0, 0, 0, 0)') {\n\t\t\t\t\tconst opacity = Math.min(0.85, 0.4 + blurPx * 0.02);\n\t\t\t\t\thtmlEl.style.setProperty(\n\t\t\t\t\t\t'background-color',\n\t\t\t\t\t\t`rgba(255, 255, 255, ${opacity.toFixed(2)})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Step 3: Replace mix-blend-mode with opacity fallback.\n\t\tconst blendMode = computed.getPropertyValue('mix-blend-mode');\n\t\tif (blendMode && blendMode !== 'normal') {\n\t\t\thtmlEl.style.setProperty('mix-blend-mode', 'normal');\n\t\t\tconst currentOpacity = parseFloat(computed.getPropertyValue('opacity') || '1');\n\t\t\tconst blendOpacity = BLEND_MODE_OPACITY_MAP[blendMode] ?? 1;\n\t\t\tconst combinedOpacity = currentOpacity * blendOpacity;\n\t\t\tif (combinedOpacity < 1) {\n\t\t\t\thtmlEl.style.setProperty('opacity', combinedOpacity.toFixed(2));\n\t\t\t}\n\t\t}\n\n\t\t// Step 4: Flatten 3D transforms.\n\t\tconst transform = computed.getPropertyValue('transform');\n\t\tif (transform && transform !== 'none') {\n\t\t\tTRANSFORM_3D_RE.lastIndex = 0;\n\t\t\tif (TRANSFORM_3D_RE.test(transform)) {\n\t\t\t\tTRANSFORM_3D_RE.lastIndex = 0;\n\t\t\t\thtmlEl.style.setProperty('transform', flatten3dTransform(transform));\n\t\t\t}\n\t\t}\n\n\t\t// Step 5: Remove/approximate unsupported CSS features.\n\t\tconst maskImage =\n\t\t\tcomputed.getPropertyValue('mask-image') || computed.getPropertyValue('-webkit-mask-image');\n\t\tif (maskImage && maskImage !== 'none') {\n\t\t\tif (maskImage.includes('url(') && !maskImage.includes('data:')) {\n\t\t\t\thtmlEl.style.setProperty('mask-image', 'none');\n\t\t\t\thtmlEl.style.setProperty('-webkit-mask-image', 'none');\n\t\t\t}\n\t\t}\n\n\t\tconst boxReflect = computed.getPropertyValue('-webkit-box-reflect');\n\t\tif (boxReflect && boxReflect !== 'none') {\n\t\t\thtmlEl.style.setProperty('-webkit-box-reflect', 'none');\n\t\t}\n\n\t\tconst textStroke = computed.getPropertyValue('-webkit-text-stroke');\n\t\tif (textStroke && textStroke !== '0px' && textStroke !== '0px rgb(0, 0, 0)') {\n\t\t\tconst strokeMatch = textStroke.match(/([\\d.]+)px\\s+(.*)/u);\n\t\t\tif (strokeMatch) {\n\t\t\t\tconst width = parseFloat(strokeMatch[1]);\n\t\t\t\tconst colour = strokeMatch[2] || 'black';\n\t\t\t\tconst offsets = [\n\t\t\t\t\t[width, 0],\n\t\t\t\t\t[-width, 0],\n\t\t\t\t\t[0, width],\n\t\t\t\t\t[0, -width],\n\t\t\t\t];\n\t\t\t\tconst shadows = offsets.map(([x, y]) => `${x}px ${y}px 0 ${colour}`).join(', ');\n\t\t\t\tconst existing = computed.getPropertyValue('text-shadow');\n\t\t\t\tconst combined = existing && existing !== 'none' ? `${existing}, ${shadows}` : shadows;\n\t\t\t\thtmlEl.style.setProperty('text-shadow', combined);\n\t\t\t\thtmlEl.style.setProperty('-webkit-text-stroke', '0');\n\t\t\t}\n\t\t}\n\t};\n\n\tprocessEl(root);\n\telements.forEach(processEl);\n}\n\n/* ------------------------------------------------------------------ */\n/* Test-only exports */\n/* ------------------------------------------------------------------ */\n\n/**\n * @internal Exported for unit testing only — not part of the public API.\n */\nexport const _testing = {\n\tUNSUPPORTED_COLOR_RE,\n\tUNSUPPORTED_COLOR_FN_RE,\n\tresolveColorToSrgb,\n\treplaceUnsupportedColors,\n\tresolveUnsupportedColours,\n\tresolveRootCustomProperties,\n\tpatchStylesheets,\n\tconvertBlobUrlsToDataUrls,\n\tblobUrlToDataUrl,\n\tCOLOR_PROPERTIES,\n\tCOMPLEX_COLOR_PROPERTIES,\n\t/** Reset the lazily-cached scratch context (useful in tests). */\n\tresetScratchCtx() {\n\t\t_scratchCtx = undefined;\n\t},\n\t/** Override the scratch context with a mock (useful in tests). */\n\tsetScratchCtx(ctx: CanvasRenderingContext2D | null) {\n\t\t_scratchCtx = ctx;\n\t},\n} as const;\n\n/* ------------------------------------------------------------------ */\n/* Public API */\n/* ------------------------------------------------------------------ */\n\n/**\n * A drop-in replacement for `html2canvas(element, options)` that first\n * resolves any oklch / oklab / lch / lab / color() values in the cloned\n * DOM to rgb()/hex, preventing parse errors in html2canvas ≤ 1.x.\n *\n * Three-pronged approach:\n * 1. Patch `<style>` elements to replace oklch in CSS custom properties.\n * 2. Resolve `:root` / `<body>` inline custom properties.\n * 3. Walk every element and convert computed colour values to sRGB.\n *\n * Usage:\n * ```ts\n * import { renderToCanvas } from '../lib/canvas-export';\n * const canvas = await renderToCanvas(element, { scale: 2 });\n * ```\n */\nexport async function renderToCanvas(\n\telement: HTMLElement,\n\toptions: Partial<Html2CanvasOptions> = {},\n): Promise<HTMLCanvasElement> {\n\tconst userOnClone = options.onclone;\n\n\treturn html2canvasPro(element, {\n\t\t...options,\n\t\tonclone: async (doc: Document, clonedEl: HTMLElement) => {\n\t\t\t// Phase 0: Convert blob: URLs to data: URLs so html2canvas can load them.\n\t\t\t// blob: URLs fail when useCORS is true because they don't serve CORS headers.\n\t\t\tawait convertBlobUrlsToDataUrls(clonedEl);\n\n\t\t\t// Phase 1: Patch stylesheets and root custom properties (colour fix)\n\t\t\tpatchStylesheets(doc);\n\t\t\tresolveRootCustomProperties(doc);\n\t\t\tresolveUnsupportedColours(clonedEl);\n\n\t\t\t// Phase 2: CSS preprocessing — flatten backdrop-filter, mix-blend-mode,\n\t\t\t// 3D transforms, and remove unsupported features\n\t\t\tpreprocessCssForCapture(clonedEl);\n\n\t\t\t// Honour any caller-provided onclone as well.\n\t\t\tif (typeof userOnClone === 'function') {\n\t\t\t\tuserOnClone(doc, clonedEl);\n\t\t\t}\n\t\t},\n\t});\n}\n","/**\n * ExportService — PNG and PDF export for the Angular viewer.\n *\n * Rasterisation is delegated to `renderToCanvas` (an html2canvas-pro wrapper\n * from `../lib/canvas-export`). PDF assembly uses jsPDF. Pure logic\n * (orientation, page-size maths, file-name helpers) lives in\n * `./export-helpers` and is tested independently.\n *\n * Provide at the component level so its lifetime tracks the host viewer:\n * `@Component({ providers: [ExportService] })`.\n */\n\nimport { Injectable } from '@angular/core';\nimport { jsPDF } from 'jspdf';\n\nimport { renderToCanvas } from '../lib/canvas-export';\nimport { pdfPageSize, sanitizeFileName } from './export-helpers';\n\n/* ------------------------------------------------------------------ */\n/* Internal helpers (DOM only — not exported) */\n/* ------------------------------------------------------------------ */\n\n/**\n * Trigger a browser download for a Blob.\n *\n * @param blob - The content to download.\n * @param fileName - The suggested file name shown to the user.\n */\nfunction downloadBlob(blob: Blob, fileName: string): void {\n\tconst url = URL.createObjectURL(blob);\n\tconst anchor = document.createElement('a');\n\tanchor.href = url;\n\tanchor.download = sanitizeFileName(fileName);\n\tanchor.style.display = 'none';\n\tdocument.body.appendChild(anchor);\n\tanchor.click();\n\tdocument.body.removeChild(anchor);\n\t// Revoke asynchronously so the download has time to start.\n\tsetTimeout(() => {\n\t\tURL.revokeObjectURL(url);\n\t}, 10_000);\n}\n\n/**\n * Convert an HTMLCanvasElement to a JPEG `Uint8Array` immediately, then let\n * the canvas be GC'd. This keeps peak memory manageable for multi-slide PDFs.\n *\n * @param canvas - The rendered slide canvas.\n * @param quality - JPEG quality 0–1 (default 0.92).\n */\nfunction canvasToJpegBytes(canvas: HTMLCanvasElement, quality: number = 0.92): Uint8Array {\n\tconst dataUrl = canvas.toDataURL('image/jpeg', quality);\n\tconst base64 = dataUrl.split(',')[1] ?? '';\n\tconst raw = atob(base64);\n\tconst bytes = new Uint8Array(raw.length);\n\tfor (let i = 0; i < raw.length; i++) {\n\t\tbytes[i] = raw.charCodeAt(i);\n\t}\n\treturn bytes;\n}\n\n/* ------------------------------------------------------------------ */\n/* ExportService */\n/* ------------------------------------------------------------------ */\n\n@Injectable()\nexport class ExportService {\n\t/**\n\t * Rasterize a single DOM element to PNG and trigger a browser download.\n\t *\n\t * @param el - The element to capture (e.g. the `.pptx-ng-canvas-stage`).\n\t * @param fileName - Suggested download file name (unsafe chars are stripped).\n\t * @param scale - Device-pixel ratio multiplier (default 2 for sharp output).\n\t */\n\tasync exportElementToPng(el: HTMLElement, fileName: string, scale: number = 2): Promise<void> {\n\t\tconst canvas = await renderToCanvas(el, { scale });\n\n\t\tconst blob = await new Promise<Blob>((resolve, reject) => {\n\t\t\tcanvas.toBlob((b) => {\n\t\t\t\tif (b) {\n\t\t\t\t\tresolve(b);\n\t\t\t\t} else {\n\t\t\t\t\treject(new Error('[ExportService] canvas.toBlob returned null'));\n\t\t\t\t}\n\t\t\t}, 'image/png');\n\t\t});\n\n\t\tdownloadBlob(blob, sanitizeFileName(fileName));\n\t}\n\n\t/**\n\t * Rasterize a single element to a canvas (passthrough to html2canvas-pro).\n\t * Capture each slide's canvas *while that slide is the live DOM* — the\n\t * viewer reuses one stage node, so a deferred capture would yield the same\n\t * (last) slide for every page.\n\t */\n\tasync renderElement(el: HTMLElement, scale: number = 2): Promise<HTMLCanvasElement> {\n\t\treturn renderToCanvas(el, { scale });\n\t}\n\n\t/**\n\t * Assemble a multi-page PDF from pre-rendered slide canvases (one page per\n\t * canvas, sized to the slide aspect ratio in pt) and trigger a download.\n\t *\n\t * @param canvases - One canvas per slide, in order, each captured while\n\t * its slide was the live stage.\n\t * @param canvasWidth - Slide canvas width in pixels (for aspect ratio).\n\t * @param canvasHeight - Slide canvas height in pixels (for aspect ratio).\n\t * @param fileName - Suggested download file name (unsafe chars stripped).\n\t */\n\texportCanvasesToPdf(\n\t\tcanvases: HTMLCanvasElement[],\n\t\tcanvasWidth: number,\n\t\tcanvasHeight: number,\n\t\tfileName: string,\n\t): void {\n\t\tif (canvases.length === 0) {\n\t\t\tthrow new Error('[ExportService] No slide canvases provided for PDF export');\n\t\t}\n\n\t\tconst { width: pageW, height: pageH, orientation } = pdfPageSize(canvasWidth, canvasHeight);\n\t\tconst doc = new jsPDF({ orientation, unit: 'pt', format: [pageW, pageH] });\n\n\t\tfor (let i = 0; i < canvases.length; i++) {\n\t\t\tconst jpegBytes = canvasToJpegBytes(canvases[i]);\n\t\t\tconst imgProps = doc.getImageProperties(jpegBytes);\n\t\t\tconst scale = Math.min(pageW / imgProps.width, pageH / imgProps.height);\n\t\t\tconst dw = imgProps.width * scale;\n\t\t\tconst dh = imgProps.height * scale;\n\t\t\tconst dx = (pageW - dw) / 2;\n\t\t\tconst dy = (pageH - dh) / 2;\n\n\t\t\tif (i > 0) {\n\t\t\t\tdoc.addPage([pageW, pageH], orientation);\n\t\t\t}\n\t\t\tdoc.addImage(jpegBytes, 'JPEG', dx, dy, dw, dh);\n\t\t}\n\n\t\tdoc.save(sanitizeFileName(fileName));\n\t}\n}\n","/**\n * slide-search.ts — Pure text-search helpers for PPTX slides.\n *\n * No Angular imports; safe to use in web workers or server-side code.\n *\n * @module slide-search\n */\n\nimport type { PptxElement, PptxSlide, PptxSmartArtNode } from 'pptx-viewer-core';\n\n// ---------------------------------------------------------------------------\n// Result type\n// ---------------------------------------------------------------------------\n\n/**\n * A single slide that matched a text search query.\n */\nexport interface SlideSearchMatch {\n\t/** Zero-based index of the matching slide in the slides array. */\n\tslideIndex: number;\n\t/** Number of (overlapping) occurrences of the query on this slide. */\n\tmatchCount: number;\n\t/**\n\t * A short snippet of text surrounding the first match.\n\t * Includes a few characters of context on each side.\n\t */\n\tsnippet: string;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/** Half-width of the context window around the first match (characters). */\nconst SNIPPET_CONTEXT = 40;\n\n/**\n * Collect all visible text from a single SmartArt node and its children.\n * Exported only for testing; consumers should prefer {@link collectElementText}.\n */\nfunction collectSmartArtNodeText(node: PptxSmartArtNode): string {\n\tconst parts: string[] = [node.text];\n\tif (node.children) {\n\t\tfor (const child of node.children) {\n\t\t\tparts.push(collectSmartArtNodeText(child));\n\t\t}\n\t}\n\treturn parts.join(' ');\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Collect all visible text from a single {@link PptxElement}.\n *\n * - `text` / `shape` / `connector` — flat `text` field + `textSegments[].text`.\n * - `table` — iterates `tableData.rows[].cells[].text`.\n * - `smartArt` — recursively collects `smartArtData.nodes[].text`.\n * - `group` — recurses into `children`.\n * - All other element types produce an empty string.\n */\nexport function collectElementText(element: PptxElement): string {\n\tconst parts: string[] = [];\n\n\tif (element.type === 'text' || element.type === 'shape' || element.type === 'connector') {\n\t\tif (element.text) {\n\t\t\tparts.push(element.text);\n\t\t}\n\t\tif (element.textSegments) {\n\t\t\tfor (const seg of element.textSegments) {\n\t\t\t\tif (seg.text) {\n\t\t\t\t\tparts.push(seg.text);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else if (element.type === 'table') {\n\t\tconst tableData = element.tableData;\n\t\tif (tableData) {\n\t\t\tfor (const row of tableData.rows) {\n\t\t\t\tfor (const cell of row.cells) {\n\t\t\t\t\tif (cell.text) {\n\t\t\t\t\t\tparts.push(cell.text);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else if (element.type === 'smartArt') {\n\t\tconst smartArtData = element.smartArtData;\n\t\tif (smartArtData) {\n\t\t\tfor (const node of smartArtData.nodes) {\n\t\t\t\tparts.push(collectSmartArtNodeText(node));\n\t\t\t}\n\t\t}\n\t} else if (element.type === 'group') {\n\t\tfor (const child of element.children) {\n\t\t\tparts.push(collectElementText(child));\n\t\t}\n\t}\n\n\treturn parts.join(' ');\n}\n\n/**\n * Collect all visible text from a {@link PptxSlide}, including speaker notes.\n */\nexport function collectSlideText(slide: PptxSlide): string {\n\tconst parts: string[] = [];\n\n\tfor (const element of slide.elements) {\n\t\tconst text = collectElementText(element);\n\t\tif (text) {\n\t\t\tparts.push(text);\n\t\t}\n\t}\n\n\tif (slide.notes) {\n\t\tparts.push(slide.notes);\n\t}\n\n\treturn parts.join(' ');\n}\n\n/**\n * Build a snippet string: up to {@link SNIPPET_CONTEXT} characters before and\n * after the first match position, trimmed to word boundaries where possible.\n */\nfunction buildSnippet(haystack: string, lowerHaystack: string, lowerQuery: string): string {\n\tconst idx = lowerHaystack.indexOf(lowerQuery);\n\tif (idx === -1) {\n\t\treturn '';\n\t}\n\tconst start = Math.max(0, idx - SNIPPET_CONTEXT);\n\tconst end = Math.min(haystack.length, idx + lowerQuery.length + SNIPPET_CONTEXT);\n\tconst raw = haystack.slice(start, end);\n\tconst prefix = start > 0 ? '…' : '';\n\tconst suffix = end < haystack.length ? '…' : '';\n\treturn prefix + raw + suffix;\n}\n\n/**\n * Count all (possibly overlapping) occurrences of `lowerQuery` in `lowerText`.\n */\nfunction countOccurrences(lowerText: string, lowerQuery: string): number {\n\tlet count = 0;\n\tlet pos = 0;\n\twhile (true) {\n\t\tconst found = lowerText.indexOf(lowerQuery, pos);\n\t\tif (found === -1) {\n\t\t\tbreak;\n\t\t}\n\t\tcount++;\n\t\tpos = found + 1;\n\t}\n\treturn count;\n}\n\n/**\n * Search all slides for `query` (case-insensitive substring match).\n *\n * Returns an empty array when `query` is empty or whitespace-only.\n */\nexport function searchSlides(slides: readonly PptxSlide[], query: string): SlideSearchMatch[] {\n\tconst trimmed = query.trim();\n\tif (!trimmed) {\n\t\treturn [];\n\t}\n\n\tconst lowerQuery = trimmed.toLowerCase();\n\tconst results: SlideSearchMatch[] = [];\n\n\tfor (let i = 0; i < slides.length; i++) {\n\t\tconst slide = slides[i];\n\t\tconst text = collectSlideText(slide);\n\t\tconst lowerText = text.toLowerCase();\n\n\t\tconst matchCount = countOccurrences(lowerText, lowerQuery);\n\t\tif (matchCount > 0) {\n\t\t\tresults.push({\n\t\t\t\tslideIndex: i,\n\t\t\t\tmatchCount,\n\t\t\t\tsnippet: buildSnippet(text, lowerText, lowerQuery),\n\t\t\t});\n\t\t}\n\t}\n\n\treturn results;\n}\n","/**\n * find-bar.component.ts — Floating text-search bar for the PPTX viewer.\n *\n * Selector: `pptx-find-bar`\n *\n * Usage:\n * ```html\n * <pptx-find-bar\n * [slides]=\"loader.slides()\"\n * (navigate)=\"goTo($event)\"\n * (closed)=\"showFind.set(false)\"\n * />\n * ```\n */\n\nimport {\n\tChangeDetectionStrategy,\n\tComponent,\n\tElementRef,\n\tHostListener,\n\tcomputed,\n\tinput,\n\toutput,\n\tsignal,\n\tviewChild,\n} from '@angular/core';\nimport type { PptxSlide } from 'pptx-viewer-core';\n\nimport { searchSlides } from './slide-search';\nimport type { SlideSearchMatch } from './slide-search';\n\n@Component({\n\tselector: 'pptx-find-bar',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplate: `\n\t\t<div class=\"pptx-find-bar\" role=\"search\" aria-label=\"Find in slides\">\n\t\t\t<!-- Input row -->\n\t\t\t<div class=\"pptx-find-bar__row\">\n\t\t\t\t<input\n\t\t\t\t\t#queryInput\n\t\t\t\t\tclass=\"pptx-find-bar__input\"\n\t\t\t\t\ttype=\"search\"\n\t\t\t\t\tplaceholder=\"Find in slides…\"\n\t\t\t\t\taria-label=\"Search query\"\n\t\t\t\t\t[value]=\"query()\"\n\t\t\t\t\t(input)=\"onInput($event)\"\n\t\t\t\t\t(keydown.enter)=\"next()\"\n\t\t\t\t/>\n\n\t\t\t\t<span class=\"pptx-find-bar__count\" aria-live=\"polite\" aria-atomic=\"true\">\n\t\t\t\t\t@if (query().trim()) {\n\t\t\t\t\t\t@if (totalMatches() === 0) {\n\t\t\t\t\t\t\tNo results\n\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t{{ activeMatchDisplay() }} / {{ totalMatches() }} result{{\n\t\t\t\t\t\t\t\ttotalMatches() === 1 ? '' : 's'\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tacross {{ matches().length }} slide{{ matches().length === 1 ? '' : 's' }}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t</span>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-find-bar__btn\"\n\t\t\t\t\taria-label=\"Previous match\"\n\t\t\t\t\t[disabled]=\"totalMatches() === 0\"\n\t\t\t\t\t(click)=\"prev()\"\n\t\t\t\t>\n\t\t\t\t\t↑\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-find-bar__btn\"\n\t\t\t\t\taria-label=\"Next match\"\n\t\t\t\t\t[disabled]=\"totalMatches() === 0\"\n\t\t\t\t\t(click)=\"next()\"\n\t\t\t\t>\n\t\t\t\t\t↓\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-find-bar__btn pptx-find-bar__btn--close\"\n\t\t\t\t\taria-label=\"Close find bar\"\n\t\t\t\t\t(click)=\"close()\"\n\t\t\t\t>\n\t\t\t\t\t✕\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<!-- Snippet preview for the active match -->\n\t\t\t@if (activeSnippet()) {\n\t\t\t\t<div class=\"pptx-find-bar__snippet\" aria-label=\"Match context\">\n\t\t\t\t\t{{ activeSnippet() }}\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t`,\n\tstyles: [\n\t\t`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t\tposition: fixed;\n\t\t\t\ttop: 3.5rem;\n\t\t\t\tright: 1rem;\n\t\t\t\tz-index: 100;\n\t\t\t}\n\n\t\t\t.pptx-find-bar {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 0.25rem;\n\t\t\t\tmin-width: 22rem;\n\t\t\t\tpadding: 0.5rem 0.625rem;\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.12);\n\t\t\t\tborder-radius: 0.375rem;\n\t\t\t\tbackground: #1e1e1e;\n\t\t\t\tcolor: #e5e5e5;\n\t\t\t\tbox-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);\n\t\t\t\tfont-size: 0.8125rem;\n\t\t\t}\n\n\t\t\t.pptx-find-bar__row {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 0.375rem;\n\t\t\t}\n\n\t\t\t.pptx-find-bar__input {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t\tpadding: 0.3rem 0.5rem;\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.15);\n\t\t\t\tborder-radius: 0.25rem;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.06);\n\t\t\t\tcolor: inherit;\n\t\t\t\tfont-size: inherit;\n\t\t\t\toutline: none;\n\t\t\t}\n\n\t\t\t.pptx-find-bar__input:focus {\n\t\t\t\tborder-color: #3b82f6;\n\t\t\t\tbackground: rgba(59, 130, 246, 0.08);\n\t\t\t}\n\n\t\t\t/* Remove the default search cancel button in WebKit */\n\t\t\t.pptx-find-bar__input::-webkit-search-cancel-button {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\n\t\t\t.pptx-find-bar__count {\n\t\t\t\twhite-space: nowrap;\n\t\t\t\tcolor: rgba(255, 255, 255, 0.5);\n\t\t\t\tfont-size: 0.75rem;\n\t\t\t\tmin-width: 7rem;\n\t\t\t\ttext-align: right;\n\t\t\t}\n\n\t\t\t.pptx-find-bar__btn {\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\twidth: 1.75rem;\n\t\t\t\theight: 1.75rem;\n\t\t\t\tpadding: 0;\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.1);\n\t\t\t\tborder-radius: 0.25rem;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.06);\n\t\t\t\tcolor: inherit;\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition: background 0.12s;\n\t\t\t\tflex-shrink: 0;\n\t\t\t\tfont-size: 0.875rem;\n\t\t\t\tline-height: 1;\n\t\t\t}\n\n\t\t\t.pptx-find-bar__btn:hover:not(:disabled) {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.14);\n\t\t\t}\n\n\t\t\t.pptx-find-bar__btn:disabled {\n\t\t\t\topacity: 0.35;\n\t\t\t\tcursor: not-allowed;\n\t\t\t}\n\n\t\t\t.pptx-find-bar__btn--close {\n\t\t\t\tborder-color: transparent;\n\t\t\t\tfont-size: 0.75rem;\n\t\t\t}\n\n\t\t\t.pptx-find-bar__snippet {\n\t\t\t\tpadding: 0.25rem 0.375rem;\n\t\t\t\tborder-radius: 0.25rem;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.04);\n\t\t\t\tcolor: rgba(255, 255, 255, 0.6);\n\t\t\t\tfont-size: 0.6875rem;\n\t\t\t\tline-height: 1.4;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t}\n\t\t`,\n\t],\n})\nexport class FindBarComponent {\n\t// -------------------------------------------------------------------------\n\t// Inputs / outputs\n\t// -------------------------------------------------------------------------\n\n\t/** All slides in the current presentation. */\n\treadonly slides = input.required<PptxSlide[]>();\n\n\t/** Emits the zero-based slide index to navigate to. */\n\treadonly navigate = output<number>();\n\n\t/** Emits when the user closes the find bar (Escape or ✕). */\n\treadonly closed = output<void>();\n\n\t// -------------------------------------------------------------------------\n\t// Template reference\n\t// -------------------------------------------------------------------------\n\n\tprivate readonly queryInputRef = viewChild<ElementRef<HTMLInputElement>>('queryInput');\n\n\t// -------------------------------------------------------------------------\n\t// State\n\t// -------------------------------------------------------------------------\n\n\t/** Current text typed into the search input. */\n\treadonly query = signal('');\n\n\t/**\n\t * Zero-based index into the flat `matches` array tracking which result is\n\t * currently highlighted. Clamped whenever `matches` changes.\n\t */\n\treadonly activeMatchIndex = signal(0);\n\n\t// -------------------------------------------------------------------------\n\t// Derived\n\t// -------------------------------------------------------------------------\n\n\t/** Slides that contain at least one match for the current query. */\n\treadonly matches = computed<SlideSearchMatch[]>(() => searchSlides(this.slides(), this.query()));\n\n\t/** Total number of individual occurrences across all matching slides. */\n\treadonly totalMatches = computed<number>(() =>\n\t\tthis.matches().reduce((sum, m) => sum + m.matchCount, 0),\n\t);\n\n\t/**\n\t * 1-based display position (which slide-level result we're on).\n\t * Accounts for clamping when the match list shrinks.\n\t */\n\treadonly activeMatchDisplay = computed<number>(() => {\n\t\tconst len = this.matches().length;\n\t\tif (len === 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tconst idx = Math.min(this.activeMatchIndex(), len - 1);\n\t\treturn idx + 1;\n\t});\n\n\t/** Snippet text for the currently active match. */\n\treadonly activeSnippet = computed<string>(() => {\n\t\tconst ms = this.matches();\n\t\tif (ms.length === 0) {\n\t\t\treturn '';\n\t\t}\n\t\tconst idx = Math.min(this.activeMatchIndex(), ms.length - 1);\n\t\treturn ms[idx].snippet;\n\t});\n\n\t// -------------------------------------------------------------------------\n\t// Keyboard handling\n\t// -------------------------------------------------------------------------\n\n\t/**\n\t * Pressing Escape anywhere on the document closes the find bar.\n\t * (Enter inside the input already calls `next()` via `keydown.enter`.)\n\t */\n\t@HostListener('document:keydown', ['$event'])\n\tonDocumentKeydown(event: KeyboardEvent): void {\n\t\tif (event.key === 'Escape') {\n\t\t\tevent.preventDefault();\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Event handlers\n\t// -------------------------------------------------------------------------\n\n\tonInput(event: Event): void {\n\t\tconst target = event.target as HTMLInputElement;\n\t\tthis.query.set(target.value);\n\t\t// Reset to first match whenever the query changes.\n\t\tthis.activeMatchIndex.set(0);\n\t\tthis._emitCurrentSlide();\n\t}\n\n\tnext(): void {\n\t\tconst len = this.matches().length;\n\t\tif (len === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst next = (this.activeMatchIndex() + 1) % len;\n\t\tthis.activeMatchIndex.set(next);\n\t\tthis._emitCurrentSlide();\n\t}\n\n\tprev(): void {\n\t\tconst len = this.matches().length;\n\t\tif (len === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst prev = (this.activeMatchIndex() - 1 + len) % len;\n\t\tthis.activeMatchIndex.set(prev);\n\t\tthis._emitCurrentSlide();\n\t}\n\n\tclose(): void {\n\t\tthis.closed.emit();\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Internal helpers\n\t// -------------------------------------------------------------------------\n\n\tprivate _emitCurrentSlide(): void {\n\t\tconst ms = this.matches();\n\t\tif (ms.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst idx = Math.min(this.activeMatchIndex(), ms.length - 1);\n\t\tthis.navigate.emit(ms[idx].slideIndex);\n\t}\n}\n","/**\n * inspector-helpers.ts — Pure (no Angular) helpers for the inspector panel.\n *\n * Readers extract display values from a PptxElement (with sensible defaults),\n * and patch builders produce shallow-merge-ready Partial<PptxElement> objects\n * for EditorStateService.updateElement.\n */\n\nimport type { PptxElement } from 'pptx-viewer-core';\nimport { hasShapeProperties, hasTextProperties } from 'pptx-viewer-core';\n\n// ── Colour defaults ──────────────────────────────────────────────────────────\n\nconst DEFAULT_FILL = '#ffffff';\nconst DEFAULT_STROKE = '#000000';\nconst DEFAULT_TEXT_COLOR = '#000000';\nconst DEFAULT_FONT_SIZE = 12;\n\n// ── Readers ──────────────────────────────────────────────────────────────────\n\n/**\n * Returns the fill colour of the element's shapeStyle, or a white default.\n * Only meaningful for elements that pass `hasShapeProperties`.\n */\nexport function fillColorOf(el: PptxElement): string {\n\tif (hasShapeProperties(el)) {\n\t\treturn el.shapeStyle?.fillColor ?? DEFAULT_FILL;\n\t}\n\treturn DEFAULT_FILL;\n}\n\n/**\n * Returns the stroke colour of the element's shapeStyle, or a black default.\n * Only meaningful for elements that pass `hasShapeProperties`.\n */\nexport function strokeColorOf(el: PptxElement): string {\n\tif (hasShapeProperties(el)) {\n\t\treturn el.shapeStyle?.strokeColor ?? DEFAULT_STROKE;\n\t}\n\treturn DEFAULT_STROKE;\n}\n\n/**\n * Returns the text colour from the element's textStyle, or a black default.\n * Only meaningful for elements that pass `hasTextProperties`.\n */\nexport function textColorOf(el: PptxElement): string {\n\tif (hasTextProperties(el)) {\n\t\treturn el.textStyle?.color ?? DEFAULT_TEXT_COLOR;\n\t}\n\treturn DEFAULT_TEXT_COLOR;\n}\n\n/**\n * Returns the font size (in points) from the element's textStyle,\n * or DEFAULT_FONT_SIZE when absent.\n */\nexport function fontSizeOf(el: PptxElement): number {\n\tif (hasTextProperties(el)) {\n\t\treturn el.textStyle?.fontSize ?? DEFAULT_FONT_SIZE;\n\t}\n\treturn DEFAULT_FONT_SIZE;\n}\n\n/**\n * Returns whether the element's text is bold (false when absent).\n */\nexport function isBold(el: PptxElement): boolean {\n\tif (hasTextProperties(el)) {\n\t\treturn el.textStyle?.bold ?? false;\n\t}\n\treturn false;\n}\n\n/**\n * Returns whether the element's text is italic (false when absent).\n */\nexport function isItalic(el: PptxElement): boolean {\n\tif (hasTextProperties(el)) {\n\t\treturn el.textStyle?.italic ?? false;\n\t}\n\treturn false;\n}\n\n/**\n * Returns whether the element's text has underline (false when absent).\n */\nexport function isUnderline(el: PptxElement): boolean {\n\tif (hasTextProperties(el)) {\n\t\treturn el.textStyle?.underline ?? false;\n\t}\n\treturn false;\n}\n\n// ── Patch builders ───────────────────────────────────────────────────────────\n\n/**\n * Changes to apply to shapeStyle — a subset of ShapeStyle fields editable\n * from the inspector panel.\n */\nexport interface ShapeStyleChanges {\n\tfillColor?: string;\n\tstrokeColor?: string;\n}\n\n/**\n * Builds a Partial<PptxElement> patch that merges the given changes into the\n * element's existing shapeStyle without dropping any other shapeStyle fields.\n *\n * Safe to pass directly to EditorStateService.updateElement.\n */\nexport function shapeStylePatch(el: PptxElement, changes: ShapeStyleChanges): Partial<PptxElement> {\n\tconst base = hasShapeProperties(el) ? (el.shapeStyle ?? {}) : {};\n\treturn {\n\t\tshapeStyle: {\n\t\t\t...base,\n\t\t\t...changes,\n\t\t},\n\t} as Partial<PptxElement>;\n}\n\n/**\n * Changes to apply to textStyle — a subset of TextStyle fields editable\n * from the inspector panel.\n */\nexport interface TextStyleChanges {\n\tcolor?: string;\n\tfontSize?: number;\n\tbold?: boolean;\n\titalic?: boolean;\n\tunderline?: boolean;\n}\n\n/**\n * Builds a Partial<PptxElement> patch that merges the given changes into the\n * element's existing textStyle without dropping any other textStyle fields.\n *\n * Safe to pass directly to EditorStateService.updateElement.\n */\nexport function textStylePatch(el: PptxElement, changes: TextStyleChanges): Partial<PptxElement> {\n\tconst base = hasTextProperties(el) ? (el.textStyle ?? {}) : {};\n\treturn {\n\t\ttextStyle: {\n\t\t\t...base,\n\t\t\t...changes,\n\t\t},\n\t} as Partial<PptxElement>;\n}\n","/**\n * inspector-panel.component.ts — Editor inspector panel for the PPTX viewer.\n *\n * Selector: `pptx-inspector-panel`\n *\n * Renders a compact property panel for the single selected element.\n * All value-extraction and patch-building is delegated to inspector-helpers.ts.\n *\n * Usage:\n * ```html\n * <pptx-inspector-panel\n * [element]=\"selectedElement\"\n * [slideIndex]=\"activeSlideIndex()\"\n * />\n * ```\n */\n\nimport { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport type { PptxElement } from 'pptx-viewer-core';\nimport { hasShapeProperties, hasTextProperties } from 'pptx-viewer-core';\n\nimport { EditorStateService } from './editor-state.service';\nimport {\n\tfillColorOf,\n\tfontSizeOf,\n\tisBold,\n\tisItalic,\n\tisUnderline,\n\tshapeStylePatch,\n\tstrokeColorOf,\n\ttextColorOf,\n\ttextStylePatch,\n} from './inspector-helpers';\n\n@Component({\n\tselector: 'pptx-inspector-panel',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\ttemplate: `\n\t\t<!--\n\t\t\tNOTE (mobile-safe inputs): every numeric / colour input is keyed on the\n\t\t\tselected element's id via @if blocks. Angular destroys and recreates the\n\t\t\t<input> only when a *different* element is selected, seeding its initial\n\t\t\tvalue once. While the user types, the [value] binding is NOT re-evaluated\n\t\t\tagainst the live (just-patched) element, so .value is never rewritten\n\t\t\tmid-edit — the caret stays put and the on-screen keyboard does not dismiss.\n\t\t\tAll commits happen on (change) (blur), reading event.target.value.\n\t\t-->\n\t\t<aside class=\"pptx-ng-inspector\" aria-label=\"Element properties\">\n\t\t\t<!-- ── Transform: Position & Size ─────────────────────────────────── -->\n\t\t\t<section class=\"pptx-ng-inspector__section\">\n\t\t\t\t<h3 class=\"pptx-ng-inspector__heading\">Transform</h3>\n\n\t\t\t\t@if (elementKey(); as key) {\n\t\t\t\t\t<div class=\"pptx-ng-inspector__row\" [attr.data-el-key]=\"key\">\n\t\t\t\t\t\t<label class=\"pptx-ng-inspector__label\" for=\"insp-x\">X</label>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"insp-x\"\n\t\t\t\t\t\t\tclass=\"pptx-ng-inspector__input pptx-ng-inspector__input--number\"\n\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\tinputmode=\"numeric\"\n\t\t\t\t\t\t\t[value]=\"seed().x\"\n\t\t\t\t\t\t\t(change)=\"onPositionChange($event, 'x')\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<label class=\"pptx-ng-inspector__label\" for=\"insp-y\">Y</label>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"insp-y\"\n\t\t\t\t\t\t\tclass=\"pptx-ng-inspector__input pptx-ng-inspector__input--number\"\n\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\tinputmode=\"numeric\"\n\t\t\t\t\t\t\t[value]=\"seed().y\"\n\t\t\t\t\t\t\t(change)=\"onPositionChange($event, 'y')\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"pptx-ng-inspector__row\">\n\t\t\t\t\t\t<label class=\"pptx-ng-inspector__label\" for=\"insp-w\">W</label>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"insp-w\"\n\t\t\t\t\t\t\tclass=\"pptx-ng-inspector__input pptx-ng-inspector__input--number\"\n\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\tinputmode=\"numeric\"\n\t\t\t\t\t\t\tmin=\"1\"\n\t\t\t\t\t\t\t[value]=\"seed().width\"\n\t\t\t\t\t\t\t(change)=\"onSizeChange($event, 'width')\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<label class=\"pptx-ng-inspector__label\" for=\"insp-h\">H</label>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"insp-h\"\n\t\t\t\t\t\t\tclass=\"pptx-ng-inspector__input pptx-ng-inspector__input--number\"\n\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\tinputmode=\"numeric\"\n\t\t\t\t\t\t\tmin=\"1\"\n\t\t\t\t\t\t\t[value]=\"seed().height\"\n\t\t\t\t\t\t\t(change)=\"onSizeChange($event, 'height')\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"pptx-ng-inspector__row\">\n\t\t\t\t\t\t<label class=\"pptx-ng-inspector__label\" for=\"insp-rot\">Rot°</label>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"insp-rot\"\n\t\t\t\t\t\t\tclass=\"pptx-ng-inspector__input pptx-ng-inspector__input--number\"\n\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\tinputmode=\"numeric\"\n\t\t\t\t\t\t\t[value]=\"seed().rotation\"\n\t\t\t\t\t\t\t(change)=\"onRotationChange($event)\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<label class=\"pptx-ng-inspector__label\" for=\"insp-opacity\">Opacity</label>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"insp-opacity\"\n\t\t\t\t\t\t\tclass=\"pptx-ng-inspector__input pptx-ng-inspector__input--number\"\n\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\tinputmode=\"decimal\"\n\t\t\t\t\t\t\tmin=\"0\"\n\t\t\t\t\t\t\tmax=\"1\"\n\t\t\t\t\t\t\tstep=\"0.01\"\n\t\t\t\t\t\t\t[value]=\"seed().opacity\"\n\t\t\t\t\t\t\t(change)=\"onOpacityChange($event)\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</section>\n\n\t\t\t<!-- ── Shape fill & stroke (shape-style elements only) ────────────── -->\n\t\t\t@if (hasShape()) {\n\t\t\t\t<section class=\"pptx-ng-inspector__section\">\n\t\t\t\t\t<h3 class=\"pptx-ng-inspector__heading\">Fill & Stroke</h3>\n\n\t\t\t\t\t@if (elementKey(); as key) {\n\t\t\t\t\t\t<div class=\"pptx-ng-inspector__row\" [attr.data-el-key]=\"key\">\n\t\t\t\t\t\t\t<label class=\"pptx-ng-inspector__label\" for=\"insp-fill\">Fill</label>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid=\"insp-fill\"\n\t\t\t\t\t\t\t\tclass=\"pptx-ng-inspector__color\"\n\t\t\t\t\t\t\t\ttype=\"color\"\n\t\t\t\t\t\t\t\t[value]=\"seed().fillColor\"\n\t\t\t\t\t\t\t\t(change)=\"onFillColorChange($event)\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<label class=\"pptx-ng-inspector__label\" for=\"insp-stroke\">Stroke</label>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid=\"insp-stroke\"\n\t\t\t\t\t\t\t\tclass=\"pptx-ng-inspector__color\"\n\t\t\t\t\t\t\t\ttype=\"color\"\n\t\t\t\t\t\t\t\t[value]=\"seed().strokeColor\"\n\t\t\t\t\t\t\t\t(change)=\"onStrokeColorChange($event)\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t</section>\n\t\t\t}\n\n\t\t\t<!-- ── Text style (text-bearing elements only) ─────────────────────── -->\n\t\t\t@if (hasText()) {\n\t\t\t\t<section class=\"pptx-ng-inspector__section\">\n\t\t\t\t\t<h3 class=\"pptx-ng-inspector__heading\">Text</h3>\n\n\t\t\t\t\t@if (elementKey(); as key) {\n\t\t\t\t\t\t<div class=\"pptx-ng-inspector__row\" [attr.data-el-key]=\"key\">\n\t\t\t\t\t\t\t<label class=\"pptx-ng-inspector__label\" for=\"insp-text-color\">Color</label>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid=\"insp-text-color\"\n\t\t\t\t\t\t\t\tclass=\"pptx-ng-inspector__color\"\n\t\t\t\t\t\t\t\ttype=\"color\"\n\t\t\t\t\t\t\t\t[value]=\"seed().textColor\"\n\t\t\t\t\t\t\t\t(change)=\"onTextColorChange($event)\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<label class=\"pptx-ng-inspector__label\" for=\"insp-font-size\">Size</label>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid=\"insp-font-size\"\n\t\t\t\t\t\t\t\tclass=\"pptx-ng-inspector__input pptx-ng-inspector__input--number\"\n\t\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\t\tinputmode=\"numeric\"\n\t\t\t\t\t\t\t\tmin=\"1\"\n\t\t\t\t\t\t\t\t[value]=\"seed().fontSize\"\n\t\t\t\t\t\t\t\t(change)=\"onFontSizeChange($event)\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\n\t\t\t\t\t<div class=\"pptx-ng-inspector__row pptx-ng-inspector__row--toggles\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"pptx-ng-inspector__toggle\"\n\t\t\t\t\t\t\t[class.is-active]=\"currentBold()\"\n\t\t\t\t\t\t\taria-label=\"Bold\"\n\t\t\t\t\t\t\t(click)=\"onBoldToggle()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<strong>B</strong>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"pptx-ng-inspector__toggle\"\n\t\t\t\t\t\t\t[class.is-active]=\"currentItalic()\"\n\t\t\t\t\t\t\taria-label=\"Italic\"\n\t\t\t\t\t\t\t(click)=\"onItalicToggle()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<em>I</em>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"pptx-ng-inspector__toggle\"\n\t\t\t\t\t\t\t[class.is-active]=\"currentUnderline()\"\n\t\t\t\t\t\t\taria-label=\"Underline\"\n\t\t\t\t\t\t\t(click)=\"onUnderlineToggle()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span style=\"text-decoration:underline\">U</span>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</section>\n\t\t\t}\n\n\t\t\t<!-- ── Arrange ────────────────────────────────────────────────────── -->\n\t\t\t<section class=\"pptx-ng-inspector__section\">\n\t\t\t\t<h3 class=\"pptx-ng-inspector__heading\">Arrange</h3>\n\n\t\t\t\t<div class=\"pptx-ng-inspector__row\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"pptx-ng-inspector__btn\"\n\t\t\t\t\t\ttitle=\"Bring to Front\"\n\t\t\t\t\t\t(click)=\"editor.bringSelectedToFront(slideIndex())\"\n\t\t\t\t\t>\n\t\t\t\t\t\tFront\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"pptx-ng-inspector__btn\"\n\t\t\t\t\t\ttitle=\"Send to Back\"\n\t\t\t\t\t\t(click)=\"editor.sendSelectedToBack(slideIndex())\"\n\t\t\t\t\t>\n\t\t\t\t\t\tBack\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"pptx-ng-inspector__btn\"\n\t\t\t\t\t\ttitle=\"Bring Forward\"\n\t\t\t\t\t\t(click)=\"editor.bringSelectedForward(slideIndex())\"\n\t\t\t\t\t>\n\t\t\t\t\t\t↑\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"pptx-ng-inspector__btn\"\n\t\t\t\t\t\ttitle=\"Send Backward\"\n\t\t\t\t\t\t(click)=\"editor.sendSelectedBackward(slideIndex())\"\n\t\t\t\t\t>\n\t\t\t\t\t\t↓\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</section>\n\n\t\t\t<!-- ── Element actions ────────────────────────────────────────────── -->\n\t\t\t<section class=\"pptx-ng-inspector__section\">\n\t\t\t\t<div class=\"pptx-ng-inspector__row\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"pptx-ng-inspector__btn\"\n\t\t\t\t\t\t(click)=\"editor.duplicateSelected(slideIndex())\"\n\t\t\t\t\t>\n\t\t\t\t\t\tDuplicate\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"pptx-ng-inspector__btn pptx-ng-inspector__btn--danger\"\n\t\t\t\t\t\t(click)=\"editor.deleteSelected(slideIndex())\"\n\t\t\t\t\t>\n\t\t\t\t\t\tDelete\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</section>\n\t\t</aside>\n\t`,\n\tstyles: `\n\t\t.pptx-ng-inspector {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tgap: 0;\n\t\t\tpadding: 0.5rem;\n\t\t\tbackground: var(--pptx-inspector-bg, #1e1e1e);\n\t\t\tcolor: var(--pptx-inspector-fg, #e0e0e0);\n\t\t\tfont-size: 12px;\n\t\t\tmin-width: 220px;\n\t\t\toverflow-y: auto;\n\t\t}\n\n\t\t.pptx-ng-inspector__section {\n\t\t\tpadding: 0.5rem 0;\n\t\t\tborder-bottom: 1px solid var(--pptx-inspector-border, #333);\n\t\t}\n\n\t\t.pptx-ng-inspector__section:last-child {\n\t\t\tborder-bottom: none;\n\t\t}\n\n\t\t.pptx-ng-inspector__heading {\n\t\t\tfont-size: 10px;\n\t\t\tfont-weight: 600;\n\t\t\ttext-transform: uppercase;\n\t\t\tletter-spacing: 0.05em;\n\t\t\tcolor: var(--pptx-inspector-muted, #888);\n\t\t\tmargin: 0 0 0.35rem 0;\n\t\t}\n\n\t\t.pptx-ng-inspector__row {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tgap: 0.35rem;\n\t\t\tmargin-bottom: 0.35rem;\n\t\t}\n\n\t\t.pptx-ng-inspector__row:last-child {\n\t\t\tmargin-bottom: 0;\n\t\t}\n\n\t\t.pptx-ng-inspector__row--toggles {\n\t\t\tgap: 0.25rem;\n\t\t}\n\n\t\t.pptx-ng-inspector__label {\n\t\t\tfont-size: 10px;\n\t\t\tcolor: var(--pptx-inspector-muted, #888);\n\t\t\tmin-width: 32px;\n\t\t\ttext-align: right;\n\t\t\tflex-shrink: 0;\n\t\t}\n\n\t\t.pptx-ng-inspector__input {\n\t\t\tbackground: var(--pptx-inspector-input-bg, #2d2d2d);\n\t\t\tborder: 1px solid var(--pptx-inspector-border, #444);\n\t\t\tcolor: inherit;\n\t\t\tborder-radius: 3px;\n\t\t\tpadding: 2px 4px;\n\t\t\tfont-size: 12px;\n\t\t}\n\n\t\t.pptx-ng-inspector__input--number {\n\t\t\twidth: 62px;\n\t\t\ttext-align: right;\n\t\t}\n\n\t\t.pptx-ng-inspector__color {\n\t\t\twidth: 32px;\n\t\t\theight: 22px;\n\t\t\tborder: 1px solid var(--pptx-inspector-border, #444);\n\t\t\tborder-radius: 3px;\n\t\t\tpadding: 1px;\n\t\t\tcursor: pointer;\n\t\t\tbackground: transparent;\n\t\t\tflex-shrink: 0;\n\t\t}\n\n\t\t.pptx-ng-inspector__toggle {\n\t\t\twidth: 26px;\n\t\t\theight: 22px;\n\t\t\tbackground: var(--pptx-inspector-input-bg, #2d2d2d);\n\t\t\tborder: 1px solid var(--pptx-inspector-border, #444);\n\t\t\tcolor: inherit;\n\t\t\tborder-radius: 3px;\n\t\t\tcursor: pointer;\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\tfont-size: 12px;\n\t\t}\n\n\t\t/* ── Touch / mobile: larger hit targets + full-width inputs ─────────── */\n\t\t@media (pointer: coarse), (max-width: 640px) {\n\t\t\t.pptx-ng-inspector {\n\t\t\t\twidth: 100%;\n\t\t\t\tmin-width: 0;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tfont-size: 14px;\n\t\t\t}\n\n\t\t\t.pptx-ng-inspector__row {\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: 0.5rem;\n\t\t\t}\n\n\t\t\t.pptx-ng-inspector__label {\n\t\t\t\tmin-width: 28px;\n\t\t\t}\n\n\t\t\t.pptx-ng-inspector__input {\n\t\t\t\tflex: 1 1 auto;\n\t\t\t\tmin-height: 40px;\n\t\t\t\tfont-size: 16px; /* prevents iOS auto-zoom on focus */\n\t\t\t\tpadding: 6px 8px;\n\t\t\t}\n\n\t\t\t.pptx-ng-inspector__input--number {\n\t\t\t\twidth: auto;\n\t\t\t\tmin-width: 72px;\n\t\t\t}\n\n\t\t\t.pptx-ng-inspector__color {\n\t\t\t\twidth: 44px;\n\t\t\t\theight: 40px;\n\t\t\t}\n\n\t\t\t.pptx-ng-inspector__toggle {\n\t\t\t\tmin-width: 44px;\n\t\t\t\twidth: auto;\n\t\t\t\tflex: 1 1 auto;\n\t\t\t\theight: 40px;\n\t\t\t\tfont-size: 15px;\n\t\t\t}\n\n\t\t\t.pptx-ng-inspector__btn {\n\t\t\t\tmin-height: 40px;\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\tfont-size: 13px;\n\t\t\t}\n\t\t}\n\n\t\t.pptx-ng-inspector__toggle.is-active {\n\t\t\tbackground: var(--pptx-inspector-active, #0078d4);\n\t\t\tborder-color: var(--pptx-inspector-active, #0078d4);\n\t\t\tcolor: #fff;\n\t\t}\n\n\t\t.pptx-ng-inspector__btn {\n\t\t\tflex: 1;\n\t\t\tpadding: 3px 6px;\n\t\t\tbackground: var(--pptx-inspector-input-bg, #2d2d2d);\n\t\t\tborder: 1px solid var(--pptx-inspector-border, #444);\n\t\t\tcolor: inherit;\n\t\t\tborder-radius: 3px;\n\t\t\tcursor: pointer;\n\t\t\tfont-size: 11px;\n\t\t\twhite-space: nowrap;\n\t\t}\n\n\t\t.pptx-ng-inspector__btn:hover {\n\t\t\tbackground: var(--pptx-inspector-hover, #3a3a3a);\n\t\t}\n\n\t\t.pptx-ng-inspector__btn--danger {\n\t\t\tcolor: var(--pptx-inspector-danger, #f47c7c);\n\t\t\tborder-color: var(--pptx-inspector-danger-border, #6b2a2a);\n\t\t}\n\n\t\t.pptx-ng-inspector__btn--danger:hover {\n\t\t\tbackground: var(--pptx-inspector-danger-hover, #4a1a1a);\n\t\t}\n\t`,\n})\nexport class InspectorPanelComponent {\n\t/** The single selected element whose properties are being edited. */\n\treadonly element = input.required<PptxElement>();\n\t/** Zero-based index of the active slide. */\n\treadonly slideIndex = input.required<number>();\n\n\tprotected readonly editor = inject(EditorStateService);\n\n\t/** Alias so the template can call el() without conflicting with Angular internals. */\n\tprotected readonly el = computed(() => this.element());\n\n\t/**\n\t * Stable identity key for the selected element. Only changes when a\n\t * *different* element is selected. The seed signal below is keyed on this so\n\t * input [value] bindings never get rewritten while the user is typing into\n\t * the currently-selected element (caret-reset / keyboard-dismiss guard).\n\t */\n\tprotected readonly elementKey = computed(() => this.el().id);\n\n\t/**\n\t * One-shot seed of every editable field's initial display value, recomputed\n\t * only when `elementKey` changes (i.e. on selection change), NOT on every\n\t * edit commit. Bound to each <input>'s [value] so Angular re-evaluating the\n\t * binding during change-detection always yields the same value mid-edit and\n\t * therefore never rewrites the element's `.value` / resets the caret.\n\t */\n\tprotected readonly seed = computed(() => {\n\t\t// Depend on elementKey for stability, then read the element once.\n\t\tthis.elementKey();\n\t\tconst cur = this.el();\n\t\treturn {\n\t\t\tx: cur.x,\n\t\t\ty: cur.y,\n\t\t\twidth: cur.width,\n\t\t\theight: cur.height,\n\t\t\trotation: cur.rotation ?? 0,\n\t\t\topacity: cur.opacity ?? 1,\n\t\t\tfillColor: fillColorOf(cur),\n\t\t\tstrokeColor: strokeColorOf(cur),\n\t\t\ttextColor: textColorOf(cur),\n\t\t\tfontSize: fontSizeOf(cur),\n\t\t};\n\t});\n\n\t/** Whether the element supports shape-style (fill/stroke) editing. */\n\tprotected readonly hasShape = computed(() => hasShapeProperties(this.el()));\n\n\t/** Whether the element supports text-style editing. */\n\tprotected readonly hasText = computed(() => hasTextProperties(this.el()));\n\n\t// ── Computed display values (toggles only — buttons, no caret risk) ───────\n\n\tprotected readonly currentBold = computed(() => isBold(this.el()));\n\tprotected readonly currentItalic = computed(() => isItalic(this.el()));\n\tprotected readonly currentUnderline = computed(() => isUnderline(this.el()));\n\n\t// ── Position & size ──────────────────────────────────────────────────────\n\n\tprotected onPositionChange(event: Event, axis: 'x' | 'y'): void {\n\t\tconst val = numberFromEvent(event);\n\t\tif (val === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst cur = this.el();\n\t\tconst x = axis === 'x' ? val : cur.x;\n\t\tconst y = axis === 'y' ? val : cur.y;\n\t\tthis.editor.setPosition(this.slideIndex(), cur.id, x, y);\n\t}\n\n\tprotected onSizeChange(event: Event, dim: 'width' | 'height'): void {\n\t\tconst val = numberFromEvent(event);\n\t\tif (val === null || val < 1) {\n\t\t\treturn;\n\t\t}\n\t\tconst cur = this.el();\n\t\tconst width = dim === 'width' ? val : cur.width;\n\t\tconst height = dim === 'height' ? val : cur.height;\n\t\tthis.editor.resize(this.slideIndex(), cur.id, width, height);\n\t}\n\n\t// ── Rotation & opacity ───────────────────────────────────────────────────\n\n\tprotected onRotationChange(event: Event): void {\n\t\tconst val = numberFromEvent(event);\n\t\tif (val === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst cur = this.el();\n\t\tthis.editor.updateElement(this.slideIndex(), cur.id, { rotation: val } as Partial<PptxElement>);\n\t}\n\n\tprotected onOpacityChange(event: Event): void {\n\t\tconst val = numberFromEvent(event);\n\t\tif (val === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst clamped = Math.min(1, Math.max(0, val));\n\t\tconst cur = this.el();\n\t\tthis.editor.updateElement(this.slideIndex(), cur.id, {\n\t\t\topacity: clamped,\n\t\t} as Partial<PptxElement>);\n\t}\n\n\t// ── Fill & stroke ────────────────────────────────────────────────────────\n\n\tprotected onFillColorChange(event: Event): void {\n\t\tconst color = stringFromEvent(event);\n\t\tif (!color) {\n\t\t\treturn;\n\t\t}\n\t\tconst cur = this.el();\n\t\tthis.editor.updateElement(\n\t\t\tthis.slideIndex(),\n\t\t\tcur.id,\n\t\t\tshapeStylePatch(cur, { fillColor: color }),\n\t\t);\n\t}\n\n\tprotected onStrokeColorChange(event: Event): void {\n\t\tconst color = stringFromEvent(event);\n\t\tif (!color) {\n\t\t\treturn;\n\t\t}\n\t\tconst cur = this.el();\n\t\tthis.editor.updateElement(\n\t\t\tthis.slideIndex(),\n\t\t\tcur.id,\n\t\t\tshapeStylePatch(cur, { strokeColor: color }),\n\t\t);\n\t}\n\n\t// ── Text style ───────────────────────────────────────────────────────────\n\n\tprotected onTextColorChange(event: Event): void {\n\t\tconst color = stringFromEvent(event);\n\t\tif (!color) {\n\t\t\treturn;\n\t\t}\n\t\tconst cur = this.el();\n\t\tthis.editor.updateElement(this.slideIndex(), cur.id, textStylePatch(cur, { color }));\n\t}\n\n\tprotected onFontSizeChange(event: Event): void {\n\t\tconst val = numberFromEvent(event);\n\t\tif (val === null || val < 1) {\n\t\t\treturn;\n\t\t}\n\t\tconst cur = this.el();\n\t\tthis.editor.updateElement(this.slideIndex(), cur.id, textStylePatch(cur, { fontSize: val }));\n\t}\n\n\tprotected onBoldToggle(): void {\n\t\tconst cur = this.el();\n\t\tthis.editor.updateElement(\n\t\t\tthis.slideIndex(),\n\t\t\tcur.id,\n\t\t\ttextStylePatch(cur, { bold: !this.currentBold() }),\n\t\t);\n\t}\n\n\tprotected onItalicToggle(): void {\n\t\tconst cur = this.el();\n\t\tthis.editor.updateElement(\n\t\t\tthis.slideIndex(),\n\t\t\tcur.id,\n\t\t\ttextStylePatch(cur, { italic: !this.currentItalic() }),\n\t\t);\n\t}\n\n\tprotected onUnderlineToggle(): void {\n\t\tconst cur = this.el();\n\t\tthis.editor.updateElement(\n\t\t\tthis.slideIndex(),\n\t\t\tcur.id,\n\t\t\ttextStylePatch(cur, { underline: !this.currentUnderline() }),\n\t\t);\n\t}\n}\n\n// ── Module-private helpers ───────────────────────────────────────────────────\n\n/** Extract a finite number from an input change event, or null if invalid. */\nfunction numberFromEvent(event: Event): number | null {\n\tconst target = event.target;\n\tif (!(target instanceof HTMLInputElement)) {\n\t\treturn null;\n\t}\n\tconst parsed = parseFloat(target.value);\n\treturn Number.isFinite(parsed) ? parsed : null;\n}\n\n/** Extract a non-empty string value from an input change event. */\nfunction stringFromEvent(event: Event): string | null {\n\tconst target = event.target;\n\tif (!(target instanceof HTMLInputElement)) {\n\t\treturn null;\n\t}\n\tconst val = target.value.trim();\n\treturn val.length > 0 ? val : null;\n}\n","import { DestroyRef, Injectable, computed, inject, signal } from '@angular/core';\nimport type {\n\tMediaPptxElement,\n\tPptxElement,\n\tPptxSlide,\n\tPptxSlideMaster,\n\tPptxTheme,\n} from 'pptx-viewer-core';\nimport { EncryptedFileError, PptxHandler } from 'pptx-viewer-core';\n\nimport {\n\tDEFAULT_CANVAS_HEIGHT,\n\tDEFAULT_CANVAS_WIDTH,\n\tcollectImagePaths,\n\tcollectMediaElements,\n} from '../internal/shared';\nimport type { CanvasSize } from '../internal/shared';\n\n/**\n * `LoadContentService` — Angular port of the React `useLoadContent` hook and\n * the Vue `useLoadContent` composable.\n *\n * Parses `.pptx` bytes into reactive signals via the framework-agnostic\n * `PptxHandler` from `pptx-viewer-core`. All heavy lifting (ZIP, XML parse,\n * theme/master/layout resolution, media extraction) lives in core and the\n * pure helpers live in `pptx-viewer-shared`; this service only wires the async\n * load into Angular signals and manages Blob-URL / handler lifecycle.\n *\n * Provide it at the component level so its lifetime tracks the host viewer:\n * `@Component({ providers: [LoadContentService] })`.\n *\n * This is the viewer-first subset; the React hook also populated ~25 extra\n * pieces of presentation metadata (sections, custom shows, embedded fonts,\n * digital signatures, …). Those are tracked in PORTING.md and added here as\n * the corresponding features are ported.\n */\n@Injectable()\nexport class LoadContentService {\n\t/** Parsed slides (with image Blob URLs patched in). */\n\treadonly slides = signal<PptxSlide[]>([]);\n\t/** Slide canvas size in pixels. */\n\treadonly canvasSize = signal<CanvasSize>({\n\t\twidth: DEFAULT_CANVAS_WIDTH,\n\t\theight: DEFAULT_CANVAS_HEIGHT,\n\t});\n\t/** Resolved presentation theme. */\n\treadonly theme = signal<PptxTheme | undefined>(undefined);\n\t/** Slide masters (for placeholder/background resolution). */\n\treadonly slideMasters = signal<PptxSlideMaster[]>([]);\n\t/** Archive-path → displayable URL map for media + poster frames. */\n\treadonly mediaDataUrls = signal<Map<string, string>>(new Map());\n\t/** True while a load is in flight. */\n\treadonly loading = signal(false);\n\t/** Error message from the last failed load, or null. */\n\treadonly error = signal<string | null>(null);\n\t/** True when the file is password-protected and could not be opened. */\n\treadonly isEncrypted = signal(false);\n\n\t/** Number of loaded slides. */\n\treadonly slideCount = computed(() => this.slides().length);\n\n\tprivate handler: PptxHandler | null = null;\n\tprivate renderToken = 0;\n\tprivate activeBlobUrls: string[] = [];\n\n\tconstructor() {\n\t\tinject(DestroyRef).onDestroy(() => {\n\t\t\tthis.renderToken++;\n\t\t\tthis.revokeBlobUrls(this.activeBlobUrls);\n\t\t\tthis.revokeBlobUrls(Array.from(this.mediaDataUrls().values()));\n\t\t\tthis.disposeHandler();\n\t\t});\n\t}\n\n\t/** Serialise the current (loaded) presentation back to `.pptx` bytes. */\n\tasync getContent(): Promise<Uint8Array> {\n\t\treturn this.saveSlides(this.slides());\n\t}\n\n\t/**\n\t * Serialise an explicit set of slides back to `.pptx` bytes (e.g. the\n\t * editor's edited deck) using the loaded presentation's handler.\n\t */\n\tasync saveSlides(slides: readonly PptxSlide[]): Promise<Uint8Array> {\n\t\tif (!this.handler) {\n\t\t\tthrow new Error('No presentation is loaded.');\n\t\t}\n\t\treturn this.handler.save([...slides]);\n\t}\n\n\t/** Parse the supplied `.pptx` bytes into the reactive signals. */\n\tasync load(raw: Uint8Array | ArrayBuffer | null | undefined): Promise<void> {\n\t\tif (!raw) {\n\t\t\treturn;\n\t\t}\n\t\tconst token = ++this.renderToken;\n\t\tconst loadBlobUrls: string[] = [];\n\n\t\ttry {\n\t\t\tthis.loading.set(true);\n\t\t\tthis.error.set(null);\n\t\t\tthis.isEncrypted.set(false);\n\n\t\t\tconst buffer =\n\t\t\t\traw instanceof Uint8Array\n\t\t\t\t\t? raw.buffer.slice(raw.byteOffset, raw.byteOffset + raw.byteLength)\n\t\t\t\t\t: raw;\n\n\t\t\tconst fileSizeMB = buffer instanceof ArrayBuffer ? buffer.byteLength / (1024 * 1024) : 0;\n\t\t\tif (fileSizeMB > 50) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[pptx] Large file detected (${fileSizeMB.toFixed(1)} MB). ` +\n\t\t\t\t\t\t`Loading may use significant memory.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst previousHandler = this.handler;\n\t\t\tconst newHandler = new PptxHandler();\n\t\t\tconst parsed = await newHandler.load(buffer as ArrayBuffer);\n\t\t\tif (token !== this.renderToken) {\n\t\t\t\tnewHandler.dispose();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpreviousHandler?.dispose();\n\n\t\t\t// ── Resolve media Blob URLs (audio/video + poster frames) ──\n\t\t\tconst mediaElements: MediaPptxElement[] = [];\n\t\t\tfor (const slide of parsed.slides) {\n\t\t\t\tcollectMediaElements(slide.elements, mediaElements);\n\t\t\t}\n\t\t\tthis.revokeBlobUrls(Array.from(this.mediaDataUrls().values()));\n\t\t\tconst nextMediaUrls = new Map<string, string>();\n\t\t\tawait Promise.all(\n\t\t\t\tmediaElements.map(async (mediaElement) => {\n\t\t\t\t\tconst mediaPath = mediaElement.mediaPath;\n\t\t\t\t\tif (!mediaPath) {\n\t\t\t\t\t\tmediaElement.mediaMissing = true;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst isAudioVideo =\n\t\t\t\t\t\t\tmediaElement.mediaType === 'audio' || mediaElement.mediaType === 'video';\n\t\t\t\t\t\tif (isAudioVideo) {\n\t\t\t\t\t\t\tconst arrayBuffer = await newHandler.getMediaArrayBuffer(mediaPath);\n\t\t\t\t\t\t\tif (arrayBuffer) {\n\t\t\t\t\t\t\t\tconst mimeType = mediaElement.mediaMimeType || 'application/octet-stream';\n\t\t\t\t\t\t\t\tconst blob = new Blob([arrayBuffer], { type: mimeType });\n\t\t\t\t\t\t\t\tconst blobUrl = URL.createObjectURL(blob);\n\t\t\t\t\t\t\t\tloadBlobUrls.push(blobUrl);\n\t\t\t\t\t\t\t\tnextMediaUrls.set(mediaPath, blobUrl);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tmediaElement.mediaMissing = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst dataUrl = await newHandler.getImageData(mediaPath);\n\t\t\t\t\t\t\tif (dataUrl) {\n\t\t\t\t\t\t\t\tnextMediaUrls.set(mediaPath, dataUrl);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tmediaElement.mediaMissing = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tmediaElement.mediaMissing = true;\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\t// ── Resolve lazily-loaded picture Blob URLs ──\n\t\t\tconst { paths: imagePaths, refs: imageRefs } = collectImagePaths(parsed.slides);\n\t\t\tlet nextSlides = parsed.slides;\n\t\t\tif (imagePaths.size > 0) {\n\t\t\t\tconst resolvedMap = new Map<string, string>();\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tArray.from(imagePaths).map(async (path) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst url = await newHandler.getImageData(path);\n\t\t\t\t\t\t\tif (url) {\n\t\t\t\t\t\t\t\tresolvedMap.set(path, url);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Non-critical: image will show as broken.\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tconst elementPatches = new Map<string, Record<string, string>>();\n\t\t\t\tfor (const refEntry of imageRefs) {\n\t\t\t\t\tconst url = resolvedMap.get(refEntry.path);\n\t\t\t\t\tif (!url) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst id = refEntry.element.id;\n\t\t\t\t\tconst existing = elementPatches.get(id) ?? {};\n\t\t\t\t\texisting[refEntry.field] = url;\n\t\t\t\t\telementPatches.set(id, existing);\n\t\t\t\t}\n\n\t\t\t\tif (elementPatches.size > 0) {\n\t\t\t\t\tconst patchElements = (elements: PptxElement[]): PptxElement[] => {\n\t\t\t\t\t\tlet mutated = false;\n\t\t\t\t\t\tconst next = elements.map((el) => {\n\t\t\t\t\t\t\tlet updated = el;\n\t\t\t\t\t\t\tconst patch = elementPatches.get(el.id);\n\t\t\t\t\t\t\tif (patch) {\n\t\t\t\t\t\t\t\tupdated = { ...el, ...patch } as PptxElement;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (updated.type === 'group' && updated.children?.length) {\n\t\t\t\t\t\t\t\tconst newChildren = patchElements(updated.children);\n\t\t\t\t\t\t\t\tif (newChildren !== updated.children) {\n\t\t\t\t\t\t\t\t\tupdated = { ...updated, children: newChildren };\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (updated !== el) {\n\t\t\t\t\t\t\t\tmutated = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn updated;\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn mutated ? next : elements;\n\t\t\t\t\t};\n\t\t\t\t\tnextSlides = parsed.slides.map((s) => {\n\t\t\t\t\t\tconst newElements = patchElements(s.elements);\n\t\t\t\t\t\treturn newElements === s.elements ? s : { ...s, elements: newElements };\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Commit reactive state.\n\t\t\tthis.revokeBlobUrls(this.activeBlobUrls);\n\t\t\tthis.activeBlobUrls = loadBlobUrls;\n\t\t\tthis.handler = newHandler;\n\t\t\tthis.slides.set(nextSlides);\n\t\t\tthis.mediaDataUrls.set(nextMediaUrls);\n\t\t\tthis.canvasSize.set({\n\t\t\t\twidth: parsed.width ?? DEFAULT_CANVAS_WIDTH,\n\t\t\t\theight: parsed.height ?? DEFAULT_CANVAS_HEIGHT,\n\t\t\t});\n\t\t\tthis.theme.set(parsed.theme);\n\t\t\tthis.slideMasters.set(parsed.slideMasters ?? []);\n\t\t} catch (err) {\n\t\t\tif (token === this.renderToken) {\n\t\t\t\tif (err instanceof EncryptedFileError) {\n\t\t\t\t\tthis.isEncrypted.set(true);\n\t\t\t\t} else {\n\t\t\t\t\tthis.error.set(err instanceof Error ? err.message : String(err));\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tif (token === this.renderToken) {\n\t\t\t\tthis.loading.set(false);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate disposeHandler(): void {\n\t\tif (this.handler) {\n\t\t\tthis.handler.dispose();\n\t\t\tthis.handler = null;\n\t\t}\n\t}\n\n\tprivate revokeBlobUrls(urls: string[]): void {\n\t\tfor (const url of urls) {\n\t\t\tif (url.startsWith('blob:')) {\n\t\t\t\tURL.revokeObjectURL(url);\n\t\t\t}\n\t\t}\n\t}\n}\n","/**\n * presentation-overlay-helpers.ts\n *\n * Pure functions used by PresentationOverlayComponent.\n * Exported separately so they can be unit-tested without TestBed.\n */\nimport type { PptxSlide } from 'pptx-viewer-core';\n\n/**\n * Clamp `index` to the valid range [0, count - 1].\n * Returns 0 when `count` is 0 to avoid -1 states.\n */\nexport function clampIndex(index: number, count: number): number {\n\tif (count <= 0) {\n\t\treturn 0;\n\t}\n\tif (index < 0) {\n\t\treturn 0;\n\t}\n\tif (index >= count) {\n\t\treturn count - 1;\n\t}\n\treturn index;\n}\n\n/**\n * Return the next visible (non-hidden) slide index after `current`.\n * Wraps around to `current` if no subsequent visible slide exists.\n */\nexport function nextVisibleIndex(current: number, slides: readonly PptxSlide[]): number {\n\tconst count = slides.length;\n\tif (count === 0) {\n\t\treturn 0;\n\t}\n\tfor (let offset = 1; offset < count; offset++) {\n\t\tconst candidate = (current + offset) % count;\n\t\tif (!slides[candidate].hidden) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\t// All remaining slides are hidden — stay at current.\n\treturn current;\n}\n\n/**\n * Return the previous visible (non-hidden) slide index before `current`.\n * Wraps around to `current` if no earlier visible slide exists.\n */\nexport function prevVisibleIndex(current: number, slides: readonly PptxSlide[]): number {\n\tconst count = slides.length;\n\tif (count === 0) {\n\t\treturn 0;\n\t}\n\tfor (let offset = 1; offset < count; offset++) {\n\t\tconst candidate = (((current - offset) % count) + count) % count;\n\t\tif (!slides[candidate].hidden) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\t// All preceding slides are hidden — stay at current.\n\treturn current;\n}\n\n/**\n * Compute the zoom level that fits a canvas of `canvasW × canvasH` pixels\n * into a viewport of `vw × vh` pixels, preserving aspect ratio.\n *\n * Returns 1 as a safe fallback when any dimension is zero or negative.\n */\nexport function fitZoom(canvasW: number, canvasH: number, vw: number, vh: number): number {\n\tif (canvasW <= 0 || canvasH <= 0 || vw <= 0 || vh <= 0) {\n\t\treturn 1;\n\t}\n\treturn Math.min(vw / canvasW, vh / canvasH);\n}\n","/**\n * Pure geometry for interactive element drag/resize.\n *\n * Stage-space deltas in, a new bounding box out — no DOM, no framework, so the\n * SlideCanvas pointer wiring stays thin and the maths is unit-testable.\n */\n\n/** The eight resize-handle positions around a selection box. */\nexport type ResizeHandle = 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w';\n\n/** An axis-aligned box in stage (slide) coordinates. */\nexport interface Box {\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n}\n\n/** All handles, in render order (corners + edge midpoints). */\nexport const RESIZE_HANDLES: readonly ResizeHandle[] = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];\n\n/** Minimum element size (px) a resize is clamped to. */\nexport const MIN_RESIZE = 8;\n\n/** CSS cursor for a handle. */\nexport function handleCursor(handle: ResizeHandle): string {\n\tswitch (handle) {\n\t\tcase 'n':\n\t\tcase 's':\n\t\t\treturn 'ns-resize';\n\t\tcase 'e':\n\t\tcase 'w':\n\t\t\treturn 'ew-resize';\n\t\tcase 'nw':\n\t\tcase 'se':\n\t\t\treturn 'nwse-resize';\n\t\tdefault:\n\t\t\treturn 'nesw-resize';\n\t}\n}\n\n/** Handle anchor as fractions (0..1) of the box, for positioning the handle. */\nexport function handleAnchor(handle: ResizeHandle): { fx: number; fy: number } {\n\tconst fx = handle.includes('w') ? 0 : handle.includes('e') ? 1 : 0.5;\n\tconst fy = handle.includes('n') ? 0 : handle.includes('s') ? 1 : 0.5;\n\treturn { fx, fy };\n}\n\n/** Translate a box by a stage-space delta. */\nexport function applyMove(start: Box, dx: number, dy: number): Box {\n\treturn { x: start.x + dx, y: start.y + dy, width: start.width, height: start.height };\n}\n\n/**\n * Resize `start` by dragging `handle` with a stage-space delta, clamping to\n * `min`. When clamping at the min size, the edge opposite the dragged handle\n * stays fixed.\n */\nexport function applyResize(\n\tstart: Box,\n\thandle: ResizeHandle,\n\tdx: number,\n\tdy: number,\n\tmin: number = MIN_RESIZE,\n): Box {\n\tlet { x, y, width, height } = start;\n\n\tif (handle.includes('e')) {\n\t\twidth = start.width + dx;\n\t}\n\tif (handle.includes('s')) {\n\t\theight = start.height + dy;\n\t}\n\tif (handle.includes('w')) {\n\t\twidth = start.width - dx;\n\t\tx = start.x + dx;\n\t}\n\tif (handle.includes('n')) {\n\t\theight = start.height - dy;\n\t\ty = start.y + dy;\n\t}\n\n\tif (width < min) {\n\t\tif (handle.includes('w')) {\n\t\t\tx = start.x + start.width - min;\n\t\t}\n\t\twidth = min;\n\t}\n\tif (height < min) {\n\t\tif (handle.includes('n')) {\n\t\t\ty = start.y + start.height - min;\n\t\t}\n\t\theight = min;\n\t}\n\n\treturn { x, y, width, height };\n}\n","/**\n * Pure, framework-agnostic helpers for chart rendering.\n *\n * Ported from:\n * packages/react/src/viewer/utils/chart-helpers.ts (value range, Y mapping, formatting, palette)\n * packages/react/src/viewer/utils/chart-layout.ts (plot-area layout)\n * packages/react/src/viewer/utils/chart-pie.tsx (pie/doughnut geometry)\n * packages/react/src/viewer/utils/chart-bar.tsx (bar rect projection)\n * packages/react/src/viewer/utils/chart-area-line.tsx (line/area point projection)\n * packages/react/src/viewer/utils/chart-scatter-bubble.tsx (scatter point projection)\n *\n * All functions here are pure TypeScript with zero Angular dependencies.\n * The component consumes a single `ChartViewModel` that is the projection\n * of a `ChartPptxElement` -> SVG primitives.\n *\n * Supported chart kinds (viewer-first):\n * bar / column (clustered, stacked, percentStacked) -> bar rects\n * line / line3D -> polyline + dots\n * area / area3D -> polygon fill + polyline\n * pie / doughnut / pie3D / ofPie -> arc paths\n * scatter -> circle dots\n *\n * Deferred (fallback box rendered instead):\n * bubble, radar, stock, waterfall, combo, surface, treemap, sunburst,\n * funnel, boxWhisker, histogram, regionMap, bar3D (complex 3-D shading),\n * error bars, trendlines, secondary axes, data tables.\n *\n * @module chart-renderer-helpers\n */\n\nimport type {\n\tChartPptxElement,\n\tPptxChartData,\n\tPptxChartSeries,\n\tPptxElement,\n} from 'pptx-viewer-core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Palette\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Default Office accent palette (accent1-accent6).\n * Mirrors `DEFAULT_CHART_PALETTE` from chart-helpers.ts.\n */\nexport const DEFAULT_PALETTE: readonly string[] = [\n\t'#4472C4',\n\t'#ED7D31',\n\t'#A5A5A5',\n\t'#FFC000',\n\t'#5B9BD5',\n\t'#70AD47',\n\t'#FF0000',\n\t'#00B0F0',\n];\n\n/** Return the palette colour for an index, preferring a parsed colour palette. */\nexport function paletteColor(index: number, colorPalette: readonly string[] | undefined): string {\n\tconst pal = colorPalette && colorPalette.length > 0 ? colorPalette : DEFAULT_PALETTE;\n\treturn pal[index % pal.length];\n}\n\n/** Resolve a series' colour, preferring the series' own `color` property. */\nexport function seriesColor(\n\tseries: PptxChartSeries,\n\tindex: number,\n\tcolorPalette: readonly string[] | undefined,\n): string {\n\treturn series.color ?? paletteColor(index, colorPalette);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Value range\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Min/max/span of a value axis. */\nexport interface ValueRange {\n\tmin: number;\n\tmax: number;\n\tspan: number;\n}\n\n/** Compute a Y-axis range that always includes zero. */\nexport function computeValueRange(series: ReadonlyArray<PptxChartSeries>): ValueRange {\n\tconst all = series.flatMap((s) => s.values);\n\tif (all.length === 0) {\n\t\treturn { min: 0, max: 1, span: 1 };\n\t}\n\tconst dataMin = Math.min(...all);\n\tconst dataMax = Math.max(...all);\n\tconst min = Math.min(dataMin, 0);\n\tconst max = Math.max(dataMax, 0);\n\tconst span = Math.max(max - min, 1);\n\treturn { min, max, span };\n}\n\n/** Compute the value range for a stacked bar (sum of positive values per category). */\nexport function computeStackedValueRange(\n\tseries: ReadonlyArray<PptxChartSeries>,\n\tcatCount: number,\n): ValueRange {\n\tlet maxSum = 0;\n\tlet minSum = 0;\n\tfor (let ci = 0; ci < catCount; ci++) {\n\t\tlet pos = 0;\n\t\tlet neg = 0;\n\t\tfor (const s of series) {\n\t\t\tconst v = s.values[ci] ?? 0;\n\t\t\tif (v >= 0) {\n\t\t\t\tpos += v;\n\t\t\t} else {\n\t\t\t\tneg += v;\n\t\t\t}\n\t\t}\n\t\tmaxSum = Math.max(maxSum, pos);\n\t\tminSum = Math.min(minSum, neg);\n\t}\n\tconst min = Math.min(minSum, 0);\n\tconst max = Math.max(maxSum, 0);\n\tconst span = Math.max(max - min, 1);\n\treturn { min, max, span };\n}\n\n/** Map a data value to a Y pixel coordinate (top = max, bottom = min). */\nexport function valueToY(val: number, range: ValueRange, topY: number, bottomY: number): number {\n\tconst usable = bottomY - topY;\n\treturn bottomY - ((val - range.min) / range.span) * usable;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Formatting\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Format a numeric axis label to a short human-readable string. */\nexport function formatAxisValue(val: number): string {\n\tif (Math.abs(val) >= 1_000_000) {\n\t\treturn `${(val / 1_000_000).toFixed(1)}M`;\n\t}\n\tif (Math.abs(val) >= 1_000) {\n\t\treturn `${(val / 1_000).toFixed(1)}K`;\n\t}\n\tif (Number.isInteger(val)) {\n\t\treturn String(val);\n\t}\n\treturn val.toFixed(1);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Plot layout\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Bounding-box of the chart's usable plot area in SVG coordinates. */\nexport interface PlotLayout {\n\tsvgWidth: number;\n\tsvgHeight: number;\n\tplotLeft: number;\n\tplotTop: number;\n\tplotRight: number;\n\tplotBottom: number;\n\tplotWidth: number;\n\tplotHeight: number;\n}\n\n/**\n * Compute the plot layout for a chart element.\n * Mirrors `computeLayout` from chart-layout.ts (React), simplified to the\n * viewer-first subset (no secondary axes, no data table reservation).\n */\nexport function computePlotLayout(\n\telementWidth: number,\n\telementHeight: number,\n\tchartData: PptxChartData,\n\thasAxes: boolean,\n): PlotLayout {\n\tconst svgWidth = Math.max(320, elementWidth);\n\tconst svgHeight = Math.max(180, elementHeight);\n\n\tlet plotLeft = hasAxes ? 48 : 8;\n\tlet plotTop = 8;\n\tlet plotRight = svgWidth - 8;\n\tlet plotBottom = svgHeight - (hasAxes ? 24 : 8);\n\n\tconst style = chartData.style;\n\tconst legendPos = style?.legendPosition ?? 'b';\n\n\tif (style?.hasTitle) {\n\t\tplotTop += 20;\n\t}\n\tif (style?.hasLegend) {\n\t\tif (legendPos === 'b') {\n\t\t\tplotBottom -= 20;\n\t\t} else if (legendPos === 't') {\n\t\t\tplotTop += 20;\n\t\t} else if (legendPos === 'r') {\n\t\t\tplotRight -= 80;\n\t\t} else if (legendPos === 'l') {\n\t\t\tplotLeft += 80;\n\t\t}\n\t}\n\n\tconst plotWidth = Math.max(plotRight - plotLeft, 1);\n\tconst plotHeight = Math.max(plotBottom - plotTop, 1);\n\n\treturn {\n\t\tsvgWidth,\n\t\tsvgHeight,\n\t\tplotLeft,\n\t\tplotTop,\n\t\tplotRight: plotLeft + plotWidth,\n\t\tplotBottom: plotTop + plotHeight,\n\t\tplotWidth,\n\t\tplotHeight,\n\t};\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SVG primitive descriptors\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface SvgRect {\n\tkind: 'rect';\n\tx: number;\n\ty: number;\n\tw: number;\n\th: number;\n\tfill: string;\n\trx?: number;\n\topacity?: number;\n}\n\nexport interface SvgPath {\n\tkind: 'path';\n\td: string;\n\tfill: string;\n\tstroke?: string;\n\tstrokeWidth?: number;\n}\n\nexport interface SvgPolyline {\n\tkind: 'polyline';\n\tpoints: string;\n\tstroke: string;\n\tstrokeWidth: number;\n\tfill: string;\n\topacity?: number;\n}\n\nexport interface SvgCircle {\n\tkind: 'circle';\n\tcx: number;\n\tcy: number;\n\tr: number;\n\tfill: string;\n\topacity?: number;\n}\n\nexport interface SvgLine {\n\tkind: 'line';\n\tx1: number;\n\ty1: number;\n\tx2: number;\n\ty2: number;\n\tstroke: string;\n\tstrokeWidth: number;\n\tdashArray?: string;\n\topacity?: number;\n}\n\nexport interface SvgText {\n\tkind: 'text';\n\tx: number;\n\ty: number;\n\ttext: string;\n\tfontSize: number;\n\tfill: string;\n\ttextAnchor: 'start' | 'middle' | 'end';\n\tfontWeight?: 'normal' | 'bold';\n\tdominantBaseline?: string;\n\topacity?: number;\n}\n\nexport interface SvgAreaGradient {\n\tkind: 'areaGradient';\n\tid: string;\n\tcolor: string;\n}\n\nexport type SvgPrimitive =\n\t| SvgRect\n\t| SvgPath\n\t| SvgPolyline\n\t| SvgCircle\n\t| SvgLine\n\t| SvgText\n\t| SvgAreaGradient;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Legend\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface LegendEntry {\n\tcolor: string;\n\tlabel: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Full chart view-model\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ChartViewModel {\n\tsvgWidth: number;\n\tsvgHeight: number;\n\ttitle: string | undefined;\n\ttitleX: number;\n\ttitleY: number;\n\tgridlines: SvgLine[];\n\taxisLabels: SvgText[];\n\tzeroLine: SvgLine | undefined;\n\tcategoryLabels: SvgText[];\n\tprimitives: SvgPrimitive[];\n\tdataLabels: SvgText[];\n\tlegend: LegendEntry[];\n\tlegendX: number;\n\tlegendY: number;\n\tlegendAnchor: 'start' | 'middle' | 'end';\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Chrome helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst GRIDLINE_COLOR = '#e2e8f0';\nconst AXIS_LABEL_COLOR = '#64748b';\nconst ZERO_LINE_COLOR = '#94a3b8';\nconst TICK_COUNT = 5;\n\nfunction buildGridlinesAndLabels(\n\trange: ValueRange,\n\tlayout: PlotLayout,\n): { gridlines: SvgLine[]; axisLabels: SvgText[] } {\n\tconst gridlines: SvgLine[] = [];\n\tconst axisLabels: SvgText[] = [];\n\n\tfor (let i = 0; i <= TICK_COUNT; i++) {\n\t\tconst val = range.min + (range.span / TICK_COUNT) * i;\n\t\tconst y = valueToY(val, range, layout.plotTop, layout.plotBottom);\n\n\t\tgridlines.push({\n\t\t\tkind: 'line',\n\t\t\tx1: layout.plotLeft,\n\t\t\ty1: y,\n\t\t\tx2: layout.plotRight,\n\t\t\ty2: y,\n\t\t\tstroke: GRIDLINE_COLOR,\n\t\t\tstrokeWidth: 1,\n\t\t});\n\n\t\taxisLabels.push({\n\t\t\tkind: 'text',\n\t\t\tx: layout.plotLeft - 4,\n\t\t\ty,\n\t\t\ttext: formatAxisValue(val),\n\t\t\tfontSize: 8,\n\t\t\tfill: AXIS_LABEL_COLOR,\n\t\t\ttextAnchor: 'end',\n\t\t\tdominantBaseline: 'central',\n\t\t});\n\t}\n\n\treturn { gridlines, axisLabels };\n}\n\nfunction buildZeroLine(range: ValueRange, layout: PlotLayout): SvgLine | undefined {\n\tif (range.min >= 0 || range.max <= 0) {\n\t\treturn undefined;\n\t}\n\tconst y = valueToY(0, range, layout.plotTop, layout.plotBottom);\n\treturn {\n\t\tkind: 'line',\n\t\tx1: layout.plotLeft,\n\t\ty1: y,\n\t\tx2: layout.plotRight,\n\t\ty2: y,\n\t\tstroke: ZERO_LINE_COLOR,\n\t\tstrokeWidth: 1,\n\t};\n}\n\nfunction buildCategoryLabels(\n\tcategoryLabels: ReadonlyArray<string>,\n\tlayout: PlotLayout,\n\tcatSpacing: 'bar' | 'line',\n): SvgText[] {\n\tconst catCount = Math.max(categoryLabels.length, 1);\n\treturn categoryLabels.map((label, i) => {\n\t\tconst x =\n\t\t\tcatSpacing === 'bar'\n\t\t\t\t? layout.plotLeft + (layout.plotWidth / catCount) * (i + 0.5)\n\t\t\t\t: catCount > 1\n\t\t\t\t\t? layout.plotLeft + (layout.plotWidth / (catCount - 1)) * i\n\t\t\t\t\t: layout.plotLeft + layout.plotWidth / 2;\n\t\treturn {\n\t\t\tkind: 'text',\n\t\t\tx,\n\t\t\ty: layout.plotBottom + 12,\n\t\t\ttext: label,\n\t\t\tfontSize: 8,\n\t\t\tfill: AXIS_LABEL_COLOR,\n\t\t\ttextAnchor: 'middle',\n\t\t} satisfies SvgText;\n\t});\n}\n\nfunction buildLegend(\n\tseries: ReadonlyArray<PptxChartSeries>,\n\tcolorPalette: readonly string[] | undefined,\n\tsvgWidth: number,\n\tlegendPos: string,\n\tsvgHeight: number,\n\tplotTop: number,\n): {\n\tlegend: LegendEntry[];\n\tlegendX: number;\n\tlegendY: number;\n\tlegendAnchor: 'start' | 'middle' | 'end';\n} {\n\tconst legend: LegendEntry[] = series.map((s, i) => ({\n\t\tcolor: seriesColor(s, i, colorPalette),\n\t\tlabel: s.name,\n\t}));\n\n\tlet legendX = svgWidth / 2;\n\tlet legendY = svgHeight - 8;\n\tlet legendAnchor: 'start' | 'middle' | 'end' = 'middle';\n\n\tif (legendPos === 'r') {\n\t\tlegendX = svgWidth - 75;\n\t\tlegendY = plotTop;\n\t\tlegendAnchor = 'start';\n\t} else if (legendPos === 'l') {\n\t\tlegendX = 4;\n\t\tlegendY = plotTop;\n\t\tlegendAnchor = 'start';\n\t} else if (legendPos === 't') {\n\t\tlegendY = 28;\n\t}\n\n\treturn { legend, legendX, legendY, legendAnchor };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Bar / column\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface BarRect {\n\tx: number;\n\ty: number;\n\tw: number;\n\th: number;\n\tfill: string;\n}\n\nexport function computeBarRects(\n\tseries: ReadonlyArray<PptxChartSeries>,\n\tcatCount: number,\n\tlayout: PlotLayout,\n\trange: ValueRange,\n\tcolorPalette: readonly string[] | undefined,\n): BarRect[] {\n\tconst rects: BarRect[] = [];\n\tconst seriesCount = Math.max(series.length, 1);\n\tconst barGroupWidth = layout.plotWidth / Math.max(catCount, 1);\n\tconst singleBarWidth = (barGroupWidth * 0.7) / seriesCount;\n\tconst groupOffset = (barGroupWidth - singleBarWidth * seriesCount) / 2;\n\n\tfor (let ci = 0; ci < catCount; ci++) {\n\t\tfor (let si = 0; si < series.length; si++) {\n\t\t\tconst val = series[si].values[ci] ?? 0;\n\t\t\tconst x = layout.plotLeft + barGroupWidth * ci + groupOffset + singleBarWidth * si;\n\t\t\tconst zeroY = valueToY(0, range, layout.plotTop, layout.plotBottom);\n\t\t\tconst valY = valueToY(val, range, layout.plotTop, layout.plotBottom);\n\t\t\tconst y = Math.min(zeroY, valY);\n\t\t\tconst h = Math.max(Math.abs(zeroY - valY), 1);\n\t\t\trects.push({\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t\tw: singleBarWidth,\n\t\t\t\th,\n\t\t\t\tfill: seriesColor(series[si], si, colorPalette),\n\t\t\t});\n\t\t}\n\t}\n\treturn rects;\n}\n\nexport function computeStackedBarRects(\n\tseries: ReadonlyArray<PptxChartSeries>,\n\tcatCount: number,\n\tlayout: PlotLayout,\n\trange: ValueRange,\n\tcolorPalette: readonly string[] | undefined,\n): BarRect[] {\n\tconst rects: BarRect[] = [];\n\tconst barW = (layout.plotWidth / Math.max(catCount, 1)) * 0.7;\n\tconst barOffset = (layout.plotWidth / Math.max(catCount, 1) - barW) / 2;\n\tconst zeroY = valueToY(0, range, layout.plotTop, layout.plotBottom);\n\n\tfor (let ci = 0; ci < catCount; ci++) {\n\t\tlet posTop = zeroY;\n\t\tlet negBottom = zeroY;\n\n\t\tfor (let si = 0; si < series.length; si++) {\n\t\t\tconst val = series[si].values[ci] ?? 0;\n\t\t\tif (val === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst x = layout.plotLeft + (layout.plotWidth / Math.max(catCount, 1)) * ci + barOffset;\n\t\t\tconst h = Math.max(\n\t\t\t\tMath.abs(\n\t\t\t\t\tvalueToY(val, range, layout.plotTop, layout.plotBottom) -\n\t\t\t\t\t\tvalueToY(0, range, layout.plotTop, layout.plotBottom),\n\t\t\t\t),\n\t\t\t\t1,\n\t\t\t);\n\t\t\tif (val > 0) {\n\t\t\t\tconst y = posTop - h;\n\t\t\t\trects.push({ x, y, w: barW, h, fill: seriesColor(series[si], si, colorPalette) });\n\t\t\t\tposTop = y;\n\t\t\t} else {\n\t\t\t\tconst y = negBottom;\n\t\t\t\trects.push({ x, y, w: barW, h, fill: seriesColor(series[si], si, colorPalette) });\n\t\t\t\tnegBottom = y + h;\n\t\t\t}\n\t\t}\n\t}\n\treturn rects;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Line / area\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface LinePoint {\n\tx: number;\n\ty: number;\n}\n\nexport function computeLinePoints(\n\tvalues: ReadonlyArray<number>,\n\tcatCount: number,\n\tlayout: PlotLayout,\n\trange: ValueRange,\n): LinePoint[] {\n\tconst n = Math.max(catCount, 2);\n\treturn values.map((val, i) => {\n\t\tconst nx = n > 1 ? i / (n - 1) : 0;\n\t\tconst x = layout.plotLeft + layout.plotWidth * nx;\n\t\tconst y = valueToY(val, range, layout.plotTop, layout.plotBottom);\n\t\treturn { x, y };\n\t});\n}\n\nexport function linePointsToSvgString(points: ReadonlyArray<LinePoint>): string {\n\treturn points.map((p) => `${p.x.toFixed(2)},${p.y.toFixed(2)}`).join(' ');\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Pie / doughnut\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface PieSliceGeometry {\n\td: string;\n\tmidAngle: number;\n\tlabelX: number;\n\tlabelY: number;\n}\n\nexport function computePieSlicePath(\n\tcx: number,\n\tcy: number,\n\touterR: number,\n\tinnerR: number,\n\tstartAngle: number,\n\tendAngle: number,\n): PieSliceGeometry {\n\tconst largeArc = endAngle - startAngle > Math.PI ? 1 : 0;\n\tconst x1 = cx + outerR * Math.cos(startAngle);\n\tconst y1 = cy + outerR * Math.sin(startAngle);\n\tconst x2 = cx + outerR * Math.cos(endAngle);\n\tconst y2 = cy + outerR * Math.sin(endAngle);\n\n\tlet d: string;\n\tif (innerR > 0) {\n\t\tconst ix1 = cx + innerR * Math.cos(startAngle);\n\t\tconst iy1 = cy + innerR * Math.sin(startAngle);\n\t\tconst ix2 = cx + innerR * Math.cos(endAngle);\n\t\tconst iy2 = cy + innerR * Math.sin(endAngle);\n\t\td = `M${x1},${y1} A${outerR},${outerR} 0 ${largeArc} 1 ${x2},${y2} L${ix2},${iy2} A${innerR},${innerR} 0 ${largeArc} 0 ${ix1},${iy1} Z`;\n\t} else {\n\t\td = `M${cx},${cy} L${x1},${y1} A${outerR},${outerR} 0 ${largeArc} 1 ${x2},${y2} Z`;\n\t}\n\n\tconst midAngle = (startAngle + endAngle) / 2;\n\tconst labelR = outerR * 0.7;\n\tconst labelX = cx + labelR * Math.cos(midAngle);\n\tconst labelY = cy + labelR * Math.sin(midAngle);\n\n\treturn { d, midAngle, labelX, labelY };\n}\n\nexport function computePieLayout(\n\telementWidth: number,\n\telementHeight: number,\n\tchartData: PptxChartData,\n\tisDoughnut: boolean,\n): { cx: number; cy: number; outerR: number; innerR: number; size: number } {\n\tconst size = Math.min(Math.max(elementWidth, 1), Math.max(elementHeight, 1));\n\tconst titleOffset = chartData.style?.hasTitle ? 20 : 0;\n\tconst legendOffset = chartData.style?.hasLegend ? 20 : 0;\n\tconst cx = size / 2;\n\tconst cy = titleOffset + (size - titleOffset - legendOffset) / 2;\n\tconst outerR = Math.max((size - titleOffset - legendOffset) * 0.42, 0);\n\tconst innerR = isDoughnut ? outerR * 0.55 : 0;\n\treturn { cx, cy, outerR, innerR, size };\n}\n\nexport function computePieSlices(\n\tvalues: ReadonlyArray<number>,\n\tcx: number,\n\tcy: number,\n\touterR: number,\n\tinnerR: number,\n): PieSliceGeometry[] {\n\tconst total = values.reduce((s, v) => s + Math.abs(v), 0) || 1;\n\tlet cumAngle = -Math.PI / 2;\n\treturn values.map((val) => {\n\t\tconst sliceAngle = (Math.abs(val) / total) * Math.PI * 2;\n\t\tconst startAngle = cumAngle;\n\t\tcumAngle += sliceAngle;\n\t\treturn computePieSlicePath(cx, cy, outerR, innerR, startAngle, cumAngle);\n\t});\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Scatter\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ScatterDot {\n\tcx: number;\n\tcy: number;\n}\n\nexport function computeScatterDots(\n\tvalues: ReadonlyArray<number>,\n\tmaxXIndex: number,\n\tlayout: PlotLayout,\n\trange: ValueRange,\n): ScatterDot[] {\n\treturn values.map((val, i) => ({\n\t\tcx: layout.plotLeft + (maxXIndex > 0 ? i / maxXIndex : 0) * layout.plotWidth,\n\t\tcy: valueToY(val, range, layout.plotTop, layout.plotBottom),\n\t}));\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Supported chart kinds\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type SupportedChartKind = 'bar' | 'line' | 'area' | 'pie' | 'doughnut' | 'scatter';\n\nexport function resolveChartKind(chartType: string): SupportedChartKind | 'unsupported' {\n\tswitch (chartType) {\n\t\tcase 'bar':\n\t\tcase 'bar3D':\n\t\t\treturn 'bar';\n\t\tcase 'line':\n\t\tcase 'line3D':\n\t\t\treturn 'line';\n\t\tcase 'area':\n\t\tcase 'area3D':\n\t\t\treturn 'area';\n\t\tcase 'pie':\n\t\tcase 'pie3D':\n\t\tcase 'ofPie':\n\t\t\treturn 'pie';\n\t\tcase 'doughnut':\n\t\t\treturn 'doughnut';\n\t\tcase 'scatter':\n\t\t\treturn 'scatter';\n\t\tdefault:\n\t\t\treturn 'unsupported';\n\t}\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Main view-model builder\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function buildChartViewModel(element: PptxElement): ChartViewModel {\n\tif (element.type !== 'chart') {\n\t\treturn buildFallbackViewModel(element.width, element.height, 'Chart');\n\t}\n\tconst chartEl = element as ChartPptxElement;\n\tconst chartData = chartEl.chartData;\n\n\tif (!chartData || chartData.series.length === 0) {\n\t\treturn buildFallbackViewModel(element.width, element.height, chartData?.title ?? 'Chart');\n\t}\n\n\tconst chartType = chartData.chartType ?? 'bar';\n\tconst kind = resolveChartKind(chartType);\n\n\tif (kind === 'unsupported') {\n\t\treturn buildFallbackViewModel(element.width, element.height, chartData.title ?? chartType);\n\t}\n\n\tconst longestLen = chartData.series.reduce((m, s) => Math.max(m, s.values.length), 0);\n\tconst categoryLabels =\n\t\tchartData.categories.length > 0\n\t\t\t? chartData.categories\n\t\t\t: Array.from({ length: longestLen }, (_, i) => String(i + 1));\n\n\tif (kind === 'pie' || kind === 'doughnut') {\n\t\treturn buildPieViewModel(element, chartData, categoryLabels, kind === 'doughnut');\n\t}\n\n\treturn buildCartesianViewModel(element, chartData, categoryLabels, kind);\n}\n\nexport function buildFallbackViewModel(\n\twidth: number,\n\theight: number,\n\tlabel: string,\n): ChartViewModel {\n\tconst svgWidth = Math.max(width, 100);\n\tconst svgHeight = Math.max(height, 60);\n\treturn {\n\t\tsvgWidth,\n\t\tsvgHeight,\n\t\ttitle: undefined,\n\t\ttitleX: svgWidth / 2,\n\t\ttitleY: 14,\n\t\tgridlines: [],\n\t\taxisLabels: [],\n\t\tzeroLine: undefined,\n\t\tcategoryLabels: [],\n\t\tprimitives: [\n\t\t\t{\n\t\t\t\tkind: 'rect',\n\t\t\t\tx: 4,\n\t\t\t\ty: 4,\n\t\t\t\tw: svgWidth - 8,\n\t\t\t\th: svgHeight - 8,\n\t\t\t\tfill: '#f1f5f9',\n\t\t\t\trx: 4,\n\t\t\t} satisfies SvgRect,\n\t\t],\n\t\tdataLabels: [\n\t\t\t{\n\t\t\t\tkind: 'text',\n\t\t\t\tx: svgWidth / 2,\n\t\t\t\ty: svgHeight / 2,\n\t\t\t\ttext: label,\n\t\t\t\tfontSize: 10,\n\t\t\t\tfill: '#94a3b8',\n\t\t\t\ttextAnchor: 'middle',\n\t\t\t\tdominantBaseline: 'central',\n\t\t\t} satisfies SvgText,\n\t\t],\n\t\tlegend: [],\n\t\tlegendX: svgWidth / 2,\n\t\tlegendY: svgHeight - 8,\n\t\tlegendAnchor: 'middle',\n\t};\n}\n\nfunction buildPieViewModel(\n\telement: PptxElement,\n\tchartData: PptxChartData,\n\tcategoryLabels: ReadonlyArray<string>,\n\tisDoughnut: boolean,\n): ChartViewModel {\n\tconst { cx, cy, outerR, innerR, size } = computePieLayout(\n\t\telement.width,\n\t\telement.height,\n\t\tchartData,\n\t\tisDoughnut,\n\t);\n\tconst svgWidth = Math.max(size, 100);\n\tconst svgHeight = Math.max(size, 60);\n\n\tconst values = chartData.series[0]?.values ?? [];\n\tconst slices = computePieSlices(values, cx, cy, outerR, innerR);\n\tconst primitives: SvgPrimitive[] = slices.map(\n\t\t({ d }, i) =>\n\t\t\t({\n\t\t\t\tkind: 'path',\n\t\t\t\td,\n\t\t\t\tfill: chartData.series[0]?.color ?? paletteColor(i, chartData.colorPalette),\n\t\t\t\tstroke: '#ffffff',\n\t\t\t\tstrokeWidth: 1.5,\n\t\t\t}) satisfies SvgPath,\n\t);\n\n\tconst dataLabels: SvgText[] = [];\n\tif (chartData.style?.hasDataLabels) {\n\t\tslices.forEach(({ labelX, labelY }, i) => {\n\t\t\tconst val = values[i];\n\t\t\tif (val === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdataLabels.push({\n\t\t\t\tkind: 'text',\n\t\t\t\tx: labelX,\n\t\t\t\ty: labelY,\n\t\t\t\ttext: formatAxisValue(val),\n\t\t\t\tfontSize: 8,\n\t\t\t\tfill: '#ffffff',\n\t\t\t\ttextAnchor: 'middle',\n\t\t\t\tfontWeight: 'bold',\n\t\t\t\tdominantBaseline: 'central',\n\t\t\t});\n\t\t});\n\t}\n\n\tconst legendPos = chartData.style?.legendPosition ?? 'b';\n\tconst legend: LegendEntry[] = categoryLabels.map((label, i) => ({\n\t\tcolor: paletteColor(i, chartData.colorPalette),\n\t\tlabel,\n\t}));\n\n\tconst legendX = svgWidth / 2;\n\tlet legendY = svgHeight - 8;\n\tconst legendAnchor: 'start' | 'middle' | 'end' = 'middle';\n\n\tif (legendPos === 't') {\n\t\tlegendY = chartData.style?.hasTitle ? 24 : 8;\n\t}\n\n\tconst title = chartData.style?.hasTitle && chartData.title ? chartData.title : undefined;\n\n\treturn {\n\t\tsvgWidth,\n\t\tsvgHeight,\n\t\ttitle,\n\t\ttitleX: svgWidth / 2,\n\t\ttitleY: 14,\n\t\tgridlines: [],\n\t\taxisLabels: [],\n\t\tzeroLine: undefined,\n\t\tcategoryLabels: [],\n\t\tprimitives,\n\t\tdataLabels,\n\t\tlegend: chartData.style?.hasLegend ? legend : [],\n\t\tlegendX,\n\t\tlegendY,\n\t\tlegendAnchor,\n\t};\n}\n\nfunction buildCartesianViewModel(\n\telement: PptxElement,\n\tchartData: PptxChartData,\n\tcategoryLabels: ReadonlyArray<string>,\n\tkind: SupportedChartKind,\n): ChartViewModel {\n\tconst layout = computePlotLayout(element.width, element.height, chartData, true);\n\tconst catCount = Math.max(categoryLabels.length, 1);\n\n\tconst isStacked =\n\t\tkind === 'bar' && (chartData.grouping === 'stacked' || chartData.grouping === 'percentStacked');\n\tconst range = isStacked\n\t\t? computeStackedValueRange(chartData.series, catCount)\n\t\t: computeValueRange(chartData.series);\n\n\tconst { gridlines, axisLabels } = buildGridlinesAndLabels(range, layout);\n\tconst zeroLine = buildZeroLine(range, layout);\n\tconst catAxisStyle = kind === 'line' || kind === 'area' || kind === 'scatter' ? 'line' : 'bar';\n\tconst catLabels = buildCategoryLabels(categoryLabels, layout, catAxisStyle);\n\n\tconst legendPos = chartData.style?.legendPosition ?? 'b';\n\tconst { legend, legendX, legendY, legendAnchor } = buildLegend(\n\t\tchartData.series,\n\t\tchartData.colorPalette,\n\t\tlayout.svgWidth,\n\t\tlegendPos,\n\t\tlayout.svgHeight,\n\t\tlayout.plotTop,\n\t);\n\n\tconst primitives: SvgPrimitive[] = [];\n\tconst dataLabels: SvgText[] = [];\n\n\tif (kind === 'bar') {\n\t\tconst rects = isStacked\n\t\t\t? computeStackedBarRects(chartData.series, catCount, layout, range, chartData.colorPalette)\n\t\t\t: computeBarRects(chartData.series, catCount, layout, range, chartData.colorPalette);\n\n\t\tfor (const r of rects) {\n\t\t\tprimitives.push({\n\t\t\t\tkind: 'rect',\n\t\t\t\tx: r.x,\n\t\t\t\ty: r.y,\n\t\t\t\tw: r.w,\n\t\t\t\th: r.h,\n\t\t\t\tfill: r.fill,\n\t\t\t\trx: 1,\n\t\t\t} satisfies SvgRect);\n\t\t}\n\n\t\tif (chartData.style?.hasDataLabels) {\n\t\t\tconst barGroupWidth = layout.plotWidth / catCount;\n\t\t\tconst seriesCount = Math.max(chartData.series.length, 1);\n\t\t\tconst singleBarWidth = (barGroupWidth * 0.7) / seriesCount;\n\t\t\tconst groupOffset = (barGroupWidth - singleBarWidth * seriesCount) / 2;\n\n\t\t\tfor (let ci = 0; ci < catCount; ci++) {\n\t\t\t\tfor (let si = 0; si < chartData.series.length; si++) {\n\t\t\t\t\tconst val = chartData.series[si].values[ci] ?? 0;\n\t\t\t\t\tconst x =\n\t\t\t\t\t\tlayout.plotLeft +\n\t\t\t\t\t\tbarGroupWidth * ci +\n\t\t\t\t\t\tgroupOffset +\n\t\t\t\t\t\tsingleBarWidth * si +\n\t\t\t\t\t\tsingleBarWidth / 2;\n\t\t\t\t\tconst zeroY = valueToY(0, range, layout.plotTop, layout.plotBottom);\n\t\t\t\t\tconst valY = valueToY(val, range, layout.plotTop, layout.plotBottom);\n\t\t\t\t\tconst labelY = val >= 0 ? Math.min(zeroY, valY) - 4 : Math.max(zeroY, valY) + 10;\n\t\t\t\t\tdataLabels.push({\n\t\t\t\t\t\tkind: 'text',\n\t\t\t\t\t\tx,\n\t\t\t\t\t\ty: labelY,\n\t\t\t\t\t\ttext: formatAxisValue(val),\n\t\t\t\t\t\tfontSize: 7,\n\t\t\t\t\t\tfill: '#334155',\n\t\t\t\t\t\ttextAnchor: 'middle',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else if (kind === 'line') {\n\t\tfor (let si = 0; si < chartData.series.length; si++) {\n\t\t\tconst series = chartData.series[si];\n\t\t\tif (series.values.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst pts = computeLinePoints(series.values, catCount, layout, range);\n\t\t\tconst c = seriesColor(series, si, chartData.colorPalette);\n\t\t\tconst pointsStr = linePointsToSvgString(pts);\n\n\t\t\tprimitives.push({\n\t\t\t\tkind: 'polyline',\n\t\t\t\tpoints: pointsStr,\n\t\t\t\tstroke: c,\n\t\t\t\tstrokeWidth: 2.4,\n\t\t\t\tfill: 'none',\n\t\t\t} satisfies SvgPolyline);\n\t\t\tfor (const pt of pts) {\n\t\t\t\tprimitives.push({\n\t\t\t\t\tkind: 'circle',\n\t\t\t\t\tcx: pt.x,\n\t\t\t\t\tcy: pt.y,\n\t\t\t\t\tr: 2.5,\n\t\t\t\t\tfill: c,\n\t\t\t\t} satisfies SvgCircle);\n\t\t\t}\n\n\t\t\tif (chartData.style?.hasDataLabels) {\n\t\t\t\tseries.values.forEach((val, vi) => {\n\t\t\t\t\tconst pt = pts[vi];\n\t\t\t\t\tif (!pt) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tdataLabels.push({\n\t\t\t\t\t\tkind: 'text',\n\t\t\t\t\t\tx: pt.x,\n\t\t\t\t\t\ty: pt.y - 7,\n\t\t\t\t\t\ttext: formatAxisValue(val),\n\t\t\t\t\t\tfontSize: 7,\n\t\t\t\t\t\tfill: '#334155',\n\t\t\t\t\t\ttextAnchor: 'middle',\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t} else if (kind === 'area') {\n\t\tconst baselineY = valueToY(0, range, layout.plotTop, layout.plotBottom);\n\t\tfor (let si = 0; si < chartData.series.length; si++) {\n\t\t\tconst series = chartData.series[si];\n\t\t\tif (series.values.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst pts = computeLinePoints(series.values, catCount, layout, range);\n\t\t\tconst c = seriesColor(series, si, chartData.colorPalette);\n\t\t\tconst lineStr = linePointsToSvgString(pts);\n\t\t\tconst firstPt = pts[0];\n\t\t\tconst lastPt = pts[pts.length - 1];\n\n\t\t\tif (firstPt && lastPt) {\n\t\t\t\tprimitives.push({\n\t\t\t\t\tkind: 'polyline',\n\t\t\t\t\tpoints: `${layout.plotLeft.toFixed(2)},${baselineY.toFixed(2)} ${lineStr} ${lastPt.x.toFixed(2)},${baselineY.toFixed(2)}`,\n\t\t\t\t\tstroke: 'none',\n\t\t\t\t\tstrokeWidth: 0,\n\t\t\t\t\tfill: c,\n\t\t\t\t\topacity: 0.25,\n\t\t\t\t} satisfies SvgPolyline);\n\t\t\t}\n\t\t\tprimitives.push({\n\t\t\t\tkind: 'polyline',\n\t\t\t\tpoints: lineStr,\n\t\t\t\tstroke: c,\n\t\t\t\tstrokeWidth: 2,\n\t\t\t\tfill: 'none',\n\t\t\t} satisfies SvgPolyline);\n\n\t\t\tif (chartData.style?.hasDataLabels) {\n\t\t\t\tseries.values.forEach((val, vi) => {\n\t\t\t\t\tconst pt = pts[vi];\n\t\t\t\t\tif (!pt) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tdataLabels.push({\n\t\t\t\t\t\tkind: 'text',\n\t\t\t\t\t\tx: pt.x,\n\t\t\t\t\t\ty: pt.y - 6,\n\t\t\t\t\t\ttext: formatAxisValue(val),\n\t\t\t\t\t\tfontSize: 7,\n\t\t\t\t\t\tfill: '#334155',\n\t\t\t\t\t\ttextAnchor: 'middle',\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t} else if (kind === 'scatter') {\n\t\tconst allIndices = chartData.series.flatMap((s) => s.values.map((_, i) => i));\n\t\tconst maxXIndex = Math.max(1, ...allIndices);\n\n\t\tfor (let si = 0; si < chartData.series.length; si++) {\n\t\t\tconst series = chartData.series[si];\n\t\t\tconst c = seriesColor(series, si, chartData.colorPalette);\n\t\t\tconst dots = computeScatterDots(series.values, maxXIndex, layout, range);\n\t\t\tfor (const dot of dots) {\n\t\t\t\tprimitives.push({\n\t\t\t\t\tkind: 'circle',\n\t\t\t\t\tcx: dot.cx,\n\t\t\t\t\tcy: dot.cy,\n\t\t\t\t\tr: 4,\n\t\t\t\t\tfill: c,\n\t\t\t\t\topacity: 0.85,\n\t\t\t\t} satisfies SvgCircle);\n\t\t\t}\n\n\t\t\tif (chartData.style?.hasDataLabels) {\n\t\t\t\tseries.values.forEach((val, vi) => {\n\t\t\t\t\tconst dot = dots[vi];\n\t\t\t\t\tif (!dot) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tdataLabels.push({\n\t\t\t\t\t\tkind: 'text',\n\t\t\t\t\t\tx: dot.cx,\n\t\t\t\t\t\ty: dot.cy - 6,\n\t\t\t\t\t\ttext: formatAxisValue(val),\n\t\t\t\t\t\tfontSize: 7,\n\t\t\t\t\t\tfill: '#334155',\n\t\t\t\t\t\ttextAnchor: 'middle',\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tconst title = chartData.style?.hasTitle && chartData.title ? chartData.title : undefined;\n\n\treturn {\n\t\tsvgWidth: layout.svgWidth,\n\t\tsvgHeight: layout.svgHeight,\n\t\ttitle,\n\t\ttitleX: layout.svgWidth / 2,\n\t\ttitleY: 12,\n\t\tgridlines,\n\t\taxisLabels,\n\t\tzeroLine,\n\t\tcategoryLabels: catLabels,\n\t\tprimitives,\n\t\tdataLabels,\n\t\tlegend: chartData.style?.hasLegend ? legend : [],\n\t\tlegendX,\n\t\tlegendY,\n\t\tlegendAnchor,\n\t};\n}\n","/**\n * ChartRendererComponent - Angular port of the React chart rendering pipeline\n * (`packages/react/src/viewer/utils/chart*.tsx`), viewer-first subset.\n *\n * Supported chart kinds (inline SVG):\n * bar / column (clustered, stacked, percentStacked)\n * line / line3D\n * area / area3D\n * pie / doughnut / pie3D / ofPie\n * scatter\n *\n * Deferred (labelled fallback box):\n * bubble, radar, stock, waterfall, combo, surface, treemap, sunburst,\n * funnel, boxWhisker, histogram, regionMap, bar3D (complex 3-D shading),\n * error bars, trendlines, secondary axes, data tables.\n *\n * Architecture: all geometry/math lives in `chart-renderer-helpers.ts` (pure TS,\n * no Angular imports) so vitest tests can run without TestBed. The component\n * is a thin projector: input -> `computed()` -> `ChartViewModel` -> template.\n *\n * Selector: `pptx-chart-renderer`\n * Input: `element` - required `PptxElement` narrowed to `type === 'chart'`\n */\nimport { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { PptxElement } from 'pptx-viewer-core';\n\nimport { buildChartViewModel } from './chart-renderer-helpers';\nimport type {\n\tChartViewModel,\n\tSvgCircle,\n\tSvgLine,\n\tSvgPath,\n\tSvgPolyline,\n\tSvgPrimitive,\n\tSvgRect,\n\tSvgText,\n} from './chart-renderer-helpers';\n\nexport type { ChartViewModel };\n\nconst LEGEND_SWATCH_SIZE = 10;\nconst LEGEND_ITEM_WIDTH = 80;\n\n@Component({\n\tselector: 'pptx-chart-renderer',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\timports: [],\n\ttemplate: `\n\t\t<svg\n\t\t\t[attr.width]=\"vm().svgWidth\"\n\t\t\t[attr.height]=\"vm().svgHeight\"\n\t\t\t[attr.viewBox]=\"viewBox()\"\n\t\t\tclass=\"pptx-ng-chart-svg\"\n\t\t\tstyle=\"overflow: visible; display: block; pointer-events: none;\"\n\t\t>\n\t\t\t<!-- Background tint -->\n\t\t\t<rect\n\t\t\t\tx=\"0\"\n\t\t\t\ty=\"0\"\n\t\t\t\t[attr.width]=\"vm().svgWidth\"\n\t\t\t\t[attr.height]=\"vm().svgHeight\"\n\t\t\t\tfill=\"#0f172a0d\"\n\t\t\t/>\n\n\t\t\t<!-- Chart title -->\n\t\t\t@if (vm().title) {\n\t\t\t\t<text\n\t\t\t\t\t[attr.x]=\"vm().titleX\"\n\t\t\t\t\t[attr.y]=\"vm().titleY\"\n\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\tfont-size=\"12\"\n\t\t\t\t\tfont-weight=\"600\"\n\t\t\t\t\tfill=\"#1e293b\"\n\t\t\t\t>\n\t\t\t\t\t{{ vm().title }}\n\t\t\t\t</text>\n\t\t\t}\n\n\t\t\t<!-- Gridlines -->\n\t\t\t@for (gl of vm().gridlines; track $index) {\n\t\t\t\t<line\n\t\t\t\t\t[attr.x1]=\"gl.x1\"\n\t\t\t\t\t[attr.y1]=\"gl.y1\"\n\t\t\t\t\t[attr.x2]=\"gl.x2\"\n\t\t\t\t\t[attr.y2]=\"gl.y2\"\n\t\t\t\t\t[attr.stroke]=\"gl.stroke\"\n\t\t\t\t\t[attr.stroke-width]=\"gl.strokeWidth\"\n\t\t\t\t/>\n\t\t\t}\n\n\t\t\t<!-- Value-axis labels -->\n\t\t\t@for (lbl of vm().axisLabels; track $index) {\n\t\t\t\t<text\n\t\t\t\t\t[attr.x]=\"lbl.x\"\n\t\t\t\t\t[attr.y]=\"lbl.y\"\n\t\t\t\t\t[attr.text-anchor]=\"lbl.textAnchor\"\n\t\t\t\t\t[attr.font-size]=\"lbl.fontSize\"\n\t\t\t\t\t[attr.fill]=\"lbl.fill\"\n\t\t\t\t\t[attr.dominant-baseline]=\"lbl.dominantBaseline ?? 'auto'\"\n\t\t\t\t>\n\t\t\t\t\t{{ lbl.text }}\n\t\t\t\t</text>\n\t\t\t}\n\n\t\t\t<!-- Zero line -->\n\t\t\t@if (vm().zeroLine) {\n\t\t\t\t<line\n\t\t\t\t\t[attr.x1]=\"vm().zeroLine!.x1\"\n\t\t\t\t\t[attr.y1]=\"vm().zeroLine!.y1\"\n\t\t\t\t\t[attr.x2]=\"vm().zeroLine!.x2\"\n\t\t\t\t\t[attr.y2]=\"vm().zeroLine!.y2\"\n\t\t\t\t\t[attr.stroke]=\"vm().zeroLine!.stroke\"\n\t\t\t\t\t[attr.stroke-width]=\"vm().zeroLine!.strokeWidth\"\n\t\t\t\t/>\n\t\t\t}\n\n\t\t\t<!-- Category-axis labels -->\n\t\t\t@for (lbl of vm().categoryLabels; track $index) {\n\t\t\t\t<text\n\t\t\t\t\t[attr.x]=\"lbl.x\"\n\t\t\t\t\t[attr.y]=\"lbl.y\"\n\t\t\t\t\t[attr.text-anchor]=\"lbl.textAnchor\"\n\t\t\t\t\t[attr.font-size]=\"lbl.fontSize\"\n\t\t\t\t\t[attr.fill]=\"lbl.fill\"\n\t\t\t\t>\n\t\t\t\t\t{{ lbl.text }}\n\t\t\t\t</text>\n\t\t\t}\n\n\t\t\t<!-- Data primitives (bars, lines, arcs, dots ...) -->\n\t\t\t@for (prim of vm().primitives; track $index) {\n\t\t\t\t@switch (prim.kind) {\n\t\t\t\t\t@case ('rect') {\n\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t[attr.x]=\"asRect(prim).x\"\n\t\t\t\t\t\t\t[attr.y]=\"asRect(prim).y\"\n\t\t\t\t\t\t\t[attr.width]=\"asRect(prim).w\"\n\t\t\t\t\t\t\t[attr.height]=\"asRect(prim).h\"\n\t\t\t\t\t\t\t[attr.fill]=\"asRect(prim).fill\"\n\t\t\t\t\t\t\t[attr.rx]=\"asRect(prim).rx ?? 0\"\n\t\t\t\t\t\t\t[attr.opacity]=\"asRect(prim).opacity ?? 1\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t\t@case ('path') {\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t[attr.d]=\"asPath(prim).d\"\n\t\t\t\t\t\t\t[attr.fill]=\"asPath(prim).fill\"\n\t\t\t\t\t\t\t[attr.stroke]=\"asPath(prim).stroke ?? 'none'\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"asPath(prim).strokeWidth ?? 0\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t\t@case ('polyline') {\n\t\t\t\t\t\t<polyline\n\t\t\t\t\t\t\t[attr.points]=\"asPolyline(prim).points\"\n\t\t\t\t\t\t\t[attr.stroke]=\"asPolyline(prim).stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"asPolyline(prim).strokeWidth\"\n\t\t\t\t\t\t\t[attr.fill]=\"asPolyline(prim).fill\"\n\t\t\t\t\t\t\t[attr.opacity]=\"asPolyline(prim).opacity ?? 1\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t\t@case ('circle') {\n\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t[attr.cx]=\"asCircle(prim).cx\"\n\t\t\t\t\t\t\t[attr.cy]=\"asCircle(prim).cy\"\n\t\t\t\t\t\t\t[attr.r]=\"asCircle(prim).r\"\n\t\t\t\t\t\t\t[attr.fill]=\"asCircle(prim).fill\"\n\t\t\t\t\t\t\t[attr.opacity]=\"asCircle(prim).opacity ?? 1\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t\t@case ('line') {\n\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t[attr.x1]=\"asLine(prim).x1\"\n\t\t\t\t\t\t\t[attr.y1]=\"asLine(prim).y1\"\n\t\t\t\t\t\t\t[attr.x2]=\"asLine(prim).x2\"\n\t\t\t\t\t\t\t[attr.y2]=\"asLine(prim).y2\"\n\t\t\t\t\t\t\t[attr.stroke]=\"asLine(prim).stroke\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"asLine(prim).strokeWidth\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t<!-- Data labels -->\n\t\t\t@for (dl of vm().dataLabels; track $index) {\n\t\t\t\t<text\n\t\t\t\t\t[attr.x]=\"dl.x\"\n\t\t\t\t\t[attr.y]=\"dl.y\"\n\t\t\t\t\t[attr.text-anchor]=\"dl.textAnchor\"\n\t\t\t\t\t[attr.font-size]=\"dl.fontSize\"\n\t\t\t\t\t[attr.fill]=\"dl.fill\"\n\t\t\t\t\t[attr.font-weight]=\"dl.fontWeight ?? 'normal'\"\n\t\t\t\t\t[attr.dominant-baseline]=\"dl.dominantBaseline ?? 'auto'\"\n\t\t\t\t>\n\t\t\t\t\t{{ dl.text }}\n\t\t\t\t</text>\n\t\t\t}\n\n\t\t\t<!-- Legend -->\n\t\t\t@if (vm().legend.length > 0) {\n\t\t\t\t@for (entry of vm().legend; track $index) {\n\t\t\t\t\t<g [attr.transform]=\"legendTransform($index)\">\n\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\tx=\"0\"\n\t\t\t\t\t\t\ty=\"-7\"\n\t\t\t\t\t\t\t[attr.width]=\"swatchSize\"\n\t\t\t\t\t\t\t[attr.height]=\"swatchSize\"\n\t\t\t\t\t\t\trx=\"2\"\n\t\t\t\t\t\t\t[attr.fill]=\"entry.color\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<text [attr.x]=\"swatchSize + 3\" y=\"3\" font-size=\"9\" fill=\"#475569\">\n\t\t\t\t\t\t\t{{ entry.label }}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t</g>\n\t\t\t\t}\n\t\t\t}\n\t\t</svg>\n\t`,\n})\nexport class ChartRendererComponent {\n\treadonly element = input.required<PptxElement>();\n\treadonly vm = computed<ChartViewModel>(() => buildChartViewModel(this.element()));\n\treadonly viewBox = computed(() => `0 0 ${this.vm().svgWidth} ${this.vm().svgHeight}`);\n\treadonly swatchSize = LEGEND_SWATCH_SIZE;\n\n\tlegendTransform(index: number): string {\n\t\tconst v = this.vm();\n\t\tconst isVertical = v.legendAnchor === 'start';\n\t\tconst x = isVertical\n\t\t\t? v.legendX\n\t\t\t: v.legendX - (v.legend.length * LEGEND_ITEM_WIDTH) / 2 + index * LEGEND_ITEM_WIDTH;\n\t\tconst y = isVertical ? v.legendY + index * 14 : v.legendY;\n\t\treturn `translate(${x.toFixed(1)},${y.toFixed(1)})`;\n\t}\n\n\tasRect(p: SvgPrimitive): SvgRect {\n\t\treturn p as SvgRect;\n\t}\n\tasPath(p: SvgPrimitive): SvgPath {\n\t\treturn p as SvgPath;\n\t}\n\tasPolyline(p: SvgPrimitive): SvgPolyline {\n\t\treturn p as SvgPolyline;\n\t}\n\tasCircle(p: SvgPrimitive): SvgCircle {\n\t\treturn p as SvgCircle;\n\t}\n\tasLine(p: SvgPrimitive): SvgLine {\n\t\treturn p as SvgLine;\n\t}\n\tasText(p: SvgPrimitive): SvgText {\n\t\treturn p as SvgText;\n\t}\n}\n","/**\n * Pure, framework-agnostic helpers for rendering connector elements.\n *\n * These are extracted from the component so they can be unit-tested without\n * the Angular compiler or TestBed (the vitest setup for this package is\n * plain happy-dom, no Analog plugin yet — see PORTING.md).\n *\n * Mirror of the Vue `ConnectorRenderer.vue` helpers and the React\n * `ConnectorElementRenderer` path logic (basic straight-line subset).\n */\n\nimport type { ConnectorArrowType, PptxElement } from 'pptx-viewer-core';\nimport { hasShapeProperties } from 'pptx-viewer-core';\n\nimport { DEFAULT_STROKE_COLOR } from '../internal/shared';\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/** Shape description for a SVG `<marker>` element (viewBox 0 0 10 10). */\nexport interface MarkerShape {\n\tshape: 'path' | 'circle';\n\td?: string;\n}\n\n/** All derived connector rendering values, computed from a `PptxElement`. */\nexport interface ConnectorGeometry {\n\tstrokeWidth: number;\n\tstrokeColor: string;\n\tstrokeOpacity: number;\n\tdashArray: string | undefined;\n\t/** SVG width (clamped to at least 1). */\n\tsvgW: number;\n\t/** SVG height (clamped to at least 1). */\n\tsvgH: number;\n\tx1: number;\n\ty1: number;\n\tx2: number;\n\ty2: number;\n\t/**\n\t * SVG `path` data for bent / curved connectors. `undefined` for straight\n\t * connectors, in which case the component renders a `<line>` from\n\t * `(x1,y1)` to `(x2,y2)` instead.\n\t */\n\tpathD: string | undefined;\n\tstartMarkerId: string;\n\tendMarkerId: string;\n\tstartMarker: MarkerShape | null;\n\tendMarker: MarkerShape | null;\n\tstartMarkerRef: string | null;\n\tendMarkerRef: string | null;\n\t/** Inline `style` string for the wrapper `<div>`. */\n\twrapperStyle: string;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Derive all rendering geometry for a connector element.\n *\n * This is a pure function: no side-effects, no Angular/Vue/React imports.\n * The component calls this once per change-detection cycle inside a `computed()`.\n */\nexport function buildConnectorGeometry(element: PptxElement, zIndex: number): ConnectorGeometry {\n\tconst ss = hasShapeProperties(element) ? element.shapeStyle : undefined;\n\n\tconst strokeWidth = Math.max(0, ss?.strokeWidth ?? 2);\n\tconst strokeColor = ss?.strokeColor ?? DEFAULT_STROKE_COLOR;\n\tconst strokeOpacity = ss?.strokeOpacity ?? 1;\n\tconst dashArray = buildDashArray(ss?.strokeDash, strokeWidth);\n\n\tconst svgW = Math.max(element.width, 1);\n\tconst svgH = Math.max(element.height, 1);\n\n\tconst x1 = element.flipHorizontal ? svgW : 0;\n\tconst y1 = element.flipVertical ? svgH : 0;\n\tconst x2 = element.flipHorizontal ? 0 : svgW;\n\tconst y2 = element.flipVertical ? 0 : svgH;\n\n\tconst shapeType = (element as { shapeType?: string }).shapeType;\n\tconst pathD = buildConnectorPathD(shapeType, x1, y1, x2, y2, connectorBendFraction(element));\n\n\tconst markerSeed = element.id.replace(/[^a-zA-Z0-9_-]/gu, '_');\n\tconst startMarkerId = `${markerSeed}-start`;\n\tconst endMarkerId = `${markerSeed}-end`;\n\n\tconst startArrow = normalizeArrow(ss?.connectorStartArrow);\n\tconst endArrow = normalizeArrow(ss?.connectorEndArrow);\n\n\tconst startMarker = startArrow ? markerPath(startArrow) : null;\n\tconst endMarker = endArrow ? markerPath(endArrow) : null;\n\n\tconst startMarkerRef = startMarker ? `url(#${startMarkerId})` : null;\n\tconst endMarkerRef = endMarker ? `url(#${endMarkerId})` : null;\n\n\tconst wrapperStyle = buildWrapperStyle(element, zIndex);\n\n\treturn {\n\t\tstrokeWidth,\n\t\tstrokeColor,\n\t\tstrokeOpacity,\n\t\tdashArray,\n\t\tsvgW,\n\t\tsvgH,\n\t\tx1,\n\t\ty1,\n\t\tx2,\n\t\ty2,\n\t\tpathD,\n\t\tstartMarkerId,\n\t\tendMarkerId,\n\t\tstartMarker,\n\t\tendMarker,\n\t\tstartMarkerRef,\n\t\tendMarkerRef,\n\t\twrapperStyle,\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers (also exported for tests)\n// ---------------------------------------------------------------------------\n\n/**\n * Return the dash-array string for a given stroke dash type and width,\n * or `undefined` for solid lines (no attribute needed).\n */\nexport function buildDashArray(dash: string | undefined, strokeWidth: number): string | undefined {\n\tconst w = Math.max(strokeWidth, 1);\n\tif (!dash || dash === 'solid') {\n\t\treturn undefined;\n\t}\n\tif (dash === 'dot' || dash === 'sysDot') {\n\t\treturn `${w} ${w}`;\n\t}\n\treturn `${w * 3} ${w}`;\n}\n\n/** Connector routing family, derived from the OOXML preset shape type. */\nexport type ConnectorKind = 'straight' | 'bent' | 'curved';\n\n/**\n * Classify a connector by its OOXML preset shape type (case-insensitive):\n * `bentConnector2..5` → `\"bent\"`, `curvedConnector2..5` → `\"curved\"`,\n * everything else (incl. `straightConnector1`) → `\"straight\"`.\n */\nexport function connectorKind(shapeType: string | undefined): ConnectorKind {\n\tconst t = (shapeType ?? '').toLowerCase();\n\tif (t.includes('bentconnector')) {\n\t\treturn 'bent';\n\t}\n\tif (t.includes('curvedconnector')) {\n\t\treturn 'curved';\n\t}\n\treturn 'straight';\n}\n\n/**\n * Normalise a connector's first adjustment value (`adj1`/`adj`) to a 0..1\n * fraction that positions the elbow / curve mid-axis. OOXML stores these in\n * 1000ths of a percent (0..100000); values already in 0..1 are passed through.\n * Defaults to the midpoint (`0.5`) when no usable adjustment is present.\n */\nexport function connectorBendFraction(element: PptxElement): number {\n\tconst adj = (element as { shapeAdjustments?: Record<string, number> }).shapeAdjustments;\n\tconst raw = adj?.adj1 ?? adj?.adj;\n\tif (typeof raw !== 'number' || !Number.isFinite(raw)) {\n\t\treturn 0.5;\n\t}\n\tconst fraction = Math.abs(raw) > 1 ? raw / 100000 : raw;\n\treturn Math.min(1, Math.max(0, fraction));\n}\n\n/**\n * Build the SVG `path` data for a bent or curved connector, or `undefined`\n * for straight connectors (which render as a `<line>`). Endpoints are already\n * flip-adjusted by the caller.\n *\n * Viewer-first approximation (full A* routing is a TODO, see PORTING.md):\n * - **bent**: orthogonal elbow polyline. `bentConnector2` is a single L-bend;\n * `bentConnector3..5` route through a vertical mid-axis at `bend`.\n * - **curved**: `curvedConnector2` is a quadratic Bézier; `curvedConnector3..5`\n * are a cubic S-curve with control points on the mid-axis.\n */\nexport function buildConnectorPathD(\n\tshapeType: string | undefined,\n\tx1: number,\n\ty1: number,\n\tx2: number,\n\ty2: number,\n\tbend: number,\n): string | undefined {\n\tconst kind = connectorKind(shapeType);\n\tif (kind === 'straight') {\n\t\treturn undefined;\n\t}\n\tconst t = (shapeType ?? '').toLowerCase();\n\t// x of the vertical mid-axis the elbow / control points pivot around.\n\tconst mx = x1 + (x2 - x1) * bend;\n\n\tif (kind === 'bent') {\n\t\tif (t.includes('bentconnector2')) {\n\t\t\treturn `M${x1},${y1} L${x2},${y1} L${x2},${y2}`;\n\t\t}\n\t\treturn `M${x1},${y1} L${mx},${y1} L${mx},${y2} L${x2},${y2}`;\n\t}\n\n\t// curved\n\tif (t.includes('curvedconnector2')) {\n\t\treturn `M${x1},${y1} Q${x2},${y1} ${x2},${y2}`;\n\t}\n\treturn `M${x1},${y1} C${mx},${y1} ${mx},${y2} ${x2},${y2}`;\n}\n\n/**\n * Map a `ConnectorArrowType` value to its SVG marker shape.\n * The viewBox used in the `<marker>` element is `0 0 10 10`.\n */\nexport function markerPath(type: ConnectorArrowType): MarkerShape {\n\tswitch (type) {\n\t\tcase 'diamond':\n\t\t\treturn { shape: 'path', d: 'M5 0 L10 5 L5 10 L0 5 Z' };\n\t\tcase 'oval':\n\t\t\treturn { shape: 'circle' };\n\t\tcase 'stealth':\n\t\t\treturn { shape: 'path', d: 'M0 0 L10 5 L0 10 L3 5 Z' };\n\t\t// triangle / arrow / fallback\n\t\tdefault:\n\t\t\treturn { shape: 'path', d: 'M0 0 L10 5 L0 10 Z' };\n\t}\n}\n\n/** Normalise a raw arrow type value: coerce `\"none\"` / `undefined` → `undefined`. */\nexport function normalizeArrow(a: ConnectorArrowType | undefined): ConnectorArrowType | undefined {\n\treturn a && a !== 'none' ? a : undefined;\n}\n\n/**\n * Build the inline `style` string for the connector wrapper `<div>`.\n * Position, size, z-index, rotation, opacity, and visibility.\n */\nexport function buildWrapperStyle(element: PptxElement, zIndex: number): string {\n\tconst parts: string[] = [\n\t\t'position:absolute',\n\t\t`left:${element.x}px`,\n\t\t`top:${element.y}px`,\n\t\t`width:${element.width}px`,\n\t\t`height:${element.height}px`,\n\t\t`z-index:${zIndex}`,\n\t\t'pointer-events:none',\n\t\t'overflow:visible',\n\t];\n\tif (element.rotation) {\n\t\t// Flip is handled via endpoints; only rotation goes on the transform.\n\t\tparts.push(`transform:rotate(${element.rotation}deg)`);\n\t}\n\tif (typeof element.opacity === 'number') {\n\t\tparts.push(`opacity:${element.opacity}`);\n\t}\n\tif (element.hidden) {\n\t\tparts.push('display:none');\n\t}\n\treturn parts.join(';');\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { PptxElement } from 'pptx-viewer-core';\n\nimport { buildConnectorGeometry } from './connector-path';\nimport type { MarkerShape } from './connector-path';\n\n/**\n * ConnectorRendererComponent — Angular port of the Vue `ConnectorRenderer.vue`\n * (and the React `ConnectorElementRenderer`, basic subset).\n *\n * Renders straight connectors/lines as an inline SVG spanning the element's\n * bounding box, with stroke colour/width/dash and start/end arrowheads. Flip\n * is baked into the endpoints (not a CSS transform) so arrowheads point the\n * right way.\n *\n * All path/style math lives in `connector-path.ts` (pure TS, no Angular\n * dependency) so it can be unit-tested without TestBed.\n *\n * Not yet ported (TODO, see PORTING.md): bent/curved connector routing\n * (`getConnectorPathGeometry`), compound lines, connector text overlay, line\n * shadows/glow. Bent/curved connectors currently fall back to a straight line.\n */\n@Component({\n\tselector: 'pptx-connector-renderer',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\timports: [],\n\ttemplate: `\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-connector\"\n\t\t\t[style]=\"geo().wrapperStyle\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t>\n\t\t\t<svg\n\t\t\t\t[attr.width]=\"geo().svgW\"\n\t\t\t\t[attr.height]=\"geo().svgH\"\n\t\t\t\t[attr.viewBox]=\"viewBox()\"\n\t\t\t\tstyle=\"overflow: visible; display: block\"\n\t\t\t>\n\t\t\t\t<defs>\n\t\t\t\t\t@if (geo().startMarker) {\n\t\t\t\t\t\t<marker\n\t\t\t\t\t\t\t[attr.id]=\"geo().startMarkerId\"\n\t\t\t\t\t\t\tviewBox=\"0 0 10 10\"\n\t\t\t\t\t\t\trefX=\"5\"\n\t\t\t\t\t\t\trefY=\"5\"\n\t\t\t\t\t\t\tmarkerWidth=\"4\"\n\t\t\t\t\t\t\tmarkerHeight=\"4\"\n\t\t\t\t\t\t\torient=\"auto-start-reverse\"\n\t\t\t\t\t\t\tmarkerUnits=\"strokeWidth\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@if (geo().startMarker!.shape === 'circle') {\n\t\t\t\t\t\t\t\t<circle cx=\"5\" cy=\"5\" r=\"4\" [attr.fill]=\"geo().strokeColor\" />\n\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t<path [attr.d]=\"geo().startMarker!.d\" [attr.fill]=\"geo().strokeColor\" />\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</marker>\n\t\t\t\t\t}\n\t\t\t\t\t@if (geo().endMarker) {\n\t\t\t\t\t\t<marker\n\t\t\t\t\t\t\t[attr.id]=\"geo().endMarkerId\"\n\t\t\t\t\t\t\tviewBox=\"0 0 10 10\"\n\t\t\t\t\t\t\trefX=\"5\"\n\t\t\t\t\t\t\trefY=\"5\"\n\t\t\t\t\t\t\tmarkerWidth=\"4\"\n\t\t\t\t\t\t\tmarkerHeight=\"4\"\n\t\t\t\t\t\t\torient=\"auto-start-reverse\"\n\t\t\t\t\t\t\tmarkerUnits=\"strokeWidth\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t@if (geo().endMarker!.shape === 'circle') {\n\t\t\t\t\t\t\t\t<circle cx=\"5\" cy=\"5\" r=\"4\" [attr.fill]=\"geo().strokeColor\" />\n\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t<path [attr.d]=\"geo().endMarker!.d\" [attr.fill]=\"geo().strokeColor\" />\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</marker>\n\t\t\t\t\t}\n\t\t\t\t</defs>\n\t\t\t\t@if (geo().pathD) {\n\t\t\t\t\t<path\n\t\t\t\t\t\t[attr.d]=\"geo().pathD\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t[attr.stroke]=\"geo().strokeColor\"\n\t\t\t\t\t\t[attr.stroke-width]=\"geo().strokeWidth\"\n\t\t\t\t\t\t[attr.stroke-opacity]=\"geo().strokeOpacity\"\n\t\t\t\t\t\t[attr.stroke-dasharray]=\"geo().dashArray ?? null\"\n\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t[attr.marker-start]=\"geo().startMarkerRef\"\n\t\t\t\t\t\t[attr.marker-end]=\"geo().endMarkerRef\"\n\t\t\t\t\t/>\n\t\t\t\t} @else {\n\t\t\t\t\t<line\n\t\t\t\t\t\t[attr.x1]=\"geo().x1\"\n\t\t\t\t\t\t[attr.y1]=\"geo().y1\"\n\t\t\t\t\t\t[attr.x2]=\"geo().x2\"\n\t\t\t\t\t\t[attr.y2]=\"geo().y2\"\n\t\t\t\t\t\t[attr.stroke]=\"geo().strokeColor\"\n\t\t\t\t\t\t[attr.stroke-width]=\"geo().strokeWidth\"\n\t\t\t\t\t\t[attr.stroke-opacity]=\"geo().strokeOpacity\"\n\t\t\t\t\t\t[attr.stroke-dasharray]=\"geo().dashArray ?? null\"\n\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t[attr.marker-start]=\"geo().startMarkerRef\"\n\t\t\t\t\t\t[attr.marker-end]=\"geo().endMarkerRef\"\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t</svg>\n\t\t</div>\n\t`,\n})\nexport class ConnectorRendererComponent {\n\treadonly element = input.required<PptxElement>();\n\treadonly zIndex = input<number>(0);\n\n\t/** All derived geometry, recomputed on every input change. */\n\treadonly geo = computed(() => buildConnectorGeometry(this.element(), this.zIndex()));\n\n\treadonly viewBox = computed(() => `0 0 ${this.geo().svgW} ${this.geo().svgH}`);\n}\n\n// Re-export the MarkerShape type so consumers can reference it if needed.\nexport type { MarkerShape };\n","/**\n * Scalar viewer defaults — shared across the React, Vue, and Angular bindings\n * via `pptx-viewer-shared`. Re-exported here for ergonomic local imports.\n */\nexport {\n\tDEFAULT_CANVAS_WIDTH,\n\tDEFAULT_CANVAS_HEIGHT,\n\tDEFAULT_TEXT_COLOR,\n\tDEFAULT_FILL_COLOR,\n\tDEFAULT_STROKE_COLOR,\n} from '../internal/shared';\n","/**\n * Visual effects helper — pure CSS computation for OOXML shape/image effects.\n *\n * Ported verbatim from the Vue package's `viewer/composables/visual-effects.ts`\n * (origin/main). No Angular, Vue, or React runtime dependency — everything here\n * is a pure function so it can be unit-tested without a DI context and wired\n * into `element-style.ts` by the integrator.\n *\n * It covers, for shapes/connectors/images:\n * - **Outer shadow** → CSS `box-shadow`\n * - **Inner shadow** → CSS `inset` `box-shadow`\n * - **Multi-layer shadow** → comma-joined `box-shadow` (from `shadows[]`)\n * - **Outer glow** → CSS `filter: drop-shadow(...)` (simple path) and\n * optional layered `box-shadow` (high-fidelity path)\n * - **Soft edges / blur** → CSS `filter: blur(...)`\n * - **Reflection** → Chromium `-webkit-box-reflect`\n * - **Effect DAG** → CSS `filter` (grayscale/biLevel/lum/hsl/tint…),\n * `opacity`, `mix-blend-mode`, + optional duotone\n * `<filter>` SVG markup (high-fidelity path)\n *\n * Units/precedence match the React implementation: spatial values are already\n * in px on `ShapeStyle` (pre-converted from EMU by core), angles are degrees,\n * alpha is 0–1.\n *\n * @module viewer/visual-effects\n */\n\nimport type { PptxElement, ShapeStyle } from 'pptx-viewer-core';\nimport { isImageLikeElement } from 'pptx-viewer-core';\n\n// ── Low-level colour helpers ───────────────────────────────────────────────\n\nconst DEFAULT_SHADOW_COLOR = '#000000';\nconst DEFAULT_GLOW_COLOR = '#ffff00';\n\n/** Clamp a numeric value to the [0, 1] range. */\nfunction clampUnitInterval(value: number): number {\n\treturn Math.min(1, Math.max(0, value));\n}\n\n/**\n * Normalize an arbitrary colour string to a 6-digit hex value (`#RRGGBB`).\n * Returns `fallback` when the input is missing, \"transparent\", or invalid.\n */\nexport function normalizeHexColor(value: string | undefined, fallback: string): string {\n\tif (!value || value === 'transparent') {\n\t\treturn fallback;\n\t}\n\tconst candidate = value.startsWith('#') ? value : `#${value}`;\n\treturn /^#[0-9A-Fa-f]{6}$/u.test(candidate) ? candidate : fallback;\n}\n\n/** Parse a 6-digit hex colour into 0–255 R/G/B channels, or `null` if invalid. */\nfunction hexToRgbChannels(color: string): { r: number; g: number; b: number } | null {\n\tconst normalized = color.replace('#', '');\n\tif (!/^[0-9a-fA-F]{6}$/u.test(normalized)) {\n\t\treturn null;\n\t}\n\treturn {\n\t\tr: Number.parseInt(normalized.slice(0, 2), 16),\n\t\tg: Number.parseInt(normalized.slice(2, 4), 16),\n\t\tb: Number.parseInt(normalized.slice(4, 6), 16),\n\t};\n}\n\n/**\n * Convert a hex colour to an `rgba()` string with the given opacity. When\n * `opacity` is `undefined` the original colour is returned unchanged.\n */\nexport function colorWithOpacity(color: string, opacity: number | undefined): string {\n\tif (opacity === undefined) {\n\t\treturn color;\n\t}\n\tconst rgb = hexToRgbChannels(color);\n\tif (!rgb) {\n\t\treturn color;\n\t}\n\treturn `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${clampUnitInterval(opacity)})`;\n}\n\n// ── Outer / inner / multi-layer shadow (box-shadow) ────────────────────────\n\n/**\n * Build a CSS `box-shadow` value from the single outer-shadow properties on a\n * {@link ShapeStyle}. Supports both angle/distance and direct x/y offset modes.\n * Returns `undefined` when no shadow colour is defined.\n */\nexport function getOuterShadowCss(style: ShapeStyle | undefined): string | undefined {\n\tif (!style?.shadowColor || style.shadowColor === 'transparent') {\n\t\treturn undefined;\n\t}\n\n\tlet offsetX: number;\n\tlet offsetY: number;\n\tif (typeof style.shadowAngle === 'number' && typeof style.shadowDistance === 'number') {\n\t\tconst angleRad = (style.shadowAngle * Math.PI) / 180;\n\t\toffsetX = Math.cos(angleRad) * style.shadowDistance;\n\t\toffsetY = Math.sin(angleRad) * style.shadowDistance;\n\t} else {\n\t\toffsetX =\n\t\t\ttypeof style.shadowOffsetX === 'number' && Number.isFinite(style.shadowOffsetX)\n\t\t\t\t? style.shadowOffsetX\n\t\t\t\t: 4;\n\t\toffsetY =\n\t\t\ttypeof style.shadowOffsetY === 'number' && Number.isFinite(style.shadowOffsetY)\n\t\t\t\t? style.shadowOffsetY\n\t\t\t\t: 4;\n\t}\n\n\tconst blur =\n\t\ttypeof style.shadowBlur === 'number' && Number.isFinite(style.shadowBlur)\n\t\t\t? Math.max(0, style.shadowBlur)\n\t\t\t: 6;\n\tconst opacity =\n\t\ttypeof style.shadowOpacity === 'number' && Number.isFinite(style.shadowOpacity)\n\t\t\t? clampUnitInterval(style.shadowOpacity)\n\t\t\t: 0.35;\n\n\treturn `${Math.round(offsetX)}px ${Math.round(offsetY)}px ${Math.round(blur)}px ${colorWithOpacity(\n\t\tnormalizeHexColor(style.shadowColor, DEFAULT_SHADOW_COLOR),\n\t\topacity,\n\t)}`;\n}\n\n/**\n * Build a CSS `inset` `box-shadow` value from the inner-shadow properties on a\n * {@link ShapeStyle}. Returns `undefined` when no inner-shadow colour is set.\n */\nexport function getInnerShadowCss(style: ShapeStyle | undefined): string | undefined {\n\tif (!style?.innerShadowColor || style.innerShadowColor === 'transparent') {\n\t\treturn undefined;\n\t}\n\tconst offsetX =\n\t\ttypeof style.innerShadowOffsetX === 'number' && Number.isFinite(style.innerShadowOffsetX)\n\t\t\t? style.innerShadowOffsetX\n\t\t\t: 0;\n\tconst offsetY =\n\t\ttypeof style.innerShadowOffsetY === 'number' && Number.isFinite(style.innerShadowOffsetY)\n\t\t\t? style.innerShadowOffsetY\n\t\t\t: 0;\n\tconst blur =\n\t\ttypeof style.innerShadowBlur === 'number' && Number.isFinite(style.innerShadowBlur)\n\t\t\t? Math.max(0, style.innerShadowBlur)\n\t\t\t: 6;\n\tconst opacity =\n\t\ttypeof style.innerShadowOpacity === 'number' && Number.isFinite(style.innerShadowOpacity)\n\t\t\t? clampUnitInterval(style.innerShadowOpacity)\n\t\t\t: 0.5;\n\n\treturn `inset ${Math.round(offsetX)}px ${Math.round(offsetY)}px ${Math.round(blur)}px ${colorWithOpacity(\n\t\tnormalizeHexColor(style.innerShadowColor, DEFAULT_SHADOW_COLOR),\n\t\topacity,\n\t)}`;\n}\n\n/**\n * Build a comma-joined CSS `box-shadow` string for all layers in the `shadows`\n * array (PowerPoint compound outer shadows). Returns `undefined` when empty.\n */\nexport function getMultiLayerShadowCss(style: ShapeStyle | undefined): string | undefined {\n\tif (!style?.shadows || style.shadows.length === 0) {\n\t\treturn undefined;\n\t}\n\tconst parts: string[] = [];\n\tfor (const shadow of style.shadows) {\n\t\tif (!shadow.color || shadow.color === 'transparent') {\n\t\t\tcontinue;\n\t\t}\n\t\tconst angleRad = ((shadow.angle ?? 0) * Math.PI) / 180;\n\t\tconst dist = shadow.distance ?? 0;\n\t\tconst offsetX = Math.round(Math.cos(angleRad) * dist);\n\t\tconst offsetY = Math.round(Math.sin(angleRad) * dist);\n\t\tconst blur = Math.round(Math.max(0, shadow.blur ?? 6));\n\t\tconst opacity = clampUnitInterval(shadow.opacity ?? 0.35);\n\t\tconst color = colorWithOpacity(normalizeHexColor(shadow.color, DEFAULT_SHADOW_COLOR), opacity);\n\t\tparts.push(`${offsetX}px ${offsetY}px ${blur}px ${color}`);\n\t}\n\treturn parts.length > 0 ? parts.join(', ') : undefined;\n}\n\n/**\n * Build a high-fidelity layered `box-shadow` for a glow effect (3 concentric\n * shadows at increasing radius / decreasing opacity). This supplements the\n * filter-based glow from {@link getEffectFilterCss}. Returns `undefined` when\n * no glow is configured.\n */\nexport function getGlowBoxShadowCss(\n\tcolor: string | undefined,\n\tradius: number | undefined,\n\topacity: number | undefined,\n): string | undefined {\n\tif (!color || color === 'transparent' || !radius || radius <= 0) {\n\t\treturn undefined;\n\t}\n\tconst baseOpacity = typeof opacity === 'number' ? clampUnitInterval(opacity) : 0.75;\n\tconst normalizedColor = normalizeHexColor(color, DEFAULT_GLOW_COLOR);\n\n\tconst r1 = Math.round(radius * 0.33);\n\tconst c1 = colorWithOpacity(normalizedColor, baseOpacity);\n\tconst r2 = Math.round(radius * 0.66);\n\tconst c2 = colorWithOpacity(normalizedColor, baseOpacity * 0.6);\n\tconst r3 = Math.round(radius);\n\tconst c3 = colorWithOpacity(normalizedColor, baseOpacity * 0.3);\n\n\treturn `0 0 ${r1}px ${c1}, 0 0 ${r2}px ${c2}, 0 0 ${r3}px ${c3}`;\n}\n\n/**\n * Combine outer-shadow, multi-layer shadow, inner-shadow and (optionally) the\n * layered glow into a single CSS `box-shadow` value, with the same precedence\n * as the React `getShapeVisualStyle`:\n * multi-layer (if any) **else** single outer-shadow, then inner-shadow,\n * then layered glow.\n *\n * @returns A `box-shadow` value string, or `undefined` if nothing applies.\n */\nexport function getBoxShadowCss(\n\tstyle: ShapeStyle | undefined,\n\toptions: { includeGlow?: boolean } = {},\n): string | undefined {\n\tif (!style) {\n\t\treturn undefined;\n\t}\n\tconst parts: string[] = [];\n\n\tconst multiLayer = getMultiLayerShadowCss(style);\n\tif (multiLayer) {\n\t\tparts.push(multiLayer);\n\t} else {\n\t\tconst outer = getOuterShadowCss(style);\n\t\tif (outer) {\n\t\t\tparts.push(outer);\n\t\t}\n\t}\n\n\tconst inner = getInnerShadowCss(style);\n\tif (inner) {\n\t\tparts.push(inner);\n\t}\n\n\tif (options.includeGlow !== false) {\n\t\tconst glow = getGlowBoxShadowCss(style.glowColor, style.glowRadius, style.glowOpacity);\n\t\tif (glow) {\n\t\t\tparts.push(glow);\n\t\t}\n\t}\n\n\treturn parts.length > 0 ? parts.join(', ') : undefined;\n}\n\n// ── Glow / soft-edge / blur / DAG (CSS filter) ─────────────────────────────\n\n/**\n * Map effect-DAG properties on a {@link ShapeStyle} to CSS `filter` functions.\n * Ported verbatim from the React `getEffectDagCssFilter`. Returns `undefined`\n * when no DAG filters apply.\n *\n * @param style - The shape style carrying the `dag*` fields.\n * @param elementId - Element ID, used only for the duotone `url(#…)` reference.\n */\nexport function getEffectDagCssFilter(\n\tstyle: ShapeStyle | undefined,\n\telementId?: string,\n): string | undefined {\n\tif (!style) {\n\t\treturn undefined;\n\t}\n\tconst filters: string[] = [];\n\n\tif (style.dagGrayscale) {\n\t\tfilters.push('grayscale(1)');\n\t}\n\n\tif (typeof style.dagBiLevel === 'number') {\n\t\tconst thresh = Math.max(0, Math.min(100, style.dagBiLevel));\n\t\tfilters.push(thresh > 50 ? 'contrast(1000)' : 'contrast(0.01)');\n\t}\n\n\tif (typeof style.dagLumBrightness === 'number' || typeof style.dagLumContrast === 'number') {\n\t\tconst bright = style.dagLumBrightness ?? 0;\n\t\tconst contrast = style.dagLumContrast ?? 0;\n\t\tif (bright !== 0) {\n\t\t\tfilters.push(`brightness(${1 + bright / 100})`);\n\t\t}\n\t\tif (contrast !== 0) {\n\t\t\tfilters.push(`contrast(${1 + contrast / 100})`);\n\t\t}\n\t}\n\n\tif (typeof style.dagHslHue === 'number' && style.dagHslHue !== 0) {\n\t\tfilters.push(`hue-rotate(${style.dagHslHue}deg)`);\n\t}\n\tif (typeof style.dagHslSaturation === 'number' && style.dagHslSaturation !== 100) {\n\t\tfilters.push(`saturate(${style.dagHslSaturation / 100})`);\n\t}\n\tif (typeof style.dagHslLuminance === 'number' && style.dagHslLuminance !== 0) {\n\t\tfilters.push(`brightness(${1 + style.dagHslLuminance / 100})`);\n\t}\n\n\tif (typeof style.dagAlphaModFix === 'number') {\n\t\tconst alpha = clampUnitInterval(style.dagAlphaModFix / 100);\n\t\tfilters.push(`opacity(${alpha})`);\n\t}\n\n\tif (typeof style.dagTintHue === 'number' || typeof style.dagTintAmount === 'number') {\n\t\tconst hue = style.dagTintHue ?? 0;\n\t\tconst amt = Math.max(0, Math.min(100, style.dagTintAmount ?? 50));\n\t\tfilters.push(`sepia(${amt / 100}) hue-rotate(${hue}deg)`);\n\t}\n\n\tif (style.dagDuotone && elementId) {\n\t\tfilters.push(`url(#${getDuotoneFilterId(elementId)})`);\n\t}\n\n\treturn filters.length > 0 ? filters.join(' ') : undefined;\n}\n\n/**\n * Build the CSS `filter` value for the \"simple\" effect path of a shape/image\n * {@link ShapeStyle}: outer glow (`drop-shadow`), soft edges (`blur`),\n * standalone blur (`blur`), and effect-DAG adjustments.\n *\n * Mirrors the `filterParts` assembly in the React `getShapeVisualStyle`.\n * Returns `undefined` when no filter applies.\n *\n * @param style - The shape style.\n * @param elementId - Element ID, forwarded to the DAG duotone reference.\n */\nexport function getEffectFilterCss(\n\tstyle: ShapeStyle | undefined,\n\telementId?: string,\n): string | undefined {\n\tif (!style) {\n\t\treturn undefined;\n\t}\n\tconst parts: string[] = [];\n\n\t// Outer glow → drop-shadow\n\tif (style.glowColor && style.glowColor !== 'transparent' && style.glowRadius) {\n\t\tconst glowOpacity = typeof style.glowOpacity === 'number' ? style.glowOpacity : 0.75;\n\t\tconst glowRad = Math.round(Math.max(0, style.glowRadius));\n\t\tconst glowCol = colorWithOpacity(\n\t\t\tnormalizeHexColor(style.glowColor, DEFAULT_GLOW_COLOR),\n\t\t\tglowOpacity,\n\t\t);\n\t\tparts.push(`drop-shadow(0 0 ${glowRad}px ${glowCol})`);\n\t}\n\n\t// Soft edges → blur\n\tif (typeof style.softEdgeRadius === 'number' && style.softEdgeRadius > 0) {\n\t\tparts.push(`blur(${Math.round(style.softEdgeRadius)}px)`);\n\t}\n\n\t// Standalone blur effect (a:blur)\n\tif (typeof style.blurRadius === 'number' && style.blurRadius > 0) {\n\t\tparts.push(`blur(${Math.round(style.blurRadius)}px)`);\n\t}\n\n\t// Effect-DAG image adjustments\n\tconst dagFilter = getEffectDagCssFilter(style, elementId);\n\tif (dagFilter) {\n\t\tparts.push(dagFilter);\n\t}\n\n\treturn parts.length > 0 ? parts.join(' ') : undefined;\n}\n\n// ── Reflection (-webkit-box-reflect) ───────────────────────────────────────\n\n/**\n * Result of {@link getReflectionCss}: the `-webkit-box-reflect` value plus the\n * raw inputs (useful for tests / alternative renderers).\n *\n * Note: `-webkit-box-reflect` is Chromium/WebKit only — Firefox does not\n * support it. The React viewer accepts this limitation; a pseudo-element\n * fallback would be needed for full cross-browser fidelity.\n */\nexport interface ReflectionCss {\n\t/** The `-webkit-box-reflect` CSS value. */\n\twebkitBoxReflect: string;\n\tdistance: number;\n\tstartOpacity: number;\n\tendOpacity: number;\n\tfadeLength: number;\n\tblurRadius: number;\n}\n\n/**\n * Build the `-webkit-box-reflect` value for a reflection effect. `fadeLength`\n * is in px (the React caller derives it from `reflectionEndPosition × height`).\n */\nexport function buildReflectionCssValue(\n\tdistance: number,\n\tstartOpacity: number,\n\tendOpacity: number,\n\tfadeLength: number,\n\tblurRadius = 0,\n): string {\n\tconst effectiveFadeLength = fadeLength + blurRadius * 2;\n\tconst midOpacity = (startOpacity + endOpacity) / 2;\n\tconst midPoint = Math.round(effectiveFadeLength * 0.5);\n\n\tif (blurRadius > 0) {\n\t\treturn (\n\t\t\t`below ${Math.round(distance)}px linear-gradient(to bottom, ` +\n\t\t\t`rgba(255,255,255,${startOpacity}), ` +\n\t\t\t`rgba(255,255,255,${midOpacity}) ${midPoint}px, ` +\n\t\t\t`rgba(255,255,255,${endOpacity}) ${effectiveFadeLength}px)`\n\t\t);\n\t}\n\n\treturn `below ${Math.round(distance)}px linear-gradient(to bottom, rgba(255,255,255,${startOpacity}), rgba(255,255,255,${endOpacity}) ${fadeLength}px)`;\n}\n\n/**\n * Compute the reflection CSS for a {@link ShapeStyle} given the element height\n * (needed to convert `reflectionEndPosition` fraction → px fade length).\n * Mirrors the reflection block in the React `getShapeVisualStyle`.\n *\n * @returns A {@link ReflectionCss}, or `undefined` when no reflection applies.\n */\nexport function getReflectionCss(\n\tstyle: ShapeStyle | undefined,\n\telementHeight: number,\n): ReflectionCss | undefined {\n\tif (!style) {\n\t\treturn undefined;\n\t}\n\tconst hasReflection =\n\t\t(typeof style.reflectionStartOpacity === 'number' && style.reflectionStartOpacity > 0) ||\n\t\t(typeof style.reflectionDistance === 'number' && style.reflectionDistance > 0) ||\n\t\t(typeof style.reflectionBlurRadius === 'number' && style.reflectionBlurRadius > 0);\n\tif (!hasReflection) {\n\t\treturn undefined;\n\t}\n\n\tconst distance = style.reflectionDistance ?? 0;\n\tconst startOpacity =\n\t\ttypeof style.reflectionStartOpacity === 'number' ? style.reflectionStartOpacity : 0.5;\n\tconst endOpacity =\n\t\ttypeof style.reflectionEndOpacity === 'number' ? style.reflectionEndOpacity : 0;\n\tconst fadeLength =\n\t\ttypeof style.reflectionEndPosition === 'number'\n\t\t\t? Math.round(style.reflectionEndPosition * Math.max(elementHeight, 1))\n\t\t\t: 100;\n\tconst blurRadius =\n\t\ttypeof style.reflectionBlurRadius === 'number' ? style.reflectionBlurRadius : 0;\n\n\treturn {\n\t\twebkitBoxReflect: buildReflectionCssValue(\n\t\t\tdistance,\n\t\t\tstartOpacity,\n\t\t\tendOpacity,\n\t\t\tfadeLength,\n\t\t\tblurRadius,\n\t\t),\n\t\tdistance,\n\t\tstartOpacity,\n\t\tendOpacity,\n\t\tfadeLength,\n\t\tblurRadius,\n\t};\n}\n\n// ── DAG opacity & blend mode ───────────────────────────────────────────────\n\n/** Extract CSS `opacity` (0–1) from `dagAlphaModFix`, or `undefined`. */\nexport function getEffectDagOpacity(style: ShapeStyle | undefined): number | undefined {\n\tif (!style || typeof style.dagAlphaModFix !== 'number') {\n\t\treturn undefined;\n\t}\n\treturn clampUnitInterval(style.dagAlphaModFix / 100);\n}\n\n/** Map `dagFillOverlayBlend` to a CSS `mix-blend-mode`, or `undefined`. */\nexport function getEffectDagBlendMode(\n\tblend: ShapeStyle['dagFillOverlayBlend'],\n): string | undefined {\n\tswitch (blend) {\n\t\tcase 'mult':\n\t\t\treturn 'multiply';\n\t\tcase 'screen':\n\t\t\treturn 'screen';\n\t\tcase 'darken':\n\t\t\treturn 'darken';\n\t\tcase 'lighten':\n\t\t\treturn 'lighten';\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\n// ── High-fidelity duotone SVG <filter> markup (secondary path) ─────────────\n\n/** Stable SVG filter id for a DAG duotone effect on a given element. */\nexport function getDuotoneFilterId(elementId: string): string {\n\treturn `dag-duotone-${elementId}`;\n}\n\n/** Parse a hex colour to normalised 0–1 RGB components (invalid → 0). */\nfunction hexToRgbUnit(hex: string): { r: number; g: number; b: number } {\n\tconst clean = hex.replace('#', '');\n\tconst r = Number.parseInt(clean.substring(0, 2), 16) / 255;\n\tconst g = Number.parseInt(clean.substring(2, 4), 16) / 255;\n\tconst b = Number.parseInt(clean.substring(4, 6), 16) / 255;\n\treturn {\n\t\tr: Number.isFinite(r) ? r : 0,\n\t\tg: Number.isFinite(g) ? g : 0,\n\t\tb: Number.isFinite(b) ? b : 0,\n\t};\n}\n\n/**\n * A high-fidelity SVG `<filter>` definition: the filter `id`, a `filter:\n * url(#id)` reference for callers, and the `<filter>` markup to inject into a\n * `<defs>` (or a standalone hidden `<svg>`). Optional/secondary to the CSS\n * path.\n */\nexport interface SvgFilterDefinition {\n\t/** The `<filter>` element id. */\n\tid: string;\n\t/** A ready-to-use `filter: url(#id)` CSS reference. */\n\tcssReference: string;\n\t/** The `<filter>…</filter>` markup (no wrapping `<svg>`/`<defs>`). */\n\tfilterMarkup: string;\n}\n\n/**\n * Build the duotone `<filter>` markup (BT.709 grayscale → linear ramp between\n * two colours) for the high-fidelity DAG path. Returns `undefined` when the\n * style has no `dagDuotone`.\n *\n * Inject `filterMarkup` once into an SVG `<defs>` and apply `cssReference` as\n * the element's `filter` (or append it to {@link getEffectFilterCss}'s result).\n */\nexport function getDuotoneSvgFilter(\n\tstyle: ShapeStyle | undefined,\n\telementId: string,\n): SvgFilterDefinition | undefined {\n\tif (!style?.dagDuotone) {\n\t\treturn undefined;\n\t}\n\tconst id = getDuotoneFilterId(elementId);\n\tconst c1 = hexToRgbUnit(style.dagDuotone.color1);\n\tconst c2 = hexToRgbUnit(style.dagDuotone.color2);\n\n\tconst grayscaleMatrix = [\n\t\t0.2126, 0.7152, 0.0722, 0, 0, 0.2126, 0.7152, 0.0722, 0, 0, 0.2126, 0.7152, 0.0722, 0, 0, 0, 0,\n\t\t0, 1, 0,\n\t].join(' ');\n\n\tconst slopeR = c2.r - c1.r;\n\tconst slopeG = c2.g - c1.g;\n\tconst slopeB = c2.b - c1.b;\n\n\tconst filterMarkup = [\n\t\t`<filter id=\"${id}\" color-interpolation-filters=\"sRGB\">`,\n\t\t`<feColorMatrix type=\"matrix\" values=\"${grayscaleMatrix}\"/>`,\n\t\t`<feComponentTransfer>`,\n\t\t`<feFuncR type=\"linear\" slope=\"${slopeR}\" intercept=\"${c1.r}\"/>`,\n\t\t`<feFuncG type=\"linear\" slope=\"${slopeG}\" intercept=\"${c1.g}\"/>`,\n\t\t`<feFuncB type=\"linear\" slope=\"${slopeB}\" intercept=\"${c1.b}\"/>`,\n\t\t`</feComponentTransfer>`,\n\t\t`</filter>`,\n\t].join('');\n\n\treturn { id, cssReference: `url(#${id})`, filterMarkup };\n}\n\n// ── Aggregate convenience API ──────────────────────────────────────────────\n\n/**\n * The full set of CSS effect properties for a shape/image element. Every field\n * is optional and omitted when the corresponding effect is absent. Values are\n * plain CSS strings/numbers — framework-neutral; callers set them on\n * `[ngStyle]` maps (Angular) or equivalent.\n */\nexport interface ComputedEffectStyle {\n\t/** Combined outer/inner/multi-layer/glow `box-shadow`. */\n\tboxShadow?: string;\n\t/** Combined glow/soft-edge/blur/DAG `filter`. */\n\tfilter?: string;\n\t/** `-webkit-box-reflect` (Chromium/WebKit only). */\n\twebkitBoxReflect?: string;\n\t/** Overall `opacity` from `dagAlphaModFix`. */\n\topacity?: number;\n\t/** `mix-blend-mode` from `dagFillOverlayBlend`. */\n\tmixBlendMode?: string;\n}\n\n/**\n * Compute every CSS effect property for an element in one call. The element is\n * used to read `shapeStyle`, the element id (for DAG filter refs), and the\n * height (for reflection fade length). Image effects (`imageEffects`) are NOT\n * handled here — see {@link hasImageEffects}.\n *\n * @returns A {@link ComputedEffectStyle}; all-undefined when no effects apply.\n */\nexport function getComputedEffectStyle(\n\telement: PptxElement,\n\toptions: { includeGlowBoxShadow?: boolean } = {},\n): ComputedEffectStyle {\n\tconst style = 'shapeStyle' in element ? element.shapeStyle : undefined;\n\tconst result: ComputedEffectStyle = {};\n\tif (!style) {\n\t\treturn result;\n\t}\n\n\tconst boxShadow = getBoxShadowCss(style, { includeGlow: options.includeGlowBoxShadow });\n\tif (boxShadow) {\n\t\tresult.boxShadow = boxShadow;\n\t}\n\n\tconst filter = getEffectFilterCss(style, element.id);\n\tif (filter) {\n\t\tresult.filter = filter;\n\t}\n\n\tconst reflection = getReflectionCss(style, element.height);\n\tif (reflection) {\n\t\tresult.webkitBoxReflect = reflection.webkitBoxReflect;\n\t}\n\n\tconst opacity = getEffectDagOpacity(style);\n\tif (opacity !== undefined) {\n\t\tresult.opacity = opacity;\n\t}\n\n\tconst blend = getEffectDagBlendMode(style.dagFillOverlayBlend);\n\tif (blend) {\n\t\tresult.mixBlendMode = blend;\n\t}\n\n\treturn result;\n}\n\n/** Whether an element carries any (recolour/artistic) image effects. */\nexport function hasImageEffects(element: PptxElement): boolean {\n\treturn isImageLikeElement(element) && Boolean(element.imageEffects);\n}\n","/**\n * Gradient fill CSS builder — pure TypeScript, no Angular dependency.\n *\n * Ported from `packages/react/src/viewer/utils/color-gradient.ts`.\n *\n * Handles sanitization of gradient stop arrays and conversion to CSS gradient\n * strings. Gradient rendering follows ECMA-376 Part 1, §20.1.8.35 (gradFill)\n * and §20.1.8.49 (pathFill). The three path types — circle, rect, shape — each\n * have dedicated builders that approximate the OOXML behaviour as closely as\n * CSS radial-gradient permits.\n *\n * Pattern fill (`a:pattFill`) is intentionally NOT included here — it lives in\n * a separate module.\n */\nimport type { ShapeStyle } from 'pptx-viewer-core';\n\nimport { DEFAULT_FILL_COLOR } from './constants';\nimport { colorWithOpacity, normalizeHexColor } from './visual-effects';\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/** Clamp a numeric value to the [0, 1] range. */\nfunction clampUnitInterval(value: number): number {\n\treturn Math.min(1, Math.max(0, value));\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Validates, normalizes, and sorts an array of gradient stops.\n * Filters out invalid entries (missing color/position), clamps positions\n * to 0-100, normalizes colors, and sorts by ascending position.\n *\n * @param stops - Raw gradient stop array from shape style.\n * @returns A sanitized, sorted array of gradient stops.\n */\nexport function sanitizeGradientStops(\n\tstops: ShapeStyle['fillGradientStops'] | undefined,\n): NonNullable<ShapeStyle['fillGradientStops']> {\n\tif (!stops || stops.length === 0) {\n\t\treturn [];\n\t}\n\treturn stops\n\t\t.filter(\n\t\t\t(stop) =>\n\t\t\t\ttypeof stop?.color === 'string' &&\n\t\t\t\tString(stop.color).trim().length > 0 &&\n\t\t\t\ttypeof stop?.position === 'number' &&\n\t\t\t\tNumber.isFinite(stop.position),\n\t\t)\n\t\t.map((stop) => ({\n\t\t\tcolor: normalizeHexColor(String(stop.color), DEFAULT_FILL_COLOR),\n\t\t\tposition: Math.max(0, Math.min(100, stop.position)),\n\t\t\topacity:\n\t\t\t\ttypeof stop.opacity === 'number' && Number.isFinite(stop.opacity)\n\t\t\t\t\t? clampUnitInterval(stop.opacity)\n\t\t\t\t\t: undefined,\n\t\t}))\n\t\t.sort((left, right) => left.position - right.position);\n}\n\n/**\n * Converts an OOXML gradient angle (in 60000ths of a degree) to a CSS\n * linear-gradient angle in degrees. OOXML measures clockwise from the\n * left-to-right axis; CSS `linear-gradient` measures clockwise from \"to top\"\n * (i.e. 0deg = bottom-to-top, 90deg = left-to-right).\n *\n * Conversion: `cssAngle = ooxmlAngle / 60000 + 90` (then normalised to 0-360).\n *\n * If the input is already in plain degrees (typically from the parser, which\n * pre-converts), this function still normalises and rounds the value.\n *\n * @param ooxmlAngle - Angle in 60000ths of a degree, or plain degrees if\n * already converted by the parser.\n * @param alreadyDegrees - When true, the input is treated as plain degrees.\n * @returns A CSS-compatible angle in degrees (0-360), rounded to 1 decimal.\n */\nexport function convertOoxmlAngleToCss(ooxmlAngle: number, alreadyDegrees = true): number {\n\tconst deg = alreadyDegrees ? ooxmlAngle : ooxmlAngle / 60000;\n\t// Normalise to 0-360 range\n\treturn ((deg % 360) + 360) % 360;\n}\n\n/**\n * Converts a single gradient stop to a CSS gradient color-stop string.\n * Applies opacity via `rgba()` if specified. Uses fractional percentage\n * positioning (1 decimal place) for higher fidelity when stops are close\n * together.\n *\n * @param stop - A gradient stop with color, position (0-100), and optional opacity.\n * @returns A CSS string like `\"#FF0000 50%\"` or `\"rgba(255,0,0,0.5) 33.3%\"`.\n */\nexport function toCssGradientStop(stop: {\n\tcolor: string;\n\tposition: number;\n\topacity?: number;\n}): string {\n\tconst color =\n\t\ttypeof stop.opacity === 'number' ? colorWithOpacity(stop.color, stop.opacity) : stop.color;\n\tconst pos = Math.max(0, Math.min(100, stop.position));\n\t// Use integer percentage when it would be exact; use 1 decimal otherwise\n\t// to preserve stop precision for multi-stop gradients.\n\tconst posStr = pos === Math.round(pos) ? `${pos}%` : `${pos.toFixed(1)}%`;\n\treturn `${color} ${posStr}`;\n}\n\n/**\n * Computes the gradient center position (as percentages) from a fillToRect\n * and an optional focalPoint offset. The fillToRect defines an inner\n * rectangle; the gradient center defaults to the center of that rectangle.\n * When a focalPoint is also provided, it offsets the center within the\n * fillToRect bounds.\n *\n * @param fillToRect - LTRB fractions (0-1) defining the inner rectangle.\n * @param focalPoint - Optional focal point offset (0-1 fractions).\n * @returns `{ cx, cy }` as percentages (0-100).\n */\nexport function computeGradientCenter(\n\tfillToRect?: ShapeStyle['fillGradientFillToRect'],\n\tfocalPoint?: ShapeStyle['fillGradientFocalPoint'],\n): { cx: number; cy: number } {\n\tif (fillToRect) {\n\t\tconst { l, t, r, b } = fillToRect;\n\t\t// Base center is midpoint of the inner rectangle\n\t\tlet cx = ((l + (1 - r)) / 2) * 100;\n\t\tlet cy = ((t + (1 - b)) / 2) * 100;\n\n\t\t// When a focal point is also provided, blend it into the center.\n\t\t// The focal point (0-1) acts as a position within the shape, so we\n\t\t// interpolate between the fillToRect center and the focal point.\n\t\tif (focalPoint) {\n\t\t\tconst fpX = focalPoint.x * 100;\n\t\t\tconst fpY = focalPoint.y * 100;\n\t\t\t// Use the focal point to shift the center — average the two\n\t\t\t// to avoid extreme shifts while still honouring the offset.\n\t\t\tcx = (cx + fpX) / 2;\n\t\t\tcy = (cy + fpY) / 2;\n\t\t}\n\n\t\treturn { cx, cy };\n\t}\n\n\t// No fillToRect: use focal point directly, or default to center (50%)\n\tif (focalPoint) {\n\t\treturn { cx: focalPoint.x * 100, cy: focalPoint.y * 100 };\n\t}\n\treturn { cx: 50, cy: 50 };\n}\n\n/**\n * Builds a CSS radial-gradient for `path=\"circle\"` gradients.\n *\n * OOXML `path=\"circle\"` defines a circular radial gradient. The gradient\n * radiates as a circle from the focal point. When a fillToRect is provided,\n * the gradient center is derived from the fillToRect center, optionally\n * offset by the focalPoint. The circle radius is sized to reach the\n * farthest edge of the shape.\n *\n * @param stops - Sanitized gradient stops.\n * @param focalPoint - Optional focal point (0-1 fractions).\n * @param fillToRect - Optional fillToRect LTRB insets (0-1 fractions).\n * @returns A CSS `radial-gradient(circle ...)` string.\n */\nexport function buildCirclePathGradient(\n\tstops: NonNullable<ShapeStyle['fillGradientStops']>,\n\tfocalPoint?: ShapeStyle['fillGradientFocalPoint'],\n\tfillToRect?: ShapeStyle['fillGradientFillToRect'],\n): string {\n\tconst stopStr = stops.map(toCssGradientStop).join(', ');\n\tconst { cx, cy } = computeGradientCenter(fillToRect, focalPoint);\n\n\t// Format position — use 'center' only when both axes are exactly 50%\n\t// and no explicit positioning was requested\n\tconst posX =\n\t\tMath.round(cx) === 50 && !focalPoint && !fillToRect ? 'center' : `${Math.round(cx)}%`;\n\tconst posY =\n\t\tMath.round(cy) === 50 && !focalPoint && !fillToRect ? 'center' : `${Math.round(cy)}%`;\n\n\tif (fillToRect) {\n\t\t// Compute the radius as the farthest distance from center to shape edge\n\t\tconst radius = Math.max(cx, 100 - cx, cy, 100 - cy);\n\t\treturn `radial-gradient(circle ${Math.round(radius)}% at ${posX} ${posY}, ${stopStr})`;\n\t}\n\n\treturn `radial-gradient(circle at ${posX} ${posY}, ${stopStr})`;\n}\n\n/**\n * Builds a CSS radial-gradient for `path=\"rect\"` gradients.\n *\n * OOXML `path=\"rect\"` defines a rectangular gradient that radiates from the\n * fillToRect rectangle outward to the shape edges. Approximated with a CSS\n * `radial-gradient(ellipse ...)` where the ellipse size and center are\n * derived from the fillToRect LTRB inset values.\n *\n * The fillToRect values (l, t, r, b) define the inner rectangle:\n * - left edge at `l` fraction from left\n * - top edge at `t` fraction from top\n * - right edge at `1-r` fraction from left\n * - bottom edge at `1-b` fraction from top\n */\nexport function buildRectPathGradient(\n\tstops: NonNullable<ShapeStyle['fillGradientStops']>,\n\tfocalPoint?: ShapeStyle['fillGradientFocalPoint'],\n\tfillToRect?: ShapeStyle['fillGradientFillToRect'],\n): string {\n\tconst stopStr = stops.map(toCssGradientStop).join(', ');\n\n\tif (fillToRect) {\n\t\tconst { l, t, r, b } = fillToRect;\n\t\tconst { cx, cy } = computeGradientCenter(fillToRect, focalPoint);\n\n\t\t// The gradient extends from the fillToRect edges to the shape boundary.\n\t\t// The ellipse semi-axis = max distance from center to shape edge.\n\t\tconst semiX = Math.max(cx, 100 - cx);\n\t\tconst semiY = Math.max(cy, 100 - cy);\n\n\t\tconst posX = `${Math.round(cx)}%`;\n\t\tconst posY = `${Math.round(cy)}%`;\n\n\t\t// When the fillToRect defines a non-degenerate inner rectangle, compute\n\t\t// the inner rectangle's half-dimensions so we can size the ellipse to\n\t\t// match more closely. This produces a better rectangular gradient feel.\n\t\tconst innerHalfW = ((1 - l - r) / 2) * 100;\n\t\tconst innerHalfH = ((1 - t - b) / 2) * 100;\n\n\t\t// If the inner rect has meaningful dimensions and is asymmetric relative\n\t\t// to the shape, use its aspect ratio to scale the ellipse radii.\n\t\tif (innerHalfW > 0.5 && innerHalfH > 0.5 && Math.abs(semiX - semiY) > 1) {\n\t\t\t// Scale radii proportionally to inner rectangle aspect ratio\n\t\t\tconst aspect = innerHalfW / innerHalfH;\n\t\t\tconst adjustedSemiX = Math.round(semiY * aspect);\n\t\t\tconst adjustedSemiY = Math.round(semiY);\n\t\t\treturn `radial-gradient(${adjustedSemiX}% ${adjustedSemiY}% at ${posX} ${posY}, ${stopStr})`;\n\t\t}\n\n\t\treturn `radial-gradient(${Math.round(semiX)}% ${Math.round(semiY)}% at ${posX} ${posY}, ${stopStr})`;\n\t}\n\n\t// Fallback: use focal point if available, otherwise center\n\tconst posX = focalPoint ? `${Math.round(focalPoint.x * 100)}%` : 'center';\n\tconst posY = focalPoint ? `${Math.round(focalPoint.y * 100)}%` : 'center';\n\treturn `radial-gradient(ellipse at ${posX} ${posY}, ${stopStr})`;\n}\n\n/**\n * Builds a CSS gradient approximation for `path=\"shape\"` gradients.\n *\n * OOXML `path=\"shape\"` defines a gradient that follows the shape boundary,\n * radiating inward from the shape edges. This is impossible to replicate\n * perfectly with CSS, so we approximate it with an elliptical radial\n * gradient sized to the bounding box.\n *\n * The approach:\n * 1. When fillToRect is provided, the gradient center is the center of the\n * inner rectangle (optionally offset by focalPoint). The ellipse radii\n * are set to the maximum distance from center to each shape edge, so\n * the gradient fully covers the bounding box.\n * 2. When the fillToRect defines a non-square inner region, explicit\n * percentage sizing preserves the aspect ratio, better approximating\n * a gradient that follows the shape boundary.\n * 3. Without fillToRect, `farthest-side` provides a reasonable default\n * that adapts to the element's aspect ratio.\n */\nexport function buildShapePathGradient(\n\tstops: NonNullable<ShapeStyle['fillGradientStops']>,\n\tfocalPoint?: ShapeStyle['fillGradientFocalPoint'],\n\tfillToRect?: ShapeStyle['fillGradientFillToRect'],\n): string {\n\tconst stopStr = stops.map(toCssGradientStop).join(', ');\n\n\tif (fillToRect) {\n\t\tconst { l, t, r, b } = fillToRect;\n\t\tconst { cx, cy } = computeGradientCenter(fillToRect, focalPoint);\n\n\t\tconst posX = `${Math.round(cx)}%`;\n\t\tconst posY = `${Math.round(cy)}%`;\n\n\t\t// Compute the ellipse radii that cover the full bounding box from the\n\t\t// computed center. This ensures the shape-conforming gradient extends\n\t\t// all the way to the edges.\n\t\tconst semiX = Math.max(cx, 100 - cx);\n\t\tconst semiY = Math.max(cy, 100 - cy);\n\n\t\t// Compute the inner-rect half-widths as percentages. When both are\n\t\t// positive and different, use explicit sizing to preserve the rectangle's\n\t\t// aspect ratio — this more closely approximates \"follows the shape edge\".\n\t\tconst innerHalfW = ((1 - l - r) / 2) * 100;\n\t\tconst innerHalfH = ((1 - t - b) / 2) * 100;\n\n\t\tif (innerHalfW > 0.5 && innerHalfH > 0.5 && Math.abs(innerHalfW - innerHalfH) > 1) {\n\t\t\t// Scale the bounding-box radii proportionally to the inner rectangle's\n\t\t\t// aspect ratio for a shape-conforming feel.\n\t\t\tconst aspect = innerHalfW / innerHalfH;\n\t\t\tconst adjustedSemiX = Math.round(Math.max(semiX, semiY * aspect));\n\t\t\tconst adjustedSemiY = Math.round(Math.max(semiY, semiX / aspect));\n\t\t\treturn `radial-gradient(${adjustedSemiX}% ${adjustedSemiY}% at ${posX} ${posY}, ${stopStr})`;\n\t\t}\n\n\t\t// Degenerate inner rect (zero area) or symmetric: use bounding-box radii\n\t\tif (semiX > 0.5 || semiY > 0.5) {\n\t\t\treturn `radial-gradient(${Math.round(semiX)}% ${Math.round(semiY)}% at ${posX} ${posY}, ${stopStr})`;\n\t\t}\n\n\t\t// Symmetric or nearly-symmetric: farthest-side is a good fit\n\t\treturn `radial-gradient(farthest-side at ${posX} ${posY}, ${stopStr})`;\n\t}\n\n\tconst { cx, cy } = computeGradientCenter(undefined, focalPoint);\n\tconst posX = focalPoint ? `${Math.round(cx)}%` : 'center';\n\tconst posY = focalPoint ? `${Math.round(cy)}%` : 'center';\n\treturn `radial-gradient(farthest-side at ${posX} ${posY}, ${stopStr})`;\n}\n\n/**\n * Builds a complete CSS `linear-gradient()` or `radial-gradient()` string\n * from a ShapeStyle's gradient properties.\n *\n * For radial gradients, the rendering varies by `fillGradientPathType`:\n * - `\"circle\"` (default): Simple circular radial gradient at the focal point.\n * - `\"rect\"`: Elliptical radial gradient sized from the fillToRect rectangle,\n * approximating the OOXML rectangular path gradient.\n * - `\"shape\"`: Radial gradient using farthest-side sizing, approximating a\n * gradient that follows the shape boundary.\n *\n * Falls back to `style.fillGradient` if no valid stops are present.\n *\n * @param style - The shape style containing gradient configuration.\n * @returns A CSS gradient string, or `undefined` if not a gradient fill.\n */\nexport function buildCssGradientFromShapeStyle(style: ShapeStyle | undefined): string | undefined {\n\tif (!style || style.fillMode !== 'gradient') {\n\t\treturn undefined;\n\t}\n\n\tconst stops = sanitizeGradientStops(style.fillGradientStops);\n\tif (stops.length === 0) {\n\t\treturn style.fillGradient;\n\t}\n\n\tconst gradientType = style.fillGradientType || 'linear';\n\tif (gradientType === 'radial') {\n\t\tconst pathType = style.fillGradientPathType || 'circle';\n\t\tconst fp = style.fillGradientFocalPoint;\n\t\tconst ftr = style.fillGradientFillToRect;\n\n\t\tif (pathType === 'rect') {\n\t\t\treturn buildRectPathGradient(stops, fp, ftr);\n\t\t}\n\n\t\tif (pathType === 'shape') {\n\t\t\treturn buildShapePathGradient(stops, fp, ftr);\n\t\t}\n\n\t\t// Default: circle path type\n\t\treturn buildCirclePathGradient(stops, fp, ftr);\n\t}\n\n\tconst normalizedAngle =\n\t\ttypeof style.fillGradientAngle === 'number' && Number.isFinite(style.fillGradientAngle)\n\t\t\t? style.fillGradientAngle\n\t\t\t: 90;\n\treturn `linear-gradient(${Math.round(normalizedAngle)}deg, ${stops.map(toCssGradientStop).join(', ')})`;\n}\n","/**\n * SVG pattern generation for OOXML pattern fill presets.\n *\n * Each preset maps to a tiled inline SVG data URI that closely approximates\n * the corresponding ECMA-376 pattern (ST_PresetPatternVal). Patterns use\n * two colours: foreground (`fg`) drawn on top of a background (`bg`) fill.\n *\n * Tile sizes are kept small (4-16 px) for performance when used as CSS\n * `background-image` data URIs.\n *\n * Reference: ECMA-376 Part 1, section 20.1.10.33 (ST_PresetPatternVal)\n *\n * Ported from `packages/react/src/viewer/utils/color-patterns.ts`.\n * Pure TypeScript — no Angular, Vue, or React runtime imports.\n */\nimport type { ShapeStyle } from 'pptx-viewer-core';\n\nimport { normalizeHexColor } from './visual-effects';\n\n// ---------------------------------------------------------------------------\n// Internal SVG helpers\n// ---------------------------------------------------------------------------\n\nconst XMLNS = 'http://www.w3.org/2000/svg';\n\nfunction svg(w: number, h: number, inner: string): string {\n\treturn `<svg xmlns=\"${XMLNS}\" width=\"${w}\" height=\"${h}\">${inner}</svg>`;\n}\n\nfunction rect(x: number, y: number, w: number, h: number, fill: string): string {\n\treturn `<rect x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${h}\" fill=\"${fill}\"/>`;\n}\n\nfunction bgRect(w: number, h: number, bg: string): string {\n\treturn rect(0, 0, w, h, bg);\n}\n\nfunction line(\n\tx1: number,\n\ty1: number,\n\tx2: number,\n\ty2: number,\n\tstroke: string,\n\tsw: number,\n\textra: string = '',\n): string {\n\treturn `<line x1=\"${x1}\" y1=\"${y1}\" x2=\"${x2}\" y2=\"${y2}\" stroke=\"${stroke}\" stroke-width=\"${sw}\"${extra}/>`;\n}\n\nfunction circle(cx: number, cy: number, r: number, fill: string): string {\n\treturn `<circle cx=\"${cx}\" cy=\"${cy}\" r=\"${r}\" fill=\"${fill}\"/>`;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Generate an inline SVG string for an OOXML preset pattern fill.\n *\n * @param preset - DrawingML `ST_PresetPatternVal` string (e.g. `\"pct5\"`, `\"horz\"`).\n * @param fgColor - Foreground hex colour (e.g. `\"#000000\"`).\n * @param bgColor - Background hex colour (e.g. `\"#ffffff\"`).\n * @returns An SVG string for use as a tiled `background-image`, or `undefined`\n * when the preset is not implemented.\n */\nexport function getPatternSvg(\n\tpreset: string,\n\tfgColor: string,\n\tbgColor: string,\n): string | undefined {\n\tconst s = 8; // default pattern tile size\n\tconst fg = fgColor;\n\tconst bg = bgColor;\n\tconst bg8 = bgRect(s, s, bg);\n\n\tswitch (preset) {\n\t\t// ── Percentage fills ──────────────────────────────────────────────\n\t\tcase 'pct5':\n\t\t\treturn svg(s, s, bg8 + rect(0, 0, 1, 1, fg));\n\t\tcase 'pct10':\n\t\t\treturn svg(s, s, bg8 + rect(0, 0, 1, 1, fg) + rect(4, 4, 1, 1, fg));\n\t\tcase 'pct20':\n\t\t\treturn svg(4, 4, bgRect(4, 4, bg) + rect(0, 0, 1, 1, fg) + rect(2, 2, 1, 1, fg));\n\t\tcase 'pct25':\n\t\t\treturn svg(\n\t\t\t\t4,\n\t\t\t\t4,\n\t\t\t\tbgRect(4, 4, bg) +\n\t\t\t\t\trect(0, 0, 1, 1, fg) +\n\t\t\t\t\trect(2, 0, 1, 1, fg) +\n\t\t\t\t\trect(1, 2, 1, 1, fg) +\n\t\t\t\t\trect(3, 2, 1, 1, fg),\n\t\t\t);\n\t\tcase 'pct30':\n\t\t\treturn svg(\n\t\t\t\t4,\n\t\t\t\t4,\n\t\t\t\tbgRect(4, 4, bg) +\n\t\t\t\t\trect(0, 0, 1, 1, fg) +\n\t\t\t\t\trect(2, 0, 1, 1, fg) +\n\t\t\t\t\trect(1, 1, 1, 1, fg) +\n\t\t\t\t\trect(3, 1, 1, 1, fg) +\n\t\t\t\t\trect(0, 2, 1, 1, fg) +\n\t\t\t\t\trect(2, 2, 1, 1, fg),\n\t\t\t);\n\t\tcase 'pct40':\n\t\t\treturn svg(\n\t\t\t\t4,\n\t\t\t\t4,\n\t\t\t\tbgRect(4, 4, bg) +\n\t\t\t\t\trect(0, 0, 2, 1, fg) +\n\t\t\t\t\trect(1, 1, 1, 1, fg) +\n\t\t\t\t\trect(3, 1, 1, 1, fg) +\n\t\t\t\t\trect(0, 2, 2, 1, fg) +\n\t\t\t\t\trect(1, 3, 1, 1, fg) +\n\t\t\t\t\trect(3, 3, 1, 1, fg),\n\t\t\t);\n\t\tcase 'pct50':\n\t\t\treturn svg(2, 2, bgRect(2, 2, bg) + rect(0, 0, 1, 1, fg) + rect(1, 1, 1, 1, fg));\n\t\tcase 'pct60':\n\t\t\treturn svg(4, 4, rect(0, 0, 4, 4, fg) + rect(0, 0, 2, 1, bg) + rect(1, 2, 2, 1, bg));\n\t\tcase 'pct70':\n\t\t\treturn svg(\n\t\t\t\t4,\n\t\t\t\t4,\n\t\t\t\trect(0, 0, 4, 4, fg) +\n\t\t\t\t\trect(0, 0, 1, 1, bg) +\n\t\t\t\t\trect(2, 0, 1, 1, bg) +\n\t\t\t\t\trect(1, 2, 1, 1, bg) +\n\t\t\t\t\trect(3, 2, 1, 1, bg),\n\t\t\t);\n\t\tcase 'pct75':\n\t\t\treturn svg(4, 4, rect(0, 0, 4, 4, fg) + rect(0, 0, 1, 1, bg) + rect(2, 2, 1, 1, bg));\n\t\tcase 'pct80':\n\t\t\treturn svg(4, 4, rect(0, 0, 4, 4, fg) + rect(0, 0, 1, 1, bg));\n\t\tcase 'pct90':\n\t\t\treturn svg(s, s, rect(0, 0, s, s, fg) + rect(0, 0, 1, 1, bg));\n\n\t\t// ── Horizontal lines ─────────────────────────────────────────────\n\t\tcase 'horz':\n\t\t\treturn svg(s, s, bg8 + rect(0, 3, s, 2, fg));\n\t\tcase 'ltHorz':\n\t\t\treturn svg(s, s, bg8 + rect(0, 0, s, 1, fg));\n\t\tcase 'dkHorz':\n\t\t\treturn svg(s, s, bg8 + rect(0, 0, s, 4, fg));\n\t\tcase 'narHorz':\n\t\t\treturn svg(s, 4, bgRect(s, 4, bg) + rect(0, 0, s, 1, fg) + rect(0, 2, s, 1, fg));\n\t\tcase 'wdHorz':\n\t\t\treturn svg(s, 12, bgRect(s, 12, bg) + rect(0, 0, s, 2, fg));\n\n\t\t// ── Vertical lines ───────────────────────────────────────────────\n\t\tcase 'vert':\n\t\t\treturn svg(s, s, bg8 + rect(3, 0, 2, s, fg));\n\t\tcase 'ltVert':\n\t\t\treturn svg(s, s, bg8 + rect(0, 0, 1, s, fg));\n\t\tcase 'dkVert':\n\t\t\treturn svg(s, s, bg8 + rect(0, 0, 4, s, fg));\n\t\tcase 'narVert':\n\t\t\treturn svg(4, s, bgRect(4, s, bg) + rect(0, 0, 1, s, fg) + rect(2, 0, 1, s, fg));\n\t\tcase 'wdVert':\n\t\t\treturn svg(12, s, bgRect(12, s, bg) + rect(0, 0, 2, s, fg));\n\n\t\t// ── Dash lines ───────────────────────────────────────────────────\n\t\tcase 'dashHorz':\n\t\t\treturn svg(s, 4, bgRect(s, 4, bg) + rect(0, 0, 4, 1, fg));\n\t\tcase 'dashVert':\n\t\t\treturn svg(4, s, bgRect(4, s, bg) + rect(0, 0, 1, 4, fg));\n\n\t\t// ── Cross / grid ─────────────────────────────────────────────────\n\t\tcase 'cross':\n\t\t\treturn svg(s, s, bg8 + rect(3, 0, 2, s, fg) + rect(0, 3, s, 2, fg));\n\n\t\t// ── Diagonal lines (down) ────────────────────────────────────────\n\t\tcase 'dnDiag':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbg8 + line(0, 0, s, s, fg, 2) + line(-s, 0, 0, s, fg, 2) + line(s, 0, s * 2, s, fg, 2),\n\t\t\t);\n\t\tcase 'ltDnDiag':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbg8 + line(0, 0, s, s, fg, 1) + line(-s, 0, 0, s, fg, 1) + line(s, 0, s * 2, s, fg, 1),\n\t\t\t);\n\t\tcase 'dkDnDiag':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbg8 + line(0, 0, s, s, fg, 3) + line(-s, 0, 0, s, fg, 3) + line(s, 0, s * 2, s, fg, 3),\n\t\t\t);\n\t\tcase 'wdDnDiag':\n\t\t\treturn svg(\n\t\t\t\t12,\n\t\t\t\t12,\n\t\t\t\tbgRect(12, 12, bg) +\n\t\t\t\t\tline(0, 0, 12, 12, fg, 4) +\n\t\t\t\t\tline(-12, 0, 0, 12, fg, 4) +\n\t\t\t\t\tline(12, 0, 24, 12, fg, 4),\n\t\t\t);\n\t\tcase 'dashDnDiag':\n\t\t\treturn svg(s, s, bg8 + line(0, 0, s, s, fg, 1, ' stroke-dasharray=\"4,4\"'));\n\n\t\t// ── Diagonal lines (up) ──────────────────────────────────────────\n\t\tcase 'upDiag':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbg8 + line(0, s, s, 0, fg, 2) + line(-s, s, 0, 0, fg, 2) + line(s, s, s * 2, 0, fg, 2),\n\t\t\t);\n\t\tcase 'ltUpDiag':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbg8 + line(0, s, s, 0, fg, 1) + line(-s, s, 0, 0, fg, 1) + line(s, s, s * 2, 0, fg, 1),\n\t\t\t);\n\t\tcase 'dkUpDiag':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbg8 + line(0, s, s, 0, fg, 3) + line(-s, s, 0, 0, fg, 3) + line(s, s, s * 2, 0, fg, 3),\n\t\t\t);\n\t\tcase 'wdUpDiag':\n\t\t\treturn svg(\n\t\t\t\t12,\n\t\t\t\t12,\n\t\t\t\tbgRect(12, 12, bg) +\n\t\t\t\t\tline(0, 12, 12, 0, fg, 4) +\n\t\t\t\t\tline(-12, 12, 0, 0, fg, 4) +\n\t\t\t\t\tline(12, 12, 24, 0, fg, 4),\n\t\t\t);\n\t\tcase 'dashUpDiag':\n\t\t\treturn svg(s, s, bg8 + line(0, s, s, 0, fg, 1, ' stroke-dasharray=\"4,4\"'));\n\n\t\t// ── Diagonal cross ───────────────────────────────────────────────\n\t\tcase 'diagCross':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbg8 +\n\t\t\t\t\tline(0, 0, s, s, fg, 1) +\n\t\t\t\t\tline(-s, 0, 0, s, fg, 1) +\n\t\t\t\t\tline(s, 0, s * 2, s, fg, 1) +\n\t\t\t\t\tline(0, s, s, 0, fg, 1) +\n\t\t\t\t\tline(-s, s, 0, 0, fg, 1) +\n\t\t\t\t\tline(s, s, s * 2, 0, fg, 1),\n\t\t\t);\n\n\t\t// ── Checkerboard ─────────────────────────────────────────────────\n\t\tcase 'smCheck':\n\t\t\treturn svg(4, 4, bgRect(4, 4, bg) + rect(0, 0, 2, 2, fg) + rect(2, 2, 2, 2, fg));\n\t\tcase 'lgCheck':\n\t\t\treturn svg(s, s, bg8 + rect(0, 0, 4, 4, fg) + rect(4, 4, 4, 4, fg));\n\n\t\t// ── Grids ────────────────────────────────────────────────────────\n\t\tcase 'smGrid':\n\t\t\treturn svg(s, s, bg8 + rect(0, 0, s, 1, fg) + rect(0, 0, 1, s, fg));\n\t\tcase 'lgGrid':\n\t\t\treturn svg(16, 16, bgRect(16, 16, bg) + rect(0, 0, 16, 1, fg) + rect(0, 0, 1, 16, fg));\n\t\tcase 'dotGrid':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbg8 +\n\t\t\t\t\tcircle(0, 0, 0.5, fg) +\n\t\t\t\t\tcircle(4, 0, 0.5, fg) +\n\t\t\t\t\tcircle(0, 4, 0.5, fg) +\n\t\t\t\t\tcircle(4, 4, 0.5, fg) +\n\t\t\t\t\trect(0, 0, s, 0.5, fg) +\n\t\t\t\t\trect(0, 0, 0.5, s, fg),\n\t\t\t);\n\n\t\t// ── Confetti ─────────────────────────────────────────────────────\n\t\tcase 'smConfetti':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbg8 +\n\t\t\t\t\trect(1, 0, 1, 1, fg) +\n\t\t\t\t\trect(5, 1, 1, 1, fg) +\n\t\t\t\t\trect(3, 3, 1, 1, fg) +\n\t\t\t\t\trect(7, 2, 1, 1, fg) +\n\t\t\t\t\trect(0, 5, 1, 1, fg) +\n\t\t\t\t\trect(4, 6, 1, 1, fg) +\n\t\t\t\t\trect(2, 7, 1, 1, fg) +\n\t\t\t\t\trect(6, 5, 1, 1, fg),\n\t\t\t);\n\t\tcase 'lgConfetti':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbg8 +\n\t\t\t\t\trect(0, 0, 2, 2, fg) +\n\t\t\t\t\trect(5, 1, 2, 2, fg) +\n\t\t\t\t\trect(2, 4, 2, 2, fg) +\n\t\t\t\t\trect(6, 5, 2, 2, fg),\n\t\t\t);\n\n\t\t// ── Brick ────────────────────────────────────────────────────────\n\t\tcase 'horzBrick':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbg8 +\n\t\t\t\t\trect(0, 0, s, 1, fg) +\n\t\t\t\t\trect(0, 0, 1, 4, fg) +\n\t\t\t\t\trect(0, 4, s, 1, fg) +\n\t\t\t\t\trect(4, 4, 1, 4, fg),\n\t\t\t);\n\t\tcase 'diagBrick':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbg8 + line(0, 4, 4, 0, fg, 1) + line(4, s, s, 4, fg, 1) + line(0, s, s, 0, fg, 1),\n\t\t\t);\n\n\t\t// ── Diamond ──────────────────────────────────────────────────────\n\t\tcase 'solidDmnd':\n\t\t\treturn svg(s, s, `${bg8}<polygon points=\"4,0 8,4 4,8 0,4\" fill=\"${fg}\"/>`);\n\t\tcase 'openDmnd':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbg8 +\n\t\t\t\t\tline(4, 0, s, 4, fg, 1) +\n\t\t\t\t\tline(s, 4, 4, s, fg, 1) +\n\t\t\t\t\tline(4, s, 0, 4, fg, 1) +\n\t\t\t\t\tline(0, 4, 4, 0, fg, 1),\n\t\t\t);\n\t\tcase 'dotDmnd':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbg8 +\n\t\t\t\t\tcircle(4, 0, 0.75, fg) +\n\t\t\t\t\tcircle(s, 4, 0.75, fg) +\n\t\t\t\t\tcircle(4, s, 0.75, fg) +\n\t\t\t\t\tcircle(0, 4, 0.75, fg) +\n\t\t\t\t\tcircle(4, 4, 0.75, fg),\n\t\t\t);\n\n\t\t// ── Plaid ────────────────────────────────────────────────────────\n\t\tcase 'plaid':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbg8 +\n\t\t\t\t\trect(0, 0, 4, 4, fg) +\n\t\t\t\t\trect(0, 0, s, 1, fg) +\n\t\t\t\t\trect(0, 2, s, 1, fg) +\n\t\t\t\t\trect(0, 0, 1, s, fg) +\n\t\t\t\t\trect(2, 0, 1, s, fg),\n\t\t\t);\n\n\t\t// ── Sphere ───────────────────────────────────────────────────────\n\t\t// Uses a radial gradient to simulate the 3D sphere highlight effect.\n\t\tcase 'sphere': {\n\t\t\tconst defs =\n\t\t\t\t`<defs><radialGradient id=\"sph\" cx=\"35%\" cy=\"35%\" r=\"60%\">` +\n\t\t\t\t`<stop offset=\"0%\" stop-color=\"${bg}\" stop-opacity=\"0.8\"/>` +\n\t\t\t\t`<stop offset=\"100%\" stop-color=\"${fg}\" stop-opacity=\"1\"/>` +\n\t\t\t\t`</radialGradient></defs>`;\n\t\t\treturn svg(s, s, `${bg8}${defs}<circle cx=\"4\" cy=\"4\" r=\"3.5\" fill=\"url(#sph)\"/>`);\n\t\t}\n\n\t\t// ── Weave ────────────────────────────────────────────────────────\n\t\t// Approximates a basket-weave pattern with interlacing diagonal stripes.\n\t\tcase 'weave':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbg8 +\n\t\t\t\t\tline(0, 0, 4, 4, fg, 1.5) +\n\t\t\t\t\tline(4, 4, 0, s, fg, 1.5) +\n\t\t\t\t\tline(s, 0, 4, 4, fg, 1.5) +\n\t\t\t\t\tline(4, 4, s, s, fg, 1.5) +\n\t\t\t\t\tline(4, 0, s, 4, fg, 1.5) +\n\t\t\t\t\tline(0, 4, 4, s, fg, 1.5),\n\t\t\t);\n\n\t\t// ── Divot ────────────────────────────────────────────────────────\n\t\t// Small plus/cross marks scattered across the tile.\n\t\tcase 'divot':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbg8 +\n\t\t\t\t\tline(2, 1, 2, 3, fg, 1) +\n\t\t\t\t\tline(1, 2, 3, 2, fg, 1) +\n\t\t\t\t\tline(6, 5, 6, 7, fg, 1) +\n\t\t\t\t\tline(5, 6, 7, 6, fg, 1),\n\t\t\t);\n\n\t\t// ── Shingle ──────────────────────────────────────────────────────\n\t\t// Overlapping diagonal roof-tile pattern with a horizontal baseline.\n\t\tcase 'shingle':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\tbg8 + line(0, 0, s, s, fg, 1) + line(0, s, 4, 4, fg, 1) + rect(0, 7, s, 1, fg),\n\t\t\t);\n\n\t\t// ── Wave ─────────────────────────────────────────────────────────\n\t\t// Repeating sine-wave curves filling the tile vertically.\n\t\tcase 'wave':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\t`${bg8}` +\n\t\t\t\t\t`<path d=\"M0,2 Q2,0 4,2 Q6,4 8,2\" stroke=\"${fg}\" stroke-width=\"1\" fill=\"none\"/>` +\n\t\t\t\t\t`<path d=\"M0,6 Q2,4 4,6 Q6,8 8,6\" stroke=\"${fg}\" stroke-width=\"1\" fill=\"none\"/>`,\n\t\t\t);\n\n\t\t// ── Trellis ──────────────────────────────────────────────────────\n\t\tcase 'trellis':\n\t\t\treturn svg(\n\t\t\t\t4,\n\t\t\t\t4,\n\t\t\t\tbgRect(4, 4, bg) +\n\t\t\t\t\trect(0, 0, 4, 1, fg) +\n\t\t\t\t\trect(0, 2, 4, 1, fg) +\n\t\t\t\t\trect(0, 0, 1, 4, fg) +\n\t\t\t\t\trect(2, 0, 1, 4, fg),\n\t\t\t);\n\n\t\t// ── ZigZag ───────────────────────────────────────────────────────\n\t\tcase 'zigZag':\n\t\t\treturn svg(\n\t\t\t\ts,\n\t\t\t\ts,\n\t\t\t\t`${bg8}` +\n\t\t\t\t\t`<path d=\"M0,4 L2,0 L4,4 L6,0 L8,4\" stroke=\"${fg}\" stroke-width=\"1\" fill=\"none\"/>` +\n\t\t\t\t\t`<path d=\"M0,8 L2,4 L4,8 L6,4 L8,8\" stroke=\"${fg}\" stroke-width=\"1\" fill=\"none\"/>`,\n\t\t\t);\n\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\n/**\n * Build CSS `background-image` and `background-color` values for an OOXML\n * pattern fill (`a:pattFill`) from a resolved `ShapeStyle`.\n *\n * Returns `undefined` when:\n * - `style` is absent,\n * - `style.fillMode` is not `\"pattern\"`,\n * - `style.fillPatternPreset` is missing, or\n * - the preset is not implemented by `getPatternSvg`.\n *\n * Colour values are hex-normalised before being passed to `getPatternSvg` so\n * the SVG is always well-formed even when the parser emits bare colour strings\n * without a leading `#`.\n *\n * @param style - Resolved shape style from the core parser.\n * @returns `{ backgroundImage, backgroundColor }` ready for `[ngStyle]`, or\n * `undefined` when pattern rendering is not applicable.\n */\nexport function buildPatternFillCss(\n\tstyle: ShapeStyle | undefined,\n): { backgroundImage: string; backgroundColor: string } | undefined {\n\tif (!style || style.fillMode !== 'pattern' || !style.fillPatternPreset) {\n\t\treturn undefined;\n\t}\n\n\tconst fg = normalizeHexColor(style.fillColor, '#000000');\n\tconst bg = normalizeHexColor(style.fillPatternBackgroundColor, '#ffffff');\n\tconst preset = style.fillPatternPreset;\n\n\tconst svgPattern = getPatternSvg(preset, fg, bg);\n\tif (!svgPattern) {\n\t\treturn undefined;\n\t}\n\n\t// Encode for use in a data URI. Avoid String.prototype.replaceAll for\n\t// compatibility with lower lib targets (ng-packagr / ES2017 baseline).\n\tconst encoded = encodeURIComponent(svgPattern);\n\treturn {\n\t\tbackgroundImage: `url(\"data:image/svg+xml,${encoded}\")`,\n\t\tbackgroundColor: bg,\n\t};\n}\n","/**\n * Shape-geometry clip-path helper.\n *\n * Wires the core geometry APIs into the Angular viewer's shape clipping\n * pipeline. Implements a priority cascade so renderers always pick the\n * highest-fidelity geometry available for a given element:\n *\n * 1. **Adjustment-aware** — if `shapeAdjustments` exist, consult\n * {@link getAdjustmentAwareShapeClipPath} so shapes like `pie`, `arc`,\n * `donut`, `blockArc`, and the wedge callouts respond to their\n * adjustment values.\n * 2. **Spec-correct preset evaluator** — {@link getShapeClipPathFromPreset}\n * uses the ECMA-376 `pathLst` evaluator to produce a `path('…')`\n * clip-path for any shape covered by the preset table.\n * 3. **Cloud Bezier path** — {@link getCloudPathForRendering} produces a\n * DPI-stable cubic-Bezier `path('…')` for `cloud` / `cloudCallout`.\n * 4. **Static polygon table** — {@link getShapeClipPath} (the core preset\n * table) is the final fallback for shapes none of the higher-fidelity\n * APIs cover.\n *\n * This module is a plain-TypeScript port of the React package's\n * `viewer/utils/resolved-shape-clip-path.ts`, with no framework imports.\n * It mirrors the Vue port's `viewer/composables/shape-geometry.ts` exactly\n * so the exported function names and signatures are drop-in compatible.\n */\nimport type { PptxElement } from 'pptx-viewer-core';\nimport {\n\tgetAdjustmentAwareShapeClipPath,\n\tgetCloudPathForRendering,\n\tgetShapeClipPath,\n\tgetShapeClipPathFromPreset,\n} from 'pptx-viewer-core';\n\n/**\n * Resolve the best available CSS `clip-path` value for a shape type at a\n * given pixel size. Implements the priority cascade described in the module\n * docstring.\n *\n * @param shapeType The OOXML preset geometry name (case-insensitive).\n * @param width Element width in pixels (must be > 0 for path output).\n * @param height Element height in pixels (must be > 0 for path output).\n * @param adjustments Optional `shapeAdjustments` record from the element.\n * @returns A CSS `clip-path` value (`polygon(...)`, `path('…')`, or `inset(...)`),\n * or `undefined` if no clipping is needed.\n */\nexport function getResolvedShapeClipPathFor(\n\tshapeType: string | undefined,\n\twidth: number,\n\theight: number,\n\tadjustments?: Record<string, number>,\n): string | undefined {\n\tif (!shapeType) {\n\t\treturn undefined;\n\t}\n\tif (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {\n\t\treturn getShapeClipPath(shapeType);\n\t}\n\n\t// 1. Adjustment-aware path: only consult when adjustments are actually\n\t// supplied. Without adjustments this would fall through to the static\n\t// preset table inside core, which we already cover at step 4.\n\tif (adjustments && Object.keys(adjustments).length > 0) {\n\t\tconst adjusted = getAdjustmentAwareShapeClipPath(shapeType, width, height, adjustments);\n\t\tif (adjusted !== undefined) {\n\t\t\treturn adjusted;\n\t\t}\n\t}\n\n\t// 2. Spec-correct ECMA-376 preset evaluator.\n\tconst fromPreset = getShapeClipPathFromPreset(shapeType, width, height, adjustments);\n\tif (fromPreset !== undefined) {\n\t\treturn fromPreset;\n\t}\n\n\t// 3. Cubic-Bezier cloud / cloudCallout path (DPI-stable lobes).\n\tconst cloud = getCloudPathForRendering(shapeType, width, height);\n\tif (cloud !== undefined) {\n\t\treturn cloud;\n\t}\n\n\t// 4. Final fallback: static preset polygon / inset table from core.\n\treturn getShapeClipPath(shapeType);\n}\n\n/**\n * Element-level convenience wrapper. Pulls `shapeType`, `width`, `height`,\n * and `shapeAdjustments` off a {@link PptxElement} and delegates to\n * {@link getResolvedShapeClipPathFor}.\n *\n * @param element The PPTX element to resolve a clip-path for.\n * @param width Optional width override (pixels). Defaults to `element.width`.\n * @param height Optional height override (pixels). Defaults to `element.height`.\n * @returns A CSS `clip-path` value, or `undefined`.\n */\nexport function getResolvedShapeClipPath(\n\telement: PptxElement,\n\twidth?: number,\n\theight?: number,\n): string | undefined {\n\tconst shapeType = (element as { shapeType?: string }).shapeType;\n\tif (!shapeType) {\n\t\treturn undefined;\n\t}\n\tconst w = typeof width === 'number' ? width : element.width;\n\tconst h = typeof height === 'number' ? height : element.height;\n\tconst adjustments = (element as { shapeAdjustments?: Record<string, number> }).shapeAdjustments;\n\treturn getResolvedShapeClipPathFor(shapeType, w, h, adjustments);\n}\n","import type { PptxElement } from 'pptx-viewer-core';\nimport { hasShapeProperties, hasTextProperties } from 'pptx-viewer-core';\n\nimport { DEFAULT_STROKE_COLOR, DEFAULT_TEXT_COLOR } from '../internal/shared';\nimport { buildCssGradientFromShapeStyle } from './color-gradient';\nimport { buildPatternFillCss } from './color-patterns';\nimport { getResolvedShapeClipPath } from './shape-geometry';\nimport { getComputedEffectStyle } from './visual-effects';\n\n/**\n * Basic, framework-agnostic style computation for slide elements, returning\n * `[ngStyle]`-compatible maps.\n *\n * This mirrors the Vue package's `element-style.ts` (and a deliberately small\n * subset of the React `viewer/utils/*` style layer). It is enough to position\n * and paint text boxes, basic preset shapes, images, and image/gradient fills\n * (the latter via the parser's prebuilt CSS gradient string). Advanced visuals\n * (the structured gradient builder, pattern fills, custom geometry clip-paths,\n * shadows, 3D, image effects, text warp) are tracked in PORTING.md.\n *\n * Long term the *logic* here is a shared-extraction candidate — only the\n * return type (CSS map shape) differs per framework — so a future refactor\n * could hoist a neutral core into `pptx-viewer-shared`.\n */\n\n/** `[ngStyle]`-compatible style map. */\nexport type StyleMap = Record<string, string | number>;\n\n/** Map a number to a CSS pixel string. */\nconst px = (n: number): string => `${n}px`;\n\n/**\n * Absolute container style: position, size, rotation, flip, opacity, z-index.\n * Mirrors the essentials of the React `getContainerStyle`.\n */\nexport function getContainerStyle(el: PptxElement, zIndex: number): StyleMap {\n\tconst transforms: string[] = [];\n\tif (el.rotation) {\n\t\ttransforms.push(`rotate(${el.rotation}deg)`);\n\t}\n\tif (el.flipHorizontal) {\n\t\ttransforms.push('scaleX(-1)');\n\t}\n\tif (el.flipVertical) {\n\t\ttransforms.push('scaleY(-1)');\n\t}\n\n\tconst style: StyleMap = {\n\t\tposition: 'absolute',\n\t\tleft: px(el.x),\n\t\ttop: px(el.y),\n\t\twidth: px(el.width),\n\t\theight: px(el.height),\n\t\t'z-index': zIndex,\n\t\t'box-sizing': 'border-box',\n\t};\n\tif (transforms.length > 0) {\n\t\tstyle['transform'] = transforms.join(' ');\n\t}\n\tif (typeof el.opacity === 'number') {\n\t\tstyle['opacity'] = el.opacity;\n\t}\n\tif (el.hidden) {\n\t\tstyle['display'] = 'none';\n\t}\n\treturn style;\n}\n\n/**\n * Fill / stroke / corner-radius for shape-like elements. Returns an empty\n * object when the element carries no shape styling.\n */\nexport function getShapeFillStrokeStyle(el: PptxElement): StyleMap {\n\tif (!hasShapeProperties(el)) {\n\t\treturn {};\n\t}\n\tconst ss = el.shapeStyle;\n\tconst style: StyleMap = {};\n\n\tif (ss) {\n\t\t// Fill resolution order mirrors the React `getShapeVisualStyle`:\n\t\t// image → pattern (SVG preset) → gradient (structured builder, with the\n\t\t// parser's prebuilt CSS string as fallback) → solid colour.\n\t\tconst imageFillUrl = ss.fillMode === 'image' && ss.fillImageUrl ? ss.fillImageUrl : undefined;\n\t\tconst patternCss = ss.fillMode === 'pattern' ? buildPatternFillCss(ss) : undefined;\n\t\tconst gradient =\n\t\t\tss.fillMode === 'gradient'\n\t\t\t\t? (buildCssGradientFromShapeStyle(ss) ?? ss.fillGradient)\n\t\t\t\t: ss.fillGradient;\n\n\t\tif (imageFillUrl) {\n\t\t\tstyle['background-color'] = 'transparent';\n\t\t\tstyle['background-image'] = `url(${imageFillUrl})`;\n\t\t\tstyle['background-repeat'] = ss.fillImageMode === 'tile' ? 'repeat' : 'no-repeat';\n\t\t\tstyle['background-size'] = ss.fillImageMode === 'tile' ? 'auto' : '100% 100%';\n\t\t} else if (patternCss) {\n\t\t\tstyle['background-image'] = patternCss.backgroundImage;\n\t\t\tstyle['background-color'] = patternCss.backgroundColor;\n\t\t\tstyle['background-repeat'] = 'repeat';\n\t\t\tstyle['background-size'] = 'auto';\n\t\t} else if (gradient) {\n\t\t\tstyle['background-image'] = gradient;\n\t\t} else if (ss.fillColor && ss.fillColor !== 'transparent' && ss.fillMode !== 'none') {\n\t\t\tstyle['background-color'] = ss.fillColor;\n\t\t}\n\n\t\t// Stroke.\n\t\tconst strokeWidth = Math.max(0, ss.strokeWidth ?? 0);\n\t\tif (strokeWidth > 0) {\n\t\t\tconst dash =\n\t\t\t\tss.strokeDash && ss.strokeDash !== 'solid'\n\t\t\t\t\t? ss.strokeDash === 'dot' || ss.strokeDash === 'sysDot'\n\t\t\t\t\t\t? 'dotted'\n\t\t\t\t\t\t: 'dashed'\n\t\t\t\t\t: 'solid';\n\t\t\tstyle['border'] = `${px(strokeWidth)} ${dash} ${ss.strokeColor ?? DEFAULT_STROKE_COLOR}`;\n\t\t}\n\t}\n\n\t// Visual effects (outer/inner/glow shadows, blur/soft-edge filters,\n\t// reflection, blend mode, effect-DAG alpha). Applied to every return path\n\t// below. Mirrors the Vue port's `getComputedEffectStyle` integration; the\n\t// duotone DAG `url(#…)` reference is stripped until the SVG <filter> is\n\t// injected.\n\tconst fx = getComputedEffectStyle(el);\n\tif (fx.boxShadow) {\n\t\tstyle['box-shadow'] = fx.boxShadow;\n\t}\n\tif (fx.filter) {\n\t\tconst filter = fx.filter.replace(/\\s*url\\(#[^)]*\\)/gu, '').trim();\n\t\tif (filter) {\n\t\t\tstyle['filter'] = filter;\n\t\t}\n\t}\n\tif (fx.webkitBoxReflect) {\n\t\tstyle['-webkit-box-reflect'] = fx.webkitBoxReflect;\n\t}\n\tif (fx.mixBlendMode) {\n\t\tstyle['mix-blend-mode'] = fx.mixBlendMode;\n\t}\n\tif (fx.opacity !== undefined) {\n\t\tconst elementOpacity = typeof el.opacity === 'number' ? el.opacity : 1;\n\t\tstyle['opacity'] = elementOpacity * fx.opacity;\n\t}\n\n\t// Geometry. ellipse / roundRect get cheap `border-radius` approximations;\n\t// every other preset geometry falls back to an SVG `clip-path` derived from\n\t// the core geometry engine (mirrors the Vue port's cascade). Plain\n\t// rectangles resolve to `undefined` and stay unclipped.\n\tconst shapeType = 'shapeType' in el ? el.shapeType : undefined;\n\tif (shapeType === 'ellipse' || shapeType === 'circle') {\n\t\tstyle['border-radius'] = '50%';\n\t\treturn style;\n\t}\n\tif (shapeType === 'roundRect') {\n\t\tstyle['border-radius'] = px(Math.min(el.width, el.height) * 0.1);\n\t\treturn style;\n\t}\n\n\tconst clipPath = getResolvedShapeClipPath(el);\n\tif (clipPath) {\n\t\tstyle['clip-path'] = clipPath;\n\t}\n\n\treturn style;\n}\n\n/**\n * Text block style for elements that carry text. Mirrors the essentials of the\n * React `getTextStyleForElement`.\n */\nexport function getTextBlockStyle(el: PptxElement): StyleMap {\n\tif (!hasTextProperties(el)) {\n\t\treturn {};\n\t}\n\tconst ts = el.textStyle;\n\tconst style: StyleMap = {\n\t\tdisplay: 'flex',\n\t\t'flex-direction': 'column',\n\t\twidth: '100%',\n\t\theight: '100%',\n\t\toverflow: 'hidden',\n\t\t'white-space': 'pre-wrap',\n\t\t'word-break': 'break-word',\n\t};\n\tif (!ts) {\n\t\tstyle['color'] = DEFAULT_TEXT_COLOR;\n\t\treturn style;\n\t}\n\n\tstyle['color'] = ts.color ?? DEFAULT_TEXT_COLOR;\n\tif (ts.fontFamily) {\n\t\tstyle['font-family'] = ts.fontFamily;\n\t}\n\tif (typeof ts.fontSize === 'number') {\n\t\tstyle['font-size'] = `${ts.fontSize}pt`;\n\t}\n\tif (ts.bold) {\n\t\tstyle['font-weight'] = 'bold';\n\t}\n\tif (ts.italic) {\n\t\tstyle['font-style'] = 'italic';\n\t}\n\n\tconst decorations: string[] = [];\n\tif (ts.underline) {\n\t\tdecorations.push('underline');\n\t}\n\tif (ts.strikethrough) {\n\t\tdecorations.push('line-through');\n\t}\n\tif (decorations.length > 0) {\n\t\tstyle['text-decoration'] = decorations.join(' ');\n\t}\n\n\tswitch (ts.align) {\n\t\tcase 'center':\n\t\t\tstyle['text-align'] = 'center';\n\t\t\tbreak;\n\t\tcase 'right':\n\t\t\tstyle['text-align'] = 'right';\n\t\t\tbreak;\n\t\tcase 'justify':\n\t\t\tstyle['text-align'] = 'justify';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tstyle['text-align'] = 'left';\n\t}\n\n\tswitch (ts.vAlign) {\n\t\tcase 'middle':\n\t\t\tstyle['justify-content'] = 'center';\n\t\t\tbreak;\n\t\tcase 'bottom':\n\t\t\tstyle['justify-content'] = 'flex-end';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tstyle['justify-content'] = 'flex-start';\n\t}\n\n\treturn style;\n}\n\n/** Resolve a displayable image source for picture/image/media poster frames. */\nexport function getImageSrc(\n\tel: PptxElement,\n\tmediaDataUrls: Map<string, string>,\n): string | undefined {\n\tif (el.type === 'picture' || el.type === 'image') {\n\t\treturn el.imageData ?? (el.imagePath ? mediaDataUrls.get(el.imagePath) : undefined);\n\t}\n\tif (el.type === 'media') {\n\t\treturn (\n\t\t\tel.posterFrameData ?? (el.posterFramePath ? mediaDataUrls.get(el.posterFramePath) : undefined)\n\t\t);\n\t}\n\treturn undefined;\n}\n","/**\n * omml-to-mathml.ts — pure OMML → MathML conversion.\n *\n * Angular port of the Vue `viewer/composables/omml-to-mathml.ts`, consolidated\n * into a single self-contained, framework-agnostic module. No Angular/Vue/DOM\n * dependencies.\n *\n * Converts Office MathML (OMML) XML objects — as parsed by fast-xml-parser\n * during PPTX load (attributes prefixed with `@_`) — into standard MathML\n * markup strings (`<math>…</math>`) that browsers render natively.\n *\n * `pptx-viewer-core` does NOT ship an OMML→MathML converter (its\n * `OmmlLatexConverter` only does OMML↔LaTeX), so this logic is ported here.\n */\n\nimport type { XmlObject } from 'pptx-viewer-core';\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\n/**\n * A parsed OMML node. Structurally a parsed-XML object: attributes live under\n * `@_`-prefixed keys, children under their (namespaced) tag name, text under\n * `#text` (or a collapsed bare string). Aliased to core's `XmlObject`.\n */\nexport type OmmlNode = XmlObject;\n\n/** Function that converts all children of an OMML container to MathML. */\ntype ChildrenConverter = (node: OmmlNode) => string;\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\n/** Safely retrieve a child node, always returning an object (never undefined). */\nfunction child(node: OmmlNode | undefined, key: string): OmmlNode {\n\tif (!node) {\n\t\treturn {};\n\t}\n\tconst v = node[key];\n\tif (v && typeof v === 'object' && !Array.isArray(v)) {\n\t\treturn v as OmmlNode;\n\t}\n\treturn {};\n}\n\n/** Ensure a value is an array of OmmlNode. */\nfunction ensureArray(value: OmmlNode[keyof OmmlNode]): OmmlNode[] {\n\tif (value === undefined || value === null) {\n\t\treturn [];\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn value as OmmlNode[];\n\t}\n\tif (typeof value === 'object') {\n\t\treturn [value as OmmlNode];\n\t}\n\treturn [];\n}\n\n/** Read a string attribute from a node. */\nfunction attr(node: OmmlNode | undefined, name: string): string {\n\tif (!node) {\n\t\treturn '';\n\t}\n\tconst v = node[`@_${name}`];\n\treturn typeof v === 'string' ? v : v !== undefined ? String(v) : '';\n}\n\n/** Read the `@_val` attribute (extremely common in OMML property nodes). */\nfunction val(node: OmmlNode | undefined): string {\n\treturn attr(node, 'val');\n}\n\n/** Escape angle brackets and ampersands for safe embedding in MathML. */\nfunction escapeXml(text: string): string {\n\treturn text.replace(/&/gu, '&').replace(/</gu, '<').replace(/>/gu, '>');\n}\n\n/** Read an `m:t` text run value (object/string/number) as a string. */\nfunction readText(node: OmmlNode): string {\n\tconst textNode = node['m:t'];\n\tif (typeof textNode === 'string') {\n\t\treturn textNode;\n\t}\n\tif (typeof textNode === 'number' || typeof textNode === 'boolean') {\n\t\treturn String(textNode);\n\t}\n\tif (textNode && typeof textNode === 'object' && !Array.isArray(textNode)) {\n\t\tconst inner = (textNode as OmmlNode)['#text'];\n\t\treturn typeof inner === 'string' ? inner : '';\n\t}\n\treturn '';\n}\n\n// ── Character classification ────────────────────────────────────────────────\n\n/** Set of characters treated as mathematical operators. */\nconst OPERATOR_CHARS = new Set([\n\t'+',\n\t'-',\n\t'−',\n\t'±',\n\t'∓',\n\t'×',\n\t'÷',\n\t'·',\n\t'=',\n\t'≠',\n\t'≈',\n\t'≡',\n\t'≤',\n\t'≥',\n\t'<',\n\t'>',\n\t'≪',\n\t'≫',\n\t'∈',\n\t'∉',\n\t'⊂',\n\t'⊃',\n\t'⊆',\n\t'⊇',\n\t'∪',\n\t'∩',\n\t'→',\n\t'←',\n\t'↔',\n\t'⇒',\n\t'⇐',\n\t'⇔',\n\t'∞',\n\t'∴',\n\t'∵',\n\t'∝',\n\t'∀',\n\t'∃',\n\t',',\n\t';',\n\t':',\n\t'!',\n\t'?',\n\t'.',\n\t'|',\n\t'/',\n\t'\\\\',\n\t\"'\",\n\t'(',\n\t')',\n\t'[',\n\t']',\n\t'{',\n\t'}',\n\t'⟨',\n\t'⟩',\n]);\n\nfunction isOperator(ch: string): boolean {\n\treturn OPERATOR_CHARS.has(ch.trim());\n}\n\nfunction isNumeric(text: string): boolean {\n\treturn /^[0-9]+(?:[.,][0-9]+)?$/u.test(text.trim());\n}\n\n// ── Unicode accent map (m:acc) ──────────────────────────────────────────────\n\nconst ACCENT_MAP: Record<string, string> = {\n\t'̂': '^', // combining circumflex → hat\n\t'̃': '~', // combining tilde\n\t'̄': '¯', // combining macron → bar\n\t'̅': '¯', // combining overline → bar\n\t'̇': '˙', // combining dot above\n\t'̈': '¨', // combining diaeresis\n\t'̌': 'ˇ', // combining caron\n\t'̲': '_', // combining underbar\n\t'⃗': '→', // combining right arrow above → →\n\t'^': '^',\n\t'~': '~',\n\t'¯': '¯',\n\t'˙': '˙',\n\t'¨': '¨',\n\tˇ: 'ˇ',\n};\n\n// ── Nary operator map ───────────────────────────────────────────────────────\n\nconst NARY_CHAR_MAP: Record<string, string> = {\n\t'∑': '∑', // ∑\n\t'∏': '∏', // ∏\n\t'∫': '∫', // ∫\n\t'∬': '∬', // ∬\n\t'∭': '∭', // ∭\n\t'∮': '∮', // ∮\n\t'∐': '∐', // ∐\n\t'⋀': '⋀', // ⋀\n\t'⋁': '⋁', // ⋁\n\t'⋂': '⋂', // ⋂\n\t'⋃': '⋃', // ⋃\n};\n\n// ── Delimiter bracket maps ──────────────────────────────────────────────────\n\nconst DELIM_BEGIN_MAP: Record<string, string> = {\n\t'(': '(',\n\t'[': '[',\n\t'{': '{',\n\t'|': '|',\n\t'‖': '‖',\n\t'⟨': '⟨',\n\t'⌈': '⌈',\n\t'⌊': '⌊',\n};\n\nconst DELIM_END_MAP: Record<string, string> = {\n\t')': ')',\n\t']': ']',\n\t'}': '}',\n\t'|': '|',\n\t'‖': '‖',\n\t'⟩': '⟩',\n\t'⌉': '⌉',\n\t'⌋': '⌋',\n};\n\n// ── Element converters ──────────────────────────────────────────────────────\n\n/** m:r — text run: classify as identifier, number, or operator. */\nfunction convertRun(node: OmmlNode): string {\n\tconst text = readText(node);\n\tif (text.length === 0) {\n\t\treturn '';\n\t}\n\n\tconst escaped = escapeXml(text);\n\tconst rPr = child(node, 'm:rPr');\n\tconst norVal = val(child(rPr, 'm:nor'));\n\tconst isNormal = norVal === '1' || norVal === 'on' || norVal === 'true';\n\n\tif (isNumeric(text)) {\n\t\treturn `<mn>${escaped}</mn>`;\n\t}\n\tif (isOperator(text)) {\n\t\treturn `<mo>${escaped}</mo>`;\n\t}\n\tif (isNormal) {\n\t\treturn `<mi mathvariant=\"normal\">${escaped}</mi>`;\n\t}\n\treturn `<mi>${escaped}</mi>`;\n}\n\n/** m:f — fraction. */\nfunction convertFraction(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst fPr = child(node, 'm:fPr');\n\tconst fracType = val(child(fPr, 'm:type'));\n\tconst num = `<mrow>${cc(child(node, 'm:num'))}</mrow>`;\n\tconst den = `<mrow>${cc(child(node, 'm:den'))}</mrow>`;\n\n\tif (fracType === 'lin') {\n\t\treturn `<mrow>${num}<mo>/</mo>${den}</mrow>`;\n\t}\n\tif (fracType === 'noBar') {\n\t\treturn `<mfrac linethickness=\"0\">${num}${den}</mfrac>`;\n\t}\n\treturn `<mfrac>${num}${den}</mfrac>`;\n}\n\n/** m:rad — radical: square root or nth root. */\nfunction convertRadical(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst radPr = child(node, 'm:radPr');\n\tconst degHide = val(child(radPr, 'm:degHide'));\n\tconst base = cc(child(node, 'm:e'));\n\tconst degree = cc(child(node, 'm:deg'));\n\n\tif (degHide === '1' || degHide === 'on' || degHide === 'true' || degree.length === 0) {\n\t\treturn `<msqrt><mrow>${base}</mrow></msqrt>`;\n\t}\n\treturn `<mroot><mrow>${base}</mrow><mrow>${degree}</mrow></mroot>`;\n}\n\n/** m:sSup — superscript. */\nfunction convertSuperscript(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst base = cc(child(node, 'm:e'));\n\tconst sup = cc(child(node, 'm:sup'));\n\treturn `<msup><mrow>${base}</mrow><mrow>${sup}</mrow></msup>`;\n}\n\n/** m:sSub — subscript. */\nfunction convertSubscript(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst base = cc(child(node, 'm:e'));\n\tconst sub = cc(child(node, 'm:sub'));\n\treturn `<msub><mrow>${base}</mrow><mrow>${sub}</mrow></msub>`;\n}\n\n/** m:sSubSup — simultaneous subscript and superscript. */\nfunction convertSubSup(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst base = cc(child(node, 'm:e'));\n\tconst sub = cc(child(node, 'm:sub'));\n\tconst sup = cc(child(node, 'm:sup'));\n\treturn `<msubsup><mrow>${base}</mrow><mrow>${sub}</mrow><mrow>${sup}</mrow></msubsup>`;\n}\n\n/** m:sPre — pre-sub-superscript (e.g. isotope notation). */\nfunction convertPreSubSup(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst base = cc(child(node, 'm:e'));\n\tconst sub = cc(child(node, 'm:sub'));\n\tconst sup = cc(child(node, 'm:sup'));\n\treturn `<mmultiscripts><mrow>${base}</mrow><mprescripts/><mrow>${sub}</mrow><mrow>${sup}</mrow></mmultiscripts>`;\n}\n\n/** m:nary — n-ary operator (sum, integral, product, etc.). */\nfunction convertNary(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst naryPr = child(node, 'm:naryPr');\n\tconst chrVal = val(child(naryPr, 'm:chr'));\n\tconst limLocVal = val(child(naryPr, 'm:limLoc'));\n\tconst subHide = val(child(naryPr, 'm:subHide'));\n\tconst supHide = val(child(naryPr, 'm:supHide'));\n\n\tconst operatorChar = chrVal ? NARY_CHAR_MAP[chrVal] || chrVal : '∫';\n\n\tconst sub = cc(child(node, 'm:sub'));\n\tconst sup = cc(child(node, 'm:sup'));\n\tconst base = cc(child(node, 'm:e'));\n\n\tconst showSub = subHide !== '1' && subHide !== 'on' && subHide !== 'true' && sub.length > 0;\n\tconst showSup = supHide !== '1' && supHide !== 'on' && supHide !== 'true' && sup.length > 0;\n\n\tlet result: string;\n\tif (showSub && showSup) {\n\t\tif (limLocVal === 'undOvr') {\n\t\t\tresult = `<munderover><mo>${escapeXml(operatorChar)}</mo><mrow>${sub}</mrow><mrow>${sup}</mrow></munderover>`;\n\t\t} else {\n\t\t\tresult = `<msubsup><mo>${escapeXml(operatorChar)}</mo><mrow>${sub}</mrow><mrow>${sup}</mrow></msubsup>`;\n\t\t}\n\t} else if (showSub) {\n\t\tif (limLocVal === 'undOvr') {\n\t\t\tresult = `<munder><mo>${escapeXml(operatorChar)}</mo><mrow>${sub}</mrow></munder>`;\n\t\t} else {\n\t\t\tresult = `<msub><mo>${escapeXml(operatorChar)}</mo><mrow>${sub}</mrow></msub>`;\n\t\t}\n\t} else if (showSup) {\n\t\tif (limLocVal === 'undOvr') {\n\t\t\tresult = `<mover><mo>${escapeXml(operatorChar)}</mo><mrow>${sup}</mrow></mover>`;\n\t\t} else {\n\t\t\tresult = `<msup><mo>${escapeXml(operatorChar)}</mo><mrow>${sup}</mrow></msup>`;\n\t\t}\n\t} else {\n\t\tresult = `<mo>${escapeXml(operatorChar)}</mo>`;\n\t}\n\n\treturn `<mrow>${result}<mrow>${base}</mrow></mrow>`;\n}\n\n/** m:d — delimiter (parentheses, brackets, pipes, etc.). */\nfunction convertDelimiter(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst dPr = child(node, 'm:dPr');\n\tconst begChrVal = val(child(dPr, 'm:begChr'));\n\tconst endChrVal = val(child(dPr, 'm:endChr'));\n\tconst sepChrVal = val(child(dPr, 'm:sepChr'));\n\n\tconst open = begChrVal.length > 0 ? begChrVal : '(';\n\tconst close = endChrVal.length > 0 ? endChrVal : ')';\n\tconst separator = sepChrVal.length > 0 ? sepChrVal : '';\n\n\tconst openChar = DELIM_BEGIN_MAP[open] || open;\n\tconst closeChar = DELIM_END_MAP[close] || close;\n\n\tconst elements = ensureArray(node['m:e']);\n\tconst parts: string[] = [];\n\tfor (let i = 0; i < elements.length; i++) {\n\t\tif (i > 0 && separator.length > 0) {\n\t\t\tparts.push(`<mo>${escapeXml(separator)}</mo>`);\n\t\t}\n\t\tparts.push(`<mrow>${cc(elements[i])}</mrow>`);\n\t}\n\n\tconst openMo = open ? `<mo>${escapeXml(openChar)}</mo>` : '<mo></mo>';\n\tconst closeMo = close ? `<mo>${escapeXml(closeChar)}</mo>` : '<mo></mo>';\n\n\treturn `<mrow>${openMo}${parts.join('')}${closeMo}</mrow>`;\n}\n\n/** m:m — matrix / array layout. */\nfunction convertMatrix(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst rows = ensureArray(node['m:mr']);\n\tconst tableRows: string[] = [];\n\n\tfor (const row of rows) {\n\t\tconst cells = ensureArray(row['m:e']);\n\t\tconst tdParts: string[] = [];\n\t\tfor (const cell of cells) {\n\t\t\ttdParts.push(`<mtd><mrow>${cc(cell)}</mrow></mtd>`);\n\t\t}\n\t\ttableRows.push(`<mtr>${tdParts.join('')}</mtr>`);\n\t}\n\n\treturn `<mrow><mo>[</mo><mtable>${tableRows.join('')}</mtable><mo>]</mo></mrow>`;\n}\n\n/** m:acc — accent mark (hat, bar, tilde, dot, etc.). */\nfunction convertAccent(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst accPr = child(node, 'm:accPr');\n\tconst chrVal = val(child(accPr, 'm:chr'));\n\tconst base = cc(child(node, 'm:e'));\n\n\tconst accentChar = chrVal.length > 0 ? ACCENT_MAP[chrVal] || chrVal : '̂';\n\n\treturn `<mover accent=\"true\"><mrow>${base}</mrow><mo>${escapeXml(accentChar)}</mo></mover>`;\n}\n\n/** m:bar — overbar or underbar. */\nfunction convertBar(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst barPr = child(node, 'm:barPr');\n\tconst posVal = val(child(barPr, 'm:pos'));\n\tconst base = cc(child(node, 'm:e'));\n\n\tif (posVal === 'bot') {\n\t\treturn `<munder><mrow>${base}</mrow><mo>¯</mo></munder>`;\n\t}\n\treturn `<mover><mrow>${base}</mrow><mo>¯</mo></mover>`;\n}\n\n/** m:limLow — lower limit. */\nfunction convertLimLow(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst base = cc(child(node, 'm:e'));\n\tconst lim = cc(child(node, 'm:lim'));\n\treturn `<munder><mrow>${base}</mrow><mrow>${lim}</mrow></munder>`;\n}\n\n/** m:limUpp — upper limit. */\nfunction convertLimUpp(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst base = cc(child(node, 'm:e'));\n\tconst lim = cc(child(node, 'm:lim'));\n\treturn `<mover><mrow>${base}</mrow><mrow>${lim}</mrow></mover>`;\n}\n\n/** m:groupChr — grouping character (brace under/over). */\nfunction convertGroupChr(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst grpPr = child(node, 'm:groupChrPr');\n\tconst chrVal = val(child(grpPr, 'm:chr'));\n\tconst posVal = val(child(grpPr, 'm:pos'));\n\tconst base = cc(child(node, 'm:e'));\n\n\tconst chr = chrVal.length > 0 ? chrVal : '⏟';\n\n\tif (posVal === 'top') {\n\t\treturn `<mover><mrow>${base}</mrow><mo>${escapeXml(chr)}</mo></mover>`;\n\t}\n\treturn `<munder><mrow>${base}</mrow><mo>${escapeXml(chr)}</mo></munder>`;\n}\n\n/** m:eqArr — equation array (aligned equations). */\nfunction convertEqArr(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst elements = ensureArray(node['m:e']);\n\tconst rows: string[] = [];\n\n\tfor (const el of elements) {\n\t\trows.push(`<mtr><mtd><mrow>${cc(el)}</mrow></mtd></mtr>`);\n\t}\n\n\treturn `<mtable columnalign=\"left\">${rows.join('')}</mtable>`;\n}\n\n/** m:box / m:borderBox — grouping box (transparent container). */\nfunction convertBox(node: OmmlNode, cc: ChildrenConverter): string {\n\treturn `<mrow>${cc(child(node, 'm:e'))}</mrow>`;\n}\n\n/** m:func — function application (sin, cos, log, lim, etc.). */\nfunction convertFunc(node: OmmlNode, cc: ChildrenConverter): string {\n\tconst fName = cc(child(node, 'm:fName'));\n\tconst base = cc(child(node, 'm:e'));\n\treturn `<mrow>${fName}<mo>⁡</mo><mrow>${base}</mrow></mrow>`;\n}\n\n// ── Dispatch ────────────────────────────────────────────────────────────────\n\n/** Convert all child elements of an OMML container to MathML. */\nfunction convertChildren(node: OmmlNode): string {\n\tif (!node || typeof node !== 'object') {\n\t\treturn '';\n\t}\n\tconst parts: string[] = [];\n\n\tfor (const key of Object.keys(node)) {\n\t\tif (key.startsWith('@_')) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (key === 'm:oMathPara') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst items = ensureArray(node[key]);\n\t\tfor (const item of items) {\n\t\t\tconst result = convertElement(key, item);\n\t\t\tif (result) {\n\t\t\t\tparts.push(result);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn parts.join('');\n}\n\n/** Convert a single OMML element by tag name. */\nfunction convertElement(tag: string, node: OmmlNode): string {\n\tswitch (tag) {\n\t\tcase 'm:r':\n\t\t\treturn convertRun(node);\n\t\tcase 'm:f':\n\t\t\treturn convertFraction(node, convertChildren);\n\t\tcase 'm:rad':\n\t\t\treturn convertRadical(node, convertChildren);\n\t\tcase 'm:sSup':\n\t\t\treturn convertSuperscript(node, convertChildren);\n\t\tcase 'm:sSub':\n\t\t\treturn convertSubscript(node, convertChildren);\n\t\tcase 'm:sSubSup':\n\t\t\treturn convertSubSup(node, convertChildren);\n\t\tcase 'm:sPre':\n\t\t\treturn convertPreSubSup(node, convertChildren);\n\t\tcase 'm:nary':\n\t\t\treturn convertNary(node, convertChildren);\n\t\tcase 'm:d':\n\t\t\treturn convertDelimiter(node, convertChildren);\n\t\tcase 'm:m':\n\t\t\treturn convertMatrix(node, convertChildren);\n\t\tcase 'm:acc':\n\t\t\treturn convertAccent(node, convertChildren);\n\t\tcase 'm:bar':\n\t\t\treturn convertBar(node, convertChildren);\n\t\tcase 'm:limLow':\n\t\t\treturn convertLimLow(node, convertChildren);\n\t\tcase 'm:limUpp':\n\t\t\treturn convertLimUpp(node, convertChildren);\n\t\tcase 'm:groupChr':\n\t\t\treturn convertGroupChr(node, convertChildren);\n\t\tcase 'm:eqArr':\n\t\t\treturn convertEqArr(node, convertChildren);\n\t\tcase 'm:box':\n\t\t\treturn convertBox(node, convertChildren);\n\t\tcase 'm:borderBox':\n\t\t\treturn convertBox(node, convertChildren);\n\t\tcase 'm:func':\n\t\t\treturn convertFunc(node, convertChildren);\n\t\tcase 'm:oMath':\n\t\t\treturn `<mrow>${convertChildren(node)}</mrow>`;\n\t\tdefault:\n\t\t\t// TODO: defer exotic constructs (m:phant, m:sSubSupPr edge cases,\n\t\t\t// m:argPr scaling, etc.) — passthrough as empty for now.\n\t\t\treturn '';\n\t}\n}\n\n/** Locate all `m:oMath` root elements inside an OMML wrapper node. */\nfunction findOmathRoots(node: OmmlNode): OmmlNode[] {\n\tif (node['m:oMath']) {\n\t\treturn ensureArray(node['m:oMath']);\n\t}\n\tconst para = node['m:oMathPara'];\n\tif (para) {\n\t\tconst paraNode = Array.isArray(para) ? (para[0] as OmmlNode) : (para as OmmlNode);\n\t\tif (paraNode['m:oMath']) {\n\t\t\treturn ensureArray(paraNode['m:oMath']);\n\t\t}\n\t}\n\tif (node['m:r'] || node['m:f'] || node['m:rad'] || node['m:sSup'] || node['m:sSub']) {\n\t\treturn [node];\n\t}\n\treturn [];\n}\n\n// ── Public API ──────────────────────────────────────────────────────────────\n\n/**\n * Convert an OMML XML node (from fast-xml-parser) into a MathML string.\n *\n * Accepts the object at the `<a14:m>` / `<m:oMathPara>` level or directly at\n * `<m:oMath>`. Returns a `<math>` element string, or empty string if the input\n * is empty / unparseable.\n */\nexport function convertOmmlToMathMl(ommlNode: OmmlNode): string {\n\tif (!ommlNode || typeof ommlNode !== 'object') {\n\t\treturn '';\n\t}\n\n\tconst oMaths = findOmathRoots(ommlNode);\n\tif (oMaths.length === 0) {\n\t\treturn '';\n\t}\n\n\tconst innerParts = oMaths.map((om) => convertChildren(om));\n\tconst inner = innerParts.join('');\n\tif (inner.length === 0) {\n\t\treturn '';\n\t}\n\n\treturn `<math xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"inline\">${inner}</math>`;\n}\n\n/**\n * Convenience wrapper used by the Angular viewer: `ommlToMathml(omml)`.\n *\n * Accepts the parsed OMML object (the shape stored on\n * {@link TextSegment.equationXml}) or a raw OMML markup string. String inputs\n * are not re-parsed here (no XML parser dependency in this pure module) — they\n * are returned wrapped so callers can still surface raw markup if needed.\n */\nexport function ommlToMathml(omml: Record<string, unknown> | string | undefined): string {\n\tif (omml === undefined || typeof omml === 'string') {\n\t\t// A bare string cannot be meaningfully walked without a parser; the\n\t\t// viewer always passes the parsed object. Return empty to stay pure.\n\t\treturn '';\n\t}\n\t// `equationXml` is typed as `Record<string, unknown>` on the core segment;\n\t// the converter walks it as an `OmmlNode` (core's recursive `XmlObject`).\n\treturn convertOmmlToMathMl(omml as OmmlNode);\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport type { SafeHtml } from '@angular/platform-browser';\n\nimport { ommlToMathml } from './omml-to-mathml';\n\n/**\n * EquationRendererComponent — Angular port of the Vue `EquationRenderer.vue`\n * (single-equation variant).\n *\n * Renders one parsed OMML equation tree as inline MathML via Angular's\n * `DomSanitizer.bypassSecurityTrustHtml`, which is required because Angular's\n * default HTML sanitizer strips `<math>` namespace markup.\n *\n * The wrapper is an inline-block `<span>` so the component flows inside a text\n * paragraph in place of a regular text run. When an equation number is\n * supplied the layout mirrors the Vue numbered-equation row: centred equation\n * with the number right-aligned (flex row, width 100%).\n *\n * Pure conversion logic lives in `omml-to-mathml.ts` (Angular-free) so it can\n * be unit-tested without TestBed.\n */\n@Component({\n\tselector: 'pptx-equation-renderer',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\timports: [],\n\ttemplate: `\n\t\t@if (equationNumber()) {\n\t\t\t<span class=\"pptx-ng-equation-numbered\">\n\t\t\t\t<span class=\"pptx-ng-equation-number-spacer\" aria-hidden=\"true\"\n\t\t\t\t\t>({{ equationNumber() }})</span\n\t\t\t\t>\n\t\t\t\t<span class=\"pptx-ng-equation pptx-ng-equation-centered\" [innerHTML]=\"safeMathml()\"></span>\n\t\t\t\t<span class=\"pptx-ng-equation-number\">({{ equationNumber() }})</span>\n\t\t\t</span>\n\t\t} @else {\n\t\t\t<span class=\"pptx-ng-equation\" [innerHTML]=\"safeMathml()\"></span>\n\t\t}\n\t`,\n\tstyles: [\n\t\t`\n\t\t\t:host {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tvertical-align: middle;\n\t\t\t}\n\n\t\t\t.pptx-ng-equation {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tvertical-align: middle;\n\t\t\t\tfont-family: 'Cambria Math', 'STIX Two Math', serif;\n\t\t\t}\n\n\t\t\t.pptx-ng-equation-numbered {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.pptx-ng-equation-centered {\n\t\t\t\tflex: 1;\n\t\t\t\ttext-align: center;\n\t\t\t}\n\n\t\t\t.pptx-ng-equation-number-spacer {\n\t\t\t\tvisibility: hidden;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.pptx-ng-equation-number {\n\t\t\t\twhite-space: nowrap;\n\t\t\t\tfont-family: 'Cambria Math', 'STIX Two Math', serif;\n\t\t\t}\n\t\t`,\n\t],\n})\nexport class EquationRendererComponent {\n\t/** Parsed OMML equation tree (the `equationXml` field of a `TextSegment`). */\n\treadonly equationXml = input.required<Record<string, unknown>>();\n\n\t/** Optional equation number shown right-aligned, e.g. `\"1\"` → `(1)`. */\n\treadonly equationNumber = input<string | undefined>(undefined);\n\n\tprivate readonly sanitizer = inject(DomSanitizer);\n\n\t/**\n\t * Converts the OMML input to MathML and wraps it in a `SafeHtml` value so\n\t * Angular's `[innerHTML]` binding renders the `<math>` markup instead of\n\t * stripping it.\n\t */\n\treadonly safeMathml = computed<SafeHtml>(() =>\n\t\tthis.sanitizer.bypassSecurityTrustHtml(ommlToMathml(this.equationXml())),\n\t);\n}\n","/**\n * Hyperlink resolution + URL safety for the viewer.\n *\n * Viewer-first subset of the React `hyperlink-security.ts`: enough to render\n * safe `<a href>` links on text runs. Internal PowerPoint actions\n * (`ppaction://…` slide jumps) and unsafe protocols are not turned into\n * navigable hrefs here — slide-jump wiring is a follow-up (see PORTING.md).\n */\n\n// Blocked URL schemes — rendering these as an href would enable XSS / code\n// injection. Built without the literal `javascript:` token to satisfy lint.\nconst BLOCKED_PROTOCOLS = [`${'javascript'}:`, 'data:', 'vbscript:', 'mhtml:'];\n\n/**\n * Whether a URL is safe to expose as an `href`. Blocks `javascript:`,\n * `data:`, `vbscript:`, and `mhtml:` (case- and whitespace-bypass resistant);\n * allows `http(s)`, `mailto:`, `tel:`, `ftp:`, and relative URLs.\n */\nexport function isUrlSafe(url: string | undefined): boolean {\n\tif (!url || typeof url !== 'string') {\n\t\treturn false;\n\t}\n\tconst trimmed = url.trim();\n\tif (trimmed.length === 0) {\n\t\treturn false;\n\t}\n\t// Lowercase + strip whitespace / zero-width / NUL chars that could bypass\n\t// a naive prefix check (e.g. \"javascript:\").\n\tconst stripped = trimmed\n\t\t.toLowerCase()\n\t\t.replace(/[\\s]/gu, '')\n\t\t.replace(//gu, '')\n\t\t.replace(//gu, '')\n\t\t.split(String.fromCharCode(0))\n\t\t.join('');\n\n\treturn !BLOCKED_PROTOCOLS.some((protocol) => stripped.startsWith(protocol));\n}\n\n/** Whether a URL is a PowerPoint internal action (`ppaction://…`). */\nexport function isPpactionUrl(url: string | undefined): boolean {\n\treturn typeof url === 'string' && url.toLowerCase().startsWith('ppaction://');\n}\n\n/**\n * Resolve a raw hyperlink value to a renderable, safe `href`, or `undefined`\n * when it should not be a plain link (empty, unsafe, or an internal\n * `ppaction://` slide jump).\n */\nexport function resolveHyperlinkHref(url: string | undefined): string | undefined {\n\tif (!url || isPpactionUrl(url) || !isUrlSafe(url)) {\n\t\treturn undefined;\n\t}\n\treturn url.trim();\n}\n","import type { InkPptxElement, PptxElement } from 'pptx-viewer-core';\nimport { isInkElement } from 'pptx-viewer-core';\n\nimport { DEFAULT_STROKE_COLOR } from './constants';\nimport type { StyleMap } from './element-style';\nimport { getContainerStyle } from './element-style';\n\n/**\n * Pure helpers for `InkRendererComponent`.\n *\n * All functions are framework-agnostic (no Angular dependency) so they can be\n * unit-tested without TestBed, following the same pattern as\n * `connector-path.ts`.\n */\n\n/** Resolved per-stroke data used to render a single `<path>`. */\nexport interface InkStroke {\n\td: string;\n\tcolor: string;\n\twidth: number;\n\topacity: number;\n}\n\n/**\n * Narrow `element` to `InkPptxElement` and return the resolved per-stroke\n * array, or an empty array when the element is not an ink element.\n */\nexport function buildInkStrokes(element: PptxElement): InkStroke[] {\n\tif (!isInkElement(element)) {\n\t\treturn [];\n\t}\n\tconst el: InkPptxElement = element;\n\treturn (el.inkPaths ?? []).map((d, i) => ({\n\t\td,\n\t\tcolor: el.inkColors?.[i] ?? DEFAULT_STROKE_COLOR,\n\t\twidth: el.inkWidths?.[i] ?? 1,\n\t\topacity: el.inkOpacities?.[i] ?? 1,\n\t}));\n}\n\n/** Minimum SVG viewport dimension (clamp to ≥ 1 to avoid degenerate viewBox). */\nexport function inkViewBox(element: PptxElement): string {\n\tconst w = Math.max(element.width, 1);\n\tconst h = Math.max(element.height, 1);\n\treturn `0 0 ${w} ${h}`;\n}\n\n/** Wrapper `[ngStyle]`-compatible style for the ink container `<div>`. */\nexport function buildInkContainerStyle(element: PptxElement, zIndex: number): StyleMap {\n\treturn getContainerStyle(element, zIndex);\n}\n","import { NgStyle } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { PptxElement } from 'pptx-viewer-core';\n\nimport type { StyleMap } from './element-style';\nimport { buildInkContainerStyle, buildInkStrokes, inkViewBox } from './ink-renderer-helpers';\nimport type { InkStroke } from './ink-renderer-helpers';\n\n/**\n * InkRendererComponent — Angular port of the Vue `InkRenderer.vue`\n * (and the React `renderInk` inside `InkGroupRenderers.tsx`), viewer-first\n * subset.\n *\n * Renders freehand ink strokes (`InkPptxElement.inkPaths`) as inline SVG\n * `<path>` elements inside the element's bounding box, with per-stroke colour,\n * width, and opacity resolved from the parallel `inkColors`/`inkWidths`/\n * `inkOpacities` arrays.\n *\n * Not ported (TODO, see PORTING.md): pressure-sensitive variable-width strokes\n * (`inkPointPressures`), ink replay animation, and the highlighter/eraser tool\n * blend modes. These all degrade gracefully to plain constant-width strokes.\n *\n * All non-trivial pure computation lives in `ink-renderer-helpers.ts` (no\n * Angular dependency) so it can be unit-tested without TestBed.\n */\n@Component({\n\tselector: 'pptx-ink-renderer',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\timports: [NgStyle],\n\ttemplate: `\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-ink\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t>\n\t\t\t@if (strokes().length > 0) {\n\t\t\t\t<svg\n\t\t\t\t\tclass=\"pptx-ng-ink-svg\"\n\t\t\t\t\t[attr.viewBox]=\"viewBox()\"\n\t\t\t\t\tpreserveAspectRatio=\"none\"\n\t\t\t\t\tstyle=\"width:100%;height:100%;pointer-events:none;display:block\"\n\t\t\t\t>\n\t\t\t\t\t@for (stroke of strokes(); track $index) {\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t[attr.d]=\"stroke.d\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t[attr.stroke]=\"stroke.color\"\n\t\t\t\t\t\t\t[attr.stroke-width]=\"stroke.width\"\n\t\t\t\t\t\t\t[attr.stroke-opacity]=\"stroke.opacity\"\n\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\tvector-effect=\"non-scaling-stroke\"\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</div>\n\t`,\n})\nexport class InkRendererComponent {\n\treadonly element = input.required<PptxElement>();\n\treadonly zIndex = input<number>(0);\n\treadonly mediaDataUrls = input<Map<string, string>>(new Map());\n\n\treadonly containerStyle = computed<StyleMap>(() =>\n\t\tbuildInkContainerStyle(this.element(), this.zIndex()),\n\t);\n\n\treadonly strokes = computed<InkStroke[]>(() => buildInkStrokes(this.element()));\n\n\treadonly viewBox = computed<string>(() => inkViewBox(this.element()));\n}\n","import type { Model3DPptxElement, PptxElement } from 'pptx-viewer-core';\n\nimport type { StyleMap } from './element-style';\nimport { getContainerStyle } from './element-style';\n\n/**\n * Pure helpers for `Model3DRendererComponent`.\n *\n * All functions are framework-agnostic (no Angular dependency) so they can be\n * unit-tested without TestBed, following the same pattern as\n * `connector-path.ts`.\n */\n\n/** Narrowed view-model derived from a `Model3DPptxElement`. */\nexport interface Model3DViewModel {\n\t/** Resolved model element, or undefined when the element is not a model3d. */\n\treadonly model: Model3DPptxElement | undefined;\n\t/**\n\t * Poster image src: `posterImage` is preferred over the raster `imageData`\n\t * fallback (mirrors the React `PosterFallback` and the Vue port).\n\t */\n\treadonly posterSrc: string | undefined;\n}\n\n/**\n * Narrow `element` to `Model3DPptxElement` and derive the poster source.\n * Uses the type discriminant directly (`el.type === 'model3d'`) to avoid an\n * `isModel3DElement` guard that does not exist in `pptx-viewer-core` exports.\n */\nexport function buildModel3DViewModel(element: PptxElement): Model3DViewModel {\n\tif (element.type !== 'model3d') {\n\t\treturn { model: undefined, posterSrc: undefined };\n\t}\n\tconst model: Model3DPptxElement = element;\n\tconst posterSrc = model.posterImage ?? model.imageData;\n\treturn { model, posterSrc };\n}\n\n/** Wrapper `[ngStyle]`-compatible style for the model3d container `<div>`. */\nexport function buildModel3DContainerStyle(element: PptxElement, zIndex: number): StyleMap {\n\treturn getContainerStyle(element, zIndex);\n}\n","import { NgStyle } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { PptxElement } from 'pptx-viewer-core';\n\nimport type { StyleMap } from './element-style';\nimport { buildModel3DContainerStyle, buildModel3DViewModel } from './model3d-renderer-helpers';\nimport type { Model3DViewModel } from './model3d-renderer-helpers';\n\n/**\n * Model3DRendererComponent — Angular port of the Vue `Model3DRenderer.vue`\n * (and the React `Model3DRenderer` / `PosterFallback`), poster-only subset.\n *\n * Interactive 3D rendering (three.js) is intentionally OUT OF SCOPE for the\n * Angular port — see PORTING.md. This component always renders the\n * poster/preview image (`posterImage`, falling back to `imageData`); when\n * neither exists it draws a labelled \"3D Model\" placeholder, exactly like the\n * React poster fallback.\n *\n * All non-trivial pure computation lives in `model3d-renderer-helpers.ts` (no\n * Angular dependency) so it can be unit-tested without TestBed.\n */\n@Component({\n\tselector: 'pptx-model3d-renderer',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\timports: [NgStyle],\n\ttemplate: `\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-model3d\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t>\n\t\t\t@if (vm().posterSrc) {\n\t\t\t\t<img\n\t\t\t\t\t[src]=\"vm().posterSrc\"\n\t\t\t\t\talt=\"3D Model\"\n\t\t\t\t\tdraggable=\"false\"\n\t\t\t\t\tstyle=\"width:100%;height:100%;object-fit:contain;pointer-events:none;user-select:none;display:block\"\n\t\t\t\t/>\n\t\t\t} @else {\n\t\t\t\t<div\n\t\t\t\t\tstyle=\"width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:11px;color:#9ca3af;background-color:#f9fafb;border:1px dashed #e5e7eb;border-radius:4px;box-sizing:border-box\"\n\t\t\t\t>\n\t\t\t\t\t<svg\n\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\twidth=\"24\"\n\t\t\t\t\t\theight=\"24\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\tstyle=\"margin-bottom:4px;color:#d1d5db\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\td=\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<polyline points=\"3.27 6.96 12 12.01 20.73 6.96\" />\n\t\t\t\t\t\t<line x1=\"12\" y1=\"22.08\" x2=\"12\" y2=\"12\" />\n\t\t\t\t\t</svg>\n\t\t\t\t\t<span>3D Model</span>\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t`,\n})\nexport class Model3DRendererComponent {\n\treadonly element = input.required<PptxElement>();\n\treadonly zIndex = input<number>(0);\n\treadonly mediaDataUrls = input<Map<string, string>>(new Map());\n\n\treadonly containerStyle = computed<StyleMap>(() =>\n\t\tbuildModel3DContainerStyle(this.element(), this.zIndex()),\n\t);\n\n\treadonly vm = computed<Model3DViewModel>(() => buildModel3DViewModel(this.element()));\n}\n","/**\n * Pure, framework-agnostic helpers for OLE renderer.\n *\n * Ported from:\n * - packages/react/src/viewer/components/elements/InkGroupRenderers.tsx\n * (resolveOleType, getOleTypeColor, getOleTypeLabel, getOleAriaLabel)\n * - packages/vue/src/viewer/components/OleRenderer.vue\n * (placeholder style, badge label, display name)\n *\n * All functions are pure (no Angular dependencies) so they can be unit-tested\n * with plain vitest without TestBed or the Angular compiler.\n */\nimport type { OlePptxElement } from 'pptx-viewer-core';\n\nimport type { StyleMap } from './element-style';\n\n// ==========================================================================\n// Resolved OLE application type\n// ==========================================================================\n\n/**\n * Resolved OLE application type, narrowed from the raw `OleObjectType` union.\n *\n * `package` and `unknown` from the core type both collapse to `'unknown'` here\n * so that every branch is guaranteed to have a colour and label.\n */\nexport type ResolvedOleType = 'excel' | 'word' | 'pdf' | 'visio' | 'mathtype' | 'unknown';\n\n// ==========================================================================\n// Type resolution\n// ==========================================================================\n\n/**\n * Resolve the OLE application type from `oleObjectType`, falling back to a\n * case-insensitive substring match on `oleProgId`.\n *\n * Mirrors `resolveOleType` in InkGroupRenderers.tsx and the Vue `oleType`\n * computed property.\n */\nexport function resolveOleType(el: OlePptxElement): ResolvedOleType {\n\tconst type = el.oleObjectType;\n\tif (type && type !== 'package' && type !== 'unknown') {\n\t\t// All non-fallback discriminants map directly.\n\t\treturn type as ResolvedOleType;\n\t}\n\tconst progId = el.oleProgId?.toLowerCase() ?? '';\n\tif (progId.includes('excel')) {\n\t\treturn 'excel';\n\t}\n\tif (progId.includes('word')) {\n\t\treturn 'word';\n\t}\n\tif (progId.includes('acroexch') || progId.includes('acrobat') || progId.includes('pdf')) {\n\t\treturn 'pdf';\n\t}\n\tif (progId.includes('visio')) {\n\t\treturn 'visio';\n\t}\n\tif (progId.includes('equation') || progId.includes('mathtype')) {\n\t\treturn 'mathtype';\n\t}\n\treturn 'unknown';\n}\n\n// ==========================================================================\n// Type → colour / label\n// ==========================================================================\n\n/** Brand colour per OLE application type, mirroring the React and Vue ports. */\nconst TYPE_COLORS: Record<ResolvedOleType, string> = {\n\texcel: '#217346',\n\tword: '#2B579A',\n\tpdf: '#D4272E',\n\tvisio: '#3955A3',\n\tmathtype: '#7B2D8E',\n\tunknown: '#666666',\n};\n\n/** Human-readable label per OLE application type. */\nconst TYPE_LABELS: Record<ResolvedOleType, string> = {\n\texcel: 'Excel Spreadsheet',\n\tword: 'Word Document',\n\tpdf: 'PDF Document',\n\tvisio: 'Visio Diagram',\n\tmathtype: 'Math Equation',\n\tunknown: 'Embedded Object',\n};\n\n/** Return the brand hex colour for a resolved OLE type. */\nexport function getOleTypeColor(type: ResolvedOleType): string {\n\treturn TYPE_COLORS[type];\n}\n\n/** Return the human-readable label for a resolved OLE type. */\nexport function getOleTypeLabel(type: ResolvedOleType): string {\n\treturn TYPE_LABELS[type];\n}\n\n// ==========================================================================\n// Aria label\n// ==========================================================================\n\n/**\n * Build the accessible label for an OLE element.\n *\n * - If `fileName` is present: `\"<TypeLabel>: <fileName>\"` (e.g. `\"Excel Spreadsheet: budget.xlsx\"`)\n * - Otherwise: just the type label (e.g. `\"Embedded Object\"`)\n */\nexport function getOleAriaLabel(el: OlePptxElement): string {\n\tconst oleType = resolveOleType(el);\n\tconst typeLabel = getOleTypeLabel(oleType);\n\treturn el.fileName ? `${typeLabel}: ${el.fileName}` : typeLabel;\n}\n\n// ==========================================================================\n// Badge label\n// ==========================================================================\n\n/**\n * Short uppercase badge text shown over the preview image.\n *\n * Returns `'OLE'` for the unknown type, otherwise the type in upper-case\n * (e.g. `'EXCEL'`, `'PDF'`).\n */\nexport function getOleBadgeLabel(type: ResolvedOleType): string {\n\treturn type === 'unknown' ? 'OLE' : type.toUpperCase();\n}\n\n// ==========================================================================\n// Display name (file name or type label fallback)\n// ==========================================================================\n\n/**\n * The primary display name shown in the placeholder.\n *\n * Prefers `el.fileName`; falls back to the resolved type label.\n */\nexport function getOleDisplayName(el: OlePptxElement): string {\n\tconst typeLabel = getOleTypeLabel(resolveOleType(el));\n\treturn el.fileName ?? typeLabel;\n}\n\n// ==========================================================================\n// Placeholder style\n// ==========================================================================\n\n/**\n * Compute the border + background style for the type-specific placeholder box.\n *\n * Uses the brand colour at 20% opacity for the border and 5% for the fill,\n * matching the Vue port's `${color}33` / `${color}0d` hex-alpha trick.\n */\nexport function getPlaceholderStyle(type: ResolvedOleType): StyleMap {\n\tconst color = getOleTypeColor(type);\n\treturn {\n\t\tborder: `2px solid ${color}33`,\n\t\t'border-radius': '6px',\n\t\t'background-color': `${color}0d`,\n\t};\n}\n","import { NgStyle } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { OlePptxElement, PptxElement } from 'pptx-viewer-core';\n\nimport { getContainerStyle } from './element-style';\nimport type { StyleMap } from './element-style';\nimport {\n\tgetOleAriaLabel,\n\tgetOleBadgeLabel,\n\tgetOleDisplayName,\n\tgetOleTypeColor,\n\tgetOleTypeLabel,\n\tgetPlaceholderStyle,\n\tresolveOleType,\n} from './ole-renderer-helpers';\nimport type { ResolvedOleType } from './ole-renderer-helpers';\n\n/**\n * OleRendererComponent — Angular port of the React `renderOleElement`\n * (packages/react/src/viewer/components/elements/InkGroupRenderers.tsx) and\n * the Vue `OleRenderer.vue`.\n *\n * Renders an embedded OLE object (`OlePptxElement`). When a decoded preview\n * image is present (`previewImageData`) it is shown full-size with a small\n * type-badge overlay; otherwise a type-specific icon + label placeholder box\n * is drawn, mirroring the React / Vue fallback.\n *\n * Pure helpers (type resolution, colour / label maps, placeholder style) live\n * in `ole-renderer-helpers.ts` so they can be unit-tested without TestBed.\n *\n * Double-click-to-open and OLE extraction are not ported (viewer-only).\n */\n@Component({\n\tselector: 'pptx-ole-renderer',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\timports: [NgStyle],\n\ttemplate: `\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\trole=\"img\"\n\t\t\t[attr.aria-label]=\"ariaLabel()\"\n\t\t\ttitle=\"Embedded object\"\n\t\t>\n\t\t\t@if (previewSrc()) {\n\t\t\t\t<!-- Preview image with type-badge overlay -->\n\t\t\t\t<div class=\"pptx-ng-ole-preview\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t[src]=\"previewSrc()\"\n\t\t\t\t\t\t[attr.alt]=\"ariaLabel()\"\n\t\t\t\t\t\tclass=\"pptx-ng-ole-img\"\n\t\t\t\t\t\tdraggable=\"false\"\n\t\t\t\t\t/>\n\t\t\t\t\t<svg class=\"pptx-ng-ole-badge\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t\t<rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"3\" [attr.fill]=\"typeColor()\" />\n\t\t\t\t\t\t<text\n\t\t\t\t\t\t\tx=\"12\"\n\t\t\t\t\t\t\ty=\"16\"\n\t\t\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\t\t\tfill=\"white\"\n\t\t\t\t\t\t\t[attr.font-size]=\"badgeLabel().length > 4 ? 6 : 10\"\n\t\t\t\t\t\t\tfont-weight=\"bold\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ badgeLabel() }}\n\t\t\t\t\t\t</text>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t} @else {\n\t\t\t\t<!-- Type-specific placeholder box -->\n\t\t\t\t<div class=\"pptx-ng-ole-placeholder\" [ngStyle]=\"placeholderStyle()\">\n\t\t\t\t\t@switch (oleType()) {\n\t\t\t\t\t\t@case ('excel') {\n\t\t\t\t\t\t\t<svg width=\"36\" height=\"36\" viewBox=\"0 0 24 24\" fill=\"none\">\n\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\tx=\"3\"\n\t\t\t\t\t\t\t\t\ty=\"3\"\n\t\t\t\t\t\t\t\t\twidth=\"18\"\n\t\t\t\t\t\t\t\t\theight=\"18\"\n\t\t\t\t\t\t\t\t\trx=\"2\"\n\t\t\t\t\t\t\t\t\t[attr.stroke]=\"typeColor()\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\" [attr.stroke]=\"typeColor()\" stroke-width=\"1\" />\n\t\t\t\t\t\t\t\t<line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\" [attr.stroke]=\"typeColor()\" stroke-width=\"1\" />\n\t\t\t\t\t\t\t\t<line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\" [attr.stroke]=\"typeColor()\" stroke-width=\"1\" />\n\t\t\t\t\t\t\t\t<line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\" [attr.stroke]=\"typeColor()\" stroke-width=\"1\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@case ('word') {\n\t\t\t\t\t\t\t<svg width=\"36\" height=\"36\" viewBox=\"0 0 24 24\" fill=\"none\">\n\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\tx=\"4\"\n\t\t\t\t\t\t\t\t\ty=\"2\"\n\t\t\t\t\t\t\t\t\twidth=\"16\"\n\t\t\t\t\t\t\t\t\theight=\"20\"\n\t\t\t\t\t\t\t\t\trx=\"2\"\n\t\t\t\t\t\t\t\t\t[attr.stroke]=\"typeColor()\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\t\tx1=\"7\"\n\t\t\t\t\t\t\t\t\ty1=\"7\"\n\t\t\t\t\t\t\t\t\tx2=\"17\"\n\t\t\t\t\t\t\t\t\ty2=\"7\"\n\t\t\t\t\t\t\t\t\t[attr.stroke]=\"typeColor()\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\t\tx1=\"7\"\n\t\t\t\t\t\t\t\t\ty1=\"11\"\n\t\t\t\t\t\t\t\t\tx2=\"17\"\n\t\t\t\t\t\t\t\t\ty2=\"11\"\n\t\t\t\t\t\t\t\t\t[attr.stroke]=\"typeColor()\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\t\tx1=\"7\"\n\t\t\t\t\t\t\t\t\ty1=\"15\"\n\t\t\t\t\t\t\t\t\tx2=\"13\"\n\t\t\t\t\t\t\t\t\ty2=\"15\"\n\t\t\t\t\t\t\t\t\t[attr.stroke]=\"typeColor()\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@case ('pdf') {\n\t\t\t\t\t\t\t<svg width=\"36\" height=\"36\" viewBox=\"0 0 24 24\" fill=\"none\">\n\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\tx=\"4\"\n\t\t\t\t\t\t\t\t\ty=\"2\"\n\t\t\t\t\t\t\t\t\twidth=\"16\"\n\t\t\t\t\t\t\t\t\theight=\"20\"\n\t\t\t\t\t\t\t\t\trx=\"2\"\n\t\t\t\t\t\t\t\t\t[attr.stroke]=\"typeColor()\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t\t\tx=\"12\"\n\t\t\t\t\t\t\t\t\ty=\"14\"\n\t\t\t\t\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\t\t\t\t\t[attr.fill]=\"typeColor()\"\n\t\t\t\t\t\t\t\t\tfont-size=\"7\"\n\t\t\t\t\t\t\t\t\tfont-weight=\"bold\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tPDF\n\t\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@case ('visio') {\n\t\t\t\t\t\t\t<svg width=\"36\" height=\"36\" viewBox=\"0 0 24 24\" fill=\"none\">\n\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\tx=\"8\"\n\t\t\t\t\t\t\t\t\ty=\"2\"\n\t\t\t\t\t\t\t\t\twidth=\"8\"\n\t\t\t\t\t\t\t\t\theight=\"5\"\n\t\t\t\t\t\t\t\t\trx=\"1\"\n\t\t\t\t\t\t\t\t\t[attr.stroke]=\"typeColor()\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\t\tx1=\"12\"\n\t\t\t\t\t\t\t\t\ty1=\"7\"\n\t\t\t\t\t\t\t\t\tx2=\"12\"\n\t\t\t\t\t\t\t\t\ty2=\"10\"\n\t\t\t\t\t\t\t\t\t[attr.stroke]=\"typeColor()\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\t\tx1=\"6\"\n\t\t\t\t\t\t\t\t\ty1=\"10\"\n\t\t\t\t\t\t\t\t\tx2=\"18\"\n\t\t\t\t\t\t\t\t\ty2=\"10\"\n\t\t\t\t\t\t\t\t\t[attr.stroke]=\"typeColor()\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\t\tx1=\"6\"\n\t\t\t\t\t\t\t\t\ty1=\"10\"\n\t\t\t\t\t\t\t\t\tx2=\"6\"\n\t\t\t\t\t\t\t\t\ty2=\"13\"\n\t\t\t\t\t\t\t\t\t[attr.stroke]=\"typeColor()\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\t\tx1=\"18\"\n\t\t\t\t\t\t\t\t\ty1=\"10\"\n\t\t\t\t\t\t\t\t\tx2=\"18\"\n\t\t\t\t\t\t\t\t\ty2=\"13\"\n\t\t\t\t\t\t\t\t\t[attr.stroke]=\"typeColor()\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\tx=\"2\"\n\t\t\t\t\t\t\t\t\ty=\"13\"\n\t\t\t\t\t\t\t\t\twidth=\"8\"\n\t\t\t\t\t\t\t\t\theight=\"5\"\n\t\t\t\t\t\t\t\t\trx=\"1\"\n\t\t\t\t\t\t\t\t\t[attr.stroke]=\"typeColor()\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\tx=\"14\"\n\t\t\t\t\t\t\t\t\ty=\"13\"\n\t\t\t\t\t\t\t\t\twidth=\"8\"\n\t\t\t\t\t\t\t\t\theight=\"5\"\n\t\t\t\t\t\t\t\t\trx=\"1\"\n\t\t\t\t\t\t\t\t\t[attr.stroke]=\"typeColor()\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@case ('mathtype') {\n\t\t\t\t\t\t\t<svg width=\"36\" height=\"36\" viewBox=\"0 0 24 24\" fill=\"none\">\n\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\tx=\"2\"\n\t\t\t\t\t\t\t\t\ty=\"4\"\n\t\t\t\t\t\t\t\t\twidth=\"20\"\n\t\t\t\t\t\t\t\t\theight=\"16\"\n\t\t\t\t\t\t\t\t\trx=\"2\"\n\t\t\t\t\t\t\t\t\t[attr.stroke]=\"typeColor()\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t\t\tx=\"12\"\n\t\t\t\t\t\t\t\t\ty=\"15\"\n\t\t\t\t\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\t\t\t\t\t[attr.fill]=\"typeColor()\"\n\t\t\t\t\t\t\t\t\tfont-size=\"9\"\n\t\t\t\t\t\t\t\t\tfont-style=\"italic\"\n\t\t\t\t\t\t\t\t\tfont-weight=\"bold\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tf(x)\n\t\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@default {\n\t\t\t\t\t\t\t<svg width=\"36\" height=\"36\" viewBox=\"0 0 24 24\" fill=\"none\">\n\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\tx=\"2\"\n\t\t\t\t\t\t\t\t\ty=\"5\"\n\t\t\t\t\t\t\t\t\twidth=\"9\"\n\t\t\t\t\t\t\t\t\theight=\"7\"\n\t\t\t\t\t\t\t\t\trx=\"1.5\"\n\t\t\t\t\t\t\t\t\t[attr.stroke]=\"typeColor()\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\tx=\"13\"\n\t\t\t\t\t\t\t\t\ty=\"12\"\n\t\t\t\t\t\t\t\t\twidth=\"9\"\n\t\t\t\t\t\t\t\t\theight=\"7\"\n\t\t\t\t\t\t\t\t\trx=\"1.5\"\n\t\t\t\t\t\t\t\t\t[attr.stroke]=\"typeColor()\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\t\tx1=\"11\"\n\t\t\t\t\t\t\t\t\ty1=\"8.5\"\n\t\t\t\t\t\t\t\t\tx2=\"13\"\n\t\t\t\t\t\t\t\t\ty2=\"15.5\"\n\t\t\t\t\t\t\t\t\t[attr.stroke]=\"typeColor()\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t<span class=\"pptx-ng-ole-name\" [ngStyle]=\"{ color: typeColor() }\">{{\n\t\t\t\t\t\tdisplayName()\n\t\t\t\t\t}}</span>\n\t\t\t\t\t@if (fileName()) {\n\t\t\t\t\t\t<span class=\"pptx-ng-ole-sublabel\">{{ typeLabel() }}</span>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t`,\n\tstyles: [\n\t\t`\n\t\t\t.pptx-ng-ole-preview {\n\t\t\t\tposition: relative;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t}\n\t\t\t.pptx-ng-ole-img {\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tobject-fit: contain;\n\t\t\t\tpointer-events: none;\n\t\t\t\tuser-select: none;\n\t\t\t\tdisplay: block;\n\t\t\t}\n\t\t\t.pptx-ng-ole-badge {\n\t\t\t\tposition: absolute;\n\t\t\t\tbottom: 4px;\n\t\t\t\tright: 4px;\n\t\t\t\tz-index: 10;\n\t\t\t}\n\t\t\t.pptx-ng-ole-placeholder {\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tpointer-events: none;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t}\n\t\t\t.pptx-ng-ole-name {\n\t\t\t\tmargin-top: 8px;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: 500;\n\t\t\t\tmax-width: 90%;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\t\t\t.pptx-ng-ole-sublabel {\n\t\t\t\tmargin-top: 2px;\n\t\t\t\tfont-size: 10px;\n\t\t\t\tcolor: rgba(0, 0, 0, 0.45);\n\t\t\t\tmax-width: 90%;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\t\t`,\n\t],\n})\nexport class OleRendererComponent {\n\t/** The element to render. Must be `type === 'ole'`. */\n\treadonly element = input.required<PptxElement>();\n\n\treadonly zIndex = input<number>(0);\n\n\t/** Absolute container positioning + dimensions. */\n\treadonly containerStyle = computed<StyleMap>(() =>\n\t\tgetContainerStyle(this.element(), this.zIndex()),\n\t);\n\n\t/** Narrowed OLE element — undefined when the input is not `type === 'ole'`. */\n\tprivate readonly ole = computed<OlePptxElement | undefined>(() => {\n\t\tconst el = this.element();\n\t\treturn el.type === 'ole' ? el : undefined;\n\t});\n\n\t/** Resolved application type (excel / word / pdf / visio / mathtype / unknown). */\n\treadonly oleType = computed<ResolvedOleType>(() => {\n\t\tconst el = this.ole();\n\t\treturn el ? resolveOleType(el) : 'unknown';\n\t});\n\n\t/** Brand hex colour for the resolved type. */\n\treadonly typeColor = computed<string>(() => getOleTypeColor(this.oleType()));\n\n\t/** Human-readable type label (e.g. \"Excel Spreadsheet\"). */\n\treadonly typeLabel = computed<string>(() => getOleTypeLabel(this.oleType()));\n\n\t/** Short uppercase badge text shown over the preview image. */\n\treadonly badgeLabel = computed<string>(() => getOleBadgeLabel(this.oleType()));\n\n\t/** Preview image data-URL, or undefined to show the placeholder. */\n\treadonly previewSrc = computed<string | undefined>(() => this.ole()?.previewImageData);\n\n\t/** Original file name, if present. */\n\treadonly fileName = computed<string | undefined>(() => this.ole()?.fileName);\n\n\t/** Primary display name: file name if present, otherwise the type label. */\n\treadonly displayName = computed<string>(() => {\n\t\tconst el = this.ole();\n\t\treturn el ? getOleDisplayName(el) : getOleTypeLabel('unknown');\n\t});\n\n\t/** Accessible label for the role=\"img\" wrapper. */\n\treadonly ariaLabel = computed<string>(() => {\n\t\tconst el = this.ole();\n\t\treturn el ? getOleAriaLabel(el) : getOleTypeLabel('unknown');\n\t});\n\n\t/** Border + background style for the placeholder box. */\n\treadonly placeholderStyle = computed<StyleMap>(() => getPlaceholderStyle(this.oleType()));\n}\n","/**\n * Pure TypeScript SmartArt family layout engines.\n *\n * Computes node box positions for the four core SmartArt families so the\n * Angular `SmartArtRendererComponent` can lay out nodes when no explicit\n * drawing-shapes are present.\n *\n * No Angular imports — all exports are plain TypeScript so they can be\n * unit-tested with vitest without TestBed or the Angular compiler.\n *\n * Geometry ported from the React renderers:\n * packages/react/src/viewer/components/elements/smartart-layout-renderers.tsx\n * packages/react/src/viewer/components/elements/smartart-renderer-hierarchy.tsx\n * packages/react/src/viewer/utils/smartart-helpers.tsx\n */\nimport type { PptxSmartArtData, PptxSmartArtNode, SmartArtLayout } from 'pptx-viewer-core';\n\n// ==========================================================================\n// Public types\n// ==========================================================================\n\n/**\n * A positioned node box ready to be rendered as `<rect>` + `<text>` in an SVG.\n */\nexport interface PositionedNode {\n\t/** Original node id from `PptxSmartArtNode`. */\n\tid: string;\n\t/** Display text (may be truncated by the caller). */\n\ttext: string;\n\t/** Left edge (SVG user units). */\n\tx: number;\n\t/** Top edge (SVG user units). */\n\ty: number;\n\t/** Box width (SVG user units). */\n\tw: number;\n\t/** Box height (SVG user units). */\n\th: number;\n\t/**\n\t * Zero-based tree depth / band index.\n\t * For flat families (list, process, cycle) all nodes are at level 0.\n\t */\n\tlevel: number;\n\t/**\n\t * Node radius — only set for cycle nodes (rendered as `<circle>`).\n\t * When defined the caller should render a circle at (x + r, y + r) instead\n\t * of a rect.\n\t */\n\tr?: number;\n}\n\n/**\n * A connector segment rendered as `<line x1 y1 x2 y2 />` or SVG `<path>`.\n */\nexport interface ConnectorSegment {\n\tx1: number;\n\ty1: number;\n\tx2: number;\n\ty2: number;\n}\n\n/**\n * Result returned by `layoutSmartArtNodes`.\n */\nexport interface SmartArtLayoutResult {\n\tnodes: PositionedNode[];\n\tconnectors: ConnectorSegment[];\n}\n\n/**\n * Recognised SmartArt family classifiers returned by `resolveSmartArtFamily`.\n */\nexport type SmartArtFamily = 'list' | 'process' | 'cycle' | 'hierarchy';\n\n// ==========================================================================\n// Internal tree helpers (ported from smartart-helpers.tsx)\n// ==========================================================================\n\ninterface TreeNode {\n\tnode: PptxSmartArtNode;\n\tchildren: TreeNode[];\n}\n\n/** Build a forest from flat nodes using `parentId`. */\nfunction buildTree(nodes: PptxSmartArtNode[]): TreeNode[] {\n\tconst map = new Map<string, TreeNode>();\n\tfor (const n of nodes) {\n\t\tmap.set(n.id, { node: n, children: [] });\n\t}\n\tconst roots: TreeNode[] = [];\n\tfor (const n of nodes) {\n\t\tconst treeNode = map.get(n.id);\n\t\tif (!treeNode) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (n.parentId) {\n\t\t\tconst parent = map.get(n.parentId);\n\t\t\tif (parent) {\n\t\t\t\tparent.children.push(treeNode);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\troots.push(treeNode);\n\t}\n\treturn roots;\n}\n\n/** Measure total width (leaf-units) of a tree node. */\nfunction treeWidth(t: TreeNode): number {\n\tif (t.children.length === 0) {\n\t\treturn 1;\n\t}\n\treturn t.children.reduce((sum, c) => sum + treeWidth(c), 0);\n}\n\n/** Measure depth of a tree. */\nfunction treeDepth(t: TreeNode): number {\n\tif (t.children.length === 0) {\n\t\treturn 1;\n\t}\n\treturn 1 + Math.max(...t.children.map(treeDepth));\n}\n\n// ==========================================================================\n// Family classifier\n// ==========================================================================\n\n/** Named-layout → family mapping (ported from layoutToCategory in React). */\nconst LAYOUT_TO_FAMILY: Partial<Record<SmartArtLayout, SmartArtFamily>> = {\n\tbasicBlockList: 'list',\n\talternatingHexagons: 'list',\n\thorizontalBulletList: 'list',\n\tstackedList: 'list',\n\ttableList: 'list',\n\ttrapezoidList: 'list',\n\tverticalBlockList: 'list',\n\tgroupedList: 'list',\n\tpictureAccentList: 'list',\n\tpyramidList: 'list',\n\thorizontalPictureList: 'list',\n\tverticalChevronList: 'list',\n\n\tbasicChevronProcess: 'process',\n\tcontinuousBlockProcess: 'process',\n\tsegmentedProcess: 'process',\n\tupwardArrow: 'process',\n\tbasicTimeline: 'process',\n\tbendingProcess: 'process',\n\tstepDownProcess: 'process',\n\talternatingFlow: 'process',\n\tdescendingProcess: 'process',\n\taccentProcess: 'process',\n\n\tbasicCycle: 'cycle',\n\tbasicPie: 'cycle',\n\n\thierarchy: 'hierarchy',\n};\n\n/**\n * Classify `data` into one of the four core SmartArt families.\n *\n * Priority:\n * 1. `resolvedLayoutType` field (set by the core parser)\n * 2. Named `layout` preset via the LAYOUT_TO_FAMILY table\n * 3. Fallback: 'list'\n */\nexport function resolveSmartArtFamily(data: PptxSmartArtData): SmartArtFamily {\n\tconst resolved = data.resolvedLayoutType;\n\tif (\n\t\tresolved === 'list' ||\n\t\tresolved === 'process' ||\n\t\tresolved === 'cycle' ||\n\t\tresolved === 'hierarchy'\n\t) {\n\t\treturn resolved;\n\t}\n\tif (data.layout) {\n\t\tconst mapped = LAYOUT_TO_FAMILY[data.layout];\n\t\tif (mapped !== undefined) {\n\t\t\treturn mapped;\n\t\t}\n\t}\n\treturn 'list';\n}\n\n// ==========================================================================\n// Individual layout engines\n// ==========================================================================\n\n/**\n * List: vertical stack of rectangular bands, full width.\n *\n * Geometry mirrors `ListRenderer` from smartart-layout-renderers.tsx.\n */\nfunction layoutList(\n\tnodes: PptxSmartArtNode[],\n\twidth: number,\n\theight: number,\n): SmartArtLayoutResult {\n\tif (nodes.length === 0) {\n\t\treturn { nodes: [], connectors: [] };\n\t}\n\tconst pad = 8;\n\tconst gap = 4;\n\tconst usableH = height - pad * 2;\n\tconst itemH = (usableH - gap * (nodes.length - 1)) / nodes.length;\n\tconst itemW = width - pad * 2;\n\n\tconst positioned: PositionedNode[] = nodes.map((node, i) => ({\n\t\tid: node.id,\n\t\ttext: node.text,\n\t\tx: pad,\n\t\ty: pad + i * (itemH + gap),\n\t\tw: itemW,\n\t\th: itemH,\n\t\tlevel: 0,\n\t}));\n\n\treturn { nodes: positioned, connectors: [] };\n}\n\n/**\n * Process: horizontal row of chevron / arrow shapes.\n *\n * The chevron notch (`chevronDepth`) is embedded in the `x` / `w` values so\n * the caller can use the same bounding-box approach; the actual chevron polygon\n * is built at render time from these values.\n *\n * Geometry mirrors `ProcessRenderer` from smartart-layout-renderers.tsx.\n */\nfunction layoutProcess(\n\tnodes: PptxSmartArtNode[],\n\twidth: number,\n\theight: number,\n): SmartArtLayoutResult {\n\tif (nodes.length === 0) {\n\t\treturn { nodes: [], connectors: [] };\n\t}\n\tconst pad = 8;\n\tconst gap = 4;\n\tconst chevronDepth = Math.min(16, width * 0.04);\n\tconst usableW = width - pad * 2;\n\tconst itemW = (usableW - gap * (nodes.length - 1)) / nodes.length;\n\tconst itemH = Math.min(height - pad * 2, height * 0.6);\n\tconst yTop = (height - itemH) / 2;\n\n\tconst positioned: PositionedNode[] = nodes.map(\n\t\t(node, i) =>\n\t\t\t({\n\t\t\t\tid: node.id,\n\t\t\t\ttext: node.text,\n\t\t\t\tx: pad + i * (itemW + gap),\n\t\t\t\ty: yTop,\n\t\t\t\tw: itemW,\n\t\t\t\th: itemH,\n\t\t\t\tlevel: 0,\n\t\t\t\t/** Expose chevron depth so callers can build the polygon. */\n\t\t\t\tchevronDepth,\n\t\t\t}) as PositionedNode & { chevronDepth: number },\n\t);\n\n\treturn { nodes: positioned, connectors: [] };\n}\n\n/**\n * Cycle: nodes placed evenly around a circle.\n *\n * Each node is returned as a circle (`r` is set); connectors are curved arcs\n * approximated here as straight-line `ConnectorSegment`s connecting the centre\n * of consecutive node circles.\n *\n * Geometry mirrors `CycleRenderer` from smartart-layout-renderers.tsx.\n */\nfunction layoutCycle(\n\tnodes: PptxSmartArtNode[],\n\twidth: number,\n\theight: number,\n): SmartArtLayoutResult {\n\tif (nodes.length === 0) {\n\t\treturn { nodes: [], connectors: [] };\n\t}\n\tconst size = Math.min(width, height);\n\tconst cx = width / 2;\n\tconst cy = height / 2;\n\tconst radius = size * 0.35;\n\tconst nodeR = Math.max(size * 0.06, Math.min(size * 0.12, 200 / nodes.length));\n\tconst TWO_PI = Math.PI * 2;\n\tconst HALF_PI = Math.PI / 2;\n\n\tconst positioned: PositionedNode[] = nodes.map((node, i) => {\n\t\tconst angle = (i / nodes.length) * TWO_PI - HALF_PI;\n\t\tconst nx = cx + radius * Math.cos(angle);\n\t\tconst ny = cy + radius * Math.sin(angle);\n\t\treturn {\n\t\t\tid: node.id,\n\t\t\ttext: node.text,\n\t\t\t/** Top-left of bounding box so x+r, y+r is the circle centre. */\n\t\t\tx: nx - nodeR,\n\t\t\ty: ny - nodeR,\n\t\t\tw: nodeR * 2,\n\t\t\th: nodeR * 2,\n\t\t\tlevel: 0,\n\t\t\tr: nodeR,\n\t\t};\n\t});\n\n\t// Straight-line approximations of the inter-node arcs.\n\tconst connectors: ConnectorSegment[] = nodes.map((_node, i) => {\n\t\tconst angle = (i / nodes.length) * TWO_PI - HALF_PI;\n\t\tconst nx = cx + radius * Math.cos(angle);\n\t\tconst ny = cy + radius * Math.sin(angle);\n\t\tconst nextI = (i + 1) % nodes.length;\n\t\tconst nextAngle = (nextI / nodes.length) * TWO_PI - HALF_PI;\n\t\tconst nextX = cx + radius * Math.cos(nextAngle);\n\t\tconst nextY = cy + radius * Math.sin(nextAngle);\n\t\treturn { x1: nx, y1: ny, x2: nextX, y2: nextY };\n\t});\n\n\treturn { nodes: positioned, connectors };\n}\n\n/**\n * Hierarchy: tree / org-chart layout.\n *\n * Nodes are arranged in levels top-to-bottom. L-shaped connectors link each\n * parent to its children.\n *\n * Geometry mirrors `HierarchyRenderer` from smartart-renderer-hierarchy.tsx.\n * Falls back to `layoutList` when no parent-child structure can be detected.\n */\nfunction layoutHierarchy(\n\trawNodes: PptxSmartArtNode[],\n\twidth: number,\n\theight: number,\n): SmartArtLayoutResult {\n\tif (rawNodes.length === 0) {\n\t\treturn { nodes: [], connectors: [] };\n\t}\n\n\tconst roots = buildTree(rawNodes);\n\tif (roots.length === 0) {\n\t\treturn layoutList(rawNodes, width, height);\n\t}\n\n\tconst totalLeaves = roots.reduce((s, r) => s + treeWidth(r), 0);\n\tconst depth = Math.max(...roots.map(treeDepth));\n\tconst cellW = width / totalLeaves;\n\tconst cellH = height / Math.max(depth, 1);\n\tconst boxW = Math.min(cellW * 0.8, 140);\n\tconst boxH = Math.min(cellH * 0.4, 36);\n\n\tconst positioned: PositionedNode[] = [];\n\tconst connectors: ConnectorSegment[] = [];\n\n\tfunction visitNode(t: TreeNode, xOffset: number, level: number): void {\n\t\tconst w = treeWidth(t);\n\t\tconst nodeCx = (xOffset + w / 2) * cellW;\n\t\tconst nodeCy = level * cellH + cellH / 2;\n\n\t\tpositioned.push({\n\t\t\tid: t.node.id,\n\t\t\ttext: t.node.text,\n\t\t\tx: nodeCx - boxW / 2,\n\t\t\ty: nodeCy - boxH / 2,\n\t\t\tw: boxW,\n\t\t\th: boxH,\n\t\t\tlevel,\n\t\t});\n\n\t\t// Emit L-shaped connector segments from this node to each child.\n\t\tlet childOffset = xOffset;\n\t\tfor (const child of t.children) {\n\t\t\tconst childW = treeWidth(child);\n\t\t\tconst childCx = (childOffset + childW / 2) * cellW;\n\t\t\tconst childCy = (level + 1) * cellH + cellH / 2;\n\t\t\t// Mid-point for the horizontal leg of the L.\n\t\t\tconst midY = nodeCy + boxH / 2 + (childCy - boxH / 2 - (nodeCy + boxH / 2)) / 2;\n\n\t\t\t// Vertical leg down from parent.\n\t\t\tconnectors.push({\n\t\t\t\tx1: nodeCx,\n\t\t\t\ty1: nodeCy + boxH / 2,\n\t\t\t\tx2: nodeCx,\n\t\t\t\ty2: midY,\n\t\t\t});\n\t\t\t// Horizontal leg across to child column.\n\t\t\tconnectors.push({\n\t\t\t\tx1: nodeCx,\n\t\t\t\ty1: midY,\n\t\t\t\tx2: childCx,\n\t\t\t\ty2: midY,\n\t\t\t});\n\t\t\t// Vertical leg down to child box.\n\t\t\tconnectors.push({\n\t\t\t\tx1: childCx,\n\t\t\t\ty1: midY,\n\t\t\t\tx2: childCx,\n\t\t\t\ty2: childCy - boxH / 2,\n\t\t\t});\n\n\t\t\tvisitNode(child, childOffset, level + 1);\n\t\t\tchildOffset += childW;\n\t\t}\n\t}\n\n\tlet offset = 0;\n\tfor (const root of roots) {\n\t\tvisitNode(root, offset, 0);\n\t\toffset += treeWidth(root);\n\t}\n\n\treturn { nodes: positioned, connectors };\n}\n\n// ==========================================================================\n// Public entry-point\n// ==========================================================================\n\n/**\n * Compute positioned node boxes (and optional connector segments) for the\n * SmartArt diagram described by `data`, fitted inside the given `width` ×\n * `height` viewport.\n *\n * This is a **pure function** — it only reads `data` and produces geometry.\n * Callers are responsible for rendering (`<rect>`/`<circle>` + `<text>` per\n * node, `<line>` per connector).\n *\n * @param data - Parsed `PptxSmartArtData` from `pptx-viewer-core`.\n * @param width - Viewport width in SVG user units (px at 1:1).\n * @param height - Viewport height in SVG user units (px at 1:1).\n */\nexport function layoutSmartArtNodes(\n\tdata: PptxSmartArtData,\n\twidth: number,\n\theight: number,\n): SmartArtLayoutResult {\n\t// Flatten nested root-nodes for families that work on a flat list.\n\tconst flatRoots = flattenForLayout(data.nodes);\n\tconst family = resolveSmartArtFamily(data);\n\n\tswitch (family) {\n\t\tcase 'process':\n\t\t\treturn layoutProcess(flatRoots, width, height);\n\t\tcase 'cycle':\n\t\t\treturn layoutCycle(flatRoots, width, height);\n\t\tcase 'hierarchy':\n\t\t\t// Hierarchy uses the raw nested structure to build the tree.\n\t\t\treturn layoutHierarchy(data.nodes, width, height);\n\t\tcase 'list':\n\t\tdefault:\n\t\t\treturn layoutList(flatRoots, width, height);\n\t}\n}\n\n/**\n * Depth-first flatten — only the immediate root nodes are used for flat\n * families (process / cycle / list). Children are included so that, for\n * example, a process diagram that happens to have nested nodes still renders\n * every node as a step.\n */\nfunction flattenForLayout(roots: PptxSmartArtNode[]): PptxSmartArtNode[] {\n\tconst out: PptxSmartArtNode[] = [];\n\tconst walk = (n: PptxSmartArtNode): void => {\n\t\tout.push(n);\n\t\tfor (const c of n.children ?? []) {\n\t\t\twalk(c);\n\t\t}\n\t};\n\tfor (const r of roots) {\n\t\twalk(r);\n\t}\n\treturn out;\n}\n","/**\n * Pure, framework-agnostic helpers for SmartArt rendering.\n *\n * Ported from the Vue component\n * packages/vue/src/viewer/components/SmartArtRenderer.vue\n * (viewer-first subset — drawing-shapes path + stacked-block fallback).\n *\n * No Angular imports: all exports are plain TypeScript functions / types so\n * they can be unit-tested with vitest without TestBed or the Angular compiler.\n */\nimport type {\n\tPptxSmartArtChrome,\n\tPptxSmartArtData,\n\tPptxSmartArtDrawingShape,\n\tPptxSmartArtNode,\n\tSmartArtColorScheme,\n\tSmartArtStyle,\n} from 'pptx-viewer-core';\n\nimport type { StyleMap } from './element-style';\n\n// ==========================================================================\n// Palette helpers\n// ==========================================================================\n\n/** Built-in named colour palettes (mirrors Vue's `PALETTES`). */\nexport const PALETTES: Record<SmartArtColorScheme, string[]> = {\n\tcolorful1: ['#3b82f6', '#22c55e', '#f97316', '#eab308', '#a855f7', '#ec4899'],\n\tcolorful2: ['#6366f1', '#14b8a6', '#f59e0b', '#ef4444', '#8b5cf6', '#06b6d4'],\n\tcolorful3: ['#0ea5e9', '#84cc16', '#f43e5e', '#a855f7', '#f97316', '#10b981'],\n\tmonochromatic1: ['#3b82f6', '#60a5fa', '#93c5fd', '#bfdbfe', '#2563eb', '#1d4ed8'],\n\tmonochromatic2: ['#6366f1', '#818cf8', '#a5b4fc', '#c7d2fe', '#4f46e5', '#4338ca'],\n};\n\nexport const DEFAULT_PALETTE: string[] = PALETTES.colorful1;\n\n/**\n * Pick a colour from `palette` by wrapping `index` around the length.\n */\nexport function paletteColour(index: number, palette: string[]): string {\n\treturn palette[index % palette.length];\n}\n\n/**\n * Resolve the active colour palette for a SmartArt diagram.\n *\n * Priority: colorTransform fill colours → named scheme → default (colorful1).\n */\nexport function resolvePalette(data: PptxSmartArtData | undefined): string[] {\n\tif (!data) {\n\t\treturn DEFAULT_PALETTE;\n\t}\n\tconst ctFills = data.colorTransform?.fillColors;\n\tif (ctFills && ctFills.length > 0) {\n\t\treturn ctFills;\n\t}\n\treturn PALETTES[data.colorScheme ?? 'colorful1'] ?? DEFAULT_PALETTE;\n}\n\n// ==========================================================================\n// Style helpers\n// ==========================================================================\n\n/**\n * CSS `drop-shadow` filter string for the given style intensity, or\n * `undefined` when no shadow is applied (flat style).\n */\nexport function styleShadowFilter(style: SmartArtStyle): string | undefined {\n\tif (style === 'intense') {\n\t\treturn 'drop-shadow(0 2px 6px rgba(0,0,0,0.35))';\n\t}\n\tif (style === 'moderate') {\n\t\treturn 'drop-shadow(0 1px 3px rgba(0,0,0,0.2))';\n\t}\n\treturn undefined;\n}\n\n/**\n * Default stroke width (points) for the given style intensity.\n * Returns `0` for flat (no stroke), `1.5` for moderate, `2` for intense.\n */\nexport function styleStrokeWidth(style: SmartArtStyle): number {\n\tif (style === 'intense') {\n\t\treturn 2;\n\t}\n\tif (style === 'moderate') {\n\t\treturn 1.5;\n\t}\n\treturn 0;\n}\n\n/**\n * Truncate `text` to at most `max` characters, appending `…` when cut.\n */\nexport function truncate(text: string, max: number): string {\n\tif (text.length <= max) {\n\t\treturn text;\n\t}\n\treturn `${text.slice(0, max - 1)}…`;\n}\n\n// ==========================================================================\n// Chrome style\n// ==========================================================================\n\n/**\n * `[ngStyle]`-compatible map for the chrome wrapper `<div>`.\n *\n * Applies background colour and/or outline border when `chrome` is present.\n * Always sets `width`/`height` to `100%` and `box-sizing: border-box`.\n */\nexport function buildChromeStyle(chrome: PptxSmartArtChrome | undefined): StyleMap {\n\tconst s: StyleMap = {\n\t\twidth: '100%',\n\t\theight: '100%',\n\t\t'box-sizing': 'border-box',\n\t\toverflow: 'hidden',\n\t};\n\tif (!chrome) {\n\t\treturn s;\n\t}\n\tif (chrome.backgroundColor) {\n\t\ts['background-color'] = chrome.backgroundColor;\n\t}\n\tif (chrome.outlineColor) {\n\t\ts['border'] = `${chrome.outlineWidth ?? 1}px solid ${chrome.outlineColor}`;\n\t}\n\treturn s;\n}\n\n// ==========================================================================\n// Drawing-shape view-model\n// ==========================================================================\n\n/**\n * Projected view-model for a single pre-computed drawing shape, ready for\n * direct use in an SVG `<g>` block.\n */\nexport interface RenderedShape {\n\t/** Stable React-style key. */\n\tkey: string;\n\t/** True → render `<ellipse>`, false → render `<rect>`. */\n\tisEllipse: boolean;\n\t/** Rect top-left (relative to the viewBox origin). */\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n\t/** Border-radius for `<rect rx>` (roundRect shapes). */\n\trx: number;\n\t/** Ellipse centre x. */\n\tcx: number;\n\t/** Ellipse centre y. */\n\tcy: number;\n\tfill: string;\n\tstroke: string;\n\tstrokeWidth: number;\n\t/** SVG `transform` attribute, e.g. `rotate(30 50 40)`. */\n\ttransform: string | undefined;\n\t/** Truncated text label (≤30 chars), or `undefined` when absent. */\n\ttext: string | undefined;\n\t/** Text anchor x (centre of shape). */\n\ttextX: number;\n\t/** Text anchor y (centre of shape). */\n\ttextY: number;\n\tfontColor: string;\n\tfontSize: number;\n}\n\n/**\n * SVG `viewBox` bounding-box derived from all drawing shapes.\n *\n * Returns the minimal bounding box plus `minX`/`minY` offsets used to\n * rebase each shape's position to (0, 0).\n */\nexport interface DrawingViewBox {\n\tminX: number;\n\tminY: number;\n\twidth: number;\n\theight: number;\n}\n\n/**\n * Compute the SVG viewBox that fits all drawing shapes, rebasing to (0, 0).\n *\n * When the array is empty the function returns a 1×1 unit box at the origin.\n */\nexport function computeDrawingViewBox(shapes: PptxSmartArtDrawingShape[]): DrawingViewBox {\n\tlet minX = Infinity;\n\tlet minY = Infinity;\n\tlet maxX = -Infinity;\n\tlet maxY = -Infinity;\n\tfor (const s of shapes) {\n\t\tif (s.x < minX) {\n\t\t\tminX = s.x;\n\t\t}\n\t\tif (s.y < minY) {\n\t\t\tminY = s.y;\n\t\t}\n\t\tif (s.x + s.width > maxX) {\n\t\t\tmaxX = s.x + s.width;\n\t\t}\n\t\tif (s.y + s.height > maxY) {\n\t\t\tmaxY = s.y + s.height;\n\t\t}\n\t}\n\tif (!Number.isFinite(minX)) {\n\t\treturn { minX: 0, minY: 0, width: 1, height: 1 };\n\t}\n\treturn {\n\t\tminX,\n\t\tminY,\n\t\twidth: maxX - minX || 1,\n\t\theight: maxY - minY || 1,\n\t};\n}\n\n/**\n * Project an array of `PptxSmartArtDrawingShape`s into `RenderedShape` view\n * models, rebasing positions relative to the viewBox origin.\n *\n * @param elementId - The parent element's ID (used to build stable keys).\n * @param shapes - Raw drawing shapes from `PptxSmartArtData.drawingShapes`.\n * @param viewBox - Pre-computed viewBox (from `computeDrawingViewBox`).\n * @param palette - Active colour palette for fill fallback.\n * @param style - Visual style intensity affecting stroke width.\n */\nexport function projectDrawingShapes(\n\telementId: string,\n\tshapes: PptxSmartArtDrawingShape[],\n\tviewBox: DrawingViewBox,\n\tpalette: string[],\n\tstyle: SmartArtStyle,\n): RenderedShape[] {\n\tconst { minX, minY } = viewBox;\n\tconst sw = styleStrokeWidth(style);\n\n\treturn shapes.map((shape, i): RenderedShape => {\n\t\tconst fill = shape.fillColor ?? paletteColour(i, palette);\n\t\tconst relX = shape.x - minX;\n\t\tconst relY = shape.y - minY;\n\t\tconst isEllipse = shape.shapeType === 'ellipse';\n\t\tconst rx = shape.shapeType === 'roundRect' ? Math.min(shape.width, shape.height) * 0.1 : 0;\n\t\tconst cx = relX + shape.width / 2;\n\t\tconst cy = relY + shape.height / 2;\n\t\tconst stroke = shape.strokeColor ?? (sw > 0 ? 'rgba(255,255,255,0.3)' : 'none');\n\t\tconst transform =\n\t\t\tshape.rotation !== undefined ? `rotate(${shape.rotation} ${cx} ${cy})` : undefined;\n\n\t\treturn {\n\t\t\tkey: `${elementId}-dsp-${shape.id}-${i}`,\n\t\t\tisEllipse,\n\t\t\tx: relX,\n\t\t\ty: relY,\n\t\t\twidth: shape.width,\n\t\t\theight: shape.height,\n\t\t\trx,\n\t\t\tcx,\n\t\t\tcy,\n\t\t\tfill,\n\t\t\tstroke,\n\t\t\tstrokeWidth: shape.strokeWidth ?? sw,\n\t\t\ttransform,\n\t\t\ttext: shape.text ? truncate(shape.text, 30) : undefined,\n\t\t\ttextX: cx,\n\t\t\ttextY: cy,\n\t\t\tfontColor: shape.fontColor ?? 'white',\n\t\t\tfontSize: shape.fontSize ?? Math.max(8, Math.min(14, shape.height * 0.2)),\n\t\t};\n\t});\n}\n\n// ==========================================================================\n// Fallback block view-model\n// ==========================================================================\n\n/**\n * A single coloured block in the stacked fallback list.\n */\nexport interface FallbackBlock {\n\t/** Stable key for `@for` tracking. */\n\tkey: string;\n\ttext: string;\n\tfill: string;\n}\n\n/**\n * Depth-first flatten of the node forest (children may be nested).\n *\n * Mirrors Vue's `flattenNodes` helper.\n */\nexport function flattenNodes(roots: PptxSmartArtNode[]): PptxSmartArtNode[] {\n\tconst out: PptxSmartArtNode[] = [];\n\tconst walk = (n: PptxSmartArtNode): void => {\n\t\tout.push(n);\n\t\tfor (const c of n.children ?? []) {\n\t\t\twalk(c);\n\t\t}\n\t};\n\tfor (const r of roots) {\n\t\twalk(r);\n\t}\n\treturn out;\n}\n\n/**\n * Project node text into coloured `FallbackBlock`s for the simple stacked list.\n *\n * @param elementId - The parent element's ID (used to build stable keys).\n * @param nodes - Root nodes from `PptxSmartArtData.nodes`.\n * @param palette - Active colour palette.\n */\nexport function buildFallbackBlocks(\n\telementId: string,\n\tnodes: PptxSmartArtNode[],\n\tpalette: string[],\n): FallbackBlock[] {\n\tconst flat = flattenNodes(nodes);\n\treturn flat.map(\n\t\t(n, i): FallbackBlock => ({\n\t\t\tkey: `${elementId}-node-${n.id}-${i}`,\n\t\t\ttext: n.text,\n\t\t\tfill: paletteColour(i, palette),\n\t\t}),\n\t);\n}\n","import { NgStyle } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { PptxElement } from 'pptx-viewer-core';\n\nimport type { StyleMap } from './element-style';\nimport { getContainerStyle } from './element-style';\nimport { layoutSmartArtNodes } from './smart-art-layouts';\nimport type { SmartArtLayoutResult } from './smart-art-layouts';\nimport {\n\tbuildChromeStyle,\n\tbuildFallbackBlocks,\n\tcomputeDrawingViewBox,\n\tprojectDrawingShapes,\n\tresolvePalette,\n\tstyleShadowFilter,\n} from './smart-art-renderer-helpers';\nimport type { DrawingViewBox, FallbackBlock, RenderedShape } from './smart-art-renderer-helpers';\n\n/**\n * SmartArtRendererComponent — Angular port of the Vue `SmartArtRenderer.vue`\n * (packages/vue/src/viewer/components/SmartArtRenderer.vue).\n *\n * Viewer-first subset: renders from pre-computed drawing shapes\n * (`smartArtData.drawingShapes`) when present, otherwise falls back to a\n * stacked coloured block list of node text. When neither is available a small\n * \"SmartArt\" placeholder is shown.\n *\n * Editing, interaction, and the full family-specific layout renderers\n * (hierarchy / cycle / process / …) are out of scope — tracked in PORTING.md.\n */\n@Component({\n\tselector: 'pptx-smart-art-renderer',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\timports: [NgStyle],\n\ttemplate: `\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>\n\t\t\t<div class=\"pptx-ng-smartart-chrome\" [ngStyle]=\"chromeStyle()\">\n\t\t\t\t@if (isEmpty()) {\n\t\t\t\t\t<div class=\"pptx-ng-smartart-placeholder\">SmartArt</div>\n\t\t\t\t} @else if (hasDrawingShapes()) {\n\t\t\t\t\t<svg\n\t\t\t\t\t\tclass=\"pptx-ng-smartart-svg\"\n\t\t\t\t\t\t[attr.viewBox]=\"svgViewBox()\"\n\t\t\t\t\t\tpreserveAspectRatio=\"xMidYMid meet\"\n\t\t\t\t\t>\n\t\t\t\t\t\t@for (shape of renderedShapes(); track shape.key) {\n\t\t\t\t\t\t\t<g [ngStyle]=\"shadowFilter() ? { filter: shadowFilter() } : {}\">\n\t\t\t\t\t\t\t\t@if (shape.isEllipse) {\n\t\t\t\t\t\t\t\t\t<ellipse\n\t\t\t\t\t\t\t\t\t\t[attr.cx]=\"shape.cx\"\n\t\t\t\t\t\t\t\t\t\t[attr.cy]=\"shape.cy\"\n\t\t\t\t\t\t\t\t\t\t[attr.rx]=\"shape.width / 2\"\n\t\t\t\t\t\t\t\t\t\t[attr.ry]=\"shape.height / 2\"\n\t\t\t\t\t\t\t\t\t\t[attr.fill]=\"shape.fill\"\n\t\t\t\t\t\t\t\t\t\t[attr.stroke]=\"shape.stroke\"\n\t\t\t\t\t\t\t\t\t\t[attr.stroke-width]=\"shape.strokeWidth\"\n\t\t\t\t\t\t\t\t\t\t[attr.transform]=\"shape.transform ?? null\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\t\t\t\t[attr.x]=\"shape.x\"\n\t\t\t\t\t\t\t\t\t\t[attr.y]=\"shape.y\"\n\t\t\t\t\t\t\t\t\t\t[attr.width]=\"shape.width\"\n\t\t\t\t\t\t\t\t\t\t[attr.height]=\"shape.height\"\n\t\t\t\t\t\t\t\t\t\t[attr.rx]=\"shape.rx\"\n\t\t\t\t\t\t\t\t\t\t[attr.fill]=\"shape.fill\"\n\t\t\t\t\t\t\t\t\t\t[attr.stroke]=\"shape.stroke\"\n\t\t\t\t\t\t\t\t\t\t[attr.stroke-width]=\"shape.strokeWidth\"\n\t\t\t\t\t\t\t\t\t\t[attr.transform]=\"shape.transform ?? null\"\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\t@if (shape.text) {\n\t\t\t\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t\t\t\t[attr.x]=\"shape.textX\"\n\t\t\t\t\t\t\t\t\t\t[attr.y]=\"shape.textY\"\n\t\t\t\t\t\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\t\t\t\t\t\tdominant-baseline=\"central\"\n\t\t\t\t\t\t\t\t\t\t[attr.fill]=\"shape.fontColor\"\n\t\t\t\t\t\t\t\t\t\t[attr.font-size]=\"shape.fontSize\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{{ shape.text }}\n\t\t\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</g>\n\t\t\t\t\t\t}\n\t\t\t\t\t</svg>\n\t\t\t\t} @else if (hasLayout()) {\n\t\t\t\t\t<svg\n\t\t\t\t\t\tclass=\"pptx-ng-smartart-svg\"\n\t\t\t\t\t\t[attr.viewBox]=\"layoutViewBox()\"\n\t\t\t\t\t\tpreserveAspectRatio=\"xMidYMid meet\"\n\t\t\t\t\t>\n\t\t\t\t\t\t@for (conn of layoutResult().connectors; track $index) {\n\t\t\t\t\t\t\t<line\n\t\t\t\t\t\t\t\t[attr.x1]=\"conn.x1\"\n\t\t\t\t\t\t\t\t[attr.y1]=\"conn.y1\"\n\t\t\t\t\t\t\t\t[attr.x2]=\"conn.x2\"\n\t\t\t\t\t\t\t\t[attr.y2]=\"conn.y2\"\n\t\t\t\t\t\t\t\tstroke=\"rgba(148, 163, 184, 0.7)\"\n\t\t\t\t\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@for (node of layoutResult().nodes; track node.id) {\n\t\t\t\t\t\t\t@if (node.r) {\n\t\t\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t\t\t[attr.cx]=\"node.x + node.r\"\n\t\t\t\t\t\t\t\t\t[attr.cy]=\"node.y + node.r\"\n\t\t\t\t\t\t\t\t\t[attr.r]=\"node.r\"\n\t\t\t\t\t\t\t\t\t[attr.fill]=\"nodeFill(node.level)\"\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<rect\n\t\t\t\t\t\t\t\t\t[attr.x]=\"node.x\"\n\t\t\t\t\t\t\t\t\t[attr.y]=\"node.y\"\n\t\t\t\t\t\t\t\t\t[attr.width]=\"node.w\"\n\t\t\t\t\t\t\t\t\t[attr.height]=\"node.h\"\n\t\t\t\t\t\t\t\t\trx=\"4\"\n\t\t\t\t\t\t\t\t\t[attr.fill]=\"nodeFill(node.level)\"\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 (node.text) {\n\t\t\t\t\t\t\t\t<text\n\t\t\t\t\t\t\t\t\t[attr.x]=\"node.x + node.w / 2\"\n\t\t\t\t\t\t\t\t\t[attr.y]=\"node.y + node.h / 2\"\n\t\t\t\t\t\t\t\t\ttext-anchor=\"middle\"\n\t\t\t\t\t\t\t\t\tdominant-baseline=\"central\"\n\t\t\t\t\t\t\t\t\tfill=\"#ffffff\"\n\t\t\t\t\t\t\t\t\tfont-size=\"11\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{{ node.text }}\n\t\t\t\t\t\t\t\t</text>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t</svg>\n\t\t\t\t} @else {\n\t\t\t\t\t<div class=\"pptx-ng-smartart-list\">\n\t\t\t\t\t\t@for (block of fallbackBlocks(); track block.key) {\n\t\t\t\t\t\t\t<div class=\"pptx-ng-smartart-block\" [ngStyle]=\"{ 'background-color': block.fill }\">\n\t\t\t\t\t\t\t\t{{ block.text }}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</div>\n\t\t</div>\n\t`,\n\tstyles: `\n\t\t.pptx-ng-smartart-chrome {\n\t\t\tbox-sizing: border-box;\n\t\t\toverflow: hidden;\n\t\t}\n\n\t\t.pptx-ng-smartart-svg {\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tpointer-events: none;\n\t\t}\n\n\t\t.pptx-ng-smartart-placeholder {\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\tfont-size: 11px;\n\t\t\tcolor: rgba(255, 255, 255, 0.8);\n\t\t\tpointer-events: none;\n\t\t}\n\n\t\t.pptx-ng-smartart-list {\n\t\t\twidth: 100%;\n\t\t\theight: 100%;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tgap: 4px;\n\t\t\tpadding: 4px;\n\t\t\tbox-sizing: border-box;\n\t\t\toverflow: hidden;\n\t\t}\n\n\t\t.pptx-ng-smartart-block {\n\t\t\tflex: 1 1 0;\n\t\t\tmin-height: 0;\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\tpadding: 2px 6px;\n\t\t\tborder-radius: 4px;\n\t\t\tcolor: #fff;\n\t\t\tfont-size: 12px;\n\t\t\ttext-align: center;\n\t\t\toverflow: hidden;\n\t\t}\n\t`,\n})\nexport class SmartArtRendererComponent {\n\t/** The smartArt element to render. Must be `type === 'smartArt'`. */\n\treadonly element = input.required<PptxElement>();\n\treadonly zIndex = input<number>(0);\n\n\t// ── Raw SmartArt data ──────────────────────────────────────────────────\n\n\treadonly containerStyle = computed<StyleMap>(() =>\n\t\tgetContainerStyle(this.element(), this.zIndex()),\n\t);\n\n\treadonly chromeStyle = computed<StyleMap>(() => {\n\t\tconst el = this.element();\n\t\tconst chrome = el.type === 'smartArt' ? el.smartArtData?.chrome : undefined;\n\t\treturn buildChromeStyle(chrome);\n\t});\n\n\treadonly palette = computed<string[]>(() => {\n\t\tconst el = this.element();\n\t\treturn resolvePalette(el.type === 'smartArt' ? el.smartArtData : undefined);\n\t});\n\n\treadonly artStyle = computed(() => {\n\t\tconst el = this.element();\n\t\treturn el.type === 'smartArt' ? (el.smartArtData?.style ?? 'flat') : 'flat';\n\t});\n\n\treadonly nodes = computed(() => {\n\t\tconst el = this.element();\n\t\treturn el.type === 'smartArt' ? (el.smartArtData?.nodes ?? []) : [];\n\t});\n\n\t// ── Drawing-shape path ─────────────────────────────────────────────────\n\n\treadonly rawDrawingShapes = computed(() => {\n\t\tconst el = this.element();\n\t\treturn el.type === 'smartArt' ? (el.smartArtData?.drawingShapes ?? []) : [];\n\t});\n\n\treadonly hasDrawingShapes = computed(() => this.rawDrawingShapes().length > 0);\n\n\treadonly viewBox = computed<DrawingViewBox>(() => computeDrawingViewBox(this.rawDrawingShapes()));\n\n\t/** `viewBox` attribute string for the `<svg>` element. */\n\treadonly svgViewBox = computed<string>(() => {\n\t\tconst vb = this.viewBox();\n\t\treturn `0 0 ${vb.width} ${vb.height}`;\n\t});\n\n\treadonly renderedShapes = computed<RenderedShape[]>(() =>\n\t\tprojectDrawingShapes(\n\t\t\tthis.element().id,\n\t\t\tthis.rawDrawingShapes(),\n\t\t\tthis.viewBox(),\n\t\t\tthis.palette(),\n\t\t\tthis.artStyle(),\n\t\t),\n\t);\n\n\treadonly shadowFilter = computed<string | undefined>(() => styleShadowFilter(this.artStyle()));\n\n\t// ── Family layout fallback (when no authored drawing shapes) ────────────\n\n\treadonly layoutResult = computed<SmartArtLayoutResult>(() => {\n\t\tconst el = this.element();\n\t\tconst data = el.type === 'smartArt' ? el.smartArtData : undefined;\n\t\tif (!data) {\n\t\t\treturn { nodes: [], connectors: [] };\n\t\t}\n\t\treturn layoutSmartArtNodes(data, Math.max(el.width, 1), Math.max(el.height, 1));\n\t});\n\n\treadonly hasLayout = computed(() => this.layoutResult().nodes.length > 0);\n\n\treadonly layoutViewBox = computed<string>(() => {\n\t\tconst el = this.element();\n\t\treturn `0 0 ${Math.max(el.width, 1)} ${Math.max(el.height, 1)}`;\n\t});\n\n\t/** Palette colour for a node at the given depth level. */\n\tnodeFill(level: number): string {\n\t\tconst p = this.palette();\n\t\treturn p[level % p.length] ?? p[0];\n\t}\n\n\t// ── Fallback block list ────────────────────────────────────────────────\n\n\treadonly fallbackBlocks = computed<FallbackBlock[]>(() =>\n\t\tbuildFallbackBlocks(this.element().id, this.nodes(), this.palette()),\n\t);\n\n\t// ── Empty / no-data state ──────────────────────────────────────────────\n\n\treadonly isEmpty = computed(() => this.nodes().length === 0 && !this.hasDrawingShapes());\n}\n\n// Re-export helper types used in the template so template type-checking works.\nexport type { DrawingViewBox, FallbackBlock, RenderedShape };\n","/**\n * Pure, framework-agnostic helpers for table rendering.\n *\n * Ported from:\n * - packages/react/src/viewer/utils/table-render-helpers.ts (cellStyleToCss,\n * ooxmlDashToCssBorderStyle)\n * - packages/react/src/viewer/utils/table-render-data.tsx (row / cell\n * view-model projection)\n *\n * All functions are pure (no Angular dependencies) so they can be unit-tested\n * with plain vitest without TestBed or the Angular compiler.\n */\nimport type {\n\tPptxElement,\n\tPptxTableCell,\n\tPptxTableCellStyle,\n\tPptxTableRow,\n\tTablePptxElement,\n} from 'pptx-viewer-core';\n\nimport type { StyleMap } from './element-style';\n\n// ==========================================================================\n// Rich-text cell paragraph / run types\n// ==========================================================================\n\n/**\n * A single styled text run inside a cell paragraph.\n *\n * The `style` map is an `[ngStyle]`-compatible object derived from the cell's\n * `PptxTableCellStyle` (bold, italic, underline, color, fontSize). When the\n * cell has no style the map is empty ({}) and CSS inherits.\n *\n * `isLineBreak` is true for soft line-break runs. The template renders them\n * as `<br>`.\n */\nexport interface CellTextRun {\n\ttext: string;\n\tstyle: StyleMap;\n\tisLineBreak?: true;\n}\n\n/**\n * A single paragraph inside a table cell, made up of one or more `CellTextRun`s.\n *\n * In the current implementation each paragraph has exactly one run (styled by\n * the cell-level `PptxTableCellStyle`). When the core later exposes per-run\n * segments on `PptxTableCell`, additional runs per paragraph will be populated.\n */\nexport type CellParagraph = CellTextRun[];\n\n// ==========================================================================\n// Border dash mapping\n// ==========================================================================\n\n/**\n * Map an OOXML border-dash preset to a CSS border-style keyword.\n *\n * Mirrors `ooxmlDashToCssBorderStyle` in table-render-helpers.ts.\n */\nexport function ooxmlDashToCssBorderStyle(dashVal: string | undefined): string {\n\tif (!dashVal) {\n\t\treturn 'solid';\n\t}\n\tswitch (dashVal) {\n\t\tcase 'dot':\n\t\tcase 'sysDot':\n\t\t\treturn 'dotted';\n\t\tcase 'dash':\n\t\tcase 'sysDash':\n\t\tcase 'lgDash':\n\t\tcase 'dashDot':\n\t\tcase 'lgDashDot':\n\t\tcase 'sysDashDot':\n\t\tcase 'lgDashDotDot':\n\t\tcase 'sysDashDotDot':\n\t\t\treturn 'dashed';\n\t\tdefault:\n\t\t\treturn 'solid';\n\t}\n}\n\n// ==========================================================================\n// Cell style → StyleMap\n// ==========================================================================\n\n/**\n * Convert a `PptxTableCellStyle` object to an `[ngStyle]`-compatible map.\n *\n * Viewer-first subset: fill (solid + gradient via prebuilt CSS string),\n * text styling, per-edge borders, cell margins, vertical alignment, and\n * vertical text direction. Pattern fills and complex structured gradient\n * builders remain TODOs (see PORTING.md).\n *\n * Mirrors `cellStyleToCss` in table-render-helpers.ts.\n */\nexport function cellStyleToStyleMap(style: PptxTableCellStyle | undefined): StyleMap {\n\tif (!style) {\n\t\treturn {};\n\t}\n\tconst map: StyleMap = {};\n\n\t// --- Text formatting ---\n\tif (style.fontSize) {\n\t\tmap['font-size'] = `${style.fontSize}px`;\n\t}\n\tif (style.bold) {\n\t\tmap['font-weight'] = 'bold';\n\t}\n\tif (style.italic) {\n\t\tmap['font-style'] = 'italic';\n\t}\n\tif (style.underline) {\n\t\tmap['text-decoration'] = 'underline';\n\t}\n\tif (style.color) {\n\t\tmap['color'] = style.color;\n\t}\n\n\t// --- Background fill ---\n\t// Priority: gradient (prebuilt CSS string) → solid backgroundColor.\n\t// Pattern fills (SVG-based) require color-core extraction from shared;\n\t// deferred — see PORTING.md \"Strong remaining extraction candidates\".\n\tif (style.gradientFillCss) {\n\t\tmap['background'] = style.gradientFillCss;\n\t} else if (style.backgroundColor) {\n\t\tmap['background-color'] = style.backgroundColor;\n\t}\n\n\t// --- Text alignment ---\n\tif (style.align) {\n\t\tmap['text-align'] = style.align;\n\t}\n\tif (style.vAlign) {\n\t\t// CSS vertical-align on <td> maps directly to top/middle/bottom.\n\t\tmap['vertical-align'] = style.vAlign;\n\t}\n\n\t// --- Vertical text direction (a:tcPr/@vert) ---\n\t// Mirrors the switch in table-render-helpers.ts cellStyleToCss.\n\tif (style.textDirection) {\n\t\tswitch (style.textDirection) {\n\t\t\tcase 'vert':\n\t\t\tcase 'eaVert':\n\t\t\tcase 'wordArtVert':\n\t\t\tcase 'wordArtVertRtl':\n\t\t\t\tmap['writing-mode'] = 'vertical-rl';\n\t\t\t\tbreak;\n\t\t\tcase 'vert270':\n\t\t\tcase 'mongolianVert':\n\t\t\t\tmap['writing-mode'] = 'vertical-lr';\n\t\t\t\tbreak;\n\t\t}\n\t\tif (map['writing-mode']) {\n\t\t\tmap['text-orientation'] = style.textDirection === 'wordArtVert' ? 'upright' : 'mixed';\n\t\t}\n\t\tif (style.textDirection === 'wordArtVertRtl') {\n\t\t\tmap['direction'] = 'rtl';\n\t\t}\n\t}\n\n\t// --- Per-edge borders ---\n\t// React source: table-render-helpers.ts, borderEdges loop.\n\ttype EdgeKey = 'border-top' | 'border-bottom' | 'border-left' | 'border-right';\n\tconst borderEdges: ReadonlyArray<{\n\t\tcssProp: EdgeKey;\n\t\twidth: number | undefined;\n\t\tcolor: string | undefined;\n\t\tdash: string | undefined;\n\t}> = [\n\t\t{\n\t\t\tcssProp: 'border-top',\n\t\t\twidth: style.borderTopWidth,\n\t\t\tcolor: style.borderTopColor,\n\t\t\tdash: style.borderTopDash,\n\t\t},\n\t\t{\n\t\t\tcssProp: 'border-bottom',\n\t\t\twidth: style.borderBottomWidth,\n\t\t\tcolor: style.borderBottomColor,\n\t\t\tdash: style.borderBottomDash,\n\t\t},\n\t\t{\n\t\t\tcssProp: 'border-left',\n\t\t\twidth: style.borderLeftWidth,\n\t\t\tcolor: style.borderLeftColor,\n\t\t\tdash: style.borderLeftDash,\n\t\t},\n\t\t{\n\t\t\tcssProp: 'border-right',\n\t\t\twidth: style.borderRightWidth,\n\t\t\tcolor: style.borderRightColor,\n\t\t\tdash: style.borderRightDash,\n\t\t},\n\t];\n\tfor (const edge of borderEdges) {\n\t\tif (edge.width !== undefined || edge.color !== undefined) {\n\t\t\tconst w = edge.width ?? 1;\n\t\t\tconst c = edge.color ?? style.borderColor ?? '#000000';\n\t\t\tconst s = ooxmlDashToCssBorderStyle(edge.dash);\n\t\t\tmap[edge.cssProp] = `${w}px ${s} ${c}`;\n\t\t}\n\t}\n\n\t// --- Cell margins (mapped to padding on the <td>) ---\n\tif (style.marginLeft !== undefined) {\n\t\tmap['padding-left'] = `${style.marginLeft}px`;\n\t}\n\tif (style.marginRight !== undefined) {\n\t\tmap['padding-right'] = `${style.marginRight}px`;\n\t}\n\tif (style.marginTop !== undefined) {\n\t\tmap['padding-top'] = `${style.marginTop}px`;\n\t}\n\tif (style.marginBottom !== undefined) {\n\t\tmap['padding-bottom'] = `${style.marginBottom}px`;\n\t}\n\n\t// --- Text shadow / glow ---\n\t// React source: table-render-helpers.ts, text-shadow composition.\n\tconst shadowParts: string[] = [];\n\tif (style.textShadowColor) {\n\t\tconst offX = style.textShadowOffsetX ?? 1;\n\t\tconst offY = style.textShadowOffsetY ?? 1;\n\t\tconst blur = style.textShadowBlur ?? 0;\n\t\tshadowParts.push(`${offX}px ${offY}px ${blur}px ${style.textShadowColor}`);\n\t}\n\tif (style.textGlowColor) {\n\t\tconst radius = style.textGlowRadius ?? 2;\n\t\tshadowParts.push(`0px 0px ${radius}px ${style.textGlowColor}`);\n\t}\n\tif (shadowParts.length > 0) {\n\t\tmap['text-shadow'] = shadowParts.join(', ');\n\t}\n\n\treturn map;\n}\n\n// ==========================================================================\n// Row / column style helpers\n// ==========================================================================\n\n/**\n * Compute the `[ngStyle]` map for a `<col>` element given its proportion of\n * the total table width (0–1 fraction from `PptxTableData.columnWidths`).\n */\nexport function columnWidthStyle(widthFraction: number): StyleMap {\n\treturn { width: `${(widthFraction * 100).toFixed(2)}%` };\n}\n\n/**\n * Compute the `[ngStyle]` map for a `<tr>` element.\n *\n * Returns an empty map when the row has no explicit height so the browser\n * distributes height naturally.\n */\nexport function rowStyle(row: PptxTableRow): StyleMap {\n\treturn row.height !== undefined ? { height: `${row.height}px` } : {};\n}\n\n/**\n * Build the combined `[ngStyle]` for a `<td>` cell element.\n *\n * Applies default padding (mirrors the React `px-1 py-0.5` Tailwind classes)\n * and merges the per-cell style on top.\n */\nexport function cellTdStyle(cell: PptxTableCell): StyleMap {\n\treturn {\n\t\t'padding-left': '4px',\n\t\t'padding-right': '4px',\n\t\t'padding-top': '2px',\n\t\t'padding-bottom': '2px',\n\t\t'vertical-align': 'top',\n\t\t...cellStyleToStyleMap(cell.style),\n\t};\n}\n\n// ==========================================================================\n// Rich-text run style helper\n// ==========================================================================\n\n/**\n * Convert cell-level style properties (bold, italic, underline, color,\n * fontSize) into an `[ngStyle]`-compatible map for a text run.\n *\n * This mirrors the private `segmentStyle()` method in\n * `ElementRendererComponent` but operates on `PptxTableCellStyle` instead of\n * `TextSegment.style`. Extracted here as a pure function so tests can exercise\n * it directly without TestBed.\n *\n * Only character-level text formatting is mapped; layout-level properties\n * (background, border, padding, etc.) remain on the `<td>` via `cellTdStyle`.\n */\nexport function cellRunStyle(style: PptxTableCellStyle | undefined): StyleMap {\n\tif (!style) {\n\t\treturn {};\n\t}\n\tconst map: StyleMap = {};\n\tif (style.fontSize) {\n\t\t// PptxTableCellStyle.fontSize is in px (converted from EMU by the parser),\n\t\t// unlike TextSegment.style.fontSize which is in pt.\n\t\tmap['font-size'] = `${style.fontSize}px`;\n\t}\n\tif (style.bold) {\n\t\tmap['font-weight'] = 'bold';\n\t}\n\tif (style.italic) {\n\t\tmap['font-style'] = 'italic';\n\t}\n\tif (style.color) {\n\t\tmap['color'] = style.color;\n\t}\n\tconst deco: string[] = [];\n\tif (style.underline) {\n\t\tdeco.push('underline');\n\t}\n\t// PptxTableCellStyle does not have a strikethrough field — reserved for when\n\t// the core type gains per-run strikethrough on cells.\n\tif (deco.length > 0) {\n\t\tmap['text-decoration'] = deco.join(' ');\n\t}\n\treturn map;\n}\n\n// ==========================================================================\n// Rich-text paragraph builder\n// ==========================================================================\n\n/**\n * Build a list of `CellParagraph` arrays from a `PptxTableCell`.\n *\n * Strategy:\n * - Split `cell.text` on `\\n` (the parser joins paragraphs with newlines in\n * `extractTableCellText`) to recover individual paragraphs.\n * - Each paragraph becomes one `CellTextRun` whose `style` is built from the\n * cell-level `PptxTableCellStyle` via {@link cellRunStyle}.\n * - Paragraphs with empty text are kept so the paragraph structure is preserved\n * (an empty `<p>` still takes up vertical space).\n *\n * Returns an empty array when `cell.text` is empty AND there is no cell style\n * that would add meaningful formatting — signalling the template to fall back to\n * the `displayText` non-breaking-space placeholder (which keeps the row height).\n *\n * When there is at least one non-empty paragraph OR a style is present the array\n * is always non-empty so the template renders the rich-text path.\n */\nexport function buildCellParagraphs(cell: PptxTableCell): CellParagraph[] {\n\tconst runStyle = cellRunStyle(cell.style);\n\tconst text = cell.text ?? '';\n\n\t// If the cell is completely empty and has no character-level formatting,\n\t// return empty so the template uses the non-breaking space displayText\n\t// fallback to keep row height.\n\tif (!text && Object.keys(runStyle).length === 0) {\n\t\treturn [];\n\t}\n\n\tconst lines = text.split('\\n');\n\treturn lines.map((line): CellParagraph => {\n\t\treturn [{ text: line, style: runStyle }];\n\t});\n}\n\n// ==========================================================================\n// View-model types\n// ==========================================================================\n\n/**\n * A flattened cell descriptor ready for template iteration. Cells flagged\n * `hMerge` or `vMerge` are excluded; the template produces no `<td>` for\n * them (the origin cell's colspan/rowspan expands to cover the gap).\n */\nexport interface TableCellViewModel {\n\tcell: PptxTableCell;\n\t/** Resolved colspan from `gridSpan` (>= 2) or undefined. */\n\tcolSpan: number | undefined;\n\t/** Resolved rowspan from `rowSpan` (>= 2) or undefined. */\n\trowSpan: number | undefined;\n\t/** Pre-computed `[ngStyle]` map for this cell's `<td>`. */\n\ttdStyle: StyleMap;\n\t/**\n\t * Display text — non-breaking space when the cell is empty to keep the row\n\t * height. Used as fallback when `paragraphs` is empty (no text AND no style).\n\t */\n\tdisplayText: string;\n\t/**\n\t * Rich-text paragraphs built from the cell's text content and cell-level\n\t * style. When non-empty the template renders this instead of `displayText`.\n\t * Each entry is a paragraph (array of styled runs); runs with `isLineBreak`\n\t * render as `<br>`.\n\t *\n\t * When this array is empty (cell is completely empty + unstyled) the template\n\t * falls back to rendering `displayText` (a non-breaking space) so the row\n\t * retains its height.\n\t */\n\tparagraphs: CellParagraph[];\n}\n\nexport interface TableRowViewModel {\n\trowStyle: StyleMap;\n\tcells: TableCellViewModel[];\n}\n\n// ==========================================================================\n// View-model projection\n// ==========================================================================\n\n/**\n * Project a `TablePptxElement` into view-model rows, skipping merged-away\n * cells and resolving spans. Returns an empty array when `tableData` is\n * absent.\n *\n * Exported so tests can drive it directly without a component instance.\n *\n * Mirrors the row/cell mapping in table-render-data.tsx.\n */\nexport function buildTableViewModel(el: PptxElement): TableRowViewModel[] {\n\tif (el.type !== 'table') {\n\t\treturn [];\n\t}\n\tconst tableEl = el as TablePptxElement;\n\tconst tableData = tableEl.tableData;\n\tif (!tableData || tableData.rows.length === 0) {\n\t\treturn [];\n\t}\n\n\treturn tableData.rows.map((row) => {\n\t\tconst cells: TableCellViewModel[] = row.cells\n\t\t\t.filter((cell) => !cell.hMerge && !cell.vMerge)\n\t\t\t.map((cell) => {\n\t\t\t\tconst colSpan =\n\t\t\t\t\tcell.gridSpan !== undefined && cell.gridSpan > 1 ? cell.gridSpan : undefined;\n\t\t\t\tconst rowSpan = cell.rowSpan !== undefined && cell.rowSpan > 1 ? cell.rowSpan : undefined;\n\t\t\t\treturn {\n\t\t\t\t\tcell,\n\t\t\t\t\tcolSpan,\n\t\t\t\t\trowSpan,\n\t\t\t\t\ttdStyle: cellTdStyle(cell),\n\t\t\t\t\t// Non-breaking space keeps the row height when the cell is empty;\n\t\t\t\t\t// mirrors `cell.text || ' '` in table-render-data.tsx.\n\t\t\t\t\tdisplayText: cell.text || ' ',\n\t\t\t\t\tparagraphs: buildCellParagraphs(cell),\n\t\t\t\t};\n\t\t\t});\n\t\treturn { rowStyle: rowStyle(row), cells };\n\t});\n}\n\n/**\n * Compute `<col>` width styles from the column-widths array (0–1 fractions).\n */\nexport function buildColStyles(el: PptxElement): StyleMap[] {\n\tif (el.type !== 'table') {\n\t\treturn [];\n\t}\n\tconst tableEl = el as TablePptxElement;\n\tconst widths = tableEl.tableData?.columnWidths ?? [];\n\treturn widths.map((w) => columnWidthStyle(w));\n}\n","import { NgStyle } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { PptxElement } from 'pptx-viewer-core';\n\nimport type { StyleMap } from './element-style';\nimport { buildColStyles, buildTableViewModel } from './table-renderer-helpers';\nimport type { CellParagraph, TableRowViewModel } from './table-renderer-helpers';\n\n/**\n * TableRendererComponent — Angular port of the React `renderTableFromTableData`\n * (packages/react/src/viewer/utils/table-render-data.tsx).\n *\n * Renders a `<table>` from the typed `PptxTableData` structure that the core\n * parser populates on every `TablePptxElement`. This is the viewer-first path:\n * editing, resize overlays, and inline cell input are not yet ported.\n *\n * Key behaviours:\n * - Merged cells: cells with `hMerge`/`vMerge` are skipped; the origin cell\n * receives `[attr.colspan]`/`[attr.rowspan]` from `gridSpan`/`rowSpan`.\n * - Column widths: a `<colgroup>` drives proportional widths from\n * `PptxTableData.columnWidths` (0–1 fractions).\n * - Row heights: `[ngStyle]` on `<tr>` sets an explicit pixel height when\n * `PptxTableRow.height` is present.\n * - Cell fill: solid `backgroundColor` or the parser's pre-built\n * `gradientFillCss` string (gradient). Pattern fills are deferred.\n * - Cell borders: per-edge (top/bottom/left/right) width + colour.\n * - Cell text: rich-text paragraphs of styled `<span>` runs when the cell\n * carries text or formatting; falls back to a non-breaking-space placeholder\n * for empty+unstyled cells (preserves row height).\n *\n * Pure helpers (view-model projection, style maps) live in\n * `table-renderer-helpers.ts` so tests can exercise them without TestBed.\n */\n@Component({\n\tselector: 'pptx-table-renderer',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\timports: [NgStyle],\n\ttemplate: `\n\t\t<div class=\"pptx-ng-table-wrapper\">\n\t\t\t<table class=\"pptx-ng-table\">\n\t\t\t\t@if (colStyles().length > 0) {\n\t\t\t\t\t<colgroup>\n\t\t\t\t\t\t@for (colStyle of colStyles(); track $index) {\n\t\t\t\t\t\t\t<col [ngStyle]=\"colStyle\" />\n\t\t\t\t\t\t}\n\t\t\t\t\t</colgroup>\n\t\t\t\t}\n\t\t\t\t<tbody>\n\t\t\t\t\t@for (row of rows(); track $index) {\n\t\t\t\t\t\t<tr [ngStyle]=\"row.rowStyle\">\n\t\t\t\t\t\t\t@for (vm of row.cells; track $index) {\n\t\t\t\t\t\t\t\t<td\n\t\t\t\t\t\t\t\t\t[ngStyle]=\"vm.tdStyle\"\n\t\t\t\t\t\t\t\t\t[attr.colspan]=\"vm.colSpan ?? null\"\n\t\t\t\t\t\t\t\t\t[attr.rowspan]=\"vm.rowSpan ?? null\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t@if (vm.paragraphs.length > 0) {\n\t\t\t\t\t\t\t\t\t\t@for (para of vm.paragraphs; track $index) {\n\t\t\t\t\t\t\t\t\t\t\t<p class=\"pptx-ng-cell-para\">\n\t\t\t\t\t\t\t\t\t\t\t\t@for (run of para; track $index) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t@if (run.isLineBreak) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t\t\t\t\t} @else {\n\t\t\t\t\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\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t</p>\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{{ vm.displayText }}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t}\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>\n\t`,\n})\nexport class TableRendererComponent {\n\t/** The table element to render. Must be `type === 'table'`. */\n\treadonly element = input.required<PptxElement>();\n\n\t/** Pre-computed `<col>` styles for the colgroup. */\n\treadonly colStyles = computed<StyleMap[]>(() => buildColStyles(this.element()));\n\n\t/** Projected view-model rows with merged-cell resolution applied. */\n\treadonly rows = computed<TableRowViewModel[]>(() => buildTableViewModel(this.element()));\n}\n\n// Re-export for template type-checking (CellParagraph is used in the @for loop).\nexport type { CellParagraph };\n","/**\n * Pure paragraph bullet / list-marker helpers for the Angular text renderer.\n *\n * No Angular imports — all exports are plain TypeScript functions suitable for\n * use inside computed signals or template helper calls.\n *\n * Numbering schemes follow the OOXML `ST_TextAutonumberScheme` enumeration\n * (ECMA-376 §20.1.10.81). The `autoNumType` strings come from\n * `BulletInfo.autoNumType` as parsed by `pptx-viewer-core`.\n */\n\nimport type { BulletInfo, TextSegment } from 'pptx-viewer-core';\n\n// ---------------------------------------------------------------------------\n// Low-level number-formatting helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a positive integer to a Roman numeral string (upper-case).\n * Input is clamped to [1, 3999].\n *\n * @example\n * romanNumeral(4) // \"IV\"\n * romanNumeral(9) // \"IX\"\n * romanNumeral(40) // \"XL\"\n * romanNumeral(2024) // \"MMXXIV\"\n */\nexport function romanNumeral(n: number): string {\n\tconst values: ReadonlyArray<number> = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];\n\tconst numerals: ReadonlyArray<string> = [\n\t\t'M',\n\t\t'CM',\n\t\t'D',\n\t\t'CD',\n\t\t'C',\n\t\t'XC',\n\t\t'L',\n\t\t'XL',\n\t\t'X',\n\t\t'IX',\n\t\t'V',\n\t\t'IV',\n\t\t'I',\n\t];\n\tlet remaining = Math.max(1, Math.min(n, 3999));\n\tlet result = '';\n\tfor (let i = 0; i < values.length; i++) {\n\t\twhile (remaining >= values[i]) {\n\t\t\tresult += numerals[i];\n\t\t\tremaining -= values[i];\n\t\t}\n\t}\n\treturn result;\n}\n\n/**\n * Convert a positive integer to a spreadsheet-style alphabetic label (lower-case).\n * 1→\"a\", 26→\"z\", 27→\"aa\", 52→\"az\", 53→\"ba\", …\n *\n * @example\n * alphaLabel(1) // \"a\"\n * alphaLabel(26) // \"z\"\n * alphaLabel(27) // \"aa\"\n */\nexport function alphaLabel(n: number): string {\n\tlet remaining = Math.max(1, n);\n\tlet result = '';\n\twhile (remaining > 0) {\n\t\tremaining -= 1;\n\t\tresult = String.fromCharCode(97 + (remaining % 26)) + result;\n\t\tremaining = Math.floor(remaining / 26);\n\t}\n\treturn result;\n}\n\n// ---------------------------------------------------------------------------\n// autoNumType → marker string\n// ---------------------------------------------------------------------------\n\n/**\n * Render the n-th (1-based) marker for an OOXML auto-numbering scheme.\n *\n * Suffix conventions:\n * - `…Period` → `label.` (e.g. \"1.\", \"a.\", \"i.\")\n * - `…ParenR` → `label)` (e.g. \"1)\", \"a)\", \"i)\")\n * - `…ParenBoth` → `(label)` (e.g. \"(1)\", \"(a)\", \"(i)\")\n * - `…Plain` → `label` (bare numeral)\n *\n * Unrecognised schemes fall back to `\"<n>.\"`.\n *\n * @param autoNumType - The OOXML auto-number type string (e.g. \"arabicPeriod\").\n * @param n - 1-based sequence number to format.\n */\nexport function formatAutoNumber(autoNumType: string | undefined, n: number): string {\n\tif (!autoNumType) {\n\t\treturn `${n}.`;\n\t}\n\n\t// circled-digit helpers (Unicode block U+2460…)\n\tconst toCircledStd = (v: number): string => {\n\t\tif (v < 0 || v > 9) {\n\t\t\treturn `${v}`;\n\t\t}\n\t\treturn v === 0 ? '⓪' : String.fromCodePoint(0x245f + v);\n\t};\n\tconst toCircledBlack = (v: number): string => {\n\t\tif (v < 0 || v > 9) {\n\t\t\treturn `${v}`;\n\t\t}\n\t\treturn v === 0 ? '⓿' : String.fromCodePoint(0x24eb + v);\n\t};\n\n\tswitch (autoNumType) {\n\t\tcase 'arabicPeriod':\n\t\tcase 'arabicDbPeriod':\n\t\t\treturn `${n}.`;\n\n\t\tcase 'arabicParenR':\n\t\t\treturn `${n})`;\n\n\t\tcase 'arabicParenBoth':\n\t\t\treturn `(${n})`;\n\n\t\tcase 'arabicPlain':\n\t\tcase 'arabicDbPlain':\n\t\t\treturn `${n}`;\n\n\t\tcase 'alphaLcPeriod':\n\t\t\treturn `${alphaLabel(n)}.`;\n\n\t\tcase 'alphaUcPeriod':\n\t\t\treturn `${alphaLabel(n).toUpperCase()}.`;\n\n\t\tcase 'alphaLcParenR':\n\t\t\treturn `${alphaLabel(n)})`;\n\n\t\tcase 'alphaUcParenR':\n\t\t\treturn `${alphaLabel(n).toUpperCase()})`;\n\n\t\tcase 'alphaLcParenBoth':\n\t\t\treturn `(${alphaLabel(n)})`;\n\n\t\tcase 'alphaUcParenBoth':\n\t\t\treturn `(${alphaLabel(n).toUpperCase()})`;\n\n\t\tcase 'romanLcPeriod':\n\t\t\treturn `${romanNumeral(n).toLowerCase()}.`;\n\n\t\tcase 'romanUcPeriod':\n\t\t\treturn `${romanNumeral(n)}.`;\n\n\t\tcase 'romanLcParenR':\n\t\t\treturn `${romanNumeral(n).toLowerCase()})`;\n\n\t\tcase 'romanUcParenR':\n\t\t\treturn `${romanNumeral(n)})`;\n\n\t\tcase 'romanLcParenBoth':\n\t\t\treturn `(${romanNumeral(n).toLowerCase()})`;\n\n\t\tcase 'romanUcParenBoth':\n\t\t\treturn `(${romanNumeral(n)})`;\n\n\t\tcase 'circleNumDbPlain':\n\t\tcase 'circleNumWdWhitePlain':\n\t\t\treturn toCircledStd(n);\n\n\t\tcase 'circleNumWdBlackPlain':\n\t\t\treturn toCircledBlack(n);\n\n\t\tdefault:\n\t\t\treturn `${n}.`;\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Paragraph-level bullet resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolved bullet marker for a single paragraph.\n *\n * `marker` — the text to prepend (e.g. \"•\", \"1.\", \"a)\").\n * `isNumbered` — true for auto-numbered lists; false for character bullets.\n * `color` — optional explicit bullet colour (hex string from `BulletInfo.color`).\n * `fontFamily` — optional explicit bullet font (from `BulletInfo.fontFamily`).\n */\nexport interface ParagraphBulletResult {\n\tmarker: string;\n\tisNumbered: boolean;\n\tcolor?: string;\n\tfontFamily?: string;\n}\n\n/**\n * Resolve the bullet marker for the first segment of a paragraph.\n *\n * Returns `undefined` when:\n * - `firstSegment` is undefined or carries no `bulletInfo`.\n * - `bulletInfo.none` is `true` (`a:buNone` explicitly suppresses the bullet).\n * - The paragraph's `listType` is `'none'`.\n * - Neither `char` nor `autoNumType` is present.\n *\n * For auto-numbered bullets the 1-based sequence index is derived from\n * `bulletInfo.autoNumStartAt` (default 1) plus `bulletInfo.paragraphIndex`\n * (0-based paragraph position within the text body).\n *\n * @param firstSegment - The first `TextSegment` of the paragraph (carries `bulletInfo`).\n */\nexport function resolveParagraphBullet(\n\tfirstSegment: TextSegment | undefined,\n): ParagraphBulletResult | undefined {\n\tif (!firstSegment) {\n\t\treturn undefined;\n\t}\n\n\t// listType on the style of the first segment can explicitly suppress bullets.\n\tif (firstSegment.style?.listType === 'none') {\n\t\treturn undefined;\n\t}\n\n\tconst info: BulletInfo | undefined = firstSegment.bulletInfo;\n\tif (!info) {\n\t\treturn undefined;\n\t}\n\n\t// `a:buNone` explicitly suppresses any inherited bullet.\n\tif (info.none) {\n\t\treturn undefined;\n\t}\n\n\tconst color: string | undefined = info.color;\n\tconst fontFamily: string | undefined = info.fontFamily;\n\n\t// ── Auto-numbered list ──\n\tif (info.autoNumType) {\n\t\tconst startAt = typeof info.autoNumStartAt === 'number' ? info.autoNumStartAt : 1;\n\t\tconst paraIdx = typeof info.paragraphIndex === 'number' ? info.paragraphIndex : 0;\n\t\t// Convert from 0-based paragraph index + startAt to a 1-based sequence number.\n\t\tconst seqNum = Math.max(1, startAt + paraIdx);\n\t\treturn {\n\t\t\tmarker: formatAutoNumber(info.autoNumType, seqNum),\n\t\t\tisNumbered: true,\n\t\t\tcolor,\n\t\t\tfontFamily,\n\t\t};\n\t}\n\n\t// ── Character bullet ──\n\tif (info.char) {\n\t\treturn {\n\t\t\tmarker: info.char,\n\t\t\tisNumbered: false,\n\t\t\tcolor,\n\t\t\tfontFamily,\n\t\t};\n\t}\n\n\t// Picture bullets and unsupported cases — no marker to show as text.\n\treturn undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Indent helpers\n// ---------------------------------------------------------------------------\n\n/** Pixels of left-padding to apply per list nesting level. */\nconst INDENT_PX_PER_LEVEL = 18;\n\n/**\n * Return the left-indent in pixels for the given list nesting level.\n *\n * `level` is the 0-based `paragraphLevel` from `TextSegment` (matches\n * OOXML `a:p/@lvl`). `undefined` or negative values are treated as level 0.\n *\n * @example\n * bulletIndentPx(0) // 0\n * bulletIndentPx(1) // 18\n * bulletIndentPx(3) // 54\n * bulletIndentPx(undefined) // 0\n */\nexport function bulletIndentPx(level: number | undefined): number {\n\tconst lvl = typeof level === 'number' && level > 0 ? level : 0;\n\treturn lvl * INDENT_PX_PER_LEVEL;\n}\n","import type { PptxElement, ZoomPptxElement } from 'pptx-viewer-core';\nimport { isZoomElement } from 'pptx-viewer-core';\n\nimport type { StyleMap } from './element-style';\nimport { getContainerStyle } from './element-style';\n\n/**\n * Pure helpers for `ZoomRendererComponent`.\n *\n * All functions are framework-agnostic (no Angular dependency) so they can be\n * unit-tested without TestBed, following the same pattern as\n * `connector-path.ts`.\n */\n\n/** Narrowed view-model derived from a `ZoomPptxElement`. */\nexport interface ZoomViewModel {\n\t/** Resolved zoom element, or undefined when the element is not a zoom. */\n\treadonly zoom: ZoomPptxElement | undefined;\n\t/** Preview image src (the `imageData` embedded thumbnail). */\n\treadonly previewSrc: string | undefined;\n\t/** Zero-based target slide index. */\n\treadonly targetSlideIndex: number;\n\t/** Zoom type string used as the badge label source and data attribute. */\n\treadonly zoomType: 'slide' | 'section';\n\t/** Optional section identifier for section zooms. */\n\treadonly targetSectionId: string | undefined;\n\t/** Human-readable badge text (\"Slide Zoom\" / \"Section Zoom\"). */\n\treadonly badgeText: string;\n\t/** Human-readable slide label (\"Slide N\"). */\n\treadonly slideLabel: string;\n\t/** Accessible label for the element. */\n\treadonly ariaLabel: string;\n}\n\n/**\n * Build the complete zoom view-model for a given element.\n * Returns sensible defaults for non-zoom elements (all derived strings are\n * empty/fallback values, `zoom` is `undefined`).\n */\nexport function buildZoomViewModel(element: PptxElement): ZoomViewModel {\n\tconst zoom = isZoomElement(element) ? element : undefined;\n\tconst previewSrc = zoom?.imageData;\n\tconst targetSlideIndex = zoom?.targetSlideIndex ?? 0;\n\tconst zoomType: 'slide' | 'section' = zoom?.zoomType ?? 'slide';\n\tconst targetSectionId = zoom?.targetSectionId;\n\tconst badgeText = zoomType === 'section' ? 'Section Zoom' : 'Slide Zoom';\n\tconst slideLabel = `Slide ${targetSlideIndex + 1}`;\n\tlet ariaLabel = `Zoom to slide ${targetSlideIndex + 1}`;\n\tif (zoomType === 'section' && targetSectionId) {\n\t\tariaLabel = `${ariaLabel} (section: ${targetSectionId})`;\n\t}\n\n\treturn {\n\t\tzoom,\n\t\tpreviewSrc,\n\t\ttargetSlideIndex,\n\t\tzoomType,\n\t\ttargetSectionId,\n\t\tbadgeText,\n\t\tslideLabel,\n\t\tariaLabel,\n\t};\n}\n\n/** Wrapper `[ngStyle]`-compatible style for the zoom container `<div>`. */\nexport function buildZoomContainerStyle(element: PptxElement, zIndex: number): StyleMap {\n\treturn getContainerStyle(element, zIndex);\n}\n","import { NgStyle } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { PptxElement } from 'pptx-viewer-core';\n\nimport type { StyleMap } from './element-style';\nimport { buildZoomContainerStyle, buildZoomViewModel } from './zoom-renderer-helpers';\nimport type { ZoomViewModel } from './zoom-renderer-helpers';\n\n/**\n * ZoomRendererComponent — Angular port of the Vue `ZoomRenderer.vue`\n * (and the React `ZoomElementRenderer`), static viewer-first subset.\n *\n * Renders a Slide-Zoom / Section-Zoom tile (`ZoomPptxElement`): the element's\n * own preview thumbnail (`imageData`) when available, otherwise a fallback tile\n * showing the target slide number. A small \"Slide Zoom\" / \"Section Zoom\" badge\n * is drawn in the corner.\n *\n * Navigation (click-to-jump in presentation mode) and live target-slide preview\n * rendering are NOT ported — this is a static link tile only (see PORTING.md).\n * The `slides` array is not threaded through, so the fallback uses the target\n * slide index rather than the real target background.\n *\n * All non-trivial pure computation lives in `zoom-renderer-helpers.ts` (no\n * Angular dependency) so it can be unit-tested without TestBed.\n */\n@Component({\n\tselector: 'pptx-zoom-renderer',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\timports: [NgStyle],\n\ttemplate: `\n\t\t<div\n\t\t\tclass=\"pptx-ng-element pptx-ng-zoom\"\n\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t[attr.data-zoom-type]=\"vm().zoomType\"\n\t\t\t[attr.data-zoom-target]=\"vm().targetSlideIndex\"\n\t\t\t[attr.aria-label]=\"vm().ariaLabel\"\n\t\t>\n\t\t\t<div\n\t\t\t\tstyle=\"position:relative;width:100%;height:100%;overflow:hidden;border-radius:4px;box-shadow:0 2px 8px rgba(0,0,0,0.15)\"\n\t\t\t>\n\t\t\t\t@if (vm().previewSrc) {\n\t\t\t\t\t<img\n\t\t\t\t\t\t[src]=\"vm().previewSrc\"\n\t\t\t\t\t\t[alt]=\"'Preview of slide ' + (vm().targetSlideIndex + 1)\"\n\t\t\t\t\t\tdraggable=\"false\"\n\t\t\t\t\t\tstyle=\"width:100%;height:100%;object-fit:contain;pointer-events:none;user-select:none;display:block\"\n\t\t\t\t\t/>\n\t\t\t\t} @else {\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle=\"width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;background-color:#f0f0f0;border:1px solid rgba(0,0,0,0.1);box-sizing:border-box\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div style=\"font-size:14px;font-weight:600;color:rgba(0,0,0,0.5);margin-bottom:4px\">\n\t\t\t\t\t\t\t{{ vm().slideLabel }}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t@if (vm().targetSectionId) {\n\t\t\t\t\t\t\t<div style=\"font-size:10px;color:rgba(0,0,0,0.4)\">{{ vm().targetSectionId }}</div>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t}\n\n\t\t\t\t<div\n\t\t\t\t\tstyle=\"position:absolute;bottom:4px;right:4px;font-size:9px;padding:1px 4px;border-radius:2px;background-color:rgba(0,0,0,0.5);color:#fff;pointer-events:none;line-height:1.4\"\n\t\t\t\t>\n\t\t\t\t\t{{ vm().badgeText }}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t`,\n})\nexport class ZoomRendererComponent {\n\treadonly element = input.required<PptxElement>();\n\treadonly zIndex = input<number>(0);\n\treadonly mediaDataUrls = input<Map<string, string>>(new Map());\n\n\treadonly containerStyle = computed<StyleMap>(() =>\n\t\tbuildZoomContainerStyle(this.element(), this.zIndex()),\n\t);\n\n\treadonly vm = computed<ZoomViewModel>(() => buildZoomViewModel(this.element()));\n}\n","import { NgStyle } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport type { PptxElement, TextSegment } from 'pptx-viewer-core';\nimport { hasTextProperties } from 'pptx-viewer-core';\n\nimport { ChartRendererComponent } from './chart-renderer.component';\nimport { ConnectorRendererComponent } from './connector-renderer.component';\nimport {\n\tgetContainerStyle,\n\tgetImageSrc,\n\tgetShapeFillStrokeStyle,\n\tgetTextBlockStyle,\n} from './element-style';\nimport type { StyleMap } from './element-style';\nimport { EquationRendererComponent } from './equation-renderer.component';\nimport { resolveHyperlinkHref } from './hyperlink';\nimport { InkRendererComponent } from './ink-renderer.component';\nimport { Model3DRendererComponent } from './model3d-renderer.component';\nimport { OleRendererComponent } from './ole-renderer.component';\nimport { SmartArtRendererComponent } from './smart-art-renderer.component';\nimport { TableRendererComponent } from './table-renderer.component';\nimport { bulletIndentPx, resolveParagraphBullet } from './text-bullets';\nimport { ZoomRendererComponent } from './zoom-renderer.component';\n\ninterface TextRun {\n\ttext: string;\n\tstyle: StyleMap;\n\t/** Safe `href` when this run carries a renderable hyperlink. */\n\thref?: string;\n\t/** Hyperlink tooltip / title text. */\n\ttooltip?: string;\n\t/** Parsed OMML for an inline equation run (rendered as MathML). */\n\tequationXml?: Record<string, unknown>;\n\t/** Optional equation number for numbered equations. */\n\tequationNumber?: string;\n}\n\ninterface Paragraph {\n\truns: TextRun[];\n\t/** Bullet / number marker text, when this paragraph is a list item. */\n\tbulletMarker?: string;\n\t/** `[ngStyle]` map for the bullet marker (colour / font). */\n\tbulletStyle: StyleMap;\n\t/** Left indent in px derived from the paragraph outline level. */\n\tindentPx: number;\n}\n\n/**\n * ElementRendererComponent — Angular port of the React `ElementRenderer.tsx`\n * and the Vue `ElementRenderer.vue`.\n *\n * Renders a single slide element by its `type` discriminant (viewer-first\n * subset):\n * - `text` / `shape` → positioned box with fill/stroke + rich text + effects\n * - `connector` → SVG straight/bent/curved connector\n * - `chart` → inline-SVG chart (bar/line/area/pie/scatter)\n * - `table` → HTML `<table>`\n * - `smartArt` → SVG drawing-shapes / node-text fallback\n * - `ink` → SVG ink strokes\n * - `ole` → embedded-object preview / icon\n * - `model3d` → poster / placeholder (no three.js)\n * - `zoom` → slide/section zoom thumbnail\n * - `picture` / `image` → `<img>`\n * - `media` → poster frame (`<img>`) — playback TODO\n * - `group` → recursive children (self-referencing selector)\n * - everything else → labelled placeholder (TODO, see PORTING.md)\n *\n * Interaction (selection, resize, inline editing) is not yet ported.\n */\n@Component({\n\tselector: 'pptx-element-renderer',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\timports: [\n\t\tNgStyle,\n\t\tConnectorRendererComponent,\n\t\tTableRendererComponent,\n\t\tChartRendererComponent,\n\t\tSmartArtRendererComponent,\n\t\tInkRendererComponent,\n\t\tOleRendererComponent,\n\t\tModel3DRendererComponent,\n\t\tZoomRendererComponent,\n\t\tEquationRendererComponent,\n\t],\n\ttemplate: `\n\t\t@switch (true) {\n\t\t\t@case (element().type === 'connector') {\n\t\t\t\t<pptx-connector-renderer [element]=\"element()\" [zIndex]=\"zIndex()\" />\n\t\t\t}\n\t\t\t@case (element().type === 'ink') {\n\t\t\t\t<pptx-ink-renderer\n\t\t\t\t\t[element]=\"element()\"\n\t\t\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@case (element().type === 'zoom') {\n\t\t\t\t<pptx-zoom-renderer\n\t\t\t\t\t[element]=\"element()\"\n\t\t\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@case (element().type === 'model3d') {\n\t\t\t\t<pptx-model3d-renderer\n\t\t\t\t\t[element]=\"element()\"\n\t\t\t\t\t[zIndex]=\"zIndex()\"\n\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t/>\n\t\t\t}\n\t\t\t@case (element().type === 'smartArt') {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-element pptx-ng-smartart\"\n\t\t\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t\t>\n\t\t\t\t\t<pptx-smart-art-renderer [element]=\"element()\" [zIndex]=\"zIndex()\" />\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case (element().type === 'ole') {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-element pptx-ng-ole\"\n\t\t\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t\t>\n\t\t\t\t\t<pptx-ole-renderer [element]=\"element()\" [zIndex]=\"zIndex()\" />\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case (element().type === 'chart') {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-element pptx-ng-chart\"\n\t\t\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t\t>\n\t\t\t\t\t<pptx-chart-renderer [element]=\"element()\" />\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case (element().type === 'table') {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-element pptx-ng-table\"\n\t\t\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t\t>\n\t\t\t\t\t<pptx-table-renderer [element]=\"element()\" />\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case (element().type === 'group') {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-element pptx-ng-group\"\n\t\t\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t\t>\n\t\t\t\t\t@for (child of children(); track child.id) {\n\t\t\t\t\t\t<pptx-element-renderer\n\t\t\t\t\t\t\t[element]=\"child\"\n\t\t\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t\t\t[zIndex]=\"$index\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case (isImageLike()) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-element pptx-ng-image\"\n\t\t\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t\t>\n\t\t\t\t\t@if (imageSrc()) {\n\t\t\t\t\t\t<img [src]=\"imageSrc()\" alt=\"\" class=\"pptx-ng-img\" />\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case (element().type === 'media') {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-element pptx-ng-media\"\n\t\t\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t\t>\n\t\t\t\t\t@if (imageSrc()) {\n\t\t\t\t\t\t<img [src]=\"imageSrc()\" alt=\"\" class=\"pptx-ng-img\" />\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<div class=\"pptx-ng-placeholder\">{{ placeholderLabel() }}</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@case (isShapeLike()) {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-element pptx-ng-shape\"\n\t\t\t\t\t[ngStyle]=\"shapeContainerStyle()\"\n\t\t\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t\t>\n\t\t\t\t\t@if (hasText()) {\n\t\t\t\t\t\t<div class=\"pptx-ng-text\" [ngStyle]=\"textStyle()\">\n\t\t\t\t\t\t\t@for (para of paragraphs(); track $index) {\n\t\t\t\t\t\t\t\t<p class=\"pptx-ng-para\" [style.padding-left.px]=\"para.indentPx\">\n\t\t\t\t\t\t\t\t\t@if (para.bulletMarker) {\n\t\t\t\t\t\t\t\t\t\t<span class=\"pptx-ng-bullet\" [ngStyle]=\"para.bulletStyle\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ para.bulletMarker }} </span\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\t@for (run of para.runs; track $index) {\n\t\t\t\t\t\t\t\t\t\t@if (run.equationXml) {\n\t\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\t[equationXml]=\"run.equationXml\"\n\t\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\t/>\n\t\t\t\t\t\t\t\t\t\t} @else if (\n\t\t\t\t\t\t\t\t\t\t\trun.text ===\n\t\t\t\t\t\t\t\t\t\t\t'\n'\n\t\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t\t} @else if (run.href) {\n\t\t\t\t\t\t\t\t\t\t\t<a\n\t\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\t[href]=\"run.href\"\n\t\t\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\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\t[attr.title]=\"run.tooltip ?? null\"\n\t\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\t>{{ run.text }}</a\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t} @else {\n\t\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\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\t\t\t@default {\n\t\t\t\t<div\n\t\t\t\t\tclass=\"pptx-ng-element pptx-ng-unsupported\"\n\t\t\t\t\t[ngStyle]=\"containerStyle()\"\n\t\t\t\t\t[attr.data-element-id]=\"element().id\"\n\t\t\t\t>\n\t\t\t\t\t<div class=\"pptx-ng-placeholder\">{{ placeholderLabel() }}</div>\n\t\t\t\t</div>\n\t\t\t}\n\t\t}\n\t`,\n})\nexport class ElementRendererComponent {\n\treadonly element = input.required<PptxElement>();\n\treadonly mediaDataUrls = input<Map<string, string>>(new Map());\n\treadonly zIndex = input<number>(0);\n\n\treadonly containerStyle = computed<StyleMap>(() =>\n\t\tgetContainerStyle(this.element(), this.zIndex()),\n\t);\n\treadonly shapeContainerStyle = computed<StyleMap>(() => ({\n\t\t...this.containerStyle(),\n\t\t...getShapeFillStrokeStyle(this.element()),\n\t}));\n\treadonly textStyle = computed<StyleMap>(() => getTextBlockStyle(this.element()));\n\treadonly imageSrc = computed(() => getImageSrc(this.element(), this.mediaDataUrls()));\n\n\treadonly children = computed<PptxElement[]>(() => {\n\t\tconst el = this.element();\n\t\treturn el.type === 'group' ? (el.children ?? []) : [];\n\t});\n\n\treadonly isShapeLike = computed(\n\t\t() => this.element().type === 'text' || this.element().type === 'shape',\n\t);\n\treadonly isImageLike = computed(\n\t\t() => this.element().type === 'picture' || this.element().type === 'image',\n\t);\n\n\treadonly paragraphs = computed<Paragraph[]>(() => {\n\t\tconst el = this.element();\n\t\tif (!hasTextProperties(el)) {\n\t\t\treturn [];\n\t\t}\n\t\tconst segments = el.textSegments;\n\t\tif (!segments || segments.length === 0) {\n\t\t\treturn el.text\n\t\t\t\t? [{ runs: [{ text: el.text, style: {} }], bulletStyle: {}, indentPx: 0 }]\n\t\t\t\t: [];\n\t\t}\n\t\tconst out: Paragraph[] = [{ runs: [], bulletStyle: {}, indentPx: 0 }];\n\t\tlet paraStarted = false;\n\t\tfor (const seg of segments) {\n\t\t\tif (seg.isParagraphBreak) {\n\t\t\t\tout.push({ runs: [], bulletStyle: {}, indentPx: 0 });\n\t\t\t\tparaStarted = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst current = out[out.length - 1];\n\t\t\t// The first segment of each paragraph carries its bullet + outline level.\n\t\t\tif (!paraStarted) {\n\t\t\t\tparaStarted = true;\n\t\t\t\tcurrent.indentPx = bulletIndentPx(seg.paragraphLevel);\n\t\t\t\tconst bullet = resolveParagraphBullet(seg);\n\t\t\t\tif (bullet) {\n\t\t\t\t\tcurrent.bulletMarker = bullet.marker;\n\t\t\t\t\tif (bullet.color) {\n\t\t\t\t\t\tcurrent.bulletStyle['color'] = bullet.color;\n\t\t\t\t\t}\n\t\t\t\t\tif (bullet.fontFamily) {\n\t\t\t\t\t\tcurrent.bulletStyle['font-family'] = bullet.fontFamily;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (seg.equationXml) {\n\t\t\t\tcurrent.runs.push({\n\t\t\t\t\ttext: '',\n\t\t\t\t\tstyle: this.segmentStyle(seg),\n\t\t\t\t\tequationXml: seg.equationXml,\n\t\t\t\t\tequationNumber: seg.equationNumber,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst text = seg.isLineBreak ? '\\n' : seg.text;\n\t\t\tif (text) {\n\t\t\t\tconst href = resolveHyperlinkHref(seg.style?.hyperlink);\n\t\t\t\tcurrent.runs.push({\n\t\t\t\t\ttext,\n\t\t\t\t\tstyle: this.segmentStyle(seg),\n\t\t\t\t\thref,\n\t\t\t\t\ttooltip: href ? seg.style?.hyperlinkTooltip : undefined,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn out.filter((p) => p.runs.length > 0 || p.bulletMarker !== undefined || out.length === 1);\n\t});\n\n\treadonly hasText = computed(() =>\n\t\tthis.paragraphs().some((p) => p.runs.length > 0 || p.bulletMarker !== undefined),\n\t);\n\n\treadonly placeholderLabel = computed(() => {\n\t\tconst map: Record<string, string> = {\n\t\t\tgroup: 'Group',\n\t\t\tmedia: 'Media',\n\t\t};\n\t\treturn map[this.element().type] ?? this.element().type;\n\t});\n\n\tprivate segmentStyle(seg: TextSegment): StyleMap {\n\t\tconst s = seg.style ?? {};\n\t\tconst style: StyleMap = {};\n\t\tif (s.fontFamily) {\n\t\t\tstyle['font-family'] = s.fontFamily;\n\t\t}\n\t\tif (typeof s.fontSize === 'number') {\n\t\t\tstyle['font-size'] = `${s.fontSize}pt`;\n\t\t}\n\t\tif (s.color) {\n\t\t\tstyle['color'] = s.color;\n\t\t}\n\t\tif (s.bold) {\n\t\t\tstyle['font-weight'] = 'bold';\n\t\t}\n\t\tif (s.italic) {\n\t\t\tstyle['font-style'] = 'italic';\n\t\t}\n\t\tconst deco: string[] = [];\n\t\tif (s.underline) {\n\t\t\tdeco.push('underline');\n\t\t}\n\t\tif (s.strikethrough) {\n\t\t\tdeco.push('line-through');\n\t\t}\n\t\tif (deco.length > 0) {\n\t\t\tstyle['text-decoration'] = deco.join(' ');\n\t\t}\n\t\treturn style;\n\t}\n}\n","/**\n * Slide-background style resolution.\n *\n * Maps a `PptxSlide`'s background fields to a `[ngStyle]`-compatible map for\n * the slide stage. Mirrors the React `SlideCanvas` background handling and the\n * Vue port: the core parser resolves the theme/master chain onto the slide, so\n * here we only translate the already-resolved fields to CSS.\n *\n * Precedence (highest first): image fill → gradient → pattern → solid colour.\n * Pattern fills currently approximate to their background colour (the SVG\n * pattern preset renderer — `color-patterns.ts` in React — is a shared\n * extraction candidate; see PORTING.md).\n */\nimport type { PptxSlide } from 'pptx-viewer-core';\n\nimport type { StyleMap } from './element-style';\n\n/** Default slide stage colour when a slide carries no usable background. */\nexport const DEFAULT_SLIDE_BACKGROUND = '#ffffff';\n\n/**\n * Build the background portion of the slide stage style from a slide's\n * resolved background fields. Returns only `background-*` properties so the\n * caller can spread it into the rest of the stage style.\n */\nexport function getSlideBackgroundStyle(slide: PptxSlide | undefined): StyleMap {\n\tconst style: StyleMap = {};\n\n\t// Base solid colour. For pattern fills the parser leaves `backgroundColor`\n\t// set to the foreground colour, so prefer the pattern's `bgColor` as the\n\t// flat base (until the SVG pattern preset is ported).\n\tconst pattern = slide?.backgroundPattern;\n\tconst solid =\n\t\tslide?.backgroundColor && slide.backgroundColor !== 'transparent'\n\t\t\t? slide.backgroundColor\n\t\t\t: undefined;\n\tstyle['background-color'] = pattern?.bgColor ?? solid ?? DEFAULT_SLIDE_BACKGROUND;\n\n\t// Image fill takes precedence over a gradient; the gradient string from the\n\t// parser is already a complete `linear-gradient(...)` / `radial-gradient(...)`.\n\tif (slide?.backgroundImage) {\n\t\tstyle['background-image'] = `url(${slide.backgroundImage})`;\n\t\tstyle['background-size'] = '100% 100%';\n\t\tstyle['background-repeat'] = 'no-repeat';\n\t} else if (slide?.backgroundGradient) {\n\t\tstyle['background-image'] = slide.backgroundGradient;\n\t}\n\n\treturn style;\n}\n","/**\n * Pure snap-and-alignment-guide geometry for the Angular editor.\n *\n * No Angular imports, no DOM, no side effects — only data in, data out.\n * All inputs are treated as immutable.\n *\n * Usage during a drag:\n * 1. Compute the candidate box from the raw pointer delta (via applyMove).\n * 2. Call computeSnap(candidateBox, allOtherElementBoxes, threshold / zoom).\n * 3. Apply the returned x/y as the live CSS transform position.\n * 4. Render the returned guides as thin coloured lines on the canvas overlay.\n * 5. Clear guides on pointerup.\n */\n\n/** An axis-aligned bounding box in stage (slide) coordinates. */\nexport interface SnapBox {\n\tx: number;\n\ty: number;\n\twidth: number;\n\theight: number;\n}\n\n/**\n * A single guide line to draw.\n *\n * `axis: 'x'` → a vertical line at x = `pos`, spanning y ∈ [start, end].\n * `axis: 'y'` → a horizontal line at y = `pos`, spanning x ∈ [start, end].\n */\nexport interface SnapGuide {\n\taxis: 'x' | 'y';\n\t/** The fixed coordinate of the line on its own axis. */\n\tpos: number;\n\t/** Start of the line along the perpendicular axis. */\n\tstart: number;\n\t/** End of the line along the perpendicular axis. */\n\tend: number;\n}\n\n/** The result of a snap computation for one drag frame. */\nexport interface SnapResult {\n\t/** Snapped x origin of the moving box (box.x adjusted so candidate aligns to the matched other line). */\n\tx: number;\n\t/** Snapped y origin of the moving box. */\n\ty: number;\n\t/** Guide lines to draw; empty when nothing is within threshold. */\n\tguides: SnapGuide[];\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/** The three axis-aligned candidate positions for a box on one axis. */\ninterface Candidates {\n\tleading: number; // left / top\n\tcentre: number; // centreX / centreY\n\ttrailing: number; // right / bottom\n}\n\nfunction xCandidates(box: SnapBox): Candidates {\n\treturn {\n\t\tleading: box.x,\n\t\tcentre: box.x + box.width / 2,\n\t\ttrailing: box.x + box.width,\n\t};\n}\n\nfunction yCandidates(box: SnapBox): Candidates {\n\treturn {\n\t\tleading: box.y,\n\t\tcentre: box.y + box.height / 2,\n\t\ttrailing: box.y + box.height,\n\t};\n}\n\n/**\n * Computes the snap offset for one axis.\n *\n * Returns `{ delta, matchedLine, otherBox }` for the closest candidate/other-line\n * pair whose |distance| ≤ threshold, or `null` when nothing is within range.\n *\n * `delta` is the amount to add to the moving box's origin so that the\n * matched candidate aligns exactly on `matchedLine`.\n */\ninterface SnapHit {\n\tdelta: number;\n\tmatchedLine: number;\n\totherBox: SnapBox;\n}\n\nfunction findSnapHitX(box: SnapBox, others: readonly SnapBox[], threshold: number): SnapHit | null {\n\tconst moving = xCandidates(box);\n\tconst movingValues: readonly number[] = [moving.leading, moving.centre, moving.trailing];\n\n\tlet best: SnapHit | null = null;\n\tlet bestDist = threshold + 1; // anything beyond threshold is ignored\n\n\tfor (const other of others) {\n\t\tconst target = xCandidates(other);\n\t\tconst targetValues: readonly number[] = [target.leading, target.centre, target.trailing];\n\n\t\tfor (let mi = 0; mi < movingValues.length; mi++) {\n\t\t\tconst mv = movingValues[mi];\n\t\t\tfor (let ti = 0; ti < targetValues.length; ti++) {\n\t\t\t\tconst tv = targetValues[ti];\n\t\t\t\tconst dist = mv > tv ? mv - tv : tv - mv; // Math.abs without ES2022+ concern\n\t\t\t\tif (dist <= threshold && dist < bestDist) {\n\t\t\t\t\tbestDist = dist;\n\t\t\t\t\t// Shift the box so the matching candidate line lands on `tv`.\n\t\t\t\t\tbest = {\n\t\t\t\t\t\tdelta: tv - mv,\n\t\t\t\t\t\tmatchedLine: tv,\n\t\t\t\t\t\totherBox: other,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn best;\n}\n\nfunction findSnapHitY(box: SnapBox, others: readonly SnapBox[], threshold: number): SnapHit | null {\n\tconst moving = yCandidates(box);\n\tconst movingValues: readonly number[] = [moving.leading, moving.centre, moving.trailing];\n\n\tlet best: SnapHit | null = null;\n\tlet bestDist = threshold + 1;\n\n\tfor (const other of others) {\n\t\tconst target = yCandidates(other);\n\t\tconst targetValues: readonly number[] = [target.leading, target.centre, target.trailing];\n\n\t\tfor (let mi = 0; mi < movingValues.length; mi++) {\n\t\t\tconst mv = movingValues[mi];\n\t\t\tfor (let ti = 0; ti < targetValues.length; ti++) {\n\t\t\t\tconst tv = targetValues[ti];\n\t\t\t\tconst dist = mv > tv ? mv - tv : tv - mv;\n\t\t\t\tif (dist <= threshold && dist < bestDist) {\n\t\t\t\t\tbestDist = dist;\n\t\t\t\t\tbest = {\n\t\t\t\t\t\tdelta: tv - mv,\n\t\t\t\t\t\tmatchedLine: tv,\n\t\t\t\t\t\totherBox: other,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn best;\n}\n\n/** Union of the two boxes' extent along a single axis (for guide span). */\nfunction unionExtent(\n\taStart: number,\n\taEnd: number,\n\tbStart: number,\n\tbEnd: number,\n): { start: number; end: number } {\n\tconst start = aStart < bStart ? aStart : bStart;\n\tconst end = aEnd > bEnd ? aEnd : bEnd;\n\treturn { start, end };\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Compute snap adjustments and guide lines for a box being dragged.\n *\n * For each axis independently:\n * - The moving box has three candidate positions (leading, centre, trailing).\n * - Every other box exposes the same three positions on that axis.\n * - If any |candidate − otherPos| ≤ threshold, the closest pair snaps: the\n * returned x (or y) is adjusted so the candidate aligns exactly with the\n * other position, and a SnapGuide is emitted along the axis spanning both\n * boxes' perpendicular extents.\n * - At most one snap per axis (closest wins).\n * - When nothing is within threshold, x/y are returned unchanged and guides\n * is empty.\n */\nexport function computeSnap(\n\tbox: SnapBox,\n\tothers: readonly SnapBox[],\n\tthreshold: number,\n): SnapResult {\n\tconst guides: SnapGuide[] = [];\n\tlet snappedX = box.x;\n\tlet snappedY = box.y;\n\n\t// --- X axis ---\n\tconst hitX = findSnapHitX(box, others, threshold);\n\tif (hitX !== null) {\n\t\tsnappedX = box.x + hitX.delta;\n\t\t// Guide: vertical line (axis:'x') at matchedLine, spanning both boxes' Y extents.\n\t\tconst movedBoxTop = box.y;\n\t\tconst movedBoxBottom = box.y + box.height;\n\t\tconst { start, end } = unionExtent(\n\t\t\tmovedBoxTop,\n\t\t\tmovedBoxBottom,\n\t\t\thitX.otherBox.y,\n\t\t\thitX.otherBox.y + hitX.otherBox.height,\n\t\t);\n\t\tguides.push({ axis: 'x', pos: hitX.matchedLine, start, end });\n\t}\n\n\t// --- Y axis ---\n\tconst hitY = findSnapHitY(box, others, threshold);\n\tif (hitY !== null) {\n\t\tsnappedY = box.y + hitY.delta;\n\t\t// Guide: horizontal line (axis:'y') at matchedLine, spanning both boxes' X extents.\n\t\t// Use snappedX for the moved box's horizontal extent so the guide reflects final position.\n\t\tconst movedBoxLeft = snappedX;\n\t\tconst movedBoxRight = snappedX + box.width;\n\t\tconst { start, end } = unionExtent(\n\t\t\tmovedBoxLeft,\n\t\t\tmovedBoxRight,\n\t\t\thitY.otherBox.x,\n\t\t\thitY.otherBox.x + hitY.otherBox.width,\n\t\t);\n\t\tguides.push({ axis: 'y', pos: hitY.matchedLine, start, end });\n\t}\n\n\treturn { x: snappedX, y: snappedY, guides };\n}\n","import { NgStyle } from '@angular/common';\nimport {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\teffect,\n\tElementRef,\n\tHostListener,\n\tinput,\n\toutput,\n\tsignal,\n\tviewChild,\n} from '@angular/core';\nimport type { PptxElement, PptxSlide } from 'pptx-viewer-core';\nimport { hasTextProperties } from 'pptx-viewer-core';\n\nimport type { CanvasSize } from '../internal/shared';\nimport { applyMove, applyResize, handleAnchor, handleCursor, RESIZE_HANDLES } from './drag-resize';\nimport type { Box, ResizeHandle } from './drag-resize';\nimport { ElementRendererComponent } from './element-renderer.component';\nimport type { StyleMap } from './element-style';\nimport { getSlideBackgroundStyle } from './slide-background';\nimport { computeSnap } from './snap-guides';\nimport type { SnapGuide } from './snap-guides';\n\n/** Pixels (screen-space) a pointer must move before a click becomes a drag. */\nconst DRAG_THRESHOLD = 3;\n/** Handle size in screen pixels (fine pointer — mouse/trackpad). */\nconst HANDLE_SCREEN_PX_FINE = 9;\n/** Handle size in screen pixels (coarse pointer — touch); larger hit target. */\nconst HANDLE_SCREEN_PX_COARSE = 20;\n/** Snap distance (screen pixels) for alignment guides. */\nconst SNAP_SCREEN_PX = 6;\n/** Max delay (ms) between two taps to count as a double-tap on touch. */\nconst DOUBLE_TAP_MS = 300;\n\n/**\n * True when the primary pointer is coarse (touch). Computed once at module\n * load; guarded for environments without `matchMedia` (SSR/tests).\n */\nconst IS_COARSE_POINTER: boolean =\n\ttypeof matchMedia === 'function' && matchMedia('(pointer: coarse)').matches;\n\n/** Resize/rotate handle size in screen pixels for the current pointer kind. */\nconst HANDLE_SCREEN_PX = IS_COARSE_POINTER ? HANDLE_SCREEN_PX_COARSE : HANDLE_SCREEN_PX_FINE;\n\ninterface DragState {\n\tid: string;\n\tmode: 'move' | 'resize' | 'rotate';\n\thandle: ResizeHandle | null;\n\tstartBox: Box;\n\tstartX: number;\n\tstartY: number;\n\tstarted: boolean;\n\t/** Rotation-gesture state (stage coords + degrees). */\n\tcenterX?: number;\n\tcenterY?: number;\n\tstartAngle?: number;\n\tstartRotation?: number;\n}\n\n/** Best-effort plain text of a text-bearing element for inline editing. */\nfunction plainText(el: PptxElement): string {\n\tif (!hasTextProperties(el)) {\n\t\treturn '';\n\t}\n\tconst segments = el.textSegments;\n\tif (segments && segments.length > 0) {\n\t\treturn segments.map((s) => (s.isParagraphBreak || s.isLineBreak ? '\\n' : s.text)).join('');\n\t}\n\treturn el.text ?? '';\n}\n\n/**\n * SlideCanvasComponent — Angular port of the React `SlideCanvas.tsx` and Vue\n * `SlideCanvas.vue`.\n *\n * Renders the active slide as a fixed-size stage scaled by `zoom`, with each\n * element absolutely positioned. When `editable`, supports click-to-select\n * (event delegation), selection outlines, and pointer drag-to-move / resize\n * handles. Rulers, grid, guides, marquee, and collaboration overlays are\n * tracked in PORTING.md.\n */\n@Component({\n\tselector: 'pptx-slide-canvas',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\timports: [NgStyle, ElementRendererComponent],\n\tstyles: [\n\t\t`\n\t\t\t/*\n\t\t\t * In editor mode the stage must own all pointer gestures so touch\n\t\t\t * drag/resize/rotate/marquee aren't stolen by the browser for\n\t\t\t * panning/pinch-zooming. View-only mode keeps default behaviour so\n\t\t\t * the slide can still be scrolled.\n\t\t\t */\n\t\t\t.pptx-ng-canvas-stage.is-editable {\n\t\t\t\ttouch-action: none;\n\t\t\t}\n\t\t`,\n\t],\n\ttemplate: `\n\t\t<div class=\"pptx-ng-canvas-viewport\">\n\t\t\t<div class=\"pptx-ng-canvas-wrapper\" [ngStyle]=\"wrapperStyle()\">\n\t\t\t\t<div\n\t\t\t\t\t#stage\n\t\t\t\t\tclass=\"pptx-ng-canvas-stage\"\n\t\t\t\t\t[class.is-editable]=\"editable()\"\n\t\t\t\t\trole=\"region\"\n\t\t\t\t\taria-roledescription=\"slide\"\n\t\t\t\t\t[ngStyle]=\"stageStyle()\"\n\t\t\t\t\t(pointerdown)=\"onStagePointerDown($event)\"\n\t\t\t\t\t(contextmenu)=\"onContextMenu($event)\"\n\t\t\t\t\t(dblclick)=\"onDblClick($event)\"\n\t\t\t\t>\n\t\t\t\t\t@for (element of elements(); track element.id; let i = $index) {\n\t\t\t\t\t\t<pptx-element-renderer\n\t\t\t\t\t\t\t[element]=\"element\"\n\t\t\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t\t\t[zIndex]=\"i\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t\t@for (box of selectionBoxes(); track box.id) {\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"pptx-ng-selection\"\n\t\t\t\t\t\t\t[style.left.px]=\"box.x\"\n\t\t\t\t\t\t\t[style.top.px]=\"box.y\"\n\t\t\t\t\t\t\t[style.width.px]=\"box.width\"\n\t\t\t\t\t\t\t[style.height.px]=\"box.height\"\n\t\t\t\t\t\t></div>\n\t\t\t\t\t}\n\t\t\t\t\t@for (h of handleBoxes(); track h.handle) {\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"pptx-ng-handle\"\n\t\t\t\t\t\t\t[style.left.px]=\"h.left\"\n\t\t\t\t\t\t\t[style.top.px]=\"h.top\"\n\t\t\t\t\t\t\t[style.width.px]=\"h.size\"\n\t\t\t\t\t\t\t[style.height.px]=\"h.size\"\n\t\t\t\t\t\t\t[style.cursor]=\"h.cursor\"\n\t\t\t\t\t\t\t(pointerdown)=\"onHandlePointerDown($event, h.handle)\"\n\t\t\t\t\t\t></div>\n\t\t\t\t\t}\n\t\t\t\t\t@if (marqueeRect(); as mr) {\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"pptx-ng-marquee\"\n\t\t\t\t\t\t\t[style.left.px]=\"mr.x\"\n\t\t\t\t\t\t\t[style.top.px]=\"mr.y\"\n\t\t\t\t\t\t\t[style.width.px]=\"mr.width\"\n\t\t\t\t\t\t\t[style.height.px]=\"mr.height\"\n\t\t\t\t\t\t></div>\n\t\t\t\t\t}\n\t\t\t\t\t@for (g of snapGuides(); track $index) {\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"pptx-ng-snap-guide\"\n\t\t\t\t\t\t\t[style.left.px]=\"g.axis === 'x' ? g.pos : g.start\"\n\t\t\t\t\t\t\t[style.top.px]=\"g.axis === 'x' ? g.start : g.pos\"\n\t\t\t\t\t\t\t[style.width.px]=\"g.axis === 'x' ? 0 : g.end - g.start\"\n\t\t\t\t\t\t\t[style.height.px]=\"g.axis === 'x' ? g.end - g.start : 0\"\n\t\t\t\t\t\t></div>\n\t\t\t\t\t}\n\t\t\t\t\t@if (rotateHandle(); as rh) {\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"pptx-ng-rotate-handle\"\n\t\t\t\t\t\t\t[style.left.px]=\"rh.left\"\n\t\t\t\t\t\t\t[style.top.px]=\"rh.top\"\n\t\t\t\t\t\t\t[style.width.px]=\"rh.size\"\n\t\t\t\t\t\t\t[style.height.px]=\"rh.size\"\n\t\t\t\t\t\t\t(pointerdown)=\"onRotatePointerDown($event)\"\n\t\t\t\t\t\t></div>\n\t\t\t\t\t}\n\t\t\t\t\t@if (editingBox(); as eb) {\n\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\t#textEditor\n\t\t\t\t\t\t\tclass=\"pptx-ng-text-editor\"\n\t\t\t\t\t\t\t[style.left.px]=\"eb.x\"\n\t\t\t\t\t\t\t[style.top.px]=\"eb.y\"\n\t\t\t\t\t\t\t[style.width.px]=\"eb.width\"\n\t\t\t\t\t\t\t[style.height.px]=\"eb.height\"\n\t\t\t\t\t\t\t(pointerdown)=\"$event.stopPropagation()\"\n\t\t\t\t\t\t\t(blur)=\"commitText($event, eb.id)\"\n\t\t\t\t\t\t\t(keydown)=\"onEditorKeydown($event)\"\n\t\t\t\t\t\t></textarea>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t`,\n})\nexport class SlideCanvasComponent {\n\treadonly slide = input<PptxSlide | undefined>(undefined);\n\treadonly canvasSize = input.required<CanvasSize>();\n\treadonly mediaDataUrls = input<Map<string, string>>(new Map());\n\treadonly zoom = input<number>(1);\n\t/** When true, elements are selectable and drag/resize handles are shown. */\n\treadonly editable = input<boolean>(false);\n\t/** Ids of currently-selected elements (drawn with a selection outline). */\n\treadonly selectedIds = input<readonly string[]>([]);\n\t/** Id of the element currently being text-edited inline (or null). */\n\treadonly editingId = input<string | null>(null);\n\n\t/** Emitted when an element is pointer-pressed (with the additive modifier). */\n\treadonly elementSelect = output<{ id: string; additive: boolean }>();\n\t/** Emitted when empty stage space is pressed (deselect). */\n\treadonly backgroundClick = output<void>();\n\t/** Emitted once when a drag/resize gesture actually starts moving. */\n\treadonly transformStart = output<{ id: string; label: string }>();\n\t/** Emitted on each pointer move during a gesture with the new box. */\n\treadonly transformUpdate = output<{ id: string; box: Box }>();\n\t/** Emitted on right-click with the element under the cursor (or null). */\n\treadonly contextMenu = output<{ id: string | null; x: number; y: number }>();\n\t/** Emitted on double-click of a text-bearing element to begin inline edit. */\n\treadonly textEditStart = output<{ id: string }>();\n\t/** Emitted with the new text when an inline edit commits. */\n\treadonly textCommit = output<{ id: string; text: string }>();\n\t/** Emitted when an inline edit is cancelled (Escape). */\n\treadonly textCancel = output<void>();\n\t/** Emitted during a rotate gesture with the new rotation (degrees). */\n\treadonly rotateUpdate = output<{ id: string; rotation: number }>();\n\t/** Emitted on marquee release with the ids of enclosed/overlapping elements. */\n\treadonly marqueeSelect = output<string[]>();\n\n\tprivate drag: DragState | null = null;\n\tprivate editCancelled = false;\n\tprivate marquee: {\n\t\tstartX: number;\n\t\tstartY: number;\n\t\tstartScreenX: number;\n\t\tstartScreenY: number;\n\t\tstarted: boolean;\n\t} | null = null;\n\t/** Live marquee rectangle (stage coords) while rubber-band selecting. */\n\treadonly marqueeRect = signal<{ x: number; y: number; width: number; height: number } | null>(\n\t\tnull,\n\t);\n\t/** Live alignment-snap guide lines (stage coords) during a move. */\n\treadonly snapGuides = signal<readonly SnapGuide[]>([]);\n\n\tprivate readonly textEditor = viewChild<ElementRef<HTMLTextAreaElement>>('textEditor');\n\tprivate readonly stageRef = viewChild<ElementRef<HTMLElement>>('stage');\n\n\t/** The editing id we've already initialised the textarea for, to avoid re-seeding its value mid-edit. */\n\tprivate seededEditId: string | null = null;\n\t/** Last-tap timestamp + element id, for synthetic double-tap detection on touch. */\n\tprivate lastTap: { id: string; time: number } | null = null;\n\n\tconstructor() {\n\t\t// Seed + focus the inline editor exactly once when it first appears for a\n\t\t// given element. The textarea is UNCONTROLLED (no `[value]` binding): if\n\t\t// Angular rewrote `value` on every change-detection pass the caret would\n\t\t// jump to position 0 and typed text would reverse. We therefore set the\n\t\t// initial text and select it only on first appearance, and never touch\n\t\t// `value` again while the user types.\n\t\teffect(() => {\n\t\t\tconst editor = this.textEditor();\n\t\t\tconst box = this.editingBox();\n\t\t\tif (!editor || !box) {\n\t\t\t\tif (!box) {\n\t\t\t\t\tthis.seededEditId = null;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.seededEditId === box.id) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.seededEditId = box.id;\n\t\t\teditor.nativeElement.value = box.text;\n\t\t\teditor.nativeElement.focus();\n\t\t\teditor.nativeElement.select();\n\t\t});\n\t}\n\n\treadonly elements = computed(() => this.slide()?.elements ?? []);\n\n\t/** Bounding boxes (stage coords) for the selected elements. */\n\treadonly selectionBoxes = computed(() => {\n\t\tconst selected = new Set(this.selectedIds());\n\t\tif (selected.size === 0) {\n\t\t\treturn [];\n\t\t}\n\t\treturn this.elements()\n\t\t\t.filter((el) => selected.has(el.id))\n\t\t\t.map((el) => ({ id: el.id, x: el.x, y: el.y, width: el.width, height: el.height }));\n\t});\n\n\t/** The single selected element's box, or null when 0 or >1 are selected. */\n\treadonly singleSelected = computed<(Box & { id: string }) | null>(() => {\n\t\tconst ids = this.selectedIds();\n\t\tif (ids.length !== 1) {\n\t\t\treturn null;\n\t\t}\n\t\tconst el = this.elements().find((e) => e.id === ids[0]);\n\t\treturn el ? { id: el.id, x: el.x, y: el.y, width: el.width, height: el.height } : null;\n\t});\n\n\t/** Resize-handle render boxes (stage coords) for the single selection. */\n\treadonly handleBoxes = computed(() => {\n\t\tif (!this.editable()) {\n\t\t\treturn [];\n\t\t}\n\t\tconst box = this.singleSelected();\n\t\tif (!box) {\n\t\t\treturn [];\n\t\t}\n\t\tconst size = HANDLE_SCREEN_PX / (this.zoom() || 1);\n\t\treturn RESIZE_HANDLES.map((handle) => {\n\t\t\tconst { fx, fy } = handleAnchor(handle);\n\t\t\treturn {\n\t\t\t\thandle,\n\t\t\t\tleft: box.x + fx * box.width - size / 2,\n\t\t\t\ttop: box.y + fy * box.height - size / 2,\n\t\t\t\tsize,\n\t\t\t\tcursor: handleCursor(handle),\n\t\t\t};\n\t\t});\n\t});\n\n\t/** Rotation-handle box (stage coords) above the single selection, or null. */\n\treadonly rotateHandle = computed(() => {\n\t\tif (!this.editable()) {\n\t\t\treturn null;\n\t\t}\n\t\tconst box = this.singleSelected();\n\t\tif (!box) {\n\t\t\treturn null;\n\t\t}\n\t\tconst zoom = this.zoom() || 1;\n\t\tconst size = HANDLE_SCREEN_PX / zoom;\n\t\tconst offset = 24 / zoom;\n\t\treturn { left: box.x + box.width / 2 - size / 2, top: box.y - offset - size / 2, size };\n\t});\n\n\tonStagePointerDown(event: PointerEvent): void {\n\t\tif (!this.editable()) {\n\t\t\treturn;\n\t\t}\n\t\t// Capture the pointer so subsequent move/up events keep firing even when\n\t\t// the finger drifts off the original target (essential on touch, where the\n\t\t// browser would otherwise route the gesture elsewhere).\n\t\t(event.target as Element | null)?.setPointerCapture?.(event.pointerId);\n\t\tconst target = event.target as HTMLElement | null;\n\t\tconst host = target?.closest('[data-element-id]') as HTMLElement | null;\n\t\tconst id = host?.getAttribute('data-element-id');\n\t\t// Synthetic double-tap: two presses on the same element within\n\t\t// DOUBLE_TAP_MS begin inline text editing (native dblclick is unreliable\n\t\t// on touch). Desktop dblclick is handled separately in onDblClick.\n\t\tif (id) {\n\t\t\tconst now = event.timeStamp || Date.now();\n\t\t\tif (this.lastTap && this.lastTap.id === id && now - this.lastTap.time < DOUBLE_TAP_MS) {\n\t\t\t\tthis.lastTap = null;\n\t\t\t\tthis.textEditStart.emit({ id });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.lastTap = { id, time: now };\n\t\t} else {\n\t\t\tthis.lastTap = null;\n\t\t}\n\t\tif (!id) {\n\t\t\t// Empty space: begin a marquee (rubber-band) selection.\n\t\t\tconst stage = this.stageRef()?.nativeElement;\n\t\t\tif (stage) {\n\t\t\t\tconst rect = stage.getBoundingClientRect();\n\t\t\t\tconst zoom = this.zoom() || 1;\n\t\t\t\tthis.marquee = {\n\t\t\t\t\tstartX: (event.clientX - rect.left) / zoom,\n\t\t\t\t\tstartY: (event.clientY - rect.top) / zoom,\n\t\t\t\t\tstartScreenX: event.clientX,\n\t\t\t\t\tstartScreenY: event.clientY,\n\t\t\t\t\tstarted: false,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tthis.backgroundClick.emit();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tthis.elementSelect.emit({ id, additive: event.shiftKey || event.ctrlKey || event.metaKey });\n\t\tconst el = this.elements().find((e) => e.id === id);\n\t\tif (!el) {\n\t\t\treturn;\n\t\t}\n\t\tthis.drag = {\n\t\t\tid,\n\t\t\tmode: 'move',\n\t\t\thandle: null,\n\t\t\tstartBox: { x: el.x, y: el.y, width: el.width, height: el.height },\n\t\t\tstartX: event.clientX,\n\t\t\tstartY: event.clientY,\n\t\t\tstarted: false,\n\t\t};\n\t}\n\n\t/** Box + current plain text for the element under inline edit, or null. */\n\treadonly editingBox = computed(() => {\n\t\tconst id = this.editingId();\n\t\tif (!id || !this.editable()) {\n\t\t\treturn null;\n\t\t}\n\t\tconst el = this.elements().find((e) => e.id === id);\n\t\tif (!el) {\n\t\t\treturn null;\n\t\t}\n\t\treturn { id: el.id, x: el.x, y: el.y, width: el.width, height: el.height, text: plainText(el) };\n\t});\n\n\tonDblClick(event: MouseEvent): void {\n\t\tif (!this.editable()) {\n\t\t\treturn;\n\t\t}\n\t\tconst target = event.target as HTMLElement | null;\n\t\tconst host = target?.closest('[data-element-id]') as HTMLElement | null;\n\t\tconst id = host?.getAttribute('data-element-id');\n\t\tif (id) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.textEditStart.emit({ id });\n\t\t}\n\t}\n\n\tonEditorKeydown(event: KeyboardEvent): void {\n\t\tconst editor = event.target as HTMLTextAreaElement;\n\t\tif (event.key === 'Escape') {\n\t\t\tevent.preventDefault();\n\t\t\tthis.editCancelled = true;\n\t\t\teditor.blur();\n\t\t} else if (event.key === 'Enter' && !event.shiftKey) {\n\t\t\tevent.preventDefault();\n\t\t\teditor.blur();\n\t\t}\n\t}\n\n\tcommitText(event: Event, id: string): void {\n\t\tif (this.editCancelled) {\n\t\t\tthis.editCancelled = false;\n\t\t\tthis.textCancel.emit();\n\t\t\treturn;\n\t\t}\n\t\tconst editor = event.target as HTMLTextAreaElement;\n\t\tthis.textCommit.emit({ id, text: editor.value });\n\t}\n\n\tonContextMenu(event: MouseEvent): void {\n\t\tif (!this.editable()) {\n\t\t\treturn;\n\t\t}\n\t\tevent.preventDefault();\n\t\tconst target = event.target as HTMLElement | null;\n\t\tconst host = target?.closest('[data-element-id]') as HTMLElement | null;\n\t\tconst id = host?.getAttribute('data-element-id') ?? null;\n\t\tthis.contextMenu.emit({ id, x: event.clientX, y: event.clientY });\n\t}\n\n\tonHandlePointerDown(event: PointerEvent, handle: ResizeHandle): void {\n\t\tevent.stopPropagation();\n\t\t(event.target as Element | null)?.setPointerCapture?.(event.pointerId);\n\t\tconst box = this.singleSelected();\n\t\tif (!box) {\n\t\t\treturn;\n\t\t}\n\t\tthis.drag = {\n\t\t\tid: box.id,\n\t\t\tmode: 'resize',\n\t\t\thandle,\n\t\t\tstartBox: { x: box.x, y: box.y, width: box.width, height: box.height },\n\t\t\tstartX: event.clientX,\n\t\t\tstartY: event.clientY,\n\t\t\tstarted: false,\n\t\t};\n\t}\n\n\tonRotatePointerDown(event: PointerEvent): void {\n\t\tevent.stopPropagation();\n\t\t(event.target as Element | null)?.setPointerCapture?.(event.pointerId);\n\t\tconst box = this.singleSelected();\n\t\tconst stage = this.stageRef()?.nativeElement;\n\t\tif (!box || !stage) {\n\t\t\treturn;\n\t\t}\n\t\tconst el = this.elements().find((e) => e.id === box.id);\n\t\tconst zoom = this.zoom() || 1;\n\t\tconst rect = stage.getBoundingClientRect();\n\t\tconst centerX = box.x + box.width / 2;\n\t\tconst centerY = box.y + box.height / 2;\n\t\tconst px = (event.clientX - rect.left) / zoom;\n\t\tconst py = (event.clientY - rect.top) / zoom;\n\t\tthis.drag = {\n\t\t\tid: box.id,\n\t\t\tmode: 'rotate',\n\t\t\thandle: null,\n\t\t\tstartBox: box,\n\t\t\tstartX: event.clientX,\n\t\t\tstartY: event.clientY,\n\t\t\tstarted: false,\n\t\t\tcenterX,\n\t\t\tcenterY,\n\t\t\tstartAngle: Math.atan2(py - centerY, px - centerX),\n\t\t\tstartRotation: el?.rotation ?? 0,\n\t\t};\n\t}\n\n\t@HostListener('document:pointermove', ['$event'])\n\tonPointerMove(event: PointerEvent): void {\n\t\tconst marquee = this.marquee;\n\t\tif (marquee) {\n\t\t\tconst stage = this.stageRef()?.nativeElement;\n\t\t\tif (!stage) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!marquee.started &&\n\t\t\t\tMath.abs(event.clientX - marquee.startScreenX) < DRAG_THRESHOLD &&\n\t\t\t\tMath.abs(event.clientY - marquee.startScreenY) < DRAG_THRESHOLD\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmarquee.started = true;\n\t\t\tconst rect = stage.getBoundingClientRect();\n\t\t\tconst z = this.zoom() || 1;\n\t\t\tconst curX = (event.clientX - rect.left) / z;\n\t\t\tconst curY = (event.clientY - rect.top) / z;\n\t\t\tthis.marqueeRect.set({\n\t\t\t\tx: Math.min(marquee.startX, curX),\n\t\t\t\ty: Math.min(marquee.startY, curY),\n\t\t\t\twidth: Math.abs(curX - marquee.startX),\n\t\t\t\theight: Math.abs(curY - marquee.startY),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst drag = this.drag;\n\t\tif (!drag) {\n\t\t\treturn;\n\t\t}\n\t\tconst zoom = this.zoom() || 1;\n\n\t\tif (!drag.started) {\n\t\t\tif (\n\t\t\t\tMath.abs(event.clientX - drag.startX) < DRAG_THRESHOLD &&\n\t\t\t\tMath.abs(event.clientY - drag.startY) < DRAG_THRESHOLD\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdrag.started = true;\n\t\t\tconst label = drag.mode === 'move' ? 'Move' : drag.mode === 'resize' ? 'Resize' : 'Rotate';\n\t\t\tthis.transformStart.emit({ id: drag.id, label });\n\t\t}\n\n\t\tif (drag.mode === 'rotate') {\n\t\t\tconst stage = this.stageRef()?.nativeElement;\n\t\t\tif (\n\t\t\t\t!stage ||\n\t\t\t\tdrag.centerX === undefined ||\n\t\t\t\tdrag.centerY === undefined ||\n\t\t\t\tdrag.startAngle === undefined ||\n\t\t\t\tdrag.startRotation === undefined\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst rect = stage.getBoundingClientRect();\n\t\t\tconst px = (event.clientX - rect.left) / zoom;\n\t\t\tconst py = (event.clientY - rect.top) / zoom;\n\t\t\tconst angle = Math.atan2(py - drag.centerY, px - drag.centerX);\n\t\t\tconst deltaDeg = ((angle - drag.startAngle) * 180) / Math.PI;\n\t\t\tconst rotation = (((drag.startRotation + deltaDeg) % 360) + 360) % 360;\n\t\t\tthis.rotateUpdate.emit({ id: drag.id, rotation: Math.round(rotation) });\n\t\t\treturn;\n\t\t}\n\n\t\tconst dx = (event.clientX - drag.startX) / zoom;\n\t\tconst dy = (event.clientY - drag.startY) / zoom;\n\t\tlet box =\n\t\t\tdrag.mode === 'move' || drag.handle === null\n\t\t\t\t? applyMove(drag.startBox, dx, dy)\n\t\t\t\t: applyResize(drag.startBox, drag.handle, dx, dy);\n\n\t\t// Snap a move to nearby element edges/centres and show alignment guides.\n\t\tif (drag.mode === 'move') {\n\t\t\tconst others = this.elements()\n\t\t\t\t.filter((el) => el.id !== drag.id)\n\t\t\t\t.map((el) => ({ x: el.x, y: el.y, width: el.width, height: el.height }));\n\t\t\tconst snap = computeSnap(box, others, SNAP_SCREEN_PX / zoom);\n\t\t\tbox = { ...box, x: snap.x, y: snap.y };\n\t\t\tthis.snapGuides.set(snap.guides);\n\t\t}\n\t\tthis.transformUpdate.emit({ id: drag.id, box });\n\t}\n\n\t@HostListener('document:pointerup')\n\tonPointerUp(): void {\n\t\tconst marquee = this.marquee;\n\t\tif (marquee) {\n\t\t\tconst rect = this.marqueeRect();\n\t\t\tif (marquee.started && rect) {\n\t\t\t\tconst ids = this.elements()\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t(el) =>\n\t\t\t\t\t\t\trect.x < el.x + el.width &&\n\t\t\t\t\t\t\trect.x + rect.width > el.x &&\n\t\t\t\t\t\t\trect.y < el.y + el.height &&\n\t\t\t\t\t\t\trect.y + rect.height > el.y,\n\t\t\t\t\t)\n\t\t\t\t\t.map((el) => el.id);\n\t\t\t\tthis.marqueeSelect.emit(ids);\n\t\t\t} else {\n\t\t\t\tthis.backgroundClick.emit();\n\t\t\t}\n\t\t\tthis.marquee = null;\n\t\t\tthis.marqueeRect.set(null);\n\t\t}\n\t\tthis.drag = null;\n\t\tthis.snapGuides.set([]);\n\t}\n\n\treadonly wrapperStyle = computed<StyleMap>(() => {\n\t\tconst scale = this.zoom();\n\t\tconst size = this.canvasSize();\n\t\treturn {\n\t\t\twidth: `${size.width * scale}px`,\n\t\t\theight: `${size.height * scale}px`,\n\t\t\tposition: 'relative',\n\t\t\tmargin: '1rem auto',\n\t\t};\n\t});\n\n\treadonly stageStyle = computed<StyleMap>(() => {\n\t\tconst scale = this.zoom();\n\t\tconst size = this.canvasSize();\n\t\tconst slide = this.slide();\n\t\tconst style: StyleMap = {\n\t\t\twidth: `${size.width}px`,\n\t\t\theight: `${size.height}px`,\n\t\t\ttransform: `scale(${scale})`,\n\t\t\t'transform-origin': 'top left',\n\t\t\tposition: 'relative',\n\t\t\toverflow: 'hidden',\n\t\t\t'box-shadow': '0 10px 40px rgba(0, 0, 0, 0.35)',\n\t\t\t// Resolved slide background: image → gradient → pattern → solid colour.\n\t\t\t...getSlideBackgroundStyle(slide),\n\t\t};\n\t\treturn style;\n\t});\n}\n","import { NgStyle } from '@angular/common';\nimport {\n\tChangeDetectionStrategy,\n\tComponent,\n\tHostListener,\n\tOnDestroy,\n\tOnInit,\n\tcomputed,\n\tinput,\n\toutput,\n\tsignal,\n} from '@angular/core';\nimport type { PptxSlide } from 'pptx-viewer-core';\n\nimport type { CanvasSize } from '../internal/shared';\nimport {\n\tclampIndex,\n\tfitZoom,\n\tnextVisibleIndex,\n\tprevVisibleIndex,\n} from './presentation-overlay-helpers';\nimport { SlideCanvasComponent } from './slide-canvas.component';\n\n/**\n * PresentationOverlayComponent — full-viewport black overlay that renders\n * slides in presentation (kiosk) mode.\n *\n * Selector: `pptx-presentation-overlay`\n *\n * Inputs:\n * - `slides` (required) — all slides in the deck\n * - `canvasSize` (required) — logical canvas dimensions in pixels\n * - `mediaDataUrls` — data-URL map for media assets (default: empty Map)\n * - `startIndex` — zero-based slide to show first (default: 0)\n *\n * Outputs:\n * - `indexChange` — emits the new index on every navigation\n * - `closed` — emits void when the overlay should be dismissed\n *\n * Keyboard bindings (document-level so no focusable element is required):\n * ArrowRight / Space / PageDown → next visible slide\n * ArrowLeft / PageUp → previous visible slide\n * Home → first slide\n * End → last slide\n * Escape → emit `closed`\n *\n * Touch bindings (mobile has no keyboard):\n * Always-visible ✕ button (top-right) → emit `closed`\n * ‹ / › edge buttons → previous / next visible slide\n * Horizontal swipe → left → next, right → previous\n *\n * Click on the overlay body → advance to next visible slide.\n */\n@Component({\n\tselector: 'pptx-presentation-overlay',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\timports: [NgStyle, SlideCanvasComponent],\n\tstyles: `\n\t\t:host {\n\t\t\tdisplay: block;\n\t\t\tposition: fixed;\n\t\t\tinset: 0;\n\t\t\tz-index: 10000;\n\t\t\tbackground: #000;\n\t\t\tcursor: pointer;\n\t\t\tuser-select: none;\n\t\t}\n\n\t\t.pptx-ng-presentation-root {\n\t\t\tposition: absolute;\n\t\t\tinset: 0;\n\t\t\t/* Allow vertical scrolling/pinch but let us interpret horizontal swipes. */\n\t\t\ttouch-action: pan-y;\n\t\t}\n\n\t\t.pptx-ng-presentation-close:hover,\n\t\t.pptx-ng-presentation-nav:hover {\n\t\t\tbackground: rgba(0, 0, 0, 0.75);\n\t\t}\n\t`,\n\ttemplate: `\n\t\t<div\n\t\t\tclass=\"pptx-ng-presentation-root\"\n\t\t\t(touchstart)=\"onTouchStart($event)\"\n\t\t\t(touchend)=\"onTouchEnd($event)\"\n\t\t>\n\t\t\t<div\n\t\t\t\tclass=\"pptx-ng-presentation-stage\"\n\t\t\t\t[ngStyle]=\"stageContainerStyle()\"\n\t\t\t\t(click)=\"onBodyClick($event)\"\n\t\t\t\t(contextmenu)=\"$event.preventDefault()\"\n\t\t\t>\n\t\t\t\t<pptx-slide-canvas\n\t\t\t\t\t[slide]=\"currentSlide()\"\n\t\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t[zoom]=\"zoom()\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<!-- Always-visible close button (top-right, safe-area aware). -->\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"pptx-ng-presentation-close\"\n\t\t\t\t[ngStyle]=\"closeButtonStyle\"\n\t\t\t\t(click)=\"onClose($event)\"\n\t\t\t\t(touchend)=\"onCloseTouch($event)\"\n\t\t\t\taria-label=\"Exit presentation\"\n\t\t\t>\n\t\t\t\t✕\n\t\t\t</button>\n\n\t\t\t<!-- Edge navigation buttons (vertically centred, touch-friendly). -->\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"pptx-ng-presentation-nav pptx-ng-presentation-prev\"\n\t\t\t\t[ngStyle]=\"prevButtonStyle\"\n\t\t\t\t(click)=\"onPrev($event)\"\n\t\t\t\t(touchend)=\"onPrevTouch($event)\"\n\t\t\t\taria-label=\"Previous slide\"\n\t\t\t>\n\t\t\t\t‹\n\t\t\t</button>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"pptx-ng-presentation-nav pptx-ng-presentation-next\"\n\t\t\t\t[ngStyle]=\"nextButtonStyle\"\n\t\t\t\t(click)=\"onNext($event)\"\n\t\t\t\t(touchend)=\"onNextTouch($event)\"\n\t\t\t\taria-label=\"Next slide\"\n\t\t\t>\n\t\t\t\t›\n\t\t\t</button>\n\n\t\t\t<!-- Slide counter. -->\n\t\t\t<span class=\"pptx-ng-presentation-counter\" [ngStyle]=\"counterStyle\">\n\t\t\t\t{{ counterLabel() }}\n\t\t\t</span>\n\t\t</div>\n\t`,\n})\nexport class PresentationOverlayComponent implements OnInit, OnDestroy {\n\t// ------------------------------------------------------------------\n\t// Inputs\n\t// ------------------------------------------------------------------\n\n\treadonly slides = input.required<PptxSlide[]>();\n\treadonly canvasSize = input.required<CanvasSize>();\n\treadonly mediaDataUrls = input<Map<string, string>>(new Map());\n\treadonly startIndex = input<number>(0);\n\n\t// ------------------------------------------------------------------\n\t// Outputs\n\t// ------------------------------------------------------------------\n\n\treadonly indexChange = output<number>();\n\treadonly closed = output<void>();\n\n\t// ------------------------------------------------------------------\n\t// Internal state\n\t// ------------------------------------------------------------------\n\n\t/** Zero-based index into `slides()`. */\n\tprotected readonly currentIndex = signal(0);\n\n\t/** Viewport dimensions — updated on resize. */\n\tprivate readonly viewportW = signal(0);\n\tprivate readonly viewportH = signal(0);\n\n\t// ------------------------------------------------------------------\n\t// Derived signals\n\t// ------------------------------------------------------------------\n\n\tprotected readonly currentSlide = computed<PptxSlide | undefined>(\n\t\t() => this.slides()[this.currentIndex()],\n\t);\n\n\t/** Zoom level that fits the canvas into the current viewport. */\n\tprotected readonly zoom = computed<number>(() => {\n\t\tconst size = this.canvasSize();\n\t\treturn fitZoom(size.width, size.height, this.viewportW(), this.viewportH());\n\t});\n\n\t/** Centre the scaled slide in the viewport. */\n\tprotected readonly stageContainerStyle = computed<Record<string, string>>(() => {\n\t\tconst size = this.canvasSize();\n\t\tconst z = this.zoom();\n\t\treturn {\n\t\t\tposition: 'absolute',\n\t\t\ttop: '50%',\n\t\t\tleft: '50%',\n\t\t\twidth: `${size.width * z}px`,\n\t\t\theight: `${size.height * z}px`,\n\t\t\ttransform: 'translate(-50%, -50%)',\n\t\t};\n\t});\n\n\t/** \"3 / 12\" label. */\n\tprotected readonly counterLabel = computed<string>(() => {\n\t\tconst count = this.slides().length;\n\t\treturn count === 0 ? '0 / 0' : `${this.currentIndex() + 1} / ${count}`;\n\t});\n\n\t// ------------------------------------------------------------------\n\t// Static control styles (no dynamic data → plain objects, not computed)\n\t// ------------------------------------------------------------------\n\n\t/**\n\t * Always-visible close button, fixed at the top-right and offset by the\n\t * device safe-area insets so it clears notches / rounded corners. Sits on a\n\t * higher z-index than the stage so taps never fall through to tap-advance.\n\t */\n\tprotected readonly closeButtonStyle: Record<string, string> = {\n\t\tposition: 'fixed',\n\t\ttop: 'calc(env(safe-area-inset-top, 0px) + 0.5rem)',\n\t\tright: 'calc(env(safe-area-inset-right, 0px) + 0.5rem)',\n\t\tdisplay: 'flex',\n\t\t'align-items': 'center',\n\t\t'justify-content': 'center',\n\t\twidth: '44px',\n\t\theight: '44px',\n\t\t'min-width': '44px',\n\t\t'min-height': '44px',\n\t\tbackground: 'rgba(0,0,0,0.55)',\n\t\tborder: 'none',\n\t\t'border-radius': '50%',\n\t\tcolor: '#fff',\n\t\tcursor: 'pointer',\n\t\t'font-size': '1.25rem',\n\t\t'line-height': '1',\n\t\t'pointer-events': 'auto',\n\t\t'z-index': '10002',\n\t\t'touch-action': 'manipulation',\n\t};\n\n\t/** Shared geometry for the left/right edge navigation buttons. */\n\tprivate readonly navButtonBase: Record<string, string> = {\n\t\tposition: 'fixed',\n\t\ttop: '50%',\n\t\ttransform: 'translateY(-50%)',\n\t\tdisplay: 'flex',\n\t\t'align-items': 'center',\n\t\t'justify-content': 'center',\n\t\twidth: '44px',\n\t\theight: '44px',\n\t\t'min-width': '44px',\n\t\t'min-height': '44px',\n\t\tbackground: 'rgba(0,0,0,0.45)',\n\t\tborder: 'none',\n\t\t'border-radius': '50%',\n\t\tcolor: '#fff',\n\t\tcursor: 'pointer',\n\t\t'font-size': '1.75rem',\n\t\t'line-height': '1',\n\t\t'pointer-events': 'auto',\n\t\t'z-index': '10001',\n\t\t'touch-action': 'manipulation',\n\t};\n\n\tprotected readonly prevButtonStyle: Record<string, string> = {\n\t\t...this.navButtonBase,\n\t\tleft: 'calc(env(safe-area-inset-left, 0px) + 0.5rem)',\n\t};\n\n\tprotected readonly nextButtonStyle: Record<string, string> = {\n\t\t...this.navButtonBase,\n\t\tright: 'calc(env(safe-area-inset-right, 0px) + 0.5rem)',\n\t};\n\n\tprotected readonly counterStyle: Record<string, string> = {\n\t\tposition: 'fixed',\n\t\tbottom: 'calc(env(safe-area-inset-bottom, 0px) + 0.5rem)',\n\t\tleft: '50%',\n\t\ttransform: 'translateX(-50%)',\n\t\tpadding: '0.25rem 0.75rem',\n\t\tbackground: 'rgba(0,0,0,0.55)',\n\t\t'border-radius': '999px',\n\t\tcolor: '#fff',\n\t\t'font-family': 'system-ui, sans-serif',\n\t\t'font-size': '0.875rem',\n\t\t'line-height': '1.4',\n\t\t'pointer-events': 'none',\n\t\t'z-index': '10001',\n\t};\n\n\t// ------------------------------------------------------------------\n\t// Touch / swipe tracking\n\t// ------------------------------------------------------------------\n\n\t/** Horizontal swipe distance (px) required to trigger navigation. */\n\tprivate static readonly SWIPE_THRESHOLD = 50;\n\n\t/** X coordinate captured on touchstart, or null when no swipe is active. */\n\tprivate touchStartX: number | null = null;\n\tprivate touchStartY: number | null = null;\n\n\t// ------------------------------------------------------------------\n\t// Lifecycle\n\t// ------------------------------------------------------------------\n\n\tngOnInit(): void {\n\t\t// Initialise the current index from the startIndex input (clamped).\n\t\tconst initial = clampIndex(this.startIndex(), this.slides().length);\n\t\tthis.currentIndex.set(initial);\n\n\t\t// Snapshot the viewport dimensions on mount (SSR-safe guard).\n\t\tthis.snapViewport();\n\t}\n\n\tngOnDestroy(): void {\n\t\t// Nothing to clean up; HostListeners are removed automatically.\n\t}\n\n\t// ------------------------------------------------------------------\n\t// Resize awareness\n\t// ------------------------------------------------------------------\n\n\t@HostListener('window:resize')\n\tonWindowResize(): void {\n\t\tthis.snapViewport();\n\t}\n\n\tprivate snapViewport(): void {\n\t\tif (typeof window === 'undefined') {\n\t\t\treturn;\n\t\t}\n\t\tthis.viewportW.set(window.innerWidth);\n\t\tthis.viewportH.set(window.innerHeight);\n\t}\n\n\t// ------------------------------------------------------------------\n\t// Keyboard navigation (document-level — works even when nothing is focused)\n\t// ------------------------------------------------------------------\n\n\t@HostListener('document:keydown', ['$event'])\n\tonKeyDown(event: KeyboardEvent): void {\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowRight':\n\t\t\tcase ' ':\n\t\t\tcase 'PageDown':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.navigate('next');\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowLeft':\n\t\t\tcase 'PageUp':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.navigate('prev');\n\t\t\t\tbreak;\n\t\t\tcase 'Home':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.navigate('first');\n\t\t\t\tbreak;\n\t\t\tcase 'End':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.navigate('last');\n\t\t\t\tbreak;\n\t\t\tcase 'Escape':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.emitClosed();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// ------------------------------------------------------------------\n\t// Click handling\n\t// ------------------------------------------------------------------\n\n\t/** Left-click on the slide area advances to the next visible slide. */\n\tprotected onBodyClick(event: MouseEvent): void {\n\t\t// button 0 = primary (left); right-click / middle-click are ignored.\n\t\tif (event.button !== 0) {\n\t\t\treturn;\n\t\t}\n\t\tthis.navigate('next');\n\t}\n\n\t/** Close button click — stop propagation so it does not also advance. */\n\tprotected onClose(event: MouseEvent): void {\n\t\tevent.stopPropagation();\n\t\tthis.emitClosed();\n\t}\n\n\t/**\n\t * Close button touch — stop propagation and prevent the synthesized click\n\t * so a tap exits without bubbling to the tap-advance handler.\n\t */\n\tprotected onCloseTouch(event: TouchEvent): void {\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t\tthis.emitClosed();\n\t}\n\n\t/** Previous-edge button — stop propagation so the tap does not double-fire. */\n\tprotected onPrev(event: MouseEvent): void {\n\t\tevent.stopPropagation();\n\t\tthis.navigate('prev');\n\t}\n\n\tprotected onPrevTouch(event: TouchEvent): void {\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t\tthis.navigate('prev');\n\t}\n\n\t/** Next-edge button — stop propagation so the tap does not double-fire. */\n\tprotected onNext(event: MouseEvent): void {\n\t\tevent.stopPropagation();\n\t\tthis.navigate('next');\n\t}\n\n\tprotected onNextTouch(event: TouchEvent): void {\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t\tthis.navigate('next');\n\t}\n\n\t// ------------------------------------------------------------------\n\t// Swipe handling (touch devices have no keyboard)\n\t// ------------------------------------------------------------------\n\n\t/** Record the initial touch position. */\n\tprotected onTouchStart(event: TouchEvent): void {\n\t\tconst touch = event.changedTouches[0];\n\t\tif (!touch) {\n\t\t\tthis.touchStartX = null;\n\t\t\tthis.touchStartY = null;\n\t\t\treturn;\n\t\t}\n\t\tthis.touchStartX = touch.clientX;\n\t\tthis.touchStartY = touch.clientY;\n\t}\n\n\t/**\n\t * On touchend, treat a predominantly horizontal drag past the threshold as a\n\t * swipe: left-swipe → next, right-swipe → prev.\n\t */\n\tprotected onTouchEnd(event: TouchEvent): void {\n\t\tconst startX = this.touchStartX;\n\t\tconst startY = this.touchStartY;\n\t\tthis.touchStartX = null;\n\t\tthis.touchStartY = null;\n\t\tif (startX === null || startY === null) {\n\t\t\treturn;\n\t\t}\n\t\tconst touch = event.changedTouches[0];\n\t\tif (!touch) {\n\t\t\treturn;\n\t\t}\n\t\tconst dx = touch.clientX - startX;\n\t\tconst dy = touch.clientY - startY;\n\t\t// Require a mostly-horizontal gesture past the threshold.\n\t\tif (Math.abs(dx) < PresentationOverlayComponent.SWIPE_THRESHOLD) {\n\t\t\treturn;\n\t\t}\n\t\tif (Math.abs(dx) <= Math.abs(dy)) {\n\t\t\treturn;\n\t\t}\n\t\tif (dx < 0) {\n\t\t\tthis.navigate('next');\n\t\t} else {\n\t\t\tthis.navigate('prev');\n\t\t}\n\t}\n\n\t// ------------------------------------------------------------------\n\t// Navigation helpers\n\t// ------------------------------------------------------------------\n\n\tprivate navigate(direction: 'next' | 'prev' | 'first' | 'last'): void {\n\t\tconst slides = this.slides();\n\t\tconst count = slides.length;\n\t\tif (count === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst current = this.currentIndex();\n\t\tlet next: number;\n\n\t\tswitch (direction) {\n\t\t\tcase 'next':\n\t\t\t\tnext = nextVisibleIndex(current, slides);\n\t\t\t\tbreak;\n\t\t\tcase 'prev':\n\t\t\t\tnext = prevVisibleIndex(current, slides);\n\t\t\t\tbreak;\n\t\t\tcase 'first':\n\t\t\t\tnext = clampIndex(0, count);\n\t\t\t\tbreak;\n\t\t\tcase 'last':\n\t\t\t\tnext = clampIndex(count - 1, count);\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (next !== current) {\n\t\t\tthis.currentIndex.set(next);\n\t\t\tthis.indexChange.emit(next);\n\t\t}\n\t}\n\n\tprivate emitClosed(): void {\n\t\tthis.closed.emit();\n\t}\n}\n","/**\n * Pure helpers for the slide-sorter overlay thumbnail grid.\n *\n * No Angular imports — safe to use in both component and vitest contexts.\n */\n\n/**\n * Compute the zoom level needed to fit a slide canvas whose natural width is\n * `canvasW` pixels into a thumbnail box that is `thumbW` pixels wide.\n *\n * Returns 0 when either argument is non-positive or non-finite so callers can\n * guard against divide-by-zero before applying the value.\n */\nexport function thumbnailZoom(canvasW: number, thumbW: number): number {\n\tif (!Number.isFinite(canvasW) || !Number.isFinite(thumbW) || canvasW <= 0 || thumbW <= 0) {\n\t\treturn 0;\n\t}\n\treturn thumbW / canvasW;\n}\n\n/**\n * Compute the pixel height of an aspect-correct thumbnail box given the\n * natural canvas dimensions and the target thumbnail width.\n *\n * Returns 0 when any argument is non-positive or non-finite.\n */\nexport function thumbnailHeight(canvasW: number, canvasH: number, thumbW: number): number {\n\tconst zoom = thumbnailZoom(canvasW, thumbW);\n\tif (zoom === 0 || !Number.isFinite(canvasH) || canvasH <= 0) {\n\t\treturn 0;\n\t}\n\treturn canvasH * zoom;\n}\n\n/**\n * Derive the number of grid columns from the container width and the target\n * thumbnail width plus a minimum gap.\n *\n * Clamps the result to [1, maxCols] so the grid always has at least one column.\n */\nexport function gridColumns(\n\tcontainerW: number,\n\tthumbW: number,\n\tgap: number,\n\tmaxCols: number,\n): number {\n\tif (containerW <= 0 || thumbW <= 0) {\n\t\treturn 1;\n\t}\n\tconst cols = Math.floor((containerW + gap) / (thumbW + gap));\n\treturn Math.min(Math.max(1, cols), Math.max(1, maxCols));\n}\n","import { NgStyle } from '@angular/common';\nimport {\n\tChangeDetectionStrategy,\n\tComponent,\n\tHostListener,\n\tcomputed,\n\tinput,\n\toutput,\n} from '@angular/core';\nimport type { PptxSlide } from 'pptx-viewer-core';\n\nimport type { CanvasSize } from '../internal/shared';\nimport { SlideCanvasComponent } from './slide-canvas.component';\nimport { thumbnailHeight, thumbnailZoom } from './slide-sorter-overlay-helpers';\n\n/** Pixel width of each thumbnail cell (the clipping box, not the canvas). */\nconst THUMB_W = 200;\n\n/** Gap between grid cells in pixels. */\nconst GRID_GAP = 16;\n\n/**\n * SlideSorterOverlayComponent — Angular port of the React `SlideSorterOverlay`.\n *\n * Renders a fixed full-screen modal overlay containing a responsive grid of\n * scaled slide previews. Clicking a thumbnail emits `select(index)`; pressing\n * Escape or clicking the ✕ button emits `closed`.\n *\n * Viewer-first scope: no drag-reorder, no context menu, no section grouping.\n * Those features are tracked in PORTING.md.\n *\n * Usage:\n * ```html\n * <pptx-slide-sorter-overlay\n * [slides]=\"slides()\"\n * [canvasSize]=\"canvasSize()\"\n * [mediaDataUrls]=\"mediaDataUrls()\"\n * [activeIndex]=\"activeSlideIndex()\"\n * (select)=\"goTo($event)\"\n * (closed)=\"showSorter.set(false)\"\n * />\n * ```\n */\n@Component({\n\tselector: 'pptx-slide-sorter-overlay',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\timports: [NgStyle, SlideCanvasComponent],\n\ttemplate: `\n\t\t<!-- Backdrop -->\n\t\t<div class=\"pptx-ng-sorter-backdrop\" (click)=\"onBackdropClick($event)\">\n\t\t\t<!-- Modal panel -->\n\t\t\t<div class=\"pptx-ng-sorter-panel\" (click)=\"$event.stopPropagation()\">\n\t\t\t\t<!-- Header -->\n\t\t\t\t<header class=\"pptx-ng-sorter-header\">\n\t\t\t\t\t<h2 class=\"pptx-ng-sorter-title\">Slide Sorter</h2>\n\t\t\t\t\t<span class=\"pptx-ng-sorter-count\">{{ slides().length }} slides</span>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"pptx-ng-sorter-close\"\n\t\t\t\t\t\taria-label=\"Close slide sorter\"\n\t\t\t\t\t\t(click)=\"closed.emit()\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\twidth=\"16\"\n\t\t\t\t\t\t\theight=\"16\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n\t\t\t\t\t\t\t<line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t</header>\n\n\t\t\t\t<!-- Scrollable grid -->\n\t\t\t\t<div class=\"pptx-ng-sorter-grid-scroll\">\n\t\t\t\t\t<div class=\"pptx-ng-sorter-grid\" [ngStyle]=\"gridStyle()\">\n\t\t\t\t\t\t@for (slide of slides(); track slide.id; let i = $index) {\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"pptx-ng-sorter-cell\"\n\t\t\t\t\t\t\t\t[class.is-active]=\"i === activeIndex()\"\n\t\t\t\t\t\t\t\t[class.is-hidden]=\"isHiddenSlide(slide)\"\n\t\t\t\t\t\t\t\t[attr.aria-label]=\"'Slide ' + (i + 1)\"\n\t\t\t\t\t\t\t\t[attr.aria-current]=\"i === activeIndex() ? 'true' : null\"\n\t\t\t\t\t\t\t\t(click)=\"onThumbClick(i)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<!-- Thumbnail clipping wrapper -->\n\t\t\t\t\t\t\t\t<div class=\"pptx-ng-sorter-thumb-clip\" [ngStyle]=\"clipStyle()\">\n\t\t\t\t\t\t\t\t\t<pptx-slide-canvas\n\t\t\t\t\t\t\t\t\t\t[slide]=\"slide\"\n\t\t\t\t\t\t\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t\t\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t\t\t\t\t\t[zoom]=\"thumbZoom()\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<!-- Slide number badge -->\n\t\t\t\t\t\t\t\t<span class=\"pptx-ng-sorter-index\" aria-hidden=\"true\">{{ i + 1 }}</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t`,\n\tstyles: [\n\t\t`\n\t\t\t:host {\n\t\t\t\tdisplay: contents;\n\t\t\t}\n\n\t\t\t.pptx-ng-sorter-backdrop {\n\t\t\t\tposition: fixed;\n\t\t\t\tinset: 0;\n\t\t\t\tz-index: 50;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tbackground: rgba(0, 0, 0, 0.7);\n\t\t\t\tbackdrop-filter: blur(4px);\n\t\t\t}\n\n\t\t\t.pptx-ng-sorter-panel {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\twidth: min(96vw, 1200px);\n\t\t\t\tmax-height: 90vh;\n\t\t\t\tborder-radius: 0.5rem;\n\t\t\t\tbackground: #1a1a1a;\n\t\t\t\tcolor: #e5e5e5;\n\t\t\t\tbox-shadow: 0 24px 64px rgba(0, 0, 0, 0.6);\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\n\t\t\t.pptx-ng-sorter-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 0.75rem;\n\t\t\t\tpadding: 0.75rem 1.25rem;\n\t\t\t\tborder-bottom: 1px solid rgba(255, 255, 255, 0.1);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.pptx-ng-sorter-title {\n\t\t\t\tmargin: 0;\n\t\t\t\tfont-size: 0.875rem;\n\t\t\t\tfont-weight: 500;\n\t\t\t}\n\n\t\t\t.pptx-ng-sorter-count {\n\t\t\t\tfont-size: 0.75rem;\n\t\t\t\tcolor: rgba(255, 255, 255, 0.5);\n\t\t\t\tflex: 1;\n\t\t\t}\n\n\t\t\t.pptx-ng-sorter-close {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\t/* Touch-friendly: at least 44x44 CSS px so it can be tapped\n\t\t\t\t without a keyboard on mobile. */\n\t\t\t\twidth: 44px;\n\t\t\t\theight: 44px;\n\t\t\t\tmin-width: 44px;\n\t\t\t\tmin-height: 44px;\n\t\t\t\tpadding: 0;\n\t\t\t\tborder: none;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.1);\n\t\t\t\tcolor: #e5e5e5;\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition: background 0.15s;\n\t\t\t\tflex-shrink: 0;\n\t\t\t\ttouch-action: manipulation;\n\t\t\t}\n\n\t\t\t.pptx-ng-sorter-close:hover {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.2);\n\t\t\t}\n\n\t\t\t.pptx-ng-sorter-grid-scroll {\n\t\t\t\tflex: 1;\n\t\t\t\toverflow-y: auto;\n\t\t\t\tpadding: 1.25rem;\n\t\t\t}\n\n\t\t\t.pptx-ng-sorter-grid {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgap: 1rem;\n\t\t\t}\n\n\t\t\t.pptx-ng-sorter-cell {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 0.5rem;\n\t\t\t\tpadding: 0.5rem;\n\t\t\t\tborder: 2px solid transparent;\n\t\t\t\tborder-radius: 0.375rem;\n\t\t\t\tbackground: transparent;\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition:\n\t\t\t\t\tborder-color 0.15s,\n\t\t\t\t\tbackground 0.15s;\n\t\t\t\tcolor: inherit;\n\t\t\t}\n\n\t\t\t.pptx-ng-sorter-cell:hover {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.06);\n\t\t\t\tborder-color: rgba(255, 255, 255, 0.2);\n\t\t\t}\n\n\t\t\t.pptx-ng-sorter-cell.is-active {\n\t\t\t\tborder-color: #3b82f6;\n\t\t\t\tbackground: rgba(59, 130, 246, 0.1);\n\t\t\t}\n\n\t\t\t.pptx-ng-sorter-cell.is-hidden {\n\t\t\t\topacity: 0.4;\n\t\t\t}\n\n\t\t\t.pptx-ng-sorter-thumb-clip {\n\t\t\t\toverflow: hidden;\n\t\t\t\tborder-radius: 2px;\n\t\t\t\t/* Width/height set via [ngStyle] to match computed thumbnail size. */\n\t\t\t}\n\n\t\t\t/* Remove the 1rem auto margin that SlideCanvasComponent adds to its wrapper\n\t\t so the stage sits flush inside the clipping box. */\n\t\t\t.pptx-ng-sorter-thumb-clip ::ng-deep .pptx-ng-canvas-wrapper {\n\t\t\t\tmargin: 0 !important;\n\t\t\t}\n\n\t\t\t.pptx-ng-sorter-index {\n\t\t\t\tfont-size: 0.6875rem;\n\t\t\t\tcolor: rgba(255, 255, 255, 0.55);\n\t\t\t\tuser-select: none;\n\t\t\t}\n\t\t`,\n\t],\n})\nexport class SlideSorterOverlayComponent {\n\t/** Full list of slides to display. */\n\treadonly slides = input.required<PptxSlide[]>();\n\n\t/** Natural (100 %) canvas dimensions — passed through to SlideCanvasComponent. */\n\treadonly canvasSize = input.required<CanvasSize>();\n\n\t/** Media asset lookup table — forwarded to each SlideCanvasComponent. */\n\treadonly mediaDataUrls = input<Map<string, string>>(new Map());\n\n\t/** Zero-based index of the currently active slide (highlighted in blue). */\n\treadonly activeIndex = input<number>(0);\n\n\t/** Emits the zero-based index of the thumbnail the user clicked. */\n\treadonly select = output<number>();\n\n\t/** Emits when the user closes the overlay (✕ button or Escape key). */\n\treadonly closed = output<void>();\n\n\t// -------------------------------------------------------------------------\n\t// Derived display values\n\t// -------------------------------------------------------------------------\n\n\t/** Zoom level that fits the full canvas width into THUMB_W pixels. */\n\treadonly thumbZoom = computed(() => thumbnailZoom(this.canvasSize().width, THUMB_W));\n\n\t/** Pixel height of the clipping box (aspect-correct). */\n\treadonly thumbH = computed(() =>\n\t\tthumbnailHeight(this.canvasSize().width, this.canvasSize().height, THUMB_W),\n\t);\n\n\t/** ngStyle object for the thumbnail clipping box. */\n\treadonly clipStyle = computed<Record<string, string>>(() => ({\n\t\twidth: `${THUMB_W}px`,\n\t\theight: `${this.thumbH()}px`,\n\t}));\n\n\t/** ngStyle object for the grid: responsive auto-fill columns. */\n\treadonly gridStyle = computed<Record<string, string>>(() => ({\n\t\t'grid-template-columns': `repeat(auto-fill, minmax(${THUMB_W + GRID_GAP * 2 + 4}px, 1fr))`,\n\t}));\n\n\t// -------------------------------------------------------------------------\n\t// Event handlers\n\t// -------------------------------------------------------------------------\n\n\t/** Keyboard handler: Escape closes the overlay. */\n\t@HostListener('document:keydown', ['$event'])\n\tonKeydown(event: KeyboardEvent): void {\n\t\tif (event.key === 'Escape') {\n\t\t\tevent.preventDefault();\n\t\t\tthis.closed.emit();\n\t\t}\n\t}\n\n\t/** Clicking the backdrop (outside the panel) closes the overlay. */\n\tonBackdropClick(event: MouseEvent): void {\n\t\t// Only close when the click target IS the backdrop element itself.\n\t\tif (event.target === event.currentTarget) {\n\t\t\tthis.closed.emit();\n\t\t}\n\t}\n\n\t/** Clicking a thumbnail selects the slide. */\n\tonThumbClick(index: number): void {\n\t\tthis.select.emit(index);\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Utilities\n\t// -------------------------------------------------------------------------\n\n\t/** Returns true when a slide has been marked as hidden in the presentation. */\n\tisHiddenSlide(slide: PptxSlide): boolean {\n\t\t// PptxSlide carries a `hidden` boolean when the slide is set to hidden in\n\t\t// the OpenXML package. Cast via unknown to avoid accessing a field that\n\t\t// may not exist on all versions of the core type.\n\t\tconst s = slide as unknown as Record<string, unknown>;\n\t\treturn s['hidden'] === true;\n\t}\n}\n","import { NgStyle } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';\n\nimport type { CanvasSize } from '../internal/shared';\nimport { EditorStateService } from './editor-state.service';\nimport { SlideCanvasComponent } from './slide-canvas.component';\nimport { thumbnailHeight, thumbnailZoom } from './slide-sorter-overlay-helpers';\n\n/** Pixel width of each thumbnail clipping box inside the panel. */\nconst THUMB_W = 150;\n\n/**\n * SlidesPanelComponent — vertical slide-strip for the editor sidebar.\n *\n * Renders the live editable deck (from {@link EditorStateService}) as a\n * scrollable vertical list of numbered thumbnail cards. Clicking a card emits\n * `select(index)`; the active card is highlighted. Per-card hover toolbar\n * provides Duplicate, Delete (disabled when only 1 slide), Move up, and Move\n * down. A footer \"+ Add slide\" button appends a blank slide after the current\n * `activeIndex`.\n *\n * Usage:\n * ```html\n * <pptx-slides-panel\n * [canvasSize]=\"loader.canvasSize()\"\n * [mediaDataUrls]=\"loader.mediaDataUrls()\"\n * [activeIndex]=\"activeSlideIndex()\"\n * (select)=\"goTo($event)\"\n * />\n * ```\n */\n@Component({\n\tselector: 'pptx-slides-panel',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\timports: [NgStyle, SlideCanvasComponent],\n\ttemplate: `\n\t\t<div class=\"pptx-ng-spanel\">\n\t\t\t<!-- Scrollable slide list -->\n\t\t\t<div class=\"pptx-ng-spanel-scroll\" role=\"listbox\" aria-label=\"Slides\">\n\t\t\t\t@for (slide of editor.slides(); track slide.id; let i = $index) {\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\"pptx-ng-spanel-card\"\n\t\t\t\t\t\t[class.is-active]=\"i === activeIndex()\"\n\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t[attr.aria-selected]=\"i === activeIndex()\"\n\t\t\t\t\t\t[attr.aria-label]=\"'Slide ' + (i + 1)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<!-- Thumbnail (clickable to select) -->\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-thumb-btn\"\n\t\t\t\t\t\t\t[attr.aria-label]=\"'Go to slide ' + (i + 1)\"\n\t\t\t\t\t\t\t(click)=\"select.emit(i)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<!-- Clipping wrapper: neutralises the 1rem auto margin from SlideCanvas -->\n\t\t\t\t\t\t\t<div class=\"pptx-ng-spanel-clip\" [ngStyle]=\"clipStyle()\">\n\t\t\t\t\t\t\t\t<pptx-slide-canvas\n\t\t\t\t\t\t\t\t\t[slide]=\"slide\"\n\t\t\t\t\t\t\t\t\t[canvasSize]=\"canvasSize()\"\n\t\t\t\t\t\t\t\t\t[mediaDataUrls]=\"mediaDataUrls()\"\n\t\t\t\t\t\t\t\t\t[zoom]=\"thumbZoom()\"\n\t\t\t\t\t\t\t\t\t[editable]=\"false\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<!-- Slide number badge -->\n\t\t\t\t\t\t<span class=\"pptx-ng-spanel-num\" aria-hidden=\"true\">{{ i + 1 }}</span>\n\n\t\t\t\t\t\t<!-- Per-card action toolbar (visible on hover / focus-within) -->\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-actions\"\n\t\t\t\t\t\t\trole=\"toolbar\"\n\t\t\t\t\t\t\t[attr.aria-label]=\"'Slide ' + (i + 1) + ' actions'\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-action\"\n\t\t\t\t\t\t\t\ttitle=\"Duplicate slide\"\n\t\t\t\t\t\t\t\taria-label=\"Duplicate\"\n\t\t\t\t\t\t\t\t(click)=\"onDuplicate(i)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t⧉\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-action\"\n\t\t\t\t\t\t\t\ttitle=\"Delete slide\"\n\t\t\t\t\t\t\t\taria-label=\"Delete\"\n\t\t\t\t\t\t\t\t[disabled]=\"editor.slides().length <= 1\"\n\t\t\t\t\t\t\t\t(click)=\"onDelete(i)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t✕\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-action\"\n\t\t\t\t\t\t\t\ttitle=\"Move up\"\n\t\t\t\t\t\t\t\taria-label=\"Move up\"\n\t\t\t\t\t\t\t\t[disabled]=\"i === 0\"\n\t\t\t\t\t\t\t\t(click)=\"onMoveUp(i)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t↑\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"pptx-ng-spanel-action\"\n\t\t\t\t\t\t\t\ttitle=\"Move down\"\n\t\t\t\t\t\t\t\taria-label=\"Move down\"\n\t\t\t\t\t\t\t\t[disabled]=\"i === editor.slides().length - 1\"\n\t\t\t\t\t\t\t\t(click)=\"onMoveDown(i)\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t↓\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t}\n\t\t\t</div>\n\n\t\t\t<!-- Footer: add new slide -->\n\t\t\t<footer class=\"pptx-ng-spanel-footer\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"pptx-ng-spanel-add\"\n\t\t\t\t\taria-label=\"Add slide\"\n\t\t\t\t\t(click)=\"onAddSlide()\"\n\t\t\t\t>\n\t\t\t\t\t+ Add slide\n\t\t\t\t</button>\n\t\t\t</footer>\n\t\t</div>\n\t`,\n\tstyles: [\n\t\t`\n\t\t\t:host {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\theight: 100%;\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\n\t\t\t.pptx-ng-spanel {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\theight: 100%;\n\t\t\t\tbackground: #1e1e1e;\n\t\t\t\tcolor: #e5e5e5;\n\t\t\t\tborder-right: 1px solid rgba(255, 255, 255, 0.08);\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\n\t\t\t/* ── Scrollable list ── */\n\n\t\t\t.pptx-ng-spanel-scroll {\n\t\t\t\tflex: 1;\n\t\t\t\toverflow-y: auto;\n\t\t\t\tpadding: 0.5rem 0.375rem;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 0.375rem;\n\t\t\t}\n\n\t\t\t/* ── Card ── */\n\n\t\t\t.pptx-ng-spanel-card {\n\t\t\t\tposition: relative;\n\t\t\t\tborder-radius: 0.375rem;\n\t\t\t\tborder: 2px solid transparent;\n\t\t\t\tbackground: transparent;\n\t\t\t\ttransition:\n\t\t\t\t\tborder-color 0.15s,\n\t\t\t\t\tbackground 0.15s;\n\t\t\t}\n\n\t\t\t.pptx-ng-spanel-card:hover,\n\t\t\t.pptx-ng-spanel-card:focus-within {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.05);\n\t\t\t\tborder-color: rgba(255, 255, 255, 0.15);\n\t\t\t}\n\n\t\t\t.pptx-ng-spanel-card.is-active {\n\t\t\t\tborder-color: #3b82f6;\n\t\t\t\tbackground: rgba(59, 130, 246, 0.1);\n\t\t\t}\n\n\t\t\t/* ── Thumbnail button ── */\n\n\t\t\t.pptx-ng-spanel-thumb-btn {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t\tpadding: 0.375rem 0.375rem 0;\n\t\t\t\tborder: none;\n\t\t\t\tbackground: transparent;\n\t\t\t\tcursor: pointer;\n\t\t\t\tcolor: inherit;\n\t\t\t\tline-height: 0;\n\t\t\t}\n\n\t\t\t.pptx-ng-spanel-thumb-btn:focus-visible {\n\t\t\t\toutline: 2px solid #3b82f6;\n\t\t\t\toutline-offset: 2px;\n\t\t\t\tborder-radius: 0.25rem;\n\t\t\t}\n\n\t\t\t/* ── Clip box: fixed width, aspect-correct height set via [ngStyle].\n\t\t\t ::ng-deep removes the 1rem auto margin that SlideCanvas adds to its\n\t\t\t wrapper, so the stage sits flush inside the box (same technique as\n\t\t\t the sorter overlay). ── */\n\n\t\t\t.pptx-ng-spanel-clip {\n\t\t\t\toverflow: hidden;\n\t\t\t\tborder-radius: 2px;\n\t\t\t\t/* width/height injected via [ngStyle] */\n\t\t\t}\n\n\t\t\t.pptx-ng-spanel-clip ::ng-deep .pptx-ng-canvas-wrapper {\n\t\t\t\tmargin: 0 !important;\n\t\t\t}\n\n\t\t\t/* ── Slide number badge ── */\n\n\t\t\t.pptx-ng-spanel-num {\n\t\t\t\tdisplay: block;\n\t\t\t\ttext-align: center;\n\t\t\t\tfont-size: 0.625rem;\n\t\t\t\tline-height: 1.6;\n\t\t\t\tcolor: rgba(255, 255, 255, 0.45);\n\t\t\t\tuser-select: none;\n\t\t\t\tpadding-bottom: 0.25rem;\n\t\t\t}\n\n\t\t\t/* ── Per-card action toolbar ──\n\t\t\t Hidden by default; revealed on card hover or focus-within. ── */\n\n\t\t\t.pptx-ng-spanel-actions {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0.25rem;\n\t\t\t\tright: 0.25rem;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 0.125rem;\n\t\t\t\topacity: 0;\n\t\t\t\tpointer-events: none;\n\t\t\t\ttransition: opacity 0.12s;\n\t\t\t}\n\n\t\t\t.pptx-ng-spanel-card:hover .pptx-ng-spanel-actions,\n\t\t\t.pptx-ng-spanel-card:focus-within .pptx-ng-spanel-actions {\n\t\t\t\topacity: 1;\n\t\t\t\tpointer-events: auto;\n\t\t\t}\n\n\t\t\t.pptx-ng-spanel-action {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\twidth: 1.375rem;\n\t\t\t\theight: 1.375rem;\n\t\t\t\tpadding: 0;\n\t\t\t\tborder: none;\n\t\t\t\tborder-radius: 0.25rem;\n\t\t\t\tbackground: rgba(30, 30, 30, 0.85);\n\t\t\t\tcolor: #e5e5e5;\n\t\t\t\tfont-size: 0.6875rem;\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition: background 0.12s;\n\t\t\t\tbackdrop-filter: blur(2px);\n\t\t\t}\n\n\t\t\t.pptx-ng-spanel-action:hover:not([disabled]) {\n\t\t\t\tbackground: rgba(59, 130, 246, 0.75);\n\t\t\t}\n\n\t\t\t.pptx-ng-spanel-action[disabled] {\n\t\t\t\topacity: 0.3;\n\t\t\t\tcursor: not-allowed;\n\t\t\t}\n\n\t\t\t/* ── Footer ── */\n\n\t\t\t.pptx-ng-spanel-footer {\n\t\t\t\tflex-shrink: 0;\n\t\t\t\tpadding: 0.5rem 0.375rem;\n\t\t\t\tborder-top: 1px solid rgba(255, 255, 255, 0.08);\n\t\t\t}\n\n\t\t\t.pptx-ng-spanel-add {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t\tpadding: 0.4375rem 0;\n\t\t\t\tborder: 1px dashed rgba(255, 255, 255, 0.2);\n\t\t\t\tborder-radius: 0.375rem;\n\t\t\t\tbackground: transparent;\n\t\t\t\tcolor: rgba(255, 255, 255, 0.6);\n\t\t\t\tfont-size: 0.75rem;\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition:\n\t\t\t\t\tbackground 0.15s,\n\t\t\t\t\tborder-color 0.15s,\n\t\t\t\t\tcolor 0.15s;\n\t\t\t}\n\n\t\t\t.pptx-ng-spanel-add:hover {\n\t\t\t\tbackground: rgba(59, 130, 246, 0.15);\n\t\t\t\tborder-color: #3b82f6;\n\t\t\t\tcolor: #e5e5e5;\n\t\t\t}\n\t\t`,\n\t],\n})\nexport class SlidesPanelComponent {\n\t/** Natural (100 %) canvas dimensions — forwarded to each SlideCanvasComponent. */\n\treadonly canvasSize = input.required<CanvasSize>();\n\n\t/** Media asset lookup table — forwarded to each SlideCanvasComponent. */\n\treadonly mediaDataUrls = input<Map<string, string>>(new Map());\n\n\t/** Zero-based index of the currently active slide (highlighted in blue). */\n\treadonly activeIndex = input<number>(0);\n\n\t/** Emits the zero-based index of the card the user clicked. */\n\treadonly select = output<number>();\n\n\tprotected readonly editor = inject(EditorStateService);\n\n\t// ── Derived thumbnail dimensions ──────────────────────────────────────────\n\n\t/** Zoom level that fits the full canvas width into THUMB_W pixels. */\n\treadonly thumbZoom = computed(() => thumbnailZoom(this.canvasSize().width, THUMB_W));\n\n\t/** Pixel height of the clipping box (aspect-correct). */\n\treadonly thumbH = computed(() =>\n\t\tthumbnailHeight(this.canvasSize().width, this.canvasSize().height, THUMB_W),\n\t);\n\n\t/** ngStyle object for the thumbnail clipping box. */\n\treadonly clipStyle = computed<Record<string, string>>(() => ({\n\t\twidth: `${THUMB_W}px`,\n\t\theight: `${this.thumbH()}px`,\n\t}));\n\n\t// ── Event handlers ────────────────────────────────────────────────────────\n\n\tonDuplicate(index: number): void {\n\t\tthis.editor.duplicateSlide(index);\n\t}\n\n\tonDelete(index: number): void {\n\t\tthis.editor.deleteSlide(index);\n\t}\n\n\tonMoveUp(index: number): void {\n\t\tthis.editor.moveSlide(index, index - 1);\n\t}\n\n\tonMoveDown(index: number): void {\n\t\tthis.editor.moveSlide(index, index + 1);\n\t}\n\n\tonAddSlide(): void {\n\t\tthis.editor.addSlide(this.activeIndex());\n\t}\n}\n","import { NgClass, NgStyle } from '@angular/common';\nimport {\n\tChangeDetectionStrategy,\n\tComponent,\n\tcomputed,\n\teffect,\n\tElementRef,\n\tHostListener,\n\tinject,\n\tinput,\n\toutput,\n\tsignal,\n\tviewChild,\n} from '@angular/core';\nimport type { PptxElement } from 'pptx-viewer-core';\n\nimport type { ViewerTheme } from '../internal/shared';\nimport { themeStyle } from '../theme/viewer-theme';\nimport { EditorContextMenuComponent } from './editor-context-menu.component';\nimport { EditorStateService } from './editor-state.service';\nimport { EditorToolbarComponent } from './editor-toolbar.component';\nimport { slideFileName } from './export-helpers';\nimport { ExportService } from './export.service';\nimport { FindBarComponent } from './find-bar.component';\nimport { InspectorPanelComponent } from './inspector-panel.component';\nimport { LoadContentService } from './load-content.service';\nimport { PresentationOverlayComponent } from './presentation-overlay.component';\nimport { SlideCanvasComponent } from './slide-canvas.component';\nimport { SlideSorterOverlayComponent } from './slide-sorter-overlay.component';\nimport { SlidesPanelComponent } from './slides-panel.component';\nimport type { CollaborationConfig } from './types';\n\nconst ZOOM_STEP = 0.1;\nconst ZOOM_MIN = 0.2;\nconst ZOOM_MAX = 3;\n\n/**\n * PowerPointViewerComponent — Angular port of the React `PowerPointViewer.tsx`\n * and Vue `PowerPointViewer.vue`.\n *\n * Top-level orchestrator that loads `.pptx` bytes and renders the slides with\n * navigation and zoom. This is the viewer-first milestone of the port: the\n * React component additionally composes a full editor (toolbar, inspector\n * panels, dialogs, presentation mode, collaboration, export). The roadmap and\n * per-area status live in `packages/angular/PORTING.md`.\n *\n * Conventions vs. React/Vue:\n * - React `forwardRef` handle / Vue `defineExpose` → public {@link getContent}\n * method (reach it via a template ref or `viewChild`).\n * - React callback props / Vue emits → Angular `output()` events.\n * - React theme context / Vue provide-inject → `themeStyle` CSS vars applied to\n * the root element (app-wide sharing via `provideViewerTheme`).\n */\n@Component({\n\tselector: 'pptx-viewer',\n\tstandalone: true,\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\tproviders: [LoadContentService, ExportService, EditorStateService],\n\timports: [\n\t\tNgClass,\n\t\tNgStyle,\n\t\tSlideCanvasComponent,\n\t\tPresentationOverlayComponent,\n\t\tSlideSorterOverlayComponent,\n\t\tFindBarComponent,\n\t\tInspectorPanelComponent,\n\t\tSlidesPanelComponent,\n\t\tEditorToolbarComponent,\n\t\tEditorContextMenuComponent,\n\t],\n\ttemplate: `\n\t\t<div class=\"pptx-ng-viewer\" [ngClass]=\"class()\" [ngStyle]=\"rootStyle()\">\n\t\t\t@if (loader.loading()) {\n\t\t\t\t<div class=\"pptx-ng-state pptx-ng-loading\">\n\t\t\t\t\t<div class=\"pptx-ng-spinner\" aria-hidden=\"true\"></div>\n\t\t\t\t\t<p>Loading presentation…</p>\n\t\t\t\t</div>\n\t\t\t} @else if (loader.isEncrypted()) {\n\t\t\t\t<div class=\"pptx-ng-state pptx-ng-error\">\n\t\t\t\t\t<p>This presentation is password-protected and cannot be opened.</p>\n\t\t\t\t</div>\n\t\t\t} @else if (loader.error()) {\n\t\t\t\t<div class=\"pptx-ng-state pptx-ng-error\">\n\t\t\t\t\t<p>Failed to load presentation.</p>\n\t\t\t\t\t<pre class=\"pptx-ng-error-detail\">{{ loader.error() }}</pre>\n\t\t\t\t</div>\n\t\t\t} @else {\n\t\t\t\t<header class=\"pptx-ng-toolbar\">\n\t\t\t\t\t<div class=\"pptx-ng-nav\">\n\t\t\t\t\t\t<button type=\"button\" [disabled]=\"activeSlideIndex() <= 0\" (click)=\"goPrev()\">‹</button>\n\t\t\t\t\t\t<span class=\"pptx-ng-slide-counter\">\n\t\t\t\t\t\t\t{{ slideCount() === 0 ? 0 : activeSlideIndex() + 1 }} / {{ slideCount() }}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t[disabled]=\"activeSlideIndex() >= slideCount() - 1\"\n\t\t\t\t\t\t\t(click)=\"goNext()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t›\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"pptx-ng-zoom\">\n\t\t\t\t\t\t<button type=\"button\" (click)=\"zoomOut()\">−</button>\n\t\t\t\t\t\t<button type=\"button\" class=\"pptx-ng-zoom-value\" (click)=\"zoomReset()\">\n\t\t\t\t\t\t\t{{ zoomPercent() }}%\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button type=\"button\" (click)=\"zoomIn()\">+</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"pptx-ng-actions\">\n\t\t\t\t\t\t@if (canEdit()) {\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t[disabled]=\"!editor.canUndo()\"\n\t\t\t\t\t\t\t\t[attr.title]=\"editor.undoLabel() ? 'Undo ' + editor.undoLabel() : 'Undo'\"\n\t\t\t\t\t\t\t\t(click)=\"editor.undo()\"\n\t\t\t\t\t\t\t\taria-label=\"Undo\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t↶\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t[disabled]=\"!editor.canRedo()\"\n\t\t\t\t\t\t\t\t[attr.title]=\"editor.redoLabel() ? 'Redo ' + editor.redoLabel() : 'Redo'\"\n\t\t\t\t\t\t\t\t(click)=\"editor.redo()\"\n\t\t\t\t\t\t\t\taria-label=\"Redo\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t↷\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t}\n\t\t\t\t\t\t<button type=\"button\" (click)=\"showFind.set(true)\" aria-label=\"Find in slides\">\n\t\t\t\t\t\t\tFind\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button type=\"button\" (click)=\"showSorter.set(true)\" aria-label=\"Slide sorter\">\n\t\t\t\t\t\t\t⊞\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t[class.is-active]=\"showNotes()\"\n\t\t\t\t\t\t\t[disabled]=\"!activeNotes()\"\n\t\t\t\t\t\t\t(click)=\"toggleNotes()\"\n\t\t\t\t\t\t\taria-label=\"Speaker notes\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tNotes\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t[disabled]=\"slideCount() === 0 || exporting()\"\n\t\t\t\t\t\t\t(click)=\"exportPng()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tPNG\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t[disabled]=\"slideCount() === 0 || exporting()\"\n\t\t\t\t\t\t\t(click)=\"exportPdf()\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{{ exporting() ? 'Exporting…' : 'PDF' }}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button type=\"button\" [disabled]=\"slideCount() === 0\" (click)=\"present()\">\n\t\t\t\t\t\t\tPresent\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</header>\n\n\t\t\t\t@if (canEdit()) {\n\t\t\t\t\t<pptx-editor-toolbar [slideIndex]=\"activeSlideIndex()\" />\n\t\t\t\t}\n\n\t\t\t\t<div class=\"pptx-ng-body\">\n\t\t\t\t\t@if (canEdit()) {\n\t\t\t\t\t\t<pptx-slides-panel\n\t\t\t\t\t\t\t[canvasSize]=\"loader.canvasSize()\"\n\t\t\t\t\t\t\t[mediaDataUrls]=\"loader.mediaDataUrls()\"\n\t\t\t\t\t\t\t[activeIndex]=\"activeSlideIndex()\"\n\t\t\t\t\t\t\t(select)=\"goTo($event)\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t} @else {\n\t\t\t\t\t\t<nav class=\"pptx-ng-thumbnails\" aria-label=\"Slides\">\n\t\t\t\t\t\t\t@for (slide of displaySlides(); track slide.id; let i = $index) {\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclass=\"pptx-ng-thumb\"\n\t\t\t\t\t\t\t\t\t[class.is-active]=\"i === activeSlideIndex()\"\n\t\t\t\t\t\t\t\t\t(click)=\"goTo(i)\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span class=\"pptx-ng-thumb-index\">{{ i + 1 }}</span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</nav>\n\t\t\t\t\t}\n\n\t\t\t\t\t<main\n\t\t\t\t\t\tclass=\"pptx-ng-main\"\n\t\t\t\t\t\t#mainEl\n\t\t\t\t\t\t(touchstart)=\"onMainTouchStart($event)\"\n\t\t\t\t\t\t(touchend)=\"onMainTouchEnd($event)\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<pptx-slide-canvas\n\t\t\t\t\t\t\t[slide]=\"activeSlide()\"\n\t\t\t\t\t\t\t[canvasSize]=\"loader.canvasSize()\"\n\t\t\t\t\t\t\t[mediaDataUrls]=\"loader.mediaDataUrls()\"\n\t\t\t\t\t\t\t[zoom]=\"zoom()\"\n\t\t\t\t\t\t\t[editable]=\"canEdit()\"\n\t\t\t\t\t\t\t[selectedIds]=\"editor.selectedIds()\"\n\t\t\t\t\t\t\t(elementSelect)=\"onElementSelect($event)\"\n\t\t\t\t\t\t\t(backgroundClick)=\"editor.clearSelection()\"\n\t\t\t\t\t\t\t(marqueeSelect)=\"editor.select($event)\"\n\t\t\t\t\t\t\t(transformStart)=\"editor.beginTransform($event.label)\"\n\t\t\t\t\t\t\t(transformUpdate)=\"editor.applyTransform(activeSlideIndex(), $event.id, $event.box)\"\n\t\t\t\t\t\t\t(rotateUpdate)=\"\n\t\t\t\t\t\t\t\teditor.applyTransform(activeSlideIndex(), $event.id, { rotation: $event.rotation })\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t(contextMenu)=\"onContextMenu($event)\"\n\t\t\t\t\t\t\t[editingId]=\"editingId()\"\n\t\t\t\t\t\t\t(textEditStart)=\"editingId.set($event.id)\"\n\t\t\t\t\t\t\t(textCommit)=\"onTextCommit($event)\"\n\t\t\t\t\t\t\t(textCancel)=\"editingId.set(null)\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t@if (showNotes() && activeNotes()) {\n\t\t\t\t\t\t\t<aside class=\"pptx-ng-notes\" aria-label=\"Speaker notes\">\n\t\t\t\t\t\t\t\t<h2 class=\"pptx-ng-notes-title\">Notes</h2>\n\t\t\t\t\t\t\t\t<p class=\"pptx-ng-notes-body\">{{ activeNotes() }}</p>\n\t\t\t\t\t\t\t</aside>\n\t\t\t\t\t\t}\n\t\t\t\t\t</main>\n\n\t\t\t\t\t@if (canEdit() && selectedElement(); as el) {\n\t\t\t\t\t\t<aside class=\"pptx-ng-inspector-host\" aria-label=\"Element properties\">\n\t\t\t\t\t\t\t<pptx-inspector-panel [element]=\"el\" [slideIndex]=\"activeSlideIndex()\" />\n\t\t\t\t\t\t</aside>\n\t\t\t\t\t} @else if (canEdit() && activeSlide(); as sl) {\n\t\t\t\t\t\t<aside class=\"pptx-ng-inspector-host\" aria-label=\"Slide properties\">\n\t\t\t\t\t\t\t<!--\n\t\t\t\t\t\t\t\tKeyed on the active index so the inputs are recreated (and reseeded)\n\t\t\t\t\t\t\t\tonly when the slide changes — never on every change-detection pass\n\t\t\t\t\t\t\t\twhile typing. This keeps the on-screen keyboard open and the caret\n\t\t\t\t\t\t\t\tstable on mobile.\n\t\t\t\t\t\t\t-->\n\t\t\t\t\t\t\t@if (slidePropsKey(); as key) {\n\t\t\t\t\t\t\t\t<div class=\"pptx-ng-slide-props\" [attr.data-slide-key]=\"key\">\n\t\t\t\t\t\t\t\t\t<h2 class=\"pptx-ng-notes-title\">Slide</h2>\n\t\t\t\t\t\t\t\t\t<label class=\"pptx-ng-prop-row\">\n\t\t\t\t\t\t\t\t\t\t<span>Background</span>\n\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\ttype=\"color\"\n\t\t\t\t\t\t\t\t\t\t\t[attr.value]=\"sl.backgroundColor || '#ffffff'\"\n\t\t\t\t\t\t\t\t\t\t\t(change)=\"onSlideBackground($event)\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t\t<label class=\"pptx-ng-prop-row pptx-ng-prop-col\">\n\t\t\t\t\t\t\t\t\t\t<span>Notes</span>\n\t\t\t\t\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\t\t\t\t\trows=\"5\"\n\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Speaker notes…\"\n\t\t\t\t\t\t\t\t\t\t\t(change)=\"onSlideNotes($event)\"\n\t\t\t\t\t\t\t\t\t\t\t(blur)=\"onSlideNotes($event)\"\n\t\t\t\t\t\t\t\t\t\t\t>{{ sl.notes || '' }}</textarea\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t</aside>\n\t\t\t\t\t}\n\t\t\t\t</div>\n\t\t\t}\n\n\t\t\t@if (showSorter()) {\n\t\t\t\t<pptx-slide-sorter-overlay\n\t\t\t\t\t[slides]=\"loader.slides()\"\n\t\t\t\t\t[canvasSize]=\"loader.canvasSize()\"\n\t\t\t\t\t[mediaDataUrls]=\"loader.mediaDataUrls()\"\n\t\t\t\t\t[activeIndex]=\"activeSlideIndex()\"\n\t\t\t\t\t(select)=\"goTo($event); showSorter.set(false)\"\n\t\t\t\t\t(closed)=\"showSorter.set(false)\"\n\t\t\t\t/>\n\t\t\t}\n\n\t\t\t@if (presenting()) {\n\t\t\t\t<pptx-presentation-overlay\n\t\t\t\t\t[slides]=\"loader.slides()\"\n\t\t\t\t\t[canvasSize]=\"loader.canvasSize()\"\n\t\t\t\t\t[mediaDataUrls]=\"loader.mediaDataUrls()\"\n\t\t\t\t\t[startIndex]=\"activeSlideIndex()\"\n\t\t\t\t\t(indexChange)=\"activeSlideIndex.set($event)\"\n\t\t\t\t\t(closed)=\"presenting.set(false)\"\n\t\t\t\t/>\n\t\t\t}\n\n\t\t\t@if (showFind()) {\n\t\t\t\t<pptx-find-bar\n\t\t\t\t\t[slides]=\"loader.slides()\"\n\t\t\t\t\t(navigate)=\"goTo($event)\"\n\t\t\t\t\t(closed)=\"showFind.set(false)\"\n\t\t\t\t/>\n\t\t\t}\n\n\t\t\t@if (canEdit() && contextMenuPos(); as m) {\n\t\t\t\t<pptx-editor-context-menu\n\t\t\t\t\t[x]=\"m.x\"\n\t\t\t\t\t[y]=\"m.y\"\n\t\t\t\t\t[slideIndex]=\"activeSlideIndex()\"\n\t\t\t\t\t(closed)=\"contextMenuPos.set(null)\"\n\t\t\t\t/>\n\t\t\t}\n\t\t</div>\n\t`,\n})\nexport class PowerPointViewerComponent {\n\t/** PowerPoint content as Uint8Array (or ArrayBuffer). */\n\treadonly content = input<Uint8Array | ArrayBuffer | null>(null);\n\t/** Whether editing actions are enabled. (Editor chrome not yet ported.) */\n\treadonly canEdit = input<boolean>(false);\n\t/** Optional class applied to the root element. */\n\treadonly class = input<string>('');\n\t/** Theme configuration for customising the viewer's appearance. */\n\treadonly theme = input<ViewerTheme | undefined>(undefined);\n\t/** Optional real-time collaboration config (accepted for API parity; not yet implemented). */\n\treadonly collaboration = input<CollaborationConfig | undefined>(undefined);\n\n\t/** Fired when the active slide changes. */\n\treadonly activeSlideChange = output<number>();\n\t/** Fired when the unsaved-changes flag toggles. (Editing not yet ported.) */\n\treadonly dirtyChange = output<boolean>();\n\t/** Fired when the in-memory content changes after edits. (Editing not yet ported.) */\n\treadonly contentChange = output<Uint8Array>();\n\n\tprotected readonly loader = inject(LoadContentService);\n\tprivate readonly exportSvc = inject(ExportService);\n\tprotected readonly editor = inject(EditorStateService);\n\n\t/** The `<main>` host; used to locate the live `.pptx-ng-canvas-stage`. */\n\tprivate readonly mainEl = viewChild<ElementRef<HTMLElement>>('mainEl');\n\t/** True while a PNG/PDF export is in progress (disables the buttons). */\n\tprotected readonly exporting = signal(false);\n\n\tprotected readonly activeSlideIndex = signal(0);\n\t/** Slides to display: the editable deck when `canEdit`, else the loaded deck. */\n\tprotected readonly displaySlides = computed(() =>\n\t\tthis.canEdit() ? this.editor.slides() : this.loader.slides(),\n\t);\n\tprotected readonly slideCount = computed(() => this.displaySlides().length);\n\tprotected readonly activeSlide = computed(() => this.displaySlides()[this.activeSlideIndex()]);\n\tprotected readonly rootStyle = computed(() => themeStyle(this.theme()));\n\n\tprotected readonly zoom = signal(1);\n\tprotected readonly zoomPercent = computed(() => Math.round(this.zoom() * 100));\n\n\t/** Fullscreen presentation-mode overlay visibility. */\n\tprotected readonly presenting = signal(false);\n\t/** Slide-sorter grid overlay visibility. */\n\tprotected readonly showSorter = signal(false);\n\t/** Speaker-notes strip visibility. */\n\tprotected readonly showNotes = signal(false);\n\t/** Find-in-slides bar visibility. */\n\tprotected readonly showFind = signal(false);\n\t/** Open editor context-menu position (client coords), or null. */\n\tprotected readonly contextMenuPos = signal<{ x: number; y: number } | null>(null);\n\t/** Id of the element being inline text-edited, or null. */\n\tprotected readonly editingId = signal<string | null>(null);\n\t/** Notes for the active slide, if any. */\n\tprotected readonly activeNotes = computed(() => this.activeSlide()?.notes?.trim() || '');\n\t/**\n\t * Stable, always-truthy key for the slide-properties form. Changes only when\n\t * the active slide changes, so the `@if` recreates (and reseeds) the\n\t * uncontrolled notes/background inputs on navigation — but never mid-typing.\n\t * String-prefixed so slide index 0 stays truthy under `@if (…; as key)`.\n\t */\n\tprotected readonly slidePropsKey = computed(() => `slide-${this.activeSlideIndex()}`);\n\t/** The single selected element on the active slide (for the inspector). */\n\tprotected readonly selectedElement = computed<PptxElement | null>(() => {\n\t\tconst ids = this.editor.selectedIds();\n\t\tif (ids.length !== 1) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.activeSlide()?.elements.find((e) => e.id === ids[0]) ?? null;\n\t});\n\n\tconstructor() {\n\t\t// Load whenever the `content` input changes.\n\t\teffect(() => {\n\t\t\tconst content = this.content();\n\t\t\tvoid this.loader.load(content);\n\t\t});\n\n\t\t// Reset to the first slide and seed the editable deck whenever a new\n\t\t// presentation finishes loading.\n\t\teffect(() => {\n\t\t\tconst slides = this.loader.slides();\n\t\t\tthis.editor.setSlides(slides);\n\t\t\tthis.activeSlideIndex.set(0);\n\t\t});\n\n\t\t// Emit navigation changes.\n\t\teffect(() => {\n\t\t\tthis.activeSlideChange.emit(this.activeSlideIndex());\n\t\t});\n\n\t\t// Surface the editor's dirty flag to the host.\n\t\teffect(() => {\n\t\t\tthis.dirtyChange.emit(this.editor.dirty());\n\t\t});\n\n\t\t// Keep the active index in range when the deck shrinks (slide deleted).\n\t\teffect(() => {\n\t\t\tconst count = this.displaySlides().length;\n\t\t\tif (count > 0 && this.activeSlideIndex() >= count) {\n\t\t\t\tthis.activeSlideIndex.set(count - 1);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Serialise the current presentation to `.pptx` bytes (imperative handle).\n\t * When editing, this serialises the editor's edited deck so changes persist.\n\t */\n\tgetContent(): Promise<Uint8Array> {\n\t\treturn this.canEdit() ? this.loader.saveSlides(this.editor.slides()) : this.loader.getContent();\n\t}\n\n\tgoTo(index: number): void {\n\t\tif (index < 0 || index >= this.slideCount()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.activeSlideIndex.set(index);\n\t}\n\tgoPrev(): void {\n\t\tthis.goTo(this.activeSlideIndex() - 1);\n\t}\n\tgoNext(): void {\n\t\tthis.goTo(this.activeSlideIndex() + 1);\n\t}\n\n\t/** Horizontal-swipe tracking start coordinates (touch begins on the canvas). */\n\tprivate swipeStartX: number | null = null;\n\tprivate swipeStartY: number | null = null;\n\n\t/**\n\t * Begin tracking a horizontal swipe for slide navigation.\n\t *\n\t * To disambiguate a navigation swipe from an element drag, swipe-nav is only\n\t * armed when editing is off (`!canEdit()`). When `canEdit()` is true,\n\t * pointer/touch gestures belong to element manipulation (move/resize/rotate),\n\t * so we never hijack them. The large ‹ › buttons remain available in all\n\t * modes for explicit navigation.\n\t */\n\tonMainTouchStart(event: TouchEvent): void {\n\t\tif (this.canEdit() || event.changedTouches.length !== 1) {\n\t\t\tthis.swipeStartX = null;\n\t\t\tthis.swipeStartY = null;\n\t\t\treturn;\n\t\t}\n\t\tconst touch = event.changedTouches[0];\n\t\tthis.swipeStartX = touch.clientX;\n\t\tthis.swipeStartY = touch.clientY;\n\t}\n\n\t/**\n\t * Complete a swipe: a predominantly horizontal drag of at least the threshold\n\t * navigates to the previous (swipe right) or next (swipe left) slide.\n\t */\n\tonMainTouchEnd(event: TouchEvent): void {\n\t\tconst startX = this.swipeStartX;\n\t\tconst startY = this.swipeStartY;\n\t\tthis.swipeStartX = null;\n\t\tthis.swipeStartY = null;\n\t\tif (startX === null || startY === null || event.changedTouches.length !== 1) {\n\t\t\treturn;\n\t\t}\n\t\tconst touch = event.changedTouches[0];\n\t\tconst dx = touch.clientX - startX;\n\t\tconst dy = touch.clientY - startY;\n\t\tconst SWIPE_THRESHOLD = 50;\n\t\t// Ignore vertical-dominant gestures (scrolling) and short drags.\n\t\tif (Math.abs(dx) < SWIPE_THRESHOLD || Math.abs(dx) <= Math.abs(dy)) {\n\t\t\treturn;\n\t\t}\n\t\tif (dx < 0) {\n\t\t\tthis.goNext();\n\t\t} else {\n\t\t\tthis.goPrev();\n\t\t}\n\t}\n\n\tzoomIn(): void {\n\t\tthis.zoom.set(Math.min(ZOOM_MAX, Number((this.zoom() + ZOOM_STEP).toFixed(2))));\n\t}\n\tzoomOut(): void {\n\t\tthis.zoom.set(Math.max(ZOOM_MIN, Number((this.zoom() - ZOOM_STEP).toFixed(2))));\n\t}\n\tzoomReset(): void {\n\t\tthis.zoom.set(1);\n\t}\n\n\t/** Open the fullscreen presentation overlay from the current slide. */\n\tpresent(): void {\n\t\tif (this.slideCount() > 0) {\n\t\t\tthis.presenting.set(true);\n\t\t}\n\t}\n\t/** Toggle the speaker-notes strip. */\n\ttoggleNotes(): void {\n\t\tthis.showNotes.update((v) => !v);\n\t}\n\n\t/**\n\t * Handle an element press from the canvas. Additive (Shift/Ctrl) toggles\n\t * membership; a plain press selects the element (keeping it selected if it\n\t * already was, so a subsequent drag works).\n\t */\n\tonElementSelect(event: { id: string; additive: boolean }): void {\n\t\tif (event.additive) {\n\t\t\tthis.editor.toggleSelect(event.id, true);\n\t\t} else if (!this.editor.isSelected(event.id)) {\n\t\t\tthis.editor.select([event.id]);\n\t\t}\n\t}\n\n\t/** Right-click: select the element under the cursor and open the menu. */\n\tonContextMenu(event: { id: string | null; x: number; y: number }): void {\n\t\tif (event.id && !this.editor.isSelected(event.id)) {\n\t\t\tthis.editor.select([event.id]);\n\t\t}\n\t\tthis.contextMenuPos.set({ x: event.x, y: event.y });\n\t}\n\n\t/** Update the active slide's background colour. */\n\tonSlideBackground(event: Event): void {\n\t\tthis.editor.updateSlide(this.activeSlideIndex(), {\n\t\t\tbackgroundColor: (event.target as HTMLInputElement).value,\n\t\t});\n\t}\n\n\t/** Update the active slide's speaker notes. */\n\tonSlideNotes(event: Event): void {\n\t\tthis.editor.updateSlide(this.activeSlideIndex(), {\n\t\t\tnotes: (event.target as HTMLTextAreaElement).value,\n\t\t});\n\t}\n\n\t/** Commit an inline text edit: replace the element's text (one history entry). */\n\tonTextCommit(event: { id: string; text: string }): void {\n\t\tthis.editor.updateElement(this.activeSlideIndex(), event.id, {\n\t\t\ttext: event.text,\n\t\t\ttextSegments: [],\n\t\t});\n\t\tthis.editingId.set(null);\n\t}\n\n\t/**\n\t * Editing keyboard shortcuts (only when `canEdit` and not typing in a\n\t * field or presenting): Delete, Ctrl/Cmd+Z/Y undo/redo, Ctrl/Cmd+D\n\t * duplicate, arrow-key nudge (Shift = ×10).\n\t */\n\t@HostListener('document:keydown', ['$event'])\n\tonKeyDown(event: KeyboardEvent): void {\n\t\tif (!this.canEdit() || this.presenting()) {\n\t\t\treturn;\n\t\t}\n\t\tconst target = event.target as HTMLElement | null;\n\t\tconst tag = target?.tagName;\n\t\tif (tag === 'INPUT' || tag === 'TEXTAREA' || target?.isContentEditable) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst mod = event.ctrlKey || event.metaKey;\n\t\tconst idx = this.activeSlideIndex();\n\n\t\tif (mod && (event.key === 'z' || event.key === 'Z')) {\n\t\t\tevent.preventDefault();\n\t\t\tif (event.shiftKey) {\n\t\t\t\tthis.editor.redo();\n\t\t\t} else {\n\t\t\t\tthis.editor.undo();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (mod && (event.key === 'y' || event.key === 'Y')) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.editor.redo();\n\t\t\treturn;\n\t\t}\n\t\tif (mod && (event.key === 'd' || event.key === 'D')) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.editor.duplicateSelected(idx);\n\t\t\treturn;\n\t\t}\n\t\tif (mod && (event.key === 'c' || event.key === 'C')) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.editor.copySelected(idx);\n\t\t\treturn;\n\t\t}\n\t\tif (mod && (event.key === 'x' || event.key === 'X')) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.editor.cutSelected(idx);\n\t\t\treturn;\n\t\t}\n\t\tif (mod && (event.key === 'v' || event.key === 'V')) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.editor.paste(idx);\n\t\t\treturn;\n\t\t}\n\t\tif (mod && (event.key === 'a' || event.key === 'A')) {\n\t\t\tevent.preventDefault();\n\t\t\tthis.editor.selectAll(idx);\n\t\t\treturn;\n\t\t}\n\t\tif (mod && (event.key === 'g' || event.key === 'G')) {\n\t\t\tevent.preventDefault();\n\t\t\tif (event.shiftKey) {\n\t\t\t\tthis.editor.ungroupSelected(idx);\n\t\t\t} else {\n\t\t\t\tthis.editor.groupSelected(idx);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.editor.hasSelection()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === 'Delete' || event.key === 'Backspace') {\n\t\t\tevent.preventDefault();\n\t\t\tthis.editor.deleteSelected(idx);\n\t\t\treturn;\n\t\t}\n\n\t\tconst step = event.shiftKey ? 10 : 1;\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowLeft':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.editor.moveSelectedBy(idx, -step, 0);\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowRight':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.editor.moveSelectedBy(idx, step, 0);\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowUp':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.editor.moveSelectedBy(idx, 0, -step);\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowDown':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tthis.editor.moveSelectedBy(idx, 0, step);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/** Resolve the live slide-stage element within `<main>`. */\n\tprivate stageElement(): HTMLElement | undefined {\n\t\treturn (\n\t\t\tthis.mainEl()?.nativeElement.querySelector<HTMLElement>('.pptx-ng-canvas-stage') ?? undefined\n\t\t);\n\t}\n\n\t/** Export the current slide as a PNG download. */\n\tasync exportPng(): Promise<void> {\n\t\tconst el = this.stageElement();\n\t\tif (!el || this.exporting()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.exporting.set(true);\n\t\ttry {\n\t\t\tawait this.exportSvc.exportElementToPng(\n\t\t\t\tel,\n\t\t\t\tslideFileName('slide', this.activeSlideIndex() + 1, 'png'),\n\t\t\t);\n\t\t} finally {\n\t\t\tthis.exporting.set(false);\n\t\t}\n\t}\n\n\t/**\n\t * Export every slide to a multi-page PDF. Each slide is made the live stage,\n\t * given a render tick to settle, captured to a canvas, then the original\n\t * slide is restored.\n\t */\n\tasync exportPdf(): Promise<void> {\n\t\tconst total = this.slideCount();\n\t\tif (total === 0 || this.exporting()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.exporting.set(true);\n\t\tconst original = this.activeSlideIndex();\n\t\tconst { width, height } = this.loader.canvasSize();\n\t\tconst canvases: HTMLCanvasElement[] = [];\n\t\ttry {\n\t\t\tfor (let i = 0; i < total; i++) {\n\t\t\t\tthis.activeSlideIndex.set(i);\n\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\tsetTimeout(resolve, 150);\n\t\t\t\t});\n\t\t\t\tconst el = this.stageElement();\n\t\t\t\tif (el) {\n\t\t\t\t\tcanvases.push(await this.exportSvc.renderElement(el));\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.activeSlideIndex.set(original);\n\t\t\tthis.exportSvc.exportCanvasesToPdf(canvases, width, height, 'presentation.pdf');\n\t\t} finally {\n\t\t\tthis.activeSlideIndex.set(original);\n\t\t\tthis.exporting.set(false);\n\t\t}\n\t}\n}\n","/**\n * Join class values into a single space-separated string, skipping falsy\n * entries. A dependency-free analogue of the React/Vue packages' `cn`\n * (clsx + tailwind-merge); the Angular viewer uses plain scoped CSS rather\n * than Tailwind utility classes, so de-duplication is not required.\n */\nexport type ClassValue = string | number | false | null | undefined;\n\nexport function cn(...values: ClassValue[]): string {\n\treturn values.filter((v): v is string | number => Boolean(v)).join(' ');\n}\n","/**\n * Public API surface for `pptx-angular-viewer`.\n *\n * Angular counterpart of the React `pptx-viewer` and Vue `pptx-vue-viewer`\n * packages. Wraps the framework-agnostic `pptx-viewer-core` engine and shares\n * cross-framework logic via `pptx-viewer-shared`.\n */\nexport * from './viewer';\nexport * from './theme';\nexport { cn, type ClassValue } from './utils';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["DEFAULT_TEXT_COLOR","getResolvedShapeClipPathFor","getResolvedShapeClipPath","normalizeHexColor","clampUnitInterval","hexToRgbChannels","colorWithOpacity","sanitizeGradientStops","convertOoxmlAngleToCss","toCssGradientStop","computeGradientCenter","buildCirclePathGradient","buildRectPathGradient","buildShapePathGradient","getPatternSvg","DEFAULT_SHADOW_COLOR","DEFAULT_GLOW_COLOR","getOuterShadowCss","getInnerShadowCss","getMultiLayerShadowCss","getGlowBoxShadowCss","getBoxShadowCss","getEffectDagCssFilter","getDuotoneFilterId","getEffectFilterCss","buildReflectionCssValue","getReflectionCss","getEffectDagOpacity","getEffectDagBlendMode","hexToRgbUnit","getDuotoneSvgFilter","getComputedEffectStyle","hasImageEffects","child","ensureArray","attr","val","escapeXml","readText","OPERATOR_CHARS","isOperator","isNumeric","ACCENT_MAP","NARY_CHAR_MAP","DELIM_BEGIN_MAP","DELIM_END_MAP","convertRun","convertFraction","convertRadical","convertSuperscript","convertSubscript","convertSubSup","convertPreSubSup","convertNary","convertDelimiter","convertMatrix","convertAccent","convertBar","convertLimLow","convertLimUpp","convertGroupChr","convertEqArr","convertBox","convertFunc","convertChildren","convertElement","findOmathRoots","convertOmmlToMathMl","ommlToMathml","seriesColor","paletteColor","computeValueRange","valueToY","formatAxisValue","RESIZE_HANDLES","applyResize","MIN_ELEMENT_SIZE","DEFAULT_PALETTE","THUMB_W"],"mappings":"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"}
|