pptx-kit 0.8.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +164 -0
- package/README.md +25 -12
- package/dist/{api-284n4GCu.js → api-grq54JcQ.js} +1151 -406
- package/dist/api-grq54JcQ.js.map +1 -0
- package/dist/{index-Dz2acMvu.d.ts → index-CXoXNgJm.d.ts} +157 -40
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/node.d.ts +2 -2
- package/dist/node.js +2 -2
- package/package.json +4 -1
- package/dist/api-284n4GCu.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-grq54JcQ.js","names":["ATTR_ID","ATTR_TYPE","decoder","TEXT_DECODER","TEXT_ENCODER","decode","encode","SLIDE_LAYOUT_CONTENT_TYPE","THEME_CONTENT_TYPE","CORE_PROPS_CONTENT_TYPE","TEXT_ENCODER","encode","NAME_PRESENTATION","NAME_SLD_MASTER_ID_LST","NAME_SLD_ID_LST","NAME_SLD_ID","ATTR_ID","ATTR_R_ID","ATTR_CX","ATTR_CY","ATTR_TYPE","readSize","NAME_P","NAME_R","NAME_T","NAME_BU_NONE","ATTR_TYPEFACE","NAME_P","NAME_R","NAME_T","NAME_RPR","NAME_PPR","ATTR_ALGN","ATTR_MAR_L","ATTR_INDENT","NAME_SRGB_CLR","NAME_SCHEME_CLR","ATTR_VAL","NAME_RPR","NAME_SOLID_FILL","NAME_SRGB_CLR","NAME_SCHEME_CLR","ATTR_TYPEFACE","ATTR_VAL","setSolidFill","NAME_SOLID_FILL","NAME_NO_FILL","ATTR_ROT_WITH_SHAPE","ATTR_PRST","ATTR_DIR","ATTR_VAL","NAME_LN","NAME_SOLID_FILL","NAME_NO_FILL","ATTR_W","ATTR_VAL","ATTR_TYPE","ATTR_NAME","ATTR_X","ATTR_Y","ATTR_W","ATTR_H","ATTR_FILL","NAME_AV_LST","NAME_RPR","ATTR_R_ID","NAME_BLIP_FILL","NAME_BLIP","ATTR_R_EMBED","NAME_SP_PR","NAME_GRP_SP_PR","NAME_A_XFRM","NAME_P_XFRM","NAME_OFF","NAME_EXT","ATTR_X","ATTR_Y","ATTR_CX","ATTR_CY","NAME_SP_PR","NAME_GRP_SP_PR","NAME_A_XFRM","NAME_P_XFRM","NAME_OFF","NAME_EXT","ATTR_X","ATTR_Y","ATTR_CX","ATTR_CY","ATTR_FLIP_H","ATTR_FLIP_V","NAME_CSLD","NAME_SP_TREE","NAME_NV_SP_PR","NAME_NV_PIC_PR","NAME_NV_GRP_SP_PR","NAME_NV_GRAPHIC_FRAME_PR","NAME_NV_CXN_SP_PR","NAME_C_NV_PR","NAME_NV_PR","NAME_PH","NAME_TX_BODY","ATTR_ID","ATTR_NAME","ATTR_TYPE","ATTR_IDX","NAME_CSLD","ATTR_NAME","ATTR_TYPE","NAME_CSLD","NAME_SP_TREE","NAME_NV_GRP_SP_PR","NAME_C_NV_PR","NAME_C_NV_GRP_SP_PR","NAME_NV_PR","NAME_GRP_SP_PR","NAME_SP","NAME_NV_SP_PR","NAME_C_NV_SP_PR","NAME_SP_PR","NAME_TX_BODY","NAME_PH","NAME_BODY_PR","NAME_LST_STYLE","NAME_P","NAME_SP_LOCKS","ATTR_ID","ATTR_NAME","ATTR_TYPE","ATTR_IDX","ATTR_NO_GRP","textNode","NAME_SP","NAME_NV_SP_PR","NAME_C_NV_PR","NAME_C_NV_SP_PR","NAME_NV_PR","NAME_SP_PR","NAME_TX_BODY","NAME_A_XFRM","NAME_OFF","NAME_EXT","NAME_PRST_GEOM","NAME_AV_LST","NAME_BODY_PR","NAME_LST_STYLE","NAME_P","NAME_R","NAME_RPR","NAME_T","ATTR_ID","ATTR_NAME","ATTR_TX_BOX","ATTR_X","ATTR_Y","ATTR_CX","ATTR_CY","ATTR_PRST","ATTR_WRAP","ATTR_RTL_COL","ATTR_LANG","textNode","NAME_SP","NAME_NV_SP_PR","NAME_C_NV_PR","NAME_C_NV_SP_PR","NAME_NV_PR","NAME_SP_PR","NAME_TX_BODY","NAME_A_XFRM","NAME_OFF","NAME_EXT","NAME_PRST_GEOM","NAME_AV_LST","NAME_BODY_PR","NAME_LST_STYLE","NAME_P","NAME_R","NAME_RPR","NAME_T","ATTR_ID","ATTR_NAME","ATTR_X","ATTR_Y","ATTR_CX","ATTR_CY","ATTR_PRST","ATTR_LANG","text","textNode","NAME_C_NV_PR","NAME_NV_PR","NAME_SP_PR","NAME_A_XFRM","NAME_OFF","NAME_EXT","NAME_PRST_GEOM","NAME_AV_LST","NAME_SOLID_FILL","ATTR_IDX","ATTR_VAL","ATTR_ID","ATTR_NAME","ATTR_X","ATTR_Y","ATTR_CX","ATTR_CY","ATTR_PRST","ATTR_W","NAME_NV_GRP_SP_PR","NAME_C_NV_PR","NAME_C_NV_GRP_SP_PR","NAME_NV_PR","NAME_GRP_SP_PR","NAME_A_XFRM","NAME_OFF","NAME_EXT","ATTR_ID","ATTR_NAME","ATTR_X","ATTR_Y","ATTR_CX","ATTR_CY","NAME_C_NV_PR","NAME_NV_PR","NAME_SP_PR","NAME_OFF","NAME_EXT","ATTR_ID","ATTR_NAME","ATTR_X","ATTR_Y","ATTR_CX","ATTR_CY","ATTR_NO_CHANGE_ASPECT","NAME_GRAPHIC_FRAME","NAME_NV_GRAPHIC_FRAME_PR","NAME_C_NV_PR","NAME_C_NV_GRAPHIC_FRAME_PR","NAME_NV_PR","NAME_OFF","NAME_EXT","NAME_GRAPHIC","NAME_GRAPHIC_DATA","NAME_TX_BODY","NAME_BODY_PR","NAME_LST_STYLE","NAME_P","NAME_R","NAME_RPR","NAME_SOLID_FILL","NAME_SRGB_CLR","NAME_T","ATTR_VAL","ATTR_ID","ATTR_NAME","ATTR_NO_GRP","ATTR_X","ATTR_Y","ATTR_CX","ATTR_CY","ATTR_URI","ATTR_LANG","textNode","NAME_CSLD","NAME_SP_TREE","NAME_NV_PR","NAME_TX_BODY","NAME_T","ATTR_ID","ATTR_NAME","ATTR_TYPE","ATTR_IDX","textNode","NAME_VAL","ATTR_ID","ATTR_VAL","ATTR_ID","ATTR_NAME","ATTR_IDX","textNode","TEXT_ENCODER","decode","encode","NAME_SLD_ID_LST","NAME_SLD_ID","ATTR_ID","ATTR_R_ID","NAME_TX_BODY","NAME_SRGB_CLR","ATTR_VAL","ATTR_TYPEFACE","decode","encode","decode","encode","NS_C","NS_A","ATTR_VAL","ATTR_IDX","lineWidthEmu","validateLineWidthEmu","NAME_SOLID_FILL","NAME_A_RPR","NAME_A_DEF_RPR","NAME_A_PPR","decode","decode","encode","decode","NAME_P_NV_SP_PR","NAME_TX_BODY","decode","decode","decode","textNode","encode","decode","encode","decode","encode","emuValue","NAME_TX_BODY","decode","decode","decode","decode","decode","decode","decode","encode","decode","encode","NAME_SLD_ID_LST","NAME_SLD_ID","ATTR_ID","decode","encode","ATTR_R_ID"],"sources":["../src/api/units.ts","../src/internal/opc/zip.ts","../src/internal/opc/part-name.ts","../src/internal/xml/ast.ts","../src/internal/xml/namespaces.ts","../src/internal/xml/parse.ts","../src/internal/xml/query.ts","../src/internal/xml/serialize.ts","../src/internal/opc/content-types.ts","../src/internal/opc/rels.ts","../src/internal/opc/image-format.ts","../src/internal/parts/package.ts","../src/internal/parts/blank-deck.ts","../src/api/_internal-symbols.ts","../src/api/fn/package-io.ts","../src/internal/presentationml/relationship-types.ts","../src/internal/presentationml/presentation-part.ts","../src/internal/drawingml/text-body.ts","../src/internal/drawingml/text-body-mutation.ts","../src/internal/bounds.ts","../src/internal/drawingml/color.ts","../src/internal/drawingml/text-format.ts","../src/internal/drawingml/fill.ts","../src/internal/drawingml/effects.ts","../src/internal/drawingml/stroke.ts","../src/internal/drawingml/custom-geometry.ts","../src/internal/drawingml/hyperlink.ts","../src/internal/drawingml/picture-mutation.ts","../src/internal/drawingml/geometry.ts","../src/internal/drawingml/geometry-mutation.ts","../src/internal/presentationml/slide-part.ts","../src/internal/presentationml/slide-layout-part.ts","../src/internal/presentationml/slide-builder.ts","../src/internal/presentationml/text-box-builder.ts","../src/internal/presentationml/shape-builder.ts","../src/internal/presentationml/connector-builder.ts","../src/internal/presentationml/group-builder.ts","../src/internal/presentationml/picture-builder.ts","../src/internal/presentationml/table-builder.ts","../src/internal/presentationml/notes-slide-builder.ts","../src/internal/presentationml/transition-builder.ts","../src/internal/presentationml/animation-builder.ts","../src/internal/presentationml/comments-part.ts","../src/api/fn/_helpers.ts","../src/api/fn/theme.ts","../src/api/fn/comments.ts","../src/api/fn/shape-image.ts","../src/api/fn/shape-click-action.ts","../src/internal/chartml/chart-builder.ts","../src/internal/chartml/chart-reader.ts","../src/internal/chartml/embedded-xlsx.ts","../src/api/fn/slide-background.ts","../src/api/fn/color-map.ts","../src/api/fn/charts.ts","../src/api/fn/shape-paragraph.ts","../src/api/fn/layouts.ts","../src/api/fn/properties.ts","../src/api/fn/thumbnail.ts","../src/api/fn/tables.ts","../src/internal/validator/validate-presentation.ts","../src/api/fn/validation.ts","../src/api/fn/package-introspection.ts","../src/api/fn/slide-transition.ts","../src/api/fn/slide-notes.ts","../src/api/fn/slide-size.ts","../src/api/fn/shape-image-effects.ts","../src/api/fn/shape-animation.ts","../src/api/fn/slide-title.ts","../src/api/fn/shape-runs.ts","../src/api/fn/shape-color.ts","../src/api/fn/shape-fill-stroke.ts","../src/api/fn/shape-read-base.ts","../src/api/fn/shape-slide-read.ts","../src/api/fn/shape-read-paint.ts","../src/api/fn/shape-gradient-read.ts","../src/api/fn/shape-effects.ts","../src/api/fn/shape-text.ts","../src/api/fn/shape-removal-zorder.ts","../src/api/fn/shape-authoring.ts","../src/api/fn/slide-query.ts","../src/api/fn/sections.ts","../src/api/fn/slide-deck.ts","../src/api/fn/shape-grouping.ts","../src/api/index.ts"],"sourcesContent":["// EMU is the canonical internal length unit in OOXML.\n// 1 inch = 914400 EMU, 1 cm = 360000 EMU, 1 pt = 12700 EMU.\n// Branded so internal code can never confuse an Emu with a raw number.\n\ndeclare const emuBrand: unique symbol;\nexport type Emu = number & { readonly [emuBrand]: 'Emu' };\n\nconst EMU_PER_INCH = 914400;\nconst EMU_PER_CM = 360000;\nconst EMU_PER_PT = 12700;\n\n// EMU is an integer unit: `<a:off>` / `<a:ext>` coordinates are ST_Coordinate\n// (xsd:long). A fractional value like `3090672.0000000005` (floating-point\n// drift from unit conversion) is schema-invalid and makes PowerPoint mark the\n// file corrupt and \"repair\" it — zeroing the offending offsets, which collapses\n// shapes to the origin. Round at the unit boundary so conversions always yield\n// whole EMU.\nexport const inches = (n: number): Emu => Math.round(n * EMU_PER_INCH) as Emu;\nexport const cm = (n: number): Emu => Math.round(n * EMU_PER_CM) as Emu;\nexport const mm = (n: number): Emu => Math.round((n * EMU_PER_CM) / 10) as Emu;\nexport const pt = (n: number): Emu => Math.round(n * EMU_PER_PT) as Emu;\n\n// Escape hatch for callers that already hold an EMU value (e.g. read from an\n// existing pptx). Use sparingly. Rounded too: EMU is integer-valued, and a\n// fractional value here would reach the XML and trip PowerPoint's repair.\nexport const emu = (n: number): Emu => Math.round(n) as Emu;\n","// ZIP I/O backing the OPC package layer.\n//\n// Wraps `fflate` because it is the only ZIP library that is small (~30KB),\n// synchronous, and works in both Node and browsers without a polyfill. The\n// wrapper is deliberately thin: it just translates between fflate's\n// object-keyed API and an ordered array of entries, plus picks a sensible\n// compression level per entry.\n//\n// What we preserve on round-trip:\n//\n// - Entry order. fflate's `unzipSync` returns a plain object whose key\n// iteration order matches the central directory, so we use `Object.keys`\n// to recover the ordering. JS objects preserve insertion order for string\n// keys, so this is well-defined.\n// - Approximate per-entry compression method. Real PPTX files store media\n// (PNG, JPEG, ...) with no compression (STORE) and deflate everything\n// else. We mirror that heuristic on write, using extension to decide.\n// We do NOT round-trip the *exact* DEFLATE level — every PPTX consumer\n// accepts any valid level.\n//\n// What we do NOT preserve:\n//\n// - File timestamps (`mtime`). PowerPoint sets these to the current time\n// anyway; preserving the original would be misleading.\n// - ZIP64 extensions. fflate auto-promotes when needed.\n// - Extra fields, file attributes, UTF-8 flags. These are not load-bearing\n// for PPTX as consumed by PowerPoint.\n\nimport { type ZipOptions, unzipSync, zipSync } from 'fflate';\n\nexport interface ZipEntry {\n /** Path inside the archive, forward-slash separated (`ppt/slides/slide1.xml`). */\n name: string;\n /** Decompressed bytes. */\n data: Uint8Array;\n}\n\nexport interface ZipReadResult {\n /** Entries in the order the central directory listed them. */\n entries: ZipEntry[];\n}\n\nconst STORE_BY_EXTENSION = new Set([\n // images — already compressed\n 'png',\n 'jpg',\n 'jpeg',\n 'gif',\n 'bmp',\n 'tif',\n 'tiff',\n 'webp',\n // media — already compressed\n 'mp3',\n 'mp4',\n 'm4a',\n 'm4v',\n 'wav',\n 'wmv',\n 'mov',\n 'avi',\n // archives — already compressed\n 'pdf',\n 'zip',\n 'gz',\n '7z',\n 'rar',\n]);\n\nconst extensionOf = (name: string): string => {\n const dot = name.lastIndexOf('.');\n return dot < 0 ? '' : name.slice(dot + 1).toLowerCase();\n};\n\n/**\n * Returns true if the entry should be stored uncompressed. PPTX writers\n * conventionally STORE already-compressed payloads to avoid wasting CPU on\n * negligible savings.\n */\nexport const shouldStore = (name: string): boolean => STORE_BY_EXTENSION.has(extensionOf(name));\n\n/**\n * Reads a ZIP archive (a `.pptx` file is a ZIP) and returns entries in\n * central-directory order. Throws if `input` is not a valid ZIP.\n */\nexport const readZip = (input: Uint8Array): ZipReadResult => {\n const obj = unzipSync(input);\n const entries: ZipEntry[] = [];\n for (const name of Object.keys(obj)) {\n const data = obj[name];\n if (data === undefined) continue;\n entries.push({ name, data });\n }\n return { entries };\n};\n\n/**\n * Writes a ZIP archive. Entries are written in the order given. Each entry's\n * compression method is chosen from its extension via `shouldStore`. Callers\n * who want a specific compression level can pass `levelOverride`.\n */\n/** DEFLATE compression level. 0 stores uncompressed; 9 is best compression. */\nexport type CompressionLevel = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\n\nexport const writeZip = (\n entries: ReadonlyArray<ZipEntry>,\n options: { level?: CompressionLevel } = {},\n): Uint8Array => {\n const defaultLevel: CompressionLevel = options.level ?? 6;\n const obj: Record<string, [Uint8Array, ZipOptions]> = {};\n for (const e of entries) {\n const level: CompressionLevel = shouldStore(e.name) ? 0 : defaultLevel;\n obj[e.name] = [e.data, { level }];\n }\n return zipSync(obj);\n};\n","// Part name utilities per OPC (ECMA-376 Part 2 §9.1.1).\n//\n// A part name is a URI path that begins with `/`, uses `/` as segment\n// separator, and has no trailing slash (except the package root which is\n// outside the scope of this module). Within a ZIP, the file name is the part\n// name with the leading `/` removed.\n//\n// Part names are compared case-insensitively. We normalize them to lowercase\n// when comparing but preserve the original casing for serialization, because\n// the casing on disk is significant for compatibility with some tools.\n\nexport type PartName = string & { readonly __brand: 'PartName' };\n\n/**\n * Asserts the given string is a syntactically valid OPC part name and returns\n * it as a branded `PartName`. Throws otherwise.\n *\n * Rules enforced (subset; see ECMA-376 Part 2 §9.1.1.1-9.1.1.6):\n *\n * - Must start with `/`.\n * - Must not end with `/`.\n * - Must not contain `//` (empty segments).\n * - Each segment must be non-empty and must not be `.` or `..`.\n */\nexport const partName = (raw: string): PartName => {\n if (raw === '') throw new Error('part name is empty');\n if (!raw.startsWith('/')) throw new Error(`part name must start with \"/\": ${raw}`);\n if (raw.length > 1 && raw.endsWith('/')) {\n throw new Error(`part name must not end with \"/\": ${raw}`);\n }\n const segments = raw.slice(1).split('/');\n for (const s of segments) {\n if (s === '') throw new Error(`part name contains empty segment: ${raw}`);\n if (s === '.' || s === '..') {\n throw new Error(`part name contains \".\" or \"..\" segment: ${raw}`);\n }\n }\n return raw as PartName;\n};\n\n/** Convert a part name to the corresponding ZIP entry path (no leading slash). */\nexport const toZipPath = (name: PartName): string => name.slice(1);\n\n/** Convert a ZIP entry path to a part name (adds leading slash). */\nexport const fromZipPath = (zipPath: string): PartName => partName(`/${zipPath}`);\n\n/** Case-insensitive part name equality per OPC §9.1.1.7. */\nexport const partNamesEqual = (a: PartName, b: PartName): boolean =>\n a.toLowerCase() === b.toLowerCase();\n\n/**\n * Returns the directory portion of a part name (everything before the final\n * `/`). The result keeps the leading slash but has no trailing slash, except\n * for the root which returns `/`.\n */\nexport const dirname = (name: PartName): string => {\n const idx = name.lastIndexOf('/');\n if (idx <= 0) return '/';\n return name.slice(0, idx);\n};\n\n/** Returns the file portion of a part name (everything after the final `/`). */\nexport const basename = (name: PartName): string => {\n const idx = name.lastIndexOf('/');\n return idx < 0 ? name : name.slice(idx + 1);\n};\n\n/**\n * Computes the part name of the `.rels` file that holds relationships\n * originating from `name`. Per OPC §9.3.2: for a part `/x/y/z.xml` the rels\n * file is `/x/y/_rels/z.xml.rels`. The package-root rels file is `/_rels/.rels`.\n */\nexport const relsPartNameFor = (name: PartName): PartName => {\n const dir = dirname(name);\n const file = basename(name);\n const prefix = dir === '/' ? '/_rels/' : `${dir}/_rels/`;\n return partName(`${prefix}${file}.rels`);\n};\n\n/**\n * Resolves a relationship Target (which may be relative) against a base part\n * name. Returns the absolute part name (always starts with `/`).\n *\n * `target` is from a Relationship element's `Target` attribute when\n * `TargetMode=\"Internal\"`. External targets must not be passed through here.\n */\nexport const resolveTarget = (basePart: PartName, target: string): PartName => {\n if (target === '') throw new Error('relationship target is empty');\n if (target.startsWith('/')) return partName(target);\n\n const baseDir = dirname(basePart);\n const stack = baseDir === '/' ? [] : baseDir.slice(1).split('/');\n for (const segment of target.split('/')) {\n if (segment === '' || segment === '.') continue;\n if (segment === '..') {\n if (stack.length === 0) {\n throw new Error(`relationship target \"${target}\" escapes the package root`);\n }\n stack.pop();\n continue;\n }\n stack.push(segment);\n }\n return partName(`/${stack.join('/')}`);\n};\n","// XML AST types. Designed for round-trip fidelity on OOXML:\n//\n// - QName carries BOTH the namespace URI (for semantic checks) AND the prefix\n// the input used (so we can serialize back with the same prefix). DOM-style\n// APIs that re-derive prefixes from URIs break PowerPoint's compatibility\n// tooling.\n// - Attributes are an ordered array, not a map. OOXML attribute order matters\n// for tools that string-compare serialized XML (Microsoft Open XML Diff).\n// - Namespace declarations are recorded on the element where they appeared,\n// not flattened. `mc:AlternateContent` and similar nested namespace scopes\n// would otherwise lose their structure.\n// - Text vs CData vs Comment vs PI are distinct node kinds so the serializer\n// doesn't have to guess what to emit.\n\nexport interface QName {\n /** Empty string when no prefix is used (default namespace or unqualified). */\n readonly prefix: string;\n readonly localName: string;\n /** Empty string when the name has no namespace binding. */\n readonly namespaceURI: string;\n}\n\nexport interface XmlAttr {\n readonly name: QName;\n readonly value: string;\n}\n\nexport interface XmlElement {\n readonly kind: 'element';\n name: QName;\n attrs: XmlAttr[];\n /**\n * Prefix → URI declarations that appeared as `xmlns` / `xmlns:foo`\n * attributes on this element. The serializer re-emits them as attributes\n * (NOT inside `attrs`, since that array is for non-namespace attributes\n * only). An empty-string prefix entry is a default-namespace declaration.\n */\n prefixDecls: Map<string, string>;\n children: XmlNode[];\n}\n\nexport interface XmlText {\n readonly kind: 'text';\n data: string;\n}\n\nexport interface XmlCData {\n readonly kind: 'cdata';\n data: string;\n}\n\nexport interface XmlComment {\n readonly kind: 'comment';\n data: string;\n}\n\nexport interface XmlPI {\n readonly kind: 'pi';\n target: string;\n data: string;\n}\n\nexport type XmlNode = XmlElement | XmlText | XmlCData | XmlComment | XmlPI;\n\nexport interface XmlDeclaration {\n readonly version: string;\n readonly encoding?: string;\n readonly standalone?: 'yes' | 'no';\n}\n\nexport interface XmlDocument {\n readonly kind: 'document';\n decl: XmlDeclaration | null;\n /** Comments / processing instructions appearing before the root element. */\n prolog: ReadonlyArray<XmlComment | XmlPI>;\n root: XmlElement;\n /** Comments / processing instructions appearing after the root element. */\n epilog: ReadonlyArray<XmlComment | XmlPI>;\n}\n\n// Constructor helpers — explicit verbs rather than `new` invocations so call\n// sites read naturally.\n\nexport const qname = (prefix: string, localName: string, namespaceURI: string): QName => ({\n prefix,\n localName,\n namespaceURI,\n});\n\nexport const attr = (name: QName, value: string): XmlAttr => ({ name, value });\n\nexport const elem = (\n name: QName,\n init: {\n attrs?: XmlAttr[];\n prefixDecls?: Map<string, string>;\n children?: XmlNode[];\n } = {},\n): XmlElement => ({\n kind: 'element',\n name,\n attrs: init.attrs ?? [],\n prefixDecls: init.prefixDecls ?? new Map(),\n children: init.children ?? [],\n});\n\nexport const text = (data: string): XmlText => ({ kind: 'text', data });\nexport const cdata = (data: string): XmlCData => ({ kind: 'cdata', data });\nexport const comment = (data: string): XmlComment => ({ kind: 'comment', data });\nexport const pi = (target: string, data: string): XmlPI => ({ kind: 'pi', target, data });\n\n// QName comparison — namespace-first. Two QNames are equal iff their URI and\n// localName match. Prefix is irrelevant for equality (it's a serialization\n// detail) but is preserved on the values themselves.\nexport const qnameEquals = (a: QName, b: QName): boolean =>\n a.localName === b.localName && a.namespaceURI === b.namespaceURI;\n\n/**\n * Inserts `element` into `parent.children` at the slot dictated by `rankOf`,\n * keeping element children ordered by ascending rank (stable for equal ranks).\n *\n * Many OOXML complex types are `xsd:sequence`s: a child must appear in a fixed\n * order relative to its siblings or the part fails schema validation. Setters\n * that `push`/`unshift` produce valid output only when the caller happens to\n * invoke them in schema order — fragile across independent mutation calls.\n * Callers should strip any pre-existing same-element first, then use this to\n * drop the new element at its mandated position regardless of call order.\n *\n * `rankOf` returns the sibling's sequence position; return a large number for\n * trailing/unknown children so they sort to the end. Non-element nodes are\n * skipped when scanning, and the new element lands before the first existing\n * element whose rank is strictly greater.\n */\nexport const insertChildByRank = (\n parent: XmlElement,\n element: XmlElement,\n rankOf: (el: XmlElement) => number,\n): void => {\n const rank = rankOf(element);\n let idx = parent.children.length;\n for (let i = 0; i < parent.children.length; i++) {\n const child = parent.children[i];\n if (child?.kind !== 'element') continue;\n if (rankOf(child) > rank) {\n idx = i;\n break;\n }\n }\n parent.children.splice(idx, 0, element);\n};\n","// Canonical OOXML / PPTX namespace URIs. Keep both the URI and the prefix\n// PowerPoint emits in the wild — code that re-serializes XML must use the same\n// prefix the input file used (or, for fresh output, the prefix PowerPoint emits)\n// to maximize compatibility with downstream readers that string-match the prefix\n// rather than resolving by URI.\n\nexport const NS = {\n // Open Packaging Conventions\n contentTypes: 'http://schemas.openxmlformats.org/package/2006/content-types',\n relationships: 'http://schemas.openxmlformats.org/package/2006/relationships',\n // Office Open XML — relationship target type\n officeDocRels: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n // PresentationML\n pml: 'http://schemas.openxmlformats.org/presentationml/2006/main',\n // DrawingML\n dml: 'http://schemas.openxmlformats.org/drawingml/2006/main',\n // DrawingML — diagram (SmartArt)\n diagram: 'http://schemas.openxmlformats.org/drawingml/2006/diagram',\n // DrawingML — chart\n chart: 'http://schemas.openxmlformats.org/drawingml/2006/chart',\n // DrawingML — chart drawing\n chartDrawing: 'http://schemas.openxmlformats.org/drawingml/2006/chartDrawing',\n // SpreadsheetML (embedded xlsx for chart data)\n sml: 'http://schemas.openxmlformats.org/spreadsheetml/2006/main',\n // WordprocessingML (embedded in some PPTX parts)\n wml: 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',\n // Markup Compatibility & Extensibility\n mc: 'http://schemas.openxmlformats.org/markup-compatibility/2006',\n // Office 2007+ extension namespaces (a14, p14, p15, p16, etc.)\n // These appear inside mc:AlternateContent blocks; we list a few here for\n // canonical prefix mapping. Others get auto-prefixed by their declaration.\n a14: 'http://schemas.microsoft.com/office/drawing/2010/main',\n a15: 'http://schemas.microsoft.com/office/drawing/2012/main',\n a16: 'http://schemas.microsoft.com/office/drawing/2014/main',\n p14: 'http://schemas.microsoft.com/office/powerpoint/2010/main',\n p15: 'http://schemas.microsoft.com/office/powerpoint/2012/main',\n p16: 'http://schemas.microsoft.com/office/powerpoint/2015/main',\n // Reserved XML namespaces\n xml: 'http://www.w3.org/XML/1998/namespace',\n xmlns: 'http://www.w3.org/2000/xmlns/',\n} as const;\n\n// Suggested prefix for each known namespace URI, mirroring what PowerPoint\n// emits. Used as a fallback when authoring fresh XML and no prefix has been\n// declared yet. The parser preserves whatever prefix was actually in the input.\nexport const SUGGESTED_PREFIX: Readonly<Record<string, string>> = {\n [NS.contentTypes]: '',\n [NS.relationships]: '',\n [NS.officeDocRels]: 'r',\n [NS.pml]: 'p',\n [NS.dml]: 'a',\n [NS.diagram]: 'dgm',\n [NS.chart]: 'c',\n [NS.chartDrawing]: 'cdr',\n [NS.sml]: '',\n [NS.wml]: 'w',\n [NS.mc]: 'mc',\n [NS.a14]: 'a14',\n [NS.a15]: 'a15',\n [NS.a16]: 'a16',\n [NS.p14]: 'p14',\n [NS.p15]: 'p15',\n [NS.p16]: 'p16',\n [NS.xml]: 'xml',\n};\n","// XML parser tuned for OOXML.\n//\n// Hand-written tokenizer + tree builder. Handles the subset of XML 1.0 that\n// PowerPoint and the OOXML toolchain actually emit:\n//\n// - The XML declaration `<?xml ... ?>`.\n// - Element start / end / empty tags with attributes.\n// - Namespace prefix declarations (`xmlns`, `xmlns:foo`).\n// - Character data, with the five predefined entities and numeric character\n// references.\n// - CDATA sections, comments, processing instructions.\n//\n// Deliberately NOT supported:\n//\n// - DOCTYPE declarations and DTDs — OOXML doesn't use them. We skip past a\n// leading DOCTYPE if present, but its internal subset is rejected.\n// - General entity references beyond the five predefined names.\n// - XML 1.1 line-end normalization differences.\n//\n// The parser throws `XmlParseError` with a position on the first malformed\n// construct. It is intentionally strict: a silent recovery here would mask\n// data corruption further down the pipeline.\n\nimport {\n type QName,\n type XmlAttr,\n type XmlCData,\n type XmlComment,\n type XmlDeclaration,\n type XmlDocument,\n type XmlElement,\n type XmlPI,\n attr,\n cdata,\n comment,\n elem,\n pi,\n qname,\n text,\n} from './ast.ts';\nimport { NS } from './namespaces.ts';\n\nexport class XmlParseError extends Error {\n constructor(\n message: string,\n public readonly offset: number,\n public readonly line: number,\n public readonly column: number,\n ) {\n super(`${message} at line ${line}:${column} (offset ${offset})`);\n this.name = 'XmlParseError';\n }\n}\n\ninterface Cursor {\n readonly src: string;\n pos: number;\n}\n\nconst isNameStartChar = (c: string): boolean => {\n // XML 1.0 NameStartChar simplified to what OOXML actually emits: ASCII\n // letters, underscore, colon (used in prefixes). The full Unicode predicate\n // is overkill — PowerPoint never emits non-ASCII element names.\n const code = c.charCodeAt(0);\n return (\n (code >= 65 && code <= 90) || // A-Z\n (code >= 97 && code <= 122) || // a-z\n code === 95 || // _\n code === 58 // :\n );\n};\n\nconst isNameChar = (c: string): boolean => {\n if (isNameStartChar(c)) return true;\n const code = c.charCodeAt(0);\n return (\n (code >= 48 && code <= 57) || // 0-9\n code === 45 || // -\n code === 46 // .\n );\n};\n\nconst isWhitespace = (c: string): boolean => c === ' ' || c === '\\t' || c === '\\n' || c === '\\r';\n\nconst lineColOf = (src: string, pos: number): { line: number; column: number } => {\n let line = 1;\n let column = 1;\n for (let i = 0; i < pos && i < src.length; i++) {\n if (src.charCodeAt(i) === 10) {\n line++;\n column = 1;\n } else {\n column++;\n }\n }\n return { line, column };\n};\n\nconst fail = (cur: Cursor, message: string): never => {\n const { line, column } = lineColOf(cur.src, cur.pos);\n throw new XmlParseError(message, cur.pos, line, column);\n};\n\nconst expect = (cur: Cursor, literal: string): void => {\n if (cur.src.slice(cur.pos, cur.pos + literal.length) !== literal) {\n fail(cur, `expected \"${literal}\"`);\n }\n cur.pos += literal.length;\n};\n\nconst accept = (cur: Cursor, literal: string): boolean => {\n if (cur.src.slice(cur.pos, cur.pos + literal.length) !== literal) return false;\n cur.pos += literal.length;\n return true;\n};\n\nconst skipWhitespace = (cur: Cursor): void => {\n while (cur.pos < cur.src.length && isWhitespace(cur.src[cur.pos] ?? '')) cur.pos++;\n};\n\nconst readName = (cur: Cursor): string => {\n const start = cur.pos;\n if (cur.pos >= cur.src.length || !isNameStartChar(cur.src[cur.pos] ?? '')) {\n fail(cur, 'expected XML name');\n }\n cur.pos++;\n while (cur.pos < cur.src.length && isNameChar(cur.src[cur.pos] ?? '')) cur.pos++;\n return cur.src.slice(start, cur.pos);\n};\n\nconst splitQName = (raw: string): { prefix: string; localName: string } => {\n const idx = raw.indexOf(':');\n if (idx < 0) return { prefix: '', localName: raw };\n return { prefix: raw.slice(0, idx), localName: raw.slice(idx + 1) };\n};\n\n// Character / entity references inside attribute values and text content.\n// XML 1.0 predefined entities + decimal/hex numeric character references.\nconst decodeRefs = (cur: Cursor, raw: string): string => {\n let out = '';\n let i = 0;\n while (i < raw.length) {\n const ch = raw.charCodeAt(i);\n if (ch !== 38 /* & */) {\n out += raw[i];\n i++;\n continue;\n }\n const end = raw.indexOf(';', i + 1);\n if (end < 0) {\n cur.pos -= raw.length - i;\n fail(cur, 'unterminated entity reference');\n }\n const ref = raw.slice(i + 1, end);\n if (ref === 'amp') out += '&';\n else if (ref === 'lt') out += '<';\n else if (ref === 'gt') out += '>';\n else if (ref === 'quot') out += '\"';\n else if (ref === 'apos') out += \"'\";\n else if (ref.startsWith('#x') || ref.startsWith('#X')) {\n const code = Number.parseInt(ref.slice(2), 16);\n if (!Number.isFinite(code)) fail(cur, `invalid hex numeric reference: &${ref};`);\n out += String.fromCodePoint(code);\n } else if (ref.startsWith('#')) {\n const code = Number.parseInt(ref.slice(1), 10);\n if (!Number.isFinite(code)) fail(cur, `invalid decimal numeric reference: &${ref};`);\n out += String.fromCodePoint(code);\n } else {\n fail(cur, `unknown entity reference: &${ref};`);\n }\n i = end + 1;\n }\n return out;\n};\n\nconst readAttrValue = (cur: Cursor): string => {\n const quote = cur.src[cur.pos];\n if (quote !== '\"' && quote !== \"'\") fail(cur, 'expected attribute value');\n cur.pos++;\n const start = cur.pos;\n while (cur.pos < cur.src.length && cur.src[cur.pos] !== quote) {\n if (cur.src.charCodeAt(cur.pos) === 60 /* < */) {\n fail(cur, '\"<\" is not allowed inside an attribute value');\n }\n cur.pos++;\n }\n if (cur.pos >= cur.src.length) fail(cur, 'unterminated attribute value');\n const raw = cur.src.slice(start, cur.pos);\n cur.pos++; // consume closing quote\n return decodeRefs(cur, raw);\n};\n\ninterface NamespaceScope {\n readonly parent: NamespaceScope | null;\n /** prefix → URI; '' key holds the default namespace. */\n readonly bindings: Map<string, string>;\n}\n\nconst xmlScope: NamespaceScope = {\n parent: null,\n bindings: new Map([['xml', NS.xml]]),\n};\n\nconst resolvePrefix = (scope: NamespaceScope, prefix: string): string | null => {\n let cursor: NamespaceScope | null = scope;\n while (cursor) {\n const found = cursor.bindings.get(prefix);\n if (found !== undefined) return found;\n cursor = cursor.parent;\n }\n return null;\n};\n\nconst resolveQName = (\n cur: Cursor,\n scope: NamespaceScope,\n raw: string,\n isAttribute: boolean,\n): QName => {\n const { prefix, localName } = splitQName(raw);\n let namespaceURI = '';\n if (prefix !== '') {\n const found = resolvePrefix(scope, prefix);\n if (found === null) {\n return fail(cur, `unbound namespace prefix \"${prefix}\"`);\n }\n namespaceURI = found;\n } else if (!isAttribute) {\n // Unqualified element names use the default namespace, if any.\n namespaceURI = resolvePrefix(scope, '') ?? '';\n }\n // Per Namespaces in XML 1.0: unqualified attributes have NO namespace, even\n // if a default namespace is declared. We honor that.\n return qname(prefix, localName, namespaceURI);\n};\n\nconst parseDeclaration = (cur: Cursor): XmlDeclaration | null => {\n if (!accept(cur, '<?xml')) return null;\n // Anything until `?>`\n const end = cur.src.indexOf('?>', cur.pos);\n if (end < 0) fail(cur, 'unterminated XML declaration');\n const body = cur.src.slice(cur.pos, end);\n cur.pos = end + 2;\n const get = (key: string): string | undefined => {\n const m = body.match(new RegExp(`\\\\b${key}\\\\s*=\\\\s*(['\"])(.*?)\\\\1`));\n return m?.[2];\n };\n const version = get('version');\n if (version === undefined) {\n return fail(cur, 'XML declaration missing \"version\"');\n }\n const encoding = get('encoding');\n const standaloneRaw = get('standalone');\n let standalone: 'yes' | 'no' | undefined;\n if (standaloneRaw === 'yes' || standaloneRaw === 'no') {\n standalone = standaloneRaw;\n } else if (standaloneRaw !== undefined) {\n return fail(cur, `invalid standalone value \"${standaloneRaw}\"`);\n }\n return {\n version,\n ...(encoding !== undefined ? { encoding } : {}),\n ...(standalone !== undefined ? { standalone } : {}),\n };\n};\n\nconst parseComment = (cur: Cursor): XmlComment => {\n expect(cur, '<!--');\n const end = cur.src.indexOf('-->', cur.pos);\n if (end < 0) fail(cur, 'unterminated comment');\n const data = cur.src.slice(cur.pos, end);\n if (data.includes('--')) fail(cur, '\"--\" is not allowed inside an XML comment');\n cur.pos = end + 3;\n return comment(data);\n};\n\nconst parsePI = (cur: Cursor): XmlPI => {\n expect(cur, '<?');\n const targetStart = cur.pos;\n while (\n cur.pos < cur.src.length &&\n !isWhitespace(cur.src[cur.pos] ?? '') &&\n cur.src.slice(cur.pos, cur.pos + 2) !== '?>'\n ) {\n cur.pos++;\n }\n const target = cur.src.slice(targetStart, cur.pos);\n if (target.toLowerCase() === 'xml') {\n fail(cur, 'PI target may not be \"xml\"');\n }\n skipWhitespace(cur);\n const end = cur.src.indexOf('?>', cur.pos);\n if (end < 0) fail(cur, 'unterminated processing instruction');\n const data = cur.src.slice(cur.pos, end);\n cur.pos = end + 2;\n return pi(target, data);\n};\n\nconst parseCData = (cur: Cursor): XmlCData => {\n expect(cur, '<![CDATA[');\n const end = cur.src.indexOf(']]>', cur.pos);\n if (end < 0) fail(cur, 'unterminated CDATA section');\n const data = cur.src.slice(cur.pos, end);\n cur.pos = end + 3;\n return cdata(data);\n};\n\nconst skipDoctype = (cur: Cursor): void => {\n // OOXML does not use DOCTYPE; if we encounter one we skip it without parsing\n // the internal subset (no `[` allowed).\n expect(cur, '<!DOCTYPE');\n while (cur.pos < cur.src.length) {\n const c = cur.src[cur.pos];\n if (c === '[') fail(cur, 'DOCTYPE internal subset is not supported');\n if (c === '>') {\n cur.pos++;\n return;\n }\n cur.pos++;\n }\n fail(cur, 'unterminated DOCTYPE');\n};\n\nconst parseStartOrEmptyTag = (\n cur: Cursor,\n parentScope: NamespaceScope,\n): { element: XmlElement; scope: NamespaceScope; empty: boolean } => {\n expect(cur, '<');\n const rawName = readName(cur);\n const ownAttrs: { raw: string; rawValue: string }[] = [];\n const prefixDecls = new Map<string, string>();\n let empty = false;\n\n while (true) {\n const wsStart = cur.pos;\n skipWhitespace(cur);\n if (cur.pos === wsStart && cur.src[cur.pos] !== '/' && cur.src[cur.pos] !== '>') {\n fail(cur, 'expected whitespace before next attribute');\n }\n if (accept(cur, '/>')) {\n empty = true;\n break;\n }\n if (accept(cur, '>')) break;\n const attrRawName = readName(cur);\n skipWhitespace(cur);\n expect(cur, '=');\n skipWhitespace(cur);\n const value = readAttrValue(cur);\n if (attrRawName === 'xmlns') {\n prefixDecls.set('', value);\n } else if (attrRawName.startsWith('xmlns:')) {\n const p = attrRawName.slice(6);\n if (p === '') fail(cur, 'empty namespace prefix in xmlns:');\n if (p === 'xmlns') fail(cur, 'prefix \"xmlns\" cannot be redeclared');\n prefixDecls.set(p, value);\n } else {\n ownAttrs.push({ raw: attrRawName, rawValue: value });\n }\n }\n\n const scope: NamespaceScope = {\n parent: parentScope,\n bindings: new Map<string, string>(prefixDecls),\n };\n\n const elemName = resolveQName(cur, scope, rawName, false);\n const attrs: XmlAttr[] = ownAttrs.map(({ raw, rawValue }) =>\n attr(resolveQName(cur, scope, raw, true), rawValue),\n );\n\n return {\n element: elem(elemName, { attrs, prefixDecls, children: [] }),\n scope,\n empty,\n };\n};\n\nconst parseEndTag = (cur: Cursor): string => {\n expect(cur, '</');\n const name = readName(cur);\n skipWhitespace(cur);\n expect(cur, '>');\n return name;\n};\n\nconst parseTextContent = (cur: Cursor): string => {\n const start = cur.pos;\n while (cur.pos < cur.src.length && cur.src.charCodeAt(cur.pos) !== 60 /* < */) {\n cur.pos++;\n }\n return decodeRefs(cur, cur.src.slice(start, cur.pos));\n};\n\nconst parseElement = (cur: Cursor, parentScope: NamespaceScope): XmlElement => {\n const { element, scope, empty } = parseStartOrEmptyTag(cur, parentScope);\n if (empty) return element;\n while (cur.pos < cur.src.length) {\n if (cur.src.charCodeAt(cur.pos) === 60 /* < */) {\n if (cur.src.startsWith('</', cur.pos)) {\n const closingRaw = parseEndTag(cur);\n const expectedRaw =\n element.name.prefix === ''\n ? element.name.localName\n : `${element.name.prefix}:${element.name.localName}`;\n if (closingRaw !== expectedRaw) {\n fail(cur, `mismatched closing tag: expected </${expectedRaw}>, got </${closingRaw}>`);\n }\n return element;\n }\n if (cur.src.startsWith('<![CDATA[', cur.pos)) {\n element.children.push(parseCData(cur));\n } else if (cur.src.startsWith('<!--', cur.pos)) {\n element.children.push(parseComment(cur));\n } else if (cur.src.startsWith('<?', cur.pos)) {\n element.children.push(parsePI(cur));\n } else {\n element.children.push(parseElement(cur, scope));\n }\n } else {\n const t = parseTextContent(cur);\n if (t.length > 0) element.children.push(text(t));\n }\n }\n return fail(cur, `unterminated element <${element.name.localName}>`);\n};\n\nexport const parseXml = (src: string): XmlDocument => {\n // Strip a leading BOM if present — common in OOXML files written by .NET.\n const stripped = src.charCodeAt(0) === 0xfeff ? src.slice(1) : src;\n const cur: Cursor = { src: stripped, pos: 0 };\n const decl = parseDeclaration(cur);\n skipWhitespace(cur);\n\n const prolog: Array<XmlComment | XmlPI> = [];\n // Prolog: comments, PIs, optional DOCTYPE. Stop at the root element.\n while (cur.pos < cur.src.length) {\n skipWhitespace(cur);\n if (cur.src.startsWith('<!--', cur.pos)) prolog.push(parseComment(cur));\n else if (cur.src.startsWith('<!DOCTYPE', cur.pos)) skipDoctype(cur);\n else if (cur.src.startsWith('<?', cur.pos)) prolog.push(parsePI(cur));\n else break;\n }\n skipWhitespace(cur);\n\n if (cur.pos >= cur.src.length || cur.src[cur.pos] !== '<') {\n fail(cur, 'expected root element');\n }\n const root = parseElement(cur, xmlScope);\n\n const epilog: Array<XmlComment | XmlPI> = [];\n while (cur.pos < cur.src.length) {\n skipWhitespace(cur);\n if (cur.pos >= cur.src.length) break;\n if (cur.src.startsWith('<!--', cur.pos)) epilog.push(parseComment(cur));\n else if (cur.src.startsWith('<?', cur.pos)) epilog.push(parsePI(cur));\n else fail(cur, 'unexpected content after root element');\n }\n\n return { kind: 'document', decl, prolog, root, epilog };\n};\n\n// Convenience for parsing an XML fragment (no declaration / prolog), returning\n// just the root element. Used heavily by part-specific tests.\nexport const parseFragment = (src: string): XmlElement => parseXml(src).root;\n\n// Lightweight helper for hand-written test cases: builds a scope chain from\n// inherited prefix declarations and resolves a raw \"prefix:local\" string.\nexport const resolveQNameWithBindings = (\n raw: string,\n bindings: ReadonlyArray<readonly [prefix: string, uri: string]>,\n isAttribute: boolean,\n): QName => {\n const scope: NamespaceScope = {\n parent: null,\n bindings: new Map(bindings),\n };\n return resolveQName({ src: raw, pos: 0 }, scope, raw, isAttribute);\n};\n\nexport const _internalsForTest = { isNameStartChar, isNameChar, splitQName };\n","// Query helpers for the XML AST.\n//\n// These are ergonomic accessors for the read-heavy code in higher layers\n// (PresentationML reads slide.xml looking for `p:cSld/p:spTree`, etc.).\n// They never mutate the AST; mutation goes through the AST constructors and\n// direct field assignment.\n\nimport type { QName, XmlAttr, XmlElement, XmlNode, XmlText } from './ast.ts';\nimport { qnameEquals } from './ast.ts';\n\nexport const isElement = (n: XmlNode): n is XmlElement => n.kind === 'element';\nexport const isText = (n: XmlNode): n is XmlText => n.kind === 'text';\n\nexport const childElements = (e: XmlElement): XmlElement[] => e.children.filter(isElement);\n\nexport const firstChildElement = (e: XmlElement, name: QName): XmlElement | null => {\n for (const c of e.children) {\n if (isElement(c) && qnameEquals(c.name, name)) return c;\n }\n return null;\n};\n\nexport const allChildElements = (e: XmlElement, name: QName): XmlElement[] => {\n const out: XmlElement[] = [];\n for (const c of e.children) {\n if (isElement(c) && qnameEquals(c.name, name)) out.push(c);\n }\n return out;\n};\n\nexport const getAttr = (e: XmlElement, name: QName): XmlAttr | null => {\n for (const a of e.attrs) {\n if (qnameEquals(a.name, name)) return a;\n }\n return null;\n};\n\nexport const getAttrValue = (e: XmlElement, name: QName): string | null =>\n getAttr(e, name)?.value ?? null;\n\n/**\n * Returns the concatenated text content of an element, walking into nested\n * elements. OOXML uses this pattern for `<a:t>Hello</a:t>` (single text\n * child) and for run sequences where multiple text nodes need merging.\n */\nexport const textContent = (e: XmlElement): string => {\n let out = '';\n for (const c of e.children) {\n if (c.kind === 'text') out += c.data;\n else if (c.kind === 'cdata') out += c.data;\n else if (c.kind === 'element') out += textContent(c);\n }\n return out;\n};\n\n/**\n * Walks the element tree depth-first, yielding every element including the\n * root. The visitor returns `false` to skip descending into the current\n * element's children. Returning nothing (or `true`) descends as usual.\n */\nexport const walkElements = (root: XmlElement, visit: (e: XmlElement) => boolean | void): void => {\n const stack: XmlElement[] = [root];\n while (stack.length > 0) {\n const node = stack.pop();\n if (!node) continue;\n const descend = visit(node);\n if (descend === false) continue;\n // Push in reverse so visit order is DFS-natural left-to-right.\n for (let i = node.children.length - 1; i >= 0; i--) {\n const c = node.children[i];\n if (c && isElement(c)) stack.push(c);\n }\n }\n};\n","// XML serializer for the AST in `./ast.ts`.\n//\n// Goals:\n//\n// - Round-trip fidelity. Element/attribute order and prefix choices on the\n// way out match the way in (provided the AST hasn't been mutated to break\n// that). The serializer never reorders attributes, never reallocates\n// namespace prefixes, never re-emits xmlns declarations on a different\n// element than where the parser placed them.\n// - Predictable output for hand-built ASTs. Authoring-time code can assume\n// the same input element produces the same byte sequence.\n// - Escape rules tight enough for PowerPoint to accept the output: the\n// predefined entities, numeric references for the whitespace controls that\n// attribute-value normalization would otherwise eat (tab / LF / CR), and a\n// hard reject for the C0 control characters XML 1.0 forbids outright.\n//\n// Out of scope:\n//\n// - Pretty-printing. OOXML files are usually compact-on-write because most\n// producers don't pretty-print. A future option could add indent if\n// someone really wants it, but the round-trip story is cleaner without.\n\nimport type { XmlAttr, XmlDocument, XmlElement, XmlNode } from './ast.ts';\n\n// XML 1.0 forbids the C0 control characters except tab (0x09), LF (0x0A), and\n// CR (0x0D). Unlike most escapable characters these cannot be rescued with a\n// numeric reference either — `�` … `` are themselves illegal because the\n// referenced code point is not a legal `Char` (XML 1.0 §2.2). A value carrying\n// one can only have entered through authoring input (a parsed document could not\n// have held it), so we reject loudly: emitting it raw produces a non-well-formed\n// part that corrupts the entire .pptx, and silently dropping it would be a\n// surprise data loss. Strip the character upstream before authoring.\nconst rejectForbiddenControlChar = (c: number): void => {\n if (c < 0x20 && c !== 0x09 && c !== 0x0a && c !== 0x0d) {\n const hex = c.toString(16).toUpperCase().padStart(4, '0');\n throw new Error(\n `XML-illegal control character U+${hex} in text; strip control characters before authoring`,\n );\n }\n};\n\nconst escapeAttr = (s: string): string => {\n // Attribute values: escape <, &, and the quote char we use. We always use\n // double quotes, so single quotes pass through. CR and LF must be encoded\n // numerically because XML parsers normalize whitespace in attribute values.\n let out = '';\n for (let i = 0; i < s.length; i++) {\n const c = s.charCodeAt(i);\n rejectForbiddenControlChar(c);\n if (c === 38) out += '&';\n else if (c === 60) out += '<';\n else if (c === 62) out += '>';\n else if (c === 34) out += '"';\n else if (c === 9) out += '	';\n else if (c === 10) out += ' ';\n else if (c === 13) out += ' ';\n else out += s[i];\n }\n return out;\n};\n\nconst escapeText = (s: string): string => {\n let out = '';\n for (let i = 0; i < s.length; i++) {\n const c = s.charCodeAt(i);\n rejectForbiddenControlChar(c);\n if (c === 38) out += '&';\n else if (c === 60) out += '<';\n else if (c === 62) out += '>';\n else if (c === 13) out += ' ';\n else out += s[i];\n }\n return out;\n};\n\nconst rawName = (prefix: string, localName: string): string =>\n prefix === '' ? localName : `${prefix}:${localName}`;\n\nconst writeAttr = (a: XmlAttr): string => {\n const name = rawName(a.name.prefix, a.name.localName);\n return ` ${name}=\"${escapeAttr(a.value)}\"`;\n};\n\nconst writeElement = (e: XmlElement, parts: string[]): void => {\n const name = rawName(e.name.prefix, e.name.localName);\n parts.push('<');\n parts.push(name);\n for (const [prefix, uri] of e.prefixDecls) {\n const decl = prefix === '' ? 'xmlns' : `xmlns:${prefix}`;\n parts.push(` ${decl}=\"${escapeAttr(uri)}\"`);\n }\n for (const a of e.attrs) parts.push(writeAttr(a));\n if (e.children.length === 0) {\n parts.push('/>');\n return;\n }\n parts.push('>');\n for (const child of e.children) writeNode(child, parts);\n parts.push('</');\n parts.push(name);\n parts.push('>');\n};\n\nconst writeNode = (n: XmlNode, parts: string[]): void => {\n switch (n.kind) {\n case 'element':\n writeElement(n, parts);\n return;\n case 'text':\n parts.push(escapeText(n.data));\n return;\n case 'cdata':\n // CDATA may not contain `]]>`. The canonical workaround is to break the\n // illegal sequence by ending one CDATA section and starting another:\n // replace `]]>` with `]]]]><![CDATA[>` (which re-parses as `]]` followed\n // by `>`). The result is two adjacent CDATA sections whose concatenated\n // content equals the original. PowerPoint never emits CDATA in PPTX, so\n // this path only ever runs for hand-built ASTs.\n parts.push('<![CDATA[');\n parts.push(n.data.split(']]>').join(']]]]><![CDATA[>'));\n parts.push(']]>');\n return;\n case 'comment':\n parts.push('<!--');\n parts.push(n.data);\n parts.push('-->');\n return;\n case 'pi':\n parts.push('<?');\n parts.push(n.target);\n if (n.data.length > 0) {\n parts.push(' ');\n parts.push(n.data);\n }\n parts.push('?>');\n return;\n }\n};\n\nconst writeDeclaration = (doc: XmlDocument, parts: string[]): void => {\n if (!doc.decl) return;\n parts.push('<?xml version=\"');\n parts.push(escapeAttr(doc.decl.version));\n parts.push('\"');\n if (doc.decl.encoding !== undefined) {\n parts.push(' encoding=\"');\n parts.push(escapeAttr(doc.decl.encoding));\n parts.push('\"');\n }\n if (doc.decl.standalone !== undefined) {\n parts.push(' standalone=\"');\n parts.push(doc.decl.standalone);\n parts.push('\"');\n }\n parts.push('?>');\n};\n\nexport const serializeXml = (\n doc: XmlDocument,\n options: { standaloneDeclaration?: boolean } = {},\n): string => {\n const parts: string[] = [];\n if (doc.decl) {\n writeDeclaration(doc, parts);\n } else if (options.standaloneDeclaration ?? true) {\n // OOXML parts MUST start with an XML declaration. Add a sensible default\n // when the AST doesn't carry one (typical for hand-built trees).\n parts.push('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>');\n }\n for (const p of doc.prolog) writeNode(p, parts);\n writeElement(doc.root, parts);\n for (const e of doc.epilog) writeNode(e, parts);\n return parts.join('');\n};\n\n// Serialize a single element with no declaration / document wrapper. Useful in\n// tests and when emitting fragments that get inlined into a larger document.\nexport const serializeFragment = (element: XmlElement): string => {\n const parts: string[] = [];\n writeElement(element, parts);\n return parts.join('');\n};\n\nexport const _internalsForTest = { escapeAttr, escapeText };\n","// [Content_Types].xml — required per-package map of part-name → content type.\n//\n// ECMA-376 Part 2 §10.1. Structure:\n//\n// <Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\n// <Default Extension=\"xml\" ContentType=\"application/xml\"/>\n// <Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\n// <Override PartName=\"/ppt/presentation.xml\" ContentType=\"application/vnd....\"/>\n// ...\n// </Types>\n//\n// A part's content type is determined by: first matching Override (by part\n// name, case-insensitive); if none, the Default for the part's extension\n// (case-insensitive). PPTX files always have at least the default for `xml`\n// and `rels`, plus overrides for most parts.\n\nimport { NS, type XmlDocument, elem, parseXml, qname, serializeXml } from '../xml/index.ts';\nimport { type PartName, basename, partName, partNamesEqual } from './part-name.ts';\n\nexport interface ContentTypeDefault {\n /** Lowercase, no leading dot, e.g. `xml`. */\n extension: string;\n contentType: string;\n}\n\nexport interface ContentTypeOverride {\n partName: PartName;\n contentType: string;\n}\n\nexport interface ContentTypes {\n defaults: ContentTypeDefault[];\n overrides: ContentTypeOverride[];\n}\n\nconst CT_NS = NS.contentTypes;\nconst NAME_TYPES = qname('', 'Types', CT_NS);\nconst NAME_DEFAULT = qname('', 'Default', CT_NS);\nconst NAME_OVERRIDE = qname('', 'Override', CT_NS);\nconst ATTR_EXTENSION = qname('', 'Extension', '');\nconst ATTR_CONTENT_TYPE = qname('', 'ContentType', '');\nconst ATTR_PART_NAME = qname('', 'PartName', '');\n\nconst getAttrValueRaw = (\n e: { attrs: ReadonlyArray<{ name: { localName: string }; value: string }> },\n local: string,\n): string | null => {\n for (const a of e.attrs) {\n if (a.name.localName === local) return a.value;\n }\n return null;\n};\n\nexport const parseContentTypes = (xml: string): ContentTypes => {\n const doc = parseXml(xml);\n if (doc.root.name.namespaceURI !== CT_NS || doc.root.name.localName !== 'Types') {\n throw new Error(`expected root <Types xmlns=\"${CT_NS}\">, got <${doc.root.name.localName}>`);\n }\n const defaults: ContentTypeDefault[] = [];\n const overrides: ContentTypeOverride[] = [];\n for (const child of doc.root.children) {\n if (child.kind !== 'element') continue;\n if (child.name.namespaceURI !== CT_NS) continue;\n if (child.name.localName === 'Default') {\n const ext = getAttrValueRaw(child, 'Extension');\n const ct = getAttrValueRaw(child, 'ContentType');\n if (ext === null || ct === null) {\n throw new Error('Content_Types Default missing Extension or ContentType');\n }\n defaults.push({ extension: ext.toLowerCase(), contentType: ct });\n } else if (child.name.localName === 'Override') {\n const pn = getAttrValueRaw(child, 'PartName');\n const ct = getAttrValueRaw(child, 'ContentType');\n if (pn === null || ct === null) {\n throw new Error('Content_Types Override missing PartName or ContentType');\n }\n overrides.push({ partName: partName(pn), contentType: ct });\n }\n }\n return { defaults, overrides };\n};\n\nexport const serializeContentTypes = (ct: ContentTypes): string => {\n const children = [\n ...ct.defaults.map((d) =>\n elem(NAME_DEFAULT, {\n attrs: [\n { name: ATTR_EXTENSION, value: d.extension },\n { name: ATTR_CONTENT_TYPE, value: d.contentType },\n ],\n }),\n ),\n ...ct.overrides.map((o) =>\n elem(NAME_OVERRIDE, {\n attrs: [\n { name: ATTR_PART_NAME, value: o.partName },\n { name: ATTR_CONTENT_TYPE, value: o.contentType },\n ],\n }),\n ),\n ];\n const root = elem(NAME_TYPES, {\n prefixDecls: new Map([['', CT_NS]]),\n children,\n });\n const doc: XmlDocument = {\n kind: 'document',\n decl: { version: '1.0', encoding: 'UTF-8', standalone: 'yes' },\n prolog: [],\n root,\n epilog: [],\n };\n return serializeXml(doc);\n};\n\n/**\n * Resolves the content type for a given part name.\n *\n * 1. The first Override whose PartName matches case-insensitively wins.\n * 2. Otherwise, the first Default whose Extension matches the part's\n * extension (case-insensitive) wins.\n * 3. Returns `null` if neither rule matches — `[Content_Types].xml` is\n * required to cover every part, so a null here indicates a malformed\n * package.\n */\nexport const lookupContentType = (ct: ContentTypes, name: PartName): string | null => {\n for (const o of ct.overrides) {\n if (partNamesEqual(o.partName, name)) return o.contentType;\n }\n const file = basename(name);\n const dot = file.lastIndexOf('.');\n if (dot < 0) return null;\n const ext = file.slice(dot + 1).toLowerCase();\n for (const d of ct.defaults) {\n if (d.extension.toLowerCase() === ext) return d.contentType;\n }\n return null;\n};\n\n/**\n * Convenience: a fresh ContentTypes seeded with the two defaults every PPTX\n * has (`xml` and `rels`). Authoring code can layer overrides on top.\n */\nexport const emptyContentTypes = (): ContentTypes => ({\n defaults: [\n { extension: 'rels', contentType: 'application/vnd.openxmlformats-package.relationships+xml' },\n { extension: 'xml', contentType: 'application/xml' },\n ],\n overrides: [],\n});\n","// Relationships parts (`*.rels`) per OPC §9.3.\n//\n// Structure:\n//\n// <Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n// <Relationship Id=\"rId1\" Type=\"http://....\" Target=\"slides/slide1.xml\"/>\n// <Relationship Id=\"rId2\" Type=\"http://....\" Target=\"https://x\" TargetMode=\"External\"/>\n// </Relationships>\n//\n// `Id` is unique within the part; PPTX uses `rId<N>` by convention but the\n// schema accepts any xsd:ID-valid string. `Type` is a URI identifying the\n// relationship semantics. `Target` is a URI: relative to the part's location\n// when `TargetMode` is `Internal` (default), or absolute when `External`.\n\nimport { NS, type XmlDocument, elem, parseXml, qname, serializeXml } from '../xml/index.ts';\n\nexport type TargetMode = 'Internal' | 'External';\n\nexport interface Relationship {\n id: string;\n type: string;\n target: string;\n /** Defaults to `'Internal'` when omitted from the XML. */\n targetMode: TargetMode;\n}\n\nexport interface Relationships {\n items: Relationship[];\n}\n\nconst REL_NS = NS.relationships;\nconst NAME_RELATIONSHIPS = qname('', 'Relationships', REL_NS);\nconst NAME_RELATIONSHIP = qname('', 'Relationship', REL_NS);\nconst ATTR_ID = qname('', 'Id', '');\nconst ATTR_TYPE = qname('', 'Type', '');\nconst ATTR_TARGET = qname('', 'Target', '');\nconst ATTR_TARGET_MODE = qname('', 'TargetMode', '');\n\nconst findAttr = (\n e: { attrs: ReadonlyArray<{ name: { localName: string }; value: string }> },\n local: string,\n): string | null => {\n for (const a of e.attrs) {\n if (a.name.localName === local) return a.value;\n }\n return null;\n};\n\nexport const parseRels = (xml: string): Relationships => {\n const doc = parseXml(xml);\n if (doc.root.name.namespaceURI !== REL_NS || doc.root.name.localName !== 'Relationships') {\n throw new Error(\n `expected root <Relationships xmlns=\"${REL_NS}\">, got <${doc.root.name.localName}>`,\n );\n }\n const items: Relationship[] = [];\n for (const child of doc.root.children) {\n if (child.kind !== 'element') continue;\n if (child.name.namespaceURI !== REL_NS || child.name.localName !== 'Relationship') {\n continue;\n }\n const id = findAttr(child, 'Id');\n const type = findAttr(child, 'Type');\n const target = findAttr(child, 'Target');\n if (id === null || type === null || target === null) {\n throw new Error('Relationship missing Id, Type, or Target');\n }\n const modeRaw = findAttr(child, 'TargetMode');\n let targetMode: TargetMode = 'Internal';\n if (modeRaw !== null) {\n if (modeRaw !== 'Internal' && modeRaw !== 'External') {\n throw new Error(`invalid TargetMode \"${modeRaw}\"`);\n }\n targetMode = modeRaw;\n }\n items.push({ id, type, target, targetMode });\n }\n return { items };\n};\n\nexport const serializeRels = (rels: Relationships): string => {\n const children = rels.items.map((r) => {\n const attrs = [\n { name: ATTR_ID, value: r.id },\n { name: ATTR_TYPE, value: r.type },\n { name: ATTR_TARGET, value: r.target },\n ];\n // OOXML convention: only emit TargetMode when External. Tools that\n // do otherwise sometimes get flagged by Office's diff comparison.\n if (r.targetMode === 'External') {\n attrs.push({ name: ATTR_TARGET_MODE, value: 'External' });\n }\n return elem(NAME_RELATIONSHIP, { attrs });\n });\n const root = elem(NAME_RELATIONSHIPS, {\n prefixDecls: new Map([['', REL_NS]]),\n children,\n });\n const doc: XmlDocument = {\n kind: 'document',\n decl: { version: '1.0', encoding: 'UTF-8', standalone: 'yes' },\n prolog: [],\n root,\n epilog: [],\n };\n return serializeXml(doc);\n};\n\n/**\n * Convenience: an empty Relationships value with no items.\n */\nexport const emptyRels = (): Relationships => ({ items: [] });\n\n/**\n * Returns the next free `rId<N>` id given a list of existing ids. The OPC\n * spec doesn't require this naming pattern, but PowerPoint emits it and our\n * authoring code follows suit so output diffs cleanly against PowerPoint.\n */\nexport const nextRelId = (existing: ReadonlyArray<string>): string => {\n let max = 0;\n for (const id of existing) {\n const m = id.match(/^rId(\\d+)$/);\n if (m?.[1] !== undefined) {\n const n = Number.parseInt(m[1], 10);\n if (Number.isFinite(n) && n > max) max = n;\n }\n }\n return `rId${max + 1}`;\n};\n","// Image format detection from raw bytes. Used by the picture-replacement\n// path to pick the right content type and file extension without forcing the\n// caller to spell them out.\n//\n// Detection is by magic bytes — sufficient for the formats PowerPoint\n// accepts. We do not run a full validator (that's the image library's job).\n\nexport type ImageFormat = 'png' | 'jpeg' | 'gif' | 'bmp' | 'tiff' | 'webp' | 'svg';\n\nconst startsWith = (bytes: Uint8Array, signature: ReadonlyArray<number>): boolean => {\n if (bytes.length < signature.length) return false;\n for (let i = 0; i < signature.length; i++) {\n if (bytes[i] !== signature[i]) return false;\n }\n return true;\n};\n\nconst decoder = new TextDecoder('utf-8', { fatal: false });\n\n/**\n * Detects the image format from raw bytes. Returns `null` if no known\n * signature matches — callers should treat that as a hard error and surface\n * a message asking for a recognized format.\n */\nexport const detectImageFormat = (bytes: Uint8Array): ImageFormat | null => {\n if (startsWith(bytes, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) return 'png';\n if (startsWith(bytes, [0xff, 0xd8, 0xff])) return 'jpeg';\n if (startsWith(bytes, [0x47, 0x49, 0x46, 0x38])) return 'gif';\n if (startsWith(bytes, [0x42, 0x4d])) return 'bmp';\n if (startsWith(bytes, [0x49, 0x49, 0x2a, 0x00])) return 'tiff';\n if (startsWith(bytes, [0x4d, 0x4d, 0x00, 0x2a])) return 'tiff';\n if (\n bytes.length >= 12 &&\n startsWith(bytes, [0x52, 0x49, 0x46, 0x46]) &&\n bytes[8] === 0x57 &&\n bytes[9] === 0x45 &&\n bytes[10] === 0x42 &&\n bytes[11] === 0x50\n ) {\n return 'webp';\n }\n // SVG is textual — sniff up to the first 1KB.\n const head = decoder.decode(bytes.subarray(0, Math.min(bytes.length, 1024)));\n if (/<svg[\\s>]/.test(head)) return 'svg';\n return null;\n};\n\n/** Natural pixel dimensions of an image. */\nexport interface ImagePixelSize {\n readonly width: number;\n readonly height: number;\n}\n\nconst readUint16Be = (bytes: Uint8Array, at: number): number => (bytes[at]! << 8) | bytes[at + 1]!;\n\nconst readUint32Be = (bytes: Uint8Array, at: number): number =>\n // `>>> 0` keeps the result an unsigned 32-bit int (a 4-byte PNG dimension\n // with the high bit set would otherwise read as negative).\n ((bytes[at]! << 24) | (bytes[at + 1]! << 16) | (bytes[at + 2]! << 8) | bytes[at + 3]!) >>> 0;\n\n// PNG: the IHDR chunk is the first chunk and always at a fixed offset —\n// 8-byte signature, 4-byte length, 4-byte \"IHDR\" tag, then width / height\n// as big-endian uint32 (PNG spec §11.2.2).\nconst pngSize = (bytes: Uint8Array): ImagePixelSize | null => {\n if (bytes.length < 24) return null;\n const width = readUint32Be(bytes, 16);\n const height = readUint32Be(bytes, 20);\n if (width <= 0 || height <= 0) return null;\n return { width, height };\n};\n\n// JPEG: walk the marker segments until a Start-Of-Frame marker, whose\n// payload carries the sample dimensions. SOF markers are 0xC0..0xCF except\n// the non-frame markers 0xC4 (DHT), 0xC8 (JPG), 0xCC (DAC).\nconst JPEG_SOF_EXCLUDED = new Set([0xc4, 0xc8, 0xcc]);\nconst jpegSize = (bytes: Uint8Array): ImagePixelSize | null => {\n // Skip the SOI (0xFFD8); then each segment is 0xFF, marker, 2-byte length.\n let offset = 2;\n while (offset + 9 < bytes.length) {\n if (bytes[offset] !== 0xff) {\n offset++;\n continue;\n }\n const marker = bytes[offset + 1]!;\n // Padding / standalone markers (RSTn, SOI, EOI, TEM) carry no length.\n if (marker === 0xff || (marker >= 0xd0 && marker <= 0xd9) || marker === 0x01) {\n offset += 2;\n continue;\n }\n const segmentLength = readUint16Be(bytes, offset + 2);\n if (segmentLength < 2) return null;\n if (marker >= 0xc0 && marker <= 0xcf && !JPEG_SOF_EXCLUDED.has(marker)) {\n // SOF payload: 1-byte precision, 2-byte height, 2-byte width.\n const height = readUint16Be(bytes, offset + 5);\n const width = readUint16Be(bytes, offset + 7);\n if (width <= 0 || height <= 0) return null;\n return { width, height };\n }\n offset += 2 + segmentLength;\n }\n return null;\n};\n\n/**\n * Reads an image's natural pixel dimensions from its header. Supports PNG\n * and JPEG — the two formats whose headers carry dimensions cheaply and\n * unambiguously. Returns `null` for every other format (and for truncated\n * / malformed headers), letting callers fall back rather than fail: an\n * aspect-ratio-preserving placement that can't measure the image just\n * stretches it as before.\n */\nexport const readImagePixelSize = (bytes: Uint8Array): ImagePixelSize | null => {\n const format = detectImageFormat(bytes);\n if (format === 'png') return pngSize(bytes);\n if (format === 'jpeg') return jpegSize(bytes);\n return null;\n};\n\n/**\n * Returns the conventional file-extension token (no leading dot) for the\n * given format. `jpeg` maps to `jpg` because that's what PowerPoint emits.\n */\nexport const extensionForFormat = (format: ImageFormat): string => {\n switch (format) {\n case 'jpeg':\n return 'jpg';\n case 'png':\n return 'png';\n case 'gif':\n return 'gif';\n case 'bmp':\n return 'bmp';\n case 'tiff':\n return 'tiff';\n case 'webp':\n return 'webp';\n case 'svg':\n return 'svg';\n }\n};\n\n/** Returns the IANA media type for the given image format. */\nexport const contentTypeForFormat = (format: ImageFormat): string => {\n switch (format) {\n case 'png':\n return 'image/png';\n case 'jpeg':\n return 'image/jpeg';\n case 'gif':\n return 'image/gif';\n case 'bmp':\n return 'image/bmp';\n case 'tiff':\n return 'image/tiff';\n case 'webp':\n return 'image/webp';\n case 'svg':\n return 'image/svg+xml';\n }\n};\n","// `OpcPackage` is the in-memory model of a `.pptx` archive at the OPC layer:\n// an ordered list of parts plus a `[Content_Types].xml` map.\n//\n// Round-trip rules:\n//\n// - Parts are kept in their original load order. New parts append at the\n// end. This matches what PowerPoint emits and keeps diffs small.\n// - `.rels` files are first-class parts. They are NOT auto-regenerated from\n// a parsed model on every save — that would force callers who only edit\n// content parts to pay the cost of round-tripping every relationship.\n// Higher-level edits that need a typed view go through `getRels` / `setRels`,\n// which parse on read and re-serialize on write back into the part.\n// - The package never invents content types. Callers must register an\n// override (or rely on the extension default) before adding a part whose\n// extension isn't already covered. Otherwise `validate()` will surface\n// the gap.\n\nimport {\n type ContentTypes,\n type PartName,\n type Relationships,\n type ZipEntry,\n emptyContentTypes,\n fromZipPath,\n lookupContentType,\n parseContentTypes,\n parseRels,\n partName,\n partNamesEqual,\n readZip,\n relsPartNameFor,\n serializeContentTypes,\n serializeRels,\n toZipPath,\n writeZip,\n} from '../opc/index.ts';\n\nconst TEXT_DECODER = new TextDecoder();\nconst TEXT_ENCODER = new TextEncoder();\n\nconst decode = (b: Uint8Array): string => TEXT_DECODER.decode(b);\nconst encode = (s: string): Uint8Array => TEXT_ENCODER.encode(s);\n\n/** A single OPC part: name, content type, and bytes. */\nexport interface Part {\n readonly name: PartName;\n contentType: string;\n data: Uint8Array;\n}\n\nconst CONTENT_TYPES_PART = '[Content_Types].xml';\n\n/**\n * In-memory model of an OPC package. Construct via `OpcPackage.load(bytes)`\n * to read an existing `.pptx`, or via `OpcPackage.empty()` to start from\n * scratch.\n */\nexport class OpcPackage {\n /**\n * Ordered list of parts. The order is the order parts will be written to\n * the ZIP central directory on `save()`. Direct mutation is allowed for\n * callers that need to reorder, but `addPart` / `removePart` are the\n * supported entry points.\n */\n readonly parts: Part[];\n /** Mutable Content_Types map. Direct mutation is allowed. */\n contentTypes: ContentTypes;\n\n private constructor(parts: Part[], contentTypes: ContentTypes) {\n this.parts = parts;\n this.contentTypes = contentTypes;\n }\n\n /**\n * Builds an empty package containing only the two default content-type\n * entries (xml, rels). No `.rels` or content parts yet — that's the caller's\n * job. PresentationML scaffolding will populate the typical PPTX skeleton.\n */\n static empty(): OpcPackage {\n return new OpcPackage([], emptyContentTypes());\n }\n\n /**\n * Loads a `.pptx` file from raw bytes. Parses `[Content_Types].xml`\n * eagerly; leaves part bodies as raw `Uint8Array`s for higher layers to\n * interpret.\n *\n * Throws if the archive is not a valid ZIP, or if `[Content_Types].xml` is\n * missing or malformed.\n */\n static load(bytes: Uint8Array): OpcPackage {\n const zip = readZip(bytes);\n let contentTypes: ContentTypes | null = null;\n const parts: Part[] = [];\n\n for (const entry of zip.entries) {\n if (entry.name === CONTENT_TYPES_PART) {\n contentTypes = parseContentTypes(decode(entry.data));\n continue;\n }\n // Some producers (PowerPoint on Windows, third-party tools) include\n // explicit directory entries in the ZIP central directory — zero-byte\n // names ending with \"/\". They are not OPC parts; skip them so part-name\n // validation does not reject them.\n if (entry.name.endsWith('/')) continue;\n const name = fromZipPath(entry.name);\n parts.push({\n name,\n contentType: '', // filled in after we've parsed Content_Types\n data: entry.data,\n });\n }\n\n if (contentTypes === null) {\n throw new Error('package is missing [Content_Types].xml');\n }\n\n for (const part of parts) {\n const ct = lookupContentType(contentTypes, part.name);\n if (ct === null) {\n throw new Error(\n `part \"${part.name}\" has no content type registered in [Content_Types].xml`,\n );\n }\n part.contentType = ct;\n }\n\n return new OpcPackage(parts, contentTypes);\n }\n\n /** Serialize the package to a `.pptx` byte stream. */\n save(): Uint8Array {\n const entries: ZipEntry[] = [];\n entries.push({\n name: CONTENT_TYPES_PART,\n data: encode(serializeContentTypes(this.contentTypes)),\n });\n for (const part of this.parts) {\n entries.push({ name: toZipPath(part.name), data: part.data });\n }\n return writeZip(entries);\n }\n\n /**\n * Looks up a part by name (case-insensitive per OPC §9.1.1.7).\n */\n getPart(name: PartName): Part | null {\n for (const p of this.parts) {\n if (partNamesEqual(p.name, name)) return p;\n }\n return null;\n }\n\n /**\n * Adds a new part. Throws if a part with the same name (case-insensitive)\n * already exists. The caller is responsible for ensuring the content type\n * is resolvable — either by extension default or by a registered override.\n */\n addPart(name: PartName, contentType: string, data: Uint8Array): Part {\n if (this.getPart(name) !== null) {\n throw new Error(`part \"${name}\" already exists`);\n }\n const part: Part = { name, contentType, data };\n this.parts.push(part);\n // If neither an existing default nor an existing override covers this\n // content type, register an Override so the on-disk Content_Types stays\n // consistent. Callers can replace the override later if they prefer a\n // default.\n const existing = lookupContentType(this.contentTypes, name);\n if (existing !== contentType) {\n this.contentTypes.overrides.push({ partName: name, contentType });\n }\n return part;\n }\n\n /**\n * Removes a part by name. Returns true if a part was removed; false if no\n * part with that name was present. Also drops any matching `Override`\n * entry from Content_Types; defaults are left untouched.\n */\n removePart(name: PartName): boolean {\n let removed = false;\n for (let i = this.parts.length - 1; i >= 0; i--) {\n const p = this.parts[i];\n if (p && partNamesEqual(p.name, name)) {\n this.parts.splice(i, 1);\n removed = true;\n }\n }\n if (removed) {\n this.contentTypes.overrides = this.contentTypes.overrides.filter(\n (o) => !partNamesEqual(o.partName, name),\n );\n }\n return removed;\n }\n\n /**\n * Reads (or parses, lazily) the relationships for the given part. Returns\n * `null` if the part has no sibling `.rels` part — this is normal for\n * content parts with no outgoing relationships.\n *\n * The returned `Relationships` is a fresh snapshot. Mutate it as needed,\n * then call `setRels(forPart, rels)` to persist the change back into the\n * package.\n */\n getRels(forPart: PartName): Relationships | null {\n const relsName = relsPartNameFor(forPart);\n const part = this.getPart(relsName);\n if (part === null) return null;\n return parseRels(decode(part.data));\n }\n\n /**\n * Writes relationships for the given part. Creates the sibling `.rels`\n * part if it didn't exist; replaces its bytes if it did. The relationships\n * part is given the standard relationships content type via the `rels`\n * extension default.\n */\n setRels(forPart: PartName, rels: Relationships): void {\n const relsName = relsPartNameFor(forPart);\n const bytes = encode(serializeRels(rels));\n const existing = this.getPart(relsName);\n if (existing !== null) {\n existing.data = bytes;\n return;\n }\n this.addPart(relsName, 'application/vnd.openxmlformats-package.relationships+xml', bytes);\n }\n\n /**\n * Convenience: read the package-root relationships (`/_rels/.rels`).\n * These point at the top-level parts — typically the presentation.xml,\n * core properties, and extended properties.\n */\n rootRels(): Relationships | null {\n const part = this.getPart(partName('/_rels/.rels'));\n if (part === null) return null;\n return parseRels(decode(part.data));\n }\n\n /** Convenience: write package-root relationships. */\n setRootRels(rels: Relationships): void {\n const name = partName('/_rels/.rels');\n const bytes = encode(serializeRels(rels));\n const existing = this.getPart(name);\n if (existing !== null) {\n existing.data = bytes;\n return;\n }\n this.addPart(name, 'application/vnd.openxmlformats-package.relationships+xml', bytes);\n }\n}\n","// Minimal \"blank deck\" scaffolding for `createPresentation`.\n//\n// PowerPoint cannot author a slide without a slide master, at least one\n// slide layout, a theme, and a slide size — `addSlide({ layout })` reads\n// the layout's placeholders, and the layout inherits geometry / text\n// styles from the master + theme. An OPC package with only the OPC\n// defaults (what `OpcPackage.empty()` produces) has none of that, so\n// `getSlideLayouts()` returns `[]` and from-scratch authoring is\n// impossible.\n//\n// This module emits the smallest set of parts that yields an\n// immediately-authorable deck: a single master, a theme, and three\n// layouts (Blank / Title Slide / Title and Content). The XML is held as\n// string templates rather than built through the DrawingML element\n// builders because these parts are static boilerplate — there is exactly\n// one canonical Office master/theme and reproducing it byte-for-byte\n// through builders would be far more code for zero flexibility. The\n// strings are validated against the ECMA-376 XSDs in\n// `test/fn-create-presentation.test.ts`.\n//\n// Tree-shaking: this module is imported only by `createPresentation`, so\n// the load+save / template-editing paths never pull it in. Keep it that\n// way — do not import it from any read or template-edit module.\n\nimport { partName } from '../opc/index.ts';\nimport { OpcPackage } from './package.ts';\n\n/** Slide canvas aspect ratio. `'16:9'` is the PowerPoint 2013+ default. */\nexport type BlankDeckAspect = '16:9' | '4:3';\n\n// Slide canvas dimensions in EMU. 914400 EMU = 1 inch.\nconst SLIDE_SIZE: Record<BlankDeckAspect, { cx: number; cy: number; type: string }> = {\n '16:9': { cx: 12192000, cy: 6858000, type: 'screen16x9' },\n '4:3': { cx: 9144000, cy: 6858000, type: 'screen4x3' },\n};\n\nconst RELS_CONTENT_TYPE = 'application/vnd.openxmlformats-package.relationships+xml';\nconst PRESENTATION_CONTENT_TYPE =\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml';\nconst PRES_PROPS_CONTENT_TYPE =\n 'application/vnd.openxmlformats-officedocument.presentationml.presProps+xml';\nconst VIEW_PROPS_CONTENT_TYPE =\n 'application/vnd.openxmlformats-officedocument.presentationml.viewProps+xml';\nconst SLIDE_MASTER_CONTENT_TYPE =\n 'application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml';\nconst SLIDE_LAYOUT_CONTENT_TYPE =\n 'application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml';\nconst THEME_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.theme+xml';\nconst TABLE_STYLES_CONTENT_TYPE =\n 'application/vnd.openxmlformats-officedocument.presentationml.tableStyles+xml';\nconst CORE_PROPS_CONTENT_TYPE = 'application/vnd.openxmlformats-package.core-properties+xml';\nconst EXTENDED_PROPS_CONTENT_TYPE =\n 'application/vnd.openxmlformats-officedocument.extended-properties+xml';\n\nconst XML_DECL = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\r\\n';\n\nconst RT = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships';\nconst RT_PACKAGE = 'http://schemas.openxmlformats.org/package/2006/relationships';\n\n// --- Theme ----------------------------------------------------------------\n// The canonical Office theme. DrawingML requires a complete fmtScheme\n// (3 fill / 3 line / 3 effect styles + 2 bg fills) and a full clrScheme;\n// trimming any of it fails XSD validation, so this is reproduced verbatim\n// from a PowerPoint-authored deck (test/fixtures/minimal/blank.pptx).\nconst THEME_XML = `${XML_DECL}<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Office Theme\"><a:themeElements><a:clrScheme name=\"Office\"><a:dk1><a:sysClr val=\"windowText\" lastClr=\"000000\"/></a:dk1><a:lt1><a:sysClr val=\"window\" lastClr=\"FFFFFF\"/></a:lt1><a:dk2><a:srgbClr val=\"1F497D\"/></a:dk2><a:lt2><a:srgbClr val=\"EEECE1\"/></a:lt2><a:accent1><a:srgbClr val=\"4F81BD\"/></a:accent1><a:accent2><a:srgbClr val=\"C0504D\"/></a:accent2><a:accent3><a:srgbClr val=\"9BBB59\"/></a:accent3><a:accent4><a:srgbClr val=\"8064A2\"/></a:accent4><a:accent5><a:srgbClr val=\"4BACC6\"/></a:accent5><a:accent6><a:srgbClr val=\"F79646\"/></a:accent6><a:hlink><a:srgbClr val=\"0000FF\"/></a:hlink><a:folHlink><a:srgbClr val=\"800080\"/></a:folHlink></a:clrScheme><a:fontScheme name=\"Office\"><a:majorFont><a:latin typeface=\"Calibri\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:majorFont><a:minorFont><a:latin typeface=\"Calibri\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:minorFont></a:fontScheme><a:fmtScheme name=\"Office\"><a:fillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"50000\"/><a:satMod val=\"300000\"/></a:schemeClr></a:gs><a:gs pos=\"35000\"><a:schemeClr val=\"phClr\"><a:tint val=\"37000\"/><a:satMod val=\"300000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:tint val=\"15000\"/><a:satMod val=\"350000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"16200000\" scaled=\"1\"/></a:gradFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"100000\"/><a:shade val=\"100000\"/><a:satMod val=\"130000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:tint val=\"50000\"/><a:shade val=\"100000\"/><a:satMod val=\"350000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"16200000\" scaled=\"0\"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w=\"9525\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"><a:shade val=\"95000\"/><a:satMod val=\"105000\"/></a:schemeClr></a:solidFill><a:prstDash val=\"solid\"/></a:ln><a:ln w=\"25400\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln><a:ln w=\"38100\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"40000\" dist=\"20000\" dir=\"5400000\" rotWithShape=\"0\"><a:srgbClr val=\"000000\"><a:alpha val=\"38000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"40000\" dist=\"23000\" dir=\"5400000\" rotWithShape=\"0\"><a:srgbClr val=\"000000\"><a:alpha val=\"35000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"40000\" dist=\"23000\" dir=\"5400000\" rotWithShape=\"0\"><a:srgbClr val=\"000000\"><a:alpha val=\"35000\"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst=\"orthographicFront\"><a:rot lat=\"0\" lon=\"0\" rev=\"0\"/></a:camera><a:lightRig rig=\"threePt\" dir=\"t\"><a:rot lat=\"0\" lon=\"0\" rev=\"1200000\"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w=\"63500\" h=\"25400\"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"40000\"/><a:satMod val=\"350000\"/></a:schemeClr></a:gs><a:gs pos=\"40000\"><a:schemeClr val=\"phClr\"><a:tint val=\"45000\"/><a:shade val=\"99000\"/><a:satMod val=\"350000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:shade val=\"20000\"/><a:satMod val=\"255000\"/></a:schemeClr></a:gs></a:gsLst><a:path path=\"circle\"><a:fillToRect l=\"50000\" t=\"-80000\" r=\"50000\" b=\"180000\"/></a:path></a:gradFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"80000\"/><a:satMod val=\"300000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:shade val=\"30000\"/><a:satMod val=\"200000\"/></a:schemeClr></a:gs></a:gsLst><a:path path=\"circle\"><a:fillToRect l=\"50000\" t=\"50000\" r=\"50000\" b=\"50000\"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/></a:theme>`;\n\n// --- Slide master ---------------------------------------------------------\n// Title + body placeholders, the standard colour map, a pointer to each\n// shipped layout, and the canonical txStyles block (title / body / other).\n// txStyles is reproduced verbatim because slides inherit their default run\n// sizes / bullets from here.\nconst SLIDE_MASTER_XML = `${XML_DECL}<p:sldMaster xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\"><p:cSld><p:bg><p:bgRef idx=\"1001\"><a:schemeClr val=\"bg1\"/></p:bgRef></p:bg><p:spTree><p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"0\" cy=\"0\"/><a:chOff x=\"0\" y=\"0\"/><a:chExt cx=\"0\" cy=\"0\"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id=\"2\" name=\"Title Placeholder 1\"/><p:cNvSpPr><a:spLocks noGrp=\"1\"/></p:cNvSpPr><p:nvPr><p:ph type=\"title\"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x=\"457200\" y=\"274638\"/><a:ext cx=\"8229600\" cy=\"1143000\"/></a:xfrm><a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert=\"horz\" lIns=\"91440\" tIns=\"45720\" rIns=\"91440\" bIns=\"45720\" rtlCol=\"0\" anchor=\"ctr\"><a:normAutofit/></a:bodyPr><a:lstStyle/><a:p><a:r><a:rPr lang=\"en-US\" smtClean=\"0\"/><a:t>Click to edit Master title style</a:t></a:r><a:endParaRPr lang=\"en-US\"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id=\"3\" name=\"Text Placeholder 2\"/><p:cNvSpPr><a:spLocks noGrp=\"1\"/></p:cNvSpPr><p:nvPr><p:ph type=\"body\" idx=\"1\"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x=\"457200\" y=\"1600200\"/><a:ext cx=\"8229600\" cy=\"4525963\"/></a:xfrm><a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom></p:spPr><p:txBody><a:bodyPr vert=\"horz\" lIns=\"91440\" tIns=\"45720\" rIns=\"91440\" bIns=\"45720\" rtlCol=\"0\"><a:normAutofit/></a:bodyPr><a:lstStyle/><a:p><a:pPr lvl=\"0\"/><a:r><a:rPr lang=\"en-US\" smtClean=\"0\"/><a:t>Click to edit Master text styles</a:t></a:r></a:p></p:txBody></p:sp></p:spTree></p:cSld><p:clrMap bg1=\"lt1\" tx1=\"dk1\" bg2=\"lt2\" tx2=\"dk2\" accent1=\"accent1\" accent2=\"accent2\" accent3=\"accent3\" accent4=\"accent4\" accent5=\"accent5\" accent6=\"accent6\" hlink=\"hlink\" folHlink=\"folHlink\"/><p:sldLayoutIdLst><p:sldLayoutId id=\"2147483649\" r:id=\"rId1\"/><p:sldLayoutId id=\"2147483650\" r:id=\"rId2\"/><p:sldLayoutId id=\"2147483651\" r:id=\"rId3\"/></p:sldLayoutIdLst><p:txStyles><p:titleStyle><a:lvl1pPr algn=\"ctr\" defTabSz=\"457200\" rtl=\"0\" eaLnBrk=\"1\" latinLnBrk=\"0\" hangingPunct=\"1\"><a:spcBef><a:spcPct val=\"0\"/></a:spcBef><a:buNone/><a:defRPr sz=\"4400\" kern=\"1200\"><a:solidFill><a:schemeClr val=\"tx1\"/></a:solidFill><a:latin typeface=\"+mj-lt\"/><a:ea typeface=\"+mj-ea\"/><a:cs typeface=\"+mj-cs\"/></a:defRPr></a:lvl1pPr></p:titleStyle><p:bodyStyle><a:lvl1pPr marL=\"342900\" indent=\"-342900\" algn=\"l\" defTabSz=\"457200\" rtl=\"0\" eaLnBrk=\"1\" latinLnBrk=\"0\" hangingPunct=\"1\"><a:spcBef><a:spcPct val=\"20000\"/></a:spcBef><a:buFont typeface=\"Arial\"/><a:buChar char=\"•\"/><a:defRPr sz=\"3200\" kern=\"1200\"><a:solidFill><a:schemeClr val=\"tx1\"/></a:solidFill><a:latin typeface=\"+mn-lt\"/><a:ea typeface=\"+mn-ea\"/><a:cs typeface=\"+mn-cs\"/></a:defRPr></a:lvl1pPr><a:lvl2pPr marL=\"742950\" indent=\"-285750\" algn=\"l\" defTabSz=\"457200\" rtl=\"0\" eaLnBrk=\"1\" latinLnBrk=\"0\" hangingPunct=\"1\"><a:spcBef><a:spcPct val=\"20000\"/></a:spcBef><a:buFont typeface=\"Arial\"/><a:buChar char=\"–\"/><a:defRPr sz=\"2800\" kern=\"1200\"><a:solidFill><a:schemeClr val=\"tx1\"/></a:solidFill><a:latin typeface=\"+mn-lt\"/><a:ea typeface=\"+mn-ea\"/><a:cs typeface=\"+mn-cs\"/></a:defRPr></a:lvl2pPr><a:lvl3pPr marL=\"1143000\" indent=\"-228600\" algn=\"l\" defTabSz=\"457200\" rtl=\"0\" eaLnBrk=\"1\" latinLnBrk=\"0\" hangingPunct=\"1\"><a:spcBef><a:spcPct val=\"20000\"/></a:spcBef><a:buFont typeface=\"Arial\"/><a:buChar char=\"•\"/><a:defRPr sz=\"2400\" kern=\"1200\"><a:solidFill><a:schemeClr val=\"tx1\"/></a:solidFill><a:latin typeface=\"+mn-lt\"/><a:ea typeface=\"+mn-ea\"/><a:cs typeface=\"+mn-cs\"/></a:defRPr></a:lvl3pPr><a:lvl4pPr marL=\"1600200\" indent=\"-228600\" algn=\"l\" defTabSz=\"457200\" rtl=\"0\" eaLnBrk=\"1\" latinLnBrk=\"0\" hangingPunct=\"1\"><a:spcBef><a:spcPct val=\"20000\"/></a:spcBef><a:buFont typeface=\"Arial\"/><a:buChar char=\"–\"/><a:defRPr sz=\"2000\" kern=\"1200\"><a:solidFill><a:schemeClr val=\"tx1\"/></a:solidFill><a:latin typeface=\"+mn-lt\"/><a:ea typeface=\"+mn-ea\"/><a:cs typeface=\"+mn-cs\"/></a:defRPr></a:lvl4pPr><a:lvl5pPr marL=\"2057400\" indent=\"-228600\" algn=\"l\" defTabSz=\"457200\" rtl=\"0\" eaLnBrk=\"1\" latinLnBrk=\"0\" hangingPunct=\"1\"><a:spcBef><a:spcPct val=\"20000\"/></a:spcBef><a:buFont typeface=\"Arial\"/><a:buChar char=\"»\"/><a:defRPr sz=\"2000\" kern=\"1200\"><a:solidFill><a:schemeClr val=\"tx1\"/></a:solidFill><a:latin typeface=\"+mn-lt\"/><a:ea typeface=\"+mn-ea\"/><a:cs typeface=\"+mn-cs\"/></a:defRPr></a:lvl5pPr></p:bodyStyle><p:otherStyle><a:defPPr><a:defRPr lang=\"en-US\"/></a:defPPr><a:lvl1pPr marL=\"0\" algn=\"l\" defTabSz=\"457200\" rtl=\"0\" eaLnBrk=\"1\" latinLnBrk=\"0\" hangingPunct=\"1\"><a:defRPr sz=\"1800\" kern=\"1200\"><a:solidFill><a:schemeClr val=\"tx1\"/></a:solidFill><a:latin typeface=\"+mn-lt\"/><a:ea typeface=\"+mn-ea\"/><a:cs typeface=\"+mn-cs\"/></a:defRPr></a:lvl1pPr></p:otherStyle></p:txStyles></p:sldMaster>`;\n\n// --- Layouts --------------------------------------------------------------\n// Each layout wraps the same `<p:cSld>` grammar as a slide. `addSlide`\n// clones the `<p:ph>` placeholders found here into the new slide, so the\n// placeholder set on each layout is what slide authors get to fill in.\n\n// Blank — no placeholders. `addSlide({ layout: Blank })` yields an empty\n// canvas for free-form text boxes / shapes / images.\nconst LAYOUT_BLANK_XML = `${XML_DECL}<p:sldLayout xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\" type=\"blank\" preserve=\"1\"><p:cSld name=\"Blank\"><p:spTree><p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"0\" cy=\"0\"/><a:chOff x=\"0\" y=\"0\"/><a:chExt cx=\"0\" cy=\"0\"/></a:xfrm></p:grpSpPr></p:spTree></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>`;\n\n// Title Slide — centered title + subtitle, the canonical opener.\nconst LAYOUT_TITLE_XML = `${XML_DECL}<p:sldLayout xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\" type=\"title\" preserve=\"1\"><p:cSld name=\"Title Slide\"><p:spTree><p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"0\" cy=\"0\"/><a:chOff x=\"0\" y=\"0\"/><a:chExt cx=\"0\" cy=\"0\"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id=\"2\" name=\"Title 1\"/><p:cNvSpPr><a:spLocks noGrp=\"1\"/></p:cNvSpPr><p:nvPr><p:ph type=\"ctrTitle\"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x=\"685800\" y=\"2130425\"/><a:ext cx=\"7772400\" cy=\"1470025\"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang=\"en-US\" smtClean=\"0\"/><a:t>Click to edit Master title style</a:t></a:r><a:endParaRPr lang=\"en-US\"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id=\"3\" name=\"Subtitle 2\"/><p:cNvSpPr><a:spLocks noGrp=\"1\"/></p:cNvSpPr><p:nvPr><p:ph type=\"subTitle\" idx=\"1\"/></p:nvPr></p:nvSpPr><p:spPr><a:xfrm><a:off x=\"1371600\" y=\"3886200\"/><a:ext cx=\"6400800\" cy=\"1752600\"/></a:xfrm></p:spPr><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang=\"en-US\" smtClean=\"0\"/><a:t>Click to edit Master subtitle style</a:t></a:r><a:endParaRPr lang=\"en-US\"/></a:p></p:txBody></p:sp></p:spTree></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>`;\n\n// Title and Content — title + a single body content placeholder.\nconst LAYOUT_OBJ_XML = `${XML_DECL}<p:sldLayout xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\" type=\"obj\" preserve=\"1\"><p:cSld name=\"Title and Content\"><p:spTree><p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"0\" cy=\"0\"/><a:chOff x=\"0\" y=\"0\"/><a:chExt cx=\"0\" cy=\"0\"/></a:xfrm></p:grpSpPr><p:sp><p:nvSpPr><p:cNvPr id=\"2\" name=\"Title 1\"/><p:cNvSpPr><a:spLocks noGrp=\"1\"/></p:cNvSpPr><p:nvPr><p:ph type=\"title\"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang=\"en-US\" smtClean=\"0\"/><a:t>Click to edit Master title style</a:t></a:r><a:endParaRPr lang=\"en-US\"/></a:p></p:txBody></p:sp><p:sp><p:nvSpPr><p:cNvPr id=\"3\" name=\"Content Placeholder 2\"/><p:cNvSpPr><a:spLocks noGrp=\"1\"/></p:cNvSpPr><p:nvPr><p:ph idx=\"1\"/></p:nvPr></p:nvSpPr><p:spPr/><p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:pPr lvl=\"0\"/><a:r><a:rPr lang=\"en-US\" smtClean=\"0\"/><a:t>Click to edit Master text styles</a:t></a:r></a:p></p:txBody></p:sp></p:spTree></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>`;\n\n// --- Presentation ---------------------------------------------------------\nconst buildPresentationXml = (size: { cx: number; cy: number; type: string }): string =>\n `${XML_DECL}<p:presentation xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\" saveSubsetFonts=\"1\"><p:sldMasterIdLst><p:sldMasterId id=\"2147483648\" r:id=\"rId1\"/></p:sldMasterIdLst><p:sldSz cx=\"${size.cx}\" cy=\"${size.cy}\" type=\"${size.type}\"/><p:notesSz cx=\"6858000\" cy=\"9144000\"/></p:presentation>`;\n\nconst PRES_PROPS_XML = `${XML_DECL}<p:presentationPr xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\"/>`;\n\nconst VIEW_PROPS_XML = `${XML_DECL}<p:viewPr xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\"/>`;\n\n// Table styles. PowerPoint always ships this part, and a table's\n// `<a:tableStyleId>` resolves against the `def` GUID here. We ship the\n// \"No Style, Table Grid\" default that PptxGenJS and our template fixtures\n// also use, so `addSlideTable` output renders as a clean ruled grid rather\n// than an unstyled block. (See `table-builder.ts` DEFAULT_TABLE_STYLE_ID.)\nconst TABLE_STYLES_XML = `${XML_DECL}<a:tblStyleLst xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" def=\"{5C22544A-7EE6-4342-B048-85BDC9FD1C3A}\"/>`;\n\nconst CORE_PROPS_XML = `${XML_DECL}<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\" xmlns:dcmitype=\"http://purl.org/dc/dcmitype/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><dc:title></dc:title><dc:creator>pptx-kit</dc:creator><cp:lastModifiedBy>pptx-kit</cp:lastModifiedBy></cp:coreProperties>`;\n\nconst EXTENDED_PROPS_XML = `${XML_DECL}<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\" xmlns:vt=\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\"><Application>pptx-kit</Application></Properties>`;\n\n// --- .rels ----------------------------------------------------------------\nconst ROOT_RELS_XML = `${XML_DECL}<Relationships xmlns=\"${RT_PACKAGE}\"><Relationship Id=\"rId1\" Type=\"${RT}/officeDocument\" Target=\"ppt/presentation.xml\"/><Relationship Id=\"rId2\" Type=\"${RT_PACKAGE}/metadata/core-properties\" Target=\"docProps/core.xml\"/><Relationship Id=\"rId3\" Type=\"${RT}/extended-properties\" Target=\"docProps/app.xml\"/></Relationships>`;\n\n// Presentation rels: master + theme + presProps + viewProps. The master's\n// rId1 must match the `<p:sldMasterId r:id=\"rId1\">` in presentation.xml.\nconst PRES_RELS_XML = `${XML_DECL}<Relationships xmlns=\"${RT_PACKAGE}\"><Relationship Id=\"rId1\" Type=\"${RT}/slideMaster\" Target=\"slideMasters/slideMaster1.xml\"/><Relationship Id=\"rId2\" Type=\"${RT}/theme\" Target=\"theme/theme1.xml\"/><Relationship Id=\"rId3\" Type=\"${RT}/presProps\" Target=\"presProps.xml\"/><Relationship Id=\"rId4\" Type=\"${RT}/viewProps\" Target=\"viewProps.xml\"/><Relationship Id=\"rId5\" Type=\"${RT}/tableStyles\" Target=\"tableStyles.xml\"/></Relationships>`;\n\n// Master rels: one slideLayout per shipped layout (matching the master's\n// `<p:sldLayoutIdLst>` rIds) + the theme.\nconst MASTER_RELS_XML = `${XML_DECL}<Relationships xmlns=\"${RT_PACKAGE}\"><Relationship Id=\"rId1\" Type=\"${RT}/slideLayout\" Target=\"../slideLayouts/slideLayout1.xml\"/><Relationship Id=\"rId2\" Type=\"${RT}/slideLayout\" Target=\"../slideLayouts/slideLayout2.xml\"/><Relationship Id=\"rId3\" Type=\"${RT}/slideLayout\" Target=\"../slideLayouts/slideLayout3.xml\"/><Relationship Id=\"rId4\" Type=\"${RT}/theme\" Target=\"../theme/theme1.xml\"/></Relationships>`;\n\n// Each layout points back at the single master.\nconst LAYOUT_RELS_XML = `${XML_DECL}<Relationships xmlns=\"${RT_PACKAGE}\"><Relationship Id=\"rId1\" Type=\"${RT}/slideMaster\" Target=\"../slideMasters/slideMaster1.xml\"/></Relationships>`;\n\nconst TEXT_ENCODER = new TextEncoder();\nconst encode = (s: string): Uint8Array => TEXT_ENCODER.encode(s);\n\n/**\n * Builds an OPC package for an immediately-authorable blank deck: one\n * slide master, the Office theme, three layouts (Blank / Title Slide /\n * Title and Content), and the chosen slide size. The deck has no slides\n * yet — call `addSlide({ layout })` (or `addBlankSlide` / `addTitleSlide`\n * / `addContentSlide`) to add one.\n */\nexport const buildBlankDeck = (aspect: BlankDeckAspect): OpcPackage => {\n const pkg = OpcPackage.empty();\n const size = SLIDE_SIZE[aspect];\n\n // Register the Content_Types overrides for every XML part we add. The\n // `.rels` Default is already present from `OpcPackage.empty()`; the\n // parts below need explicit overrides because their content types are\n // not extension defaults.\n const add = (name: string, contentType: string, xml: string): void => {\n pkg.addPart(partName(name), contentType, encode(xml));\n };\n const addRels = (name: string, xml: string): void => {\n pkg.addPart(partName(name), RELS_CONTENT_TYPE, encode(xml));\n };\n\n add('/ppt/presentation.xml', PRESENTATION_CONTENT_TYPE, buildPresentationXml(size));\n add('/ppt/presProps.xml', PRES_PROPS_CONTENT_TYPE, PRES_PROPS_XML);\n add('/ppt/viewProps.xml', VIEW_PROPS_CONTENT_TYPE, VIEW_PROPS_XML);\n add('/ppt/theme/theme1.xml', THEME_CONTENT_TYPE, THEME_XML);\n add('/ppt/tableStyles.xml', TABLE_STYLES_CONTENT_TYPE, TABLE_STYLES_XML);\n add('/ppt/slideMasters/slideMaster1.xml', SLIDE_MASTER_CONTENT_TYPE, SLIDE_MASTER_XML);\n add('/ppt/slideLayouts/slideLayout1.xml', SLIDE_LAYOUT_CONTENT_TYPE, LAYOUT_BLANK_XML);\n add('/ppt/slideLayouts/slideLayout2.xml', SLIDE_LAYOUT_CONTENT_TYPE, LAYOUT_TITLE_XML);\n add('/ppt/slideLayouts/slideLayout3.xml', SLIDE_LAYOUT_CONTENT_TYPE, LAYOUT_OBJ_XML);\n add('/docProps/core.xml', CORE_PROPS_CONTENT_TYPE, CORE_PROPS_XML);\n add('/docProps/app.xml', EXTENDED_PROPS_CONTENT_TYPE, EXTENDED_PROPS_XML);\n\n addRels('/_rels/.rels', ROOT_RELS_XML);\n addRels('/ppt/_rels/presentation.xml.rels', PRES_RELS_XML);\n addRels('/ppt/slideMasters/_rels/slideMaster1.xml.rels', MASTER_RELS_XML);\n addRels('/ppt/slideLayouts/_rels/slideLayout1.xml.rels', LAYOUT_RELS_XML);\n addRels('/ppt/slideLayouts/_rels/slideLayout2.xml.rels', LAYOUT_RELS_XML);\n addRels('/ppt/slideLayouts/_rels/slideLayout3.xml.rels', LAYOUT_RELS_XML);\n\n return pkg;\n};\n","// Internal-only symbol keys for the opaque handles the public fn API\n// returns (`PresentationData`, `SlideData`, `SlideShapeData`, etc.).\n// Defined in a dedicated module so importers never transitively pull\n// in heavy authoring code paths — readers stay light.\n//\n// These use `Symbol.for` (the process-global registry), NOT plain `Symbol`,\n// so the keys are identical across separately-bundled copies of this module.\n// The public entry (`pptx-kit` → dist/index.js) and the Node entry\n// (`pptx-kit/node` → dist/node.js) are distinct bundles, each with its own\n// copy of this file; companion packages (e.g. `pptx-kit-preview`) hold a\n// third. With plain `Symbol` a handle built by one bundle is opaque to every\n// other — `getSlides(loadPresentationFile(...))` would read `undefined` and\n// crash. The `pptx-kit.` namespace keeps the registry keys collision-free.\n\nimport type { PartName } from '../internal/opc/index.ts';\nimport type { OpcPackage } from '../internal/parts/index.ts';\nimport type {\n CommentAuthor,\n SlideComment,\n SlideLayoutPart,\n SlidePart,\n} from '../internal/presentationml/index.ts';\nimport type { XmlDocument, XmlElement } from '../internal/xml/index.ts';\n\nexport const INTERNAL_PACKAGE = Symbol.for('pptx-kit.package');\nexport const SLIDE_PART_NAME = Symbol.for('pptx-kit.slide.partName');\nexport const SLIDE_DOCUMENT = Symbol.for('pptx-kit.slide.document');\nexport const SLIDE_PART = Symbol.for('pptx-kit.slide.part');\nexport const SLIDE_SHAPES = Symbol.for('pptx-kit.slide.shapes');\nexport const SHAPE_SLIDE = Symbol.for('pptx-kit.shape.slide');\nexport const SHAPE_ELEMENT = Symbol.for('pptx-kit.shape.element');\nexport const SHAPE_SNAPSHOT = Symbol.for('pptx-kit.shape.snapshot');\nexport const LAYOUT_PART_NAME = Symbol.for('pptx-kit.layout.partName');\nexport const LAYOUT_PART = Symbol.for('pptx-kit.layout.part');\nexport const COMMENT_SLIDE = Symbol.for('pptx-kit.comment.slide');\nexport const COMMENT_SNAPSHOT = Symbol.for('pptx-kit.comment.snapshot');\nexport const CELL_TABLE = Symbol.for('pptx-kit.cell.table');\nexport const CELL_ELEMENT = Symbol.for('pptx-kit.cell.element');\nexport const CELL_ROW = Symbol.for('pptx-kit.cell.row');\nexport const CELL_COL = Symbol.for('pptx-kit.cell.col');\n\n/**\n * Opaque handle to a loaded / created presentation. Constructed via\n * `loadPresentation` / `createPresentation`; passed positionally to\n * every fn-API helper.\n */\nexport interface PresentationData {\n readonly [INTERNAL_PACKAGE]: OpcPackage;\n /** @internal — populated lazily by `getSlides`. */\n _slidesCache: unknown[] | null;\n}\n\n/** Data shape backing every `Slide` value. */\nexport interface SlideData {\n readonly [INTERNAL_PACKAGE]: OpcPackage;\n readonly [SLIDE_PART_NAME]: PartName;\n [SLIDE_DOCUMENT]: XmlDocument;\n [SLIDE_PART]: SlidePart;\n [SLIDE_SHAPES]: SlideShapeData[];\n}\n\n/** Data shape backing every `SlideShape` value. */\nexport interface SlideShapeData {\n readonly [SHAPE_SLIDE]: SlideData;\n [SHAPE_ELEMENT]: XmlElement;\n [SHAPE_SNAPSHOT]: SlidePart['shapes'][number];\n}\n\n/** Data shape backing every `SlideLayout` value. */\nexport interface SlideLayoutData {\n readonly [LAYOUT_PART_NAME]: PartName;\n readonly [LAYOUT_PART]: SlideLayoutPart;\n}\n\n/**\n * Opaque handle for one comment on a slide. The `author` is resolved\n * on read against the package-level `commentAuthors.xml`.\n */\nexport interface SlideCommentData {\n readonly [COMMENT_SLIDE]: SlideData;\n readonly [COMMENT_SNAPSHOT]: SlideComment;\n readonly author: CommentAuthor;\n}\n\n/**\n * Opaque handle for one cell of a table graphic-frame shape. Carries\n * its zero-based row/column position plus the parent table shape so\n * mutations can commit back through the standard slide path.\n */\nexport interface TableCellData {\n readonly [CELL_TABLE]: SlideShapeData;\n readonly [CELL_ELEMENT]: XmlElement;\n readonly [CELL_ROW]: number;\n readonly [CELL_COL]: number;\n}\n","// Presentation I/O: load, save, and create.\n\nimport { type BlankDeckAspect, OpcPackage, buildBlankDeck } from '../../internal/parts/index.ts';\nimport { INTERNAL_PACKAGE, type PresentationData } from '../_internal-symbols.ts';\n\n/**\n * Anything that can be turned into a `Uint8Array` of PPTX bytes:\n *\n * - `Uint8Array` — used as-is.\n * - `ArrayBuffer` — wrapped without copying.\n * - `Blob` or `File` — read via `arrayBuffer()`.\n */\nexport type PresentationInput = Uint8Array | ArrayBuffer | Blob;\n\nconst normalize = async (input: PresentationInput): Promise<Uint8Array> => {\n if (input instanceof Uint8Array) return input;\n if (input instanceof ArrayBuffer) return new Uint8Array(input);\n if (typeof Blob !== 'undefined' && input instanceof Blob) {\n return new Uint8Array(await input.arrayBuffer());\n }\n throw new TypeError('loadPresentation: expected Uint8Array | ArrayBuffer | Blob');\n};\n\n/**\n * Loads an existing `.pptx` and returns a `PresentationData` value.\n */\nexport const loadPresentation = async (input: PresentationInput): Promise<PresentationData> => {\n const bytes = await normalize(input);\n const pkg = OpcPackage.load(bytes);\n return { [INTERNAL_PACKAGE]: pkg, _slidesCache: null };\n};\n\n/** Slide-canvas aspect ratio for {@link createPresentation}. */\nexport type PresentationSize = '16:9' | '4:3';\n\n/**\n * Creates a fresh, immediately-authorable `PresentationData`.\n *\n * The returned deck carries a slide master, the Office theme, and three\n * slide layouts — `'Blank'`, `'Title Slide'`, and `'Title and Content'` —\n * but no slides yet. Add one with {@link addSlide} (or the\n * `addBlankSlide` / `addTitleSlide` / `addContentSlide` helpers), then\n * `savePresentation` to emit a `.pptx` that opens cleanly in PowerPoint,\n * Keynote, Google Slides, and LibreOffice.\n *\n * @param options.size Slide aspect ratio. `'16:9'` (12192000×6858000 EMU,\n * PowerPoint's modern default) or `'4:3'` (9144000×6858000). Defaults to\n * `'16:9'`.\n */\nexport const createPresentation = (options: { size?: PresentationSize } = {}): PresentationData => {\n const aspect: BlankDeckAspect = options.size ?? '16:9';\n const pkg = buildBlankDeck(aspect);\n return { [INTERNAL_PACKAGE]: pkg, _slidesCache: null };\n};\n\n/**\n * Serializes a presentation back to PPTX bytes.\n */\nexport const savePresentation = (pres: PresentationData): Promise<Uint8Array> => {\n return Promise.resolve(pres[INTERNAL_PACKAGE].save());\n};\n","// Relationship type URIs used inside PPTX packages. Subset of what\n// ECMA-376 Part 1 §13.2 documents, limited to types we model directly.\n//\n// All values are exactly what PowerPoint emits. Matching them character-for-\n// character matters: some PPTX consumers compare by string rather than by\n// semantic equivalence.\n\nconst OFFICE_DOC = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships';\nconst PACKAGE = 'http://schemas.openxmlformats.org/package/2006/relationships';\nconst MS_2010 = 'http://schemas.microsoft.com/office/2010/relationships';\nconst MS_2015 = 'http://schemas.microsoft.com/office/2015/relationships';\n\nexport const REL_TYPES = {\n // Package-root → presentation\n officeDocument: `${OFFICE_DOC}/officeDocument`,\n\n // Core / extended properties\n coreProperties: `${PACKAGE}/metadata/core-properties`,\n extendedProperties: `${OFFICE_DOC}/extended-properties`,\n customProperties: `${OFFICE_DOC}/custom-properties`,\n\n // Presentation → first-class parts\n slideMaster: `${OFFICE_DOC}/slideMaster`,\n notesMaster: `${OFFICE_DOC}/notesMaster`,\n handoutMaster: `${OFFICE_DOC}/handoutMaster`,\n slide: `${OFFICE_DOC}/slide`,\n presProps: `${OFFICE_DOC}/presProps`,\n viewProps: `${OFFICE_DOC}/viewProps`,\n theme: `${OFFICE_DOC}/theme`,\n tableStyles: `${OFFICE_DOC}/tableStyles`,\n customXmlProps: `${OFFICE_DOC}/customXmlProps`,\n customXml: `${OFFICE_DOC}/customXml`,\n thumbnail: `${PACKAGE}/metadata/thumbnail`,\n\n // SlideMaster / SlideLayout / Slide → siblings\n slideLayout: `${OFFICE_DOC}/slideLayout`,\n notesSlide: `${OFFICE_DOC}/notesSlide`,\n\n // Within a slide\n hyperlink: `${OFFICE_DOC}/hyperlink`,\n image: `${OFFICE_DOC}/image`,\n chart: `${OFFICE_DOC}/chart`,\n oleObject: `${OFFICE_DOC}/oleObject`,\n package: `${OFFICE_DOC}/package`,\n diagramData: `${OFFICE_DOC}/diagramData`,\n diagramLayout: `${OFFICE_DOC}/diagramLayout`,\n diagramQuickStyle: `${OFFICE_DOC}/diagramQuickStyle`,\n diagramColors: `${OFFICE_DOC}/diagramColors`,\n media: `${MS_2010}/media`,\n video: `${MS_2010}/video`,\n audio: `${MS_2010}/audio`,\n font: `${MS_2010}/font`,\n\n // Authors list for modern comments\n authors: `${MS_2015}/authors`,\n // Modern comments per slide\n modernComment: `${MS_2015}/comments`,\n\n // Legacy comments — universally supported by every PPTX consumer.\n // Authors list lives at /ppt/commentAuthors.xml (one per package);\n // per-slide comments at /ppt/comments/comment{N}.xml.\n comments: `${OFFICE_DOC}/comments`,\n commentAuthors: `${OFFICE_DOC}/commentAuthors`,\n} as const;\n\nexport type RelType = (typeof REL_TYPES)[keyof typeof REL_TYPES];\n","// Read-only view over `/ppt/presentation.xml`.\n//\n// ECMA-376 Part 1 §19.2.1.26 defines the root `p:presentation` element:\n//\n// <p:presentation xmlns:p=\"...\">\n// <p:sldMasterIdLst><p:sldMasterId id=\"...\" r:id=\"rId1\"/>...</p:sldMasterIdLst>\n// <p:sldIdLst><p:sldId id=\"256\" r:id=\"rId2\"/>...</p:sldIdLst>\n// <p:notesMasterIdLst><p:notesMasterId r:id=\"...\"/></p:notesMasterIdLst>\n// <p:sldSz cx=\"9144000\" cy=\"6858000\" type=\"screen4x3\"/>\n// <p:notesSz cx=\"...\" cy=\"...\"/>\n// <p:defaultTextStyle>...</p:defaultTextStyle>\n// </p:presentation>\n//\n// We only model the structural list elements at this phase. Default text\n// style cascade is the subject of P3+ — too much surface area to bake in\n// before the drawingml layer is ready.\n\nimport {\n type XmlElement,\n NS,\n allChildElements,\n firstChildElement,\n getAttrValue,\n qname,\n} from '../xml/index.ts';\n\nexport interface SlideMasterId {\n /** Allocated id, ≥2147483648 per ECMA-376 §19.2.1.36. */\n readonly id: number;\n /** Relationship id pointing at the slideMaster part. */\n readonly rId: string;\n}\n\nexport interface SlideId {\n /** Allocated id, in [256, 2³¹-1024] per the spec + PowerPoint quirk. */\n readonly id: number;\n /** Relationship id pointing at the slide part. */\n readonly rId: string;\n}\n\nexport interface NotesMasterId {\n readonly rId: string;\n}\n\nexport interface SlideSize {\n /** Width in EMU. */\n readonly cx: number;\n /** Height in EMU. */\n readonly cy: number;\n /**\n * Aspect-ratio hint. PowerPoint emits one of the standard tokens —\n * `screen4x3`, `screen16x9`, `letter`, `A4`, `custom`, etc. — but the\n * value is informational; the actual size is `cx`/`cy`.\n */\n readonly type?: string;\n}\n\nexport interface PresentationPart {\n readonly slideMasters: ReadonlyArray<SlideMasterId>;\n readonly slides: ReadonlyArray<SlideId>;\n readonly notesMaster: NotesMasterId | null;\n readonly slideSize: SlideSize | null;\n readonly notesSize: SlideSize | null;\n}\n\nconst NAME_PRESENTATION = qname('p', 'presentation', NS.pml);\nconst NAME_SLD_MASTER_ID_LST = qname('p', 'sldMasterIdLst', NS.pml);\nconst NAME_SLD_MASTER_ID = qname('p', 'sldMasterId', NS.pml);\nconst NAME_SLD_ID_LST = qname('p', 'sldIdLst', NS.pml);\nconst NAME_SLD_ID = qname('p', 'sldId', NS.pml);\nconst NAME_NOTES_MASTER_ID_LST = qname('p', 'notesMasterIdLst', NS.pml);\nconst NAME_NOTES_MASTER_ID = qname('p', 'notesMasterId', NS.pml);\nconst NAME_SLD_SZ = qname('p', 'sldSz', NS.pml);\nconst NAME_NOTES_SZ = qname('p', 'notesSz', NS.pml);\nconst ATTR_ID = qname('', 'id', '');\nconst ATTR_R_ID = qname('r', 'id', NS.officeDocRels);\nconst ATTR_CX = qname('', 'cx', '');\nconst ATTR_CY = qname('', 'cy', '');\nconst ATTR_TYPE = qname('', 'type', '');\n\nconst requireRId = (element: XmlElement, context: string): string => {\n const value = getAttrValue(element, ATTR_R_ID);\n if (value === null) {\n throw new Error(`${context}: missing r:id attribute`);\n }\n return value;\n};\n\nconst readSize = (parent: XmlElement, name: typeof NAME_SLD_SZ): SlideSize | null => {\n const el = firstChildElement(parent, name);\n if (el === null) return null;\n const cxRaw = getAttrValue(el, ATTR_CX);\n const cyRaw = getAttrValue(el, ATTR_CY);\n if (cxRaw === null || cyRaw === null) {\n throw new Error(`<${name.localName}>: missing cx/cy attribute`);\n }\n const type = getAttrValue(el, ATTR_TYPE);\n return {\n cx: Number.parseInt(cxRaw, 10),\n cy: Number.parseInt(cyRaw, 10),\n ...(type !== null ? { type } : {}),\n };\n};\n\n/**\n * Parses a `p:presentation` root element into the typed view above. Throws\n * if the root is not `p:presentation` in the PresentationML namespace.\n */\nexport const readPresentationPart = (root: XmlElement): PresentationPart => {\n if (\n root.name.namespaceURI !== NAME_PRESENTATION.namespaceURI ||\n root.name.localName !== 'presentation'\n ) {\n throw new Error(`expected <p:presentation>, got <${root.name.prefix}:${root.name.localName}>`);\n }\n\n const sldMasters: SlideMasterId[] = [];\n const sldMasterLst = firstChildElement(root, NAME_SLD_MASTER_ID_LST);\n if (sldMasterLst !== null) {\n for (const item of allChildElements(sldMasterLst, NAME_SLD_MASTER_ID)) {\n const idRaw = getAttrValue(item, ATTR_ID);\n if (idRaw === null) {\n throw new Error('<p:sldMasterId>: missing id attribute');\n }\n sldMasters.push({\n id: Number.parseInt(idRaw, 10),\n rId: requireRId(item, '<p:sldMasterId>'),\n });\n }\n }\n\n const slides: SlideId[] = [];\n const sldLst = firstChildElement(root, NAME_SLD_ID_LST);\n if (sldLst !== null) {\n for (const item of allChildElements(sldLst, NAME_SLD_ID)) {\n const idRaw = getAttrValue(item, ATTR_ID);\n if (idRaw === null) {\n throw new Error('<p:sldId>: missing id attribute');\n }\n slides.push({\n id: Number.parseInt(idRaw, 10),\n rId: requireRId(item, '<p:sldId>'),\n });\n }\n }\n\n let notesMaster: NotesMasterId | null = null;\n const notesMasterLst = firstChildElement(root, NAME_NOTES_MASTER_ID_LST);\n if (notesMasterLst !== null) {\n const item = firstChildElement(notesMasterLst, NAME_NOTES_MASTER_ID);\n if (item !== null) {\n notesMaster = { rId: requireRId(item, '<p:notesMasterId>') };\n }\n }\n\n return {\n slideMasters: sldMasters,\n slides,\n notesMaster,\n slideSize: readSize(root, NAME_SLD_SZ),\n notesSize: readSize(root, NAME_NOTES_SZ),\n };\n};\n","// Minimal read-only access to `a:txBody` text content.\n//\n// ECMA-376 Part 1 §21.1.2.2 defines text bodies as a sequence of paragraphs:\n//\n// <a:txBody>\n// <a:bodyPr .../> (formatting properties — not modeled here)\n// <a:lstStyle .../> (list styles — not modeled here)\n// <a:p> (paragraph)\n// <a:pPr/> (paragraph properties — not modeled here)\n// <a:r> (run)\n// <a:rPr/> (run properties — not modeled here)\n// <a:t>...</a:t> (literal text)\n// </a:r>\n// <a:fld/> (field — text generated at render time)\n// <a:br/> (line break)\n// </a:p>\n// </a:txBody>\n//\n// At this phase we only need text extraction. Authoring and formatting\n// cascade resolution land later, when DrawingML grows real width.\n\nimport { NS, allChildElements, qname, textContent } from '../xml/index.ts';\nimport type { XmlElement } from '../xml/index.ts';\n\nconst NAME_P = qname('a', 'p', NS.dml);\nconst NAME_R = qname('a', 'r', NS.dml);\nconst NAME_T = qname('a', 't', NS.dml);\n\n/**\n * Returns the visible text of a single paragraph (`a:p`). Concatenates all\n * `a:t` runs and field results in document order; treats `a:br` as a\n * newline within the paragraph.\n */\nexport const paragraphText = (paragraph: XmlElement): string => {\n let out = '';\n for (const child of paragraph.children) {\n if (child.kind !== 'element') continue;\n if (child.name.namespaceURI !== NS.dml) continue;\n switch (child.name.localName) {\n case 'r':\n case 'fld': {\n const t = allChildElements(child, NAME_T)[0];\n if (t) out += textContent(t);\n break;\n }\n case 'br':\n out += '\\n';\n break;\n default:\n // a:rPr, a:pPr, other formatting elements — ignored for text.\n break;\n }\n }\n return out;\n};\n\n/**\n * Returns the visible text of an `a:txBody` element, joining each\n * paragraph with `\\n`. Empty paragraphs become empty lines, so a body of\n * three paragraphs always produces two newlines.\n */\nexport const textBodyText = (txBody: XmlElement): string => {\n const parts: string[] = [];\n for (const p of allChildElements(txBody, NAME_P)) {\n parts.push(paragraphText(p));\n }\n return parts.join('\\n');\n};\n\n/** Iterates over each paragraph (`a:p`) element inside `a:txBody`. */\nexport const paragraphsOf = (txBody: XmlElement): ReadonlyArray<XmlElement> =>\n allChildElements(txBody, NAME_P);\n\n/** Iterates over each run (`a:r`) element inside an `a:p` element. */\nexport const runsOf = (paragraph: XmlElement): ReadonlyArray<XmlElement> =>\n allChildElements(paragraph, NAME_R);\n","// Mutating helpers for `a:txBody`. Companion to `text-body.ts`, which is\n// read-only.\n//\n// Why a separate file: the read-only path is hot (called on every slide\n// load), the mutation path runs only when the user calls a `set*` method.\n// Keeping them separate keeps `text-body.ts` small and clearly side-effect-\n// free.\n\nimport {\n NS,\n type XmlAttr,\n type XmlElement,\n type XmlNode,\n attr,\n elem,\n firstChildElement,\n qname,\n text,\n walkElements,\n} from '../xml/index.ts';\n\nconst NAME_BU_CHAR = qname('a', 'buChar', NS.dml);\nconst NAME_BU_AUTO_NUM = qname('a', 'buAutoNum', NS.dml);\nconst NAME_BU_NONE = qname('a', 'buNone', NS.dml);\nconst NAME_BU_FONT = qname('a', 'buFont', NS.dml);\nconst ATTR_CHAR = qname('', 'char', '');\nconst ATTR_BU_TYPE = qname('', 'type', '');\nconst ATTR_START_AT = qname('', 'startAt', '');\nconst ATTR_TYPEFACE = qname('', 'typeface', '');\n\nconst NAME_P = qname('a', 'p', NS.dml);\nconst NAME_R = qname('a', 'r', NS.dml);\nconst NAME_T = qname('a', 't', NS.dml);\nconst NAME_RPR = qname('a', 'rPr', NS.dml);\nconst NAME_PPR = qname('a', 'pPr', NS.dml);\nconst ATTR_XML_SPACE = qname('xml', 'space', NS.xml);\n\nconst cloneAttrs = (attrs: ReadonlyArray<XmlAttr>): XmlAttr[] =>\n attrs.map((a) => attr(a.name, a.value));\n\nconst cloneElement = (e: XmlElement): XmlElement =>\n elem(e.name, {\n attrs: cloneAttrs(e.attrs),\n prefixDecls: new Map(e.prefixDecls),\n children: e.children.map(cloneNode),\n });\n\nconst cloneNode = (n: XmlNode): XmlNode => {\n switch (n.kind) {\n case 'element':\n return cloneElement(n);\n case 'text':\n return { kind: 'text', data: n.data };\n case 'cdata':\n return { kind: 'cdata', data: n.data };\n case 'comment':\n return { kind: 'comment', data: n.data };\n case 'pi':\n return { kind: 'pi', target: n.target, data: n.data };\n }\n};\n\n/**\n * Returns the first `a:rPr` reachable on the first run of the first paragraph\n * inside `txBody`. Used to preserve formatting on text replacement: we clone\n * the original rPr into the new run so font, color, size, etc. survive.\n */\nconst findFirstRunProperties = (txBody: XmlElement): XmlElement | null => {\n const firstP = firstChildElement(txBody, NAME_P);\n if (firstP === null) return null;\n const firstR = firstChildElement(firstP, NAME_R);\n if (firstR === null) return null;\n return firstChildElement(firstR, NAME_RPR);\n};\n\n/**\n * Returns the first `a:pPr` from the first paragraph. Used to preserve\n * paragraph-level formatting (alignment, bullet, indent) when replacing.\n */\nconst findFirstParagraphProperties = (txBody: XmlElement): XmlElement | null => {\n const firstP = firstChildElement(txBody, NAME_P);\n if (firstP === null) return null;\n return firstChildElement(firstP, NAME_PPR);\n};\n\nconst removeAllParagraphs = (txBody: XmlElement): void => {\n txBody.children = txBody.children.filter(\n (c) => !(c.kind === 'element' && c.name.namespaceURI === NS.dml && c.name.localName === 'p'),\n );\n};\n\n// Token pattern: `{{key}}` where `key` matches any non-brace characters.\n// This is the same syntax docxtemplater / Handlebars use, and it survives\n// XML escaping cleanly since `{` and `}` are not XML metacharacters.\nconst TOKEN_PATTERN = /\\{\\{([^{}]+)\\}\\}/g;\n\n/**\n * Replaces `{{key}}` tokens in every `a:t` element under `root` with values\n * from `tokens`. Tokens whose key is not in `tokens` are left untouched.\n *\n * Returns the number of substitutions performed. Useful for callers that\n * want to know whether anything matched.\n *\n * Limitation: a token must fit entirely within one `<a:t>` element to\n * match. PowerPoint normally serializes contiguous user text as a single\n * `<a:t>`, so the limitation only bites when a placeholder was edited\n * character-by-character (causing PowerPoint to split runs). For those\n * cases, fall back to `setText()`.\n */\nexport const replaceTokensInTree = (root: XmlElement, tokens: Record<string, string>): number => {\n let count = 0;\n walkElements(root, (el) => {\n if (el.name.namespaceURI !== NAME_T.namespaceURI) return;\n if (el.name.localName !== 't') return;\n const child = el.children[0];\n if (!child || child.kind !== 'text') return;\n const before = child.data;\n let didMatch = false;\n const after = before.replace(TOKEN_PATTERN, (match, key: string) => {\n if (Object.hasOwn(tokens, key)) {\n didMatch = true;\n return tokens[key] ?? '';\n }\n return match;\n });\n if (didMatch) {\n child.data = after;\n count++;\n }\n });\n return count;\n};\n\n/**\n * Replaces every occurrence of `from` in every `<a:t>` element under\n * `root` with `to`. `from` may be a string (literal) or a `RegExp`\n * (matched per-run). Returns the count of `<a:t>` elements that were\n * mutated — not the count of substitutions inside them, since callers\n * usually want \"did anything change\" rather than \"how many letters\n * moved.\"\n *\n * Same single-run constraint as `replaceTokensInTree`: matches must\n * fit inside one `<a:t>`. Use this for the broader \"find/replace\n * across the deck\" use case where {{token}} syntax isn't a fit.\n */\nexport const replaceTextInTree = (root: XmlElement, from: string | RegExp, to: string): number => {\n // Build a global RegExp so .replace() touches every occurrence per run.\n const pattern =\n typeof from === 'string'\n ? new RegExp(from.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'g')\n : from.global\n ? from\n : new RegExp(from.source, `${from.flags}g`);\n let count = 0;\n walkElements(root, (el) => {\n if (el.name.namespaceURI !== NAME_T.namespaceURI) return;\n if (el.name.localName !== 't') return;\n const child = el.children[0];\n if (!child || child.kind !== 'text') return;\n const before = child.data;\n const after = before.replace(pattern, to);\n if (after !== before) {\n child.data = after;\n count++;\n }\n });\n return count;\n};\n\n/**\n * Bullet style descriptor for a paragraph.\n *\n * - `'bullet'` — shortcut for `{ char: '•' }`.\n * - `'number'` — shortcut for `{ autoNum: 'arabicPeriod' }` (1., 2., 3.).\n * - `'none'` — emits `<a:buNone/>`, forcing the paragraph to be bullet-free\n * even if the layout has a bullet default.\n * - `{ char }` — custom bullet character (any single grapheme).\n * - `{ autoNum }` — any ECMA-376 `ST_TextAutonumberScheme` token\n * (`arabicPeriod`, `romanLcParenR`, `alphaUcPeriod`, ...).\n */\nexport type BulletStyle = 'bullet' | 'number' | 'none' | { char: string } | { autoNum: string };\n\nconst normalizeBulletStyle = (\n s: BulletStyle,\n): { kind: 'char'; char: string } | { kind: 'autoNum'; type: string } | { kind: 'none' } => {\n if (s === 'bullet') return { kind: 'char', char: '•' };\n if (s === 'number') return { kind: 'autoNum', type: 'arabicPeriod' };\n if (s === 'none') return { kind: 'none' };\n if ('char' in s) return { kind: 'char', char: s.char };\n return { kind: 'autoNum', type: s.autoNum };\n};\n\nconst buildBulletElement = (style: BulletStyle): XmlElement => {\n const n = normalizeBulletStyle(style);\n switch (n.kind) {\n case 'char':\n return elem(NAME_BU_CHAR, { attrs: [attr(ATTR_CHAR, n.char)] });\n case 'autoNum':\n // `startAt=\"1\"` is the default, but PowerPoint and PptxGenJS write it\n // explicitly on an authored numbered list.\n return elem(NAME_BU_AUTO_NUM, {\n attrs: [attr(ATTR_START_AT, '1'), attr(ATTR_BU_TYPE, n.type)],\n });\n case 'none':\n return elem(NAME_BU_NONE);\n }\n};\n\nconst NAME_PPR_FOR_BULLET = qname('a', 'pPr', NS.dml);\nconst NAME_P_FOR_BULLET = qname('a', 'p', NS.dml);\n\n/**\n * Paragraph horizontal alignment per `ST_TextAlignType` (ECMA-376\n * §17.18.59). The library accepts plain-English names and translates to\n * the spec tokens; advanced callers can pass the raw token directly.\n */\nexport type ParagraphAlignment =\n | 'left'\n | 'center'\n | 'right'\n | 'justify'\n | 'distribute'\n | 'l'\n | 'ctr'\n | 'r'\n | 'just'\n | 'dist'\n | 'justLow'\n | 'thaiDist';\n\nconst alignToken = (a: ParagraphAlignment): string => {\n switch (a) {\n case 'left':\n case 'l':\n return 'l';\n case 'center':\n case 'ctr':\n return 'ctr';\n case 'right':\n case 'r':\n return 'r';\n case 'justify':\n case 'just':\n return 'just';\n case 'distribute':\n case 'dist':\n return 'dist';\n default:\n return a;\n }\n};\n\nconst ATTR_ALGN = qname('', 'algn', '');\n\n/**\n * Sets `<a:pPr algn=\"...\">` on every paragraph in `txBody`. Existing\n * pPr attributes other than `algn` are preserved.\n */\nexport const applyAlignmentToAllParagraphs = (\n txBody: XmlElement,\n align: ParagraphAlignment,\n): void => {\n const token = alignToken(align);\n for (const p of txBody.children) {\n if (\n p.kind !== 'element' ||\n p.name.namespaceURI !== NAME_P_FOR_BULLET.namespaceURI ||\n p.name.localName !== 'p'\n ) {\n continue;\n }\n let pPr = firstChildElement(p, NAME_PPR_FOR_BULLET);\n if (pPr === null) {\n pPr = elem(NAME_PPR_FOR_BULLET);\n p.children.unshift(pPr);\n }\n pPr.attrs = pPr.attrs.filter((a) => a.name.localName !== 'algn');\n pPr.attrs.push(attr(ATTR_ALGN, token));\n }\n};\n\n/**\n * Sets the bullet style on a single `<a:p>` paragraph. Drops any\n * existing bullet child element (`a:buChar`, `a:buAutoNum`, `a:buNone`)\n * before inserting the new one. Creates `<a:pPr>` if absent.\n */\n// PowerPoint's default hanging indent for a bulleted paragraph, by list level\n// (0-based). These mirror the master `bodyStyle` lvlNpPr defaults, so a bullet\n// authored on a *text box* — which inherits the `otherStyle` (marL=0), not the\n// body style — still gets the standard bullet/text gap instead of the glyph\n// jammed against the text. PptxGenJS and PowerPoint both write these explicitly.\nconst BULLET_INDENT_BY_LEVEL: ReadonlyArray<{ marL: number; indent: number }> = [\n { marL: 342900, indent: -342900 },\n { marL: 742950, indent: -285750 },\n { marL: 1143000, indent: -228600 },\n { marL: 1600200, indent: -228600 },\n { marL: 2057400, indent: -228600 },\n];\nconst bulletIndentForLevel = (lvl: number): { marL: number; indent: number } =>\n BULLET_INDENT_BY_LEVEL[Math.min(lvl, BULLET_INDENT_BY_LEVEL.length - 1)]!;\n\nconst ATTR_MAR_L = qname('', 'marL', '');\nconst ATTR_INDENT = qname('', 'indent', '');\n\nconst hasAttr = (el: XmlElement, local: string): boolean =>\n el.attrs.some((a) => a.name.namespaceURI === '' && a.name.localName === local);\n\nexport const applyBulletToParagraph = (paragraph: XmlElement, style: BulletStyle): void => {\n let pPr = firstChildElement(paragraph, NAME_PPR_FOR_BULLET);\n if (pPr === null) {\n pPr = elem(NAME_PPR_FOR_BULLET);\n // <a:pPr> must be the first child of <a:p>.\n paragraph.children.unshift(pPr);\n }\n // Remove any existing bullet child (and the number font we may have added).\n pPr.children = pPr.children.filter(\n (c) =>\n !(\n c.kind === 'element' &&\n c.name.namespaceURI === NS.dml &&\n (c.name.localName === 'buChar' ||\n c.name.localName === 'buAutoNum' ||\n c.name.localName === 'buNone' ||\n c.name.localName === 'buFont')\n ),\n );\n\n // A visible bullet needs a hanging indent or the glyph overlaps the text.\n // Only fill it in when the caller hasn't set their own marL / indent, and\n // never for `none` (which removes the bullet). marL / indent are pPr\n // ATTRIBUTES, so they must come before the bullet child element.\n if (style !== 'none') {\n const lvl = Number.parseInt(\n pPr.attrs.find((a) => a.name.localName === 'lvl')?.value ?? '0',\n 10,\n );\n const { marL, indent } = bulletIndentForLevel(Number.isFinite(lvl) ? lvl : 0);\n if (!hasAttr(pPr, 'marL')) pPr.attrs.push(attr(ATTR_MAR_L, String(marL)));\n if (!hasAttr(pPr, 'indent')) pPr.attrs.push(attr(ATTR_INDENT, String(indent)));\n }\n\n // A numbered list needs a bullet font so the number glyph has a face —\n // PowerPoint and PptxGenJS emit `<a:buFont typeface=\"+mj-lt\"/>` (the theme's\n // major font) ahead of `<a:buAutoNum>`. A character bullet carries its glyph\n // directly and needs none. `<a:buFont>` precedes the bullet child per the\n // CT_TextParagraphProperties element order.\n if (normalizeBulletStyle(style).kind === 'autoNum') {\n pPr.children.push(elem(NAME_BU_FONT, { attrs: [attr(ATTR_TYPEFACE, '+mj-lt')] }));\n }\n pPr.children.push(buildBulletElement(style));\n};\n\n/**\n * Sets the bullet style on every paragraph in `txBody`. Drops any\n * existing bullet child element (`a:buChar`, `a:buAutoNum`, `a:buNone`)\n * before inserting the new one. Creates `<a:pPr>` if absent.\n */\nexport const applyBulletToAllParagraphs = (txBody: XmlElement, style: BulletStyle): void => {\n for (const p of txBody.children) {\n if (\n p.kind !== 'element' ||\n p.name.namespaceURI !== NAME_P_FOR_BULLET.namespaceURI ||\n p.name.localName !== 'p'\n ) {\n continue;\n }\n applyBulletToParagraph(p, style);\n }\n};\n\n/**\n * Replaces the entire visible text of a `txBody` element with `value`.\n * Newlines in `value` start a new paragraph.\n *\n * The first existing `a:rPr` (run properties) and `a:pPr` (paragraph\n * properties) are cloned into every new paragraph so that font, color, size,\n * alignment, and bullet style survive the replacement. If the source had\n * mixed formatting per run, that gets collapsed into the first-run formatting\n * across the entire new text — matching what PowerPoint does when you select\n * all and type.\n *\n * The `bodyPr` and `lstStyle` children (if any) are preserved untouched.\n */\nexport const setTextBody = (txBody: XmlElement, value: string): void => {\n const rPrTemplate = findFirstRunProperties(txBody);\n const pPrTemplate = findFirstParagraphProperties(txBody);\n\n removeAllParagraphs(txBody);\n\n const lines = value.split('\\n');\n for (const line of lines) {\n // Per the strict ECMA schema, `<a:t>` does NOT accept `xml:space`. We\n // split on `\\n` so each `<a:t>` holds a single line and leading /\n // trailing whitespace is handled by the body / lst style, not by an\n // illegal attribute on the text element.\n const t = elem(NAME_T, {\n children: line.length > 0 ? [text(line)] : [],\n });\n const r = elem(NAME_R, {\n children: rPrTemplate !== null ? [cloneElement(rPrTemplate), t] : [t],\n });\n const p = elem(NAME_P, {\n children: pPrTemplate !== null ? [cloneElement(pPrTemplate), r] : [r],\n });\n txBody.children.push(p);\n }\n void ATTR_XML_SPACE;\n};\n","// ECMA-376 simple-type numeric/string bounds, enforced at the authoring boundary.\n//\n// A recurring defect class in a typed OOXML writer: a caller-supplied number is\n// rounded and serialized straight into a constrained attribute (a coordinate, a\n// line width, a font size, a duration, a percentage, an angle), and a value\n// outside the schema's range produces a `.pptx` that PowerPoint marks corrupt\n// and \"repairs\". Authoring input is an external boundary (per the project's\n// defensive-programming rule: validate at boundaries, trust internally), so the\n// value is checked HERE, once, before it reaches the wire. An out-of-range value\n// is a caller error and throws `RangeError` naming the field and the allowed\n// range — it is never silently clamped (that would hide the mistake) nor emitted.\n//\n// Leaf module: no imports, so any layer (drawingml / presentationml / chartml)\n// may use it. The ranges below are transcribed from the ECMA-376 XSDs; the\n// comment on each names the simple type so the next reader can verify it.\n\nconst RANGES = {\n coordinate: [-27273042329600, 27273042316900], // ST_Coordinate (EMU, xsd:long)\n positiveCoordinate: [0, 27273042316900], // ST_PositiveCoordinate\n coordinate32: [-2147483648, 2147483647], // ST_Coordinate32 (xsd:int)\n positiveCoordinate32: [0, 2147483647], // ST_PositiveCoordinate32\n lineWidth: [0, 20116800], // ST_LineWidth\n angle: [-2147483648, 2147483647], // ST_Angle (1/60000 degree, xsd:int)\n fontSize: [100, 400000], // ST_TextFontSize (1/100 pt → 1..4000 pt)\n textPoint: [-400000, 400000], // ST_TextPoint (1/100 pt)\n textSpacingPoint: [0, 158400], // ST_TextSpacingPoint (1/100 pt)\n unsignedInt: [0, 4294967295], // xsd:unsignedInt (advTm; ST_TLTime numeric form)\n columnCount: [1, 16], // ST_TextColumnCount\n overlap: [-100, 100], // ST_OverlapByte (bar/column overlap %)\n // ST_GapAmount unions ST_GapAmountPercent and ST_GapAmountUShort; both cap at\n // 500 (we emit the numeric/UShort form). The earlier 65535 was the raw\n // xsd:unsignedShort domain, not the schema's maxInclusive — values 501..65535\n // serialized to a `<c:gapWidth>` PowerPoint rejects.\n gapAmount: [0, 500], // ST_GapAmountUShort (bar/column gap width %)\n holeSize: [1, 90], // ST_HoleSizeUByte (doughnut hole %)\n firstSliceAng: [0, 360], // ST_FirstSliceAng (pie/doughnut start angle, degrees)\n} as const;\n\ntype RangeKey = keyof typeof RANGES;\n\n// Validates `value` as an integer in the named ECMA-376 range, returning the\n// rounded integer. Non-finite or out-of-range input throws.\nexport const boundedInt = (value: number, key: RangeKey, field: string): number => {\n if (!Number.isFinite(value)) {\n throw new RangeError(`${field}: expected a finite number, got ${value}`);\n }\n const n = Math.round(value);\n const [min, max] = RANGES[key];\n if (n < min || n > max) {\n throw new RangeError(`${field}: ${value} is out of range for ${key} (${min}..${max})`);\n }\n return n;\n};\n\n/** EMU position coordinate (`<a:off>` x/y) — ST_Coordinate. */\nexport const emuCoordinate = (v: number, field: string): number =>\n boundedInt(v, 'coordinate', field);\n/** EMU extent (`<a:ext>` cx/cy, column/table widths, row heights) — ST_PositiveCoordinate. */\nexport const emuExtent = (v: number, field: string): number =>\n boundedInt(v, 'positiveCoordinate', field);\n/** 32-bit EMU (text-body insets, cell margins) — ST_Coordinate32. */\nexport const emuCoordinate32 = (v: number, field: string): number =>\n boundedInt(v, 'coordinate32', field);\n/** Non-negative 32-bit EMU (column gap) — ST_PositiveCoordinate32. */\nexport const emuPositiveCoordinate32 = (v: number, field: string): number =>\n boundedInt(v, 'positiveCoordinate32', field);\n/** Line width in EMU — ST_LineWidth. */\nexport const lineWidthEmu = (v: number, field: string): number => boundedInt(v, 'lineWidth', field);\n/** Angle in 1/60000 degree — ST_Angle. */\nexport const angle60000 = (v: number, field: string): number => boundedInt(v, 'angle', field);\n/** Font size in 1/100 pt — ST_TextFontSize. */\nexport const fontSizeHundredthPt = (v: number, field: string): number =>\n boundedInt(v, 'fontSize', field);\n/** Character spacing in 1/100 pt — ST_TextPoint. */\nexport const textPointSpacing = (v: number, field: string): number =>\n boundedInt(v, 'textPoint', field);\n/** Paragraph spacing in 1/100 pt — ST_TextSpacingPoint. */\nexport const textSpacingPoint = (v: number, field: string): number =>\n boundedInt(v, 'textSpacingPoint', field);\n/** Auto-advance / timing duration in ms — xsd:unsignedInt. */\nexport const unsignedIntMs = (v: number, field: string): number =>\n boundedInt(v, 'unsignedInt', field);\n/** Text column count — ST_TextColumnCount (1..16). */\nexport const textColumnCount = (v: number, field: string): number =>\n boundedInt(v, 'columnCount', field);\n/** Bar/column series overlap percent — ST_OverlapByte (-100..100). */\nexport const overlapPercent = (v: number, field: string): number => boundedInt(v, 'overlap', field);\n/** Bar/column gap width percent — ST_GapAmount (0..500). */\nexport const gapAmountPercent = (v: number, field: string): number =>\n boundedInt(v, 'gapAmount', field);\n/** Doughnut hole size percent — ST_HoleSizeUByte (1..90). */\nexport const holeSizePercent = (v: number, field: string): number =>\n boundedInt(v, 'holeSize', field);\n/** Pie/doughnut first-slice angle in degrees — ST_FirstSliceAng (0..360). */\nexport const firstSliceAngle = (v: number, field: string): number =>\n boundedInt(v, 'firstSliceAng', field);\n\n// ST_Guid requires UPPERCASE hex inside braces. PowerPoint emits uppercase, and\n// `crypto.randomUUID()` yields lowercase, so we accept either case and normalize\n// to upper rather than rejecting a perfectly good GUID over case alone. A value\n// that is not GUID-shaped at all is a caller error and throws.\nconst GUID_RE = /^\\{[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\\}$/;\nexport const normalizeGuid = (value: string, field: string): string => {\n if (!GUID_RE.test(value)) {\n throw new RangeError(\n `${field}: ${JSON.stringify(value)} is not a GUID of the form {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}`,\n );\n }\n return value.toUpperCase();\n};\n\n// Generic enum-membership guard for attributes whose XSD type is an enumeration\n// (e.g. a pattern preset, a transition effect element name). Returns the value\n// narrowed to the allowed set, or throws naming the field and the legal tokens.\nexport const oneOf = <T extends string>(value: string, allowed: readonly T[], field: string): T => {\n if (!(allowed as readonly string[]).includes(value)) {\n throw new RangeError(`${field}: ${JSON.stringify(value)} is not one of: ${allowed.join(', ')}`);\n }\n return value as T;\n};\n","// Shared color parsing for the authoring APIs.\n//\n// Accepts the three forms PowerPoint emits: srgb hex (`#RRGGBB`,\n// `RRGGBB`), scheme tokens (`tx1`, `accent1`... — bare or `scheme:`-prefixed),\n// and an explicit `null` to indicate \"clear / no fill\". Anything else throws so\n// callers don't silently emit `<a:srgbClr val=\"undefined\"/>`.\n\nimport { type XmlElement, NS, attr, elem, qname } from '../xml/index.ts';\n\nconst NAME_SRGB_CLR = qname('a', 'srgbClr', NS.dml);\nconst NAME_SCHEME_CLR = qname('a', 'schemeClr', NS.dml);\nconst ATTR_VAL = qname('', 'val', '');\n\nconst SCHEME_TOKENS = new Set([\n 'bg1',\n 'tx1',\n 'bg2',\n 'tx2',\n 'accent1',\n 'accent2',\n 'accent3',\n 'accent4',\n 'accent5',\n 'accent6',\n 'hlink',\n 'folHlink',\n 'phClr',\n 'lt1',\n 'dk1',\n 'lt2',\n 'dk2',\n]);\n\nexport type ParsedColor = { kind: 'srgb'; hex: string } | { kind: 'scheme'; token: string };\n\n/**\n * Normalizes an sRGB hex string to the canonical uppercase 6-digit form\n * (no `#`), or returns `null` if it isn't a 3- or 6-digit hex. The CSS-style\n * 3-digit shorthand (`#f00` → `FF0000`) is accepted because LLM authors reach\n * for it constantly; 4-/8-digit (alpha) forms are rejected rather than\n * silently dropping the alpha channel, which OOXML encodes separately.\n */\nconst normalizeSrgbHex = (value: string): string | null => {\n const hex = value.startsWith('#') ? value.slice(1) : value;\n if (/^[0-9A-Fa-f]{6}$/.test(hex)) return hex.toUpperCase();\n if (/^[0-9A-Fa-f]{3}$/.test(hex)) {\n return Array.from(hex, (ch) => ch + ch)\n .join('')\n .toUpperCase();\n }\n return null;\n};\n\n/**\n * Parses a user-supplied color string. Returns null on unrecognized input\n * so callers can decide whether to throw with a specific message.\n *\n * Scheme tokens are accepted both bare (`accent1`) and with the explicit\n * `scheme:` prefix (`scheme:accent1`). The prefixed form is what the getters\n * (`getShapeFillColor`, `getSlideBackground`, …) return, so accepting it here\n * is what makes `setX(getX(...))` round-trip instead of throwing.\n */\nexport const parseColor = (value: string): ParsedColor | null => {\n const token = value.startsWith('scheme:') ? value.slice('scheme:'.length) : value;\n if (SCHEME_TOKENS.has(token)) return { kind: 'scheme', token };\n // A `scheme:`-prefixed value is unambiguously a scheme reference; an unknown\n // token there is an error, not a hex fallthrough.\n if (value !== token) return null;\n const hex = normalizeSrgbHex(value);\n return hex === null ? null : { kind: 'srgb', hex };\n};\n\n/**\n * Parses an sRGB hex color (`#RRGGBB`, `RRGGBB`, or the 3-digit `#RGB`\n * shorthand), returning the normalized uppercase 6-digit hex (no `#`).\n * Returns `null` for anything else — including scheme tokens, which sRGB-only\n * contexts (e.g. chart series fills) must reject rather than silently\n * emit as an invalid `<a:srgbClr val=\"accent1\"/>`.\n */\nexport const parseSrgbHex = (value: string): string | null => normalizeSrgbHex(value);\n\n/**\n * Returns the `<a:srgbClr>` or `<a:schemeClr>` element for `value`.\n * Throws on unrecognized colors.\n */\nexport const buildColorElement = (value: string): XmlElement => {\n const parsed = parseColor(value);\n if (parsed === null) throw new Error(`unrecognized color: ${value}`);\n return parsed.kind === 'srgb'\n ? elem(NAME_SRGB_CLR, { attrs: [attr(ATTR_VAL, parsed.hex)] })\n : elem(NAME_SCHEME_CLR, { attrs: [attr(ATTR_VAL, parsed.token)] });\n};\n","// Run-property authoring for `<a:r><a:rPr>...</a:rPr></a:r>`.\n//\n// The ECMA-376 surface for `CT_TextCharacterProperties` (§17.18.83) is\n// huge. We expose the subset that 90% of authoring scripts reach for:\n// font face, size, color, bold, italic, underline.\n//\n// Sizes are pt and accept fractions; serialized as hundredths of a point\n// per the schema (`sz=\"2400\"` = 24pt). Colors accept any of:\n//\n// - `#RRGGBB` / `RRGGBB` for srgb\n// - `'tx1' | 'tx2' | 'bg1' | 'bg2' | 'accent1'…'accent6'` for theme\n// - `'transparent' | null` to clear\n//\n// Mutation strategy: walk the `txBody`, ensure each `a:r` has an `a:rPr`,\n// then set the relevant attributes / child elements. Existing properties\n// not addressed by the format object are preserved.\n\nimport {\n NS,\n type XmlAttr,\n type XmlElement,\n attr,\n elem,\n firstChildElement,\n insertChildByRank,\n qname,\n} from '../xml/index.ts';\nimport { fontSizeHundredthPt, textPointSpacing } from '../bounds.ts';\nimport { parseColor } from './color.ts';\n\nconst NAME_R = qname('a', 'r', NS.dml);\nconst NAME_RPR = qname('a', 'rPr', NS.dml);\nconst NAME_LATIN = qname('a', 'latin', NS.dml);\nconst NAME_EA = qname('a', 'ea', NS.dml);\nconst NAME_CS = qname('a', 'cs', NS.dml);\nconst NAME_SOLID_FILL = qname('a', 'solidFill', NS.dml);\nconst NAME_SRGB_CLR = qname('a', 'srgbClr', NS.dml);\nconst NAME_SCHEME_CLR = qname('a', 'schemeClr', NS.dml);\nconst ATTR_SZ = qname('', 'sz', '');\nconst ATTR_B = qname('', 'b', '');\nconst ATTR_I = qname('', 'i', '');\nconst ATTR_U = qname('', 'u', '');\nconst ATTR_STRIKE = qname('', 'strike', '');\nconst ATTR_SPC = qname('', 'spc', '');\nconst ATTR_KERN = qname('', 'kern', '');\nconst ATTR_BASELINE = qname('', 'baseline', '');\nconst ATTR_CAP = qname('', 'cap', '');\nconst ATTR_TYPEFACE = qname('', 'typeface', '');\nconst ATTR_VAL = qname('', 'val', '');\nconst NAME_HIGHLIGHT = qname('a', 'highlight', NS.dml);\n\n// CT_TextCharacterProperties (a:rPr) is an xsd:sequence: children must appear\n// in this order or the run fails dml/pml schema validation. Setters strip the\n// existing element then re-insert at the mandated slot via insertChildByRank.\nconst RPR_CHILD_RANK: Record<string, number> = {\n ln: 0,\n noFill: 1,\n solidFill: 1,\n gradFill: 1,\n blipFill: 1,\n pattFill: 1,\n grpFill: 1,\n effectLst: 2,\n effectDag: 2,\n highlight: 3,\n uLnTx: 4,\n uLn: 4,\n uFillTx: 5,\n uFill: 5,\n latin: 6,\n ea: 7,\n cs: 8,\n sym: 9,\n hlinkClick: 10,\n hlinkMouseOver: 11,\n rtl: 12,\n extLst: 13,\n};\nconst rprChildRank = (el: XmlElement): number =>\n el.name.namespaceURI === NS.dml ? (RPR_CHILD_RANK[el.name.localName] ?? 99) : 99;\n\nexport interface TextFormat {\n /** Latin font family (`Calibri`, `Arial`, ...). Sets `<a:latin>`. */\n font?: string;\n /**\n * East Asian font family (`游明朝`, `メイリオ`, ...). Sets `<a:ea>`.\n * Renderers pick this typeface for CJK glyphs independently of `font`\n * (which only governs Latin glyphs) — set both when a run mixes Latin\n * and CJK text and needs a consistent look across the whole run.\n */\n fontEastAsian?: string;\n /** Font size in points; fractional values allowed (`12`, `12.5`). */\n size?: number;\n /**\n * Color. Accepts `#RRGGBB`, `RRGGBB`, an ECMA-376 scheme color token\n * (`tx1`, `accent1`, ...), or `null` to clear.\n */\n color?: string | null;\n bold?: boolean;\n italic?: boolean;\n /**\n * Underline style. `true` is shorthand for `'sng'` (single). Pass the\n * exact `ST_TextUnderlineType` token for other styles (`'dbl'`, `'wavy'`,\n * `'dash'`, ...).\n */\n underline?: boolean | string;\n /**\n * Strikethrough style. `true` is shorthand for `'sngStrike'` (single\n * line). Pass the exact `ST_TextStrikeType` token (`'sngStrike'`,\n * `'dblStrike'`, `'noStrike'`) for other styles. `false` clears.\n */\n strike?: boolean | string;\n /**\n * Character spacing in 1/100 points (`0` = default). Negative values\n * tighten, positive values loosen. Mirrors `<a:rPr spc=\"…\"/>`.\n */\n spc?: number;\n /**\n * Kerning threshold in 1/100 points (`ST_TextNonNegativePoint`, the same\n * unit as `spc`): `0` disables kerning, `1200` = apply kerning for runs\n * ≥12pt. Mirrors `<a:rPr kern=\"…\"/>`.\n */\n kern?: number;\n /**\n * Baseline offset as a fraction of 1 (`0.3` = superscript ~30% up,\n * `-0.25` = subscript). PowerPoint emits ST_Percentage; this getter\n * returns the unit-fraction form for ergonomic comparisons.\n */\n baseline?: number;\n /**\n * Capitalization mode: `'none'`, `'small'` (smallCaps), or `'all'`\n * (allCaps). Mirrors `<a:rPr cap=\"…\"/>`.\n */\n cap?: 'none' | 'small' | 'all';\n /**\n * Highlight color (cell-fill style background per run). Same color\n * format as `color`. Mirrors `<a:rPr><a:highlight>…</a:highlight></a:rPr>`.\n */\n highlight?: string | null;\n}\n\nconst setOrRemoveAttr = (\n attrs: XmlAttr[],\n name: ReturnType<typeof qname>,\n value: string | null,\n): XmlAttr[] => {\n const filtered = attrs.filter((a) => a.name.localName !== name.localName);\n if (value !== null) filtered.push(attr(name, value));\n return filtered;\n};\n\nconst setSolidFill = (rPr: XmlElement, value: string | null): void => {\n // Remove any existing solidFill first.\n rPr.children = rPr.children.filter(\n (c) =>\n !(c.kind === 'element' && c.name.namespaceURI === NS.dml && c.name.localName === 'solidFill'),\n );\n if (value === null) return;\n const parsed = parseColor(value);\n if (parsed === null) throw new Error(`unrecognized color: ${value}`);\n const inner =\n parsed.kind === 'srgb'\n ? elem(NAME_SRGB_CLR, { attrs: [attr(ATTR_VAL, parsed.hex)] })\n : elem(NAME_SCHEME_CLR, { attrs: [attr(ATTR_VAL, parsed.token)] });\n const fill = elem(NAME_SOLID_FILL, { children: [inner] });\n insertChildByRank(rPr, fill, rprChildRank);\n};\n\nconst setLatin = (rPr: XmlElement, font: string | null): void => {\n rPr.children = rPr.children.filter(\n (c) =>\n !(c.kind === 'element' && c.name.namespaceURI === NS.dml && c.name.localName === 'latin'),\n );\n if (font === null) return;\n insertChildByRank(rPr, elem(NAME_LATIN, { attrs: [attr(ATTR_TYPEFACE, font)] }), rprChildRank);\n};\n\nconst setEastAsian = (rPr: XmlElement, font: string | null): void => {\n rPr.children = rPr.children.filter(\n (c) => !(c.kind === 'element' && c.name.namespaceURI === NS.dml && c.name.localName === 'ea'),\n );\n if (font === null) return;\n insertChildByRank(rPr, elem(NAME_EA, { attrs: [attr(ATTR_TYPEFACE, font)] }), rprChildRank);\n};\n\nconst setHighlight = (rPr: XmlElement, value: string | null): void => {\n rPr.children = rPr.children.filter(\n (c) =>\n !(c.kind === 'element' && c.name.namespaceURI === NS.dml && c.name.localName === 'highlight'),\n );\n if (value === null) return;\n const parsed = parseColor(value);\n if (parsed === null) throw new Error(`unrecognized highlight color: ${value}`);\n const inner =\n parsed.kind === 'srgb'\n ? elem(NAME_SRGB_CLR, { attrs: [attr(ATTR_VAL, parsed.hex)] })\n : elem(NAME_SCHEME_CLR, { attrs: [attr(ATTR_VAL, parsed.token)] });\n insertChildByRank(rPr, elem(NAME_HIGHLIGHT, { children: [inner] }), rprChildRank);\n};\n\n/** Mutates `rPr` in place per `format`. */\nexport const applyRunFormat = (rPr: XmlElement, format: TextFormat): void => {\n let attrs = rPr.attrs;\n if (format.size !== undefined) {\n // Hundredths of a point per the schema (ST_TextFontSize: 1..4000 pt).\n const sz = fontSizeHundredthPt(format.size * 100, 'setShapeRunFormat: size');\n attrs = setOrRemoveAttr(attrs, ATTR_SZ, String(sz));\n }\n if (format.bold !== undefined) {\n attrs = setOrRemoveAttr(attrs, ATTR_B, format.bold ? '1' : '0');\n }\n if (format.italic !== undefined) {\n attrs = setOrRemoveAttr(attrs, ATTR_I, format.italic ? '1' : '0');\n }\n if (format.underline !== undefined) {\n const value =\n format.underline === false ? 'none' : format.underline === true ? 'sng' : format.underline;\n attrs = setOrRemoveAttr(attrs, ATTR_U, value);\n }\n if (format.strike !== undefined) {\n const value =\n format.strike === false ? 'noStrike' : format.strike === true ? 'sngStrike' : format.strike;\n attrs = setOrRemoveAttr(attrs, ATTR_STRIKE, value);\n }\n if (format.spc !== undefined) {\n const spc = textPointSpacing(format.spc, 'setShapeRunFormat: spc');\n attrs = setOrRemoveAttr(attrs, ATTR_SPC, String(spc));\n }\n if (format.kern !== undefined) {\n attrs = setOrRemoveAttr(attrs, ATTR_KERN, String(Math.round(format.kern)));\n }\n if (format.baseline !== undefined) {\n // ST_Percentage; we accept the unit-fraction form on the public API\n // and serialize as the on-the-wire hundredths-of-percent integer.\n const pct = Math.round(format.baseline * 100000);\n attrs = setOrRemoveAttr(attrs, ATTR_BASELINE, String(pct));\n }\n if (format.cap !== undefined) {\n attrs = setOrRemoveAttr(attrs, ATTR_CAP, format.cap);\n }\n rPr.attrs = attrs;\n\n if (format.font !== undefined) setLatin(rPr, format.font);\n if (format.fontEastAsian !== undefined) setEastAsian(rPr, format.fontEastAsian);\n if (format.color !== undefined) setSolidFill(rPr, format.color);\n if (format.highlight !== undefined) setHighlight(rPr, format.highlight);\n\n void NAME_CS;\n};\n\n/**\n * Walks `txBody`, ensuring every `<a:r>` has an `<a:rPr>` carrying the\n * supplied format. Existing run-property attributes not addressed by\n * `format` are preserved.\n */\nexport const applyFormatToAllRuns = (txBody: XmlElement, format: TextFormat): void => {\n // Walk depth-first; runs live two levels deep (txBody > p > r).\n for (const p of txBody.children) {\n if (p.kind !== 'element' || p.name.namespaceURI !== NS.dml || p.name.localName !== 'p') {\n continue;\n }\n for (const r of p.children) {\n if (r.kind !== 'element' || r.name.namespaceURI !== NS.dml || r.name.localName !== 'r') {\n continue;\n }\n let rPr = firstChildElement(r, NAME_RPR);\n if (rPr === null) {\n rPr = elem(NAME_RPR);\n // rPr must be the first child of the run per the schema.\n r.children.unshift(rPr);\n }\n applyRunFormat(rPr, format);\n }\n }\n // Force-touch a NAME_R reference so it isn't elided as unused.\n void NAME_R;\n};\n","// Solid-fill mutation for shapes and slide backgrounds.\n//\n// The spec places the fill element after geometry (`prstGeom`/`custGeom`)\n// and before the line (`a:ln`) on a shape's `<p:spPr>`. We re-insert\n// rather than append so re-applying a fill stays clean across calls.\n//\n// `setSolidFill(host, color)` accepts the host element that wraps the\n// fill (`p:spPr` for shapes, `p:bgPr` for backgrounds). It removes any\n// previous fill choice (`noFill`/`solidFill`/`gradFill`/`blipFill`/\n// `pattFill`/`grpFill`) before inserting the new `solidFill`.\n\nimport { oneOf } from '../bounds.ts';\nimport { NS, type XmlElement, attr, elem, qname } from '../xml/index.ts';\nimport { buildColorElement } from './color.ts';\n\nconst NAME_SOLID_FILL = qname('a', 'solidFill', NS.dml);\nconst NAME_NO_FILL = qname('a', 'noFill', NS.dml);\nconst NAME_GRAD_FILL = qname('a', 'gradFill', NS.dml);\nconst NAME_GS_LST = qname('a', 'gsLst', NS.dml);\nconst NAME_GS = qname('a', 'gs', NS.dml);\nconst NAME_LIN = qname('a', 'lin', NS.dml);\nconst NAME_PATH = qname('a', 'path', NS.dml);\nconst NAME_FILL_TO_RECT = qname('a', 'fillToRect', NS.dml);\nconst ATTR_PATH = qname('', 'path', '');\nconst ATTR_POS = qname('', 'pos', '');\nconst ATTR_ANG = qname('', 'ang', '');\nconst ATTR_SCALED = qname('', 'scaled', '');\nconst ATTR_FLIP = qname('', 'flip', '');\nconst ATTR_ROT_WITH_SHAPE = qname('', 'rotWithShape', '');\n\nconst FILL_CHOICE_LOCAL_NAMES = new Set([\n 'noFill',\n 'solidFill',\n 'gradFill',\n 'blipFill',\n 'pattFill',\n 'grpFill',\n]);\n\nconst removeAnyFill = (host: XmlElement): void => {\n host.children = host.children.filter(\n (c) =>\n !(\n c.kind === 'element' &&\n c.name.namespaceURI === NS.dml &&\n FILL_CHOICE_LOCAL_NAMES.has(c.name.localName)\n ),\n );\n};\n\n/**\n * Returns the index where the fill should be inserted on `host` per the\n * schema's child-element sequence. For `<p:spPr>` that's right after the\n * geometry element; for `<p:bgPr>` it's the start.\n *\n * The schema is more nuanced (xfrm → geometry → fill → ln → effects →\n * scene3d → sp3d → extLst) but PowerPoint tolerates any of those slots\n * being absent, and we only care about staying ahead of `a:ln`.\n */\nconst fillInsertionIndex = (host: XmlElement): number => {\n for (let i = 0; i < host.children.length; i++) {\n const c = host.children[i];\n if (c?.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n if (c.name.localName === 'ln') return i;\n if (c.name.localName === 'effectLst' || c.name.localName === 'effectDag') return i;\n if (c.name.localName === 'scene3d' || c.name.localName === 'sp3d') return i;\n if (c.name.localName === 'extLst') return i;\n }\n return host.children.length;\n};\n\n/** Sets `<a:solidFill>` on `host`, removing any previous fill choice. */\nexport const setSolidFill = (host: XmlElement, color: string): void => {\n removeAnyFill(host);\n const fill = elem(NAME_SOLID_FILL, { children: [buildColorElement(color)] });\n host.children.splice(fillInsertionIndex(host), 0, fill);\n};\n\n/** Sets `<a:noFill>` on `host`, removing any previous fill choice. */\nexport const setNoFill = (host: XmlElement): void => {\n removeAnyFill(host);\n host.children.splice(fillInsertionIndex(host), 0, elem(NAME_NO_FILL));\n};\n\n/**\n * Removes any fill choice from `host` entirely. The shape then inherits\n * its fill from the layout / master placeholder it descends from.\n */\nexport const clearFill = (host: XmlElement): void => {\n removeAnyFill(host);\n};\n\n/** One stop in a linear gradient. */\nexport interface GradientStop {\n /** Position on the gradient axis, 0-1. */\n readonly offset: number;\n /** `#RRGGBB`, bare `RRGGBB`, or a scheme color token. */\n readonly color: string;\n}\n\nexport interface GradientFillOptions {\n /** Two or more color stops along the axis. */\n readonly stops: ReadonlyArray<GradientStop>;\n /**\n * Gradient axis angle, in degrees. ECMA-376 measures clockwise from\n * the right (3 o'clock); `0` is a left-to-right gradient, `90` is\n * top-to-bottom, `180` right-to-left, `270` bottom-to-top. Defaults\n * to `90` (top → bottom). Only meaningful for linear gradients.\n */\n readonly angleDeg?: number;\n /**\n * Non-linear gradient path. `circle` paints concentric circles,\n * `rect` paints nested rectangles, `shape` follows the shape's\n * outline. Absent / `'linear'` → linear gradient using `angleDeg`.\n * Mirrors ECMA-376 §20.1.8.33 `<a:path path=\"…\"/>`.\n */\n readonly path?: 'linear' | 'circle' | 'rect' | 'shape';\n /**\n * Focus rectangle for non-linear gradients, in unit coordinates\n * (0 = left/top, 1 = right/bottom). When omitted, defaults to a\n * single point at the rectangle's center. Mirrors `<a:fillToRect>`.\n */\n readonly focus?: {\n readonly left: number;\n readonly top: number;\n readonly right: number;\n readonly bottom: number;\n };\n}\n\n/** Every `ST_PresetPatternVal` token (ECMA-376 dml-main.xsd). */\nexport const PATTERN_PRESETS = [\n 'pct5',\n 'pct10',\n 'pct20',\n 'pct25',\n 'pct30',\n 'pct40',\n 'pct50',\n 'pct60',\n 'pct70',\n 'pct75',\n 'pct80',\n 'pct90',\n 'horz',\n 'vert',\n 'ltHorz',\n 'ltVert',\n 'dkHorz',\n 'dkVert',\n 'narHorz',\n 'narVert',\n 'dashHorz',\n 'dashVert',\n 'cross',\n 'dnDiag',\n 'upDiag',\n 'ltDnDiag',\n 'ltUpDiag',\n 'dkDnDiag',\n 'dkUpDiag',\n 'wdDnDiag',\n 'wdUpDiag',\n 'dashDnDiag',\n 'dashUpDiag',\n 'diagCross',\n 'smCheck',\n 'lgCheck',\n 'smGrid',\n 'lgGrid',\n 'dotGrid',\n 'smConfetti',\n 'lgConfetti',\n 'horzBrick',\n 'diagBrick',\n 'solidDmnd',\n 'openDmnd',\n 'dotDmnd',\n 'plaid',\n 'sphere',\n 'weave',\n 'divot',\n 'shingle',\n 'wave',\n 'trellis',\n 'zigZag',\n] as const;\n\n/** One of ECMA-376's `ST_PresetPatternVal` tokens (`pct50`, `dkUpDiag`, ...). */\nexport type PatternPreset = (typeof PATTERN_PRESETS)[number];\n\nexport interface PatternFillOptions {\n /** Preset pattern token, e.g. `'pct50'`, `'dkUpDiag'`, `'wave'`. */\n readonly preset: PatternPreset;\n /** Foreground (pattern stroke) color. `#RRGGBB`, bare `RRGGBB`, or scheme token. */\n readonly foreground: string;\n /** Background (fill behind the pattern) color. */\n readonly background: string;\n}\n\nconst NAME_PATT_FILL = qname('a', 'pattFill', NS.dml);\nconst NAME_FG_CLR = qname('a', 'fgClr', NS.dml);\nconst NAME_BG_CLR = qname('a', 'bgClr', NS.dml);\nconst ATTR_PRST = qname('', 'prst', '');\n\n/**\n * Sets `<a:pattFill>` on `host` with the given preset + colors.\n * Replaces any previous fill choice.\n */\nexport const setPatternFill = (host: XmlElement, options: PatternFillOptions): void => {\n removeAnyFill(host);\n // `preset` is typed but authoring input is a boundary — reject an out-of-enum\n // token rather than emitting a schema-invalid `prst`.\n const preset = oneOf(options.preset, PATTERN_PRESETS, 'setShapePatternFill: preset');\n const pattFill = elem(NAME_PATT_FILL, {\n attrs: [attr(ATTR_PRST, preset)],\n children: [\n elem(NAME_FG_CLR, { children: [buildColorElement(options.foreground)] }),\n elem(NAME_BG_CLR, { children: [buildColorElement(options.background)] }),\n ],\n });\n host.children.splice(fillInsertionIndex(host), 0, pattFill);\n};\n\n/** Sets `<a:gradFill>` on `host`, replacing any previous fill choice. */\nexport const setGradientFill = (host: XmlElement, options: GradientFillOptions): void => {\n if (options.stops.length < 2) {\n throw new Error('gradient fill requires at least two stops');\n }\n removeAnyFill(host);\n\n const stops = options.stops.map((s) => {\n if (!Number.isFinite(s.offset) || s.offset < 0 || s.offset > 1) {\n throw new RangeError(`gradient stop offset must be in [0, 1], got ${s.offset}`);\n }\n const posST = String(Math.round(s.offset * 100000));\n return elem(NAME_GS, {\n attrs: [attr(ATTR_POS, posST)],\n children: [buildColorElement(s.color)],\n });\n });\n\n // The gradient direction is a choice: `<a:lin>` for a linear gradient (using\n // angleDeg) or `<a:path path=\"circle|rect|shape\">` for a non-linear one. When\n // a path is requested we honor the documented `focus` fillToRect; emitting\n // <a:lin> regardless (the prior behavior) silently downgraded radial/shape\n // gradients to linear.\n const pct = (n: number): string => String(Math.round(n * 100000));\n const directionEl =\n options.path === undefined || options.path === 'linear'\n ? ((): XmlElement => {\n const angleDeg = options.angleDeg ?? 90;\n // ECMA-376 ST_PositiveFixedAngle: 60000 units per degree, range\n // [0, 21600000). Normalize negatives via modulo.\n const norm = ((angleDeg % 360) + 360) % 360;\n return elem(NAME_LIN, {\n attrs: [attr(ATTR_ANG, String(Math.round(norm * 60000))), attr(ATTR_SCALED, '0')],\n });\n })()\n : elem(NAME_PATH, {\n attrs: [attr(ATTR_PATH, options.path)],\n children:\n options.focus === undefined\n ? []\n : [\n elem(NAME_FILL_TO_RECT, {\n attrs: [\n attr(qname('', 'l', ''), pct(options.focus.left)),\n attr(qname('', 't', ''), pct(options.focus.top)),\n attr(qname('', 'r', ''), pct(options.focus.right)),\n attr(qname('', 'b', ''), pct(options.focus.bottom)),\n ],\n }),\n ],\n });\n\n const grad = elem(NAME_GRAD_FILL, {\n attrs: [attr(ATTR_FLIP, 'none'), attr(ATTR_ROT_WITH_SHAPE, '1')],\n children: [elem(NAME_GS_LST, { children: stops }), directionEl],\n });\n host.children.splice(fillInsertionIndex(host), 0, grad);\n};\n","// Shape effects — `<a:effectLst>` builders.\n//\n// Covers the most-used PowerPoint effects: outer shadow + glow. The\n// element ordering on `<p:spPr>` is `xfrm → geometry → fill → ln →\n// effectLst → scene3d → sp3d → extLst`. Callers locate the right\n// insertion slot using `effectInsertionIndex`.\n\nimport { emuExtent } from '../bounds.ts';\nimport { NS, type XmlElement, attr, elem, qname } from '../xml/index.ts';\nimport { buildColorElement } from './color.ts';\n\nconst NAME_EFFECT_LST = qname('a', 'effectLst', NS.dml);\nconst NAME_OUTER_SHDW = qname('a', 'outerShdw', NS.dml);\nconst NAME_GLOW = qname('a', 'glow', NS.dml);\nconst NAME_ALPHA = qname('a', 'alpha', NS.dml);\n\nconst ATTR_BLUR_RAD = qname('', 'blurRad', '');\nconst ATTR_DIST = qname('', 'dist', '');\nconst ATTR_DIR = qname('', 'dir', '');\nconst ATTR_ALGN = qname('', 'algn', '');\nconst ATTR_ROT_WITH_SHAPE = qname('', 'rotWithShape', '');\nconst ATTR_RAD = qname('', 'rad', '');\nconst ATTR_VAL = qname('', 'val', '');\n\nexport interface ShadowOptions {\n /** `#RRGGBB`, bare `RRGGBB`, or scheme token. Defaults to black. */\n readonly color?: string;\n /** Edge blur in EMU. Defaults to 50800 (4pt). */\n readonly blurEmu?: number;\n /** Offset distance in EMU. Defaults to 38100 (3pt). */\n readonly offsetEmu?: number;\n /**\n * Direction in degrees, measured clockwise from the right (3 o'clock).\n * Defaults to 45° (down-right).\n */\n readonly angleDeg?: number;\n /** Opacity (0–1). Defaults to fully opaque. */\n readonly opacity?: number;\n}\n\nexport interface GlowOptions {\n /** `#RRGGBB`, bare `RRGGBB`, or scheme token. */\n readonly color: string;\n /** Glow radius in EMU. Defaults to 63500 (5pt). */\n readonly radiusEmu?: number;\n}\n\n/**\n * Computes the index inside `host.children` where an `<a:effectLst>`\n * should be inserted to satisfy the spec's child ordering on\n * `<p:spPr>`.\n */\nconst effectInsertionIndex = (host: XmlElement): number => {\n for (let i = 0; i < host.children.length; i++) {\n const c = host.children[i];\n if (c?.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n if (c.name.localName === 'scene3d' || c.name.localName === 'sp3d') return i;\n if (c.name.localName === 'extLst') return i;\n }\n return host.children.length;\n};\n\nconst removeEffectLst = (host: XmlElement): void => {\n host.children = host.children.filter(\n (c) =>\n !(c.kind === 'element' && c.name.namespaceURI === NS.dml && c.name.localName === 'effectLst'),\n );\n};\n\nconst colorWithAlpha = (color: string, opacity: number | undefined): XmlElement => {\n const base = buildColorElement(color);\n if (opacity !== undefined && opacity >= 0 && opacity < 1) {\n const amt = Math.round(opacity * 100000);\n base.children.push(elem(NAME_ALPHA, { attrs: [attr(ATTR_VAL, String(amt))] }));\n }\n return base;\n};\n\n/**\n * Sets an outer shadow on `host`'s effect list. Replaces any prior\n * `<a:effectLst>` entirely (we treat shadow + glow as mutually\n * exclusive in v1 — multi-effect stacks are a post-1.0 enhancement).\n */\nexport const setShadow = (host: XmlElement, options: ShadowOptions = {}): void => {\n removeEffectLst(host);\n const color = options.color ?? '#000000';\n // blurRad and dist are ST_PositiveCoordinate (EMU, 0..27273042316900); a\n // fractional/negative/non-finite/over-max value would emit a schema-invalid\n // `<a:outerShdw>`. Validate at this boundary like every other EMU input.\n const blur = emuExtent(options.blurEmu ?? 50800, 'setShapeShadow: blurEmu');\n const dist = emuExtent(options.offsetEmu ?? 38100, 'setShapeShadow: offsetEmu');\n const angleDeg = options.angleDeg ?? 45;\n const dir = String(Math.round((((angleDeg % 360) + 360) % 360) * 60000));\n\n const outerShdw = elem(NAME_OUTER_SHDW, {\n attrs: [\n attr(ATTR_BLUR_RAD, String(blur)),\n attr(ATTR_DIST, String(dist)),\n attr(ATTR_DIR, dir),\n attr(ATTR_ALGN, 'tl'),\n attr(ATTR_ROT_WITH_SHAPE, '0'),\n ],\n children: [colorWithAlpha(color, options.opacity)],\n });\n const effectLst = elem(NAME_EFFECT_LST, { children: [outerShdw] });\n host.children.splice(effectInsertionIndex(host), 0, effectLst);\n};\n\n/**\n * Sets a glow on `host`'s effect list. Replaces any prior\n * `<a:effectLst>`.\n */\nexport const setGlow = (host: XmlElement, options: GlowOptions): void => {\n removeEffectLst(host);\n // rad is ST_PositiveCoordinate — validate like the shadow EMU inputs above.\n const rad = String(emuExtent(options.radiusEmu ?? 63500, 'setShapeGlow: radiusEmu'));\n const glow = elem(NAME_GLOW, {\n attrs: [attr(ATTR_RAD, rad)],\n children: [buildColorElement(options.color)],\n });\n const effectLst = elem(NAME_EFFECT_LST, { children: [glow] });\n host.children.splice(effectInsertionIndex(host), 0, effectLst);\n};\n\n/** Removes any effect list from `host`. */\nexport const clearEffects = (host: XmlElement): void => {\n removeEffectLst(host);\n};\n","// Outline (line) mutation for shapes.\n//\n// `<a:ln>` sits inside `<p:spPr>` after the fill choice. ECMA-376 §20.1.2\n// surface: width (EMU), cap, dash, fill choice (solid/no/grad), join\n// (round/bevel/miter), and head/tail arrow markers. We expose width, solid\n// color, noFill, preset dash, join, and head/tail arrowheads — each inserted at\n// its CT_LineProperties slot via LN_CHILD_RANK below.\n\nimport { lineWidthEmu } from '../bounds.ts';\nimport { NS, type XmlElement, attr, elem, insertChildByRank, qname } from '../xml/index.ts';\nimport { buildColorElement } from './color.ts';\n\nconst NAME_LN = qname('a', 'ln', NS.dml);\nconst NAME_SOLID_FILL = qname('a', 'solidFill', NS.dml);\nconst NAME_NO_FILL = qname('a', 'noFill', NS.dml);\nconst ATTR_W = qname('', 'w', '');\n\nconst FILL_LOCALS = new Set(['noFill', 'solidFill', 'gradFill', 'pattFill']);\n\n// CT_LineProperties (a:ln) is an xsd:sequence: fill choice, then the dash,\n// then the join choice, then head/tail arrowheads, then extLst. Sub-element\n// setters must drop their element at the mandated slot rather than push to the\n// end, or combining (e.g.) a dash + arrowheads + join emits invalid order.\nconst LN_CHILD_RANK: Record<string, number> = {\n noFill: 0,\n solidFill: 0,\n gradFill: 0,\n pattFill: 0,\n prstDash: 1,\n custDash: 1,\n round: 2,\n bevel: 2,\n miter: 2,\n headEnd: 3,\n tailEnd: 4,\n extLst: 5,\n};\nconst lnChildRank = (el: XmlElement): number =>\n el.name.namespaceURI === NS.dml ? (LN_CHILD_RANK[el.name.localName] ?? 99) : 99;\nconst insertLnChild = (ln: XmlElement, el: XmlElement): void =>\n insertChildByRank(ln, el, lnChildRank);\n\nconst removeChildrenIn = (host: XmlElement, names: ReadonlySet<string>): void => {\n host.children = host.children.filter(\n (c) => !(c.kind === 'element' && c.name.namespaceURI === NS.dml && names.has(c.name.localName)),\n );\n};\n\nconst ensureLn = (spPr: XmlElement): XmlElement => {\n for (const c of spPr.children) {\n if (c.kind === 'element' && c.name.namespaceURI === NS.dml && c.name.localName === 'ln') {\n return c;\n }\n }\n // <a:ln> goes AFTER the fill choice and BEFORE effects / scene3d / sp3d /\n // extLst per the schema. We insert at the index of the first element that\n // belongs after `<a:ln>`; otherwise append.\n const ln = elem(NAME_LN);\n const afterLn = new Set(['effectLst', 'effectDag', 'scene3d', 'sp3d', 'extLst']);\n for (let i = 0; i < spPr.children.length; i++) {\n const c = spPr.children[i];\n if (c?.kind === 'element' && c.name.namespaceURI === NS.dml && afterLn.has(c.name.localName)) {\n spPr.children.splice(i, 0, ln);\n return ln;\n }\n }\n spPr.children.push(ln);\n return ln;\n};\n\nexport interface StrokeOptions {\n /** Line color. Same accepted forms as `setFill`. */\n color?: string;\n /** Line width in EMU. PowerPoint's default for a hairline is 9525 (0.75pt). */\n widthEmu?: number;\n}\n\n/** Sets a solid-color outline on a shape's spPr. */\nexport const setSolidStroke = (spPr: XmlElement, options: StrokeOptions): void => {\n const ln = ensureLn(spPr);\n if (options.widthEmu !== undefined) {\n ln.attrs = ln.attrs.filter((a) => a.name.localName !== 'w');\n ln.attrs.push(attr(ATTR_W, String(lineWidthEmu(options.widthEmu, 'setShapeStroke: widthEmu'))));\n }\n // Replace any existing fill choice inside <a:ln>.\n removeChildrenIn(ln, FILL_LOCALS);\n if (options.color !== undefined) {\n insertLnChild(ln, elem(NAME_SOLID_FILL, { children: [buildColorElement(options.color)] }));\n }\n};\n\n/** Sets an explicit \"no outline\" on a shape's spPr. */\nexport const setNoStroke = (spPr: XmlElement): void => {\n const ln = ensureLn(spPr);\n removeChildrenIn(ln, FILL_LOCALS);\n insertLnChild(ln, elem(NAME_NO_FILL));\n};\n\n/** Removes any `<a:ln>` from a shape's spPr (restores inheritance). */\nexport const clearStroke = (spPr: XmlElement): void => {\n spPr.children = spPr.children.filter(\n (c) => !(c.kind === 'element' && c.name.namespaceURI === NS.dml && c.name.localName === 'ln'),\n );\n};\n\n/**\n * ECMA-376 §20.1.10.49 `ST_PresetLineDashVal` tokens. PowerPoint's\n * \"Dash type\" dropdown maps to these.\n */\nexport type LineDash =\n | 'solid'\n | 'dot'\n | 'dash'\n | 'lgDash'\n | 'dashDot'\n | 'lgDashDot'\n | 'lgDashDotDot'\n | 'sysDash'\n | 'sysDot'\n | 'sysDashDot'\n | 'sysDashDotDot';\n\nconst NAME_PRST_DASH = qname('a', 'prstDash', NS.dml);\nconst ATTR_VAL = qname('', 'val', '');\n\n/**\n * Sets `<a:prstDash val=\"...\"/>` inside the shape's `<a:ln>`. Creates\n * `<a:ln>` if absent. Replacing the dash choice on subsequent calls.\n */\nexport const setStrokeDash = (spPr: XmlElement, dash: LineDash): void => {\n const ln = ensureLn(spPr);\n ln.children = ln.children.filter(\n (c) =>\n !(c.kind === 'element' && c.name.namespaceURI === NS.dml && c.name.localName === 'prstDash'),\n );\n insertLnChild(ln, elem(NAME_PRST_DASH, { attrs: [attr(ATTR_VAL, dash)] }));\n};\n\n/** ECMA-376 §20.1.10.39 `ST_LineEndType`. */\nexport type LineEndType = 'none' | 'triangle' | 'stealth' | 'diamond' | 'oval' | 'arrow';\n\n/** ECMA-376 `ST_LineEndWidth` / `ST_LineEndLength`. */\nexport type LineEndSize = 'sm' | 'med' | 'lg';\n\nexport interface ArrowOptions {\n readonly type: LineEndType;\n readonly width?: LineEndSize;\n readonly length?: LineEndSize;\n}\n\nconst ATTR_TYPE = qname('', 'type', '');\nconst ATTR_LEN = qname('', 'len', '');\n\n/**\n * Sets an arrowhead on one end of the shape's outline. `end` selects\n * which sentinel element: `'head'` → `<a:headEnd>`, `'tail'` →\n * `<a:tailEnd>`. Creates `<a:ln>` if absent and replaces any prior\n * arrowhead on the selected end.\n *\n * Pass `{ type: 'none' }` to clear an existing arrowhead (this still\n * emits the element with `type=\"none\"`, matching PowerPoint's\n * behavior).\n */\nexport const setStrokeArrow = (\n spPr: XmlElement,\n end: 'head' | 'tail',\n options: ArrowOptions,\n): void => {\n const ln = ensureLn(spPr);\n const localName = end === 'head' ? 'headEnd' : 'tailEnd';\n ln.children = ln.children.filter(\n (c) =>\n !(c.kind === 'element' && c.name.namespaceURI === NS.dml && c.name.localName === localName),\n );\n const attrs = [attr(ATTR_TYPE, options.type)];\n if (options.width !== undefined) attrs.push(attr(ATTR_W, options.width));\n if (options.length !== undefined) attrs.push(attr(ATTR_LEN, options.length));\n insertLnChild(ln, elem(qname('a', localName, NS.dml), { attrs }));\n};\n\n/** ECMA-376 §20.1.10.30 `ST_LineCap`. */\nexport type LineCap = 'rnd' | 'sq' | 'flat';\n\n/** Sets `<a:ln cap=\"…\"/>`. Pass `null` to clear the attribute. */\nexport const setStrokeCap = (spPr: XmlElement, cap: LineCap | null): void => {\n const ln = ensureLn(spPr);\n ln.attrs = ln.attrs.filter((a) => !(a.name.namespaceURI === '' && a.name.localName === 'cap'));\n if (cap !== null) ln.attrs.push(attr(qname('', 'cap', ''), cap));\n};\n\n/** Three child-element variants of `<a:ln>`: round / bevel / miter. */\nexport type LineJoin = 'round' | 'bevel' | 'miter';\nconst JOIN_LOCALS = new Set(['round', 'bevel', 'miter']);\n\n/** Replaces the join child of `<a:ln>`. Pass `null` to remove it. */\nexport const setStrokeJoin = (spPr: XmlElement, join: LineJoin | null): void => {\n const ln = ensureLn(spPr);\n removeChildrenIn(ln, JOIN_LOCALS);\n if (join !== null) {\n // Join sits after <a:prstDash> and before <a:headEnd> per CT_LineProperties.\n insertLnChild(ln, elem(qname('a', join, NS.dml)));\n }\n};\n\n/** ECMA-376 §20.1.10.31 `ST_CompoundLine`. */\nexport type LineCompound = 'sng' | 'dbl' | 'thickThin' | 'thinThick' | 'tri';\n\n/** Sets `<a:ln cmpd=\"…\"/>`. Pass `null` to clear the attribute. */\nexport const setStrokeCompound = (spPr: XmlElement, cmpd: LineCompound | null): void => {\n const ln = ensureLn(spPr);\n ln.attrs = ln.attrs.filter((a) => !(a.name.namespaceURI === '' && a.name.localName === 'cmpd'));\n if (cmpd !== null) ln.attrs.push(attr(qname('', 'cmpd', ''), cmpd));\n};\n","// Read-only parser + guide-formula evaluator for `<a:custGeom>`\n// (ECMA-376 §20.1.9 — Custom Geometry).\n//\n// A custom geometry is a list of paths, each a sequence of pen commands\n// (`moveTo` / `lnTo` / `arcTo` / `quadBezTo` / `cubicBezTo` / `close`)\n// whose coordinates are written as either literal numbers or *guide\n// references*. Guides are named values computed from formulas in\n// `<a:avLst>` / `<a:gdLst>`, plus a set of implicit built-ins derived\n// from the shape extents. This module evaluates those formulas so the\n// returned geometry carries only fully-resolved numbers — no guide names\n// survive into the output.\n//\n// Allowed imports: internal/xml.\n\nimport { NS, type QName, type XmlElement, getAttrValue, isElement, qname } from '../xml/index.ts';\n\n/** A point in the path's own coordinate space, fully evaluated. */\nexport interface GeomPoint {\n readonly x: number;\n readonly y: number;\n}\n\n/**\n * `ST_PathFillMode` (ECMA-376 §20.1.10.38). `none` means the path is\n * stroke-only; every other value fills (the lighten/darken variants only\n * affect how the fill is shaded, which the preview does not model, so we\n * still surface them rather than collapsing to `norm`). Default `norm`.\n */\nexport type PathFillMode = 'none' | 'norm' | 'lighten' | 'lightenLess' | 'darken' | 'darkenLess';\n\n/**\n * One pen command. Discriminated on `kind` so renderers can `switch`\n * exhaustively. All coordinates / radii are in the owning path's\n * coordinate space; angles are in 60000ths of a degree (ECMA-376's unit\n * for `<a:arcTo>` `stAng` / `swAng`).\n */\nexport type GeomCommand =\n | { readonly kind: 'moveTo'; readonly pt: GeomPoint }\n | { readonly kind: 'lnTo'; readonly pt: GeomPoint }\n | {\n readonly kind: 'arcTo';\n readonly wR: number;\n readonly hR: number;\n readonly stAng: number;\n readonly swAng: number;\n }\n | { readonly kind: 'quadBezTo'; readonly pts: readonly [GeomPoint, GeomPoint] }\n | { readonly kind: 'cubicBezTo'; readonly pts: readonly [GeomPoint, GeomPoint, GeomPoint] }\n | { readonly kind: 'close' };\n\nexport interface GeomPath {\n /** Path coordinate-space width (`<a:path w>`), or `null` when omitted. */\n readonly w: number | null;\n /** Path coordinate-space height (`<a:path h>`), or `null` when omitted. */\n readonly h: number | null;\n readonly fill: PathFillMode;\n readonly stroke: boolean;\n readonly commands: readonly GeomCommand[];\n}\n\nexport interface CustomGeometry {\n readonly paths: readonly GeomPath[];\n}\n\n/**\n * Thrown internally when a formula references a guide name that was never\n * defined, or when an unknown `fmla` operator appears. Both are malformed\n * input rather than bugs, so the public reader catches *only this class*\n * and reports it as \"geometry could not be evaluated\" (returns `null`),\n * while letting any genuine programming error propagate.\n */\nclass GeomEvalError extends Error {}\n\nconst ATTR_NAME = qname('', 'name', '');\nconst ATTR_FMLA = qname('', 'fmla', '');\nconst ATTR_X = qname('', 'x', '');\nconst ATTR_Y = qname('', 'y', '');\nconst ATTR_W = qname('', 'w', '');\nconst ATTR_H = qname('', 'h', '');\nconst ATTR_WR = qname('', 'wR', '');\nconst ATTR_HR = qname('', 'hR', '');\nconst ATTR_ST_ANG = qname('', 'stAng', '');\nconst ATTR_SW_ANG = qname('', 'swAng', '');\nconst ATTR_FILL = qname('', 'fill', '');\nconst ATTR_STROKE = qname('', 'stroke', '');\n\nconst NAME_AV_LST = qname('a', 'avLst', NS.dml);\nconst NAME_GD_LST = qname('a', 'gdLst', NS.dml);\nconst NAME_PATH_LST = qname('a', 'pathLst', NS.dml);\n\n// 60000ths-of-a-degree is OOXML's angular unit. A full turn is\n// 360 × 60000 = 21_600_000; the `cdN` built-in guides are that constant\n// divided by N.\nconst FULL_TURN_60K = 21_600_000;\nconst toRadians = (sixtyThousandthsDeg: number): number =>\n (sixtyThousandthsDeg / 60_000) * (Math.PI / 180);\n\nconst NUMERIC_TOKEN = /^-?\\d+(?:\\.\\d+)?$/;\n\n/**\n * Implicit guides every formula may reference, derived from the shape\n * extents (`w`, `h` in EMU). `ss` is the short side, `ls` the long side.\n * The `cdN` / `NcdN` entries are constant angles in 60000ths of a degree.\n */\nconst builtinGuides = (w: number, h: number): Map<string, number> => {\n const ss = Math.min(w, h);\n const cd4 = FULL_TURN_60K / 4;\n const cd8 = FULL_TURN_60K / 8;\n return new Map<string, number>([\n ['w', w],\n ['h', h],\n ['ss', ss],\n ['ls', Math.max(w, h)],\n ['hc', w / 2],\n ['vc', h / 2],\n ['t', 0],\n ['l', 0],\n ['b', h],\n ['r', w],\n ['wd2', w / 2],\n ['wd3', w / 3],\n ['wd4', w / 4],\n ['wd5', w / 5],\n ['wd6', w / 6],\n ['wd8', w / 8],\n ['wd10', w / 10],\n ['hd2', h / 2],\n ['hd3', h / 3],\n ['hd4', h / 4],\n ['hd5', h / 5],\n ['hd6', h / 6],\n ['hd8', h / 8],\n ['hd10', h / 10],\n ['ssd2', ss / 2],\n ['ssd4', ss / 4],\n ['ssd6', ss / 6],\n ['ssd8', ss / 8],\n ['cd2', FULL_TURN_60K / 2],\n ['cd4', cd4],\n ['cd6', FULL_TURN_60K / 6],\n ['cd8', cd8],\n ['3cd4', 3 * cd4],\n ['3cd8', 3 * cd8],\n ['5cd8', 5 * cd8],\n ['7cd8', 7 * cd8],\n ]);\n};\n\n/** Resolves a single token to a number — literal or a defined guide. */\nconst resolveToken = (token: string, guides: Map<string, number>): number => {\n if (NUMERIC_TOKEN.test(token)) return Number.parseFloat(token);\n const v = guides.get(token);\n if (v === undefined) throw new GeomEvalError(`unresolved guide reference: ${token}`);\n return v;\n};\n\n/**\n * Evaluates one `fmla` string against the guides resolved so far,\n * implementing the operators in ECMA-376 §20.1.9.11. Division by zero\n * yields `0` (the spec's defined result, so a `/0` formula degrades to a\n * point at the origin rather than `NaN`/`Infinity`).\n */\nconst evalFormula = (fmla: string, guides: Map<string, number>): number => {\n const parts = fmla.trim().split(/\\s+/);\n const op = parts[0];\n const a = (i: number): number => resolveToken(parts[i + 1] ?? '', guides);\n const div = (num: number, den: number): number => (den === 0 ? 0 : num / den);\n switch (op) {\n case 'val':\n return a(0);\n case '*/':\n return div(a(0) * a(1), a(2));\n case '+-':\n return a(0) + a(1) - a(2);\n case '+/':\n return div(a(0) + a(1), a(2));\n case '?:':\n return a(0) > 0 ? a(1) : a(2);\n case 'abs':\n return Math.abs(a(0));\n case 'sqrt':\n return Math.sqrt(a(0));\n case 'max':\n return Math.max(a(0), a(1));\n case 'min':\n return Math.min(a(0), a(1));\n case 'mod':\n // Magnitude of the 3-vector (a, b, c).\n return Math.sqrt(a(0) * a(0) + a(1) * a(1) + a(2) * a(2));\n case 'pin': {\n // Clamp the middle value into [lo, hi].\n const lo = a(0);\n const v = a(1);\n const hi = a(2);\n return v < lo ? lo : v > hi ? hi : v;\n }\n case 'sin':\n return a(0) * Math.sin(toRadians(a(1)));\n case 'cos':\n return a(0) * Math.cos(toRadians(a(1)));\n case 'tan':\n return a(0) * Math.tan(toRadians(a(1)));\n case 'at2':\n // arctan(y / x) in 60000ths of a degree (a0 = x, a1 = y).\n return ((Math.atan2(a(1), a(0)) * 180) / Math.PI) * 60_000;\n case 'cat2':\n // a0 · cos(arctan(a2 / a1)).\n return a(0) * Math.cos(Math.atan2(a(2), a(1)));\n case 'sat2':\n // a0 · sin(arctan(a2 / a1)).\n return a(0) * Math.sin(Math.atan2(a(2), a(1)));\n default:\n throw new GeomEvalError(`unknown fmla operator: ${op}`);\n }\n};\n\nconst firstDmlChild = (parent: XmlElement, name: QName): XmlElement | null => {\n for (const c of parent.children) {\n if (\n isElement(c) &&\n c.name.namespaceURI === name.namespaceURI &&\n c.name.localName === name.localName\n )\n return c;\n }\n return null;\n};\n\nconst dmlChildren = (parent: XmlElement, localName: string): XmlElement[] => {\n const out: XmlElement[] = [];\n for (const c of parent.children) {\n if (isElement(c) && c.name.namespaceURI === NS.dml && c.name.localName === localName)\n out.push(c);\n }\n return out;\n};\n\n/**\n * Evaluates `<a:gd>` children of `parent` in document order, writing each\n * result into `guides`. Later guides may reference earlier ones (and may\n * shadow built-ins), so order is load-bearing.\n */\nconst evalGuideList = (parent: XmlElement | null, guides: Map<string, number>): void => {\n if (parent === null) return;\n for (const c of dmlChildren(parent, 'gd')) {\n const name = getAttrValue(c, ATTR_NAME);\n const fmla = getAttrValue(c, ATTR_FMLA);\n if (name === null || fmla === null) continue;\n guides.set(name, evalFormula(fmla, guides));\n }\n};\n\nconst resolvePt = (pt: XmlElement, guides: Map<string, number>): GeomPoint => ({\n x: resolveToken(getAttrValue(pt, ATTR_X) ?? '0', guides),\n y: resolveToken(getAttrValue(pt, ATTR_Y) ?? '0', guides),\n});\n\nconst parsePoint = (el: XmlElement, guides: Map<string, number>): GeomPoint => {\n const pt = firstDmlChild(el, qname('a', 'pt', NS.dml));\n if (pt === null) throw new GeomEvalError(`<a:${el.name.localName}> missing <a:pt>`);\n return resolvePt(pt, guides);\n};\n\nconst parseIntOrNull = (raw: string | null): number | null => {\n if (raw === null) return null;\n const n = Number.parseInt(raw, 10);\n return Number.isFinite(n) ? n : null;\n};\n\nconst FILL_MODES: ReadonlySet<PathFillMode> = new Set([\n 'none',\n 'norm',\n 'lighten',\n 'lightenLess',\n 'darken',\n 'darkenLess',\n]);\n\n// Widening to ReadonlySet<string> is safe (every PathFillMode is a string);\n// this lets the guard narrow an arbitrary attribute value to the union.\nconst isPathFillMode = (s: string): s is PathFillMode => (FILL_MODES as ReadonlySet<string>).has(s);\n\nconst parsePath = (pathEl: XmlElement, guides: Map<string, number>): GeomPath => {\n const w = parseIntOrNull(getAttrValue(pathEl, ATTR_W));\n const h = parseIntOrNull(getAttrValue(pathEl, ATTR_H));\n const fillRaw = getAttrValue(pathEl, ATTR_FILL);\n const fill: PathFillMode = fillRaw !== null && isPathFillMode(fillRaw) ? fillRaw : 'norm';\n const strokeRaw = getAttrValue(pathEl, ATTR_STROKE);\n // `stroke` defaults to true; only an explicit \"0\"/\"false\" turns it off.\n const stroke = !(strokeRaw === '0' || strokeRaw === 'false');\n\n const commands: GeomCommand[] = [];\n for (const c of pathEl.children) {\n if (!isElement(c) || c.name.namespaceURI !== NS.dml) continue;\n switch (c.name.localName) {\n case 'moveTo':\n commands.push({ kind: 'moveTo', pt: parsePoint(c, guides) });\n break;\n case 'lnTo':\n commands.push({ kind: 'lnTo', pt: parsePoint(c, guides) });\n break;\n case 'close':\n commands.push({ kind: 'close' });\n break;\n case 'arcTo':\n commands.push({\n kind: 'arcTo',\n wR: resolveToken(getAttrValue(c, ATTR_WR) ?? '0', guides),\n hR: resolveToken(getAttrValue(c, ATTR_HR) ?? '0', guides),\n stAng: resolveToken(getAttrValue(c, ATTR_ST_ANG) ?? '0', guides),\n swAng: resolveToken(getAttrValue(c, ATTR_SW_ANG) ?? '0', guides),\n });\n break;\n case 'quadBezTo': {\n const pts = dmlChildren(c, 'pt');\n if (pts.length < 2) throw new GeomEvalError('<a:quadBezTo> needs 2 points');\n commands.push({\n kind: 'quadBezTo',\n pts: [resolvePt(pts[0]!, guides), resolvePt(pts[1]!, guides)],\n });\n break;\n }\n case 'cubicBezTo': {\n const pts = dmlChildren(c, 'pt');\n if (pts.length < 3) throw new GeomEvalError('<a:cubicBezTo> needs 3 points');\n commands.push({\n kind: 'cubicBezTo',\n pts: [resolvePt(pts[0]!, guides), resolvePt(pts[1]!, guides), resolvePt(pts[2]!, guides)],\n });\n break;\n }\n // `<a:path>` only ever contains the six command elements above\n // (ECMA-376 §20.1.9.15); anything else is foreign and ignored.\n }\n }\n return { w, h, fill, stroke, commands };\n};\n\n/**\n * Parses `<a:custGeom>` into a fully-evaluated {@link CustomGeometry}.\n * `shapeW` / `shapeH` are the shape extents in EMU, feeding the implicit\n * built-in guides (`w`, `h`, `ss`, …).\n *\n * Returns `null` when the geometry can't be evaluated because the input is\n * malformed (an unresolved guide reference, an unknown `fmla` operator, or\n * a command missing its points). Callers use that to fall back to a\n * placeholder rather than emit broken output.\n */\nexport const parseCustomGeometry = (\n custGeom: XmlElement,\n shapeW: number,\n shapeH: number,\n): CustomGeometry | null => {\n try {\n // avLst first, then gdLst — adjust values are inputs the gdLst formulas\n // build on. Both are evaluated against the same map so a gd can read an\n // earlier av, and an av can shadow a built-in.\n const guides = builtinGuides(shapeW, shapeH);\n evalGuideList(firstDmlChild(custGeom, NAME_AV_LST), guides);\n evalGuideList(firstDmlChild(custGeom, NAME_GD_LST), guides);\n\n const pathLst = firstDmlChild(custGeom, NAME_PATH_LST);\n if (pathLst === null) return { paths: [] };\n\n const paths: GeomPath[] = [];\n for (const p of dmlChildren(pathLst, 'path')) {\n paths.push(parsePath(p, guides));\n }\n return { paths };\n } catch (err) {\n if (err instanceof GeomEvalError) return null;\n throw err;\n }\n};\n","// Hyperlink mutation: wrap every `<a:r>` in a `<a:txBody>` so its\n// `<a:rPr>` carries `<a:hlinkClick r:id=\"rIdN\"/>`. The rId must already\n// exist on the part's `.rels` (the caller is responsible for allocating it\n// and adding the rel before calling here).\n\nimport { NS, type XmlElement, attr, elem, firstChildElement, qname } from '../xml/index.ts';\n\nconst NAME_R = qname('a', 'r', NS.dml);\nconst NAME_RPR = qname('a', 'rPr', NS.dml);\nconst NAME_HLINK_CLICK = qname('a', 'hlinkClick', NS.dml);\nconst ATTR_R_ID = qname('r', 'id', NS.officeDocRels);\n\n/**\n * Sets `<a:hlinkClick r:id=\"rIdN\" [tooltip=\"…\"]/>` inside the `<a:rPr>`\n * of every run in `txBody`. Pass `null` for `rId` to remove an existing\n * hyperlink. When `tooltip` is `undefined` no `tooltip=` attribute is\n * written; when it's a string the attribute is set. Creates `<a:rPr>`\n * if absent on a run.\n */\nexport const applyHyperlinkToAllRuns = (\n txBody: XmlElement,\n rId: string | null,\n tooltip?: string,\n): void => {\n for (const p of txBody.children) {\n if (p.kind !== 'element' || p.name.namespaceURI !== NS.dml || p.name.localName !== 'p') {\n continue;\n }\n for (const r of p.children) {\n if (r.kind !== 'element' || r.name.namespaceURI !== NS.dml || r.name.localName !== 'r') {\n continue;\n }\n let rPr = firstChildElement(r, NAME_RPR);\n if (rPr === null) {\n rPr = elem(NAME_RPR);\n r.children.unshift(rPr);\n }\n // Drop any existing hlinkClick.\n rPr.children = rPr.children.filter(\n (c) =>\n !(\n c.kind === 'element' &&\n c.name.namespaceURI === NS.dml &&\n c.name.localName === 'hlinkClick'\n ),\n );\n if (rId !== null) {\n const attrs = [attr(ATTR_R_ID, rId)];\n if (tooltip !== undefined) {\n attrs.push(attr(qname('', 'tooltip', ''), tooltip));\n }\n // Per the schema, hlinkClick is one of the last children of rPr —\n // it follows the fill/typeface children. Append.\n rPr.children.push(elem(NAME_HLINK_CLICK, { attrs }));\n }\n }\n }\n // Force-touch NAME_R so it isn't elided as unused.\n void NAME_R;\n};\n","// Helpers for mutating `<p:pic>` shapes. Reads the `r:embed` rId from the\n// `<a:blip>` and exposes a setter that points the same rId at a different\n// relationship target.\n//\n// The actual media-part swap lives in `parts/`; this module is purely the\n// XML manipulation side.\n\nimport { NS, getAttrValue, qname } from '../xml/index.ts';\nimport type { XmlElement } from '../xml/index.ts';\nimport { firstChildElement } from '../xml/index.ts';\n\nconst NAME_BLIP_FILL = qname('p', 'blipFill', NS.pml);\nconst NAME_BLIP = qname('a', 'blip', NS.dml);\nconst ATTR_R_EMBED = qname('r', 'embed', NS.officeDocRels);\n\n/**\n * Returns the `r:embed` rId on this picture shape's `a:blip`. Returns null\n * if the shape has no blip fill, no blip, or no embed attribute (which\n * happens for picture shapes that use an external `r:link` instead).\n */\nexport const getPictureEmbedRId = (picElement: XmlElement): string | null => {\n const blipFill = firstChildElement(picElement, NAME_BLIP_FILL);\n if (blipFill === null) return null;\n const blip = firstChildElement(blipFill, NAME_BLIP);\n if (blip === null) return null;\n return getAttrValue(blip, ATTR_R_EMBED);\n};\n","// Read-only geometry extraction from DrawingML transforms.\n//\n// `<a:xfrm>` carries the position (`<a:off x cy/>`) and size\n// (`<a:ext cx cy/>`) of a shape. PresentationML wraps the transform\n// differently depending on the shape kind:\n//\n// - `p:sp`, `p:pic`, `p:cxnSp` → `<p:spPr><a:xfrm>...</a:xfrm></p:spPr>`\n// - `p:grpSp` → `<p:grpSpPr><a:xfrm>...</a:xfrm></p:grpSpPr>`\n// - `p:graphicFrame` → `<p:xfrm>...</p:xfrm>` (note: p:, not a:)\n//\n// Each can be absent. Placeholders inheriting position from the layout\n// frequently omit `<a:xfrm>` on the slide; effective geometry would then\n// resolve up the inheritance chain. That resolution lives in the\n// presentationml/ layer once the layout reader is in place.\n\nimport { NS, firstChildElement, getAttrValue, qname } from '../xml/index.ts';\nimport type { XmlElement } from '../xml/index.ts';\n\nconst NAME_SP_PR = qname('p', 'spPr', NS.pml);\nconst NAME_GRP_SP_PR = qname('p', 'grpSpPr', NS.pml);\nconst NAME_A_XFRM = qname('a', 'xfrm', NS.dml);\nconst NAME_P_XFRM = qname('p', 'xfrm', NS.pml);\nconst NAME_OFF = qname('a', 'off', NS.dml);\nconst NAME_EXT = qname('a', 'ext', NS.dml);\nconst ATTR_X = qname('', 'x', '');\nconst ATTR_Y = qname('', 'y', '');\nconst ATTR_CX = qname('', 'cx', '');\nconst ATTR_CY = qname('', 'cy', '');\n\nexport interface Position {\n /** Left edge offset from the slide origin, in EMU. */\n readonly x: number;\n /** Top edge offset from the slide origin, in EMU. */\n readonly y: number;\n}\n\nexport interface Size {\n /** Width in EMU. */\n readonly w: number;\n /** Height in EMU. */\n readonly h: number;\n}\n\nconst parseIntOr = (raw: string | null): number | null =>\n raw === null ? null : Number.isFinite(Number.parseInt(raw, 10)) ? Number.parseInt(raw, 10) : null;\n\nconst findTransform = (shape: XmlElement, kind: ShapeKindForGeometry): XmlElement | null => {\n switch (kind) {\n case 'shape':\n case 'picture':\n case 'connector': {\n const spPr = firstChildElement(shape, NAME_SP_PR);\n if (spPr === null) return null;\n return firstChildElement(spPr, NAME_A_XFRM);\n }\n case 'group': {\n const grpSpPr = firstChildElement(shape, NAME_GRP_SP_PR);\n if (grpSpPr === null) return null;\n return firstChildElement(grpSpPr, NAME_A_XFRM);\n }\n case 'graphicFrame':\n // Graphic frames use a PML xfrm wrapper (no spPr).\n return firstChildElement(shape, NAME_P_XFRM);\n }\n};\n\n/**\n * Subset of `ShapeKind` from presentationml/, redeclared here to avoid an\n * upward import. They're kept in lock-step intentionally.\n */\nexport type ShapeKindForGeometry = 'shape' | 'picture' | 'group' | 'graphicFrame' | 'connector';\n\n/** Returns the shape's position (in EMU) or `null` if `<a:off>` is absent. */\nexport const readPosition = (shape: XmlElement, kind: ShapeKindForGeometry): Position | null => {\n const xfrm = findTransform(shape, kind);\n if (xfrm === null) return null;\n const off = firstChildElement(xfrm, NAME_OFF);\n if (off === null) return null;\n const x = parseIntOr(getAttrValue(off, ATTR_X));\n const y = parseIntOr(getAttrValue(off, ATTR_Y));\n if (x === null || y === null) return null;\n return { x, y };\n};\n\n/** Returns the shape's size (in EMU) or `null` if `<a:ext>` is absent. */\nexport const readSize = (shape: XmlElement, kind: ShapeKindForGeometry): Size | null => {\n const xfrm = findTransform(shape, kind);\n if (xfrm === null) return null;\n const ext = firstChildElement(xfrm, NAME_EXT);\n if (ext === null) return null;\n const w = parseIntOr(getAttrValue(ext, ATTR_CX));\n const h = parseIntOr(getAttrValue(ext, ATTR_CY));\n if (w === null || h === null) return null;\n return { w, h };\n};\n\nconst ATTR_ROT_R = qname('', 'rot', '');\nconst ATTR_FLIP_H_R = qname('', 'flipH', '');\nconst ATTR_FLIP_V_R = qname('', 'flipV', '');\n\n/**\n * Returns the shape's rotation in degrees, or `0` if no rotation is set.\n * ECMA-376 stores rotation in 60000ths of a degree; we divide.\n */\nexport const readRotation = (shape: XmlElement, kind: ShapeKindForGeometry): number => {\n const xfrm = findTransform(shape, kind);\n if (xfrm === null) return 0;\n const raw = parseIntOr(getAttrValue(xfrm, ATTR_ROT_R));\n if (raw === null) return 0;\n return raw / 60000;\n};\n\n/** Returns the shape's flip state (h/v boolean) or `null` when no xfrm exists. */\nexport const readFlip = (\n shape: XmlElement,\n kind: ShapeKindForGeometry,\n): { horizontal: boolean; vertical: boolean } | null => {\n const xfrm = findTransform(shape, kind);\n if (xfrm === null) return null;\n return {\n horizontal: getAttrValue(xfrm, ATTR_FLIP_H_R) === '1',\n vertical: getAttrValue(xfrm, ATTR_FLIP_V_R) === '1',\n };\n};\n","// Mutating counterpart to `geometry.ts`. Writes `<a:off>` / `<a:ext>` on\n// the shape's transform, creating the `<a:xfrm>` (and the host element)\n// when they don't yet exist.\n//\n// The shape-kind dispatch matches `geometry.ts` exactly — both modules\n// agree on where each shape kind keeps its transform.\n\nimport { emuCoordinate, emuExtent } from '../bounds.ts';\nimport { NS, attr, elem, firstChildElement, qname } from '../xml/index.ts';\nimport type { XmlElement } from '../xml/index.ts';\nimport type { ShapeKindForGeometry } from './geometry.ts';\n\nconst NAME_SP_PR = qname('p', 'spPr', NS.pml);\nconst NAME_GRP_SP_PR = qname('p', 'grpSpPr', NS.pml);\nconst NAME_A_XFRM = qname('a', 'xfrm', NS.dml);\nconst NAME_P_XFRM = qname('p', 'xfrm', NS.pml);\nconst NAME_OFF = qname('a', 'off', NS.dml);\nconst NAME_EXT = qname('a', 'ext', NS.dml);\nconst ATTR_X = qname('', 'x', '');\nconst ATTR_Y = qname('', 'y', '');\nconst ATTR_CX = qname('', 'cx', '');\nconst ATTR_CY = qname('', 'cy', '');\n\n/**\n * Ensures the shape has an `<a:xfrm>` (or `<p:xfrm>` for graphic frames)\n * to write into, creating the host element and its parent if absent.\n * Returns the xfrm element.\n */\nconst ensureTransform = (shape: XmlElement, kind: ShapeKindForGeometry): XmlElement => {\n if (kind === 'graphicFrame') {\n let xfrm = firstChildElement(shape, NAME_P_XFRM);\n if (xfrm === null) {\n xfrm = elem(NAME_P_XFRM);\n // graphicFrame children sequence: nvGraphicFramePr → xfrm → graphic.\n // Insert after nvGraphicFramePr if present, else at the front.\n const idx = shape.children.findIndex(\n (c) =>\n c.kind === 'element' &&\n c.name.namespaceURI === NS.pml &&\n c.name.localName === 'nvGraphicFramePr',\n );\n shape.children.splice(idx + 1, 0, xfrm);\n }\n return xfrm;\n }\n const hostName = kind === 'group' ? NAME_GRP_SP_PR : NAME_SP_PR;\n let host = firstChildElement(shape, hostName);\n if (host === null) {\n host = elem(hostName);\n // The host element comes after nvSpPr / nvPicPr / nvGrpSpPr / nvCxnSpPr.\n // Easiest: append; PowerPoint tolerates ordering at the spPr level.\n shape.children.push(host);\n }\n let xfrm = firstChildElement(host, NAME_A_XFRM);\n if (xfrm === null) {\n xfrm = elem(NAME_A_XFRM);\n host.children.unshift(xfrm);\n }\n return xfrm;\n};\n\n/** Sets the shape's `<a:off>` to `(x, y)` in EMU. */\nexport const setPosition = (\n shape: XmlElement,\n kind: ShapeKindForGeometry,\n x: number,\n y: number,\n): void => {\n const xfrm = ensureTransform(shape, kind);\n let off = firstChildElement(xfrm, NAME_OFF);\n if (off === null) {\n off = elem(NAME_OFF);\n xfrm.children.unshift(off);\n }\n off.attrs = [\n attr(ATTR_X, String(emuCoordinate(x, 'setShapePosition: x'))),\n attr(ATTR_Y, String(emuCoordinate(y, 'setShapePosition: y'))),\n ];\n};\n\n/** Sets the shape's `<a:ext>` to `(w, h)` in EMU. */\nexport const setSize = (\n shape: XmlElement,\n kind: ShapeKindForGeometry,\n w: number,\n h: number,\n): void => {\n const xfrm = ensureTransform(shape, kind);\n let ext = firstChildElement(xfrm, NAME_EXT);\n if (ext === null) {\n ext = elem(NAME_EXT);\n // ext should come AFTER off.\n const offIdx = xfrm.children.findIndex(\n (c) => c.kind === 'element' && c.name.localName === 'off' && c.name.namespaceURI === NS.dml,\n );\n if (offIdx >= 0) xfrm.children.splice(offIdx + 1, 0, ext);\n else xfrm.children.push(ext);\n }\n ext.attrs = [\n attr(ATTR_CX, String(emuExtent(w, 'setShapeSize: w'))),\n attr(ATTR_CY, String(emuExtent(h, 'setShapeSize: h'))),\n ];\n};\n\nconst ATTR_ROT = qname('', 'rot', '');\nconst ATTR_FLIP_H = qname('', 'flipH', '');\nconst ATTR_FLIP_V = qname('', 'flipV', '');\n\n/**\n * Sets the shape's rotation. `degrees` is degrees (positive clockwise),\n * fractional values allowed. PowerPoint serializes the value in\n * 60000ths of a degree per ECMA-376 ST_Angle, which we mirror.\n *\n * The full range is `0..360`; values outside that range are normalized.\n */\nexport const setRotation = (\n shape: XmlElement,\n kind: ShapeKindForGeometry,\n degrees: number,\n): void => {\n const xfrm = ensureTransform(shape, kind);\n // Normalize into `[0, 360)`.\n const normalized = ((degrees % 360) + 360) % 360;\n const value = Math.round(normalized * 60000);\n xfrm.attrs = xfrm.attrs.filter((a) => a.name.localName !== 'rot');\n if (value !== 0) xfrm.attrs.push(attr(ATTR_ROT, String(value)));\n};\n\n/** Sets `flipH` / `flipV` boolean attributes on the shape's transform. */\nexport const setFlip = (\n shape: XmlElement,\n kind: ShapeKindForGeometry,\n options: { horizontal?: boolean; vertical?: boolean },\n): void => {\n const xfrm = ensureTransform(shape, kind);\n if (options.horizontal !== undefined) {\n xfrm.attrs = xfrm.attrs.filter((a) => a.name.localName !== 'flipH');\n if (options.horizontal) xfrm.attrs.push(attr(ATTR_FLIP_H, '1'));\n }\n if (options.vertical !== undefined) {\n xfrm.attrs = xfrm.attrs.filter((a) => a.name.localName !== 'flipV');\n if (options.vertical) xfrm.attrs.push(attr(ATTR_FLIP_V, '1'));\n }\n};\n","// Read-only view over a slide part (`/ppt/slides/slideN.xml`).\n//\n// ECMA-376 Part 1 §19.3.1.38 — `<p:sld>` wraps a common slide data block\n// (`p:cSld`) containing a shape tree (`p:spTree`). The shape tree children\n// are the slide's drawable objects:\n//\n// - `p:sp` — shape (rect, ellipse, custom geometry; may carry text)\n// - `p:pic` — picture (image fill from a relationship)\n// - `p:grpSp` — group of nested shape-tree children\n// - `p:graphicFrame` — wraps a non-DrawingML graphic (table, chart, SmartArt)\n// - `p:cxnSp` — connector (line linking two shapes)\n//\n// Each carries non-visual properties under `p:nvSpPr`/`p:nvPicPr`/etc.\n// containing `p:cNvPr` (id + name), and visual properties under\n// `p:spPr`/`p:grpSpPr` (geometry + fill). At this phase we expose:\n//\n// - The classified shape array,\n// - each shape's id, name, placeholder type (if any),\n// - text content for shapes that carry an `a:txBody`.\n//\n// Geometry, fill, effects, and full authoring are deferred. They live in\n// drawingml/ once we need them.\n\nimport { textBodyText } from '../drawingml/index.ts';\nimport { NS, firstChildElement, getAttrValue, qname } from '../xml/index.ts';\nimport type { XmlElement } from '../xml/index.ts';\n\nexport type ShapeKind = 'shape' | 'picture' | 'group' | 'graphicFrame' | 'connector';\n\nexport interface SlideShape {\n readonly kind: ShapeKind;\n /** OOXML internal numeric id, unique within the slide's shape tree. */\n readonly id: number;\n /** Human-readable name (`Title 1`, `Content Placeholder 2`, ...). */\n readonly name: string;\n /**\n * Placeholder type (`title`, `body`, `ctrTitle`, ...) when the shape is a\n * placeholder; `null` for regular shapes and pictures. From `p:ph/@type`.\n */\n readonly placeholderType: string | null;\n /**\n * Placeholder index, used to bind the slide-level shape to its same-idx\n * counterpart on the slide layout / master.\n */\n readonly placeholderIdx: number | null;\n /** All visible text concatenated. `''` if the shape has no text body. */\n readonly text: string;\n /**\n * The underlying XML element for this shape. Higher layers walk this when\n * they need formatting / geometry information not yet promoted to the\n * typed view.\n */\n readonly element: XmlElement;\n}\n\nexport interface SlidePart {\n readonly shapes: ReadonlyArray<SlideShape>;\n readonly root: XmlElement;\n}\n\nconst NAME_CSLD = qname('p', 'cSld', NS.pml);\nconst NAME_SP_TREE = qname('p', 'spTree', NS.pml);\nconst NAME_NV_SP_PR = qname('p', 'nvSpPr', NS.pml);\nconst NAME_NV_PIC_PR = qname('p', 'nvPicPr', NS.pml);\nconst NAME_NV_GRP_SP_PR = qname('p', 'nvGrpSpPr', NS.pml);\nconst NAME_NV_GRAPHIC_FRAME_PR = qname('p', 'nvGraphicFramePr', NS.pml);\nconst NAME_NV_CXN_SP_PR = qname('p', 'nvCxnSpPr', NS.pml);\nconst NAME_C_NV_PR = qname('p', 'cNvPr', NS.pml);\nconst NAME_NV_PR = qname('p', 'nvPr', NS.pml);\nconst NAME_PH = qname('p', 'ph', NS.pml);\n// PresentationML defines its own `txBody` element inside `p:sp` (ECMA-376\n// Part 1 §19.3.1.51) — the wrapper is in the `p:` namespace, even though\n// the children (a:bodyPr, a:p, a:r, a:t) come from DrawingML.\nconst NAME_TX_BODY = qname('p', 'txBody', NS.pml);\nconst ATTR_ID = qname('', 'id', '');\nconst ATTR_NAME = qname('', 'name', '');\nconst ATTR_TYPE = qname('', 'type', '');\nconst ATTR_IDX = qname('', 'idx', '');\n\nconst NV_BY_KIND: Record<ShapeKind, ReturnType<typeof qname>> = {\n shape: NAME_NV_SP_PR,\n picture: NAME_NV_PIC_PR,\n group: NAME_NV_GRP_SP_PR,\n graphicFrame: NAME_NV_GRAPHIC_FRAME_PR,\n connector: NAME_NV_CXN_SP_PR,\n};\n\nconst classify = (element: XmlElement): ShapeKind | null => {\n if (element.name.namespaceURI !== NS.pml) return null;\n switch (element.name.localName) {\n case 'sp':\n return 'shape';\n case 'pic':\n return 'picture';\n case 'grpSp':\n return 'group';\n case 'graphicFrame':\n return 'graphicFrame';\n case 'cxnSp':\n return 'connector';\n default:\n return null;\n }\n};\n\nconst extractShape = (element: XmlElement, kind: ShapeKind): SlideShape => {\n const nvContainer = firstChildElement(element, NV_BY_KIND[kind]);\n let id = 0;\n let name = '';\n let placeholderType: string | null = null;\n let placeholderIdx: number | null = null;\n\n if (nvContainer !== null) {\n const cNvPr = firstChildElement(nvContainer, NAME_C_NV_PR);\n if (cNvPr !== null) {\n const idRaw = getAttrValue(cNvPr, ATTR_ID);\n if (idRaw !== null) id = Number.parseInt(idRaw, 10);\n const nameRaw = getAttrValue(cNvPr, ATTR_NAME);\n if (nameRaw !== null) name = nameRaw;\n }\n const nvPr = firstChildElement(nvContainer, NAME_NV_PR);\n if (nvPr !== null) {\n const ph = firstChildElement(nvPr, NAME_PH);\n if (ph !== null) {\n // <p:ph type=\"...\" idx=\"...\"/>; both attributes are optional. When\n // both are absent the shape is a placeholder with default semantics\n // (a body placeholder per the spec) — we mirror that with type=null\n // and let the caller resolve via the layout's same-idx slot.\n placeholderType = getAttrValue(ph, ATTR_TYPE);\n const idxRaw = getAttrValue(ph, ATTR_IDX);\n if (idxRaw !== null) placeholderIdx = Number.parseInt(idxRaw, 10);\n }\n }\n }\n\n let text = '';\n if (kind === 'shape') {\n const txBody = firstChildElement(element, NAME_TX_BODY);\n if (txBody !== null) text = textBodyText(txBody);\n }\n\n return { kind, id, name, placeholderType, placeholderIdx, text, element };\n};\n\nconst collectShapes = (spTree: XmlElement, out: SlideShape[], recurseIntoGroups: boolean): void => {\n for (const child of spTree.children) {\n if (child.kind !== 'element') continue;\n const kind = classify(child);\n if (kind === null) continue;\n out.push(extractShape(child, kind));\n if (kind === 'group' && recurseIntoGroups) {\n collectShapes(child, out, recurseIntoGroups);\n }\n }\n};\n\n/**\n * Reads the immediate child shapes of a `<p:grpSp>` (group shape)\n * without recursing further. Used by `getGroupChildren` on the public\n * surface to expose group contents to renderers.\n *\n * Throws if `element` isn't a `<p:grpSp>`.\n */\nexport const readGroupChildren = (element: XmlElement): SlideShape[] => {\n if (element.name.namespaceURI !== NS.pml || element.name.localName !== 'grpSp') {\n throw new Error(\n `readGroupChildren: expected <p:grpSp>, got <${element.name.prefix}:${element.name.localName}>`,\n );\n }\n const out: SlideShape[] = [];\n collectShapes(element, out, false);\n return out;\n};\n\n/**\n * Reads the shape tree from a slide / layout / master root element.\n * Exported so the sibling readers (`readSlideLayoutPart`,\n * `readSlideMasterPart`) can reuse it.\n */\nexport const readShapeTreeFromCsldRoot = (\n root: XmlElement,\n expectedLocalName: 'sld' | 'sldLayout' | 'sldMaster',\n options: { recurseIntoGroups?: boolean } = {},\n): { shapes: SlideShape[]; cSld: XmlElement } => {\n if (root.name.namespaceURI !== NS.pml || root.name.localName !== expectedLocalName) {\n throw new Error(\n `expected <p:${expectedLocalName}>, got <${root.name.prefix}:${root.name.localName}>`,\n );\n }\n const cSld = firstChildElement(root, NAME_CSLD);\n if (cSld === null) throw new Error(`<p:${expectedLocalName}>: missing <p:cSld>`);\n const spTree = firstChildElement(cSld, NAME_SP_TREE);\n if (spTree === null) throw new Error('<p:cSld>: missing <p:spTree>');\n const shapes: SlideShape[] = [];\n collectShapes(spTree, shapes, options.recurseIntoGroups ?? true);\n return { shapes, cSld };\n};\n\n/**\n * Parses a slide root element (`p:sld`) into the typed view above.\n *\n * `recurseIntoGroups` controls whether group descendants are flattened into\n * the returned `shapes` array. The default is `true` because most callers\n * just want a flat enumeration.\n */\nexport const readSlidePart = (\n root: XmlElement,\n options: { recurseIntoGroups?: boolean } = {},\n): SlidePart => {\n const { shapes } = readShapeTreeFromCsldRoot(root, 'sld', options);\n return { shapes, root };\n};\n\n/**\n * Returns the concatenated visible text of a slide. Useful for snapshot\n * tests and quick inspection.\n */\nexport const slideText = (slide: SlidePart, joiner = '\\n'): string =>\n slide.shapes\n .map((s) => s.text)\n .filter((t) => t.length > 0)\n .join(joiner);\n","// Read-only view over a slide-layout part (`/ppt/slideLayouts/slideLayoutN.xml`).\n//\n// ECMA-376 Part 1 §19.3.1.39 — `<p:sldLayout>` is the same shape as `<p:sld>`\n// (it wraps a `<p:cSld>` with a `<p:spTree>`) plus a layout-specific `type`\n// attribute and an optional `<p:cSld name=\"...\">` that user-visible code\n// looks at (PowerPoint shows it in the layout picker).\n//\n// Layouts inherit non-overridden placement and formatting from their slide\n// master; in turn, each slide inherits from its layout. We expose the raw\n// per-layout shape tree here; effective inheritance resolution belongs to\n// a higher layer that has the full graph.\n\nimport { NS, firstChildElement, getAttrValue, qname } from '../xml/index.ts';\nimport type { XmlElement } from '../xml/index.ts';\nimport { readShapeTreeFromCsldRoot, type SlideShape } from './slide-part.ts';\n\nconst NAME_CSLD = qname('p', 'cSld', NS.pml);\nconst ATTR_NAME = qname('', 'name', '');\nconst ATTR_TYPE = qname('', 'type', '');\n\n/**\n * Layout type token per ECMA-376 §19.7.15 `ST_SlideLayoutType`. Listed for\n * autocomplete; layouts in real templates sometimes use vendor-specific\n * tokens not in this enum, so the field stays a plain string at the API.\n */\nexport type SlideLayoutType =\n | 'title'\n | 'tx'\n | 'twoColTx'\n | 'tbl'\n | 'txAndChart'\n | 'chartAndTx'\n | 'dgm'\n | 'chart'\n | 'txAndClipArt'\n | 'clipArtAndTx'\n | 'titleOnly'\n | 'blank'\n | 'txAndObj'\n | 'objAndTx'\n | 'objOnly'\n | 'obj'\n | 'txAndMedia'\n | 'mediaAndTx'\n | 'objOverTx'\n | 'txOverObj'\n | 'txAndTwoObj'\n | 'twoObjAndTx'\n | 'twoObjOverTx'\n | 'fourObj'\n | 'vertTx'\n | 'clipArtAndVertTx'\n | 'vertTitleAndTx'\n | 'vertTitleAndTxOverChart'\n | 'twoObj'\n | 'objAndTwoObj'\n | 'twoObjAndObj'\n | 'cust'\n | 'secHead'\n | 'twoTxTwoObj'\n | 'objTx'\n | 'picTx';\n\nexport interface SlideLayoutPart {\n /** Human-visible layout name from `<p:cSld name=\"...\">`. */\n readonly name: string;\n /**\n * Layout type token. `null` when the attribute is absent — the spec\n * default in that case is `cust` (custom).\n */\n readonly layoutType: string | null;\n /** Shapes on the layout in document order, groups flattened. */\n readonly shapes: ReadonlyArray<SlideShape>;\n readonly root: XmlElement;\n}\n\n/** Parses a `<p:sldLayout>` root element. */\nexport const readSlideLayoutPart = (\n root: XmlElement,\n options: { recurseIntoGroups?: boolean } = {},\n): SlideLayoutPart => {\n const { shapes } = readShapeTreeFromCsldRoot(root, 'sldLayout', options);\n const cSld = firstChildElement(root, NAME_CSLD);\n const name = cSld !== null ? getAttrValue(cSld, ATTR_NAME) : null;\n const layoutType = getAttrValue(root, ATTR_TYPE);\n return {\n name: name ?? '',\n layoutType,\n shapes,\n root,\n };\n};\n","// Builds the XML payload for a new slide from scratch.\n//\n// PowerPoint's \"new slide from layout\" emits a minimal `<p:sld>` whose\n// shape tree contains only the placeholder stubs the layout exposes\n// (title, body, footer, etc.). Each stub carries a `<p:ph>` element with\n// the layout's same idx/type so the slide inherits geometry, fill, and\n// default text style from the layout. The stub's `<p:spPr/>` is empty\n// (no `<a:xfrm>`), and its `<p:txBody>` carries one empty `<a:p/>` so\n// the placeholder is mutable via `setText` immediately.\n//\n// We do NOT copy the layout shape itself — that would freeze the\n// inheritance and silently desync the slide from layout changes.\n\nimport {\n type XmlDocument,\n type XmlElement,\n NS,\n attr,\n elem,\n firstChildElement,\n getAttrValue,\n qname,\n text as textNode,\n} from '../xml/index.ts';\n\nconst NAME_SLD = qname('p', 'sld', NS.pml);\nconst NAME_CSLD = qname('p', 'cSld', NS.pml);\nconst NAME_SP_TREE = qname('p', 'spTree', NS.pml);\nconst NAME_NV_GRP_SP_PR = qname('p', 'nvGrpSpPr', NS.pml);\nconst NAME_C_NV_PR = qname('p', 'cNvPr', NS.pml);\nconst NAME_C_NV_GRP_SP_PR = qname('p', 'cNvGrpSpPr', NS.pml);\nconst NAME_NV_PR = qname('p', 'nvPr', NS.pml);\nconst NAME_GRP_SP_PR = qname('p', 'grpSpPr', NS.pml);\nconst NAME_SP = qname('p', 'sp', NS.pml);\nconst NAME_NV_SP_PR = qname('p', 'nvSpPr', NS.pml);\nconst NAME_C_NV_SP_PR = qname('p', 'cNvSpPr', NS.pml);\nconst NAME_SP_PR = qname('p', 'spPr', NS.pml);\nconst NAME_TX_BODY = qname('p', 'txBody', NS.pml);\nconst NAME_PH = qname('p', 'ph', NS.pml);\nconst NAME_BODY_PR = qname('a', 'bodyPr', NS.dml);\nconst NAME_LST_STYLE = qname('a', 'lstStyle', NS.dml);\nconst NAME_P = qname('a', 'p', NS.dml);\nconst NAME_SP_LOCKS = qname('a', 'spLocks', NS.dml);\nconst ATTR_ID = qname('', 'id', '');\nconst ATTR_NAME = qname('', 'name', '');\nconst ATTR_TYPE = qname('', 'type', '');\nconst ATTR_IDX = qname('', 'idx', '');\nconst ATTR_NO_GRP = qname('', 'noGrp', '');\n\n/**\n * Builds a `<p:sld>` document containing the canonical slide-root group\n * (id=1, name=\"\") and one placeholder stub per `<p:ph>` found on\n * `layoutSpTree`.\n *\n * The stubs reuse the layout's `<p:ph>` idx/type attributes verbatim, and\n * the names follow PowerPoint's `\"Title 1\"`, `\"Content Placeholder 2\"`\n * convention based on the placeholder type and an incrementing index.\n */\nexport const buildSlideFromLayout = (layoutSpTree: XmlElement): XmlDocument => {\n // Walk the layout's shape tree to find placeholders.\n const placeholders: Array<{ type: string | null; idx: string | null }> = [];\n for (const child of layoutSpTree.children) {\n if (child.kind !== 'element') continue;\n if (child.name.namespaceURI !== NS.pml || child.name.localName !== 'sp') continue;\n const nvSpPr = firstChildElement(child, NAME_NV_SP_PR);\n if (nvSpPr === null) continue;\n const nvPr = firstChildElement(nvSpPr, NAME_NV_PR);\n if (nvPr === null) continue;\n const ph = firstChildElement(nvPr, NAME_PH);\n if (ph === null) continue;\n placeholders.push({\n type: getAttrValue(ph, ATTR_TYPE),\n idx: getAttrValue(ph, ATTR_IDX),\n });\n }\n\n // Shape-id allocator: id=1 is the slide-root group, id=2+ are the\n // placeholder stubs. PowerPoint's emission order is `nvGrpSpPr` (root\n // group metadata) → `grpSpPr` (root group properties) → placeholder\n // shapes as siblings, so we mirror that.\n let nextShapeId = 2;\n const stubs: XmlElement[] = [];\n for (const ph of placeholders) {\n stubs.push(buildPlaceholderStub(nextShapeId, ph.type, ph.idx));\n nextShapeId++;\n }\n\n const spTree = elem(NAME_SP_TREE, {\n children: [buildNvGrpSpPr(1), buildGrpSpPr(), ...stubs],\n });\n const cSld = elem(NAME_CSLD, { children: [spTree] });\n const sld = elem(NAME_SLD, {\n prefixDecls: new Map([\n ['a', NS.dml],\n ['r', NS.officeDocRels],\n ['p', NS.pml],\n ]),\n children: [cSld],\n });\n return {\n kind: 'document',\n decl: { version: '1.0', encoding: 'UTF-8', standalone: 'yes' },\n prolog: [],\n root: sld,\n epilog: [],\n };\n};\n\n// `nvGrpSpPr` for the slide root group: id=1, name=\"\" (PowerPoint requires\n// the empty name; other writers' non-empty names get treated as quirky).\nconst buildNvGrpSpPr = (id: number): XmlElement =>\n elem(NAME_NV_GRP_SP_PR, {\n children: [\n elem(NAME_C_NV_PR, {\n attrs: [attr(ATTR_ID, String(id)), attr(ATTR_NAME, '')],\n }),\n elem(NAME_C_NV_GRP_SP_PR),\n elem(NAME_NV_PR),\n ],\n });\n\nconst buildGrpSpPr = (): XmlElement => elem(NAME_GRP_SP_PR);\n\n// Returns a placeholder-shape stub: <p:sp> with cNvPr, nvSpPr, ph, empty\n// spPr, and an empty txBody. Geometry, fill, and default style all flow\n// from the corresponding layout placeholder via inheritance.\nconst buildPlaceholderStub = (\n id: number,\n phType: string | null,\n phIdx: string | null,\n): XmlElement => {\n const phAttrs = [];\n if (phType !== null) phAttrs.push(attr(ATTR_TYPE, phType));\n if (phIdx !== null) phAttrs.push(attr(ATTR_IDX, phIdx));\n\n const ph = elem(NAME_PH, { attrs: phAttrs });\n const nvPr = elem(NAME_NV_PR, { children: [ph] });\n const cNvSpPr = elem(NAME_C_NV_SP_PR, {\n children: [elem(NAME_SP_LOCKS, { attrs: [attr(ATTR_NO_GRP, '1')] })],\n });\n const name = inferPlaceholderName(id, phType);\n const cNvPr = elem(NAME_C_NV_PR, {\n attrs: [attr(ATTR_ID, String(id)), attr(ATTR_NAME, name)],\n });\n const nvSpPr = elem(NAME_NV_SP_PR, { children: [cNvPr, cNvSpPr, nvPr] });\n const spPr = elem(NAME_SP_PR);\n const txBody = elem(NAME_TX_BODY, {\n children: [\n elem(NAME_BODY_PR),\n elem(NAME_LST_STYLE),\n elem(NAME_P, { children: [textNode('')] }),\n ],\n });\n return elem(NAME_SP, { children: [nvSpPr, spPr, txBody] });\n};\n\n/**\n * Maps a placeholder type to a human-readable name PowerPoint emits. The\n * `id` becomes part of the name to keep them unique within the slide.\n */\nconst inferPlaceholderName = (id: number, phType: string | null): string => {\n switch (phType) {\n case 'title':\n return `Title ${id - 1}`;\n case 'ctrTitle':\n return `Centered Title ${id - 1}`;\n case 'subTitle':\n return `Subtitle ${id - 1}`;\n case 'body':\n return `Content Placeholder ${id - 1}`;\n case 'pic':\n return `Picture Placeholder ${id - 1}`;\n case 'chart':\n return `Chart Placeholder ${id - 1}`;\n case 'tbl':\n return `Table Placeholder ${id - 1}`;\n case 'dt':\n return `Date Placeholder ${id - 1}`;\n case 'sldNum':\n return `Slide Number Placeholder ${id - 1}`;\n case 'ftr':\n return `Footer Placeholder ${id - 1}`;\n case 'hdr':\n return `Header Placeholder ${id - 1}`;\n default:\n return `Placeholder ${id - 1}`;\n }\n};\n","// Builds the XML element for a free-form text box (`<p:sp>` with\n// `txBox=\"1\"` on `cNvSpPr` and a `prstGeom prst=\"rect\"` shape).\n//\n// This is the simplest authoring shape: a rectangle with no fill or\n// outline, containing a single paragraph of text. Geometry comes from\n// the caller in EMU. Text properties beyond a single run are deferred to\n// future iterations.\n\nimport { emuCoordinate, emuExtent } from '../bounds.ts';\nimport { type XmlElement, NS, attr, elem, qname, text as textNode } from '../xml/index.ts';\n\nconst NAME_SP = qname('p', 'sp', NS.pml);\nconst NAME_NV_SP_PR = qname('p', 'nvSpPr', NS.pml);\nconst NAME_C_NV_PR = qname('p', 'cNvPr', NS.pml);\nconst NAME_C_NV_SP_PR = qname('p', 'cNvSpPr', NS.pml);\nconst NAME_NV_PR = qname('p', 'nvPr', NS.pml);\nconst NAME_SP_PR = qname('p', 'spPr', NS.pml);\nconst NAME_TX_BODY = qname('p', 'txBody', NS.pml);\nconst NAME_A_XFRM = qname('a', 'xfrm', NS.dml);\nconst NAME_OFF = qname('a', 'off', NS.dml);\nconst NAME_EXT = qname('a', 'ext', NS.dml);\nconst NAME_PRST_GEOM = qname('a', 'prstGeom', NS.dml);\nconst NAME_AV_LST = qname('a', 'avLst', NS.dml);\nconst NAME_NO_FILL = qname('a', 'noFill', NS.dml);\nconst NAME_BODY_PR = qname('a', 'bodyPr', NS.dml);\nconst NAME_LST_STYLE = qname('a', 'lstStyle', NS.dml);\nconst NAME_P = qname('a', 'p', NS.dml);\nconst NAME_R = qname('a', 'r', NS.dml);\nconst NAME_RPR = qname('a', 'rPr', NS.dml);\nconst NAME_T = qname('a', 't', NS.dml);\nconst ATTR_ID = qname('', 'id', '');\nconst ATTR_NAME = qname('', 'name', '');\nconst ATTR_TX_BOX = qname('', 'txBox', '');\nconst ATTR_X = qname('', 'x', '');\nconst ATTR_Y = qname('', 'y', '');\nconst ATTR_CX = qname('', 'cx', '');\nconst ATTR_CY = qname('', 'cy', '');\nconst ATTR_PRST = qname('', 'prst', '');\nconst ATTR_WRAP = qname('', 'wrap', '');\nconst ATTR_RTL_COL = qname('', 'rtlCol', '');\nconst ATTR_LANG = qname('', 'lang', '');\nconst ATTR_XML_SPACE = qname('xml', 'space', NS.xml);\n\nexport interface TextBoxOptions {\n /** Shape numeric id, unique within the slide. */\n id: number;\n /** Shape user-visible name. Defaults to `TextBox <id>`. */\n name?: string;\n /** Position (left edge), in EMU. */\n x: number;\n /** Position (top edge), in EMU. */\n y: number;\n /** Width, in EMU. */\n w: number;\n /** Height, in EMU. */\n h: number;\n /** The text content. Newlines are NOT split into paragraphs here; for\n * multi-paragraph text, set the body and then call `setText` on the\n * returned shape. */\n text: string;\n}\n\n/**\n * Returns a `<p:sp>` element representing a text-box shape positioned at\n * `(x, y)` with extent `(w, h)`. The shape carries a `txBox=\"1\"` marker\n * and a `prstGeom prst=\"rect\"` so PowerPoint renders it as a plain text\n * frame without fill or outline.\n */\nexport const buildTextBox = (opts: TextBoxOptions): XmlElement => {\n const name = opts.name ?? `TextBox ${opts.id}`;\n\n const cNvPr = elem(NAME_C_NV_PR, {\n attrs: [attr(ATTR_ID, String(opts.id)), attr(ATTR_NAME, name)],\n });\n const cNvSpPr = elem(NAME_C_NV_SP_PR, {\n attrs: [attr(ATTR_TX_BOX, '1')],\n });\n const nvPr = elem(NAME_NV_PR);\n const nvSpPr = elem(NAME_NV_SP_PR, { children: [cNvPr, cNvSpPr, nvPr] });\n\n // Round to whole EMU; fractional ST_Coordinate values corrupt the file.\n const off = elem(NAME_OFF, {\n attrs: [\n attr(ATTR_X, String(emuCoordinate(opts.x, 'addSlideTextBox: x'))),\n attr(ATTR_Y, String(emuCoordinate(opts.y, 'addSlideTextBox: y'))),\n ],\n });\n const ext = elem(NAME_EXT, {\n attrs: [\n attr(ATTR_CX, String(emuExtent(opts.w, 'addSlideTextBox: w'))),\n attr(ATTR_CY, String(emuExtent(opts.h, 'addSlideTextBox: h'))),\n ],\n });\n const xfrm = elem(NAME_A_XFRM, { children: [off, ext] });\n const prstGeom = elem(NAME_PRST_GEOM, {\n attrs: [attr(ATTR_PRST, 'rect')],\n children: [elem(NAME_AV_LST)],\n });\n const spPr = elem(NAME_SP_PR, {\n children: [xfrm, prstGeom, elem(NAME_NO_FILL)],\n });\n\n // Build one `<a:p>` per line of `opts.text`. Each `<a:t>` therefore\n // contains at most one line, so we never need `xml:space=\"preserve\"`\n // (the strict ECMA schema disallows that attribute on `<a:t>`, even\n // though PowerPoint sometimes emits it). Leading/trailing-space\n // preservation is handled by the bodyPr, not by xml:space.\n const lines = opts.text.split('\\n');\n const paragraphs: XmlElement[] = lines.map((line) => {\n const t = elem(NAME_T, {\n children: line.length > 0 ? [textNode(line)] : [],\n });\n const r = elem(NAME_R, {\n children: [elem(NAME_RPR, { attrs: [attr(ATTR_LANG, 'en-US')] }), t],\n });\n return elem(NAME_P, { children: [r] });\n });\n const bodyPr = elem(NAME_BODY_PR, {\n attrs: [attr(ATTR_WRAP, 'square'), attr(ATTR_RTL_COL, '0')],\n });\n const txBody = elem(NAME_TX_BODY, {\n children: [bodyPr, elem(NAME_LST_STYLE), ...paragraphs],\n });\n void ATTR_XML_SPACE;\n\n return elem(NAME_SP, { children: [nvSpPr, spPr, txBody] });\n};\n","// Builds a generic preset shape (`<p:sp>` with `<a:prstGeom prst=\"...\">`).\n//\n// Different from `text-box-builder` in two ways:\n// - No `txBox=\"1\"` on `<p:cNvSpPr>`; PowerPoint treats this as a regular\n// shape with optional text rather than a free-form text frame.\n// - The geometry preset is caller-chosen from the full ECMA-376\n// `ST_ShapeType` catalog (rect, ellipse, triangle, rightArrow, star5,\n// leftRightArrow, cloud, ...).\n//\n// Like `text-box-builder`, multi-line text splits on `\\n` into paragraphs\n// so each `<a:t>` holds a single line (strict schema friendly).\n\nimport { emuCoordinate, emuExtent } from '../bounds.ts';\nimport { type XmlElement, NS, attr, elem, qname, text as textNode } from '../xml/index.ts';\n\nconst NAME_SP = qname('p', 'sp', NS.pml);\nconst NAME_NV_SP_PR = qname('p', 'nvSpPr', NS.pml);\nconst NAME_C_NV_PR = qname('p', 'cNvPr', NS.pml);\nconst NAME_C_NV_SP_PR = qname('p', 'cNvSpPr', NS.pml);\nconst NAME_NV_PR = qname('p', 'nvPr', NS.pml);\nconst NAME_SP_PR = qname('p', 'spPr', NS.pml);\nconst NAME_TX_BODY = qname('p', 'txBody', NS.pml);\nconst NAME_A_XFRM = qname('a', 'xfrm', NS.dml);\nconst NAME_OFF = qname('a', 'off', NS.dml);\nconst NAME_EXT = qname('a', 'ext', NS.dml);\nconst NAME_PRST_GEOM = qname('a', 'prstGeom', NS.dml);\nconst NAME_AV_LST = qname('a', 'avLst', NS.dml);\nconst NAME_BODY_PR = qname('a', 'bodyPr', NS.dml);\nconst NAME_LST_STYLE = qname('a', 'lstStyle', NS.dml);\nconst NAME_P = qname('a', 'p', NS.dml);\nconst NAME_R = qname('a', 'r', NS.dml);\nconst NAME_RPR = qname('a', 'rPr', NS.dml);\nconst NAME_T = qname('a', 't', NS.dml);\nconst ATTR_ID = qname('', 'id', '');\nconst ATTR_NAME = qname('', 'name', '');\nconst ATTR_X = qname('', 'x', '');\nconst ATTR_Y = qname('', 'y', '');\nconst ATTR_CX = qname('', 'cx', '');\nconst ATTR_CY = qname('', 'cy', '');\nconst ATTR_PRST = qname('', 'prst', '');\nconst ATTR_WRAP = qname('', 'wrap', '');\nconst ATTR_RTL_COL = qname('', 'rtlCol', '');\nconst ATTR_LANG = qname('', 'lang', '');\nconst ATTR_ANCHOR = qname('', 'anchor', '');\nconst ATTR_ANCHOR_CTR = qname('', 'anchorCtr', '');\n\n/**\n * Common ECMA-376 `ST_ShapeType` preset tokens. The schema accepts ~180\n * presets; the union below covers the ones authoring scripts reach for\n * most often. Pass any string to `addShape({ preset })` to use a token\n * not enumerated here.\n */\nexport type PresetShape =\n | 'rect'\n | 'roundRect'\n | 'ellipse'\n | 'triangle'\n | 'rtTriangle'\n | 'diamond'\n | 'parallelogram'\n | 'trapezoid'\n | 'pentagon'\n | 'hexagon'\n | 'heptagon'\n | 'octagon'\n | 'decagon'\n | 'star4'\n | 'star5'\n | 'star6'\n | 'star7'\n | 'star8'\n | 'star10'\n | 'star12'\n | 'star16'\n | 'star24'\n | 'star32'\n | 'rightArrow'\n | 'leftArrow'\n | 'upArrow'\n | 'downArrow'\n | 'leftRightArrow'\n | 'upDownArrow'\n | 'bentArrow'\n | 'curvedRightArrow'\n | 'curvedLeftArrow'\n | 'curvedUpArrow'\n | 'curvedDownArrow'\n | 'cloud'\n | 'heart'\n | 'lightningBolt'\n | 'sun'\n | 'moon'\n | 'bracketPair'\n | 'bracePair'\n | 'leftBracket'\n | 'rightBracket'\n | 'leftBrace'\n | 'rightBrace'\n | 'cube'\n | 'can'\n | 'donut'\n | 'noSmoking'\n | 'plus'\n // ECMA-376 ST_ShapeType spells the math operators `math*`; the bare\n // `minus`/`mult`/`div`/`equal`/`notEqual` are not in the enum and emitted a\n // `prstGeom` PowerPoint silently dropped (the shape vanished on open).\n | 'mathPlus'\n | 'mathMinus'\n | 'mathMultiply'\n | 'mathDivide'\n | 'mathEqual'\n | 'mathNotEqual';\n\nexport interface ShapeOptions {\n id: number;\n name?: string;\n preset: PresetShape | string;\n x: number;\n y: number;\n w: number;\n h: number;\n /**\n * Optional text content for the shape. Newlines split into paragraphs;\n * to add formatting / bullets afterwards, call `setTextFormat` /\n * `setBullets` on the returned shape.\n */\n text?: string;\n /**\n * Vertical anchor of any text body (`ST_TextAnchoringType`: `t` top,\n * `ctr` middle, `b` bottom). Defaults to `'ctr'` so preset shapes render\n * with centered text, which is what PowerPoint does when you \"insert shape\n * → type text\". For horizontal alignment, set the paragraph alignment via\n * `setShapeAlignment` / `setParagraphAlignment` after creating the shape.\n */\n textAnchor?: 'ctr' | 't' | 'b';\n}\n\nconst buildTextBody = (\n text: string | undefined,\n anchor: ShapeOptions['textAnchor'],\n): XmlElement | null => {\n if (text === undefined) return null;\n const bodyPrAttrs = [attr(ATTR_WRAP, 'square'), attr(ATTR_RTL_COL, '0')];\n if (anchor === 'ctr' || anchor === 't' || anchor === 'b') {\n bodyPrAttrs.push(attr(ATTR_ANCHOR, anchor));\n }\n if (anchor === 'ctr' || anchor === undefined) {\n bodyPrAttrs.push(attr(ATTR_ANCHOR_CTR, '1'));\n }\n const bodyPr = elem(NAME_BODY_PR, { attrs: bodyPrAttrs });\n const paragraphs = text.split('\\n').map((line) => {\n const t = elem(NAME_T, { children: line.length > 0 ? [textNode(line)] : [] });\n const r = elem(NAME_R, {\n children: [elem(NAME_RPR, { attrs: [attr(ATTR_LANG, 'en-US')] }), t],\n });\n return elem(NAME_P, { children: [r] });\n });\n return elem(NAME_TX_BODY, {\n children: [bodyPr, elem(NAME_LST_STYLE), ...paragraphs],\n });\n};\n\nexport const buildShape = (opts: ShapeOptions): XmlElement => {\n const name = opts.name ?? `${opts.preset} ${opts.id}`;\n const anchor = opts.textAnchor ?? 'ctr';\n\n const cNvPr = elem(NAME_C_NV_PR, {\n attrs: [attr(ATTR_ID, String(opts.id)), attr(ATTR_NAME, name)],\n });\n const cNvSpPr = elem(NAME_C_NV_SP_PR);\n const nvSpPr = elem(NAME_NV_SP_PR, {\n children: [cNvPr, cNvSpPr, elem(NAME_NV_PR)],\n });\n\n // EMU coordinates are integers (ST_Coordinate / xsd:long). Round on the way\n // out so a fractional value from EMU arithmetic (e.g. an `as Emu` cast on a\n // computed fit/translate) can't reach the XML and trip PowerPoint's repair.\n const off = elem(NAME_OFF, {\n attrs: [\n attr(ATTR_X, String(emuCoordinate(opts.x, 'addSlideShape: x'))),\n attr(ATTR_Y, String(emuCoordinate(opts.y, 'addSlideShape: y'))),\n ],\n });\n const ext = elem(NAME_EXT, {\n attrs: [\n attr(ATTR_CX, String(emuExtent(opts.w, 'addSlideShape: w'))),\n attr(ATTR_CY, String(emuExtent(opts.h, 'addSlideShape: h'))),\n ],\n });\n const xfrm = elem(NAME_A_XFRM, { children: [off, ext] });\n const prstGeom = elem(NAME_PRST_GEOM, {\n attrs: [attr(ATTR_PRST, opts.preset)],\n children: [elem(NAME_AV_LST)],\n });\n const spPr = elem(NAME_SP_PR, { children: [xfrm, prstGeom] });\n\n const children: XmlElement[] = [nvSpPr, spPr];\n const txBody = buildTextBody(opts.text, anchor);\n if (txBody) children.push(txBody);\n\n return elem(NAME_SP, { children });\n};\n","// Builds a straight-line connector shape (`<p:cxnSp>` with\n// `<a:prstGeom prst=\"line\">`).\n//\n// PPTX represents a connector as a shape whose bounding box has its\n// upper-left corner at `(min(x1,x2), min(y1,y2))` and extent of\n// `(|x2-x1|, |y2-y1|)`. Direction (which end is \"from\" and which is\n// \"to\") is captured via `flipH` / `flipV` on the xfrm.\n\nimport { emuCoordinate, emuExtent, lineWidthEmu } from '../bounds.ts';\nimport { type XmlElement, NS, attr, elem, qname } from '../xml/index.ts';\nimport { buildColorElement } from '../drawingml/color.ts';\n\nconst NAME_CXN_SP = qname('p', 'cxnSp', NS.pml);\nconst NAME_NV_CXN_SP_PR = qname('p', 'nvCxnSpPr', NS.pml);\nconst NAME_C_NV_PR = qname('p', 'cNvPr', NS.pml);\nconst NAME_C_NV_CXN_SP_PR = qname('p', 'cNvCxnSpPr', NS.pml);\nconst NAME_NV_PR = qname('p', 'nvPr', NS.pml);\nconst NAME_SP_PR = qname('p', 'spPr', NS.pml);\nconst NAME_A_XFRM = qname('a', 'xfrm', NS.dml);\nconst NAME_OFF = qname('a', 'off', NS.dml);\nconst NAME_EXT = qname('a', 'ext', NS.dml);\nconst NAME_PRST_GEOM = qname('a', 'prstGeom', NS.dml);\nconst NAME_AV_LST = qname('a', 'avLst', NS.dml);\nconst NAME_LN = qname('a', 'ln', NS.dml);\nconst NAME_SOLID_FILL = qname('a', 'solidFill', NS.dml);\nconst NAME_STYLE = qname('p', 'style', NS.pml);\nconst NAME_LN_REF = qname('a', 'lnRef', NS.dml);\nconst NAME_FILL_REF = qname('a', 'fillRef', NS.dml);\nconst NAME_EFFECT_REF = qname('a', 'effectRef', NS.dml);\nconst NAME_FONT_REF = qname('a', 'fontRef', NS.dml);\nconst NAME_SCHEME_CLR = qname('a', 'schemeClr', NS.dml);\nconst ATTR_IDX = qname('', 'idx', '');\nconst ATTR_VAL = qname('', 'val', '');\nconst ATTR_ID = qname('', 'id', '');\nconst ATTR_NAME = qname('', 'name', '');\nconst ATTR_X = qname('', 'x', '');\nconst ATTR_Y = qname('', 'y', '');\nconst ATTR_CX = qname('', 'cx', '');\nconst ATTR_CY = qname('', 'cy', '');\nconst ATTR_PRST = qname('', 'prst', '');\nconst ATTR_W = qname('', 'w', '');\nconst ATTR_FLIP_H = qname('', 'flipH', '');\nconst ATTR_FLIP_V = qname('', 'flipV', '');\n\nexport interface ConnectorOptions {\n id: number;\n name?: string;\n /** Start point in EMU. */\n from: { x: number; y: number };\n /** End point in EMU. */\n to: { x: number; y: number };\n /**\n * Line color. Same accepted forms as `setFill` — `#RRGGBB`, scheme\n * tokens, etc. When omitted PowerPoint applies the layout's default\n * line color.\n */\n color?: string;\n /** Line width in EMU. PowerPoint's hairline default is `9525` (0.75pt). */\n widthEmu?: number;\n}\n\n/** Returns a `<p:cxnSp>` straight-line connector. */\nexport const buildConnector = (opts: ConnectorOptions): XmlElement => {\n const name = opts.name ?? `Straight Connector ${opts.id}`;\n\n const cNvPr = elem(NAME_C_NV_PR, {\n attrs: [attr(ATTR_ID, String(opts.id)), attr(ATTR_NAME, name)],\n });\n const cNvCxnSpPr = elem(NAME_C_NV_CXN_SP_PR);\n const nvCxnSpPr = elem(NAME_NV_CXN_SP_PR, {\n children: [cNvPr, cNvCxnSpPr, elem(NAME_NV_PR)],\n });\n\n const x = Math.min(opts.from.x, opts.to.x);\n const y = Math.min(opts.from.y, opts.to.y);\n const cx = Math.abs(opts.to.x - opts.from.x);\n const cy = Math.abs(opts.to.y - opts.from.y);\n const flipH = opts.from.x > opts.to.x;\n const flipV = opts.from.y > opts.to.y;\n\n const xfrmAttrs = [];\n if (flipH) xfrmAttrs.push(attr(ATTR_FLIP_H, '1'));\n if (flipV) xfrmAttrs.push(attr(ATTR_FLIP_V, '1'));\n const xfrm = elem(NAME_A_XFRM, {\n attrs: xfrmAttrs,\n children: [\n // Round to whole EMU; fractional ST_Coordinate values corrupt the file.\n elem(NAME_OFF, {\n attrs: [\n attr(ATTR_X, String(emuCoordinate(x, 'addSlideLine: x'))),\n attr(ATTR_Y, String(emuCoordinate(y, 'addSlideLine: y'))),\n ],\n }),\n elem(NAME_EXT, {\n attrs: [\n attr(ATTR_CX, String(emuExtent(cx, 'addSlideLine: width'))),\n attr(ATTR_CY, String(emuExtent(cy, 'addSlideLine: height'))),\n ],\n }),\n ],\n });\n const prstGeom = elem(NAME_PRST_GEOM, {\n attrs: [attr(ATTR_PRST, 'line')],\n children: [elem(NAME_AV_LST)],\n });\n\n const hasExplicitLine = opts.color !== undefined || opts.widthEmu !== undefined;\n const spPrChildren: XmlElement[] = [xfrm, prstGeom];\n if (hasExplicitLine) {\n const ln = elem(NAME_LN, {\n attrs:\n opts.widthEmu !== undefined\n ? [attr(ATTR_W, String(lineWidthEmu(opts.widthEmu, 'addSlideLine: widthEmu')))]\n : [],\n children:\n opts.color !== undefined\n ? [elem(NAME_SOLID_FILL, { children: [buildColorElement(opts.color)] })]\n : [],\n });\n spPrChildren.push(ln);\n }\n const spPr = elem(NAME_SP_PR, { children: spPrChildren });\n\n const children: XmlElement[] = [nvCxnSpPr, spPr];\n // A connector is a stroke-only open path. With no explicit <a:ln> AND no\n // <p:style>, PowerPoint has no outline to draw and the line is invisible.\n // Emit PowerPoint's default connector style (lnRef idx=\"1\" → the theme's\n // first line style in accent1) so an unstyled line still renders.\n if (!hasExplicitLine) {\n const styleRef = (name: typeof NAME_LN_REF, idx: string, clr: string): XmlElement =>\n elem(name, {\n attrs: [attr(ATTR_IDX, idx)],\n children: [elem(NAME_SCHEME_CLR, { attrs: [attr(ATTR_VAL, clr)] })],\n });\n children.push(\n elem(NAME_STYLE, {\n children: [\n styleRef(NAME_LN_REF, '1', 'accent1'),\n styleRef(NAME_FILL_REF, '0', 'accent1'),\n styleRef(NAME_EFFECT_REF, '0', 'accent1'),\n styleRef(NAME_FONT_REF, 'minor', 'tx1'),\n ],\n }),\n );\n }\n\n return elem(NAME_CXN_SP, { children });\n};\n","// Builds a group shape (`<p:grpSp>`) that wraps already-built shape-tree\n// children (`<p:sp>` / `<p:pic>` / `<p:cxnSp>` / `<p:graphicFrame>` /\n// nested `<p:grpSp>`) under a single transform.\n//\n// `<a:chOff>` / `<a:chExt>` define the coordinate space the children's own\n// `<a:xfrm>` values live in. At creation time the children already carry\n// real slide-space coordinates, so the child space is set 1:1 with the\n// outer `<a:off>` / `<a:ext>` (`chOff == off`, `chExt == ext`) — the same\n// convention PowerPoint itself uses right after a fresh \"Group\" action,\n// before the group is subsequently moved or resized.\n\nimport { emuCoordinate, emuExtent } from '../bounds.ts';\nimport { type XmlElement, NS, attr, elem, qname } from '../xml/index.ts';\n\nconst NAME_GRP_SP = qname('p', 'grpSp', NS.pml);\nconst NAME_NV_GRP_SP_PR = qname('p', 'nvGrpSpPr', NS.pml);\nconst NAME_C_NV_PR = qname('p', 'cNvPr', NS.pml);\nconst NAME_C_NV_GRP_SP_PR = qname('p', 'cNvGrpSpPr', NS.pml);\nconst NAME_NV_PR = qname('p', 'nvPr', NS.pml);\nconst NAME_GRP_SP_PR = qname('p', 'grpSpPr', NS.pml);\nconst NAME_A_XFRM = qname('a', 'xfrm', NS.dml);\nconst NAME_OFF = qname('a', 'off', NS.dml);\nconst NAME_EXT = qname('a', 'ext', NS.dml);\nconst NAME_CH_OFF = qname('a', 'chOff', NS.dml);\nconst NAME_CH_EXT = qname('a', 'chExt', NS.dml);\nconst ATTR_ID = qname('', 'id', '');\nconst ATTR_NAME = qname('', 'name', '');\nconst ATTR_X = qname('', 'x', '');\nconst ATTR_Y = qname('', 'y', '');\nconst ATTR_CX = qname('', 'cx', '');\nconst ATTR_CY = qname('', 'cy', '');\n\nexport interface GroupOptions {\n id: number;\n name?: string;\n /** Slide-space bounds (EMU) — the union of the grouped children's bounds. */\n x: number;\n y: number;\n w: number;\n h: number;\n /** Already-built shape-tree elements to nest inside the group. */\n children: ReadonlyArray<XmlElement>;\n}\n\n/** Returns a `<p:grpSp>` wrapping `opts.children` under one transform. */\nexport const buildGroup = (opts: GroupOptions): XmlElement => {\n const name = opts.name ?? `Group ${opts.id}`;\n\n const cNvPr = elem(NAME_C_NV_PR, {\n attrs: [attr(ATTR_ID, String(opts.id)), attr(ATTR_NAME, name)],\n });\n const nvGrpSpPr = elem(NAME_NV_GRP_SP_PR, {\n children: [cNvPr, elem(NAME_C_NV_GRP_SP_PR), elem(NAME_NV_PR)],\n });\n\n const x = emuCoordinate(opts.x, 'groupShapes: x');\n const y = emuCoordinate(opts.y, 'groupShapes: y');\n const cx = emuExtent(opts.w, 'groupShapes: w');\n const cy = emuExtent(opts.h, 'groupShapes: h');\n\n const xfrm = elem(NAME_A_XFRM, {\n children: [\n elem(NAME_OFF, { attrs: [attr(ATTR_X, String(x)), attr(ATTR_Y, String(y))] }),\n elem(NAME_EXT, { attrs: [attr(ATTR_CX, String(cx)), attr(ATTR_CY, String(cy))] }),\n elem(NAME_CH_OFF, { attrs: [attr(ATTR_X, String(x)), attr(ATTR_Y, String(y))] }),\n elem(NAME_CH_EXT, { attrs: [attr(ATTR_CX, String(cx)), attr(ATTR_CY, String(cy))] }),\n ],\n });\n const grpSpPr = elem(NAME_GRP_SP_PR, { children: [xfrm] });\n\n return elem(NAME_GRP_SP, { children: [nvGrpSpPr, grpSpPr, ...opts.children] });\n};\n","// Builds the XML element for a picture shape (`<p:pic>`).\n//\n// PowerPoint emits pictures with this skeleton:\n//\n// <p:pic>\n// <p:nvPicPr>\n// <p:cNvPr id=\"X\" name=\"Picture X\"/>\n// <p:cNvPicPr><a:picLocks noChangeAspect=\"1\"/></p:cNvPicPr>\n// <p:nvPr/>\n// </p:nvPicPr>\n// <p:blipFill>\n// <a:blip r:embed=\"rIdN\"/>\n// <a:stretch><a:fillRect/></a:stretch>\n// </p:blipFill>\n// <p:spPr>\n// <a:xfrm><a:off x y/><a:ext cx cy/></a:xfrm>\n// <a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom>\n// </p:spPr>\n// </p:pic>\n//\n// The `r:embed` rId is allocated by the caller and must already exist as\n// a relationship on the slide's `.rels` part pointing at a media part.\n\nimport { emuCoordinate, emuExtent } from '../bounds.ts';\nimport { type XmlElement, NS, attr, elem, qname } from '../xml/index.ts';\n\nconst NAME_PIC = qname('p', 'pic', NS.pml);\nconst NAME_NV_PIC_PR = qname('p', 'nvPicPr', NS.pml);\nconst NAME_C_NV_PR = qname('p', 'cNvPr', NS.pml);\nconst NAME_C_NV_PIC_PR = qname('p', 'cNvPicPr', NS.pml);\nconst NAME_NV_PR = qname('p', 'nvPr', NS.pml);\nconst NAME_BLIP_FILL = qname('p', 'blipFill', NS.pml);\nconst NAME_BLIP = qname('a', 'blip', NS.dml);\nconst NAME_STRETCH = qname('a', 'stretch', NS.dml);\nconst NAME_FILL_RECT = qname('a', 'fillRect', NS.dml);\nconst NAME_SP_PR = qname('p', 'spPr', NS.pml);\nconst NAME_A_XFRM = qname('a', 'xfrm', NS.dml);\nconst NAME_OFF = qname('a', 'off', NS.dml);\nconst NAME_EXT = qname('a', 'ext', NS.dml);\nconst NAME_PRST_GEOM = qname('a', 'prstGeom', NS.dml);\nconst NAME_AV_LST = qname('a', 'avLst', NS.dml);\nconst NAME_PIC_LOCKS = qname('a', 'picLocks', NS.dml);\nconst ATTR_ID = qname('', 'id', '');\nconst ATTR_NAME = qname('', 'name', '');\nconst ATTR_X = qname('', 'x', '');\nconst ATTR_Y = qname('', 'y', '');\nconst ATTR_CX = qname('', 'cx', '');\nconst ATTR_CY = qname('', 'cy', '');\nconst ATTR_PRST = qname('', 'prst', '');\nconst ATTR_R_EMBED = qname('r', 'embed', NS.officeDocRels);\nconst ATTR_NO_CHANGE_ASPECT = qname('', 'noChangeAspect', '');\n\nexport interface PictureOptions {\n id: number;\n name?: string;\n rEmbed: string;\n x: number;\n y: number;\n w: number;\n h: number;\n /** When true, emits `<a:picLocks noChangeAspect=\"1\"/>`. PowerPoint sets\n * this for pictures inserted via \"Insert > Picture\" but not for ones\n * dropped onto the canvas; default true to mirror the common case. */\n lockAspect?: boolean;\n}\n\n/** Returns a `<p:pic>` element ready to be appended to a slide's `<p:spTree>`. */\nexport const buildPicture = (opts: PictureOptions): XmlElement => {\n const name = opts.name ?? `Picture ${opts.id}`;\n const lockAspect = opts.lockAspect ?? true;\n\n const picLocks = elem(NAME_PIC_LOCKS, {\n attrs: lockAspect ? [attr(ATTR_NO_CHANGE_ASPECT, '1')] : [],\n });\n const cNvPicPr = elem(NAME_C_NV_PIC_PR, { children: [picLocks] });\n const cNvPr = elem(NAME_C_NV_PR, {\n attrs: [attr(ATTR_ID, String(opts.id)), attr(ATTR_NAME, name)],\n });\n const nvPr = elem(NAME_NV_PR);\n const nvPicPr = elem(NAME_NV_PIC_PR, { children: [cNvPr, cNvPicPr, nvPr] });\n\n const blip = elem(NAME_BLIP, { attrs: [attr(ATTR_R_EMBED, opts.rEmbed)] });\n const stretch = elem(NAME_STRETCH, { children: [elem(NAME_FILL_RECT)] });\n const blipFill = elem(NAME_BLIP_FILL, { children: [blip, stretch] });\n\n // Round to whole EMU — `fit: 'contain'` scaling produces fractional offsets\n // (`as Emu` cast), and fractional ST_Coordinate values corrupt the file.\n const off = elem(NAME_OFF, {\n attrs: [\n attr(ATTR_X, String(emuCoordinate(opts.x, 'addSlideImage: x'))),\n attr(ATTR_Y, String(emuCoordinate(opts.y, 'addSlideImage: y'))),\n ],\n });\n const ext = elem(NAME_EXT, {\n attrs: [\n attr(ATTR_CX, String(emuExtent(opts.w, 'addSlideImage: w'))),\n attr(ATTR_CY, String(emuExtent(opts.h, 'addSlideImage: h'))),\n ],\n });\n const xfrm = elem(NAME_A_XFRM, { children: [off, ext] });\n const prstGeom = elem(NAME_PRST_GEOM, {\n attrs: [attr(ATTR_PRST, 'rect')],\n children: [elem(NAME_AV_LST)],\n });\n const spPr = elem(NAME_SP_PR, { children: [xfrm, prstGeom] });\n\n return elem(NAME_PIC, { children: [nvPicPr, blipFill, spPr] });\n};\n","// Builds a table inside a graphic frame.\n//\n// PPTX wraps tables in `<p:graphicFrame>` whose `<a:graphicData>` carries\n// the `<a:tbl>` payload. ECMA-376 Part 1 §19.3.1.21 (CT_GraphicalObjectFrame)\n// + §21.1.3.13 (CT_Table). At this phase we expose plain cells with\n// default styling; cell-level fill / alignment / span lands when the next\n// feature batch needs them.\n//\n// Column widths and row heights are in EMU. When the caller omits widths,\n// we divide the total width equally; same for heights.\n\nimport { emuCoordinate, emuExtent, normalizeGuid } from '../bounds.ts';\nimport { type XmlElement, NS, attr, elem, qname, text as textNode } from '../xml/index.ts';\n\nconst TABLE_URI = 'http://schemas.openxmlformats.org/drawingml/2006/table';\n\n// PowerPoint's \"No Style, Table Grid\" built-in. Every PowerPoint deck (and\n// PptxGenJS, and our own template fixtures) ships this GUID as the\n// `tableStyles.xml` default. Emitting it as the table's `<a:tableStyleId>`\n// is what makes a table resolve to a clean ruled grid instead of rendering\n// unstyled — without it, the `firstRow` / `bandRow` flags have no style to\n// resolve against and PowerPoint paints a borderless, broken-looking block.\n// The matching `tableStyles.xml` part is shipped by `buildBlankDeck`.\nconst DEFAULT_TABLE_STYLE_ID = '{5C22544A-7EE6-4342-B048-85BDC9FD1C3A}';\n\nconst NAME_GRAPHIC_FRAME = qname('p', 'graphicFrame', NS.pml);\nconst NAME_NV_GRAPHIC_FRAME_PR = qname('p', 'nvGraphicFramePr', NS.pml);\nconst NAME_C_NV_PR = qname('p', 'cNvPr', NS.pml);\nconst NAME_C_NV_GRAPHIC_FRAME_PR = qname('p', 'cNvGraphicFramePr', NS.pml);\nconst NAME_GRAPHIC_FRAME_LOCKS = qname('a', 'graphicFrameLocks', NS.dml);\nconst NAME_NV_PR = qname('p', 'nvPr', NS.pml);\nconst NAME_P_XFRM = qname('p', 'xfrm', NS.pml);\nconst NAME_OFF = qname('a', 'off', NS.dml);\nconst NAME_EXT = qname('a', 'ext', NS.dml);\nconst NAME_GRAPHIC = qname('a', 'graphic', NS.dml);\nconst NAME_GRAPHIC_DATA = qname('a', 'graphicData', NS.dml);\nconst NAME_TBL = qname('a', 'tbl', NS.dml);\nconst NAME_TBL_PR = qname('a', 'tblPr', NS.dml);\nconst NAME_TABLE_STYLE_ID = qname('a', 'tableStyleId', NS.dml);\nconst NAME_TBL_GRID = qname('a', 'tblGrid', NS.dml);\nconst NAME_GRID_COL = qname('a', 'gridCol', NS.dml);\nconst NAME_TR = qname('a', 'tr', NS.dml);\nconst NAME_TC = qname('a', 'tc', NS.dml);\nconst NAME_TC_PR = qname('a', 'tcPr', NS.dml);\nconst NAME_TX_BODY = qname('a', 'txBody', NS.dml);\nconst NAME_BODY_PR = qname('a', 'bodyPr', NS.dml);\nconst NAME_LST_STYLE = qname('a', 'lstStyle', NS.dml);\nconst NAME_P = qname('a', 'p', NS.dml);\nconst NAME_R = qname('a', 'r', NS.dml);\nconst NAME_RPR = qname('a', 'rPr', NS.dml);\nconst NAME_SOLID_FILL = qname('a', 'solidFill', NS.dml);\nconst NAME_SRGB_CLR = qname('a', 'srgbClr', NS.dml);\nconst NAME_T = qname('a', 't', NS.dml);\nconst NAME_PPR = qname('a', 'pPr', NS.dml);\nconst NAME_BU_NONE = qname('a', 'buNone', NS.dml);\nconst ATTR_VAL = qname('', 'val', '');\nconst ATTR_MAR_L = qname('', 'marL', '');\nconst ATTR_MAR_R = qname('', 'marR', '');\nconst ATTR_MAR_T = qname('', 'marT', '');\nconst ATTR_MAR_B = qname('', 'marB', '');\nconst ATTR_INDENT = qname('', 'indent', '');\nconst ATTR_ID = qname('', 'id', '');\nconst ATTR_NAME = qname('', 'name', '');\nconst ATTR_NO_GRP = qname('', 'noGrp', '');\nconst ATTR_X = qname('', 'x', '');\nconst ATTR_Y = qname('', 'y', '');\nconst ATTR_CX = qname('', 'cx', '');\nconst ATTR_CY = qname('', 'cy', '');\nconst ATTR_URI = qname('', 'uri', '');\nconst ATTR_W = qname('', 'w', '');\nconst ATTR_H = qname('', 'h', '');\nconst ATTR_FIRST_ROW = qname('', 'firstRow', '');\nconst ATTR_BAND_ROW = qname('', 'bandRow', '');\nconst ATTR_LANG = qname('', 'lang', '');\n\nexport interface TableOptions {\n id: number;\n name?: string;\n x: number;\n y: number;\n w: number;\n h: number;\n /** Row-major cell contents. Each row must have the same length. */\n rows: ReadonlyArray<ReadonlyArray<string>>;\n /** Column widths in EMU. Defaults to equal distribution of `w`. */\n colWidths?: ReadonlyArray<number>;\n /** Row heights in EMU. Defaults to equal distribution of `h`. */\n rowHeights?: ReadonlyArray<number>;\n /** Emit `firstRow=\"1\"` so the theme styles the header row. Default true. */\n firstRow?: boolean;\n /** Emit `bandRow=\"1\"` so alternating rows get banded shading. Default true. */\n bandRow?: boolean;\n /**\n * Table-style GUID written to `<a:tblPr><a:tableStyleId>`. Defaults to\n * PowerPoint's \"No Style, Table Grid\" so the table resolves to a clean\n * ruled grid in every renderer that ships the built-in styles.\n */\n styleId?: string;\n /**\n * `#RRGGBB` baked onto every cell's run as an explicit `<a:solidFill>`.\n * Without it, cells fall back to the `tx1` token, which a deck with an\n * inverted color map paints the same as the background (invisible text).\n * The caller resolves the deck's body-text color and passes it here.\n */\n textColorHex?: string;\n}\n\n// `<a:rPr>` with the run's language and, when a color is baked in, an explicit\n// solid fill so the cell text doesn't fall through to the theme's `tx1` token.\nconst buildCellRunProps = (textColorHex: string | undefined): XmlElement => {\n const langAttr = attr(ATTR_LANG, 'en-US');\n if (textColorHex === undefined) return elem(NAME_RPR, { attrs: [langAttr] });\n const hex = textColorHex.startsWith('#') ? textColorHex.slice(1) : textColorHex;\n const solidFill = elem(NAME_SOLID_FILL, {\n children: [elem(NAME_SRGB_CLR, { attrs: [attr(ATTR_VAL, hex.toUpperCase())] })],\n });\n return elem(NAME_RPR, { attrs: [langAttr], children: [solidFill] });\n};\n\n// `<a:pPr marL=\"0\" indent=\"0\"><a:buNone/></a:pPr>` suppresses any inherited\n// list bullet on the cell paragraph — what PowerPoint and PptxGenJS both emit.\n// Renders the same as omitting it (table cells inherit no bullet), but makes the\n// cell self-describing.\nconst buildCellParagraph = (line: string, textColorHex: string | undefined): XmlElement => {\n const pPr = elem(NAME_PPR, {\n attrs: [attr(ATTR_MAR_L, '0'), attr(ATTR_INDENT, '0')],\n children: [elem(NAME_BU_NONE)],\n });\n // `<a:t>` is type xsd:string and cannot carry attributes — xml:space in\n // particular is schema-invalid here. xsd:string preserves whitespace by\n // default, so leading/trailing spaces and tabs survive without the hint.\n const t = elem(NAME_T, { children: line.length > 0 ? [textNode(line)] : [] });\n const r = elem(NAME_R, { children: [buildCellRunProps(textColorHex), t] });\n return elem(NAME_P, { children: [pPr, r] });\n};\n\nconst buildTextCellBody = (value: string, textColorHex: string | undefined): XmlElement => {\n // A newline in `<a:t>` is not a line break — PowerPoint needs one paragraph\n // per line. Split on '\\n' so multi-line cell text renders as multiple rows.\n const lines = value.length === 0 ? [''] : value.split('\\n');\n const paragraphs = lines.map((line) => buildCellParagraph(line, textColorHex));\n return elem(NAME_TX_BODY, {\n children: [elem(NAME_BODY_PR), elem(NAME_LST_STYLE), ...paragraphs],\n });\n};\n\n// PowerPoint's default cell insets (0.1in horizontal, 0.05in vertical).\n// Emitting them explicitly — as PowerPoint and PptxGenJS do — renders\n// identically to omitting them, but keeps the cell self-describing.\nconst buildCellProps = (): XmlElement =>\n elem(NAME_TC_PR, {\n attrs: [\n attr(ATTR_MAR_L, '91440'),\n attr(ATTR_MAR_R, '91440'),\n attr(ATTR_MAR_T, '45720'),\n attr(ATTR_MAR_B, '45720'),\n ],\n });\n\n/** @internal — used by row-mutation paths in the public API. */\nexport const buildTableCell = (value: string, textColorHex?: string): XmlElement => {\n return elem(NAME_TC, { children: [buildTextCellBody(value, textColorHex), buildCellProps()] });\n};\n\n/** @internal — used by row-mutation paths in the public API. */\nexport const buildTableRow = (\n cells: ReadonlyArray<string>,\n h: number,\n textColorHex?: string,\n): XmlElement =>\n elem(NAME_TR, {\n attrs: [attr(ATTR_H, String(emuExtent(h, 'addSlideTable: row height')))],\n children: cells.map((value) => buildTableCell(value, textColorHex)),\n });\n\nconst equalShares = (total: number, n: number): number[] => {\n if (n <= 0) return [];\n // Distribute integer EMU values so they sum exactly to `total` (no\n // 1-EMU drift). The last cell absorbs any rounding remainder.\n const base = Math.floor(total / n);\n const shares = Array.from({ length: n }, () => base);\n shares[n - 1] = base + (total - base * n);\n return shares;\n};\n\nexport const buildTable = (opts: TableOptions): XmlElement => {\n const rows = opts.rows;\n // Empty rows (or a row with no cells) would emit an `<a:tbl>` with no\n // grid — XML PowerPoint rejects with a repair dialog. Fail loudly at the\n // authoring boundary instead. Errors name the public `addSlideTable`\n // entry point (this builder's sole caller) so the message is actionable.\n if (rows.length === 0) throw new Error('addSlideTable: at least one row is required');\n const colCount = rows[0]?.length ?? 0;\n if (colCount === 0) throw new Error('addSlideTable: at least one column is required');\n for (let i = 0; i < rows.length; i++) {\n const r = rows[i];\n if (!r) throw new Error(`addSlideTable: row ${i} is missing`);\n if (r.length !== colCount) {\n throw new Error(\n `addSlideTable: row ${i} has ${r.length} cells; expected ${colCount} to match row 0`,\n );\n }\n }\n\n const colWidths = opts.colWidths ?? equalShares(opts.w, colCount);\n if (colWidths.length !== colCount) {\n throw new Error(\n `addSlideTable: colWidths has ${colWidths.length} entries; expected ${colCount}`,\n );\n }\n const rowHeights = opts.rowHeights ?? equalShares(opts.h, rows.length);\n if (rowHeights.length !== rows.length) {\n throw new Error(\n `addSlideTable: rowHeights has ${rowHeights.length} entries; expected ${rows.length}`,\n );\n }\n\n const name = opts.name ?? `Table ${opts.id}`;\n\n // Non-visual graphic frame properties.\n const cNvPr = elem(NAME_C_NV_PR, {\n attrs: [attr(ATTR_ID, String(opts.id)), attr(ATTR_NAME, name)],\n });\n const cNvGraphicFramePr = elem(NAME_C_NV_GRAPHIC_FRAME_PR, {\n children: [elem(NAME_GRAPHIC_FRAME_LOCKS, { attrs: [attr(ATTR_NO_GRP, '1')] })],\n });\n const nvPr = elem(NAME_NV_PR);\n const nvGraphicFramePr = elem(NAME_NV_GRAPHIC_FRAME_PR, {\n children: [cNvPr, cNvGraphicFramePr, nvPr],\n });\n\n // Geometry. Round to whole EMU (matches the grid-col / row-height rounding\n // below); fractional ST_Coordinate values corrupt the file.\n const off = elem(NAME_OFF, {\n attrs: [\n attr(ATTR_X, String(emuCoordinate(opts.x, 'addSlideTable: x'))),\n attr(ATTR_Y, String(emuCoordinate(opts.y, 'addSlideTable: y'))),\n ],\n });\n const ext = elem(NAME_EXT, {\n attrs: [\n attr(ATTR_CX, String(emuExtent(opts.w, 'addSlideTable: w'))),\n attr(ATTR_CY, String(emuExtent(opts.h, 'addSlideTable: h'))),\n ],\n });\n const xfrm = elem(NAME_P_XFRM, { children: [off, ext] });\n\n // Table payload.\n // `tableStyleId` is the LAST child of `<a:tblPr>` per CT_TableProperties\n // (§21.1.3.15): any fill/effect children precede it; we author none, so it\n // is the sole child.\n const tableStyleId = elem(NAME_TABLE_STYLE_ID, {\n children: [\n textNode(\n opts.styleId === undefined\n ? DEFAULT_TABLE_STYLE_ID\n : normalizeGuid(opts.styleId, 'addSlideTable: styleId'),\n ),\n ],\n });\n const tblPr = elem(NAME_TBL_PR, {\n attrs: [\n attr(ATTR_FIRST_ROW, (opts.firstRow ?? true) ? '1' : '0'),\n attr(ATTR_BAND_ROW, (opts.bandRow ?? true) ? '1' : '0'),\n ],\n children: [tableStyleId],\n });\n const tblGrid = elem(NAME_TBL_GRID, {\n children: colWidths.map((w) =>\n elem(NAME_GRID_COL, {\n attrs: [attr(ATTR_W, String(emuExtent(w, 'addSlideTable: column width')))],\n }),\n ),\n });\n const tableRows = rows.map((row, i) => buildTableRow(row, rowHeights[i] ?? 0, opts.textColorHex));\n const tbl = elem(NAME_TBL, { children: [tblPr, tblGrid, ...tableRows] });\n\n const graphicData = elem(NAME_GRAPHIC_DATA, {\n attrs: [attr(ATTR_URI, TABLE_URI)],\n children: [tbl],\n });\n const graphic = elem(NAME_GRAPHIC, { children: [graphicData] });\n\n return elem(NAME_GRAPHIC_FRAME, { children: [nvGraphicFramePr, xfrm, graphic] });\n};\n","// Builds the canonical empty notes-slide part PowerPoint emits.\n//\n// The part's root element is `<p:notes>` (ECMA-376 §19.3.1.26 — the global\n// element for CT_NotesSlide is named `notes`, not `notesSlide`; the\n// `notesSlide` token only appears in the part name and content type). Emitting\n// `<p:notesSlide>` here makes the part fail pml.xsd validation.\n//\n// Notes slides carry two placeholders: a `sldImg` placeholder that\n// PowerPoint renders as the slide thumbnail, and a `body` placeholder\n// (idx=\"1\") that holds the speaker-notes text. We emit both with no\n// geometry of their own so they inherit position from the notes master.\n\nimport {\n type XmlDocument,\n type XmlElement,\n NS,\n attr,\n elem,\n qname,\n text as textNode,\n} from '../xml/index.ts';\n\nconst NAME_NOTES_SLIDE = qname('p', 'notes', NS.pml);\nconst NAME_CSLD = qname('p', 'cSld', NS.pml);\nconst NAME_SP_TREE = qname('p', 'spTree', NS.pml);\nconst NAME_NV_GRP_SP_PR = qname('p', 'nvGrpSpPr', NS.pml);\nconst NAME_C_NV_PR = qname('p', 'cNvPr', NS.pml);\nconst NAME_C_NV_GRP_SP_PR = qname('p', 'cNvGrpSpPr', NS.pml);\nconst NAME_C_NV_SP_PR = qname('p', 'cNvSpPr', NS.pml);\nconst NAME_NV_PR = qname('p', 'nvPr', NS.pml);\nconst NAME_GRP_SP_PR = qname('p', 'grpSpPr', NS.pml);\nconst NAME_SP = qname('p', 'sp', NS.pml);\nconst NAME_NV_SP_PR = qname('p', 'nvSpPr', NS.pml);\nconst NAME_SP_PR = qname('p', 'spPr', NS.pml);\nconst NAME_PH = qname('p', 'ph', NS.pml);\nconst NAME_TX_BODY = qname('p', 'txBody', NS.pml);\nconst NAME_CLR_MAP_OVR = qname('p', 'clrMapOvr', NS.pml);\nconst NAME_MASTER_CLR_MAPPING = qname('a', 'masterClrMapping', NS.dml);\nconst NAME_BODY_PR = qname('a', 'bodyPr', NS.dml);\nconst NAME_LST_STYLE = qname('a', 'lstStyle', NS.dml);\nconst NAME_P = qname('a', 'p', NS.dml);\nconst NAME_R = qname('a', 'r', NS.dml);\nconst NAME_RPR = qname('a', 'rPr', NS.dml);\nconst NAME_T = qname('a', 't', NS.dml);\nconst NAME_SP_LOCKS = qname('a', 'spLocks', NS.dml);\nconst ATTR_ID = qname('', 'id', '');\nconst ATTR_NAME = qname('', 'name', '');\nconst ATTR_NO_GRP = qname('', 'noGrp', '');\nconst ATTR_NO_ROT = qname('', 'noRot', '');\nconst ATTR_NO_CHANGE_ASPECT = qname('', 'noChangeAspect', '');\nconst ATTR_TYPE = qname('', 'type', '');\nconst ATTR_IDX = qname('', 'idx', '');\nconst ATTR_LANG = qname('', 'lang', '');\n\nconst buildRootGroup = (): XmlElement => {\n const cNvPr = elem(NAME_C_NV_PR, { attrs: [attr(ATTR_ID, '1'), attr(ATTR_NAME, '')] });\n return elem(NAME_NV_GRP_SP_PR, {\n children: [cNvPr, elem(NAME_C_NV_GRP_SP_PR), elem(NAME_NV_PR)],\n });\n};\n\nconst buildSldImgPlaceholder = (id: number): XmlElement => {\n const cNvPr = elem(NAME_C_NV_PR, {\n attrs: [attr(ATTR_ID, String(id)), attr(ATTR_NAME, `Slide Image Placeholder ${id - 1}`)],\n });\n const spLocks = elem(NAME_SP_LOCKS, {\n attrs: [attr(ATTR_NO_GRP, '1'), attr(ATTR_NO_ROT, '1'), attr(ATTR_NO_CHANGE_ASPECT, '1')],\n });\n const cNvSpPr = elem(NAME_C_NV_SP_PR, { children: [spLocks] });\n const ph = elem(NAME_PH, { attrs: [attr(ATTR_TYPE, 'sldImg')] });\n const nvSpPr = elem(NAME_NV_SP_PR, {\n children: [cNvPr, cNvSpPr, elem(NAME_NV_PR, { children: [ph] })],\n });\n return elem(NAME_SP, { children: [nvSpPr, elem(NAME_SP_PR)] });\n};\n\nconst buildNotesParagraphs = (notes: string): XmlElement[] => {\n const lines = notes.split('\\n');\n return lines.map((line) => {\n const t = elem(NAME_T, { children: line.length > 0 ? [textNode(line)] : [] });\n const r = elem(NAME_R, {\n children: [elem(NAME_RPR, { attrs: [attr(ATTR_LANG, 'en-US')] }), t],\n });\n return elem(NAME_P, { children: [r] });\n });\n};\n\nconst buildNotesBodyPlaceholder = (id: number, notes: string): XmlElement => {\n const cNvPr = elem(NAME_C_NV_PR, {\n attrs: [attr(ATTR_ID, String(id)), attr(ATTR_NAME, `Notes Placeholder ${id - 1}`)],\n });\n const cNvSpPr = elem(NAME_C_NV_SP_PR, {\n children: [elem(NAME_SP_LOCKS, { attrs: [attr(ATTR_NO_GRP, '1')] })],\n });\n const ph = elem(NAME_PH, {\n attrs: [attr(ATTR_TYPE, 'body'), attr(ATTR_IDX, '1')],\n });\n const nvSpPr = elem(NAME_NV_SP_PR, {\n children: [cNvPr, cNvSpPr, elem(NAME_NV_PR, { children: [ph] })],\n });\n const txBody = elem(NAME_TX_BODY, {\n children: [elem(NAME_BODY_PR), elem(NAME_LST_STYLE), ...buildNotesParagraphs(notes)],\n });\n return elem(NAME_SP, { children: [nvSpPr, elem(NAME_SP_PR), txBody] });\n};\n\n/**\n * Returns a fresh `<p:notes>` document with the given notes text in\n * the body placeholder. Designed for callers that need to create the\n * notesSlide part from scratch (no existing notes file yet for the\n * slide).\n */\nexport const buildEmptyNotesSlide = (notes: string): XmlDocument => {\n const spTree = elem(NAME_SP_TREE, {\n children: [\n buildRootGroup(),\n elem(NAME_GRP_SP_PR),\n buildSldImgPlaceholder(2),\n buildNotesBodyPlaceholder(3, notes),\n ],\n });\n const cSld = elem(NAME_CSLD, { children: [spTree] });\n const clrMapOvr = elem(NAME_CLR_MAP_OVR, { children: [elem(NAME_MASTER_CLR_MAPPING)] });\n const root = elem(NAME_NOTES_SLIDE, {\n prefixDecls: new Map([\n ['a', NS.dml],\n ['r', NS.officeDocRels],\n ['p', NS.pml],\n ]),\n children: [cSld, clrMapOvr],\n });\n return {\n kind: 'document',\n decl: { version: '1.0', encoding: 'UTF-8', standalone: 'yes' },\n prolog: [],\n root,\n epilog: [],\n };\n};\n","// Builds the `<p:transition>` element that controls how PowerPoint\n// animates from this slide to the next.\n//\n// Per ECMA-376 Part 1 §19.5.51 the transition carries:\n// - `spd` attribute: `slow` | `med` | `fast` (default `med`)\n// - `advClick` attribute: `1` to advance on click (default), `0` to disable\n// - `advTm` attribute: auto-advance time in milliseconds\n// - Exactly one child element from the effect catalog (fade, push,\n// cover, wipe, split, cut, dissolve, checker, blinds, randomBar,\n// zoom, circle, diamond, plus, wedge, ...).\n//\n// The effect attributes are not interchangeable: each effect element maps to a\n// distinct CT type that only permits certain attributes (CT_OptionalBlackTransition\n// → thruBlk; CT_SplitTransition → orient + dir; the direction families → dir).\n// Emitting an attribute on an effect that doesn't allow it is schema-invalid, so\n// buildEffectElement gates each attribute by the effect that accepts it.\n\nimport { oneOf, unsignedIntMs } from '../bounds.ts';\nimport { type XmlElement, NS, attr, elem, qname } from '../xml/index.ts';\n\nconst NAME_TRANSITION = qname('p', 'transition', NS.pml);\nconst ATTR_SPD = qname('', 'spd', '');\nconst ATTR_ADV_CLICK = qname('', 'advClick', '');\nconst ATTR_ADV_TM = qname('', 'advTm', '');\nconst ATTR_DIR = qname('', 'dir', '');\nconst ATTR_ORIENT = qname('', 'orient', '');\nconst ATTR_THRU_BLK = qname('', 'thruBlk', '');\n\n/**\n * Transition effect token. Maps to a `<p:{token}/>` child of\n * `<p:transition>`. The list covers the effects all current PowerPoint\n * versions emit; pass any other ECMA-376-permitted local name as a raw\n * string for forward compatibility.\n */\nexport type TransitionEffect =\n | 'none'\n | 'fade'\n | 'push'\n | 'cover'\n | 'wipe'\n | 'split'\n | 'cut'\n | 'dissolve'\n | 'checker'\n | 'blinds'\n | 'randomBar'\n | 'zoom'\n | 'circle'\n | 'diamond'\n | 'plus'\n | 'wedge'\n | 'newsflash';\n\nexport interface TransitionOptions {\n effect: TransitionEffect | string;\n /** Effect speed. Defaults to omitted (PowerPoint treats absence as `med`). */\n speed?: 'slow' | 'med' | 'fast';\n /**\n * Direction, valid only for effects that carry a `dir` attribute and only\n * within that effect's domain (validated on write):\n * - `blinds`/`checker`/`comb`/`randomBar`: `horz` | `vert`\n * - `push`/`wipe`: `l` | `r` | `u` | `d`\n * - `cover`/`pull`: the above plus `lu` | `ru` | `ld` | `rd`\n * - `strips`: `lu` | `ru` | `ld` | `rd`\n * - `zoom`/`split`: `in` | `out`\n * A mismatched effect/direction pair throws; on any other effect a stray\n * `direction` is ignored.\n */\n direction?: string;\n /** For `split`: orientation token (`horz` / `vert`). */\n orientation?: 'horz' | 'vert';\n /** For `fade`: pass `true` to fade through black. */\n thruBlack?: boolean;\n /** Whether clicking advances; default `true` (PowerPoint's default). */\n advanceOnClick?: boolean;\n /**\n * Milliseconds to auto-advance after this slide. Omit for click-only\n * advance.\n */\n advanceAfterMs?: number;\n}\n\n// Per-effect `dir` value domains (ECMA-376 Part 1, pml.xsd). The effect\n// element's CT type fixes which direction tokens are legal — they are NOT\n// interchangeable: blinds wants horz/vert, push wants l/r/u/d, zoom wants\n// in/out, etc. Emitting a token outside the effect's domain is schema-invalid,\n// so we validate `direction` against the effect here (a boundary).\nconst DIR_ORIENT = new Set(['horz', 'vert']); // ST_Direction (CT_OrientationTransition)\nconst DIR_SIDE = new Set(['l', 'u', 'r', 'd']); // ST_TransitionSideDirectionType\nconst DIR_CORNER = new Set(['lu', 'ru', 'ld', 'rd']); // ST_TransitionCornerDirectionType\nconst DIR_EIGHT = new Set([...DIR_SIDE, ...DIR_CORNER]); // ST_TransitionEightDirectionType\nconst DIR_IN_OUT = new Set(['in', 'out']); // ST_TransitionInOutDirectionType\nconst DIR_DOMAINS: Readonly<Record<string, ReadonlySet<string>>> = {\n blinds: DIR_ORIENT,\n checker: DIR_ORIENT,\n comb: DIR_ORIENT,\n randomBar: DIR_ORIENT,\n push: DIR_SIDE,\n wipe: DIR_SIDE,\n cover: DIR_EIGHT,\n pull: DIR_EIGHT,\n strips: DIR_CORNER,\n zoom: DIR_IN_OUT,\n split: DIR_IN_OUT,\n};\n// Effects whose CT type carries `thruBlk` (CT_OptionalBlackTransition).\nconst THRU_BLK_EFFECTS = new Set(['fade', 'cut']);\n\n// Every transition effect element name in CT_SlideTransition's choice\n// (ECMA-376 pml.xsd). `effect` is typed `TransitionEffect | string` for\n// forward-compat, so the raw token reaches the wire — validate it against the\n// full spec set, or an empty/unknown string yields non-well-formed or\n// schema-invalid XML. `none` is handled before this and is intentionally absent.\nconst TRANSITION_EFFECTS: ReadonlyArray<string> = [\n 'blinds',\n 'checker',\n 'circle',\n 'dissolve',\n 'comb',\n 'cover',\n 'cut',\n 'diamond',\n 'fade',\n 'newsflash',\n 'plus',\n 'pull',\n 'push',\n 'random',\n 'randomBar',\n 'split',\n 'strips',\n 'wedge',\n 'wheel',\n 'wipe',\n 'zoom',\n];\n\n// Returns the single effect child, or null for the \"no transition effect\"\n// sentinel ('none' is not a valid effect element name — CT_SlideTransition's\n// choice has no `none` member).\nconst buildEffectElement = (opts: TransitionOptions): XmlElement | null => {\n if (opts.effect === 'none') return null;\n const effect = oneOf(opts.effect, TRANSITION_EFFECTS, 'setSlideTransition: effect');\n const name = qname('p', effect, NS.pml);\n const attrs = [];\n if (opts.direction !== undefined) {\n // Only effects with a `dir` attribute carry a domain; for any other effect\n // a stray `direction` is ignored (it has nowhere valid to go).\n const domain = DIR_DOMAINS[opts.effect];\n if (domain !== undefined) {\n if (!domain.has(opts.direction)) {\n throw new Error(\n `setSlideTransition: direction \"${opts.direction}\" is not valid for effect ` +\n `\"${opts.effect}\" (allowed: ${[...domain].join(', ')})`,\n );\n }\n attrs.push(attr(ATTR_DIR, opts.direction));\n }\n }\n // `orient` only exists on CT_SplitTransition.\n if (opts.orientation !== undefined && opts.effect === 'split') {\n attrs.push(attr(ATTR_ORIENT, opts.orientation));\n }\n if (opts.thruBlack && THRU_BLK_EFFECTS.has(opts.effect)) {\n attrs.push(attr(ATTR_THRU_BLK, '1'));\n }\n return elem(name, { attrs });\n};\n\n/** Returns a complete `<p:transition>` element. */\nexport const buildTransition = (opts: TransitionOptions): XmlElement => {\n const attrs = [];\n if (opts.speed !== undefined) attrs.push(attr(ATTR_SPD, opts.speed));\n if (opts.advanceOnClick === false) attrs.push(attr(ATTR_ADV_CLICK, '0'));\n if (opts.advanceAfterMs !== undefined) {\n // advTm is xsd:unsignedInt (0..4294967295 ms).\n const advTm = unsignedIntMs(opts.advanceAfterMs, 'setSlideTransition: advanceAfterMs');\n attrs.push(attr(ATTR_ADV_TM, String(advTm)));\n }\n const effect = buildEffectElement(opts);\n return elem(NAME_TRANSITION, {\n attrs,\n children: effect === null ? [] : [effect],\n });\n};\n","// Animation builder — emits a `<p:timing>` block carrying a single\n// click-triggered entrance / exit effect on one target shape.\n//\n// Scope (v1):\n//\n// - Exactly one effect per slide. Calling `setShapeAnimation` on a\n// second shape replaces the first. The plan calls this out as the\n// curated subset; full timing-tree authoring is post-1.0.\n// - Click trigger only. After-previous / with-previous chaining lands\n// when multi-effect support does.\n// - Entrance + exit preset families. Emphasis presets are post-1.0.\n//\n// The timing tree shape follows what PowerPoint itself emits for a\n// single \"fade in on click\" effect — the boilerplate scaffolding around\n// the actual `<p:set>` / `<p:anim>` is fixed; we just swap presetID,\n// presetClass, and the target spid.\n\nimport { unsignedIntMs } from '../bounds.ts';\nimport { NS, type XmlElement, attr, elem, qname } from '../xml/index.ts';\n\nconst NAME_TIMING = qname('p', 'timing', NS.pml);\nconst NAME_TN_LST = qname('p', 'tnLst', NS.pml);\nconst NAME_PAR = qname('p', 'par', NS.pml);\nconst NAME_C_TN = qname('p', 'cTn', NS.pml);\nconst NAME_CHILD_TN_LST = qname('p', 'childTnLst', NS.pml);\nconst NAME_SEQ = qname('p', 'seq', NS.pml);\nconst NAME_ST_COND_LST = qname('p', 'stCondLst', NS.pml);\nconst NAME_PREV_COND_LST = qname('p', 'prevCondLst', NS.pml);\nconst NAME_NEXT_COND_LST = qname('p', 'nextCondLst', NS.pml);\nconst NAME_COND = qname('p', 'cond', NS.pml);\nconst NAME_TGT_EL = qname('p', 'tgtEl', NS.pml);\nconst NAME_SP_TGT = qname('p', 'spTgt', NS.pml);\nconst NAME_SLD_TGT = qname('p', 'sldTgt', NS.pml);\nconst NAME_ATTR_NAME_LST = qname('p', 'attrNameLst', NS.pml);\nconst NAME_ATTR_NAME_FN = qname('p', 'attrName', NS.pml);\nconst NAME_SET = qname('p', 'set', NS.pml);\nconst NAME_C_BHVR = qname('p', 'cBhvr', NS.pml);\nconst NAME_TO = qname('p', 'to', NS.pml);\nconst NAME_STR_VAL = qname('p', 'strVal', NS.pml);\nconst NAME_FLT_VAL = qname('p', 'fltVal', NS.pml);\nconst NAME_VAL = qname('p', 'val', NS.pml);\nconst NAME_ANIM = qname('p', 'anim', NS.pml);\nconst NAME_TAV_LST = qname('p', 'tavLst', NS.pml);\nconst NAME_TAV = qname('p', 'tav', NS.pml);\nconst NAME_BLD_LST = qname('p', 'bldLst', NS.pml);\nconst NAME_BLD_P = qname('p', 'bldP', NS.pml);\n\nconst ATTR_ID = qname('', 'id', '');\nconst ATTR_DUR = qname('', 'dur', '');\nconst ATTR_RESTART = qname('', 'restart', '');\nconst ATTR_NODE_TYPE = qname('', 'nodeType', '');\nconst ATTR_FILL = qname('', 'fill', '');\nconst ATTR_DELAY = qname('', 'delay', '');\nconst ATTR_PRESET_ID = qname('', 'presetID', '');\nconst ATTR_PRESET_CLASS = qname('', 'presetClass', '');\nconst ATTR_PRESET_SUBTYPE = qname('', 'presetSubtype', '');\nconst ATTR_GRP_ID = qname('', 'grpId', '');\nconst ATTR_CONCURRENT = qname('', 'concurrent', '');\nconst ATTR_NEXT_AC = qname('', 'nextAc', '');\nconst ATTR_SPID = qname('', 'spid', '');\nconst ATTR_EVT = qname('', 'evt', '');\nconst ATTR_VAL = qname('', 'val', '');\nconst ATTR_CALCMODE = qname('', 'calcmode', '');\nconst ATTR_VALUE_TYPE = qname('', 'valueType', '');\nconst ATTR_ADDITIVE = qname('', 'additive', '');\nconst ATTR_TM = qname('', 'tm', '');\n\n/** What kind of effect to apply. v1 covers the four most-used presets. */\nexport type AnimationEffect = 'fadeIn' | 'fadeOut' | 'appear' | 'disappear';\n\ninterface PresetDescriptor {\n readonly presetId: number;\n readonly presetClass: 'entr' | 'exit';\n readonly presetSubtype: number;\n}\n\nconst PRESETS: Record<AnimationEffect, PresetDescriptor> = {\n appear: { presetId: 1, presetClass: 'entr', presetSubtype: 0 },\n fadeIn: { presetId: 10, presetClass: 'entr', presetSubtype: 0 },\n disappear: { presetId: 1, presetClass: 'exit', presetSubtype: 0 },\n fadeOut: { presetId: 10, presetClass: 'exit', presetSubtype: 0 },\n};\n\nexport interface AnimationOptions {\n /** Which preset effect to apply. */\n readonly effect: AnimationEffect;\n /** Animation length in milliseconds. Defaults to 500ms. */\n readonly durationMs?: number;\n}\n\nconst buildSetVisibility = (spid: number, visible: boolean): XmlElement => {\n const tgt = elem(NAME_TGT_EL, {\n children: [elem(NAME_SP_TGT, { attrs: [attr(ATTR_SPID, String(spid))] })],\n });\n const attrName = elem(NAME_ATTR_NAME_LST, {\n children: [elem(NAME_ATTR_NAME_FN, { children: [{ kind: 'text', data: 'style.visibility' }] })],\n });\n const cTn = elem(NAME_C_TN, {\n attrs: [attr(ATTR_ID, '6'), attr(ATTR_DUR, '1'), attr(ATTR_FILL, 'hold')],\n children: [\n elem(NAME_ST_COND_LST, {\n children: [elem(NAME_COND, { attrs: [attr(ATTR_DELAY, '0')] })],\n }),\n ],\n });\n const cBhvr = elem(NAME_C_BHVR, { children: [cTn, tgt, attrName] });\n const to = elem(NAME_TO, {\n children: [elem(NAME_STR_VAL, { attrs: [attr(ATTR_VAL, visible ? 'visible' : 'hidden')] })],\n });\n return elem(NAME_SET, { children: [cBhvr, to] });\n};\n\nconst buildOpacityAnim = (spid: number, durationMs: number, fadeIn: boolean): XmlElement => {\n const tgt = elem(NAME_TGT_EL, {\n children: [elem(NAME_SP_TGT, { attrs: [attr(ATTR_SPID, String(spid))] })],\n });\n const attrName = elem(NAME_ATTR_NAME_LST, {\n children: [elem(NAME_ATTR_NAME_FN, { children: [{ kind: 'text', data: 'style.opacity' }] })],\n });\n const cTn = elem(NAME_C_TN, {\n attrs: [attr(ATTR_ID, '7'), attr(ATTR_DUR, String(durationMs)), attr(ATTR_FILL, 'hold')],\n });\n const cBhvr = elem(NAME_C_BHVR, {\n attrs: [attr(ATTR_ADDITIVE, 'base')],\n children: [cTn, tgt, attrName],\n });\n const fromVal = fadeIn ? '0' : '1';\n const toVal = fadeIn ? '1' : '0';\n const tavLst = elem(NAME_TAV_LST, {\n children: [\n elem(NAME_TAV, {\n attrs: [attr(ATTR_TM, '0')],\n children: [\n elem(NAME_VAL, {\n children: [elem(NAME_FLT_VAL, { attrs: [attr(ATTR_VAL, fromVal)] })],\n }),\n ],\n }),\n elem(NAME_TAV, {\n attrs: [attr(ATTR_TM, '100000')],\n children: [\n elem(NAME_VAL, {\n children: [elem(NAME_FLT_VAL, { attrs: [attr(ATTR_VAL, toVal)] })],\n }),\n ],\n }),\n ],\n });\n return elem(NAME_ANIM, {\n attrs: [attr(ATTR_CALCMODE, 'lin'), attr(ATTR_VALUE_TYPE, 'num')],\n children: [cBhvr, tavLst],\n });\n};\n\n/**\n * Builds the complete `<p:timing>` element for a single click-effect on\n * the given shape id. Returns null for unsupported effect kinds.\n */\nexport const buildSingleEffectTiming = (spid: number, opts: AnimationOptions): XmlElement => {\n const preset = PRESETS[opts.effect];\n // <p:cTn dur> is ST_TLTime (xsd:unsignedInt ms or \"indefinite\"); reject\n // fractional/negative/out-of-range so we never emit an invalid dur.\n const duration =\n opts.durationMs === undefined\n ? 500\n : unsignedIntMs(opts.durationMs, 'setShapeAnimation: durationMs');\n\n const isFade = opts.effect === 'fadeIn' || opts.effect === 'fadeOut';\n const isEntrance = preset.presetClass === 'entr';\n\n const effectChildren: XmlElement[] = [];\n // Visibility kick: entrance reveals, exit hides.\n effectChildren.push(buildSetVisibility(spid, isEntrance));\n if (isFade) {\n effectChildren.push(buildOpacityAnim(spid, duration, isEntrance));\n }\n\n // cTn id=5 — the effect node.\n const effectCTn = elem(NAME_C_TN, {\n attrs: [\n attr(ATTR_ID, '5'),\n attr(ATTR_PRESET_ID, String(preset.presetId)),\n attr(ATTR_PRESET_CLASS, preset.presetClass),\n attr(ATTR_PRESET_SUBTYPE, String(preset.presetSubtype)),\n attr(ATTR_FILL, 'hold'),\n attr(ATTR_GRP_ID, '0'),\n attr(ATTR_NODE_TYPE, 'clickEffect'),\n ],\n children: [\n elem(NAME_ST_COND_LST, {\n children: [elem(NAME_COND, { attrs: [attr(ATTR_DELAY, '0')] })],\n }),\n elem(NAME_CHILD_TN_LST, { children: effectChildren }),\n ],\n });\n const effectPar = elem(NAME_PAR, { children: [effectCTn] });\n\n // cTn id=4 — the click wrapper.\n const clickWrapperCTn = elem(NAME_C_TN, {\n attrs: [attr(ATTR_ID, '4'), attr(ATTR_FILL, 'hold')],\n children: [\n elem(NAME_ST_COND_LST, {\n children: [elem(NAME_COND, { attrs: [attr(ATTR_DELAY, '0')] })],\n }),\n elem(NAME_CHILD_TN_LST, { children: [effectPar] }),\n ],\n });\n const clickWrapperPar = elem(NAME_PAR, { children: [clickWrapperCTn] });\n\n // cTn id=3 — the indefinite wrapper (waiting for click).\n const indefiniteCTn = elem(NAME_C_TN, {\n attrs: [attr(ATTR_ID, '3'), attr(ATTR_FILL, 'hold')],\n children: [\n elem(NAME_ST_COND_LST, {\n children: [elem(NAME_COND, { attrs: [attr(ATTR_DELAY, 'indefinite')] })],\n }),\n elem(NAME_CHILD_TN_LST, { children: [clickWrapperPar] }),\n ],\n });\n const indefinitePar = elem(NAME_PAR, { children: [indefiniteCTn] });\n\n // cTn id=2 — the mainSeq.\n const mainSeqCTn = elem(NAME_C_TN, {\n attrs: [attr(ATTR_ID, '2'), attr(ATTR_DUR, 'indefinite'), attr(ATTR_NODE_TYPE, 'mainSeq')],\n children: [elem(NAME_CHILD_TN_LST, { children: [indefinitePar] })],\n });\n\n // Slide-level next/prev navigation hooks.\n const prevCond = elem(NAME_PREV_COND_LST, {\n children: [\n elem(NAME_COND, {\n attrs: [attr(ATTR_EVT, 'onPrev'), attr(ATTR_DELAY, '0')],\n children: [elem(NAME_TGT_EL, { children: [elem(NAME_SLD_TGT)] })],\n }),\n ],\n });\n const nextCond = elem(NAME_NEXT_COND_LST, {\n children: [\n elem(NAME_COND, {\n attrs: [attr(ATTR_EVT, 'onNext'), attr(ATTR_DELAY, '0')],\n children: [elem(NAME_TGT_EL, { children: [elem(NAME_SLD_TGT)] })],\n }),\n ],\n });\n const seq = elem(NAME_SEQ, {\n attrs: [attr(ATTR_CONCURRENT, '1'), attr(ATTR_NEXT_AC, 'seek')],\n children: [mainSeqCTn, prevCond, nextCond],\n });\n\n // cTn id=1 — the tmRoot.\n const rootCTn = elem(NAME_C_TN, {\n attrs: [\n attr(ATTR_ID, '1'),\n attr(ATTR_DUR, 'indefinite'),\n attr(ATTR_RESTART, 'never'),\n attr(ATTR_NODE_TYPE, 'tmRoot'),\n ],\n children: [elem(NAME_CHILD_TN_LST, { children: [seq] })],\n });\n const rootPar = elem(NAME_PAR, { children: [rootCTn] });\n const tnLst = elem(NAME_TN_LST, { children: [rootPar] });\n\n // bldLst entry — required for PowerPoint to render the effect.\n const bldLst = elem(NAME_BLD_LST, {\n children: [\n elem(NAME_BLD_P, {\n attrs: [attr(ATTR_SPID, String(spid)), attr(ATTR_GRP_ID, '0')],\n }),\n ],\n });\n\n return elem(NAME_TIMING, { children: [tnLst, bldLst] });\n};\n","// Comments part — `/ppt/commentAuthors.xml` (one per package) and\n// `/ppt/comments/comment{N}.xml` (one per slide that has comments).\n//\n// Implements the **legacy** comment schema (ECMA-376 Part 1 §19.4),\n// which every PowerPoint / Keynote / Google Slides / LibreOffice\n// Impress consumer in the wild understands. The modern (`p15:`)\n// threaded-comments schema is a strict superset; preserving an\n// existing modern-comments part on round-trip is handled separately\n// via OPC pass-through.\n//\n// Schema (legacy):\n//\n// <p:cmAuthorLst>\n// <p:cmAuthor id=\"0\" name=\"Reviewer\" initials=\"R\" lastIdx=\"1\" clrIdx=\"0\"/>\n// </p:cmAuthorLst>\n//\n// <p:cmLst>\n// <p:cm authorId=\"0\" dt=\"2026-05-15T12:00:00Z\" idx=\"1\">\n// <p:pos x=\"...\" y=\"...\"/> <!-- optional -->\n// <p:text>Comment text.</p:text>\n// </p:cm>\n// </p:cmLst>\n//\n// Position coordinates are EMUs (ECMA Part 1 §19.7.2 `ST_Coordinate`).\n// `idx` is per-author; `lastIdx` on the author tracks the last used.\n\nimport {\n NS,\n type XmlDocument,\n type XmlElement,\n allChildElements,\n attr,\n elem,\n firstChildElement,\n getAttrValue,\n qname,\n text as textNode,\n} from '../xml/index.ts';\n\n// QNames -------------------------------------------------------------------\n\nconst NAME_CM_AUTHOR_LST = qname('p', 'cmAuthorLst', NS.pml);\nconst NAME_CM_AUTHOR = qname('p', 'cmAuthor', NS.pml);\nconst NAME_CM_LST = qname('p', 'cmLst', NS.pml);\nconst NAME_CM = qname('p', 'cm', NS.pml);\nconst NAME_POS = qname('p', 'pos', NS.pml);\nconst NAME_TEXT = qname('p', 'text', NS.pml);\n\nconst ATTR_ID = qname('', 'id', '');\nconst ATTR_NAME = qname('', 'name', '');\nconst ATTR_INITIALS = qname('', 'initials', '');\nconst ATTR_LAST_IDX = qname('', 'lastIdx', '');\nconst ATTR_CLR_IDX = qname('', 'clrIdx', '');\nconst ATTR_AUTHOR_ID = qname('', 'authorId', '');\nconst ATTR_DT = qname('', 'dt', '');\nconst ATTR_IDX = qname('', 'idx', '');\nconst ATTR_X = qname('', 'x', '');\nconst ATTR_Y = qname('', 'y', '');\n\n// Types --------------------------------------------------------------------\n\nexport interface CommentAuthor {\n /** Unique within the author list (also referenced by `<p:cm authorId=\"…\">`). */\n readonly id: number;\n readonly name: string;\n readonly initials: string;\n /** Highest `idx` value this author has used; bumped on every new comment. */\n readonly lastIdx: number;\n /** Optional color index into the package's theme; preserved verbatim. */\n readonly clrIdx: number | null;\n}\n\nexport interface CommentPosition {\n readonly x: number;\n readonly y: number;\n}\n\nexport interface SlideComment {\n /** Author id (matches `CommentAuthor.id`). */\n readonly authorId: number;\n /** Per-author monotonic index. */\n readonly idx: number;\n /** ISO-8601 timestamp string as it appeared on disk; may be `null`. */\n readonly dt: string | null;\n readonly text: string;\n readonly position: CommentPosition | null;\n}\n\nexport interface CommentAuthorList {\n readonly authors: ReadonlyArray<CommentAuthor>;\n}\n\nexport interface CommentList {\n readonly comments: ReadonlyArray<SlideComment>;\n}\n\n// Read ---------------------------------------------------------------------\n\nexport const readCommentAuthorList = (root: XmlElement): CommentAuthorList => {\n if (root.name.namespaceURI !== NS.pml || root.name.localName !== 'cmAuthorLst') {\n throw new Error(\n `expected <p:cmAuthorLst> root, got <${root.name.prefix}:${root.name.localName}>`,\n );\n }\n const authors: CommentAuthor[] = [];\n for (const el of allChildElements(root, NAME_CM_AUTHOR)) {\n const idRaw = getAttrValue(el, ATTR_ID);\n const nameVal = getAttrValue(el, ATTR_NAME);\n const initialsVal = getAttrValue(el, ATTR_INITIALS);\n const lastIdxRaw = getAttrValue(el, ATTR_LAST_IDX);\n const clrIdxRaw = getAttrValue(el, ATTR_CLR_IDX);\n if (idRaw === null) continue;\n const id = Number.parseInt(idRaw, 10);\n if (!Number.isFinite(id)) continue;\n authors.push({\n id,\n name: nameVal ?? '',\n initials: initialsVal ?? '',\n lastIdx: lastIdxRaw !== null ? Number.parseInt(lastIdxRaw, 10) || 0 : 0,\n clrIdx: clrIdxRaw !== null ? Number.parseInt(clrIdxRaw, 10) || null : null,\n });\n }\n return { authors };\n};\n\nexport const readCommentList = (root: XmlElement): CommentList => {\n if (root.name.namespaceURI !== NS.pml || root.name.localName !== 'cmLst') {\n throw new Error(`expected <p:cmLst> root, got <${root.name.prefix}:${root.name.localName}>`);\n }\n const comments: SlideComment[] = [];\n for (const el of allChildElements(root, NAME_CM)) {\n const authorIdRaw = getAttrValue(el, ATTR_AUTHOR_ID);\n const idxRaw = getAttrValue(el, ATTR_IDX);\n const dtVal = getAttrValue(el, ATTR_DT);\n if (authorIdRaw === null || idxRaw === null) continue;\n const authorId = Number.parseInt(authorIdRaw, 10);\n const idx = Number.parseInt(idxRaw, 10);\n if (!Number.isFinite(authorId) || !Number.isFinite(idx)) continue;\n\n let position: CommentPosition | null = null;\n const posEl = firstChildElement(el, NAME_POS);\n if (posEl !== null) {\n const xRaw = getAttrValue(posEl, ATTR_X);\n const yRaw = getAttrValue(posEl, ATTR_Y);\n if (xRaw !== null && yRaw !== null) {\n const x = Number.parseInt(xRaw, 10);\n const y = Number.parseInt(yRaw, 10);\n if (Number.isFinite(x) && Number.isFinite(y)) {\n position = { x, y };\n }\n }\n }\n\n let text = '';\n const textEl = firstChildElement(el, NAME_TEXT);\n if (textEl !== null) {\n for (const child of textEl.children) {\n if (child.kind === 'text' || child.kind === 'cdata') text += child.data;\n }\n }\n\n comments.push({\n authorId,\n idx,\n dt: dtVal,\n text,\n position,\n });\n }\n return { comments };\n};\n\n// Build --------------------------------------------------------------------\n\nconst commentAuthorElement = (a: CommentAuthor): XmlElement => {\n // `clrIdx` is required by the strict ECMA-376 schema even though\n // PowerPoint tolerates its absence in practice. Default to 0 so we\n // always pass `xmllint --schema` validation.\n const attrs = [\n attr(ATTR_ID, String(a.id)),\n attr(ATTR_NAME, a.name),\n attr(ATTR_INITIALS, a.initials),\n attr(ATTR_LAST_IDX, String(a.lastIdx)),\n attr(ATTR_CLR_IDX, String(a.clrIdx ?? 0)),\n ];\n return elem(NAME_CM_AUTHOR, { attrs });\n};\n\nexport const buildCommentAuthorListDoc = (authors: ReadonlyArray<CommentAuthor>): XmlDocument => {\n const root = elem(NAME_CM_AUTHOR_LST, {\n prefixDecls: new Map([['p', NS.pml]]),\n children: authors.map(commentAuthorElement),\n });\n return {\n kind: 'document',\n decl: { version: '1.0', encoding: 'UTF-8', standalone: 'yes' },\n prolog: [],\n root,\n epilog: [],\n };\n};\n\nconst commentElement = (c: SlideComment): XmlElement => {\n const attrs = [attr(ATTR_AUTHOR_ID, String(c.authorId)), attr(ATTR_IDX, String(c.idx))];\n if (c.dt !== null) attrs.push(attr(ATTR_DT, c.dt));\n const children: XmlElement[] = [];\n if (c.position !== null) {\n children.push(\n elem(NAME_POS, {\n attrs: [attr(ATTR_X, String(c.position.x)), attr(ATTR_Y, String(c.position.y))],\n }),\n );\n }\n children.push(elem(NAME_TEXT, { children: [textNode(c.text)] }));\n return elem(NAME_CM, { attrs, children });\n};\n\nexport const buildCommentListDoc = (comments: ReadonlyArray<SlideComment>): XmlDocument => {\n const root = elem(NAME_CM_LST, {\n prefixDecls: new Map([['p', NS.pml]]),\n children: comments.map(commentElement),\n });\n return {\n kind: 'document',\n decl: { version: '1.0', encoding: 'UTF-8', standalone: 'yes' },\n prolog: [],\n root,\n epilog: [],\n };\n};\n","// Cross-cutting helpers shared by the split fn modules.\n//\n// Helpers used by only one module live with that module. Anything\n// referenced from two or more split files is centralized here.\n\nimport type { OpcPackage } from '../../internal/parts/index.ts';\nimport { readSlidePart } from '../../internal/presentationml/index.ts';\nimport {\n NS,\n type XmlElement,\n firstChildElement,\n qname,\n serializeXml,\n} from '../../internal/xml/index.ts';\nimport { partName } from '../../internal/opc/index.ts';\nimport {\n INTERNAL_PACKAGE,\n SHAPE_ELEMENT,\n SHAPE_SLIDE,\n SHAPE_SNAPSHOT,\n SLIDE_DOCUMENT,\n SLIDE_PART,\n SLIDE_PART_NAME,\n SLIDE_SHAPES,\n type SlideData,\n type SlideShapeData,\n} from '../_internal-symbols.ts';\n\nconst TEXT_DECODER = new TextDecoder();\nconst TEXT_ENCODER = new TextEncoder();\nexport const decode = (b: Uint8Array): string => TEXT_DECODER.decode(b);\nexport const encode = (s: string): Uint8Array => TEXT_ENCODER.encode(s);\n\nexport const SLIDE_LAYOUT_CONTENT_TYPE =\n 'application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml';\nexport const SLIDE_CONTENT_TYPE =\n 'application/vnd.openxmlformats-officedocument.presentationml.slide+xml';\nexport const PRES_PART_NAME = partName('/ppt/presentation.xml');\n\nexport const NAME_PRESENTATION = qname('p', 'presentation', NS.pml);\nexport const NAME_SLD_MASTER_ID_LST = qname('p', 'sldMasterIdLst', NS.pml);\nexport const NAME_SLD_ID_LST = qname('p', 'sldIdLst', NS.pml);\nexport const NAME_SLD_ID = qname('p', 'sldId', NS.pml);\nexport const NAME_CSLD = qname('p', 'cSld', NS.pml);\nexport const NAME_SP_TREE = qname('p', 'spTree', NS.pml);\nexport const ATTR_ID = qname('', 'id', '');\nexport const ATTR_R_ID = qname('r', 'id', NS.officeDocRels);\n\n// PowerPoint accepts sldIds in [256, 2³¹−1024]. See plan §Risks.\nexport const SLD_ID_MIN = 256;\nexport const SLD_ID_MAX = 2147482623;\n\n// @internal — used by mutation functions to write SlideData state back\n// into the package and rebuild the typed view. Free functions, no class\n// dependency.\n\nexport const commitSlideData = (slide: SlideData): void => {\n const xml = serializeXml(slide[SLIDE_DOCUMENT]);\n const part = slide[INTERNAL_PACKAGE].getPart(slide[SLIDE_PART_NAME]);\n if (!part) throw new Error(`slide part missing: ${slide[SLIDE_PART_NAME]}`);\n part.data = encode(xml);\n};\n\nexport const refreshSlideData = (slide: SlideData): void => {\n const fresh = readSlidePart(slide[SLIDE_DOCUMENT].root);\n slide[SLIDE_PART] = fresh;\n const shapes = slide[SLIDE_SHAPES];\n for (let i = 0; i < shapes.length; i++) {\n const next = fresh.shapes[i];\n const existing = shapes[i];\n if (!next || !existing) continue;\n existing[SHAPE_ELEMENT] = next.element;\n existing[SHAPE_SNAPSHOT] = next;\n }\n};\n\n// Rebuild shape handles entirely — used when the shape count changes\n// (e.g. removeShape). Existing SlideShapeData identities are dropped;\n// SHAPE_SLIDE back-pointers stay consistent because the SlideData\n// reference is preserved.\nexport const rebuildShapesFromDocument = (slide: SlideData): void => {\n const fresh = readSlidePart(slide[SLIDE_DOCUMENT].root);\n slide[SLIDE_PART] = fresh;\n const shapes: SlideShapeData[] = [];\n for (const snap of fresh.shapes) {\n shapes.push({\n [SHAPE_SLIDE]: slide,\n [SHAPE_ELEMENT]: snap.element,\n [SHAPE_SNAPSHOT]: snap,\n });\n }\n slide[SLIDE_SHAPES] = shapes;\n};\n\nconst NAME_TX_BODY = qname('p', 'txBody', NS.pml);\n\nexport const requireSpPr = (shape: SlideShapeData): XmlElement => {\n const kind = shape[SHAPE_SNAPSHOT].kind;\n if (kind !== 'shape' && kind !== 'picture' && kind !== 'connector') {\n throw new Error(`fill/stroke is not supported on ${kind} shapes`);\n }\n const spPrName = qname('p', 'spPr', NS.pml);\n const el = shape[SHAPE_ELEMENT];\n let spPr = firstChildElement(el, spPrName);\n if (spPr === null) {\n spPr = { kind: 'element', name: spPrName, attrs: [], prefixDecls: new Map(), children: [] };\n el.children.push(spPr);\n }\n return spPr;\n};\n\nexport const requireTxBody = (shape: SlideShapeData): XmlElement => {\n if (shape[SHAPE_SNAPSHOT].kind !== 'shape') {\n throw new Error(\n `text operations require a shape kind; ${shape[SHAPE_SNAPSHOT].kind} is not text-bearing`,\n );\n }\n const txBody = firstChildElement(shape[SHAPE_ELEMENT], NAME_TX_BODY);\n if (txBody === null) {\n throw new Error(`shape \"${shape[SHAPE_SNAPSHOT].name}\" has no <p:txBody>`);\n }\n return txBody;\n};\n\nexport const commitAndRefresh = (shape: SlideShapeData): void => {\n commitSlideData(shape[SHAPE_SLIDE]);\n refreshSlideData(shape[SHAPE_SLIDE]);\n};\n\nexport const requireSpTree = (slide: SlideData): XmlElement => {\n const cSld = firstChildElement(slide[SLIDE_DOCUMENT].root, NAME_CSLD);\n if (!cSld) throw new Error('slide has no <p:cSld>');\n const spTree = firstChildElement(cSld, NAME_SP_TREE);\n if (!spTree) throw new Error('slide has no <p:spTree>');\n return spTree;\n};\n\nexport const nextShapeId = (slide: SlideData): number => {\n let maxId = 0;\n for (const s of slide[SLIDE_PART].shapes) {\n if (s.id > maxId) maxId = s.id;\n }\n return Math.max(maxId, 1) + 1;\n};\n\nexport const appendAndReturnNewShape = (slide: SlideData, child: XmlElement): SlideShapeData => {\n const spTree = requireSpTree(slide);\n spTree.children.push(child);\n commitSlideData(slide);\n const previousLength = slide[SLIDE_SHAPES].length;\n rebuildShapesFromDocument(slide);\n const created = slide[SLIDE_SHAPES][previousLength];\n if (!created) throw new Error('appendShape: post-condition failed');\n return created;\n};\n\nexport const setOpcDefault = (pkg: OpcPackage, extension: string, contentType: string): void => {\n const has = pkg.contentTypes.defaults.some((d) => d.extension.toLowerCase() === extension);\n if (!has) pkg.contentTypes.defaults.push({ extension, contentType });\n};\n","// Theme + fonts.\n\nimport {\n NS,\n type XmlElement,\n attr,\n elem,\n firstChildElement,\n getAttrValue,\n parseXml,\n qname,\n serializeXml,\n} from '../../internal/xml/index.ts';\nimport { parseSrgbHex } from '../../internal/drawingml/index.ts';\nimport type { OpcPackage } from '../../internal/parts/index.ts';\nimport { INTERNAL_PACKAGE, type PresentationData } from '../_internal-symbols.ts';\nimport { decode, encode } from './_helpers.ts';\n\n// ---------------------------------------------------------------------------\n// Theme.\n\n/**\n * The named color scheme on a presentation's theme. Each slot is a\n * `#RRGGBB` string — `sysClr` slots are flattened to their cached\n * `lastClr` value.\n */\nexport interface PresentationTheme {\n readonly name: string;\n readonly dark1: string;\n readonly light1: string;\n readonly dark2: string;\n readonly light2: string;\n readonly accent1: string;\n readonly accent2: string;\n readonly accent3: string;\n readonly accent4: string;\n readonly accent5: string;\n readonly accent6: string;\n readonly hyperlink: string;\n readonly followedHyperlink: string;\n}\n\nconst THEME_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.theme+xml';\n\nconst NAME_THEME_ELEMENTS = qname('a', 'themeElements', NS.dml);\nconst NAME_CLR_SCHEME = qname('a', 'clrScheme', NS.dml);\nconst NAME_SRGB_CLR = qname('a', 'srgbClr', NS.dml);\nconst NAME_SYS_CLR = qname('a', 'sysClr', NS.dml);\nconst ATTR_VAL = qname('', 'val', '');\nconst ATTR_NAME = qname('', 'name', '');\nconst ATTR_TYPEFACE = qname('', 'typeface', '');\n\n// `<a:clrScheme>` child order is a fixed XSD sequence\n// (`CT_ColorScheme`) — every slot below is required, in this order, on\n// any valid theme part. Maps `PresentationTheme` field names to the\n// local name of the scheme slot they read/write.\nconst CLR_SCHEME_SLOTS: ReadonlyArray<readonly [keyof Omit<PresentationTheme, 'name'>, string]> = [\n ['dark1', 'dk1'],\n ['light1', 'lt1'],\n ['dark2', 'dk2'],\n ['light2', 'lt2'],\n ['accent1', 'accent1'],\n ['accent2', 'accent2'],\n ['accent3', 'accent3'],\n ['accent4', 'accent4'],\n ['accent5', 'accent5'],\n ['accent6', 'accent6'],\n ['hyperlink', 'hlink'],\n ['followedHyperlink', 'folHlink'],\n];\n\nconst readSchemeSlot = (parent: XmlElement, local: string): string => {\n const slot = firstChildElement(parent, qname('a', local, NS.dml));\n if (!slot) return '';\n const srgb = firstChildElement(slot, NAME_SRGB_CLR);\n if (srgb) {\n const v = getAttrValue(srgb, qname('', 'val', ''));\n if (v) return `#${v.toUpperCase()}`;\n }\n const sys = firstChildElement(slot, NAME_SYS_CLR);\n if (sys) {\n const last = getAttrValue(sys, qname('', 'lastClr', ''));\n if (last) return `#${last.toUpperCase()}`;\n }\n return '';\n};\n\n/**\n * Returns the first theme's color scheme as `#RRGGBB` strings, or\n * `null` if the package carries no theme. Each accent slot maps\n * directly to the `accent1`–`accent6` chart palette defaults.\n *\n * Multi-master decks may carry several themes — v1 surfaces only the\n * first one found (alphabetical by part name). Per-master theme\n * lookup will land if a concrete user need shows up.\n */\nexport const getPresentationTheme = (pres: PresentationData): PresentationTheme | null =>\n themeFromPackage(pres[INTERNAL_PACKAGE]);\n\n/**\n * Returns the package's first theme part (by part name, alphabetical),\n * matching the \"first theme wins\" v1 semantics documented on\n * {@link getPresentationTheme}. Shared by every theme reader/writer so\n * they agree on which theme a multi-master deck exposes.\n */\nconst firstThemePart = (pkg: OpcPackage) =>\n pkg.parts\n .filter((p) => p.contentType === THEME_CONTENT_TYPE)\n .sort((a, b) => a.name.localeCompare(b.name))[0];\n\n/**\n * Package-level theme reader behind {@link getPresentationTheme}. Exposed so\n * helpers holding only a package handle (e.g. color baking off a `SlideData`)\n * can read the theme without a `PresentationData`.\n *\n * @internal\n */\nexport const themeFromPackage = (pkg: OpcPackage): PresentationTheme | null => {\n const themePart = firstThemePart(pkg);\n if (!themePart) return null;\n const root = parseXml(decode(themePart.data)).root;\n const themeElements = firstChildElement(root, NAME_THEME_ELEMENTS);\n if (!themeElements) return null;\n const clrScheme = firstChildElement(themeElements, NAME_CLR_SCHEME);\n if (!clrScheme) return null;\n return {\n name: getAttrValue(clrScheme, qname('', 'name', '')) ?? '',\n dark1: readSchemeSlot(clrScheme, 'dk1'),\n light1: readSchemeSlot(clrScheme, 'lt1'),\n dark2: readSchemeSlot(clrScheme, 'dk2'),\n light2: readSchemeSlot(clrScheme, 'lt2'),\n accent1: readSchemeSlot(clrScheme, 'accent1'),\n accent2: readSchemeSlot(clrScheme, 'accent2'),\n accent3: readSchemeSlot(clrScheme, 'accent3'),\n accent4: readSchemeSlot(clrScheme, 'accent4'),\n accent5: readSchemeSlot(clrScheme, 'accent5'),\n accent6: readSchemeSlot(clrScheme, 'accent6'),\n hyperlink: readSchemeSlot(clrScheme, 'hlink'),\n followedHyperlink: readSchemeSlot(clrScheme, 'folHlink'),\n };\n};\n\n/**\n * The theme's font scheme, flattened to the typefaces the runs in a\n * deck inherit by default. `major*` is the heading font (slide\n * titles, chart titles); `minor*` is the body font.\n *\n * Each field carries the Latin / East-Asian / Complex-Script\n * typeface name as written on the theme. Empty values are\n * normalized to `null`.\n */\nexport interface PresentationFonts {\n readonly majorLatin: string | null;\n readonly majorEastAsian: string | null;\n readonly majorComplexScript: string | null;\n readonly minorLatin: string | null;\n readonly minorEastAsian: string | null;\n readonly minorComplexScript: string | null;\n}\n\nconst readTypeface = (parent: XmlElement | null, local: string): string | null => {\n if (!parent) return null;\n const el = firstChildElement(parent, qname('a', local, NS.dml));\n if (!el) return null;\n const v = getAttrValue(el, qname('', 'typeface', ''));\n if (!v) return null;\n return v;\n};\n\n/**\n * Returns the first theme's font scheme, or `null` when the package\n * carries no theme. As with `getPresentationTheme`, multi-master\n * decks surface only the first theme found (alphabetical by part\n * name); per-master font lookup will land if needed.\n */\nexport const getPresentationFonts = (pres: PresentationData): PresentationFonts | null => {\n const pkg = pres[INTERNAL_PACKAGE];\n const themePart = firstThemePart(pkg);\n if (!themePart) return null;\n const root = parseXml(decode(themePart.data)).root;\n const themeElements = firstChildElement(root, NAME_THEME_ELEMENTS);\n if (!themeElements) return null;\n const fontScheme = firstChildElement(themeElements, qname('a', 'fontScheme', NS.dml));\n if (!fontScheme) return null;\n const majorFont = firstChildElement(fontScheme, qname('a', 'majorFont', NS.dml));\n const minorFont = firstChildElement(fontScheme, qname('a', 'minorFont', NS.dml));\n return {\n majorLatin: readTypeface(majorFont, 'latin'),\n majorEastAsian: readTypeface(majorFont, 'ea'),\n majorComplexScript: readTypeface(majorFont, 'cs'),\n minorLatin: readTypeface(minorFont, 'latin'),\n minorEastAsian: readTypeface(minorFont, 'ea'),\n minorComplexScript: readTypeface(minorFont, 'cs'),\n };\n};\n\n/**\n * Overwrites the named slots of the package's first theme's color\n * scheme (`<a:clrScheme>`), leaving every other slot untouched. Slot\n * values are `#RRGGBB` (or 3-digit `#RGB`) strings; every branded\n * `srgbClr`/`sysClr` slot is normalized to a plain `<a:srgbClr>` on\n * write, since a theme slot is never a scheme-color reference.\n *\n * As with `getPresentationTheme`, multi-master decks are branded via\n * their first theme part only — call this once per theme part if a\n * deck's masters carry different themes.\n *\n * Throws if the presentation has no theme part, or if a provided color\n * isn't a valid `#RRGGBB` string.\n */\nexport const setPresentationTheme = (\n pres: PresentationData,\n theme: Partial<Omit<PresentationTheme, 'name'>> & { name?: string },\n): void => {\n const pkg = pres[INTERNAL_PACKAGE];\n const themePart = firstThemePart(pkg);\n if (!themePart) throw new Error('setPresentationTheme: presentation has no theme part');\n const doc = parseXml(decode(themePart.data));\n const themeElements = firstChildElement(doc.root, NAME_THEME_ELEMENTS);\n if (!themeElements) throw new Error('setPresentationTheme: theme part has no <a:themeElements>');\n const clrScheme = firstChildElement(themeElements, NAME_CLR_SCHEME);\n if (!clrScheme) throw new Error('setPresentationTheme: theme part has no <a:clrScheme>');\n\n if (theme.name !== undefined) {\n clrScheme.attrs = clrScheme.attrs.filter((a) => a.name.localName !== 'name');\n clrScheme.attrs.push(attr(ATTR_NAME, theme.name));\n }\n\n for (const [field, local] of CLR_SCHEME_SLOTS) {\n const value = theme[field];\n if (value === undefined) continue;\n const hex = parseSrgbHex(value);\n if (hex === null) {\n throw new Error(\n `setPresentationTheme: \"${field}\" must be a #RRGGBB or #RGB color, got ${JSON.stringify(value)}`,\n );\n }\n const slotName = qname('a', local, NS.dml);\n const idx = clrScheme.children.findIndex(\n (c) => c.kind === 'element' && c.name.namespaceURI === NS.dml && c.name.localName === local,\n );\n if (idx < 0) {\n throw new Error(`setPresentationTheme: clrScheme is missing <a:${local}>`);\n }\n clrScheme.children[idx] = elem(slotName, {\n children: [elem(NAME_SRGB_CLR, { attrs: [attr(ATTR_VAL, hex)] })],\n });\n }\n\n themePart.data = encode(serializeXml(doc));\n};\n\n/**\n * Typeface overrides for {@link setPresentationFonts}. Unlike\n * `PresentationFonts` (the read side, where an empty typeface value\n * flattens to `null`), every field here is a plain string — the\n * underlying `<a:latin>` / `<a:ea>` / `<a:cs>` elements are mandatory on\n * a valid theme, so there's no \"clear this typeface\" operation.\n */\nexport interface PresentationFontsInput {\n readonly majorLatin?: string;\n readonly majorEastAsian?: string;\n readonly majorComplexScript?: string;\n readonly minorLatin?: string;\n readonly minorEastAsian?: string;\n readonly minorComplexScript?: string;\n}\n\nconst setTypeface = (fontCollection: XmlElement, local: string, typeface: string): void => {\n const el = firstChildElement(fontCollection, qname('a', local, NS.dml));\n if (!el) throw new Error(`setPresentationFonts: fontScheme is missing <a:${local}>`);\n el.attrs = el.attrs.filter((a) => a.name.localName !== 'typeface');\n el.attrs.push(attr(ATTR_TYPEFACE, typeface));\n};\n\n/**\n * Overwrites the named typefaces of the package's first theme's font\n * scheme (major = headings, minor = body), leaving unset fields\n * untouched. As with `setPresentationTheme`, only the first theme part\n * is branded.\n *\n * Throws if the presentation has no theme part.\n */\nexport const setPresentationFonts = (\n pres: PresentationData,\n fonts: PresentationFontsInput,\n): void => {\n const pkg = pres[INTERNAL_PACKAGE];\n const themePart = firstThemePart(pkg);\n if (!themePart) throw new Error('setPresentationFonts: presentation has no theme part');\n const doc = parseXml(decode(themePart.data));\n const themeElements = firstChildElement(doc.root, NAME_THEME_ELEMENTS);\n if (!themeElements) throw new Error('setPresentationFonts: theme part has no <a:themeElements>');\n const fontScheme = firstChildElement(themeElements, qname('a', 'fontScheme', NS.dml));\n if (!fontScheme) throw new Error('setPresentationFonts: theme part has no <a:fontScheme>');\n const majorFont = firstChildElement(fontScheme, qname('a', 'majorFont', NS.dml));\n if (!majorFont) throw new Error('setPresentationFonts: fontScheme has no <a:majorFont>');\n const minorFont = firstChildElement(fontScheme, qname('a', 'minorFont', NS.dml));\n if (!minorFont) throw new Error('setPresentationFonts: fontScheme has no <a:minorFont>');\n\n if (fonts.majorLatin !== undefined) setTypeface(majorFont, 'latin', fonts.majorLatin);\n if (fonts.majorEastAsian !== undefined) setTypeface(majorFont, 'ea', fonts.majorEastAsian);\n if (fonts.majorComplexScript !== undefined)\n setTypeface(majorFont, 'cs', fonts.majorComplexScript);\n if (fonts.minorLatin !== undefined) setTypeface(minorFont, 'latin', fonts.minorLatin);\n if (fonts.minorEastAsian !== undefined) setTypeface(minorFont, 'ea', fonts.minorEastAsian);\n if (fonts.minorComplexScript !== undefined)\n setTypeface(minorFont, 'cs', fonts.minorComplexScript);\n\n themePart.data = encode(serializeXml(doc));\n};\n","// Slide comments.\nimport { getSlides } from './slide-query.ts';\n\nimport { type PartName, emptyRels, nextRelId, partName } from '../../internal/opc/index.ts';\nimport type { OpcPackage } from '../../internal/parts/index.ts';\nimport {\n REL_TYPES,\n type CommentAuthor,\n type CommentPosition,\n type SlideComment,\n buildCommentAuthorListDoc,\n buildCommentListDoc,\n readCommentAuthorList,\n readCommentList,\n} from '../../internal/presentationml/index.ts';\nimport { parseXml, serializeXml } from '../../internal/xml/index.ts';\nimport {\n COMMENT_SLIDE,\n COMMENT_SNAPSHOT,\n INTERNAL_PACKAGE,\n type PresentationData,\n SLIDE_PART_NAME,\n type SlideCommentData,\n type SlideData,\n} from '../_internal-symbols.ts';\nimport { PRES_PART_NAME, decode, encode } from './_helpers.ts';\n// ---------------------------------------------------------------------------\n// Comments.\n//\n// Legacy schema (ECMA-376 Part 1 §19.4):\n// * One package-level `/ppt/commentAuthors.xml` holds every author.\n// * One `/ppt/comments/comment{N}.xml` per slide that has comments;\n// N matches the slide's part name.\n// * Slide rels reference the slide's comments part; presentation rels\n// reference the author list.\n//\n// Authors are deduped by (name, initials). `idx` allocation is per-author\n// monotonic; we read each author's `lastIdx` and bump it on add.\n\nconst COMMENT_AUTHORS_PART_NAME = partName('/ppt/commentAuthors.xml');\nconst COMMENT_AUTHORS_CONTENT_TYPE =\n 'application/vnd.openxmlformats-officedocument.presentationml.commentAuthors+xml';\nconst COMMENTS_CONTENT_TYPE =\n 'application/vnd.openxmlformats-officedocument.presentationml.comments+xml';\n\nconst slideNumberFromPartName = (name: PartName): number => {\n const m = name.match(/^\\/ppt\\/slides\\/slide(\\d+)\\.xml$/);\n if (!m?.[1]) {\n throw new Error(`comments: cannot derive slide number from ${name}`);\n }\n return Number.parseInt(m[1], 10);\n};\n\nconst commentsPartNameForSlide = (slide: SlideData): PartName => {\n const slideN = slideNumberFromPartName(slide[SLIDE_PART_NAME]);\n return partName(`/ppt/comments/comment${slideN}.xml`);\n};\n\nconst loadAuthorList = (pkg: OpcPackage): CommentAuthor[] => {\n const part = pkg.getPart(COMMENT_AUTHORS_PART_NAME);\n if (part === null) return [];\n const list = readCommentAuthorList(parseXml(decode(part.data)).root);\n return list.authors.slice();\n};\n\nconst writeAuthorList = (pkg: OpcPackage, authors: ReadonlyArray<CommentAuthor>): void => {\n const doc = buildCommentAuthorListDoc(authors);\n const bytes = encode(serializeXml(doc));\n const existing = pkg.getPart(COMMENT_AUTHORS_PART_NAME);\n if (existing !== null) {\n existing.data = bytes;\n return;\n }\n pkg.addPart(COMMENT_AUTHORS_PART_NAME, COMMENT_AUTHORS_CONTENT_TYPE, bytes);\n // presentation → commentAuthors rel.\n const presRels = pkg.getRels(PRES_PART_NAME) ?? emptyRels();\n const exists = presRels.items.some(\n (r) => r.type === REL_TYPES.commentAuthors && r.target.endsWith('commentAuthors.xml'),\n );\n if (!exists) {\n presRels.items.push({\n id: nextRelId(presRels.items.map((r) => r.id)),\n type: REL_TYPES.commentAuthors,\n target: 'commentAuthors.xml',\n targetMode: 'Internal',\n });\n pkg.setRels(PRES_PART_NAME, presRels);\n }\n};\n\nconst loadCommentsForSlide = (slide: SlideData): SlideComment[] => {\n const pkg = slide[INTERNAL_PACKAGE];\n const partNameValue = commentsPartNameForSlide(slide);\n const part = pkg.getPart(partNameValue);\n if (part === null) return [];\n const list = readCommentList(parseXml(decode(part.data)).root);\n return list.comments.slice();\n};\n\nconst writeCommentsForSlide = (slide: SlideData, comments: ReadonlyArray<SlideComment>): void => {\n const pkg = slide[INTERNAL_PACKAGE];\n const commentsName = commentsPartNameForSlide(slide);\n\n if (comments.length === 0) {\n // Drop the comments part + slide → comments rel when no comments\n // remain. Leaves an empty part orphaned otherwise.\n if (pkg.getPart(commentsName) !== null) {\n pkg.removePart(commentsName);\n }\n const slideRels = pkg.getRels(slide[SLIDE_PART_NAME]);\n if (slideRels !== null) {\n const before = slideRels.items.length;\n slideRels.items = slideRels.items.filter((r) => r.type !== REL_TYPES.comments);\n if (slideRels.items.length !== before) {\n pkg.setRels(slide[SLIDE_PART_NAME], slideRels);\n }\n }\n return;\n }\n\n const doc = buildCommentListDoc(comments);\n const bytes = encode(serializeXml(doc));\n const existing = pkg.getPart(commentsName);\n if (existing !== null) {\n existing.data = bytes;\n return;\n }\n pkg.addPart(commentsName, COMMENTS_CONTENT_TYPE, bytes);\n\n const slideRels = pkg.getRels(slide[SLIDE_PART_NAME]) ?? emptyRels();\n const hasRel = slideRels.items.some((r) => r.type === REL_TYPES.comments);\n if (!hasRel) {\n const slideN = slideNumberFromPartName(slide[SLIDE_PART_NAME]);\n slideRels.items.push({\n id: nextRelId(slideRels.items.map((r) => r.id)),\n type: REL_TYPES.comments,\n target: `../comments/comment${slideN}.xml`,\n targetMode: 'Internal',\n });\n pkg.setRels(slide[SLIDE_PART_NAME], slideRels);\n }\n};\n\nconst asCommentData = (\n slide: SlideData,\n snap: SlideComment,\n author: CommentAuthor,\n): SlideCommentData => ({\n [COMMENT_SLIDE]: slide,\n [COMMENT_SNAPSHOT]: snap,\n author,\n});\n\n/**\n * Every author known to the package's `commentAuthors.xml`.\n * Returns an empty array when no author list exists.\n */\nexport const getCommentAuthors = (pres: PresentationData): ReadonlyArray<CommentAuthor> =>\n loadAuthorList(pres[INTERNAL_PACKAGE]);\n\n/**\n * Returns every slide that has at least one comment by the given\n * author name. Accepts a literal string (exact-equality) or a\n * `RegExp` for pattern matches. Sibling of `findCommentsByAuthor`\n * (which returns the comments themselves).\n */\nexport const findSlidesWithCommentsByAuthor = (\n pres: PresentationData,\n authorName: string | RegExp,\n): ReadonlyArray<SlideData> => {\n const matches =\n typeof authorName === 'string'\n ? (n: string) => n === authorName\n : (n: string) => authorName.test(n);\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n if (getSlideComments(slide).some((c) => matches(c.author.name))) out.push(slide);\n }\n return out;\n};\n\n/**\n * Returns every distinct author who has at least one comment\n * anywhere in the deck. Deduplicates by author id; preserves\n * first-seen order. Differs from `getCommentAuthors(pres)`, which\n * surfaces every author registered in `commentAuthors.xml` even\n * when no comments reference them.\n */\nexport const getPresentationCommenters = (pres: PresentationData): ReadonlyArray<CommentAuthor> => {\n const seen = new Set<number>();\n const out: CommentAuthor[] = [];\n for (const slide of getSlides(pres)) {\n for (const c of getSlideComments(slide)) {\n if (seen.has(c.author.id)) continue;\n seen.add(c.author.id);\n out.push(c.author);\n }\n }\n return out;\n};\n\n/**\n * Histogram of comment counts by author display name across the whole\n * deck. Useful for \"who reviewed this deck the most?\" audits.\n * Authors with the same display name (a real-world case for shared\n * mailbox identities) get merged into the same bucket; pair with\n * `getPresentationCommenters` when you need to keep authors with\n * identical names separate by `id`.\n */\nexport const getPresentationCommentCountsByAuthor = (\n pres: PresentationData,\n): Readonly<Record<string, number>> => {\n const counts: Record<string, number> = {};\n for (const slide of getSlides(pres)) {\n for (const c of getSlideComments(slide)) {\n const name = c.author.name;\n counts[name] = (counts[name] ?? 0) + 1;\n }\n }\n return counts;\n};\n\n/**\n * Dense histogram of comment counts by 0-based slide index. Every\n * slide in the deck appears as an element (count `0` when the slide\n * has no comments), so the array shape is dense — handy for charting\n * comment density per slide without re-indexing.\n */\nexport const getPresentationCommentCountsBySlide = (\n pres: PresentationData,\n): ReadonlyArray<number> => {\n const slides = getSlides(pres);\n return slides.map((s) => getSlideComments(s).length);\n};\n\n/**\n * Looks up a `CommentAuthor` from `commentAuthors.xml` by display\n * name. Accepts a literal string (exact equality) or a `RegExp` for\n * pattern matches. Returns `null` when no author matches. Sibling of\n * `findCommentsByAuthor` — the latter returns the matching comments;\n * this returns the author handle for downstream metadata reads (id,\n * initials, color).\n */\nexport const findCommentAuthorByName = (\n pres: PresentationData,\n authorName: string | RegExp,\n): CommentAuthor | null => {\n for (const a of getCommentAuthors(pres)) {\n const hit = typeof authorName === 'string' ? a.name === authorName : authorName.test(a.name);\n if (hit) return a;\n }\n return null;\n};\n\n/**\n * Returns every comment whose author name matches `authorName`\n * across every slide in the deck. Accepts a literal string (exact-\n * equality) or a `RegExp` for pattern matches — useful for reviewer-\n * specific filters (\"show me all of Alice's notes\" / `/^review-bot/`).\n */\nexport const findCommentsByAuthor = (\n pres: PresentationData,\n authorName: string | RegExp,\n): ReadonlyArray<SlideCommentData> => {\n const out: SlideCommentData[] = [];\n for (const slide of getSlides(pres)) {\n for (const c of getSlideComments(slide)) {\n const hit =\n typeof authorName === 'string'\n ? c.author.name === authorName\n : authorName.test(c.author.name);\n if (hit) out.push(c);\n }\n }\n return out;\n};\n\n/**\n * Returns every comment whose text matches `needle` (substring or\n * `RegExp`) across the whole deck. Sibling of `findCommentsByAuthor`\n * — useful for \"find every comment that mentions X\" reviewer flows.\n */\nexport const findCommentsByText = (\n pres: PresentationData,\n needle: string | RegExp,\n): ReadonlyArray<SlideCommentData> => {\n const out: SlideCommentData[] = [];\n for (const slide of getSlides(pres)) {\n for (const c of getSlideComments(slide)) {\n const text = c[COMMENT_SNAPSHOT].text;\n const hit = typeof needle === 'string' ? text.includes(needle) : needle.test(text);\n if (hit) out.push(c);\n }\n }\n return out;\n};\n\n/**\n * Returns every comment whose `@dt` timestamp is **strictly after**\n * `since` (an ISO-8601 string or `Date`). Comments missing a `dt`\n * are skipped. Sibling of `findCommentsByText` / `findCommentsByAuthor`\n * — useful for \"what's new since my last review?\" surfaces.\n */\nexport const findCommentsAfter = (\n pres: PresentationData,\n since: string | Date,\n): ReadonlyArray<SlideCommentData> => {\n const threshold = typeof since === 'string' ? Date.parse(since) : since.getTime();\n if (Number.isNaN(threshold)) return [];\n const out: SlideCommentData[] = [];\n for (const slide of getSlides(pres)) {\n for (const c of getSlideComments(slide)) {\n const dt = c[COMMENT_SNAPSHOT].dt;\n if (dt === null) continue;\n const t = Date.parse(dt);\n if (Number.isNaN(t)) continue;\n if (t > threshold) out.push(c);\n }\n }\n return out;\n};\n\n/**\n * Returns every comment whose `@dt` timestamp is **strictly before**\n * `until` (an ISO-8601 string or `Date`). Comments missing a `dt`\n * are skipped. Sibling of `findCommentsAfter`.\n */\nexport const findCommentsBefore = (\n pres: PresentationData,\n until: string | Date,\n): ReadonlyArray<SlideCommentData> => {\n const threshold = typeof until === 'string' ? Date.parse(until) : until.getTime();\n if (Number.isNaN(threshold)) return [];\n const out: SlideCommentData[] = [];\n for (const slide of getSlides(pres)) {\n for (const c of getSlideComments(slide)) {\n const dt = c[COMMENT_SNAPSHOT].dt;\n if (dt === null) continue;\n const t = Date.parse(dt);\n if (Number.isNaN(t)) continue;\n if (t < threshold) out.push(c);\n }\n }\n return out;\n};\n\nconst datedComments = (\n pres: PresentationData,\n): ReadonlyArray<{ comment: SlideCommentData; t: number }> => {\n const out: { comment: SlideCommentData; t: number }[] = [];\n for (const slide of getSlides(pres)) {\n for (const c of getSlideComments(slide)) {\n const dt = c[COMMENT_SNAPSHOT].dt;\n if (dt === null) continue;\n const t = Date.parse(dt);\n if (!Number.isNaN(t)) out.push({ comment: c, t });\n }\n }\n return out;\n};\n\n/**\n * Returns every comment carrying a parseable `@dt`, sorted oldest\n * to newest. Comments without a date are omitted. Use `.at(0)` for\n * the oldest and `.at(-1)` for the newest.\n */\nexport const getCommentsSortedByDate = (\n pres: PresentationData,\n): ReadonlyArray<SlideCommentData> => {\n const dated = [...datedComments(pres)];\n dated.sort((a, b) => a.t - b.t);\n return dated.map((d) => d.comment);\n};\n\n/**\n * Returns the distinct authors who commented on this slide, in\n * first-seen order. Dedupes by author id. Sibling of\n * `getPresentationCommenters` for a slide-scoped reviewer roster.\n */\nexport const getSlideCommentAuthors = (slide: SlideData): ReadonlyArray<CommentAuthor> => {\n const seen = new Set<number>();\n const out: CommentAuthor[] = [];\n for (const c of getSlideComments(slide)) {\n if (seen.has(c.author.id)) continue;\n seen.add(c.author.id);\n out.push(c.author);\n }\n return out;\n};\n\n/**\n * Returns every comment attached to the slide, with the author already\n * resolved. The list is read-only — use `addSlideComment` /\n * `removeSlideComment` to mutate.\n */\nexport const getSlideComments = (slide: SlideData): ReadonlyArray<SlideCommentData> => {\n const pkg = slide[INTERNAL_PACKAGE];\n const authors = loadAuthorList(pkg);\n const authorById = new Map<number, CommentAuthor>();\n for (const a of authors) authorById.set(a.id, a);\n\n const comments = loadCommentsForSlide(slide);\n const out: SlideCommentData[] = [];\n for (const snap of comments) {\n const author = authorById.get(snap.authorId);\n if (!author) {\n // Comment references an unknown author — surface a synthetic\n // placeholder rather than dropping the comment silently.\n out.push(\n asCommentData(slide, snap, {\n id: snap.authorId,\n name: '',\n initials: '',\n lastIdx: snap.idx,\n clrIdx: null,\n }),\n );\n continue;\n }\n out.push(asCommentData(slide, snap, author));\n }\n return out;\n};\n\n/**\n * Adds a comment to the slide. Returns the new comment handle.\n *\n * Author handling: if an author with the given `name`+`initials` already\n * exists in `commentAuthors.xml`, the existing record is reused (and its\n * `lastIdx` is bumped). Otherwise a new author is allocated. `initials`\n * defaults to the first character of `name`.\n *\n * `position` is in EMU; pass `null` to omit the `<p:pos>` element.\n * `date` defaults to the current time.\n */\nexport const addSlideComment = (\n slide: SlideData,\n opts: {\n author: { name: string; initials?: string };\n text: string;\n position?: CommentPosition | null;\n date?: Date;\n },\n): SlideCommentData => {\n const pkg = slide[INTERNAL_PACKAGE];\n const initials =\n opts.author.initials ?? (opts.author.name.length > 0 ? opts.author.name.charAt(0) : '?');\n\n const authors = loadAuthorList(pkg);\n let author = authors.find((a) => a.name === opts.author.name && a.initials === initials);\n if (!author) {\n let maxId = -1;\n for (const a of authors) if (a.id > maxId) maxId = a.id;\n author = {\n id: maxId + 1,\n name: opts.author.name,\n initials,\n lastIdx: 0,\n clrIdx: null,\n };\n authors.push(author);\n }\n const newIdx = author.lastIdx + 1;\n // Bump lastIdx on the author for the persisted list.\n const updatedAuthor: CommentAuthor = { ...author, lastIdx: newIdx };\n const persistedAuthors = authors.map((a) => (a.id === author!.id ? updatedAuthor : a));\n writeAuthorList(pkg, persistedAuthors);\n\n const dt = (opts.date ?? new Date()).toISOString();\n const snap: SlideComment = {\n authorId: updatedAuthor.id,\n idx: newIdx,\n dt,\n text: opts.text,\n position: opts.position ?? null,\n };\n\n const comments = loadCommentsForSlide(slide);\n comments.push(snap);\n writeCommentsForSlide(slide, comments);\n\n return asCommentData(slide, snap, updatedAuthor);\n};\n\n/**\n * Removes the comment from its slide's comments part. If the comment\n * was the last one on the slide, the comments part and the\n * slide → comments rel are also removed. The author entry in\n * `commentAuthors.xml` is left intact (an author may have comments on\n * other slides).\n */\nexport const removeSlideComment = (comment: SlideCommentData): void => {\n const slide = comment[COMMENT_SLIDE];\n const target = comment[COMMENT_SNAPSHOT];\n const remaining = loadCommentsForSlide(slide).filter(\n (c) => !(c.authorId === target.authorId && c.idx === target.idx),\n );\n writeCommentsForSlide(slide, remaining);\n};\n\n/**\n * Strips every comment from every slide in the deck. Returns the\n * number of comments removed. Built on `writeCommentsForSlide`,\n * so each slide's modern comment part is rewritten with an empty\n * list. The `commentAuthors.xml` registry is left intact for any\n * caller that still needs author identity.\n *\n * Useful as a sanitizer before sharing a draft externally — pairs\n * with `clearAllSlideNotes` for a \"remove reviewer chatter\" pass.\n */\nexport const clearAllSlideComments = (pres: PresentationData): number => {\n let n = 0;\n for (const slide of getSlides(pres)) n += clearSlideComments(slide);\n return n;\n};\n\n/**\n * Slide-scoped sibling of `clearAllSlideComments`. Removes every\n * comment on the given slide and returns the number removed.\n */\nexport const clearSlideComments = (slide: SlideData): number => {\n const comments = loadCommentsForSlide(slide);\n if (comments.length === 0) return 0;\n writeCommentsForSlide(slide, []);\n return comments.length;\n};\n\n// Accessors over CommentAuthor / SlideCommentData for tree-shake convenience.\n\nexport const getCommentAuthor = (comment: SlideCommentData): CommentAuthor => comment.author;\nexport const getCommentText = (comment: SlideCommentData): string => comment[COMMENT_SNAPSHOT].text;\nexport const getCommentDate = (comment: SlideCommentData): string | null =>\n comment[COMMENT_SNAPSHOT].dt;\nexport const getCommentPosition = (comment: SlideCommentData): CommentPosition | null =>\n comment[COMMENT_SNAPSHOT].position;\n\n/**\n * Returns the slide that owns this comment. Counterpart to\n * `getShapeSlide(shape)` — handy when filtering across the deck\n * with `findCommentsByAuthor` and the caller needs to know which\n * slide each hit came from.\n */\nexport const getCommentSlide = (comment: SlideCommentData): SlideData => comment[COMMENT_SLIDE];\n","// Shape image replacement.\n\nimport { getPictureEmbedRId } from '../../internal/drawingml/index.ts';\nimport { readPosition, readSize, setPosition, setSize } from '../../internal/drawingml/index.ts';\nimport {\n type ImageFormat,\n contentTypeForFormat,\n detectImageFormat,\n extensionForFormat,\n partName,\n readImagePixelSize,\n resolveTarget,\n} from '../../internal/opc/index.ts';\nimport type { Emu } from '../units.ts';\nimport {\n INTERNAL_PACKAGE,\n SHAPE_ELEMENT,\n SHAPE_SLIDE,\n SHAPE_SNAPSHOT,\n SLIDE_PART_NAME,\n type SlideShapeData,\n} from '../_internal-symbols.ts';\nimport { commitSlideData, refreshSlideData } from './_helpers.ts';\n// ---------------------------------------------------------------------------\n\n/**\n * How an image fills its target box:\n *\n * - `'fill'` — stretch to the exact `w × h`, ignoring aspect ratio\n * (the historical behavior, and the default for back-compat).\n * - `'contain'` — scale to fit inside the box preserving aspect ratio,\n * then center the result. The box's empty margins stay transparent.\n */\nexport type ImageFit = 'fill' | 'contain';\n\n/**\n * Computes the placed rectangle for an image inside a `(x, y, w, h)` box.\n *\n * For `'contain'` the image is scaled by the smaller of the two axis\n * ratios so it fits entirely, then centered in the leftover space. When\n * the natural size is unknown (non-PNG/JPEG, or an unreadable header)\n * `naturalSize` is `null` and we fall back to `'fill'` — callers pass the\n * raw bytes; measuring is best-effort, not a hard requirement.\n */\nexport const fitImageRect = (\n box: { x: Emu; y: Emu; w: Emu; h: Emu },\n fit: ImageFit,\n naturalSize: { width: number; height: number } | null,\n): { x: Emu; y: Emu; w: Emu; h: Emu } => {\n if (fit === 'fill' || naturalSize === null) return box;\n const scale = Math.min(box.w / naturalSize.width, box.h / naturalSize.height);\n const w = Math.round(naturalSize.width * scale);\n const h = Math.round(naturalSize.height * scale);\n const x = box.x + Math.round((box.w - w) / 2);\n const y = box.y + Math.round((box.h - h) / 2);\n return { x: x as Emu, y: y as Emu, w: w as Emu, h: h as Emu };\n};\n\n/**\n * Replaces a picture's media with `bytes`. Same-format replacements\n * write in place; cross-format replacements allocate a new media part\n * and repoint the rel. The geometry — crop, transform — is preserved.\n *\n * Pass `options.fit: 'contain'` to re-fit the picture's extent to the\n * replacement image's aspect ratio, inscribed and centered in the shape's\n * current `(off, ext)` box. The default `'fill'` leaves the extent as-is\n * (the historical behavior). When the new image's natural size can't be\n * measured (non-PNG/JPEG), `'contain'` is a no-op rather than an error.\n */\nexport const setShapeImage = (\n shape: SlideShapeData,\n bytes: Uint8Array,\n options: { format?: ImageFormat; fit?: ImageFit } = {},\n): void => {\n if (shape[SHAPE_SNAPSHOT].kind !== 'picture') {\n throw new Error(\n `setShapeImage only works on picture shapes; ${shape[SHAPE_SNAPSHOT].kind} is not one`,\n );\n }\n const format = options.format ?? detectImageFormat(bytes);\n if (format === null) {\n throw new Error(\n 'setShapeImage: could not detect image format. Pass options.format explicitly.',\n );\n }\n const rEmbed = getPictureEmbedRId(shape[SHAPE_ELEMENT]);\n if (rEmbed === null) {\n throw new Error(`picture \"${shape[SHAPE_SNAPSHOT].name}\" has no r:embed`);\n }\n const slide = shape[SHAPE_SLIDE];\n const pkg = slide[INTERNAL_PACKAGE];\n const rels = pkg.getRels(slide[SLIDE_PART_NAME]);\n if (rels === null) throw new Error(`slide ${slide[SLIDE_PART_NAME]} has no rels`);\n const rel = rels.items.find((r) => r.id === rEmbed);\n if (!rel) throw new Error(`slide rels missing entry for r:embed=\"${rEmbed}\"`);\n\n const mediaName = rel.target.startsWith('/')\n ? partName(rel.target)\n : resolveTarget(slide[SLIDE_PART_NAME], rel.target);\n const newExtension = extensionForFormat(format);\n const newContentType = contentTypeForFormat(format);\n const dotIdx = mediaName.lastIndexOf('.');\n const currentExtension = dotIdx >= 0 ? mediaName.slice(dotIdx + 1).toLowerCase() : '';\n\n if (currentExtension === newExtension) {\n const part = pkg.getPart(mediaName);\n if (!part) throw new Error(`media part missing: ${mediaName}`);\n part.data = bytes;\n part.contentType = newContentType;\n } else {\n let nextN = 1;\n const mediaPathRegex = /^\\/ppt\\/media\\/image(\\d+)\\./;\n for (const p of pkg.parts) {\n const m = p.name.match(mediaPathRegex);\n if (m?.[1] !== undefined) {\n const num = Number.parseInt(m[1], 10);\n if (Number.isFinite(num) && num >= nextN) nextN = num + 1;\n }\n }\n const newPartName = partName(`/ppt/media/image${nextN}.${newExtension}`);\n const hasDefault = pkg.contentTypes.defaults.some(\n (d) => d.extension.toLowerCase() === newExtension,\n );\n if (!hasDefault) {\n pkg.contentTypes.defaults.push({ extension: newExtension, contentType: newContentType });\n }\n pkg.addPart(newPartName, newContentType, bytes);\n rel.target = `../media/image${nextN}.${newExtension}`;\n pkg.setRels(slide[SLIDE_PART_NAME], rels);\n }\n\n // 'contain' re-fits the picture's extent to the new image's aspect ratio\n // inside the shape's current box; 'fill' (the default) leaves geometry as\n // PowerPoint had it. Natural size is best-effort — unreadable headers\n // leave the box unchanged.\n if (options.fit === 'contain') {\n const pos = readPosition(shape[SHAPE_ELEMENT], 'picture');\n const size = readSize(shape[SHAPE_ELEMENT], 'picture');\n const natural = readImagePixelSize(bytes);\n if (pos !== null && size !== null && natural !== null) {\n const fitted = fitImageRect(\n { x: pos.x as Emu, y: pos.y as Emu, w: size.w as Emu, h: size.h as Emu },\n 'contain',\n natural,\n );\n setPosition(shape[SHAPE_ELEMENT], 'picture', fitted.x, fitted.y);\n setSize(shape[SHAPE_ELEMENT], 'picture', fitted.w, fitted.h);\n commitSlideData(slide);\n refreshSlideData(slide);\n }\n }\n};\n","// Shape click action.\nimport { getSlides } from './slide-query.ts';\n\nimport {\n basename,\n emptyRels,\n nextRelId,\n partName,\n resolveTarget,\n} from '../../internal/opc/index.ts';\nimport type { OpcPackage } from '../../internal/parts/index.ts';\nimport { REL_TYPES } from '../../internal/presentationml/index.ts';\nimport {\n NS,\n type XmlElement,\n attr,\n elem,\n firstChildElement,\n getAttrValue,\n qname,\n} from '../../internal/xml/index.ts';\nimport {\n INTERNAL_PACKAGE,\n type PresentationData,\n SHAPE_ELEMENT,\n SHAPE_SLIDE,\n SHAPE_SNAPSHOT,\n SLIDE_PART_NAME,\n type SlideData,\n type SlideShapeData,\n} from '../_internal-symbols.ts';\nimport { commitAndRefresh } from './_helpers.ts';\n// ---------------------------------------------------------------------------\n// Shape click action — `<a:hlinkClick>` on the shape's cNvPr.\n//\n// Two flavors today: open a URL (External rel) or jump to another slide\n// in this deck (Internal rel + `action=\"ppaction://hlinksldjump\"`).\n//\n// PowerPoint also supports preset actions like `nextslide`, `prevslide`,\n// `firstslide`, `lastslide`, but they're niche enough to defer until a\n// concrete user need shows up.\n\n/** What clicking the shape should do. */\nexport type ShapeClickAction =\n | { readonly kind: 'url'; readonly url: string }\n | { readonly kind: 'slide'; readonly slide: SlideData }\n | { readonly kind: 'nextSlide' }\n | { readonly kind: 'prevSlide' }\n | { readonly kind: 'firstSlide' }\n | { readonly kind: 'lastSlide' };\n\nexport const NAME_HLINK_CLICK_FN = qname('a', 'hlinkClick', NS.dml);\n\n// cNvPr lives at different paths depending on shape kind. Returns null\n// for kinds we don't know how to navigate yet (groups, etc.).\nexport const findCNvPr = (shape: SlideShapeData): XmlElement | null => {\n const root = shape[SHAPE_ELEMENT];\n const kind = shape[SHAPE_SNAPSHOT].kind;\n const wrapperName =\n kind === 'shape'\n ? 'nvSpPr'\n : kind === 'picture'\n ? 'nvPicPr'\n : kind === 'connector'\n ? 'nvCxnSpPr'\n : kind === 'graphicFrame'\n ? 'nvGraphicFramePr'\n : null;\n if (wrapperName === null) return null;\n const wrapper = firstChildElement(root, qname('p', wrapperName, NS.pml));\n if (!wrapper) return null;\n return firstChildElement(wrapper, qname('p', 'cNvPr', NS.pml));\n};\n\nconst removeExistingHlinkClick = (cNvPr: XmlElement): void => {\n cNvPr.children = cNvPr.children.filter(\n (c) =>\n !(\n c.kind === 'element' &&\n c.name.namespaceURI === NS.dml &&\n c.name.localName === 'hlinkClick'\n ),\n );\n};\n\nconst findExistingHyperlinkRel = (\n rels: ReturnType<OpcPackage['getRels']>,\n url: string,\n): string | null => {\n if (rels === null) return null;\n const existing = rels.items.find(\n (rl) => rl.type === REL_TYPES.hyperlink && rl.target === url && rl.targetMode === 'External',\n );\n return existing?.id ?? null;\n};\n\n/**\n * Reads the click action attached to the shape's cNvPr, or `null` if\n * none. Mirrors `setShapeClickAction`:\n *\n * - `{ kind: 'url', url }` — `hyperlink` rel + targetMode=External\n * - `{ kind: 'slide', slide }` — `slide` rel + `ppaction://hlinksldjump`\n * - `{ kind: 'nextSlide' | 'prevSlide' | 'firstSlide' | 'lastSlide' }`\n * — preset show-navigation `ppaction`.\n *\n * For `kind: 'slide'`, the matching slide is resolved by part name.\n * Returns `null` for unknown `ppaction` strings.\n */\nexport const getShapeClickAction = (shape: SlideShapeData): ShapeClickAction | null => {\n const cNvPr = findCNvPr(shape);\n if (!cNvPr) return null;\n const hlink = firstChildElement(cNvPr, NAME_HLINK_CLICK_FN);\n if (!hlink) return null;\n const action = getAttrValue(hlink, qname('', 'action', ''));\n const rId = getAttrValue(hlink, qname('r', 'id', NS.officeDocRels));\n\n if (action === 'ppaction://hlinkshowjump?jump=nextslide') return { kind: 'nextSlide' };\n if (action === 'ppaction://hlinkshowjump?jump=previousslide') return { kind: 'prevSlide' };\n if (action === 'ppaction://hlinkshowjump?jump=firstslide') return { kind: 'firstSlide' };\n if (action === 'ppaction://hlinkshowjump?jump=lastslide') return { kind: 'lastSlide' };\n\n if (rId !== null && rId !== '') {\n const slide = shape[SHAPE_SLIDE];\n const pkg = slide[INTERNAL_PACKAGE];\n const rels = pkg.getRels(slide[SLIDE_PART_NAME]);\n if (!rels) return null;\n const rel = rels.items.find((r) => r.id === rId);\n if (!rel) return null;\n\n if (action === 'ppaction://hlinksldjump' && rel.type === REL_TYPES.slide) {\n // Resolve to the SlideData of the target slide.\n const targetPartName = rel.target.startsWith('/')\n ? partName(rel.target)\n : resolveTarget(slide[SLIDE_PART_NAME], rel.target);\n const pres: PresentationData = { [INTERNAL_PACKAGE]: pkg, _slidesCache: null };\n for (const candidate of getSlides(pres)) {\n if (candidate[SLIDE_PART_NAME] === targetPartName) {\n return { kind: 'slide', slide: candidate };\n }\n }\n return null;\n }\n if (rel.type === REL_TYPES.hyperlink && rel.targetMode === 'External') {\n return { kind: 'url', url: rel.target };\n }\n }\n return null;\n};\n\n/**\n * Sets (or clears) the click action on the shape. Side effects:\n *\n * - For `kind: 'url'`, a `hyperlink` rel is added (or reused) on the\n * slide's rels with `targetMode=\"External\"`. `<a:hlinkClick r:id=…/>`\n * points at it.\n * - For `kind: 'slide'`, a `slide` rel is added pointing at the\n * target slide's part. The `<a:hlinkClick>` carries\n * `action=\"ppaction://hlinksldjump\"`.\n * - For the preset navigations (`nextSlide`, `prevSlide`, ...), no rel\n * is allocated; just the `action` attribute carries the preset.\n * - `null` removes any existing `<a:hlinkClick>`.\n *\n * The shape must be one of `shape | picture | connector | graphicFrame`.\n * Groups don't carry their own click action in our model.\n */\nexport const setShapeClickAction = (\n shape: SlideShapeData,\n action: ShapeClickAction | null,\n): void => {\n const cNvPr = findCNvPr(shape);\n if (!cNvPr) {\n throw new Error(\n `setShapeClickAction: ${shape[SHAPE_SNAPSHOT].kind} shape has no cNvPr to attach to`,\n );\n }\n\n removeExistingHlinkClick(cNvPr);\n\n if (action === null) {\n commitAndRefresh(shape);\n return;\n }\n\n const slide = shape[SHAPE_SLIDE];\n const pkg = slide[INTERNAL_PACKAGE];\n\n let rId: string | null = null;\n let actionAttr: string | null = null;\n\n switch (action.kind) {\n case 'url': {\n const rels = pkg.getRels(slide[SLIDE_PART_NAME]) ?? emptyRels();\n const reused = findExistingHyperlinkRel(rels, action.url);\n if (reused !== null) {\n rId = reused;\n } else {\n const newId = nextRelId(rels.items.map((r) => r.id));\n rels.items.push({\n id: newId,\n type: REL_TYPES.hyperlink,\n target: action.url,\n targetMode: 'External',\n });\n pkg.setRels(slide[SLIDE_PART_NAME], rels);\n rId = newId;\n }\n break;\n }\n case 'slide': {\n const target = action.slide[SLIDE_PART_NAME];\n const targetBase = basename(target);\n const rels = pkg.getRels(slide[SLIDE_PART_NAME]) ?? emptyRels();\n const existing = rels.items.find(\n (rl) =>\n rl.type === REL_TYPES.slide &&\n rl.target === `../slides/${targetBase}` &&\n rl.targetMode === 'Internal',\n );\n if (existing) {\n rId = existing.id;\n } else {\n const newId = nextRelId(rels.items.map((r) => r.id));\n rels.items.push({\n id: newId,\n type: REL_TYPES.slide,\n target: `../slides/${targetBase}`,\n targetMode: 'Internal',\n });\n pkg.setRels(slide[SLIDE_PART_NAME], rels);\n rId = newId;\n }\n actionAttr = 'ppaction://hlinksldjump';\n break;\n }\n case 'nextSlide':\n actionAttr = 'ppaction://hlinkshowjump?jump=nextslide';\n break;\n case 'prevSlide':\n actionAttr = 'ppaction://hlinkshowjump?jump=previousslide';\n break;\n case 'firstSlide':\n actionAttr = 'ppaction://hlinkshowjump?jump=firstslide';\n break;\n case 'lastSlide':\n actionAttr = 'ppaction://hlinkshowjump?jump=lastslide';\n break;\n }\n\n const attrs = [] as Array<ReturnType<typeof attr>>;\n if (rId !== null) attrs.push(attr(qname('r', 'id', NS.officeDocRels), rId));\n else attrs.push(attr(qname('r', 'id', NS.officeDocRels), ''));\n if (actionAttr !== null) attrs.push(attr(qname('', 'action', ''), actionAttr));\n\n cNvPr.children.push(\n elem(NAME_HLINK_CLICK_FN, {\n attrs,\n }),\n );\n\n commitAndRefresh(shape);\n};\n","// Chart XML builder.\n//\n// Produces a complete `<c:chartSpace>` for one of the supported chart\n// kinds (bar / column / line / pie). The chart references an embedded\n// xlsx via `<c:externalData r:id=\"rId1\">`; the calling layer is\n// responsible for wiring that rel and writing the xlsx bytes. Inline\n// `<c:strCache>` / `<c:numCache>` blocks carry the values so PowerPoint\n// can render the chart without ever opening the workbook.\n\nimport {\n firstSliceAngle,\n gapAmountPercent,\n holeSizePercent,\n lineWidthEmu as validateLineWidthEmu,\n overlapPercent,\n} from '../bounds.ts';\nimport { NS, type XmlDocument, type XmlElement, attr, elem, qname, text } from '../xml/index.ts';\nimport type { ChartSpec, ChartTextStyle } from './types.ts';\n\n// QNames (chart `c:` namespace) --------------------------------------------\n\nconst NS_C = NS.chart;\nconst NS_A = NS.dml;\nconst NS_R = NS.officeDocRels;\n\nconst c = (local: string): { prefix: string; localName: string; namespaceURI: string } =>\n qname('c', local, NS_C);\nconst a = (local: string): { prefix: string; localName: string; namespaceURI: string } =>\n qname('a', local, NS_A);\nconst r = (local: string): { prefix: string; localName: string; namespaceURI: string } =>\n qname('r', local, NS_R);\n\nconst ATTR_VAL = qname('', 'val', '');\nconst ATTR_IDX = qname('', 'idx', '');\n\n// Helpers ------------------------------------------------------------------\n\nconst valNode = (name: ReturnType<typeof c>, val: string | number): XmlElement =>\n elem(name, { attrs: [attr(ATTR_VAL, String(val))] });\n\nconst ptNode = (idx: number, value: string): XmlElement =>\n elem(c('pt'), {\n attrs: [attr(ATTR_IDX, String(idx))],\n children: [elem(c('v'), { children: [text(value)] })],\n });\n\nconst strRef = (formula: string, points: ReadonlyArray<string>): XmlElement => {\n const strCache = elem(c('strCache'), {\n children: [valNode(c('ptCount'), points.length), ...points.map((p, i) => ptNode(i, p))],\n });\n return elem(c('strRef'), {\n children: [elem(c('f'), { children: [text(formula)] }), strCache],\n });\n};\n\nconst numRef = (formula: string, points: ReadonlyArray<number | null>): XmlElement => {\n const numCache = elem(c('numCache'), {\n children: [\n elem(c('formatCode'), { children: [text('General')] }),\n valNode(c('ptCount'), points.length),\n ...points\n .map((v, i) => (v === null ? null : ptNode(i, String(v))))\n .filter((n): n is XmlElement => n !== null),\n ],\n });\n return elem(c('numRef'), {\n children: [elem(c('f'), { children: [text(formula)] }), numCache],\n });\n};\n\nconst solidFillSpPr = (color: string): XmlElement => {\n const srgbClr = elem(a('srgbClr'), {\n attrs: [attr(qname('', 'val', ''), color.replace(/^#/, '').toUpperCase())],\n });\n const solidFill = elem(a('solidFill'), { children: [srgbClr] });\n return elem(c('spPr'), { children: [solidFill] });\n};\n\n// <c:majorGridlines|minorGridlines> with optional spPr/ln/solidFill/srgbClr\n// for the gridline color. Centralizes the per-gridline color emit so all\n// four axis-gridline slots share the same shape.\nconst gridlinesElement = (\n local: 'majorGridlines' | 'minorGridlines',\n color: string | undefined,\n): XmlElement => {\n if (color === undefined) return elem(c(local));\n const hex = color.replace(/^#/, '').toUpperCase();\n const ln = elem(a('ln'), {\n children: [\n elem(a('solidFill'), {\n children: [elem(a('srgbClr'), { attrs: [attr(qname('', 'val', ''), hex)] })],\n }),\n ],\n });\n return elem(c(local), { children: [elem(c('spPr'), { children: [ln] })] });\n};\n\n// Generic <c:spPr> with optional fill color + line color. Used for the\n// chart-area / plot-area background, where authors set one or both.\nconst spPrChildren = (fill: string | undefined, stroke: string | undefined): XmlElement => {\n const out: XmlElement[] = [];\n if (fill !== undefined) {\n out.push(\n elem(a('solidFill'), {\n children: [\n elem(a('srgbClr'), {\n attrs: [attr(qname('', 'val', ''), fill.replace(/^#/, '').toUpperCase())],\n }),\n ],\n }),\n );\n }\n if (stroke !== undefined) {\n out.push(\n elem(a('ln'), {\n children: [\n elem(a('solidFill'), {\n children: [\n elem(a('srgbClr'), {\n attrs: [attr(qname('', 'val', ''), stroke.replace(/^#/, '').toUpperCase())],\n }),\n ],\n }),\n ],\n }),\n );\n }\n return elem(c('spPr'), { children: out });\n};\n\n// Default theme accent palette (matches Office 2013+ default theme).\nconst DEFAULT_ACCENT_COLORS = [\n '4472C4', // accent1\n 'ED7D31', // accent2\n 'A5A5A5', // accent3\n 'FFC000', // accent4\n '5B9BD5', // accent5\n '70AD47', // accent6\n];\n\n// Builds <c:spPr> for a series — solidFill + optional <a:ln> (line\n// width + dash). The reader extracts color from solidFill and width\n// /dash from the ln; this writer keeps them in lock-step.\nconst seriesSpPr = (\n color: string,\n lineWidthEmu: number | undefined,\n lineDash: string | undefined,\n): XmlElement => {\n const lnChildren: XmlElement[] = [\n elem(a('solidFill'), {\n children: [elem(a('srgbClr'), { attrs: [attr(qname('', 'val', ''), color)] })],\n }),\n ];\n if (lineDash !== undefined) {\n lnChildren.push(elem(a('prstDash'), { attrs: [attr(qname('', 'val', ''), lineDash)] }));\n }\n const ln =\n lineWidthEmu !== undefined\n ? elem(a('ln'), {\n attrs: [\n attr(\n qname('', 'w', ''),\n String(validateLineWidthEmu(lineWidthEmu, 'chart series: lineWidthEmu')),\n ),\n ],\n children: lnChildren,\n })\n : elem(a('ln'), { children: lnChildren });\n return elem(c('spPr'), {\n children: [\n elem(a('solidFill'), {\n children: [elem(a('srgbClr'), { attrs: [attr(qname('', 'val', ''), color)] })],\n }),\n ln,\n ],\n });\n};\n\n// `<c:marker>` for a series. PowerPoint accepts symbol + size; the\n// inner <c:spPr> can carry per-marker fill/stroke but we leave that to\n// the existing series color.\nconst markerElement = (\n symbol: string | undefined,\n sizePt: number | undefined,\n): XmlElement | null => {\n if (symbol === undefined && sizePt === undefined) return null;\n const children: XmlElement[] = [];\n if (symbol !== undefined) children.push(valNode(c('symbol'), symbol));\n if (sizePt !== undefined) children.push(valNode(c('size'), Math.round(sizePt)));\n return elem(c('marker'), { children });\n};\n\n// Build the array of `<c:dPt>` overrides for a series — combines the\n// sparse pointColors and pointExplosions maps. Each authored index\n// emits a `<c:dPt>` with `<c:idx>` + `<c:bubble3D val=\"0\"/>` (required\n// by PowerPoint) + optional explosion + optional spPr/solidFill color.\nconst dPtElements = (\n colors: ReadonlyArray<string | null> | undefined,\n explosions: ReadonlyArray<number | null> | undefined,\n): XmlElement[] => {\n const out: XmlElement[] = [];\n const colorLen = colors?.length ?? 0;\n const explLen = explosions?.length ?? 0;\n const max = Math.max(colorLen, explLen);\n for (let i = 0; i < max; i++) {\n const color = colors?.[i] ?? null;\n const expl = explosions?.[i] ?? null;\n if (color === null && (expl === null || !Number.isFinite(expl))) continue;\n const children: XmlElement[] = [\n valNode(c('idx'), i),\n // PowerPoint expects bubble3D=0 on every dPt outside bubble charts.\n valNode(c('bubble3D'), '0'),\n ];\n if (expl !== null) children.push(valNode(c('explosion'), Math.round(expl)));\n if (color !== null) {\n const hex = color.replace(/^#/, '').toUpperCase();\n children.push(solidFillSpPr(hex));\n }\n out.push(elem(c('dPt'), { children }));\n }\n return out;\n};\n\n// `<c:trendline>` for a series. Carries trendlineType + optional\n// period (movingAvg) / order (poly) / forward / backward / spPr color.\nconst trendlineElement = (\n tl: NonNullable<NonNullable<ChartSpec['series'][number]['trendline']>>,\n): XmlElement => {\n const children: XmlElement[] = [];\n // CT_Trendline schema order: <c:name> first, before <c:spPr>.\n if (tl.name !== undefined) {\n children.push(elem(c('name'), { children: [text(tl.name)] }));\n }\n if (tl.color !== undefined) {\n const hex = tl.color.replace(/^#/, '').toUpperCase();\n const ln = elem(a('ln'), {\n children: [\n elem(a('solidFill'), {\n children: [elem(a('srgbClr'), { attrs: [attr(qname('', 'val', ''), hex)] })],\n }),\n ],\n });\n children.push(elem(c('spPr'), { children: [ln] }));\n }\n children.push(valNode(c('trendlineType'), tl.type));\n if (tl.type === 'movingAvg' && tl.period !== undefined) {\n children.push(valNode(c('period'), tl.period));\n }\n if (tl.type === 'poly' && tl.order !== undefined) {\n children.push(valNode(c('order'), tl.order));\n }\n if (tl.forward !== undefined) children.push(valNode(c('forward'), tl.forward));\n if (tl.backward !== undefined) children.push(valNode(c('backward'), tl.backward));\n // CT_Trendline schema order: dispRSqr before dispEq, both after\n // forward/backward and before trendlineLbl/extLst.\n if (tl.displayRSquared) children.push(valNode(c('dispRSqr'), '1'));\n if (tl.displayEquation) children.push(valNode(c('dispEq'), '1'));\n return elem(c('trendline'), { children });\n};\n\nconst seriesElement = (spec: ChartSpec, seriesIdx: number, sheet: string): XmlElement => {\n const series = spec.series[seriesIdx];\n if (!series) throw new Error('seriesElement: out of range');\n\n const headerCellFormula = `${sheet}!$${String.fromCharCode(66 + seriesIdx)}$1`;\n const catRange = `${sheet}!$A$2:$A$${spec.categories.length + 1}`;\n const valRange = `${sheet}!$${String.fromCharCode(66 + seriesIdx)}$2:$${String.fromCharCode(66 + seriesIdx)}$${spec.categories.length + 1}`;\n\n const color =\n series.color !== undefined\n ? series.color.replace(/^#/, '').toUpperCase()\n : (DEFAULT_ACCENT_COLORS[seriesIdx % DEFAULT_ACCENT_COLORS.length] ?? '4472C4');\n\n // Right-pad values to category count so the chart aligns visually.\n const paddedValues: Array<number | null> = [];\n for (let i = 0; i < spec.categories.length; i++) {\n paddedValues.push(i < series.values.length ? (series.values[i] ?? null) : null);\n }\n\n const children: XmlElement[] = [\n valNode(c('idx'), seriesIdx),\n valNode(c('order'), seriesIdx),\n elem(c('tx'), { children: [strRef(headerCellFormula, [series.name])] }),\n ];\n // spPr shape depends on what the series actually paints. A line series'\n // visible element is its stroke, so the color MUST live on <a:ln>; a bare\n // <a:solidFill> (correct for bar/area fills) leaves the line uncolored and\n // PowerPoint falls back to its automatic series palette — the line then\n // renders in the wrong color. seriesSpPr emits the color on both <a:ln>\n // and <a:solidFill>, so it colors the line for PowerPoint while keeping the\n // solidFill the reader round-trips. Bar / column / pie keep the legacy\n // solid-fill-only shape for tight round-trip compatibility with fixtures.\n if (spec.kind === 'line' || series.lineWidthEmu !== undefined || series.lineDash !== undefined) {\n children.push(seriesSpPr(color, series.lineWidthEmu, series.lineDash));\n } else {\n children.push(solidFillSpPr(color));\n }\n // invertIfNegative only exists on CT_BarSer (bar/column). Emitting it on a\n // line/pie/area series is schema-invalid, so gate on the bar-family kinds.\n if (series.invertIfNegative === true && (spec.kind === 'bar' || spec.kind === 'column')) {\n children.push(valNode(c('invertIfNegative'), '1'));\n }\n // <c:marker> is only valid on the marker-bearing series types\n // (CT_LineSer / CT_ScatterSer / CT_RadarSer). Emitting it on bar/column/\n // pie/doughnut/area produces schema-invalid XML.\n if (spec.kind === 'line' || spec.kind === 'scatter' || spec.kind === 'radar') {\n const mk = markerElement(series.markerSymbol, series.markerSizePt);\n if (mk !== null) children.push(mk);\n }\n // <c:dPt> overrides go after invertIfNegative / marker per schema.\n for (const dPt of dPtElements(series.pointColors, series.pointExplosions)) {\n children.push(dPt);\n }\n const serDLbls = buildDLblsFromLabels(series.dataLabels);\n if (serDLbls !== null) children.push(serDLbls);\n // <c:trendline> exists on CT_BarSer/LineSer/AreaSer/ScatterSer/BubbleSer but\n // NOT on CT_PieSer (pie/doughnut) or CT_RadarSer — emitting it there is\n // schema-invalid, so gate on the trendline-bearing kinds.\n if (\n series.trendline &&\n spec.kind !== 'pie' &&\n spec.kind !== 'doughnut' &&\n spec.kind !== 'radar'\n ) {\n children.push(trendlineElement(series.trendline));\n }\n children.push(elem(c('cat'), { children: [strRef(catRange, spec.categories)] }));\n children.push(elem(c('val'), { children: [numRef(valRange, paddedValues)] }));\n // Line series always get an explicit <c:smooth>: the schema default for an\n // absent element is val=\"1\", so LibreOffice draws an unauthored line as a\n // smooth curve while PowerPoint draws it straight. PowerPoint itself always\n // writes the element; doing the same keeps every renderer straight unless\n // smoothing was asked for. (Only CT_LineSer carries smooth — emitting it on\n // a bar/pie series would be schema-invalid.)\n if (spec.kind === 'line') {\n children.push(valNode(c('smooth'), series.smooth === true ? '1' : '0'));\n }\n return elem(c('ser'), { children });\n};\n\n// Axis ids — arbitrary distinct positive 32-bit integers PowerPoint just\n// needs them stable within the chart for the `<c:crossAx>` back-pointer.\nconst CAT_AX_ID = 111111111;\nconst VAL_AX_ID = 222222222;\n\n// Build a `<c:txPr>` block carrying axis tick-label font / color and an\n// optional `<a:bodyPr rot=\"N\"/>` rotation. Returns null when neither\n// labelStyle nor rotation are set.\nconst axisTxPrElement = (\n style: ChartTextStyle | undefined,\n rotationDeg: number | undefined,\n): XmlElement | null => {\n if (style === undefined && rotationDeg === undefined) return null;\n const bodyAttrs: ReturnType<typeof attr>[] = [];\n if (rotationDeg !== undefined) {\n bodyAttrs.push(attr(qname('', 'rot', ''), String(Math.round(rotationDeg * 60000))));\n }\n bodyAttrs.push(attr(qname('', 'vert', ''), 'horz'));\n const bodyPr = elem(a('bodyPr'), { attrs: bodyAttrs });\n const { attrs: defAttrs, children: defChildren } = rPrAttrsFromStyle(style);\n const defRPr = elem(a('defRPr'), { attrs: defAttrs, children: defChildren });\n const pPr = elem(a('pPr'), { children: [defRPr] });\n // An empty <a:p> with just pPr is the canonical \"defaults only\" shape.\n return elem(c('txPr'), {\n children: [bodyPr, elem(a('lstStyle')), elem(a('p'), { children: [pPr] })],\n });\n};\n\nconst catAxis = (spec: ChartSpec): XmlElement => {\n const catOrientation = spec.categoryAxisOrientation ?? 'minMax';\n const children: XmlElement[] = [\n valNode(c('axId'), CAT_AX_ID),\n elem(c('scaling'), { children: [valNode(c('orientation'), catOrientation)] }),\n valNode(c('delete'), spec.categoryAxisHidden ? '1' : '0'),\n valNode(c('axPos'), 'b'),\n ];\n if (spec.categoryAxisMajorGridlines) {\n children.push(gridlinesElement('majorGridlines', spec.categoryAxisMajorGridlineColor));\n }\n if (spec.categoryAxisMinorGridlines) {\n children.push(gridlinesElement('minorGridlines', spec.categoryAxisMinorGridlineColor));\n }\n if (spec.categoryAxisTitle !== undefined) {\n children.push(\n titleElement(\n spec.categoryAxisTitle,\n spec.categoryAxisTitleStyle,\n spec.categoryAxisTitleRotationDeg,\n ),\n );\n }\n if (spec.categoryAxisNumberFormat !== undefined) {\n children.push(\n elem(c('numFmt'), {\n attrs: [\n attr(qname('', 'formatCode', ''), spec.categoryAxisNumberFormat),\n attr(qname('', 'sourceLinked', ''), '0'),\n ],\n }),\n );\n }\n if (spec.categoryAxisMajorTickMark !== undefined) {\n children.push(valNode(c('majorTickMark'), spec.categoryAxisMajorTickMark));\n }\n if (spec.categoryAxisMinorTickMark !== undefined) {\n children.push(valNode(c('minorTickMark'), spec.categoryAxisMinorTickMark));\n }\n if (spec.categoryAxisTickLabelPos !== undefined) {\n children.push(valNode(c('tickLblPos'), spec.categoryAxisTickLabelPos));\n }\n if (spec.categoryAxisLineColor !== undefined) {\n children.push(spPrChildren(undefined, spec.categoryAxisLineColor));\n }\n const catTxPr = axisTxPrElement(spec.categoryAxisLabelStyle, spec.categoryAxisLabelRotationDeg);\n if (catTxPr) children.push(catTxPr);\n children.push(valNode(c('crossAx'), VAL_AX_ID));\n // CT_CatAx schema order: lblAlgn / lblOffset precede the skip pair.\n if (spec.categoryAxisLabelAlign !== undefined) {\n children.push(valNode(c('lblAlgn'), spec.categoryAxisLabelAlign));\n }\n if (spec.categoryAxisLabelOffset !== undefined) {\n children.push(valNode(c('lblOffset'), spec.categoryAxisLabelOffset));\n }\n if (spec.categoryAxisTickLabelSkip !== undefined) {\n children.push(valNode(c('tickLblSkip'), spec.categoryAxisTickLabelSkip));\n }\n if (spec.categoryAxisTickMarkSkip !== undefined) {\n children.push(valNode(c('tickMarkSkip'), spec.categoryAxisTickMarkSkip));\n }\n if (spec.categoryAxisNoMultiLevelLabel) children.push(valNode(c('noMultiLvlLbl'), '1'));\n return elem(c('catAx'), { children });\n};\n\nconst valAxis = (spec: ChartSpec): XmlElement => {\n // CT_Scaling sequence (dml-chart.xsd): logBase, orientation, max, min, extLst.\n // `max` MUST precede `min` — emitting them in the other order is rejected by\n // the schema (\"element max: expected extLst\").\n const scalingChildren: XmlElement[] = [];\n if (spec.valueAxis?.logBase !== undefined) {\n scalingChildren.push(valNode(c('logBase'), spec.valueAxis.logBase));\n }\n scalingChildren.push(valNode(c('orientation'), spec.valueAxisOrientation ?? 'minMax'));\n if (spec.valueAxis?.max !== undefined) {\n scalingChildren.push(valNode(c('max'), spec.valueAxis.max));\n }\n if (spec.valueAxis?.min !== undefined) {\n scalingChildren.push(valNode(c('min'), spec.valueAxis.min));\n }\n const children: XmlElement[] = [\n valNode(c('axId'), VAL_AX_ID),\n elem(c('scaling'), { children: scalingChildren }),\n valNode(c('delete'), spec.valueAxisHidden ? '1' : '0'),\n valNode(c('axPos'), 'l'),\n ];\n if (spec.valueAxisMajorGridlines) {\n children.push(gridlinesElement('majorGridlines', spec.valueAxisMajorGridlineColor));\n }\n if (spec.valueAxisMinorGridlines) {\n children.push(gridlinesElement('minorGridlines', spec.valueAxisMinorGridlineColor));\n }\n if (spec.valueAxisTitle !== undefined) {\n children.push(\n titleElement(spec.valueAxisTitle, spec.valueAxisTitleStyle, spec.valueAxisTitleRotationDeg),\n );\n }\n if (spec.valueAxis?.numberFormat !== undefined) {\n children.push(\n elem(c('numFmt'), {\n attrs: [\n attr(qname('', 'formatCode', ''), spec.valueAxis.numberFormat),\n attr(qname('', 'sourceLinked', ''), '0'),\n ],\n }),\n );\n }\n if (spec.valueAxisMajorTickMark !== undefined) {\n children.push(valNode(c('majorTickMark'), spec.valueAxisMajorTickMark));\n }\n if (spec.valueAxisMinorTickMark !== undefined) {\n children.push(valNode(c('minorTickMark'), spec.valueAxisMinorTickMark));\n }\n if (spec.valueAxisLineColor !== undefined) {\n children.push(spPrChildren(undefined, spec.valueAxisLineColor));\n }\n const valTxPr = axisTxPrElement(spec.valueAxisLabelStyle, spec.valueAxisLabelRotationDeg);\n if (valTxPr) children.push(valTxPr);\n children.push(valNode(c('crossAx'), CAT_AX_ID));\n // <c:crosses val>/`crossesAt val>` — mutually exclusive per the\n // schema. Object form `{ at: N }` → crossesAt; string form → crosses.\n const xross = spec.valueAxisCrosses;\n if (xross !== undefined) {\n if (typeof xross === 'string') {\n children.push(valNode(c('crosses'), xross));\n } else {\n children.push(valNode(c('crossesAt'), String(xross.at)));\n }\n }\n if (spec.valueAxisCrossBetween !== undefined) {\n children.push(valNode(c('crossBetween'), spec.valueAxisCrossBetween));\n }\n if (spec.valueAxis?.majorUnit !== undefined) {\n children.push(valNode(c('majorUnit'), spec.valueAxis.majorUnit));\n }\n if (spec.valueAxis?.minorUnit !== undefined) {\n children.push(valNode(c('minorUnit'), spec.valueAxis.minorUnit));\n }\n if (spec.valueAxis?.displayUnits !== undefined) {\n children.push(\n elem(c('dispUnits'), {\n children: [valNode(c('builtInUnit'), spec.valueAxis.displayUnits)],\n }),\n );\n }\n return elem(c('valAx'), { children });\n};\n\n// Build `<c:dLbls>` from a ChartDataLabels (showVal / showCatName /\n// showSerName / showPercent toggles plus optional numFmt, position,\n// separator). Returns `null` when no dataLabels were authored so\n// callers know to skip the element entirely.\nconst buildDLblsFromLabels = (dl: ChartSpec['dataLabels'] | undefined): XmlElement | null => {\n if (!dl) return null;\n const children: XmlElement[] = [];\n if (dl.numberFormat !== undefined) {\n children.push(\n elem(c('numFmt'), {\n attrs: [\n attr(qname('', 'formatCode', ''), dl.numberFormat),\n attr(qname('', 'sourceLinked', ''), '0'),\n ],\n }),\n );\n }\n if (dl.textStyle !== undefined) {\n // CT_DLbls schema order places <c:txPr> before <c:dLblPos>; reusing\n // `axisTxPrElement` keeps the formatting parity with axis / legend.\n const txPr = axisTxPrElement(dl.textStyle, undefined);\n if (txPr !== null) children.push(txPr);\n }\n if (dl.position !== undefined) children.push(valNode(c('dLblPos'), dl.position));\n children.push(\n valNode(c('showLegendKey'), '0'),\n valNode(c('showVal'), dl.showValue ? '1' : '0'),\n valNode(c('showCatName'), dl.showCategory ? '1' : '0'),\n valNode(c('showSerName'), dl.showSeriesName ? '1' : '0'),\n valNode(c('showPercent'), dl.showPercent ? '1' : '0'),\n valNode(c('showBubbleSize'), '0'),\n );\n if (dl.separator !== undefined) {\n children.push(elem(c('separator'), { children: [text(dl.separator)] }));\n }\n return elem(c('dLbls'), { children });\n};\n\nconst dLblsElement = (spec: ChartSpec): XmlElement | null => buildDLblsFromLabels(spec.dataLabels);\n\nconst buildBarChart = (spec: ChartSpec, sheet: string, direction: 'col' | 'bar'): XmlElement => {\n const ser = spec.series.map((_, i) => seriesElement(spec, i, sheet));\n const dl = dLblsElement(spec);\n const grouping = spec.grouping ?? 'clustered';\n const children: XmlElement[] = [\n valNode(c('barDir'), direction),\n valNode(c('grouping'), grouping),\n valNode(c('varyColors'), spec.varyColors ? '1' : '0'),\n ...ser,\n ...(dl ? [dl] : []),\n ];\n if (spec.gapWidthPct !== undefined) {\n children.push(valNode(c('gapWidth'), gapAmountPercent(spec.gapWidthPct, 'chart: gapWidthPct')));\n }\n // Stacked / 100%-stacked bars must overlap fully (overlap=100), otherwise\n // PowerPoint draws each series in its own sub-slot and the \"stack\" spreads\n // sideways across the category. PowerPoint always writes overlap=100 for\n // these groupings; default to it when the caller didn't set an explicit\n // overlap. Clustered keeps PowerPoint's own default (no element emitted).\n const overlapPct =\n spec.overlapPct ?? (grouping === 'stacked' || grouping === 'percentStacked' ? 100 : undefined);\n if (overlapPct !== undefined) {\n children.push(valNode(c('overlap'), overlapPercent(overlapPct, 'chart: overlapPct')));\n }\n children.push(valNode(c('axId'), CAT_AX_ID), valNode(c('axId'), VAL_AX_ID));\n return elem(c(direction === 'col' ? 'barChart' : 'barChart'), { children });\n};\n\nconst buildLineChart = (spec: ChartSpec, sheet: string): XmlElement => {\n const ser = spec.series.map((_, i) => seriesElement(spec, i, sheet));\n const dl = dLblsElement(spec);\n const children: XmlElement[] = [\n valNode(c('grouping'), spec.grouping ?? 'standard'),\n valNode(c('varyColors'), spec.varyColors ? '1' : '0'),\n ...ser,\n ...(dl ? [dl] : []),\n ];\n if (spec.dropLines) children.push(elem(c('dropLines')));\n if (spec.hiLowLines) children.push(elem(c('hiLowLines')));\n // <c:marker val> selects the line subtype: \"1\" → Line with Markers,\n // \"0\" → plain Line. Default on, preserving the historical output;\n // authors opt out of markers with `lineMarkers: false`.\n children.push(\n valNode(c('marker'), spec.lineMarkers === false ? '0' : '1'),\n valNode(c('axId'), CAT_AX_ID),\n valNode(c('axId'), VAL_AX_ID),\n );\n return elem(c('lineChart'), { children });\n};\n\nconst buildPieChart = (spec: ChartSpec, sheet: string): XmlElement => {\n if (spec.series.length !== 1) {\n throw new Error('pie chart requires exactly one series');\n }\n const ser = seriesElement(spec, 0, sheet);\n const dl = dLblsElement(spec);\n const children: XmlElement[] = [valNode(c('varyColors'), '1'), ser, ...(dl ? [dl] : [])];\n if (spec.firstSliceAngleDeg !== undefined) {\n children.push(\n valNode(\n c('firstSliceAng'),\n firstSliceAngle(spec.firstSliceAngleDeg, 'chart: firstSliceAngleDeg'),\n ),\n );\n }\n return elem(c('pieChart'), { children });\n};\n\nconst buildDoughnutChart = (spec: ChartSpec, sheet: string): XmlElement => {\n if (spec.series.length !== 1) {\n throw new Error('doughnut chart requires exactly one series');\n }\n const ser = seriesElement(spec, 0, sheet);\n const dl = dLblsElement(spec);\n const children: XmlElement[] = [valNode(c('varyColors'), '1'), ser, ...(dl ? [dl] : [])];\n if (spec.firstSliceAngleDeg !== undefined) {\n children.push(\n valNode(\n c('firstSliceAng'),\n firstSliceAngle(spec.firstSliceAngleDeg, 'chart: firstSliceAngleDeg'),\n ),\n );\n }\n children.push(\n valNode(c('holeSize'), holeSizePercent(spec.holeSizePct ?? 50, 'chart: holeSizePct')),\n );\n return elem(c('doughnutChart'), { children });\n};\n\nconst buildAreaChart = (spec: ChartSpec, sheet: string): XmlElement => {\n const ser = spec.series.map((_, i) => seriesElement(spec, i, sheet));\n const dl = dLblsElement(spec);\n return elem(c('areaChart'), {\n children: [\n valNode(c('grouping'), spec.grouping ?? 'standard'),\n valNode(c('varyColors'), spec.varyColors ? '1' : '0'),\n ...ser,\n ...(dl ? [dl] : []),\n valNode(c('axId'), CAT_AX_ID),\n valNode(c('axId'), VAL_AX_ID),\n ],\n });\n};\n\n// Builds an <a:rPr ...><a:solidFill><a:srgbClr/></a:solidFill></a:rPr>\n// payload from a ChartTextStyle. Returns the rPr children to splice\n// into the parent run / def-run-properties node.\nconst rPrAttrsFromStyle = (\n style: ChartTextStyle | undefined,\n): {\n attrs: ReturnType<typeof attr>[];\n children: XmlElement[];\n} => {\n const attrs: ReturnType<typeof attr>[] = [];\n const children: XmlElement[] = [];\n if (style?.sizePt !== undefined) {\n attrs.push(attr(qname('', 'sz', ''), String(Math.round(style.sizePt * 100))));\n }\n if (style?.bold === true) attrs.push(attr(qname('', 'b', ''), '1'));\n if (style?.bold === false) attrs.push(attr(qname('', 'b', ''), '0'));\n if (style?.italic === true) attrs.push(attr(qname('', 'i', ''), '1'));\n if (style?.italic === false) attrs.push(attr(qname('', 'i', ''), '0'));\n if (style?.color !== undefined) {\n const hex = style.color.startsWith('#') ? style.color.slice(1) : style.color;\n children.push(\n elem(a('solidFill'), {\n children: [elem(a('srgbClr'), { attrs: [attr(qname('', 'val', ''), hex.toUpperCase())] })],\n }),\n );\n }\n // <a:latin> / <a:ea> follow the fill group in CT_TextCharacterProperties;\n // ea carries the same face so CJK glyphs aren't dropped to the renderer's\n // latin-only fallback (the latin slot is ignored for east-asian script).\n if (style?.font !== undefined) {\n const typeface = attr(qname('', 'typeface', ''), style.font);\n children.push(elem(a('latin'), { attrs: [typeface] }));\n children.push(elem(a('ea'), { attrs: [typeface] }));\n }\n return { attrs, children };\n};\n\nconst titleElement = (title: string, style?: ChartTextStyle, rotationDeg?: number): XmlElement => {\n // defRPr stays 1400 (14pt) as the legacy default; the run-level\n // <a:rPr> carries authored overrides so renderers honor them.\n const rPr = elem(a('defRPr'), { attrs: [attr(qname('', 'sz', ''), '1400')] });\n const pPr = elem(a('pPr'), { children: [rPr] });\n const { attrs: runAttrs, children: runChildren } = rPrAttrsFromStyle(style);\n const runRPr = elem(a('rPr'), {\n attrs: [attr(qname('', 'lang', ''), 'en-US'), ...runAttrs],\n children: runChildren,\n });\n const tRun = elem(a('r'), {\n children: [runRPr, elem(a('t'), { children: [text(title)] })],\n });\n const para = elem(a('p'), { children: [pPr, tRun] });\n const rotStr =\n rotationDeg !== undefined && rotationDeg !== 0 ? String(Math.round(rotationDeg * 60000)) : '0';\n const rich = elem(c('rich'), {\n children: [\n elem(a('bodyPr'), {\n attrs: [\n attr(qname('', 'rot', ''), rotStr),\n attr(qname('', 'spcFirstLastPara', ''), '1'),\n attr(qname('', 'vertOverflow', ''), 'ellipsis'),\n attr(qname('', 'vert', ''), 'horz'),\n attr(qname('', 'wrap', ''), 'square'),\n attr(qname('', 'anchor', ''), 'ctr'),\n attr(qname('', 'anchorCtr', ''), '1'),\n ],\n }),\n elem(a('lstStyle')),\n para,\n ],\n });\n return elem(c('title'), {\n children: [elem(c('tx'), { children: [rich] }), valNode(c('overlay'), '0')],\n });\n};\n\n/**\n * Builds a complete `<c:chartSpace>` document for `spec`. The caller\n * wires the `<c:externalData>` rel; this builder always emits\n * `r:id=\"rId1\"` for the embedded workbook.\n */\nexport const buildChartSpaceDoc = (spec: ChartSpec): XmlDocument => {\n const sheet = 'Sheet1';\n\n let plotted: XmlElement;\n switch (spec.kind) {\n case 'column':\n plotted = buildBarChart(spec, sheet, 'col');\n break;\n case 'bar':\n plotted = buildBarChart(spec, sheet, 'bar');\n break;\n case 'line':\n plotted = buildLineChart(spec, sheet);\n break;\n case 'pie':\n plotted = buildPieChart(spec, sheet);\n break;\n case 'doughnut':\n plotted = buildDoughnutChart(spec, sheet);\n break;\n case 'area':\n plotted = buildAreaChart(spec, sheet);\n break;\n case 'scatter':\n case 'radar':\n case 'bubble':\n // Read + render only (plan W4): the builder can't serialize the\n // xy(z) tuple channels these kinds need, so reject rather than\n // silently emit a malformed or wrong-kind chart. `readChartSpec`\n // surfaces these kinds, but `addSlideChart` / `setChartSpec` won't\n // write them.\n throw new Error(\n `chart kind '${spec.kind}' is read-only; authoring scatter / radar / bubble charts is not yet supported`,\n );\n default: {\n const exhaustive: never = spec.kind;\n throw new Error(`unsupported chart kind: ${String(exhaustive)}`);\n }\n }\n\n const axisless = spec.kind === 'pie' || spec.kind === 'doughnut';\n const plotAreaChildren: XmlElement[] = [elem(c('layout')), plotted];\n if (!axisless) {\n plotAreaChildren.push(catAxis(spec), valAxis(spec));\n }\n // <c:plotArea><c:spPr><a:solidFill> + optional <a:ln><a:solidFill>.\n if (spec.plotAreaFill !== undefined || spec.plotAreaStrokeColor !== undefined) {\n plotAreaChildren.push(spPrChildren(spec.plotAreaFill, spec.plotAreaStrokeColor));\n }\n const plotArea = elem(c('plotArea'), { children: plotAreaChildren });\n\n const chartChildren: XmlElement[] = [];\n if (spec.title !== undefined) {\n const titleEl = titleElement(spec.title, spec.titleStyle);\n // <c:title> can also carry <c:overlay val=\"1\"/> — append it after\n // the <c:tx> child but before the synthesized overlay node from\n // titleElement so we don't end up with two overlay elements.\n if (spec.titleOverlay !== undefined) {\n const filtered = titleEl.children.filter(\n (c2) =>\n !(\n c2.kind === 'element' &&\n c2.name.namespaceURI === NS_C &&\n c2.name.localName === 'overlay'\n ),\n );\n titleEl.children = [...filtered, valNode(c('overlay'), spec.titleOverlay ? '1' : '0')];\n }\n chartChildren.push(titleEl);\n }\n chartChildren.push(\n valNode(c('autoTitleDeleted'), spec.title !== undefined ? '0' : '1'),\n plotArea,\n );\n // <c:legend> after plotArea but before plotVisOnly / dispBlanksAs.\n // Skip entirely when `position` is explicitly null (author wants no\n // legend at all).\n if (spec.legend !== undefined && spec.legend.position !== null) {\n const legendChildren: XmlElement[] = [valNode(c('legendPos'), spec.legend.position)];\n for (const idx of spec.legend.hiddenIndices ?? []) {\n legendChildren.push(\n elem(c('legendEntry'), {\n children: [valNode(c('idx'), idx), valNode(c('delete'), '1')],\n }),\n );\n }\n legendChildren.push(valNode(c('overlay'), spec.legend.overlay ? '1' : '0'));\n // <c:legend><c:txPr> carries authored legend font / color.\n if (spec.legend.textStyle !== undefined) {\n const txPr = axisTxPrElement(spec.legend.textStyle, undefined);\n if (txPr !== null) legendChildren.push(txPr);\n }\n chartChildren.push(elem(c('legend'), { children: legendChildren }));\n }\n chartChildren.push(\n valNode(c('plotVisOnly'), spec.plotVisibleCellsOnly === false ? '0' : '1'),\n valNode(c('dispBlanksAs'), spec.dispBlanksAs ?? 'gap'),\n );\n const chart = elem(c('chart'), { children: chartChildren });\n\n const externalData = elem(c('externalData'), {\n attrs: [attr(r('id'), 'rId1')],\n children: [valNode(c('autoUpdate'), '0')],\n });\n\n // <c:chartSpace><c:spPr> sits at the root and styles the entire card.\n // CT_ChartSpace schema order: date1904 → lang → roundedCorners →\n // style → chart.\n const rootChildren: XmlElement[] = [];\n if (spec.date1904) rootChildren.push(valNode(c('date1904'), '1'));\n if (spec.language !== undefined) rootChildren.push(valNode(c('lang'), spec.language));\n if (spec.roundedCorners) rootChildren.push(valNode(c('roundedCorners'), '1'));\n if (spec.chartStyle !== undefined) {\n rootChildren.push(valNode(c('style'), Math.round(spec.chartStyle)));\n }\n rootChildren.push(chart);\n if (spec.chartAreaFill !== undefined || spec.chartAreaStrokeColor !== undefined) {\n rootChildren.push(spPrChildren(spec.chartAreaFill, spec.chartAreaStrokeColor));\n }\n rootChildren.push(externalData);\n const root = elem(c('chartSpace'), {\n prefixDecls: new Map([\n ['c', NS_C],\n ['a', NS_A],\n ['r', NS_R],\n ]),\n children: rootChildren,\n });\n\n return {\n kind: 'document',\n decl: { version: '1.0', encoding: 'UTF-8', standalone: 'yes' },\n prolog: [],\n root,\n epilog: [],\n };\n};\n\nexport type { ChartKind, ChartSpec } from './types.ts';\n","// Chart spec reader — parses `<c:chartSpace>` back into a `ChartSpec`.\n//\n// Companion to `chart-builder.ts`. Lets callers introspect or edit\n// chart data on existing templates without dropping to XML. The reader\n// uses inline `<c:strCache>` / `<c:numCache>` blocks rather than the\n// embedded workbook — the cache is what PowerPoint renders from\n// anyway, and it's always present in charts pptx-kit emits.\n\nimport {\n NS,\n type XmlElement,\n allChildElements,\n firstChildElement,\n getAttrValue,\n qname,\n} from '../xml/index.ts';\nimport type {\n ChartAxisScaling,\n ChartDataLabelPosition,\n ChartDataLabels,\n ChartGrouping,\n ChartKind,\n ChartSeries,\n ChartSpec,\n ChartTextStyle,\n ChartTrendline,\n} from './types.ts';\n\nconst NS_C = NS.chart;\nconst NS_A = NS.dml;\n\nconst NAME_CHART_SPACE = qname('c', 'chartSpace', NS_C);\nconst NAME_CHART = qname('c', 'chart', NS_C);\nconst NAME_PLOT_AREA = qname('c', 'plotArea', NS_C);\nconst NAME_SER = qname('c', 'ser', NS_C);\nconst NAME_TX = qname('c', 'tx', NS_C);\nconst NAME_CAT = qname('c', 'cat', NS_C);\nconst NAME_VAL = qname('c', 'val', NS_C);\nconst NAME_STR_REF = qname('c', 'strRef', NS_C);\nconst NAME_NUM_REF = qname('c', 'numRef', NS_C);\nconst NAME_STR_CACHE = qname('c', 'strCache', NS_C);\nconst NAME_NUM_CACHE = qname('c', 'numCache', NS_C);\nconst NAME_STR_LIT = qname('c', 'strLit', NS_C);\nconst NAME_NUM_LIT = qname('c', 'numLit', NS_C);\nconst NAME_MULTI_LVL_STR_REF = qname('c', 'multiLvlStrRef', NS_C);\nconst NAME_MULTI_LVL_STR_CACHE = qname('c', 'multiLvlStrCache', NS_C);\nconst NAME_LVL = qname('c', 'lvl', NS_C);\nconst NAME_PT = qname('c', 'pt', NS_C);\nconst NAME_V = qname('c', 'v', NS_C);\nconst NAME_TITLE = qname('c', 'title', NS_C);\nconst NAME_RICH = qname('c', 'rich', NS_C);\nconst NAME_T = qname('a', 't', NS_A);\nconst NAME_P_DML = qname('a', 'p', NS_A);\nconst NAME_R_DML = qname('a', 'r', NS_A);\nconst NAME_SP_PR_C = qname('c', 'spPr', NS_C);\nconst NAME_SOLID_FILL = qname('a', 'solidFill', NS_A);\nconst NAME_SRGB_CLR = qname('a', 'srgbClr', NS_A);\n\nconst ATTR_VAL = qname('', 'val', '');\nconst ATTR_IDX = qname('', 'idx', '');\n\ninterface PlottedKindMap {\n readonly localName: string;\n readonly kind: ChartKind;\n}\n\nconst KIND_MAP: ReadonlyArray<PlottedKindMap> = [\n // `barChart` is overloaded; `<c:barDir val=\"bar\"/>` vs `\"col\"` decides.\n { localName: 'barChart', kind: 'column' },\n // The 3D variants share the same `<c:ser>` schema as their flat\n // counterparts; we degrade to the flat kind so renderers don't have\n // to special-case them. PowerPoint's own embedded data view does the\n // same flattening when \"Edit data\" is opened.\n { localName: 'bar3DChart', kind: 'column' },\n { localName: 'lineChart', kind: 'line' },\n { localName: 'line3DChart', kind: 'line' },\n { localName: 'pieChart', kind: 'pie' },\n { localName: 'pie3DChart', kind: 'pie' },\n { localName: 'ofPieChart', kind: 'pie' },\n { localName: 'doughnutChart', kind: 'doughnut' },\n { localName: 'areaChart', kind: 'area' },\n { localName: 'area3DChart', kind: 'area' },\n // Scatter / bubble carry xy / xyz tuples per series (`<c:xVal>` /\n // `<c:yVal>` / `<c:bubbleSize>`) rather than numeric channels against\n // shared categories; radar uses cat+val like line. All three are\n // modeled as their own kind (read + render only — the builder rejects\n // them, see chart-builder.ts).\n { localName: 'scatterChart', kind: 'scatter' },\n { localName: 'bubbleChart', kind: 'bubble' },\n { localName: 'radarChart', kind: 'radar' },\n // Stock charts: open / high / low / close as a four-line plot.\n { localName: 'stockChart', kind: 'line' },\n // Surface degrades to a column chart so the data table is visible.\n { localName: 'surfaceChart', kind: 'column' },\n { localName: 'surface3DChart', kind: 'column' },\n];\n\nconst findFirst = (parent: XmlElement, names: ReadonlyArray<string>): XmlElement | null => {\n for (const c of parent.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS_C) continue;\n if (names.includes(c.name.localName)) return c;\n }\n return null;\n};\n\nconst readPtArray = (cache: XmlElement): string[] => {\n const out: string[] = [];\n for (const pt of allChildElements(cache, NAME_PT)) {\n const idxRaw = getAttrValue(pt, ATTR_IDX);\n if (idxRaw === null) continue;\n const idx = Number.parseInt(idxRaw, 10);\n if (!Number.isFinite(idx) || idx < 0) continue;\n const v = firstChildElement(pt, NAME_V);\n if (v === null) continue;\n let text = '';\n for (const child of v.children) {\n if (child.kind === 'text' || child.kind === 'cdata') text += child.data;\n }\n out[idx] = text;\n }\n return out;\n};\n\n// `<c:strRef>` (cell range) and `<c:strLit>` (literal array) both serialise\n// their points the same way: `<c:pt idx=\"...\">...<c:v>text</c:v></c:pt>`.\n// PowerPoint authors usually emit `strRef` with a `strCache`; other writers\n// (python-pptx, pptxgenjs's older paths, hand-edited XML) skip the cache or\n// drop the workbook entirely and emit `strLit`. Either way the cached points\n// are enough to render the chart, so we accept both.\nconst readStringChannel = (parent: XmlElement): string[] | null => {\n const ref = firstChildElement(parent, NAME_STR_REF);\n if (ref) {\n const cache = firstChildElement(ref, NAME_STR_CACHE);\n if (cache) return readPtArray(cache);\n }\n const lit = firstChildElement(parent, NAME_STR_LIT);\n if (lit) return readPtArray(lit);\n // `<c:multiLvlStrRef>` is what PowerPoint and PptxGenJS emit for categories\n // (it supports grouped axis labels). A flat chart has a single `<c:lvl>`;\n // read that level's points so single-level categories round-trip. (For a\n // genuinely multi-level axis we surface the innermost level, which is the\n // per-point label.)\n const multi = firstChildElement(parent, NAME_MULTI_LVL_STR_REF);\n if (multi) {\n const cache = firstChildElement(multi, NAME_MULTI_LVL_STR_CACHE);\n const lvl = cache ? firstChildElement(cache, NAME_LVL) : null;\n if (lvl) return readPtArray(lvl);\n }\n return null;\n};\n\nconst readStringRef = (parent: XmlElement): string[] | null => readStringChannel(parent);\n\n// Same dual handling for numeric channels — `<c:numRef>/<c:numCache>` for\n// workbook-referenced values, `<c:numLit>` for literal arrays. Without this\n// fallback, charts authored as inline literals come through with empty\n// `values` arrays and the renderer has nothing to plot.\nconst readNumChannel = (parent: XmlElement): Array<number | null> | null => {\n const ref = firstChildElement(parent, NAME_NUM_REF);\n let raw: string[] | null = null;\n if (ref) {\n const cache = firstChildElement(ref, NAME_NUM_CACHE);\n if (cache) raw = readPtArray(cache);\n }\n if (!raw) {\n const lit = firstChildElement(parent, NAME_NUM_LIT);\n if (lit) raw = readPtArray(lit);\n }\n if (!raw) return null;\n return raw.map((s) => {\n if (s === undefined || s === '') return null;\n const n = Number.parseFloat(s);\n return Number.isFinite(n) ? n : null;\n });\n};\n\nconst readNumRef = (parent: XmlElement): Array<number | null> | null => readNumChannel(parent);\n\nconst readSeriesName = (ser: XmlElement): string => {\n const tx = firstChildElement(ser, NAME_TX);\n if (!tx) return '';\n const strs = readStringRef(tx);\n return strs?.[0] ?? '';\n};\n\n// Walks `<c:ser><c:dPt>` overrides and returns sparse per-point arrays\n// for color (`<c:spPr><a:solidFill><a:srgbClr>`) and explosion\n// (`<c:explosion val=\"N\"/>`). Returns `undefined` for each side when no\n// dPt authors the corresponding attribute.\nconst readDataPointOverrides = (\n ser: XmlElement,\n): {\n readonly colors: ReadonlyArray<string | null> | undefined;\n readonly explosions: ReadonlyArray<number | null> | undefined;\n} => {\n const colors: Array<string | null> = [];\n const explosions: Array<number | null> = [];\n let anyColor = false;\n let anyExplosion = false;\n for (const c of ser.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS_C || c.name.localName !== 'dPt')\n continue;\n const idxEl = firstChildElement(c, qname('c', 'idx', NS_C));\n if (!idxEl) continue;\n const idxRaw = getAttrValue(idxEl, ATTR_VAL);\n if (idxRaw === null) continue;\n const idx = Number.parseInt(idxRaw, 10);\n if (!Number.isFinite(idx) || idx < 0) continue;\n const spPr = firstChildElement(c, NAME_SP_PR_C);\n if (spPr) {\n const solidFill = firstChildElement(spPr, NAME_SOLID_FILL);\n if (solidFill) {\n const srgb = firstChildElement(solidFill, NAME_SRGB_CLR);\n if (srgb) {\n const val = getAttrValue(srgb, ATTR_VAL);\n if (val !== null) {\n colors[idx] = `#${val.toUpperCase()}`;\n anyColor = true;\n }\n }\n }\n }\n const explEl = firstChildElement(c, qname('c', 'explosion', NS_C));\n if (explEl) {\n const v = getAttrValue(explEl, ATTR_VAL);\n if (v !== null) {\n const n = Number.parseInt(v, 10);\n if (Number.isFinite(n) && n > 0) {\n explosions[idx] = n;\n anyExplosion = true;\n }\n }\n }\n }\n return {\n colors: anyColor ? colors : undefined,\n explosions: anyExplosion ? explosions : undefined,\n };\n};\n\n// `<c:trendline>` is a sibling of `<c:val>` inside `<c:ser>`. Read the\n// type token and (where relevant) the period / polynomial order. Color\n// comes from `<c:trendline><c:spPr><a:ln><a:solidFill>` when authored.\nconst readTrendline = (ser: XmlElement): ChartTrendline | undefined => {\n const tl = firstChildElement(ser, qname('c', 'trendline', NS_C));\n if (!tl) return undefined;\n // <c:trendline><c:name>…</c:name> — optional custom label.\n let name: string | undefined;\n const nameEl = firstChildElement(tl, qname('c', 'name', NS_C));\n if (nameEl) {\n let acc = '';\n for (const child of nameEl.children) {\n if (child.kind === 'text' || child.kind === 'cdata') acc += child.data;\n }\n if (acc.length > 0) name = acc;\n }\n const typeEl = firstChildElement(tl, qname('c', 'trendlineType', NS_C));\n const tToken = typeEl ? getAttrValue(typeEl, ATTR_VAL) : null;\n let type: ChartTrendline['type'];\n switch (tToken) {\n case 'exp':\n case 'log':\n case 'poly':\n case 'power':\n case 'movingAvg':\n case 'linear':\n type = tToken;\n break;\n default:\n type = 'linear';\n }\n let period: number | undefined;\n if (type === 'movingAvg') {\n const pEl = firstChildElement(tl, qname('c', 'period', NS_C));\n if (pEl) {\n const v = getAttrValue(pEl, ATTR_VAL);\n if (v !== null) {\n const n = Number.parseInt(v, 10);\n if (Number.isFinite(n) && n > 0) period = n;\n }\n }\n }\n let order: number | undefined;\n if (type === 'poly') {\n const oEl = firstChildElement(tl, qname('c', 'order', NS_C));\n if (oEl) {\n const v = getAttrValue(oEl, ATTR_VAL);\n if (v !== null) {\n const n = Number.parseInt(v, 10);\n if (Number.isFinite(n) && n >= 2) order = n;\n }\n }\n }\n // Line color via <c:spPr><a:ln><a:solidFill><a:srgbClr>.\n let color: string | undefined;\n const spPr = firstChildElement(tl, NAME_SP_PR_C);\n if (spPr) {\n const ln = firstChildElement(spPr, qname('a', 'ln', NS_A));\n if (ln) {\n const solid = firstChildElement(ln, NAME_SOLID_FILL);\n if (solid) {\n const srgb = firstChildElement(solid, NAME_SRGB_CLR);\n if (srgb) {\n const v = getAttrValue(srgb, ATTR_VAL);\n if (v !== null) color = `#${v.toUpperCase()}`;\n }\n }\n }\n }\n // <c:forward val=\"N\"/> / <c:backward val=\"N\"/> extend the trendline\n // N periods past the last / before the first data point.\n const readExtension = (local: string): number | undefined => {\n const el = firstChildElement(tl, qname('c', local, NS_C));\n if (!el) return undefined;\n const raw = getAttrValue(el, ATTR_VAL);\n if (raw === null) return undefined;\n const n = Number.parseFloat(raw);\n return Number.isFinite(n) && n > 0 ? n : undefined;\n };\n const forward = readExtension('forward');\n const backward = readExtension('backward');\n // <c:dispEq val=\"1\"/> and <c:dispRSqr val=\"1\"/> show the regression\n // equation / R² coefficient next to the line. Default false.\n const readDispBool = (local: string): boolean | undefined => {\n const el = firstChildElement(tl, qname('c', local, NS_C));\n if (!el) return undefined;\n const v = getAttrValue(el, ATTR_VAL);\n return v === null || v === '1' || v === 'true' ? true : undefined;\n };\n const displayEquation = readDispBool('dispEq');\n const displayRSquared = readDispBool('dispRSqr');\n return {\n ...(name !== undefined ? { name } : {}),\n type,\n ...(period !== undefined ? { period } : {}),\n ...(order !== undefined ? { order } : {}),\n ...(color !== undefined ? { color } : {}),\n ...(forward !== undefined ? { forward } : {}),\n ...(backward !== undefined ? { backward } : {}),\n ...(displayEquation === true ? { displayEquation: true } : {}),\n ...(displayRSquared === true ? { displayRSquared: true } : {}),\n };\n};\n\nconst readSeriesColor = (ser: XmlElement): string | undefined => {\n const spPr = firstChildElement(ser, NAME_SP_PR_C);\n if (!spPr) return undefined;\n const solidFill = firstChildElement(spPr, NAME_SOLID_FILL);\n if (!solidFill) return undefined;\n const srgb = firstChildElement(solidFill, NAME_SRGB_CLR);\n if (!srgb) return undefined;\n const v = getAttrValue(srgb, ATTR_VAL);\n return v !== null ? `#${v.toUpperCase()}` : undefined;\n};\n\n// Per-series marker symbol + size from <c:ser><c:marker>.\nconst readSeriesMarker = (\n ser: XmlElement,\n): { markerSymbol?: ChartSeries['markerSymbol']; markerSizePt?: number } => {\n const m = firstChildElement(ser, qname('c', 'marker', NS_C));\n if (!m) return {};\n const out: { markerSymbol?: ChartSeries['markerSymbol']; markerSizePt?: number } = {};\n const symEl = firstChildElement(m, qname('c', 'symbol', NS_C));\n if (symEl) {\n const v = getAttrValue(symEl, ATTR_VAL);\n if (\n v === 'none' ||\n v === 'auto' ||\n v === 'circle' ||\n v === 'square' ||\n v === 'diamond' ||\n v === 'triangle' ||\n v === 'star' ||\n v === 'x' ||\n v === 'plus' ||\n v === 'dash' ||\n v === 'dot' ||\n v === 'picture'\n ) {\n out.markerSymbol = v;\n }\n }\n const sizeEl = firstChildElement(m, qname('c', 'size', NS_C));\n if (sizeEl) {\n const v = getAttrValue(sizeEl, ATTR_VAL);\n if (v !== null) {\n const n = Number.parseInt(v, 10);\n if (Number.isFinite(n) && n > 0) out.markerSizePt = n;\n }\n }\n return out;\n};\n\n// Per-series line stroke width + dash from <c:ser><c:spPr><a:ln>.\nconst readSeriesLineProps = (ser: XmlElement): { lineWidthEmu?: number; lineDash?: string } => {\n const spPr = firstChildElement(ser, NAME_SP_PR_C);\n if (!spPr) return {};\n const ln = firstChildElement(spPr, qname('a', 'ln', NS_A));\n if (!ln) return {};\n const out: { lineWidthEmu?: number; lineDash?: string } = {};\n const w = getAttrValue(ln, qname('', 'w', ''));\n if (w !== null) {\n const n = Number.parseInt(w, 10);\n if (Number.isFinite(n) && n > 0) out.lineWidthEmu = n;\n }\n const prstDash = firstChildElement(ln, qname('a', 'prstDash', NS_A));\n if (prstDash) {\n const v = getAttrValue(prstDash, ATTR_VAL);\n if (v !== null) out.lineDash = v;\n }\n return out;\n};\n\nconst readTitle = (chart: XmlElement): string | undefined => {\n const title = firstChildElement(chart, NAME_TITLE);\n if (!title) return undefined;\n const tx = firstChildElement(title, NAME_TX);\n if (!tx) return undefined;\n // `<c:tx>` may carry either `<c:rich>` (literal) or `<c:strRef>` (cell\n // reference, with its `<c:strCache>` holding the resolved string).\n // Authors who type the title directly emit rich; chart wizards that\n // wire the title to a cell emit strRef. Accept both.\n const rich = firstChildElement(tx, NAME_RICH);\n if (rich) {\n let acc = '';\n for (const p of allChildElements(rich, NAME_P_DML)) {\n for (const r of allChildElements(p, NAME_R_DML)) {\n const tEl = firstChildElement(r, NAME_T);\n if (!tEl) continue;\n for (const child of tEl.children) {\n if (child.kind === 'text' || child.kind === 'cdata') acc += child.data;\n }\n }\n }\n if (acc.length > 0) return acc;\n }\n const cells = readStringRef(tx);\n if (cells && cells.length > 0) {\n const text = cells.filter((s) => s.length > 0).join(' ');\n if (text.length > 0) return text;\n }\n return undefined;\n};\n\nconst NAME_A_RPR = qname('a', 'rPr', NS_A);\nconst NAME_A_DEF_RPR = qname('a', 'defRPr', NS_A);\nconst NAME_A_PPR = qname('a', 'pPr', NS_A);\nconst NAME_A_SRGB = qname('a', 'srgbClr', NS_A);\nconst NAME_A_LATIN = qname('a', 'latin', NS_A);\nconst ATTR_TYPEFACE = qname('', 'typeface', '');\n\n// Reads `<a:rPr>` / `<a:defRPr>` attributes (size in 100ths of a pt,\n// bold / italic) plus the first solidFill color inside it. Returns an\n// undefined-only style when nothing is authored — callers should drop\n// the style entirely in that case.\nconst readRunStyle = (rPr: XmlElement): ChartTextStyle | undefined => {\n let font: string | undefined;\n let sizePt: number | undefined;\n let bold: boolean | undefined;\n let italic: boolean | undefined;\n let color: string | undefined;\n const szRaw = getAttrValue(rPr, qname('', 'sz', ''));\n if (szRaw !== null) {\n const n = Number.parseInt(szRaw, 10);\n if (Number.isFinite(n) && n > 0) sizePt = n / 100;\n }\n const bRaw = getAttrValue(rPr, qname('', 'b', ''));\n if (bRaw !== null) bold = bRaw === '1' || bRaw === 'true';\n const iRaw = getAttrValue(rPr, qname('', 'i', ''));\n if (iRaw !== null) italic = iRaw === '1' || iRaw === 'true';\n const solidFill = firstChildElement(rPr, NAME_SOLID_FILL);\n if (solidFill) {\n const srgb = firstChildElement(solidFill, NAME_A_SRGB);\n if (srgb) {\n const v = getAttrValue(srgb, ATTR_VAL);\n if (v !== null) color = `#${v.toUpperCase()}`;\n }\n }\n // The latin slot is the authoritative font face on the round-trip; the\n // ea slot carries the same value (written by the builder) so reading\n // latin alone recovers the authored `font`.\n const latin = firstChildElement(rPr, NAME_A_LATIN);\n if (latin) {\n const tf = getAttrValue(latin, ATTR_TYPEFACE);\n if (tf !== null && tf !== '') font = tf;\n }\n if (\n font === undefined &&\n sizePt === undefined &&\n bold === undefined &&\n italic === undefined &&\n color === undefined\n ) {\n return undefined;\n }\n return {\n ...(font !== undefined ? { font } : {}),\n ...(sizePt !== undefined ? { sizePt } : {}),\n ...(bold !== undefined ? { bold } : {}),\n ...(italic !== undefined ? { italic } : {}),\n ...(color !== undefined ? { color } : {}),\n };\n};\n\n// Reads the first authored `<a:rPr>` (or `<a:pPr><a:defRPr>`) inside a\n// chart label's `<c:rich>` block. Used for the chart title (and reusable\n// for axis labels later). Returns `undefined` when nothing is authored.\nconst readLabelStyle = (richHost: XmlElement): ChartTextStyle | undefined => {\n for (const p of allChildElements(richHost, NAME_P_DML)) {\n for (const r of allChildElements(p, NAME_R_DML)) {\n const rPr = firstChildElement(r, NAME_A_RPR);\n if (rPr) {\n const s = readRunStyle(rPr);\n if (s) return s;\n }\n }\n const pPr = firstChildElement(p, NAME_A_PPR);\n if (pPr) {\n const defRPr = firstChildElement(pPr, NAME_A_DEF_RPR);\n if (defRPr) {\n const s = readRunStyle(defRPr);\n if (s) return s;\n }\n }\n }\n return undefined;\n};\n\n// Extracts the authored text style from a `<c:title>` element. Used for\n// both the chart-level title and axis titles, which share the\n// `<c:tx><c:rich>` shape.\nconst readTitleStyleOf = (titleEl: XmlElement): ChartTextStyle | undefined => {\n const tx = firstChildElement(titleEl, NAME_TX);\n if (!tx) return undefined;\n const rich = firstChildElement(tx, NAME_RICH);\n if (!rich) return undefined;\n return readLabelStyle(rich);\n};\n\nconst readTitleStyle = (chart: XmlElement): ChartTextStyle | undefined => {\n const title = firstChildElement(chart, NAME_TITLE);\n if (!title) return undefined;\n return readTitleStyleOf(title);\n};\n\n// Reads `<c:title><c:tx><c:rich><a:bodyPr rot=\"N\"/>` and converts from\n// the OOXML 60000ths-of-a-degree unit to plain degrees. Returns\n// `undefined` when the rotation is absent (the renderer's default\n// applies).\nconst readTitleRotationDeg = (titleEl: XmlElement): number | undefined => {\n const tx = firstChildElement(titleEl, NAME_TX);\n if (!tx) return undefined;\n const rich = firstChildElement(tx, NAME_RICH);\n if (!rich) return undefined;\n const bodyPr = firstChildElement(rich, qname('a', 'bodyPr', NS_A));\n if (!bodyPr) return undefined;\n const v = getAttrValue(bodyPr, qname('', 'rot', ''));\n if (v === null) return undefined;\n const n = Number.parseInt(v, 10);\n return Number.isFinite(n) ? n / 60000 : undefined;\n};\n\n// `<c:dLbls><c:dLblPos val=\"…\"/>` — the chart-kind-dependent enum that\n// names where labels sit relative to their data point. Returns\n// `undefined` for unknown tokens so callers fall back to their default.\nconst readDataLabelPosition = (dLbls: XmlElement): ChartDataLabelPosition | undefined => {\n const el = firstChildElement(dLbls, qname('c', 'dLblPos', NS_C));\n if (!el) return undefined;\n const v = getAttrValue(el, ATTR_VAL);\n switch (v) {\n case 'ctr':\n case 'inEnd':\n case 'outEnd':\n case 'inBase':\n case 't':\n case 'b':\n case 'l':\n case 'r':\n case 'bestFit':\n return v;\n default:\n return undefined;\n }\n};\n\n// `<c:dLbls><c:separator>…</c:separator>` — leaf text content; common\n// values are `\" \"`, `\", \"`, `\"\\n\"`, `\"; \"`.\nconst readDataLabelSeparator = (dLbls: XmlElement): string | undefined => {\n const el = firstChildElement(dLbls, qname('c', 'separator', NS_C));\n if (!el) return undefined;\n let acc = '';\n for (const c of el.children) {\n if (c.kind === 'text' || c.kind === 'cdata') acc += c.data;\n }\n return acc.length > 0 ? acc : undefined;\n};\n\n/**\n * Parses a `<c:chartSpace>` element into a typed `ChartSpec`. Throws if\n * the root or any required child is missing. Returns `null` only when\n * the chart is structurally well-formed but uses a kind we don't model\n * (so callers can fall through to pass-through).\n */\nexport const readChartSpec = (root: XmlElement): ChartSpec | null => {\n if (root.name.namespaceURI !== NS_C || root.name.localName !== 'chartSpace') {\n throw new Error(\n `expected <c:chartSpace> root, got <${root.name.prefix}:${root.name.localName}>`,\n );\n }\n void NAME_CHART_SPACE;\n const chart = firstChildElement(root, NAME_CHART);\n if (!chart) throw new Error('<c:chartSpace> has no <c:chart>');\n const plotArea = firstChildElement(chart, NAME_PLOT_AREA);\n if (!plotArea) throw new Error('<c:chart> has no <c:plotArea>');\n\n // Find which \"plotted\" element the plotArea carries.\n let plotted: XmlElement | null = null;\n let kind: ChartKind | null = null;\n for (const candidate of KIND_MAP) {\n const found = findFirst(plotArea, [candidate.localName]);\n if (found) {\n plotted = found;\n kind = candidate.kind;\n // Resolve bar vs column on a `barChart` / `bar3DChart`.\n if (candidate.localName === 'barChart' || candidate.localName === 'bar3DChart') {\n const barDir = firstChildElement(found, qname('c', 'barDir', NS_C));\n const v = barDir !== null ? getAttrValue(barDir, ATTR_VAL) : null;\n kind = v === 'bar' ? 'bar' : 'column';\n }\n break;\n }\n }\n if (!plotted || !kind) return null;\n\n // Read every <c:ser> in order.\n const series: ChartSeries[] = [];\n let categoriesFromFirst: string[] | null = null;\n for (const ser of allChildElements(plotted, NAME_SER)) {\n const name = readSeriesName(ser);\n const cat = firstChildElement(ser, NAME_CAT);\n if (cat !== null && categoriesFromFirst === null) {\n // `<c:cat>` is usually `<c:strRef>` (text categories), but date /\n // numeric categories serialize as `<c:numRef>`. Fall back to the\n // numeric channel formatted as a string so date / number cats\n // still appear on the axis instead of disappearing entirely.\n categoriesFromFirst = readStringRef(cat) ?? null;\n if (categoriesFromFirst === null) {\n const nums = readNumRef(cat);\n if (nums !== null) {\n categoriesFromFirst = nums.map((n) =>\n n === null || !Number.isFinite(n) ? '' : String(n),\n );\n }\n }\n }\n let valEl = firstChildElement(ser, NAME_VAL);\n // Scatter / bubble carry their y-channel on <c:yVal> rather than\n // <c:val>; their x-channel is <c:xVal> and bubble's per-point size\n // is <c:bubbleSize>. Radar / line use <c:val> against shared cats.\n if (!valEl) {\n valEl = firstChildElement(ser, qname('c', 'yVal', NS_C));\n }\n const values = valEl !== null ? readNumRef(valEl) : null;\n const xValEl = firstChildElement(ser, qname('c', 'xVal', NS_C));\n const xValues = xValEl !== null ? readNumRef(xValEl) : null;\n const bubbleSizeEl = firstChildElement(ser, qname('c', 'bubbleSize', NS_C));\n const bubbleSizes = bubbleSizeEl !== null ? readNumRef(bubbleSizeEl) : null;\n const color = readSeriesColor(ser);\n const { lineWidthEmu, lineDash } = readSeriesLineProps(ser);\n const { markerSymbol, markerSizePt } = readSeriesMarker(ser);\n const invertEl = firstChildElement(ser, qname('c', 'invertIfNegative', NS_C));\n const invertIfNegative =\n invertEl !== null && getAttrValue(invertEl, ATTR_VAL) !== '0' ? true : undefined;\n // <c:dPt> data-point overrides — sparse maps idx → color / explosion.\n const { colors: pointColors, explosions: pointExplosions } = readDataPointOverrides(ser);\n // <c:smooth val=\"1\"/> — line / area / scatter only.\n const smoothEl = firstChildElement(ser, qname('c', 'smooth', NS_C));\n const smooth = smoothEl !== null && getAttrValue(smoothEl, ATTR_VAL) !== '0';\n const trendline = readTrendline(ser);\n // Per-series <c:dLbls> overrides the chart-level toggles for this\n // one series.\n const serDLblsEl = firstChildElement(ser, qname('c', 'dLbls', NS_C));\n let serDataLabels: ChartDataLabels | undefined;\n if (serDLblsEl) {\n const readToggle = (local: string): boolean => {\n const el = firstChildElement(serDLblsEl, qname('c', local, NS_C));\n if (!el) return false;\n const v = getAttrValue(el, ATTR_VAL);\n return v === null || v === '1' || v === 'true';\n };\n const nfEl = firstChildElement(serDLblsEl, qname('c', 'numFmt', NS_C));\n let numberFormat: string | undefined;\n if (nfEl) {\n const fc = getAttrValue(nfEl, qname('', 'formatCode', ''));\n if (fc !== null && fc.length > 0 && fc !== 'General') numberFormat = fc;\n }\n const position = readDataLabelPosition(serDLblsEl);\n const separator = readDataLabelSeparator(serDLblsEl);\n const txPrEl = firstChildElement(serDLblsEl, qname('c', 'txPr', NS_C));\n const textStyle = txPrEl ? readLabelStyle(txPrEl) : undefined;\n serDataLabels = {\n showValue: readToggle('showVal'),\n showCategory: readToggle('showCatName'),\n showSeriesName: readToggle('showSerName'),\n showPercent: readToggle('showPercent'),\n ...(numberFormat !== undefined ? { numberFormat } : {}),\n ...(position !== undefined ? { position } : {}),\n ...(separator !== undefined ? { separator } : {}),\n ...(textStyle !== undefined ? { textStyle } : {}),\n };\n }\n series.push({\n name,\n values: values ?? [],\n ...(xValues !== null ? { xValues } : {}),\n ...(bubbleSizes !== null ? { bubbleSizes } : {}),\n ...(color !== undefined ? { color } : {}),\n ...(lineWidthEmu !== undefined ? { lineWidthEmu } : {}),\n ...(lineDash !== undefined ? { lineDash } : {}),\n ...(markerSymbol !== undefined ? { markerSymbol } : {}),\n ...(markerSizePt !== undefined ? { markerSizePt } : {}),\n ...(invertIfNegative !== undefined ? { invertIfNegative } : {}),\n ...(pointColors !== undefined ? { pointColors } : {}),\n ...(pointExplosions !== undefined ? { pointExplosions } : {}),\n ...(smoothEl !== null ? { smooth } : {}),\n ...(trendline !== undefined ? { trendline } : {}),\n ...(serDataLabels !== undefined ? { dataLabels: serDataLabels } : {}),\n });\n }\n\n const categories = categoriesFromFirst ?? [];\n const title = readTitle(chart);\n const titleStyle = readTitleStyle(chart);\n\n // <c:dLbls> can sit either on the plotted-kind element (`barChart`,\n // `lineChart`, …) for chart-level defaults or on each `<c:ser>` for\n // per-series overrides. Surface the plotted-kind defaults; per-series\n // toggles are deferred until renderers care.\n const dLbls = firstChildElement(plotted, qname('c', 'dLbls', NS_C));\n let dataLabels: ChartDataLabels | undefined;\n if (dLbls) {\n const readToggle = (local: string): boolean => {\n const el = firstChildElement(dLbls, qname('c', local, NS_C));\n if (!el) return false;\n const v = getAttrValue(el, ATTR_VAL);\n // Absent val attribute defaults to true per the schema's CT_Boolean.\n return v === null || v === '1' || v === 'true';\n };\n const nfEl = firstChildElement(dLbls, qname('c', 'numFmt', NS_C));\n let numberFormat: string | undefined;\n if (nfEl) {\n const fc = getAttrValue(nfEl, qname('', 'formatCode', ''));\n if (fc !== null && fc.length > 0 && fc !== 'General') numberFormat = fc;\n }\n const position = readDataLabelPosition(dLbls);\n const separator = readDataLabelSeparator(dLbls);\n const txPrEl = firstChildElement(dLbls, qname('c', 'txPr', NS_C));\n const textStyle = txPrEl ? readLabelStyle(txPrEl) : undefined;\n dataLabels = {\n showValue: readToggle('showVal'),\n showCategory: readToggle('showCatName'),\n showSeriesName: readToggle('showSerName'),\n showPercent: readToggle('showPercent'),\n ...(numberFormat !== undefined ? { numberFormat } : {}),\n ...(position !== undefined ? { position } : {}),\n ...(separator !== undefined ? { separator } : {}),\n ...(textStyle !== undefined ? { textStyle } : {}),\n };\n }\n\n // <c:valAx> lives on the plotArea (not on the plotted-kind element).\n // Pull its <c:scaling><c:min/>/<c:max/> as the authored axis range,\n // plus optional <c:majorUnit> / <c:minorUnit> tick spacing.\n let valueAxis: ChartAxisScaling | undefined;\n const valAx = findFirst(plotArea, ['valAx']);\n if (valAx) {\n let min: number | undefined;\n let max: number | undefined;\n let majorUnit: number | undefined;\n let minorUnit: number | undefined;\n let logBase: number | undefined;\n let displayUnits: ChartAxisScaling['displayUnits'];\n const scaling = firstChildElement(valAx, qname('c', 'scaling', NS_C));\n const readNumOn = (parent: XmlElement, local: string): number | undefined => {\n const el = firstChildElement(parent, qname('c', local, NS_C));\n if (!el) return undefined;\n const v = getAttrValue(el, ATTR_VAL);\n if (v === null) return undefined;\n const n = Number.parseFloat(v);\n return Number.isFinite(n) ? n : undefined;\n };\n if (scaling) {\n min = readNumOn(scaling, 'min');\n max = readNumOn(scaling, 'max');\n // <c:logBase val=\"N\"/> — PowerPoint requires N in [2, 1000].\n const lb = readNumOn(scaling, 'logBase');\n if (lb !== undefined && lb >= 2 && lb <= 1000) logBase = lb;\n }\n majorUnit = readNumOn(valAx, 'majorUnit');\n minorUnit = readNumOn(valAx, 'minorUnit');\n // <c:dispUnits><c:builtInUnit val=\"hundreds|thousands|…\"/>\n const dispUnits = firstChildElement(valAx, qname('c', 'dispUnits', NS_C));\n if (dispUnits) {\n const builtIn = firstChildElement(dispUnits, qname('c', 'builtInUnit', NS_C));\n if (builtIn) {\n const v = getAttrValue(builtIn, ATTR_VAL);\n switch (v) {\n case 'hundreds':\n case 'thousands':\n case 'tenThousands':\n case 'hundredThousands':\n case 'millions':\n case 'tenMillions':\n case 'hundredMillions':\n case 'billions':\n case 'trillions':\n displayUnits = v;\n break;\n }\n }\n }\n // <c:numFmt formatCode=\"…\" sourceLinked=\"0|1\"/> sits directly under\n // <c:valAx>. We surface the formatCode for renderers; sourceLinked\n // (whether to inherit Excel cell format) isn't useful at our layer.\n let numberFormat: string | undefined;\n const nfEl = firstChildElement(valAx, qname('c', 'numFmt', NS_C));\n if (nfEl) {\n const fc = getAttrValue(nfEl, qname('', 'formatCode', ''));\n if (fc !== null && fc.length > 0 && fc !== 'General') {\n numberFormat = fc;\n }\n }\n if (\n min !== undefined ||\n max !== undefined ||\n majorUnit !== undefined ||\n minorUnit !== undefined ||\n numberFormat !== undefined ||\n logBase !== undefined ||\n displayUnits !== undefined\n ) {\n valueAxis = {\n ...(min !== undefined ? { min } : {}),\n ...(max !== undefined ? { max } : {}),\n ...(majorUnit !== undefined ? { majorUnit } : {}),\n ...(minorUnit !== undefined ? { minorUnit } : {}),\n ...(numberFormat !== undefined ? { numberFormat } : {}),\n ...(logBase !== undefined ? { logBase } : {}),\n ...(displayUnits !== undefined ? { displayUnits } : {}),\n };\n }\n }\n\n // <c:grouping val=\"clustered|stacked|percentStacked|standard\"/>\n // sits as a direct child of the plotted-kind element. Pie and line\n // kinds use different schemas (no grouping); restrict to the kinds\n // that actually carry it.\n let grouping: ChartGrouping | undefined;\n if (kind === 'column' || kind === 'bar' || kind === 'area' || kind === 'line') {\n const groupingEl = firstChildElement(plotted, qname('c', 'grouping', NS_C));\n if (groupingEl) {\n const g = getAttrValue(groupingEl, ATTR_VAL);\n if (g === 'clustered' || g === 'stacked' || g === 'percentStacked' || g === 'standard') {\n grouping = g;\n }\n }\n }\n\n // <c:dropLines> and <c:hiLowLines> on the plotted-kind element.\n // Both flags are pure booleans for our purposes — the line color /\n // style they author would require the full ln cascade and isn't\n // worth modeling at this layer.\n const dropLinesEl = firstChildElement(plotted, qname('c', 'dropLines', NS_C));\n const hiLowLinesEl = firstChildElement(plotted, qname('c', 'hiLowLines', NS_C));\n const dropLines = dropLinesEl !== null ? true : undefined;\n const hiLowLines = hiLowLinesEl !== null ? true : undefined;\n\n // <c:lineChart><c:marker val=\"1\"/> toggles point markers for the whole\n // line chart: present (the \"Line with Markers\" subtype) shows them, absent\n // (the plain \"Line\" subtype) hides them. An empty <c:marker/> defaults to\n // true per CT_Boolean. Only meaningful for line charts.\n let lineMarkers: boolean | undefined;\n if (kind === 'line') {\n const markerEl = firstChildElement(plotted, qname('c', 'marker', NS_C));\n if (markerEl === null) {\n lineMarkers = false;\n } else {\n const v = getAttrValue(markerEl, ATTR_VAL);\n lineMarkers = v === null ? true : v === '1' || v === 'true';\n }\n }\n\n // <c:gapWidth> and <c:overlap> live on the plotted-kind element and\n // tune the bar / column spacing. PowerPoint defaults: gapWidth=150\n // (1.5× bar width gap), overlap=0 (clustered) or 100 (stacked).\n let gapWidthPct: number | undefined;\n let overlapPct: number | undefined;\n if (kind === 'column' || kind === 'bar') {\n const gwEl = firstChildElement(plotted, qname('c', 'gapWidth', NS_C));\n if (gwEl) {\n const v = getAttrValue(gwEl, ATTR_VAL);\n if (v !== null) {\n const n = Number.parseInt(v, 10);\n if (Number.isFinite(n)) gapWidthPct = n;\n }\n }\n const ovEl = firstChildElement(plotted, qname('c', 'overlap', NS_C));\n if (ovEl) {\n const v = getAttrValue(ovEl, ATTR_VAL);\n if (v !== null) {\n const n = Number.parseInt(v, 10);\n if (Number.isFinite(n)) overlapPct = n;\n }\n }\n }\n\n // Axis titles — <c:catAx><c:title> and <c:valAx><c:title>. Both\n // use the same rich-text container as the chart title, so reuse\n // readTitle's projection.\n let categoryAxisTitle: string | undefined;\n let categoryAxisTitleStyle: ChartTextStyle | undefined;\n let categoryAxisTitleRotationDeg: number | undefined;\n let categoryAxisLabelStyle: ChartTextStyle | undefined;\n let categoryAxisLabelRotationDeg: number | undefined;\n let valueAxisLabelRotationDeg: number | undefined;\n let valueAxisMajorTickMark: ChartSpec['valueAxisMajorTickMark'];\n let categoryAxisMajorTickMark: ChartSpec['categoryAxisMajorTickMark'];\n let valueAxisMinorTickMark: ChartSpec['valueAxisMinorTickMark'];\n let categoryAxisMinorTickMark: ChartSpec['categoryAxisMinorTickMark'];\n const readTickMarkLocal = (\n axis: XmlElement,\n local: 'majorTickMark' | 'minorTickMark',\n ): 'in' | 'out' | 'cross' | 'none' | undefined => {\n const el = firstChildElement(axis, qname('c', local, NS_C));\n if (!el) return undefined;\n const v = getAttrValue(el, ATTR_VAL);\n if (v === 'in' || v === 'out' || v === 'cross' || v === 'none') return v;\n return undefined;\n };\n const readTickMark = (axis: XmlElement): 'in' | 'out' | 'cross' | 'none' | undefined =>\n readTickMarkLocal(axis, 'majorTickMark');\n let valueAxisTitle: string | undefined;\n let valueAxisTitleStyle: ChartTextStyle | undefined;\n let valueAxisTitleRotationDeg: number | undefined;\n let valueAxisLabelStyle: ChartTextStyle | undefined;\n let categoryAxisHidden: boolean | undefined;\n let valueAxisHidden: boolean | undefined;\n let categoryAxisTickLabelSkip: number | undefined;\n let categoryAxisTickMarkSkip: number | undefined;\n let categoryAxisTickLabelPos: ChartSpec['categoryAxisTickLabelPos'];\n let categoryAxisLabelOffset: number | undefined;\n let categoryAxisLabelAlign: ChartSpec['categoryAxisLabelAlign'];\n let categoryAxisNumberFormat: string | undefined;\n let categoryAxisNoMultiLevelLabel: boolean | undefined;\n let categoryAxisLineColor: string | undefined;\n let valueAxisLineColor: string | undefined;\n let categoryAxisMajorGridlines: boolean | undefined;\n let categoryAxisMinorGridlines: boolean | undefined;\n let categoryAxisMajorGridlineColor: string | undefined;\n let categoryAxisMinorGridlineColor: string | undefined;\n let valueAxisMinorGridlineColor: string | undefined;\n // <c:majorGridlines|minorGridlines><c:spPr><a:ln><a:solidFill><a:srgbClr val=…/>.\n const readGridlineColor = (gl: XmlElement): string | undefined => {\n const spPr = firstChildElement(gl, NAME_SP_PR_C);\n if (!spPr) return undefined;\n const ln = firstChildElement(spPr, qname('a', 'ln', NS_A));\n if (!ln) return undefined;\n const solid = firstChildElement(ln, NAME_SOLID_FILL);\n if (!solid) return undefined;\n const srgb = firstChildElement(solid, NAME_SRGB_CLR);\n if (!srgb) return undefined;\n const v = getAttrValue(srgb, ATTR_VAL);\n return v !== null ? `#${v.toUpperCase()}` : undefined;\n };\n // <c:catAx|valAx><c:spPr><a:ln><a:solidFill><a:srgbClr val=…/>.\n const readAxisLineColor = (axis: XmlElement): string | undefined => {\n const spPr = firstChildElement(axis, NAME_SP_PR_C);\n if (!spPr) return undefined;\n const ln = firstChildElement(spPr, qname('a', 'ln', NS_A));\n if (!ln) return undefined;\n const solid = firstChildElement(ln, NAME_SOLID_FILL);\n if (!solid) return undefined;\n const srgb = firstChildElement(solid, NAME_SRGB_CLR);\n if (!srgb) return undefined;\n const v = getAttrValue(srgb, ATTR_VAL);\n return v !== null ? `#${v.toUpperCase()}` : undefined;\n };\n const catAx = findFirst(plotArea, ['catAx', 'dateAx', 'serAx']);\n const isHidden = (axis: XmlElement): boolean | undefined => {\n const d = firstChildElement(axis, qname('c', 'delete', NS_C));\n if (!d) return undefined;\n const v = getAttrValue(d, ATTR_VAL);\n return v === null || v === '1' || v === 'true';\n };\n let categoryAxisOrientation: 'minMax' | 'maxMin' | undefined;\n let valueAxisOrientation: 'minMax' | 'maxMin' | undefined;\n let valueAxisCrosses: ChartSpec['valueAxisCrosses'];\n let valueAxisCrossBetween: ChartSpec['valueAxisCrossBetween'];\n const readAxisOrientation = (axis: XmlElement): 'minMax' | 'maxMin' | undefined => {\n const scaling = firstChildElement(axis, qname('c', 'scaling', NS_C));\n if (!scaling) return undefined;\n const orientationEl = firstChildElement(scaling, qname('c', 'orientation', NS_C));\n if (!orientationEl) return undefined;\n const v = getAttrValue(orientationEl, ATTR_VAL);\n if (v === 'minMax' || v === 'maxMin') return v;\n return undefined;\n };\n if (catAx) {\n const t = readTitle(catAx);\n if (t !== undefined) categoryAxisTitle = t;\n const catTitleEl = firstChildElement(catAx, NAME_TITLE);\n if (catTitleEl) {\n categoryAxisTitleStyle = readTitleStyleOf(catTitleEl);\n categoryAxisTitleRotationDeg = readTitleRotationDeg(catTitleEl);\n }\n const catTxPr = firstChildElement(catAx, qname('c', 'txPr', NS_C));\n if (catTxPr) {\n categoryAxisLabelStyle = readLabelStyle(catTxPr);\n // <c:txPr><a:bodyPr rot=\"N\"/> — N is in 60000ths of a degree.\n const bodyPr = firstChildElement(catTxPr, qname('a', 'bodyPr', NS_A));\n if (bodyPr) {\n const rotRaw = getAttrValue(bodyPr, qname('', 'rot', ''));\n if (rotRaw !== null) {\n const n = Number.parseInt(rotRaw, 10);\n if (Number.isFinite(n)) categoryAxisLabelRotationDeg = n / 60000;\n }\n }\n }\n categoryAxisHidden = isHidden(catAx);\n categoryAxisLineColor = readAxisLineColor(catAx);\n const catMajorGl = firstChildElement(catAx, qname('c', 'majorGridlines', NS_C));\n categoryAxisMajorGridlines = catMajorGl !== null;\n if (catMajorGl) categoryAxisMajorGridlineColor = readGridlineColor(catMajorGl);\n const catMinorGl = firstChildElement(catAx, qname('c', 'minorGridlines', NS_C));\n categoryAxisMinorGridlines = catMinorGl !== null;\n if (catMinorGl) categoryAxisMinorGridlineColor = readGridlineColor(catMinorGl);\n categoryAxisOrientation = readAxisOrientation(catAx);\n categoryAxisMajorTickMark = readTickMark(catAx);\n categoryAxisMinorTickMark = readTickMarkLocal(catAx, 'minorTickMark');\n const skipEl = firstChildElement(catAx, qname('c', 'tickLblSkip', NS_C));\n if (skipEl) {\n const v = getAttrValue(skipEl, ATTR_VAL);\n if (v !== null) {\n const n = Number.parseInt(v, 10);\n if (Number.isFinite(n) && n > 1) categoryAxisTickLabelSkip = n;\n }\n }\n const markSkipEl = firstChildElement(catAx, qname('c', 'tickMarkSkip', NS_C));\n if (markSkipEl) {\n const v = getAttrValue(markSkipEl, ATTR_VAL);\n if (v !== null) {\n const n = Number.parseInt(v, 10);\n if (Number.isFinite(n) && n > 1) categoryAxisTickMarkSkip = n;\n }\n }\n const posEl = firstChildElement(catAx, qname('c', 'tickLblPos', NS_C));\n if (posEl) {\n const v = getAttrValue(posEl, ATTR_VAL);\n if (v === 'none' || v === 'low' || v === 'high' || v === 'nextTo') {\n categoryAxisTickLabelPos = v;\n }\n }\n const lblOffsetEl = firstChildElement(catAx, qname('c', 'lblOffset', NS_C));\n if (lblOffsetEl) {\n const v = getAttrValue(lblOffsetEl, ATTR_VAL);\n if (v !== null) {\n const n = Number.parseInt(v, 10);\n if (Number.isFinite(n) && n !== 100) categoryAxisLabelOffset = n;\n }\n }\n const lblAlgnEl = firstChildElement(catAx, qname('c', 'lblAlgn', NS_C));\n if (lblAlgnEl) {\n const v = getAttrValue(lblAlgnEl, ATTR_VAL);\n if (v === 'ctr' || v === 'l' || v === 'r') categoryAxisLabelAlign = v;\n }\n const catNumFmtEl = firstChildElement(catAx, qname('c', 'numFmt', NS_C));\n if (catNumFmtEl) {\n const fc = getAttrValue(catNumFmtEl, qname('', 'formatCode', ''));\n if (fc !== null && fc.length > 0 && fc !== 'General') categoryAxisNumberFormat = fc;\n }\n const noMultiLvlEl = firstChildElement(catAx, qname('c', 'noMultiLvlLbl', NS_C));\n if (noMultiLvlEl) {\n const v = getAttrValue(noMultiLvlEl, ATTR_VAL);\n if (v === '1' || v === 'true') categoryAxisNoMultiLevelLabel = true;\n }\n }\n // <c:majorGridlines> / <c:minorGridlines> presence governs visibility.\n // Surface as explicit booleans so renderers can branch on \"absent\n // means hidden\" (matches ECMA-376 §21.2.2.122).\n let valueAxisMajorGridlines: boolean | undefined;\n let valueAxisMinorGridlines: boolean | undefined;\n let valueAxisMajorGridlineColor: string | undefined;\n if (valAx) {\n const t = readTitle(valAx);\n if (t !== undefined) valueAxisTitle = t;\n const valTitleEl = firstChildElement(valAx, NAME_TITLE);\n if (valTitleEl) {\n valueAxisTitleStyle = readTitleStyleOf(valTitleEl);\n valueAxisTitleRotationDeg = readTitleRotationDeg(valTitleEl);\n }\n const valTxPr = firstChildElement(valAx, qname('c', 'txPr', NS_C));\n if (valTxPr) {\n valueAxisLabelStyle = readLabelStyle(valTxPr);\n const bodyPr = firstChildElement(valTxPr, qname('a', 'bodyPr', NS_A));\n if (bodyPr) {\n const rotRaw = getAttrValue(bodyPr, qname('', 'rot', ''));\n if (rotRaw !== null) {\n const n = Number.parseInt(rotRaw, 10);\n if (Number.isFinite(n)) valueAxisLabelRotationDeg = n / 60000;\n }\n }\n }\n valueAxisHidden = isHidden(valAx);\n valueAxisLineColor = readAxisLineColor(valAx);\n valueAxisOrientation = readAxisOrientation(valAx);\n valueAxisMajorTickMark = readTickMark(valAx);\n valueAxisMinorTickMark = readTickMarkLocal(valAx, 'minorTickMark');\n // <c:crosses val> and <c:crossesAt val> are mutually exclusive per\n // the schema; crossesAt wins when both are emitted (matches the\n // PowerPoint priority).\n const crossesAtEl = firstChildElement(valAx, qname('c', 'crossesAt', NS_C));\n if (crossesAtEl) {\n const v = getAttrValue(crossesAtEl, ATTR_VAL);\n if (v !== null) {\n const n = Number.parseFloat(v);\n if (Number.isFinite(n)) valueAxisCrosses = { at: n };\n }\n } else {\n const crossesEl = firstChildElement(valAx, qname('c', 'crosses', NS_C));\n if (crossesEl) {\n const v = getAttrValue(crossesEl, ATTR_VAL);\n if (v === 'autoZero' || v === 'min' || v === 'max') valueAxisCrosses = v;\n }\n }\n const crossBetweenEl = firstChildElement(valAx, qname('c', 'crossBetween', NS_C));\n if (crossBetweenEl) {\n const v = getAttrValue(crossBetweenEl, ATTR_VAL);\n if (v === 'between' || v === 'midCat') valueAxisCrossBetween = v;\n }\n const majorGl = firstChildElement(valAx, qname('c', 'majorGridlines', NS_C));\n valueAxisMajorGridlines = majorGl !== null;\n if (majorGl) valueAxisMajorGridlineColor = readGridlineColor(majorGl);\n const minorGl = firstChildElement(valAx, qname('c', 'minorGridlines', NS_C));\n valueAxisMinorGridlines = minorGl !== null;\n if (minorGl) valueAxisMinorGridlineColor = readGridlineColor(minorGl);\n }\n\n // Plot area + chart area fills (`<c:spPr><a:solidFill><a:srgbClr/>`).\n const readSpPrFill = (parent: XmlElement): string | undefined => {\n const spPr = firstChildElement(parent, NAME_SP_PR_C);\n if (!spPr) return undefined;\n const solid = firstChildElement(spPr, NAME_SOLID_FILL);\n if (!solid) return undefined;\n const srgb = firstChildElement(solid, NAME_SRGB_CLR);\n if (!srgb) return undefined;\n const v = getAttrValue(srgb, ATTR_VAL);\n return v !== null ? `#${v.toUpperCase()}` : undefined;\n };\n // Stroke color from `<c:spPr><a:ln><a:solidFill><a:srgbClr/>`.\n const readSpPrStrokeColor = (parent: XmlElement): string | undefined => {\n const spPr = firstChildElement(parent, NAME_SP_PR_C);\n if (!spPr) return undefined;\n const ln = firstChildElement(spPr, qname('a', 'ln', NS_A));\n if (!ln) return undefined;\n const solid = firstChildElement(ln, NAME_SOLID_FILL);\n if (!solid) return undefined;\n const srgb = firstChildElement(solid, NAME_SRGB_CLR);\n if (!srgb) return undefined;\n const v = getAttrValue(srgb, ATTR_VAL);\n return v !== null ? `#${v.toUpperCase()}` : undefined;\n };\n const plotAreaFill = readSpPrFill(plotArea);\n const plotAreaStrokeColor = readSpPrStrokeColor(plotArea);\n const chartAreaFill = readSpPrFill(root);\n const chartAreaStrokeColor = readSpPrStrokeColor(root);\n\n // <c:dispBlanksAs val=\"…\"/> sits on the chart element. Controls how\n // null gaps in line / area series render: 'gap' (default), 'zero', or\n // 'span'.\n let dispBlanksAs: ChartSpec['dispBlanksAs'];\n const dbaEl = firstChildElement(chart, qname('c', 'dispBlanksAs', NS_C));\n if (dbaEl) {\n const v = getAttrValue(dbaEl, ATTR_VAL);\n if (v === 'gap' || v === 'zero' || v === 'span') dispBlanksAs = v;\n }\n // <c:plotVisOnly val=\"0|1\"/> — PowerPoint default is 1. Surface as\n // `plotVisibleCellsOnly: false` only when explicitly 0 so the round-trip\n // doesn't add a redundant `false` for every default-shaped chart.\n let plotVisibleCellsOnly: boolean | undefined;\n const pvoEl = firstChildElement(chart, qname('c', 'plotVisOnly', NS_C));\n if (pvoEl) {\n const v = getAttrValue(pvoEl, ATTR_VAL);\n if (v === '0' || v === 'false') plotVisibleCellsOnly = false;\n }\n // <c:chartSpace><c:roundedCorners val=\"1\"/> — surface only when\n // explicitly true so the round-trip doesn't carry a redundant false.\n let roundedCorners: boolean | undefined;\n const rcEl = firstChildElement(root, qname('c', 'roundedCorners', NS_C));\n if (rcEl) {\n const v = getAttrValue(rcEl, ATTR_VAL);\n if (v === '1' || v === 'true') roundedCorners = true;\n }\n // <c:chartSpace><c:style val=\"N\"/> — PowerPoint chart-style preset\n // (1..48). Surface for round-trip parity; renderers don't act on it.\n let chartStyle: number | undefined;\n const styleEl = firstChildElement(root, qname('c', 'style', NS_C));\n if (styleEl) {\n const v = getAttrValue(styleEl, ATTR_VAL);\n if (v !== null) {\n const n = Number.parseInt(v, 10);\n if (Number.isFinite(n) && n >= 1 && n <= 48) chartStyle = n;\n }\n }\n // <c:chartSpace><c:lang val=\"…\"/> + <c:date1904 val=\"…\"/> — Office\n // metadata. Surface for round-trip parity.\n let language: string | undefined;\n const langEl = firstChildElement(root, qname('c', 'lang', NS_C));\n if (langEl) {\n const v = getAttrValue(langEl, ATTR_VAL);\n if (v !== null && v.length > 0) language = v;\n }\n let date1904: boolean | undefined;\n const dateEl = firstChildElement(root, qname('c', 'date1904', NS_C));\n if (dateEl) {\n const v = getAttrValue(dateEl, ATTR_VAL);\n if (v === '1' || v === 'true') date1904 = true;\n }\n\n // <c:legend> sits on the chart element (not the plotArea). Read the\n // position; PowerPoint defaults to 'r' (right) when the element is\n // present but has no legendPos. Absent legend element means renderers\n // fall back to whatever they show by default.\n let legend: ChartSpec['legend'];\n const legendEl = firstChildElement(chart, qname('c', 'legend', NS_C));\n if (legendEl) {\n const posEl = firstChildElement(legendEl, qname('c', 'legendPos', NS_C));\n const tok = posEl ? getAttrValue(posEl, ATTR_VAL) : null;\n const ovEl = firstChildElement(legendEl, qname('c', 'overlay', NS_C));\n const overlay = ovEl ? getAttrValue(ovEl, ATTR_VAL) !== '0' : false;\n const txPr = firstChildElement(legendEl, qname('c', 'txPr', NS_C));\n const textStyle = txPr ? readLabelStyle(txPr) : undefined;\n // <c:legendEntry><c:idx val=\"N\"/><c:delete val=\"1\"/> — series indices\n // the author wants suppressed from the legend (trendlines often hide).\n const hiddenIndices: number[] = [];\n for (const c of legendEl.children) {\n if (\n c.kind !== 'element' ||\n c.name.namespaceURI !== NS_C ||\n c.name.localName !== 'legendEntry'\n )\n continue;\n const idxEl = firstChildElement(c, qname('c', 'idx', NS_C));\n const delEl = firstChildElement(c, qname('c', 'delete', NS_C));\n if (!idxEl || !delEl) continue;\n const delV = getAttrValue(delEl, ATTR_VAL);\n const isDeleted = delV === null || delV === '1' || delV === 'true';\n if (!isDeleted) continue;\n const idxV = getAttrValue(idxEl, ATTR_VAL);\n if (idxV === null) continue;\n const n = Number.parseInt(idxV, 10);\n if (Number.isFinite(n) && n >= 0) hiddenIndices.push(n);\n }\n const position: 'r' | 't' | 'b' | 'l' | 'tr' =\n tok === 'r' || tok === 't' || tok === 'b' || tok === 'l' || tok === 'tr' ? tok : 'r';\n legend = {\n position,\n ...(overlay ? { overlay } : {}),\n ...(textStyle !== undefined ? { textStyle } : {}),\n ...(hiddenIndices.length > 0 ? { hiddenIndices } : {}),\n };\n }\n\n // <c:barChart><c:varyColors val=\"1\"/> etc. — single-series charts use\n // it to color each data point uniquely.\n let varyColors: boolean | undefined;\n const vcEl = firstChildElement(plotted, qname('c', 'varyColors', NS_C));\n if (vcEl) {\n const v = getAttrValue(vcEl, ATTR_VAL);\n varyColors = v === null || v === '1' || v === 'true';\n }\n\n // <c:title><c:overlay val=\"1\"/>\n let titleOverlay: boolean | undefined;\n const titleEl = firstChildElement(chart, NAME_TITLE);\n if (titleEl) {\n const ovEl = firstChildElement(titleEl, qname('c', 'overlay', NS_C));\n if (ovEl) {\n titleOverlay = getAttrValue(ovEl, ATTR_VAL) !== '0';\n }\n }\n\n // Pie-specific extras: starting angle + doughnut hole size.\n let firstSliceAngleDeg: number | undefined;\n let holeSizePct: number | undefined;\n if (kind === 'pie' || kind === 'doughnut') {\n const fsAng = firstChildElement(plotted, qname('c', 'firstSliceAng', NS_C));\n if (fsAng) {\n const v = getAttrValue(fsAng, ATTR_VAL);\n if (v !== null) {\n const n = Number.parseInt(v, 10);\n if (Number.isFinite(n)) firstSliceAngleDeg = ((n % 360) + 360) % 360;\n }\n }\n if (kind === 'doughnut') {\n const hs = firstChildElement(plotted, qname('c', 'holeSize', NS_C));\n if (hs) {\n const v = getAttrValue(hs, ATTR_VAL);\n if (v !== null) {\n const n = Number.parseInt(v, 10);\n if (Number.isFinite(n)) holeSizePct = Math.max(10, Math.min(90, n));\n }\n }\n }\n }\n\n // Scatter / radar / bubble sub-type + bubble sizing, all read from the\n // plotted-kind element.\n let scatterStyle: ChartSpec['scatterStyle'];\n let radarStyle: ChartSpec['radarStyle'];\n let bubbleScale: number | undefined;\n let bubbleSizeRepresents: ChartSpec['bubbleSizeRepresents'];\n if (kind === 'scatter') {\n const el = firstChildElement(plotted, qname('c', 'scatterStyle', NS_C));\n if (el) {\n const v = getAttrValue(el, ATTR_VAL);\n if (\n v === 'none' ||\n v === 'line' ||\n v === 'lineMarker' ||\n v === 'marker' ||\n v === 'smooth' ||\n v === 'smoothMarker'\n ) {\n scatterStyle = v;\n }\n }\n } else if (kind === 'radar') {\n const el = firstChildElement(plotted, qname('c', 'radarStyle', NS_C));\n if (el) {\n const v = getAttrValue(el, ATTR_VAL);\n if (v === 'standard' || v === 'marker' || v === 'filled') radarStyle = v;\n }\n } else if (kind === 'bubble') {\n const bsEl = firstChildElement(plotted, qname('c', 'bubbleScale', NS_C));\n if (bsEl) {\n const v = getAttrValue(bsEl, ATTR_VAL);\n if (v !== null) {\n const n = Number.parseInt(v, 10);\n // ST_BubbleScale spans 0..300; clamp out-of-range author values.\n if (Number.isFinite(n) && n >= 0) bubbleScale = Math.min(300, n);\n }\n }\n const srEl = firstChildElement(plotted, qname('c', 'sizeRepresents', NS_C));\n if (srEl) {\n const v = getAttrValue(srEl, ATTR_VAL);\n // ST_SizeRepresents tokens are 'area' and 'w'; surface 'w' as 'width'.\n if (v === 'area') bubbleSizeRepresents = 'area';\n else if (v === 'w') bubbleSizeRepresents = 'width';\n }\n }\n\n return {\n kind,\n categories,\n series,\n ...(title !== undefined ? { title } : {}),\n ...(titleStyle !== undefined ? { titleStyle } : {}),\n ...(dataLabels !== undefined ? { dataLabels } : {}),\n ...(valueAxis !== undefined ? { valueAxis } : {}),\n ...(grouping !== undefined ? { grouping } : {}),\n ...(dropLines !== undefined ? { dropLines } : {}),\n ...(hiLowLines !== undefined ? { hiLowLines } : {}),\n ...(lineMarkers !== undefined ? { lineMarkers } : {}),\n ...(gapWidthPct !== undefined ? { gapWidthPct } : {}),\n ...(overlapPct !== undefined ? { overlapPct } : {}),\n ...(legend !== undefined ? { legend } : {}),\n ...(titleOverlay !== undefined ? { titleOverlay } : {}),\n ...(varyColors !== undefined ? { varyColors } : {}),\n ...(dispBlanksAs !== undefined ? { dispBlanksAs } : {}),\n ...(plotVisibleCellsOnly === false ? { plotVisibleCellsOnly: false } : {}),\n ...(roundedCorners === true ? { roundedCorners: true } : {}),\n ...(chartStyle !== undefined ? { chartStyle } : {}),\n ...(language !== undefined ? { language } : {}),\n ...(date1904 === true ? { date1904: true } : {}),\n ...(plotAreaFill !== undefined ? { plotAreaFill } : {}),\n ...(plotAreaStrokeColor !== undefined ? { plotAreaStrokeColor } : {}),\n ...(chartAreaFill !== undefined ? { chartAreaFill } : {}),\n ...(chartAreaStrokeColor !== undefined ? { chartAreaStrokeColor } : {}),\n ...(categoryAxisTitle !== undefined ? { categoryAxisTitle } : {}),\n ...(categoryAxisTitleStyle !== undefined ? { categoryAxisTitleStyle } : {}),\n ...(categoryAxisTitleRotationDeg !== undefined ? { categoryAxisTitleRotationDeg } : {}),\n ...(categoryAxisLabelStyle !== undefined ? { categoryAxisLabelStyle } : {}),\n ...(categoryAxisLabelRotationDeg !== undefined ? { categoryAxisLabelRotationDeg } : {}),\n ...(valueAxisTitle !== undefined ? { valueAxisTitle } : {}),\n ...(valueAxisTitleStyle !== undefined ? { valueAxisTitleStyle } : {}),\n ...(valueAxisTitleRotationDeg !== undefined ? { valueAxisTitleRotationDeg } : {}),\n ...(valueAxisLabelStyle !== undefined ? { valueAxisLabelStyle } : {}),\n ...(categoryAxisHidden !== undefined ? { categoryAxisHidden } : {}),\n ...(valueAxisHidden !== undefined ? { valueAxisHidden } : {}),\n ...(valueAxisMajorGridlines !== undefined ? { valueAxisMajorGridlines } : {}),\n ...(valueAxisMajorGridlineColor !== undefined ? { valueAxisMajorGridlineColor } : {}),\n ...(valueAxisMajorTickMark !== undefined ? { valueAxisMajorTickMark } : {}),\n ...(valueAxisMinorTickMark !== undefined ? { valueAxisMinorTickMark } : {}),\n ...(valueAxisLabelRotationDeg !== undefined ? { valueAxisLabelRotationDeg } : {}),\n ...(categoryAxisMajorTickMark !== undefined ? { categoryAxisMajorTickMark } : {}),\n ...(categoryAxisMinorTickMark !== undefined ? { categoryAxisMinorTickMark } : {}),\n ...(valueAxisMinorGridlines !== undefined ? { valueAxisMinorGridlines } : {}),\n ...(categoryAxisTickLabelSkip !== undefined ? { categoryAxisTickLabelSkip } : {}),\n ...(categoryAxisTickMarkSkip !== undefined ? { categoryAxisTickMarkSkip } : {}),\n ...(categoryAxisTickLabelPos !== undefined ? { categoryAxisTickLabelPos } : {}),\n ...(categoryAxisLabelOffset !== undefined ? { categoryAxisLabelOffset } : {}),\n ...(categoryAxisLabelAlign !== undefined ? { categoryAxisLabelAlign } : {}),\n ...(categoryAxisNumberFormat !== undefined ? { categoryAxisNumberFormat } : {}),\n ...(categoryAxisNoMultiLevelLabel === true ? { categoryAxisNoMultiLevelLabel: true } : {}),\n ...(categoryAxisLineColor !== undefined ? { categoryAxisLineColor } : {}),\n ...(valueAxisLineColor !== undefined ? { valueAxisLineColor } : {}),\n ...(categoryAxisMajorGridlines === true ? { categoryAxisMajorGridlines: true } : {}),\n ...(categoryAxisMinorGridlines === true ? { categoryAxisMinorGridlines: true } : {}),\n ...(categoryAxisMajorGridlineColor !== undefined ? { categoryAxisMajorGridlineColor } : {}),\n ...(categoryAxisMinorGridlineColor !== undefined ? { categoryAxisMinorGridlineColor } : {}),\n ...(valueAxisMinorGridlineColor !== undefined ? { valueAxisMinorGridlineColor } : {}),\n ...(categoryAxisOrientation !== undefined ? { categoryAxisOrientation } : {}),\n ...(valueAxisOrientation !== undefined ? { valueAxisOrientation } : {}),\n ...(valueAxisCrosses !== undefined ? { valueAxisCrosses } : {}),\n ...(valueAxisCrossBetween !== undefined ? { valueAxisCrossBetween } : {}),\n ...(firstSliceAngleDeg !== undefined ? { firstSliceAngleDeg } : {}),\n ...(holeSizePct !== undefined ? { holeSizePct } : {}),\n ...(scatterStyle !== undefined ? { scatterStyle } : {}),\n ...(radarStyle !== undefined ? { radarStyle } : {}),\n ...(bubbleScale !== undefined ? { bubbleScale } : {}),\n ...(bubbleSizeRepresents !== undefined ? { bubbleSizeRepresents } : {}),\n };\n};\n","// Minimal xlsx writer scoped to chart-data needs.\n//\n// PowerPoint requires an embedded workbook to back every chart so the\n// \"Edit data\" affordance works. We don't need a real spreadsheet — just\n// a single sheet with the chart's category labels and series values.\n// Everything beyond that (styles, calculated columns, defined names,\n// shared strings, charts within the xlsx itself) is deliberately\n// excluded. The plan calls this out as a scope-creep risk; the file\n// stays under `internal/chartml/` and is never exposed publicly.\n//\n// Schema (ECMA-376 Part 1 §18 SpreadsheetML, simplified):\n//\n// /[Content_Types].xml defaults + overrides\n// /_rels/.rels → /xl/workbook.xml\n// /xl/workbook.xml one <sheets>/<sheet> entry\n// /xl/_rels/workbook.xml.rels → /xl/worksheets/sheet1.xml\n// /xl/worksheets/sheet1.xml the data, using inline strings to skip\n// the shared-strings table\n\nimport { writeZip } from '../opc/zip.ts';\n\nconst TEXT_ENCODER = new TextEncoder();\nconst encode = (s: string): Uint8Array => TEXT_ENCODER.encode(s);\n\nconst xmlEscape = (s: string): string =>\n s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n\nconst colLetter = (col: number): string => {\n // 0-based to A, B, …, Z, AA, AB, … (Excel-style).\n let n = col;\n let out = '';\n while (true) {\n out = String.fromCharCode(65 + (n % 26)) + out;\n if (n < 26) return out;\n n = Math.floor(n / 26) - 1;\n }\n};\n\nconst cellRef = (row: number, col: number): string => `${colLetter(col)}${row + 1}`;\n\n/** A row in the embedded sheet — string in column 0, numeric values after. */\nexport interface DataRow {\n readonly label: string;\n readonly values: ReadonlyArray<number | null>;\n}\n\n/**\n * Builds the bytes of a fresh xlsx whose only sheet is laid out as\n *\n * | | seriesNames[0] | seriesNames[1] | ...\n * |-------|----------------|----------------|----\n * | row0 | row0.values[0] | row0.values[1] | ...\n * | row1 | row1.values[0] | ... | ...\n *\n * Header row is row 1 in the sheet (1-indexed). The first column carries\n * category labels; subsequent columns carry series values.\n */\nexport const buildEmbeddedXlsx = (\n seriesNames: ReadonlyArray<string>,\n rows: ReadonlyArray<DataRow>,\n): Uint8Array => {\n // ----- /xl/worksheets/sheet1.xml --------------------------------------\n const sheetXmlParts: string[] = [];\n sheetXmlParts.push(\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n',\n '<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">',\n '<sheetData>',\n );\n\n // Header row.\n sheetXmlParts.push('<row r=\"1\">');\n // A1 = blank.\n sheetXmlParts.push(`<c r=\"${cellRef(0, 0)}\" t=\"inlineStr\"><is><t></t></is></c>`);\n for (let i = 0; i < seriesNames.length; i++) {\n sheetXmlParts.push(\n `<c r=\"${cellRef(0, i + 1)}\" t=\"inlineStr\"><is><t>${xmlEscape(seriesNames[i] ?? '')}</t></is></c>`,\n );\n }\n sheetXmlParts.push('</row>');\n\n for (let r = 0; r < rows.length; r++) {\n const row = rows[r]!;\n const rowIdx = r + 1; // header sits at index 0.\n sheetXmlParts.push(`<row r=\"${rowIdx + 1}\">`);\n sheetXmlParts.push(\n `<c r=\"${cellRef(rowIdx, 0)}\" t=\"inlineStr\"><is><t>${xmlEscape(row.label)}</t></is></c>`,\n );\n for (let i = 0; i < row.values.length; i++) {\n const v = row.values[i];\n if (v === null || v === undefined) continue; // omit empty cell.\n sheetXmlParts.push(`<c r=\"${cellRef(rowIdx, i + 1)}\"><v>${v}</v></c>`);\n }\n sheetXmlParts.push('</row>');\n }\n\n sheetXmlParts.push('</sheetData></worksheet>');\n const sheetXml = sheetXmlParts.join('');\n\n // ----- /xl/workbook.xml -----------------------------------------------\n const workbookXml =\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n' +\n '<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" ' +\n 'xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">' +\n '<sheets><sheet name=\"Sheet1\" sheetId=\"1\" r:id=\"rId1\"/></sheets></workbook>';\n\n // ----- /xl/_rels/workbook.xml.rels ------------------------------------\n const workbookRelsXml =\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n' +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n '<Relationship Id=\"rId1\" ' +\n 'Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" ' +\n 'Target=\"worksheets/sheet1.xml\"/></Relationships>';\n\n // ----- /_rels/.rels ---------------------------------------------------\n const rootRelsXml =\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n' +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n '<Relationship Id=\"rId1\" ' +\n 'Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" ' +\n 'Target=\"xl/workbook.xml\"/></Relationships>';\n\n // ----- /[Content_Types].xml ------------------------------------------\n const contentTypesXml =\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n' +\n '<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">' +\n '<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>' +\n '<Default Extension=\"xml\" ContentType=\"application/xml\"/>' +\n '<Override PartName=\"/xl/workbook.xml\" ' +\n 'ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>' +\n '<Override PartName=\"/xl/worksheets/sheet1.xml\" ' +\n 'ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>' +\n '</Types>';\n\n // Order matters — match what Excel itself emits.\n return writeZip([\n { name: '[Content_Types].xml', data: encode(contentTypesXml) },\n { name: '_rels/.rels', data: encode(rootRelsXml) },\n { name: 'xl/workbook.xml', data: encode(workbookXml) },\n { name: 'xl/_rels/workbook.xml.rels', data: encode(workbookRelsXml) },\n { name: 'xl/worksheets/sheet1.xml', data: encode(sheetXml) },\n ]);\n};\n\n/**\n * Returns the spreadsheet-cell reference span used by chart `<c:f>`\n * formulas. Example: `cellRange('Sheet1', 1, 0, 4)` →\n * `\"Sheet1!$A$2:$A$5\"` (column A, rows 2–5 inclusive, 0-indexed input).\n */\nexport const cellRange = (sheet: string, startRow: number, col: number, count: number): string => {\n const colA = colLetter(col);\n return `${sheet}!$${colA}$${startRow + 1}:$${colA}$${startRow + count}`;\n};\n\n/** Single-cell reference, e.g. `cellAddr('Sheet1', 0, 1)` → `\"Sheet1!$B$1\"`. */\nexport const cellAddr = (sheet: string, row: number, col: number): string =>\n `${sheet}!$${colLetter(col)}$${row + 1}`;\n","// Slide-level background.\n\nimport {\n type GradientFillOptions,\n readFlip,\n readPosition,\n readRotation,\n readSize,\n setSolidFill,\n} from '../../internal/drawingml/index.ts';\nimport type { Emu } from '../units.ts';\nimport {\n type ImageFormat,\n contentTypeForFormat,\n detectImageFormat,\n emptyRels,\n extensionForFormat,\n nextRelId,\n partName,\n resolveTarget,\n} from '../../internal/opc/index.ts';\nimport { REL_TYPES, readShapeTreeFromCsldRoot } from '../../internal/presentationml/index.ts';\nimport type { OpcPackage } from '../../internal/parts/index.ts';\nimport type { PartName } from '../../internal/opc/index.ts';\nimport {\n NS,\n type XmlElement,\n attr,\n elem,\n firstChildElement,\n getAttrValue,\n parseXml,\n qname,\n} from '../../internal/xml/index.ts';\nimport {\n INTERNAL_PACKAGE,\n LAYOUT_PART,\n LAYOUT_PART_NAME,\n type PresentationData,\n SHAPE_ELEMENT,\n SHAPE_SLIDE,\n SHAPE_SNAPSHOT,\n SLIDE_DOCUMENT,\n SLIDE_PART,\n SLIDE_PART_NAME,\n SLIDE_SHAPES,\n type SlideData,\n type SlideLayoutData,\n type SlideShapeData,\n} from '../_internal-symbols.ts';\nimport { NAME_CSLD, commitSlideData, decode, refreshSlideData, setOpcDefault } from './_helpers.ts';\nimport { getPresentationTheme } from './theme.ts';\nimport {\n NAME_A_GRAD_FILL,\n NAME_A_GS_LST,\n NAME_A_LIN,\n type ShapeBounds,\n readColorFromContainer,\n resolveDrawingColor,\n} from './shapes.ts';\n\nconst setSlideBackgroundXml = (slide: SlideData, configure: (bgPr: XmlElement) => void): void => {\n const cSld = firstChildElement(slide[SLIDE_DOCUMENT].root, NAME_CSLD);\n if (!cSld) throw new Error('slide has no <p:cSld>');\n const bgName = qname('p', 'bg', NS.pml);\n const bgPrName = qname('p', 'bgPr', NS.pml);\n let bg = firstChildElement(cSld, bgName);\n if (bg === null) {\n bg = { kind: 'element', name: bgName, attrs: [], prefixDecls: new Map(), children: [] };\n cSld.children.unshift(bg);\n }\n bg.children = [];\n const bgPr: XmlElement = {\n kind: 'element',\n name: bgPrName,\n attrs: [],\n prefixDecls: new Map(),\n children: [],\n };\n bg.children.push(bgPr);\n configure(bgPr);\n commitSlideData(slide);\n refreshSlideData(slide);\n};\n\n/**\n * Reads back the slide's current background. Returns a discriminated\n * union mirroring `getShapeFill`'s shape, plus `inherit` when no\n * `<p:bg>` element is present (the slide picks up its background from\n * the layout / master).\n */\nexport type SlideBackground =\n | { readonly kind: 'solid'; readonly color: string }\n | { readonly kind: 'gradient' }\n | { readonly kind: 'pattern' }\n | { readonly kind: 'image' }\n | { readonly kind: 'inherit' };\n\n/**\n * Reads the slide's color-map override (`<p:clrMapOvr><p:overrideClrMapping/>`).\n * The mapping remaps the eight stable ECMA-376 color tokens (`bg1`,\n * `tx1`, `bg2`, `tx2`, `accent1`–`accent6`, `hlink`, `folHlink`) to\n * different theme positions. Returns `null` when the slide uses the\n * master's color map unchanged (the overwhelming common case).\n */\nexport const getSlideColorMapOverride = (slide: SlideData): Record<string, string> | null => {\n const root = slide[SLIDE_DOCUMENT].root;\n let ovr: XmlElement | null = null;\n for (const c of root.children) {\n if (c.kind !== 'element') continue;\n if (c.name.namespaceURI === NS.pml && c.name.localName === 'clrMapOvr') {\n ovr = c;\n break;\n }\n }\n if (!ovr) return null;\n const mapping = firstChildElement(ovr, qname('a', 'overrideClrMapping', NS.dml));\n if (!mapping) return null;\n // overrideClrMapping carries 12 attributes — bg1..folHlink — each\n // pointing to the index the token is remapped to in the theme.\n const out: Record<string, string> = {};\n for (const a of mapping.attrs) {\n if (a.name.namespaceURI !== '') continue;\n out[a.name.localName] = a.value;\n }\n return Object.keys(out).length > 0 ? out : null;\n};\n\nexport const getSlideBackground = (slide: SlideData): SlideBackground => {\n const cSld = firstChildElement(slide[SLIDE_DOCUMENT].root, NAME_CSLD);\n if (!cSld) return { kind: 'inherit' };\n const bg = firstChildElement(cSld, qname('p', 'bg', NS.pml));\n if (!bg) return { kind: 'inherit' };\n // <p:bg> can carry either a <p:bgPr> with explicit fill, or a\n // <p:bgRef idx=\"…\"> that picks one of the theme's bgFillStyleLst /\n // fillStyleLst entries. The bgRef inner color element is the scheme\n // mapping target — projecting that to a scheme token is the most\n // useful shape for renderers.\n const bgRef = firstChildElement(bg, qname('p', 'bgRef', NS.pml));\n if (bgRef) {\n for (const inner of bgRef.children) {\n if (inner.kind !== 'element' || inner.name.namespaceURI !== NS.dml) continue;\n if (inner.name.localName === 'srgbClr') {\n const val = getAttrValue(inner, qname('', 'val', ''));\n if (val !== null) return { kind: 'solid', color: `#${val.toUpperCase()}` };\n }\n if (inner.name.localName === 'schemeClr') {\n const val = getAttrValue(inner, qname('', 'val', ''));\n if (val !== null) return { kind: 'solid', color: `scheme:${val}` };\n }\n }\n return { kind: 'inherit' };\n }\n const bgPr = firstChildElement(bg, qname('p', 'bgPr', NS.pml));\n if (!bgPr) return { kind: 'inherit' };\n for (const c of bgPr.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n switch (c.name.localName) {\n case 'solidFill': {\n for (const inner of c.children) {\n if (inner.kind !== 'element' || inner.name.namespaceURI !== NS.dml) continue;\n if (inner.name.localName === 'srgbClr') {\n const val = getAttrValue(inner, qname('', 'val', ''));\n if (val !== null) return { kind: 'solid', color: `#${val.toUpperCase()}` };\n }\n if (inner.name.localName === 'schemeClr') {\n const val = getAttrValue(inner, qname('', 'val', ''));\n if (val !== null) return { kind: 'solid', color: `scheme:${val}` };\n }\n }\n return { kind: 'solid', color: '' };\n }\n case 'gradFill':\n return { kind: 'gradient' };\n case 'pattFill':\n return { kind: 'pattern' };\n case 'blipFill':\n return { kind: 'image' };\n }\n }\n return { kind: 'inherit' };\n};\n\n/**\n * A simplified, render-ready view of one of the layout's non-placeholder\n * shapes. Resolves the bounds, preset, fill, and stroke without going\n * through the slide-bound `SlideShapeData` symbols. Returned by\n * `getSlideLayoutBackgroundShapes` for renderers that want to paint the\n * layout's brand-template decoration (corner bars, divider lines, logos\n * as solid rects, etc.) behind the slide's own shapes.\n */\nexport interface SlideLayoutBackgroundShape {\n readonly kind: 'shape' | 'connector' | 'picture' | 'group' | 'graphicFrame';\n /** Bounds in EMU, or `null` when the shape inherits from its master. */\n readonly bounds: ShapeBounds | null;\n /** Preset geometry token for shapes (`'rect'`, `'roundRect'`, `'ellipse'`, …). */\n readonly preset: string | null;\n /** Fill color resolved to `#RRGGBB` (transforms + theme applied), or `null`. */\n readonly fillHex: string | null;\n /** Stroke color resolved to `#RRGGBB`, or `null`. */\n readonly strokeHex: string | null;\n /** Stroke width in EMU, or `null` when no explicit width is set. */\n readonly strokeWidthEmu: number | null;\n /** Rotation in degrees. */\n readonly rotation: number;\n /** Flip state. */\n readonly flip: { horizontal: boolean; vertical: boolean };\n}\n\n/**\n * Returns the non-placeholder shapes on a layout as a render-ready\n * view. Useful for previewing brand-template decoration (corner bars,\n * background rectangles, divider lines) that would otherwise be hidden\n * because they aren't reachable through `getSlideLayoutPlaceholders`.\n *\n * Placeholders are excluded — they're better rendered through the\n * slide's own placeholder bounds (which already cascade through the\n * layout). Picture and group shapes are omitted; their bytes / nested\n * children would need the layout's relationship table to resolve.\n */\nexport const getSlideLayoutBackgroundShapes = (\n pres: PresentationData,\n layout: SlideLayoutData,\n): ReadonlyArray<SlideLayoutBackgroundShape> => {\n const theme = getPresentationTheme(pres);\n const out: SlideLayoutBackgroundShape[] = [];\n for (const shape of layout[LAYOUT_PART].shapes) {\n if (shape.placeholderType !== null || shape.placeholderIdx !== null) continue;\n if (shape.kind !== 'shape' && shape.kind !== 'connector') continue;\n const el = shape.element;\n const pos = readPosition(el, shape.kind);\n const size = readSize(el, shape.kind);\n const bounds: ShapeBounds | null =\n pos !== null && size !== null\n ? { x: pos.x as Emu, y: pos.y as Emu, w: size.w as Emu, h: size.h as Emu }\n : null;\n const spPr = firstChildElement(el, qname('p', 'spPr', NS.pml));\n let preset: string | null = null;\n let fillHex: string | null = null;\n let strokeHex: string | null = null;\n let strokeWidthEmu: number | null = null;\n if (spPr) {\n const prstGeom = firstChildElement(spPr, qname('a', 'prstGeom', NS.dml));\n if (prstGeom) preset = getAttrValue(prstGeom, qname('', 'prst', ''));\n const solid = firstChildElement(spPr, qname('a', 'solidFill', NS.dml));\n if (solid) {\n for (const c of solid.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n fillHex = resolveDrawingColor(c, theme);\n break;\n }\n }\n const ln = firstChildElement(spPr, qname('a', 'ln', NS.dml));\n if (ln) {\n const w = getAttrValue(ln, qname('', 'w', ''));\n if (w !== null) {\n const n = Number.parseInt(w, 10);\n if (Number.isFinite(n)) strokeWidthEmu = n;\n }\n const lnSolid = firstChildElement(ln, qname('a', 'solidFill', NS.dml));\n if (lnSolid) {\n for (const c of lnSolid.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n strokeHex = resolveDrawingColor(c, theme);\n break;\n }\n }\n }\n }\n const rotation = readRotation(el, shape.kind);\n const flip = readFlip(el, shape.kind) ?? { horizontal: false, vertical: false };\n out.push({\n kind: shape.kind,\n bounds,\n preset,\n fillHex,\n strokeHex,\n strokeWidthEmu,\n rotation,\n flip,\n });\n }\n return out;\n};\n\n// Wraps a layout / master part as a read-only `SlideData` so its decorative\n// shapes can be read (and rendered) through the very same `getShape*` helpers\n// as slide shapes — crucially, picture relationships (logos) resolve against\n// THIS part's rels. The handle is for reading only; mutating helpers would\n// commit against a part this wrapper doesn't track.\nconst partDecorationShapes = (\n pkg: OpcPackage,\n thePartName: PartName,\n csldType: 'sldLayout' | 'sldMaster',\n): ReadonlyArray<SlideShapeData> => {\n const part = pkg.getPart(thePartName);\n if (part === null) return [];\n const doc = parseXml(decode(part.data));\n const { shapes } = readShapeTreeFromCsldRoot(doc.root, csldType);\n const data: SlideData = {\n [INTERNAL_PACKAGE]: pkg,\n [SLIDE_PART_NAME]: thePartName,\n [SLIDE_DOCUMENT]: doc,\n [SLIDE_PART]: { shapes, root: doc.root },\n [SLIDE_SHAPES]: [],\n };\n // Decoration only: placeholders are rendered through the slide's own\n // placeholders (which already cascade through the layout/master).\n data[SLIDE_SHAPES] = shapes\n .filter((s) => s.placeholderType === null && s.placeholderIdx === null)\n .map((snap) => ({\n [SHAPE_SLIDE]: data,\n [SHAPE_ELEMENT]: snap.element,\n [SHAPE_SNAPSHOT]: snap,\n }));\n return data[SLIDE_SHAPES];\n};\n\n/**\n * Non-placeholder decorative shapes on a slide layout — corner bars, divider\n * lines, **logos**, watermark text — as full `SlideShapeData` bound to the\n * layout part. Unlike `getSlideLayoutBackgroundShapes` (a flat summary that\n * drops pictures and groups), these work with every `getShape*` reader, so a\n * renderer can paint them with real geometry, fills, text and picture bytes.\n *\n * For reading / rendering only — the handles are bound to the layout part, not\n * a slide, so the mutating `setShape*` helpers should not be used on them.\n */\nexport const getSlideLayoutShapes = (\n pres: PresentationData,\n layout: SlideLayoutData,\n): ReadonlyArray<SlideShapeData> =>\n partDecorationShapes(pres[INTERNAL_PACKAGE], layout[LAYOUT_PART_NAME], 'sldLayout');\n\n/**\n * Non-placeholder decorative shapes on the layout's slide master — the\n * template decoration shared by every layout (background logos, divider lines,\n * etc.). Same render-ready `SlideShapeData` view as `getSlideLayoutShapes`.\n */\nexport const getSlideMasterShapes = (\n pres: PresentationData,\n layout: SlideLayoutData,\n): ReadonlyArray<SlideShapeData> => {\n const pkg = pres[INTERNAL_PACKAGE];\n const layoutName = layout[LAYOUT_PART_NAME];\n const rels = pkg.getRels(layoutName);\n const masterRel = rels?.items.find((r) => r.type === REL_TYPES.slideMaster);\n if (!masterRel) return [];\n const masterName = masterRel.target.startsWith('/')\n ? partName(masterRel.target)\n : resolveTarget(layoutName, masterRel.target);\n return partDecorationShapes(pkg, masterName, 'sldMaster');\n};\n\n/**\n * Reads the slide layout's background. Same discriminated union as\n * `getSlideBackground` for slides — renderers fall back to this when\n * the slide's own background reports `'inherit'`. Walking one further\n * level to the master is left to callers (the same shape applies).\n */\n/**\n * Reads the slide layout's pattern background when its `<p:bg>` is a\n * `<p:bgPr><a:pattFill>`. Same shape as `getSlideBackgroundPatternFill`\n * for slides.\n */\nexport const getSlideLayoutBackgroundPatternFill = (\n pres: PresentationData,\n layout: SlideLayoutData,\n): { preset: string; foreground: string; background: string } | null => {\n const cSld = firstChildElement(layout[LAYOUT_PART].root, NAME_CSLD);\n if (!cSld) return null;\n const bg = firstChildElement(cSld, qname('p', 'bg', NS.pml));\n if (!bg) return null;\n const bgPr = firstChildElement(bg, qname('p', 'bgPr', NS.pml));\n if (!bgPr) return null;\n const pattFill = firstChildElement(bgPr, qname('a', 'pattFill', NS.dml));\n if (!pattFill) return null;\n const preset = getAttrValue(pattFill, qname('', 'prst', '')) ?? 'pct50';\n const theme = getPresentationTheme(pres);\n const colorFrom = (parentName: string, fallback: string): string => {\n const parent = firstChildElement(pattFill, qname('a', parentName, NS.dml));\n if (!parent) return fallback;\n for (const c of parent.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n const hex = resolveDrawingColor(c, theme);\n if (hex) return hex;\n }\n return fallback;\n };\n return {\n preset,\n foreground: colorFrom('fgClr', '#000000'),\n background: colorFrom('bgClr', '#FFFFFF'),\n };\n};\n\n/**\n * Reads the slide master's pattern background. Companion to\n * `getSlideLayoutBackgroundPatternFill`.\n */\nexport const getSlideMasterBackgroundPatternFill = (\n pres: PresentationData,\n layout: SlideLayoutData,\n): { preset: string; foreground: string; background: string } | null => {\n const pkg = pres[INTERNAL_PACKAGE];\n const layoutPartName = partName(layout[LAYOUT_PART_NAME]);\n const layoutRels = pkg.getRels(layoutPartName);\n if (!layoutRels) return null;\n const masterRel = layoutRels.items.find((r) => r.type === REL_TYPES.slideMaster);\n if (!masterRel) return null;\n const masterPart = pkg.getPart(resolveTarget(layoutPartName, masterRel.target));\n if (!masterPart) return null;\n const masterRoot = parseXml(decode(masterPart.data)).root;\n const cSld = firstChildElement(masterRoot, NAME_CSLD);\n if (!cSld) return null;\n const bg = firstChildElement(cSld, qname('p', 'bg', NS.pml));\n if (!bg) return null;\n const bgPr = firstChildElement(bg, qname('p', 'bgPr', NS.pml));\n if (!bgPr) return null;\n const pattFill = firstChildElement(bgPr, qname('a', 'pattFill', NS.dml));\n if (!pattFill) return null;\n const preset = getAttrValue(pattFill, qname('', 'prst', '')) ?? 'pct50';\n const theme = getPresentationTheme(pres);\n const colorFrom = (parentName: string, fallback: string): string => {\n const parent = firstChildElement(pattFill, qname('a', parentName, NS.dml));\n if (!parent) return fallback;\n for (const c of parent.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n const hex = resolveDrawingColor(c, theme);\n if (hex) return hex;\n }\n return fallback;\n };\n return {\n preset,\n foreground: colorFrom('fgClr', '#000000'),\n background: colorFrom('bgClr', '#FFFFFF'),\n };\n};\n\n/**\n * Reads the slide layout's gradient background when its `<p:bg>` is a\n * `<p:bgPr><a:gradFill>`. Same shape as `getSlideBackgroundGradientFill`\n * for slides.\n */\nexport const getSlideLayoutBackgroundGradientFill = (\n layout: SlideLayoutData,\n): GradientFillOptions | null => {\n const cSld = firstChildElement(layout[LAYOUT_PART].root, NAME_CSLD);\n if (!cSld) return null;\n const bg = firstChildElement(cSld, qname('p', 'bg', NS.pml));\n if (!bg) return null;\n const bgPr = firstChildElement(bg, qname('p', 'bgPr', NS.pml));\n if (!bgPr) return null;\n const gradFill = firstChildElement(bgPr, NAME_A_GRAD_FILL);\n if (!gradFill) return null;\n const gsLst = firstChildElement(gradFill, NAME_A_GS_LST);\n if (!gsLst) return null;\n const stops: Array<{ offset: number; color: string }> = [];\n for (const c of gsLst.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml || c.name.localName !== 'gs')\n continue;\n const posRaw = getAttrValue(c, qname('', 'pos', ''));\n if (posRaw === null) continue;\n const pos = Number.parseInt(posRaw, 10);\n if (!Number.isFinite(pos)) continue;\n const color = readColorFromContainer(c);\n if (color === null) continue;\n stops.push({ offset: pos / 100_000, color });\n }\n if (stops.length === 0) return null;\n let angleDeg = 0;\n const lin = firstChildElement(gradFill, NAME_A_LIN);\n if (lin) {\n const angRaw = getAttrValue(lin, qname('', 'ang', ''));\n if (angRaw !== null) {\n const ang = Number.parseInt(angRaw, 10);\n if (Number.isFinite(ang)) angleDeg = ang / 60_000;\n }\n }\n const pathEl = firstChildElement(gradFill, qname('a', 'path', NS.dml));\n if (pathEl) {\n const p = getAttrValue(pathEl, qname('', 'path', ''));\n const pathVal: 'circle' | 'rect' | 'shape' | null =\n p === 'circle' || p === 'rect' || p === 'shape' ? p : null;\n if (pathVal) return { stops, angleDeg, path: pathVal };\n }\n return { stops, angleDeg };\n};\n\n/**\n * Reads the slide master's gradient background when present. Mirrors\n * `getSlideLayoutBackgroundGradientFill`; returns `null` for any other\n * background kind. Useful for closing the bg cascade — slides that\n * report `'gradient'` inherit can now get the master's gradient\n * projected via `gradientDef`.\n */\nexport const getSlideMasterBackgroundGradientFill = (\n pres: PresentationData,\n layout: SlideLayoutData,\n): GradientFillOptions | null => {\n const pkg = pres[INTERNAL_PACKAGE];\n const layoutPartName = partName(layout[LAYOUT_PART_NAME]);\n const layoutRels = pkg.getRels(layoutPartName);\n if (!layoutRels) return null;\n const masterRel = layoutRels.items.find((r) => r.type === REL_TYPES.slideMaster);\n if (!masterRel) return null;\n const masterPart = pkg.getPart(resolveTarget(layoutPartName, masterRel.target));\n if (!masterPart) return null;\n const masterRoot = parseXml(decode(masterPart.data)).root;\n const cSld = firstChildElement(masterRoot, NAME_CSLD);\n if (!cSld) return null;\n const bg = firstChildElement(cSld, qname('p', 'bg', NS.pml));\n if (!bg) return null;\n const bgPr = firstChildElement(bg, qname('p', 'bgPr', NS.pml));\n if (!bgPr) return null;\n const gradFill = firstChildElement(bgPr, NAME_A_GRAD_FILL);\n if (!gradFill) return null;\n const gsLst = firstChildElement(gradFill, NAME_A_GS_LST);\n if (!gsLst) return null;\n const stops: Array<{ offset: number; color: string }> = [];\n for (const c of gsLst.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml || c.name.localName !== 'gs')\n continue;\n const posRaw = getAttrValue(c, qname('', 'pos', ''));\n if (posRaw === null) continue;\n const pos = Number.parseInt(posRaw, 10);\n if (!Number.isFinite(pos)) continue;\n const color = readColorFromContainer(c);\n if (color === null) continue;\n stops.push({ offset: pos / 100_000, color });\n }\n if (stops.length === 0) return null;\n let angleDeg = 0;\n const lin = firstChildElement(gradFill, NAME_A_LIN);\n if (lin) {\n const angRaw = getAttrValue(lin, qname('', 'ang', ''));\n if (angRaw !== null) {\n const ang = Number.parseInt(angRaw, 10);\n if (Number.isFinite(ang)) angleDeg = ang / 60_000;\n }\n }\n const pathEl = firstChildElement(gradFill, qname('a', 'path', NS.dml));\n if (pathEl) {\n const p = getAttrValue(pathEl, qname('', 'path', ''));\n const pathVal: 'circle' | 'rect' | 'shape' | null =\n p === 'circle' || p === 'rect' || p === 'shape' ? p : null;\n if (pathVal) return { stops, angleDeg, path: pathVal };\n }\n return { stops, angleDeg };\n};\n\n/**\n * Reads the slide master's background. Same discriminated union as\n * `getSlideBackground` / `getSlideLayoutBackground`. Walks one rel up\n * from the layout to find the master, then reads `<p:bg>` (either\n * `<p:bgPr>` explicit fill or `<p:bgRef>` theme reference).\n *\n * Slides that report `'inherit'` on both their own background and the\n * layout's commonly inherit the brand fill from the master — this\n * closes the third level of the cascade.\n */\nexport const getSlideMasterBackground = (\n pres: PresentationData,\n layout: SlideLayoutData,\n): SlideBackground => {\n const pkg = pres[INTERNAL_PACKAGE];\n const layoutPartName = partName(layout[LAYOUT_PART_NAME]);\n const layoutRels = pkg.getRels(layoutPartName);\n if (!layoutRels) return { kind: 'inherit' };\n const masterRel = layoutRels.items.find((r) => r.type === REL_TYPES.slideMaster);\n if (!masterRel) return { kind: 'inherit' };\n const masterPart = pkg.getPart(resolveTarget(layoutPartName, masterRel.target));\n if (!masterPart) return { kind: 'inherit' };\n const masterRoot = parseXml(decode(masterPart.data)).root;\n const cSld = firstChildElement(masterRoot, NAME_CSLD);\n if (!cSld) return { kind: 'inherit' };\n const bg = firstChildElement(cSld, qname('p', 'bg', NS.pml));\n if (!bg) return { kind: 'inherit' };\n // bgRef on the master typically points at the theme's first\n // bgFillStyleLst entry; surface its inner color as a solid fill so\n // renderers paint the brand color.\n const bgRef = firstChildElement(bg, qname('p', 'bgRef', NS.pml));\n if (bgRef) {\n for (const inner of bgRef.children) {\n if (inner.kind !== 'element' || inner.name.namespaceURI !== NS.dml) continue;\n if (inner.name.localName === 'srgbClr') {\n const val = getAttrValue(inner, qname('', 'val', ''));\n if (val !== null) return { kind: 'solid', color: `#${val.toUpperCase()}` };\n }\n if (inner.name.localName === 'schemeClr') {\n const val = getAttrValue(inner, qname('', 'val', ''));\n if (val !== null) return { kind: 'solid', color: `scheme:${val}` };\n }\n }\n return { kind: 'inherit' };\n }\n const bgPr = firstChildElement(bg, qname('p', 'bgPr', NS.pml));\n if (!bgPr) return { kind: 'inherit' };\n for (const c of bgPr.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n switch (c.name.localName) {\n case 'solidFill': {\n for (const inner of c.children) {\n if (inner.kind !== 'element' || inner.name.namespaceURI !== NS.dml) continue;\n if (inner.name.localName === 'srgbClr') {\n const val = getAttrValue(inner, qname('', 'val', ''));\n if (val !== null) return { kind: 'solid', color: `#${val.toUpperCase()}` };\n }\n if (inner.name.localName === 'schemeClr') {\n const val = getAttrValue(inner, qname('', 'val', ''));\n if (val !== null) return { kind: 'solid', color: `scheme:${val}` };\n }\n }\n return { kind: 'solid', color: '' };\n }\n case 'gradFill':\n return { kind: 'gradient' };\n case 'pattFill':\n return { kind: 'pattern' };\n case 'blipFill':\n return { kind: 'image' };\n }\n }\n return { kind: 'inherit' };\n};\n\nexport const getSlideLayoutBackground = (layout: SlideLayoutData): SlideBackground => {\n const cSld = firstChildElement(layout[LAYOUT_PART].root, NAME_CSLD);\n if (!cSld) return { kind: 'inherit' };\n const bg = firstChildElement(cSld, qname('p', 'bg', NS.pml));\n if (!bg) return { kind: 'inherit' };\n // <p:bgRef> = theme-reference fill (same shape as getSlideBackground).\n const bgRef = firstChildElement(bg, qname('p', 'bgRef', NS.pml));\n if (bgRef) {\n for (const inner of bgRef.children) {\n if (inner.kind !== 'element' || inner.name.namespaceURI !== NS.dml) continue;\n if (inner.name.localName === 'srgbClr') {\n const val = getAttrValue(inner, qname('', 'val', ''));\n if (val !== null) return { kind: 'solid', color: `#${val.toUpperCase()}` };\n }\n if (inner.name.localName === 'schemeClr') {\n const val = getAttrValue(inner, qname('', 'val', ''));\n if (val !== null) return { kind: 'solid', color: `scheme:${val}` };\n }\n }\n return { kind: 'inherit' };\n }\n const bgPr = firstChildElement(bg, qname('p', 'bgPr', NS.pml));\n if (!bgPr) return { kind: 'inherit' };\n for (const c of bgPr.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n switch (c.name.localName) {\n case 'solidFill': {\n for (const inner of c.children) {\n if (inner.kind !== 'element' || inner.name.namespaceURI !== NS.dml) continue;\n if (inner.name.localName === 'srgbClr') {\n const val = getAttrValue(inner, qname('', 'val', ''));\n if (val !== null) return { kind: 'solid', color: `#${val.toUpperCase()}` };\n }\n if (inner.name.localName === 'schemeClr') {\n const val = getAttrValue(inner, qname('', 'val', ''));\n if (val !== null) return { kind: 'solid', color: `scheme:${val}` };\n }\n }\n return { kind: 'solid', color: '' };\n }\n case 'gradFill':\n return { kind: 'gradient' };\n case 'pattFill':\n return { kind: 'pattern' };\n case 'blipFill':\n return { kind: 'image' };\n }\n }\n return { kind: 'inherit' };\n};\n\n/**\n * Returns the gradient stops + path when the slide carries a\n * `<p:bgPr><a:gradFill>` background. Returns `null` for any other\n * background kind. Shape identical to `getShapeGradientFill` so renderers\n * can use the same projection logic for slide backgrounds.\n */\nexport const getSlideBackgroundGradientFill = (slide: SlideData): GradientFillOptions | null => {\n const cSld = firstChildElement(slide[SLIDE_DOCUMENT].root, NAME_CSLD);\n if (!cSld) return null;\n const bg = firstChildElement(cSld, qname('p', 'bg', NS.pml));\n if (!bg) return null;\n const bgPr = firstChildElement(bg, qname('p', 'bgPr', NS.pml));\n if (!bgPr) return null;\n const gradFill = firstChildElement(bgPr, NAME_A_GRAD_FILL);\n if (!gradFill) return null;\n // Reuse the same algorithm `getShapeGradientFill` does. The gradFill\n // element shape is identical between shape and slide backgrounds.\n const gsLst = firstChildElement(gradFill, NAME_A_GS_LST);\n if (!gsLst) return null;\n const stops: Array<{ offset: number; color: string }> = [];\n for (const c of gsLst.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml || c.name.localName !== 'gs')\n continue;\n const posRaw = getAttrValue(c, qname('', 'pos', ''));\n if (posRaw === null) continue;\n const pos = Number.parseInt(posRaw, 10);\n if (!Number.isFinite(pos)) continue;\n const color = readColorFromContainer(c);\n if (color === null) continue;\n stops.push({ offset: pos / 100_000, color });\n }\n if (stops.length === 0) return null;\n let angleDeg = 0;\n const lin = firstChildElement(gradFill, NAME_A_LIN);\n if (lin) {\n const angRaw = getAttrValue(lin, qname('', 'ang', ''));\n if (angRaw !== null) {\n const ang = Number.parseInt(angRaw, 10);\n if (Number.isFinite(ang)) angleDeg = ang / 60_000;\n }\n }\n const pathEl = firstChildElement(gradFill, qname('a', 'path', NS.dml));\n if (pathEl) {\n const p = getAttrValue(pathEl, qname('', 'path', ''));\n const pathVal: 'circle' | 'rect' | 'shape' | null =\n p === 'circle' || p === 'rect' || p === 'shape' ? p : null;\n if (pathVal) return { stops, angleDeg, path: pathVal };\n }\n return { stops, angleDeg };\n};\n\n/**\n * Returns the pattern preset + theme-resolved colors when the slide\n * carries a `<p:bgPr><a:pattFill>` background. Returns `null` for any\n * other background kind. Shape mirrors `getShapePatternFill`.\n */\nexport const getSlideBackgroundPatternFill = (\n pres: PresentationData,\n slide: SlideData,\n): { preset: string; foreground: string; background: string } | null => {\n const cSld = firstChildElement(slide[SLIDE_DOCUMENT].root, NAME_CSLD);\n if (!cSld) return null;\n const bg = firstChildElement(cSld, qname('p', 'bg', NS.pml));\n if (!bg) return null;\n const bgPr = firstChildElement(bg, qname('p', 'bgPr', NS.pml));\n if (!bgPr) return null;\n const pattFill = firstChildElement(bgPr, qname('a', 'pattFill', NS.dml));\n if (!pattFill) return null;\n const preset = getAttrValue(pattFill, qname('', 'prst', '')) ?? 'pct50';\n const theme = getPresentationTheme(pres);\n const colorFrom = (parentName: string, fallback: string): string => {\n const parent = firstChildElement(pattFill, qname('a', parentName, NS.dml));\n if (!parent) return fallback;\n for (const c of parent.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n const hex = resolveDrawingColor(c, theme);\n if (hex) return hex;\n }\n return fallback;\n };\n return {\n preset,\n foreground: colorFrom('fgClr', '#000000'),\n background: colorFrom('bgClr', '#FFFFFF'),\n };\n};\n\n/**\n * Returns the embedded image bytes when the slide carries a\n * `<p:bgPr><a:blipFill>` background, or `null` for any other background\n * kind (solid / gradient / pattern / inherit) or when the `r:embed`\n * relationship points at an external `r:link` target.\n *\n * Companion to `getSlideBackground`, which only reports the\n * discriminated `kind`. Renderers that want to actually paint the\n * background image (preview generators, snapshot tools) call this.\n */\nexport const getSlideBackgroundImageBytes = (slide: SlideData): Uint8Array | null => {\n const cSld = firstChildElement(slide[SLIDE_DOCUMENT].root, NAME_CSLD);\n if (!cSld) return null;\n const bg = firstChildElement(cSld, qname('p', 'bg', NS.pml));\n if (!bg) return null;\n const bgPr = firstChildElement(bg, qname('p', 'bgPr', NS.pml));\n if (!bgPr) return null;\n const blipFill = firstChildElement(bgPr, qname('a', 'blipFill', NS.dml));\n if (!blipFill) return null;\n const blip = firstChildElement(blipFill, qname('a', 'blip', NS.dml));\n if (!blip) return null;\n const rEmbed = getAttrValue(blip, qname('r', 'embed', NS.officeDocRels));\n if (rEmbed === null) return null;\n const pkg = slide[INTERNAL_PACKAGE];\n const rels = pkg.getRels(slide[SLIDE_PART_NAME]);\n if (!rels) return null;\n const rel = rels.items.find((r) => r.id === rEmbed);\n if (!rel || rel.targetMode === 'External') return null;\n const mediaName = rel.target.startsWith('/')\n ? partName(rel.target)\n : resolveTarget(slide[SLIDE_PART_NAME], rel.target);\n const part = pkg.getPart(mediaName);\n return part?.data ?? null;\n};\n\n/**\n * Reads the slide layout's background image bytes when its `<p:bg>` is\n * a `<p:bgPr><a:blipFill>`. Same shape as `getSlideBackgroundImageBytes`\n * for slides. Returns `null` when the layout has no image background.\n */\nexport const getSlideLayoutBackgroundImageBytes = (\n pres: PresentationData,\n layout: SlideLayoutData,\n): Uint8Array | null => {\n const cSld = firstChildElement(layout[LAYOUT_PART].root, NAME_CSLD);\n if (!cSld) return null;\n const bg = firstChildElement(cSld, qname('p', 'bg', NS.pml));\n if (!bg) return null;\n const bgPr = firstChildElement(bg, qname('p', 'bgPr', NS.pml));\n if (!bgPr) return null;\n const blipFill = firstChildElement(bgPr, qname('a', 'blipFill', NS.dml));\n if (!blipFill) return null;\n const blip = firstChildElement(blipFill, qname('a', 'blip', NS.dml));\n if (!blip) return null;\n const rEmbed = getAttrValue(blip, qname('r', 'embed', NS.officeDocRels));\n if (rEmbed === null) return null;\n const pkg = pres[INTERNAL_PACKAGE];\n const layoutPartName = partName(layout[LAYOUT_PART_NAME]);\n const rels = pkg.getRels(layoutPartName);\n if (!rels) return null;\n const rel = rels.items.find((r) => r.id === rEmbed);\n if (!rel || rel.targetMode === 'External') return null;\n const mediaName = rel.target.startsWith('/')\n ? partName(rel.target)\n : resolveTarget(layoutPartName, rel.target);\n const part = pkg.getPart(mediaName);\n return part?.data ?? null;\n};\n\n/**\n * Reads the slide master's background image bytes (via the layout's\n * master rel). Companion to `getSlideLayoutBackgroundImageBytes`.\n */\nexport const getSlideMasterBackgroundImageBytes = (\n pres: PresentationData,\n layout: SlideLayoutData,\n): Uint8Array | null => {\n const pkg = pres[INTERNAL_PACKAGE];\n const layoutPartName = partName(layout[LAYOUT_PART_NAME]);\n const layoutRels = pkg.getRels(layoutPartName);\n if (!layoutRels) return null;\n const masterRel = layoutRels.items.find((r) => r.type === REL_TYPES.slideMaster);\n if (!masterRel) return null;\n const masterPartName = resolveTarget(layoutPartName, masterRel.target);\n const masterPart = pkg.getPart(masterPartName);\n if (!masterPart) return null;\n const masterRoot = parseXml(decode(masterPart.data)).root;\n const cSld = firstChildElement(masterRoot, NAME_CSLD);\n if (!cSld) return null;\n const bg = firstChildElement(cSld, qname('p', 'bg', NS.pml));\n if (!bg) return null;\n const bgPr = firstChildElement(bg, qname('p', 'bgPr', NS.pml));\n if (!bgPr) return null;\n const blipFill = firstChildElement(bgPr, qname('a', 'blipFill', NS.dml));\n if (!blipFill) return null;\n const blip = firstChildElement(blipFill, qname('a', 'blip', NS.dml));\n if (!blip) return null;\n const rEmbed = getAttrValue(blip, qname('r', 'embed', NS.officeDocRels));\n if (rEmbed === null) return null;\n const masterRels = pkg.getRels(masterPartName);\n if (!masterRels) return null;\n const rel = masterRels.items.find((r) => r.id === rEmbed);\n if (!rel || rel.targetMode === 'External') return null;\n const mediaName = rel.target.startsWith('/')\n ? partName(rel.target)\n : resolveTarget(masterPartName, rel.target);\n const part = pkg.getPart(mediaName);\n return part?.data ?? null;\n};\n\n/** Sets a solid fill on the slide's background. */\nexport const setSlideBackground = (slide: SlideData, color: string): void => {\n setSlideBackgroundXml(slide, (bgPr) => setSolidFill(bgPr, color));\n};\n\n/**\n * Sets a picture as the slide's background. Embeds `bytes` as a new\n * media part, wires a slide → image rel, and replaces any prior\n * background with a `<p:bgPr><a:blipFill><a:blip r:embed=\"…\"/>\n * <a:stretch><a:fillRect/></a:stretch></a:blipFill></p:bgPr>` payload.\n *\n * Format is detected from magic bytes; pass `options.format` to\n * override.\n */\nexport const setSlideBackgroundImage = (\n slide: SlideData,\n bytes: Uint8Array,\n options: { format?: ImageFormat } = {},\n): void => {\n const format = options.format ?? detectImageFormat(bytes);\n if (format === null) {\n throw new Error(\n 'setSlideBackgroundImage: could not detect image format. Pass options.format explicitly.',\n );\n }\n const contentType = contentTypeForFormat(format);\n const extension = extensionForFormat(format);\n const pkg = slide[INTERNAL_PACKAGE];\n\n // Allocate media part name.\n let nextN = 1;\n const mediaPattern = /^\\/ppt\\/media\\/image(\\d+)\\./;\n for (const p of pkg.parts) {\n const m = p.name.match(mediaPattern);\n if (m?.[1] !== undefined) {\n const n = Number.parseInt(m[1], 10);\n if (Number.isFinite(n) && n >= nextN) nextN = n + 1;\n }\n }\n const newMediaName = partName(`/ppt/media/image${nextN}.${extension}`);\n setOpcDefault(pkg, extension, contentType);\n pkg.addPart(newMediaName, contentType, bytes);\n\n // Slide → image rel.\n const rels = pkg.getRels(slide[SLIDE_PART_NAME]) ?? emptyRels();\n const newRId = nextRelId(rels.items.map((r) => r.id));\n rels.items.push({\n id: newRId,\n type: REL_TYPES.image,\n target: `../media/image${nextN}.${extension}`,\n targetMode: 'Internal',\n });\n pkg.setRels(slide[SLIDE_PART_NAME], rels);\n\n setSlideBackgroundXml(slide, (bgPr) => {\n const blip = elem(qname('a', 'blip', NS.dml), {\n attrs: [attr(qname('r', 'embed', NS.officeDocRels), newRId)],\n });\n const stretch = elem(qname('a', 'stretch', NS.dml), {\n children: [elem(qname('a', 'fillRect', NS.dml))],\n });\n bgPr.children.push(elem(qname('a', 'blipFill', NS.dml), { children: [blip, stretch] }));\n });\n};\n\n/** Clears any explicit slide background, restoring layout inheritance. */\nexport const clearSlideBackground = (slide: SlideData): void => {\n const cSld = firstChildElement(slide[SLIDE_DOCUMENT].root, NAME_CSLD);\n if (!cSld) return;\n cSld.children = cSld.children.filter(\n (c) => !(c.kind === 'element' && c.name.namespaceURI === NS.pml && c.name.localName === 'bg'),\n );\n commitSlideData(slide);\n refreshSlideData(slide);\n};\n","// Effective color-map resolution.\n//\n// PowerPoint resolves every `schemeClr` token (`tx1`, `bg1`, `accent1`, …)\n// through the slide's effective color map before indexing the theme. The map\n// comes from the slide master's `<p:clrMap>`, optionally overridden per-slide\n// by `<p:clrMapOvr><a:overrideClrMapping>`. Most decks use the standard map\n// (`bg1=\"lt1\" tx1=\"dk1\"`), but exports from Google Slides / Canva frequently\n// INVERT it (`bg1=\"dk1\" tx1=\"lt1\"`). Resolving colors without the map then\n// paints text and backgrounds with swapped light/dark colors — the bug this\n// module exists to prevent.\n\nimport { partName, resolveTarget } from '../../internal/opc/index.ts';\nimport { REL_TYPES } from '../../internal/presentationml/index.ts';\nimport {\n NS,\n type XmlElement,\n firstChildElement,\n parseXml,\n qname,\n} from '../../internal/xml/index.ts';\nimport { INTERNAL_PACKAGE, SLIDE_PART_NAME, type SlideData } from '../_internal-symbols.ts';\nimport { decode } from './_helpers.ts';\nimport { resolveDrawingColor, resolveSchemeToken } from './shape-color.ts';\nimport { getSlideColorMapOverride } from './slide-background.ts';\nimport { themeFromPackage } from './theme.ts';\n\n// The standard `<p:clrMap>` — the fallback for the rare deck that omits the\n// element entirely. `bg1`/`tx1`/`bg2`/`tx2` point at the matching theme slots;\n// accents and hyperlinks are identity.\nconst STANDARD_COLOR_MAP: Readonly<Record<string, string>> = {\n bg1: 'lt1',\n tx1: 'dk1',\n bg2: 'lt2',\n tx2: 'dk2',\n accent1: 'accent1',\n accent2: 'accent2',\n accent3: 'accent3',\n accent4: 'accent4',\n accent5: 'accent5',\n accent6: 'accent6',\n hlink: 'hlink',\n folHlink: 'folHlink',\n};\n\nconst NAME_CLR_MAP = qname('p', 'clrMap', NS.pml);\nconst NAME_TX_STYLES = qname('p', 'txStyles', NS.pml);\nconst NAME_BODY_STYLE = qname('p', 'bodyStyle', NS.pml);\nconst NAME_LVL1_PPR = qname('a', 'lvl1pPr', NS.dml);\nconst NAME_DEF_RPR = qname('a', 'defRPr', NS.dml);\nconst NAME_SOLID_FILL = qname('a', 'solidFill', NS.dml);\n\n// Walk slide → layout → master, returning the master part's root element.\n// Mirrors the rel-walking pattern in `getSlideLayout` / `getSlideMasterBackground`;\n// kept self-contained here so this module doesn't depend on those readers.\nconst getSlideMasterRoot = (slide: SlideData): XmlElement | null => {\n const pkg = slide[INTERNAL_PACKAGE];\n const slideRels = pkg.getRels(slide[SLIDE_PART_NAME]);\n if (slideRels === null) return null;\n const layoutRel = slideRels.items.find((r) => r.type === REL_TYPES.slideLayout);\n if (!layoutRel) return null;\n const layoutPartName = layoutRel.target.startsWith('/')\n ? partName(layoutRel.target)\n : resolveTarget(slide[SLIDE_PART_NAME], layoutRel.target);\n const layoutRels = pkg.getRels(layoutPartName);\n if (layoutRels === null) return null;\n const masterRel = layoutRels.items.find((r) => r.type === REL_TYPES.slideMaster);\n if (!masterRel) return null;\n const masterPartName = masterRel.target.startsWith('/')\n ? partName(masterRel.target)\n : resolveTarget(layoutPartName, masterRel.target);\n const masterPart = pkg.getPart(masterPartName);\n if (masterPart === null) return null;\n return parseXml(decode(masterPart.data)).root;\n};\n\nconst readClrMapElement = (root: XmlElement): Record<string, string> | null => {\n const clrMap = firstChildElement(root, NAME_CLR_MAP);\n if (!clrMap) return null;\n const out: Record<string, string> = {};\n for (const a of clrMap.attrs) {\n if (a.name.namespaceURI !== '') continue;\n out[a.name.localName] = a.value;\n }\n return Object.keys(out).length > 0 ? out : null;\n};\n\n/**\n * The slide's effective color map: the master's `<p:clrMap>`, overlaid by a\n * per-slide `<p:clrMapOvr><a:overrideClrMapping>` when present. Falls back to\n * the standard map for decks that omit it.\n *\n * Pass the result to color resolution / renderers so `schemeClr` tokens map to\n * the theme slot PowerPoint actually paints — critical for decks with an\n * inverted map (`bg1=\"dk1\" tx1=\"lt1\"`).\n */\nexport const getEffectiveColorMap = (slide: SlideData): Record<string, string> => {\n const override = getSlideColorMapOverride(slide);\n if (override) return { ...STANDARD_COLOR_MAP, ...override };\n const masterRoot = getSlideMasterRoot(slide);\n const masterMap = masterRoot ? readClrMapElement(masterRoot) : null;\n return masterMap ? { ...STANDARD_COLOR_MAP, ...masterMap } : { ...STANDARD_COLOR_MAP };\n};\n\n// First DrawingML color child of a `<a:solidFill>` element.\nconst firstColorChild = (solidFill: XmlElement): XmlElement | null => {\n for (const c of solidFill.children) {\n if (c.kind === 'element' && c.name.namespaceURI === NS.dml) return c;\n }\n return null;\n};\n\n/**\n * The concrete `#RRGGBB` color the deck paints body text in, resolved through\n * the effective color map + theme. Read from the master's `bodyStyle` level-1\n * default run properties; falls back to the `tx1` token resolved through the\n * map. Returns `null` only when the deck carries no theme.\n *\n * Tables and charts authored by this library inherit no master text style, so\n * their text otherwise falls back to `tx1` — which an inverted color map paints\n * the SAME as the background, making the text invisible. Baking the body color\n * in keeps generated tables / charts readable on whatever surface the deck uses.\n */\nexport const resolveDeckBodyTextColor = (slide: SlideData): string | null => {\n const theme = themeFromPackage(slide[INTERNAL_PACKAGE]);\n if (!theme) return null;\n const clrMap = getEffectiveColorMap(slide);\n const masterRoot = getSlideMasterRoot(slide);\n if (masterRoot) {\n const txStyles = firstChildElement(masterRoot, NAME_TX_STYLES);\n const bodyStyle = txStyles ? firstChildElement(txStyles, NAME_BODY_STYLE) : null;\n const lvl1 = bodyStyle ? firstChildElement(bodyStyle, NAME_LVL1_PPR) : null;\n const defRPr = lvl1 ? firstChildElement(lvl1, NAME_DEF_RPR) : null;\n const solidFill = defRPr ? firstChildElement(defRPr, NAME_SOLID_FILL) : null;\n const colorEl = solidFill ? firstColorChild(solidFill) : null;\n if (colorEl) {\n const hex = resolveDrawingColor(colorEl, theme, clrMap);\n if (hex) return hex;\n }\n }\n // No explicit body color in the master: resolve the conventional text token\n // through the (possibly inverted) map.\n return resolveSchemeToken('tx1', theme, clrMap);\n};\n","// Charts (read + write).\n\nimport type { Emu } from '../units.ts';\nimport {\n type PartName,\n emptyRels,\n nextRelId,\n partName,\n resolveTarget,\n} from '../../internal/opc/index.ts';\nimport type { OpcPackage } from '../../internal/parts/index.ts';\nimport { emuCoordinate, emuExtent } from '../../internal/bounds.ts';\nimport { parseSrgbHex } from '../../internal/drawingml/index.ts';\nimport { REL_TYPES } from '../../internal/presentationml/index.ts';\nimport {\n type ChartKind,\n type ChartSeries,\n type ChartSpec,\n type ChartTextStyle,\n buildChartSpaceDoc,\n buildEmbeddedXlsx,\n readChartSpec,\n} from '../../internal/chartml/index.ts';\nimport {\n NS,\n type XmlElement,\n attr,\n elem,\n firstChildElement,\n getAttrValue,\n parseXml,\n qname,\n serializeXml,\n text as textNode,\n} from '../../internal/xml/index.ts';\nimport {\n INTERNAL_PACKAGE,\n type PresentationData,\n SHAPE_ELEMENT,\n SHAPE_SLIDE,\n SHAPE_SNAPSHOT,\n SLIDE_PART_NAME,\n SLIDE_SHAPES,\n type SlideData,\n type SlideShapeData,\n} from '../_internal-symbols.ts';\nimport { appendAndReturnNewShape, decode, encode, nextShapeId, setOpcDefault } from './_helpers.ts';\nimport { resolveDeckBodyTextColor } from './color-map.ts';\nimport { getSlides } from './slide-query.ts';\n// ---------------------------------------------------------------------------\n// Charts.\n//\n// Authoring path for ChartML (`/ppt/charts/chart{N}.xml`) + the embedded\n// `/ppt/embeddings/Microsoft_Excel_Worksheet{N}.xlsx` workbook that\n// PowerPoint requires for the \"Edit data\" action to work. See plan §P9\n// and §Risks for the scope constraints.\n//\n// Public surface is intentionally narrow: one `addSlideChart` entry point\n// that takes a typed `ChartSpec`. The internal layer handles the chart\n// XML, the embedded xlsx ZIP, and all the relationship wiring.\n\nconst CHART_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml';\nconst EMBEDDED_XLSX_CONTENT_TYPE =\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n\nconst allocateChartIndex = (pkg: OpcPackage): number => {\n let next = 1;\n const re = /^\\/ppt\\/charts\\/chart(\\d+)\\.xml$/;\n for (const p of pkg.parts) {\n const m = p.name.match(re);\n if (m?.[1] !== undefined) {\n const n = Number.parseInt(m[1], 10);\n if (Number.isFinite(n) && n >= next) next = n + 1;\n }\n }\n return next;\n};\n\nconst NAME_GRAPHIC_FRAME = qname('p', 'graphicFrame', NS.pml);\nconst NAME_NV_GRAPHIC_FRAME_PR = qname('p', 'nvGraphicFramePr', NS.pml);\nconst NAME_C_NV_PR_FN = qname('p', 'cNvPr', NS.pml);\nconst NAME_C_NV_GRAPHIC_FRAME_PR = qname('p', 'cNvGraphicFramePr', NS.pml);\nconst NAME_NV_PR = qname('p', 'nvPr', NS.pml);\nconst NAME_XFRM = qname('p', 'xfrm', NS.pml);\nconst NAME_OFF = qname('a', 'off', NS.dml);\nconst NAME_EXT = qname('a', 'ext', NS.dml);\nconst NAME_GRAPHIC = qname('a', 'graphic', NS.dml);\nconst NAME_GRAPHIC_DATA = qname('a', 'graphicData', NS.dml);\nconst NAME_C_CHART = qname('c', 'chart', NS.chart);\n\nconst buildChartGraphicFrame = (opts: {\n id: number;\n name: string;\n x: Emu;\n y: Emu;\n w: Emu;\n h: Emu;\n rEmbed: string;\n}): XmlElement => {\n const cNvPr = elem(NAME_C_NV_PR_FN, {\n attrs: [attr(qname('', 'id', ''), String(opts.id)), attr(qname('', 'name', ''), opts.name)],\n });\n const nvGraphicFramePr = elem(NAME_NV_GRAPHIC_FRAME_PR, {\n children: [cNvPr, elem(NAME_C_NV_GRAPHIC_FRAME_PR), elem(NAME_NV_PR)],\n });\n // Round to whole EMU; fractional ST_Coordinate values corrupt the file.\n const off = elem(NAME_OFF, {\n attrs: [\n attr(qname('', 'x', ''), String(emuCoordinate(opts.x, 'addSlideChart: x'))),\n attr(qname('', 'y', ''), String(emuCoordinate(opts.y, 'addSlideChart: y'))),\n ],\n });\n const ext = elem(NAME_EXT, {\n attrs: [\n attr(qname('', 'cx', ''), String(emuExtent(opts.w, 'addSlideChart: w'))),\n attr(qname('', 'cy', ''), String(emuExtent(opts.h, 'addSlideChart: h'))),\n ],\n });\n const xfrm = elem(NAME_XFRM, { children: [off, ext] });\n const chartRef = elem(NAME_C_CHART, {\n prefixDecls: new Map([\n ['c', NS.chart],\n ['r', NS.officeDocRels],\n ]),\n attrs: [attr(qname('r', 'id', NS.officeDocRels), opts.rEmbed)],\n });\n const graphicData = elem(NAME_GRAPHIC_DATA, {\n attrs: [attr(qname('', 'uri', ''), NS.chart)],\n children: [chartRef],\n });\n const graphic = elem(NAME_GRAPHIC, { children: [graphicData] });\n return elem(NAME_GRAPHIC_FRAME, { children: [nvGraphicFramePr, xfrm, graphic] });\n};\n\n// The chart builder emits every authored color as `<a:srgbClr>`, so chart\n// colors must be sRGB hex (`#RRGGBB` or `RRGGBB`) — scheme tokens like\n// `accent1` are not valid here. Without this gate an invalid string was\n// written verbatim into `val=\"…\"`, producing a chart PowerPoint silently\n// dropped (or repaired). Validate at the authoring boundary so callers get\n// a clear error instead of a broken deck. The `#` prefix is optional; the\n// builder normalizes it.\nconst checkChartColor = (value: string | null | undefined, label: string): void => {\n if (value === null || value === undefined) return;\n if (parseSrgbHex(value) === null) {\n throw new Error(\n `${label}: invalid chart color ${JSON.stringify(value)} — expected an sRGB hex like \"#4472C4\" or \"4472C4\"`,\n );\n }\n};\n\nconst validateChartSpecColors = (spec: ChartSpec): void => {\n checkChartColor(spec.plotAreaFill, 'addSlideChart: plotAreaFill');\n checkChartColor(spec.plotAreaStrokeColor, 'addSlideChart: plotAreaStrokeColor');\n checkChartColor(spec.chartAreaFill, 'addSlideChart: chartAreaFill');\n checkChartColor(spec.chartAreaStrokeColor, 'addSlideChart: chartAreaStrokeColor');\n checkChartColor(spec.valueAxisMajorGridlineColor, 'addSlideChart: valueAxisMajorGridlineColor');\n checkChartColor(spec.valueAxisMinorGridlineColor, 'addSlideChart: valueAxisMinorGridlineColor');\n checkChartColor(\n spec.categoryAxisMajorGridlineColor,\n 'addSlideChart: categoryAxisMajorGridlineColor',\n );\n checkChartColor(\n spec.categoryAxisMinorGridlineColor,\n 'addSlideChart: categoryAxisMinorGridlineColor',\n );\n checkChartColor(spec.valueAxisLineColor, 'addSlideChart: valueAxisLineColor');\n checkChartColor(spec.categoryAxisLineColor, 'addSlideChart: categoryAxisLineColor');\n spec.series.forEach((series, i) => {\n checkChartColor(series.color, `addSlideChart: series[${i}].color`);\n checkChartColor(series.trendline?.color, `addSlideChart: series[${i}].trendline.color`);\n series.pointColors?.forEach((c, j) => {\n checkChartColor(c, `addSlideChart: series[${i}].pointColors[${j}]`);\n });\n });\n};\n\n/**\n * Adds a chart to the slide. Returns the new shape handle (kind\n * `graphicFrame`). Supported chart kinds today: `bar`, `column`,\n * `line`, `pie` — see `ChartSpec.kind`.\n *\n * Side effects:\n *\n * - Allocates `/ppt/charts/chart{N}.xml` for the chart definition.\n * - Allocates `/ppt/embeddings/Microsoft_Excel_Worksheet{N}.xlsx` as\n * a placeholder workbook (single sheet, header row + one row per\n * category). PowerPoint reads the inline `<c:strCache>` /\n * `<c:numCache>` so the workbook is for \"Edit data\" only.\n * - Slide → chart and chart → workbook rels are wired with fresh rIds.\n * - `<a:graphicFrame>` is appended to the slide's `<p:spTree>`.\n *\n * Constraints:\n *\n * - `pie` charts require exactly one series.\n * - All series should have at most `categories.length` values; missing\n * values are treated as blanks (gaps in the visualization).\n */\n// A chart inherits no master text style, so any label without an authored\n// color falls back to the `tx1` token — which a deck with an inverted color\n// map paints the same as the surface, hiding axis labels, the legend, and data\n// labels. Bake the deck's resolved body-text color onto every text style the\n// caller left unset (authored colors always win).\nconst withChartDefaultTextColor = (spec: ChartSpec, color: string | null): ChartSpec => {\n if (color === null) return spec;\n const withColor = (style: ChartTextStyle | undefined): ChartTextStyle =>\n style === undefined ? { color } : style.color === undefined ? { ...style, color } : style;\n return {\n ...spec,\n categoryAxisLabelStyle: withColor(spec.categoryAxisLabelStyle),\n valueAxisLabelStyle: withColor(spec.valueAxisLabelStyle),\n ...(spec.title !== undefined ? { titleStyle: withColor(spec.titleStyle) } : {}),\n ...(spec.legend !== undefined\n ? { legend: { ...spec.legend, textStyle: withColor(spec.legend.textStyle) } }\n : {}),\n ...(spec.dataLabels !== undefined\n ? { dataLabels: { ...spec.dataLabels, textStyle: withColor(spec.dataLabels.textStyle) } }\n : {}),\n };\n};\n\nexport const addSlideChart = (\n slide: SlideData,\n opts: {\n spec: ChartSpec;\n x: Emu;\n y: Emu;\n w: Emu;\n h: Emu;\n name?: string;\n },\n): SlideShapeData => {\n validateChartSpecColors(opts.spec);\n const spec = withChartDefaultTextColor(opts.spec, resolveDeckBodyTextColor(slide));\n const pkg = slide[INTERNAL_PACKAGE];\n const chartN = allocateChartIndex(pkg);\n const chartPartName = partName(`/ppt/charts/chart${chartN}.xml`);\n const xlsxPartName = partName(`/ppt/embeddings/Microsoft_Excel_Worksheet${chartN}.xlsx`);\n\n // Build the embedded xlsx bytes. Each row in the sheet corresponds to\n // one category; header row carries the series names.\n const xlsxRows = spec.categories.map((label, i) => ({\n label,\n values: spec.series.map((s) => s.values[i] ?? null),\n }));\n const xlsxBytes = buildEmbeddedXlsx(\n spec.series.map((s) => s.name),\n xlsxRows,\n );\n\n // Build the chart XML and serialize.\n const chartDoc = buildChartSpaceDoc(spec);\n const chartBytes = encode(serializeXml(chartDoc));\n\n // Add the chart part + its rel → embedded xlsx.\n pkg.addPart(chartPartName, CHART_CONTENT_TYPE, chartBytes);\n\n // The xlsx is a binary part; xlsx is already an OPC zip so we add a\n // Content_Types override (no Default, since `.xlsx` shouldn't override\n // unrelated archive entries even though there's only one such part\n // here in practice).\n pkg.addPart(xlsxPartName, EMBEDDED_XLSX_CONTENT_TYPE, xlsxBytes);\n\n // Make sure `.rels` is a recognized Default (it always is by the time\n // we get here, but be defensive for new packages).\n setOpcDefault(pkg, 'rels', 'application/vnd.openxmlformats-package.relationships+xml');\n\n const chartRels = emptyRels();\n chartRels.items.push({\n id: 'rId1',\n type: REL_TYPES.package,\n target: `../embeddings/Microsoft_Excel_Worksheet${chartN}.xlsx`,\n targetMode: 'Internal',\n });\n pkg.setRels(chartPartName, chartRels);\n\n // Slide → chart rel.\n const slideRels = pkg.getRels(slide[SLIDE_PART_NAME]) ?? emptyRels();\n const slideChartRId = nextRelId(slideRels.items.map((r) => r.id));\n slideRels.items.push({\n id: slideChartRId,\n type: REL_TYPES.chart,\n target: `../charts/chart${chartN}.xml`,\n targetMode: 'Internal',\n });\n pkg.setRels(slide[SLIDE_PART_NAME], slideRels);\n\n // Build and append the <p:graphicFrame> wrapper.\n const frame = buildChartGraphicFrame({\n id: nextShapeId(slide),\n name: opts.name ?? `Chart ${chartN}`,\n x: opts.x,\n y: opts.y,\n w: opts.w,\n h: opts.h,\n rEmbed: slideChartRId,\n });\n return appendAndReturnNewShape(slide, frame);\n};\n\n// Re-export chart types for consumers.\nexport type { ChartKind, ChartSeries, ChartSpec };\n\n/**\n * A chart sitting on a slide. `shape` is the `<p:graphicFrame>`\n * wrapper; `spec` is the chart definition parsed from the linked\n * `/ppt/charts/chart{N}.xml` part. `null` `spec` means the chart uses\n * a kind we don't model (callers can fall through to pass-through).\n */\nexport interface SlideChartData {\n readonly shape: SlideShapeData;\n readonly spec: ChartSpec | null;\n}\n\nconst NAME_A_GRAPHIC_FN = qname('a', 'graphic', NS.dml);\nconst NAME_A_GRAPHIC_DATA_FN = qname('a', 'graphicData', NS.dml);\nconst NAME_C_CHART_FN = qname('c', 'chart', NS.chart);\n\n/**\n * Resolves the chart part backing a graphic-frame shape, or `null` if\n * the shape isn't a chart wrapper.\n */\nexport const resolveChartPartName = (\n slide: SlideData,\n shape: SlideShapeData,\n): { partName: PartName; rId: string } | null => {\n if (shape[SHAPE_SNAPSHOT].kind !== 'graphicFrame') return null;\n const graphic = firstChildElement(shape[SHAPE_ELEMENT], NAME_A_GRAPHIC_FN);\n if (!graphic) return null;\n const graphicData = firstChildElement(graphic, NAME_A_GRAPHIC_DATA_FN);\n if (!graphicData) return null;\n const chartRef = firstChildElement(graphicData, NAME_C_CHART_FN);\n if (!chartRef) return null;\n const rId = getAttrValue(chartRef, qname('r', 'id', NS.officeDocRels));\n if (rId === null) return null;\n const slideRels = slide[INTERNAL_PACKAGE].getRels(slide[SLIDE_PART_NAME]);\n if (!slideRels) return null;\n const rel = slideRels.items.find((r) => r.id === rId);\n if (!rel) return null;\n const partNameValue = rel.target.startsWith('/')\n ? partName(rel.target)\n : resolveTarget(slide[SLIDE_PART_NAME], rel.target);\n return { partName: partNameValue, rId };\n};\n\n/**\n * Replaces the chart definition on an existing graphic-frame chart\n * shape. Updates the inline `<c:strCache>` / `<c:numCache>` blocks so\n * PowerPoint renders the new data without opening the embedded\n * workbook. The shape's geometry (position / size / rotation) is\n * preserved verbatim.\n *\n * The embedded xlsx is re-written too — it's what the \"Edit data\"\n * affordance opens. The previous workbook is replaced wholesale (no\n * attempt to preserve styles a user added through Excel).\n *\n * Pass any `ChartSpec`, including a different `kind` from the\n * original; this acts as \"change my column chart to a line chart with\n * fresh data.\"\n */\nexport const setChartSpec = (chart: SlideChartData, spec: ChartSpec): void => {\n validateChartSpecColors(spec);\n const slide = chart.shape[SHAPE_SLIDE];\n const pkg = slide[INTERNAL_PACKAGE];\n const resolved = resolveChartPartName(slide, chart.shape);\n if (!resolved) {\n throw new Error('setChartSpec: shape is not a chart graphic frame');\n }\n\n // Rewrite the chart XML.\n const doc = buildChartSpaceDoc(spec);\n const chartBytes = encode(serializeXml(doc));\n const chartPart = pkg.getPart(resolved.partName);\n if (!chartPart) {\n throw new Error(`setChartSpec: chart part ${resolved.partName} not found`);\n }\n chartPart.data = chartBytes;\n\n // Rewrite the embedded xlsx (the part chart→package rel points at).\n // Reuse the existing rel; fall back to creating a fresh xlsx part if\n // the chart had no package rel (unusual for charts we authored).\n const chartRels = pkg.getRels(resolved.partName);\n if (chartRels) {\n const xlsxRel = chartRels.items.find((r) => r.type === REL_TYPES.package);\n if (xlsxRel) {\n const xlsxName = xlsxRel.target.startsWith('/')\n ? partName(xlsxRel.target)\n : resolveTarget(resolved.partName, xlsxRel.target);\n const xlsxPart = pkg.getPart(xlsxName);\n const rows = spec.categories.map((label, i) => ({\n label,\n values: spec.series.map((s) => s.values[i] ?? null),\n }));\n const xlsxBytes = buildEmbeddedXlsx(\n spec.series.map((s) => s.name),\n rows,\n );\n if (xlsxPart) {\n xlsxPart.data = xlsxBytes;\n }\n }\n }\n};\n\n/**\n * Returns every chart on the slide, with its `ChartSpec` parsed from\n * the linked chart part. Skips graphic frames that don't carry a\n * `<c:chart>` reference (e.g. tables, diagrams).\n */\n/**\n * For a graphic-frame shape that wraps a chart, returns the parsed\n * `ChartSpec`. Returns `null` when the shape isn't a chart wrapper\n * or the chart uses a kind we don't model (e.g. surface, radar).\n *\n * Convenience over `getSlideCharts(...).find((c) => c.shape === shape)`\n * when the caller already has the shape in hand (e.g. iterating\n * `getSlideShapes`).\n */\n/**\n * Convenience over `getShapeChartSpec(shape)?.kind ?? null`. Returns\n * the chart's `ChartKind` ('bar', 'line', 'pie', …) when the shape\n * is a chart wrapper, or `null` for non-charts and charts whose\n * kind isn't modeled yet.\n */\nexport const getShapeChartKind = (shape: SlideShapeData): ChartKind | null => {\n const spec = getShapeChartSpec(shape);\n return spec === null ? null : spec.kind;\n};\n\n/**\n * Returns the categories axis labels of a chart shape, or `null`\n * if the shape isn't a chart wrapper or its kind isn't modeled.\n * Convenience over `getShapeChartSpec(shape)?.categories ?? null`.\n */\nexport const getShapeChartCategories = (shape: SlideShapeData): ReadonlyArray<string> | null => {\n const spec = getShapeChartSpec(shape);\n return spec === null ? null : spec.categories;\n};\n\n/**\n * Returns the chart's series-name list (in spec order). `null`\n * when the shape isn't a chart wrapper or the kind isn't modeled.\n */\nexport const getShapeChartSeriesNames = (shape: SlideShapeData): ReadonlyArray<string> | null => {\n const spec = getShapeChartSpec(shape);\n return spec === null ? null : spec.series.map((s) => s.name);\n};\n\n/**\n * Returns the values for the named series on a chart shape, or\n * `null` when the shape isn't a chart, the kind isn't modeled, or\n * no series matches `seriesName`.\n *\n * For `scatter` / `bubble` charts the returned array is the series'\n * y-channel (`<c:yVal>`); the paired x-channel and bubble sizes are on\n * the full spec via `getShapeChartSpec` (`series[].xValues` /\n * `series[].bubbleSizes`).\n */\nexport const getShapeChartSeriesValues = (\n shape: SlideShapeData,\n seriesName: string,\n): ReadonlyArray<number | null> | null => {\n const spec = getShapeChartSpec(shape);\n if (spec === null) return null;\n const series = spec.series.find((s) => s.name === seriesName);\n return series ? series.values : null;\n};\n\nexport const getShapeChartSpec = (shape: SlideShapeData): ChartSpec | null => {\n const slide = shape[SHAPE_SLIDE];\n const resolved = resolveChartPartName(slide, shape);\n if (!resolved) return null;\n const part = slide[INTERNAL_PACKAGE].getPart(resolved.partName);\n if (!part) return null;\n try {\n const root = parseXml(decode(part.data)).root;\n return readChartSpec(root);\n } catch {\n return null;\n }\n};\n\n/**\n * Returns every chart on the slide that carries a series whose name\n * equals `seriesName` exactly. Useful for \"find the revenue chart\"\n * patterns where chart kind alone isn't unique. Skips charts whose\n * kind isn't modeled.\n */\nexport const findChartsBySeriesName = (\n slide: SlideData,\n seriesName: string,\n): ReadonlyArray<SlideChartData> => {\n const out: SlideChartData[] = [];\n for (const chart of getSlideCharts(slide)) {\n if (chart.spec === null) continue;\n if (chart.spec.series.some((s) => s.name === seriesName)) out.push(chart);\n }\n return out;\n};\n\n/**\n * Returns every chart on the slide that carries at least one\n * `<c:trendline>` on any of its series. Useful for deck-audit reports\n * — trendlines are easy to add and easy to forget, and authors often\n * want to inventory them before publishing. Skips charts whose kind\n * isn't modeled.\n */\nexport const findChartsWithTrendlines = (slide: SlideData): ReadonlyArray<SlideChartData> => {\n const out: SlideChartData[] = [];\n for (const chart of getSlideCharts(slide)) {\n if (chart.spec === null) continue;\n if (chart.spec.series.some((s) => s.trendline !== undefined)) out.push(chart);\n }\n return out;\n};\n\n/**\n * Returns every chart on the slide whose `dataLabels` (chart-level)\n * or any series-level `dataLabels` enable at least one of `showValue`,\n * `showCategory`, `showSeriesName`, or `showPercent`. Useful for\n * \"which charts show numbers next to the data?\" audits — purely\n * presence-based; doesn't validate numberFormat or position. Charts\n * whose kind isn't modeled are skipped.\n */\nexport const findChartsWithDataLabels = (slide: SlideData): ReadonlyArray<SlideChartData> => {\n const out: SlideChartData[] = [];\n const hasLabel = (dl: ChartSpec['dataLabels'] | undefined): boolean =>\n dl !== undefined &&\n Boolean(dl.showValue || dl.showCategory || dl.showSeriesName || dl.showPercent);\n for (const chart of getSlideCharts(slide)) {\n if (chart.spec === null) continue;\n if (hasLabel(chart.spec.dataLabels)) {\n out.push(chart);\n continue;\n }\n if (chart.spec.series.some((s) => hasLabel(s.dataLabels))) {\n out.push(chart);\n }\n }\n return out;\n};\n\n/**\n * Returns the first chart on the slide whose parsed `kind` matches\n * `kind` (e.g. `'bar'`, `'line'`, `'pie'`). Returns `null` when no\n * chart on the slide has that kind, or when every chart on the slide\n * uses a kind this version doesn't yet model.\n */\nexport const findChartByKind = (slide: SlideData, kind: ChartKind): SlideChartData | null => {\n for (const chart of getSlideCharts(slide)) {\n if (chart.spec !== null && chart.spec.kind === kind) return chart;\n }\n return null;\n};\n\n/**\n * Histogram of chart kinds across the whole deck. Returns a frozen\n * `Record<ChartKind, number>` with every kind present (zeros for any\n * absent kind). Useful for deck-audit reports (e.g. \"how many pie\n * charts does this presentation have?\") without iterating every slide\n * by hand.\n *\n * Charts whose spec doesn't parse — typically a kind this version\n * doesn't yet model — are skipped silently, mirroring\n * `findChartByKind`'s null-spec handling.\n */\nexport const getPresentationChartKindCounts = (\n pres: PresentationData,\n): Readonly<Record<ChartKind, number>> => {\n const counts: Record<ChartKind, number> = {\n bar: 0,\n column: 0,\n line: 0,\n pie: 0,\n doughnut: 0,\n area: 0,\n scatter: 0,\n radar: 0,\n bubble: 0,\n };\n for (const slide of getSlides(pres)) {\n for (const chart of getSlideCharts(slide)) {\n if (chart.spec === null) continue;\n counts[chart.spec.kind]++;\n }\n }\n return counts;\n};\n\n/**\n * Dense per-slide chart count array, 0-based by slide index. Counts\n * every chart returned by `getSlideCharts` regardless of whether its\n * `spec` parsed — useful for \"which slides carry charts the renderer\n * doesn't yet model?\" audits. Pair with\n * `getPresentationChartKindCounts` for kind-level totals.\n */\nexport const getPresentationChartCountsBySlide = (pres: PresentationData): ReadonlyArray<number> =>\n getSlides(pres).map((s) => getSlideCharts(s).length);\n\nexport const getSlideCharts = (slide: SlideData): ReadonlyArray<SlideChartData> => {\n const pkg = slide[INTERNAL_PACKAGE];\n const out: SlideChartData[] = [];\n for (const shape of slide[SLIDE_SHAPES]) {\n const resolved = resolveChartPartName(slide, shape);\n if (!resolved) continue;\n const chartPart = pkg.getPart(resolved.partName);\n if (!chartPart) continue;\n let spec: ChartSpec | null;\n try {\n const root = parseXml(decode(chartPart.data)).root;\n spec = readChartSpec(root);\n } catch {\n spec = null;\n }\n out.push({ shape, spec });\n }\n return out;\n};\n\nvoid textNode;\n","// rPr and pPr cascade resolution.\n\nimport {\n ATTR_LVL,\n NAME_A_PPR,\n NAME_A_RPR,\n ensureRPr,\n requireParagraph,\n requireRun,\n runsOf,\n} from './shape-runs.ts';\nimport { parseRPrLikeElement } from './shape-color.ts';\nimport {\n getShapePlaceholderIdx,\n getShapePlaceholderType,\n matchPlaceholderShape,\n} from './shape-read-base.ts';\nimport { getSlideLayout } from './shape-slide-read.ts';\nimport {\n type BulletStyle,\n type ParagraphAlignment,\n type TextFormat,\n applyHyperlinkToAllRuns,\n applyRunFormat as applyRunFormatInternal,\n} from '../../internal/drawingml/index.ts';\nimport { emptyRels, nextRelId, partName, resolveTarget } from '../../internal/opc/index.ts';\nimport { REL_TYPES, readShapeTreeFromCsldRoot } from '../../internal/presentationml/index.ts';\nimport {\n NS,\n type XmlElement,\n firstChildElement,\n getAttrValue,\n parseXml,\n qname,\n} from '../../internal/xml/index.ts';\nimport {\n INTERNAL_PACKAGE,\n LAYOUT_PART,\n LAYOUT_PART_NAME,\n type PresentationData,\n SHAPE_ELEMENT,\n SHAPE_SLIDE,\n SHAPE_SNAPSHOT,\n SLIDE_PART_NAME,\n type SlideShapeData,\n} from '../_internal-symbols.ts';\nimport { commitAndRefresh, decode, requireTxBody } from './_helpers.ts';\nimport { getPresentationFonts, getPresentationTheme } from './theme.ts';\n// -- Effective rPr cascade (ECMA-376 §21.1.2.4.7) ---------------------------\n//\n// A run's effective character properties are resolved by walking the\n// inheritance chain — each level fills in fields that no earlier level\n// supplied. First-wins per property:\n//\n// 1. The run's own `<a:rPr>`\n// 2. The paragraph's `<a:endParaRPr>` (last run only)\n// 3. The paragraph's `<a:pPr><a:defRPr>` (paragraph-level run defaults)\n// 4. The text body's `<a:lstStyle><a:lvl{N+1}pPr><a:defRPr>` (N = paragraph level)\n// 5. The same path on the matching placeholder in the slide's layout\n// 6. The same path on the matching placeholder on the slide master,\n// then the master's `<p:txStyles>` (`titleStyle` / `bodyStyle` / `otherStyle`)\n// 7. The theme's `<a:fontScheme>` — font typeface fallback only\n//\n// Placeholder matching: by `<p:ph/@idx>` first, then by `<p:ph/@type>`.\n\nconst NAME_A_DEF_RPR = qname('a', 'defRPr', NS.dml);\nconst NAME_A_END_PARA_RPR = qname('a', 'endParaRPr', NS.dml);\nconst NAME_A_LST_STYLE = qname('a', 'lstStyle', NS.dml);\nconst NAME_P_TX_BODY_PML = qname('p', 'txBody', NS.pml);\nconst NAME_P_TX_STYLES = qname('p', 'txStyles', NS.pml);\nconst NAME_P_TITLE_STYLE = qname('p', 'titleStyle', NS.pml);\nconst NAME_P_BODY_STYLE = qname('p', 'bodyStyle', NS.pml);\nconst NAME_P_OTHER_STYLE = qname('p', 'otherStyle', NS.pml);\n\nconst mergeRPrLayer = (base: Partial<TextFormat>, layer: Partial<TextFormat>): void => {\n if (base.font === undefined && layer.font !== undefined) base.font = layer.font;\n if (base.fontEastAsian === undefined && layer.fontEastAsian !== undefined) {\n base.fontEastAsian = layer.fontEastAsian;\n }\n if (base.size === undefined && layer.size !== undefined) base.size = layer.size;\n if (base.color === undefined && layer.color !== undefined) base.color = layer.color;\n if (base.bold === undefined && layer.bold !== undefined) base.bold = layer.bold;\n if (base.italic === undefined && layer.italic !== undefined) base.italic = layer.italic;\n if (base.underline === undefined && layer.underline !== undefined) {\n base.underline = layer.underline;\n }\n if (base.strike === undefined && layer.strike !== undefined) base.strike = layer.strike;\n if (base.spc === undefined && layer.spc !== undefined) base.spc = layer.spc;\n if (base.kern === undefined && layer.kern !== undefined) base.kern = layer.kern;\n if (base.baseline === undefined && layer.baseline !== undefined) base.baseline = layer.baseline;\n if (base.cap === undefined && layer.cap !== undefined) base.cap = layer.cap;\n if (base.highlight === undefined && layer.highlight !== undefined) {\n base.highlight = layer.highlight;\n }\n};\n\n// `<a:lstStyle>` carries one `<a:lvl{N}pPr>` per outline level (1..9, plus\n// `<a:defPPr>` for the level-0 default). Returns the inner `<a:defRPr>` for\n// the requested zero-based level, or `null` if the level isn't authored.\nconst lstStyleLevelDefRPr = (lstStyle: XmlElement | null, level: number): XmlElement | null => {\n if (!lstStyle) return null;\n const localName = `lvl${Math.max(0, Math.min(8, level)) + 1}pPr`;\n const lvlPPr = firstChildElement(lstStyle, qname('a', localName, NS.dml));\n if (!lvlPPr) {\n // Fall back to `<a:defPPr>` only for level 0 — that's what the schema\n // declares as the \"no explicit level\" slot.\n if (level !== 0) return null;\n const defPPr = firstChildElement(lstStyle, qname('a', 'defPPr', NS.dml));\n if (!defPPr) return null;\n return firstChildElement(defPPr, NAME_A_DEF_RPR);\n }\n return firstChildElement(lvlPPr, NAME_A_DEF_RPR);\n};\n\n// Companion to `lstStyleLevelDefRPr` but returns the `<a:lvlNpPr>` (or\n// `<a:defPPr>` for level 0) element itself — i.e. the paragraph-property\n// container, not the run-default child. Used by the pPr cascade.\nconst lstStyleLevelPPr = (lstStyle: XmlElement | null, level: number): XmlElement | null => {\n if (!lstStyle) return null;\n const localName = `lvl${Math.max(0, Math.min(8, level)) + 1}pPr`;\n const lvlPPr = firstChildElement(lstStyle, qname('a', localName, NS.dml));\n if (lvlPPr) return lvlPPr;\n if (level !== 0) return null;\n return firstChildElement(lstStyle, qname('a', 'defPPr', NS.dml));\n};\n\nconst findShapeLstStyleElement = (shape: SlideShapeData): XmlElement | null => {\n const txBody = firstChildElement(shape[SHAPE_ELEMENT], NAME_P_TX_BODY_PML);\n if (!txBody) return null;\n return firstChildElement(txBody, NAME_A_LST_STYLE);\n};\n\nconst findPlaceholderShapeIn = (\n shapes: ReadonlyArray<{\n placeholderIdx: number | null;\n placeholderType: string | null;\n element: XmlElement;\n }>,\n phIdx: number | null,\n phType: string | null,\n): { element: XmlElement } | undefined => matchPlaceholderShape(shapes, phIdx, phType);\n\nconst extractPlaceholderLstStyle = (placeholderEl: XmlElement): XmlElement | null => {\n const txBody = firstChildElement(placeholderEl, NAME_P_TX_BODY_PML);\n if (!txBody) return null;\n return firstChildElement(txBody, NAME_A_LST_STYLE);\n};\n\nconst NAME_P_NV_SP_PR = qname('p', 'nvSpPr', NS.pml);\nconst NAME_P_NV_PR = qname('p', 'nvPr', NS.pml);\nconst NAME_P_PH = qname('p', 'ph', NS.pml);\n\n// A shape participates in placeholder inheritance only when it actually carries\n// a `<p:ph>`. A plain text box (no `<p:ph>`) must NOT inherit the slide master's\n// titleStyle / bodyStyle / otherStyle — PowerPoint resolves it against the\n// presentation's default text style (≈18pt), not the master body style.\n// `getShapePlaceholderType()` returns null both for \"placeholder with no type\"\n// (which DOES default to body) and \"not a placeholder at all\" (which does not),\n// so we must check for the element directly to tell them apart.\nconst shapeIsPlaceholder = (shape: SlideShapeData): boolean => {\n const nvSpPr = firstChildElement(shape[SHAPE_ELEMENT], NAME_P_NV_SP_PR);\n if (!nvSpPr) return false;\n const nvPr = firstChildElement(nvSpPr, NAME_P_NV_PR);\n return nvPr !== null && firstChildElement(nvPr, NAME_P_PH) !== null;\n};\n\nconst masterTxStyleFor = (masterRoot: XmlElement, phType: string | null): XmlElement | null => {\n const txStyles = firstChildElement(masterRoot, NAME_P_TX_STYLES);\n if (!txStyles) return null;\n if (phType === 'title' || phType === 'ctrTitle') {\n return firstChildElement(txStyles, NAME_P_TITLE_STYLE);\n }\n // Body / null-typed (= body default) / subTitle all inherit from bodyStyle.\n if (phType === 'body' || phType === 'subTitle' || phType === null) {\n return firstChildElement(txStyles, NAME_P_BODY_STYLE);\n }\n // Footer / date / sldNum / etc. inherit from otherStyle.\n return firstChildElement(txStyles, NAME_P_OTHER_STYLE);\n};\n\n/**\n * Resolves a run's effective character properties by walking the\n * ECMA-376 §21.1.2.4.7 inheritance chain — run rPr → endParaRPr →\n * pPr defRPr → text-body lstStyle → layout placeholder lstStyle →\n * master placeholder lstStyle + master txStyles → theme fontScheme.\n *\n * Each property (font, size, color, bold, italic, underline) is\n * resolved independently: the innermost layer that supplies a value\n * wins for that one property.\n *\n * Returns a non-null `TextFormat`; fields the cascade couldn't\n * resolve are simply absent (the renderer falls back to placeholder\n * defaults).\n *\n * Use `getShapeRunFormat` if you only want the literal `<a:rPr>` on\n * the run without inheritance.\n */\nconst NAME_TX_BODY = qname('p', 'txBody', NS.pml);\n\nexport const getShapeRunFormatEffective = (\n pres: PresentationData,\n shape: SlideShapeData,\n paragraphIndex: number,\n runIndex: number,\n): TextFormat => {\n const paragraph = requireParagraph(shape, paragraphIndex);\n const run = requireRun(shape, paragraphIndex, runIndex);\n const result: Partial<TextFormat> = {};\n\n // Theme is consulted (a) at each layer to resolve scheme tokens and\n // color transforms eagerly, so the cascade can pick the innermost layer\n // that produces a concrete color, and (b) for typeface fallback at\n // layer 7. Reading once up-front keeps the per-layer cost flat.\n const theme = getPresentationTheme(pres);\n const ctx = { theme } as const;\n\n // Paragraph level (0..8). `<a:pPr lvl=\"..\">`; absent = 0.\n const pPr = firstChildElement(paragraph, NAME_A_PPR);\n let level = 0;\n if (pPr) {\n const lvlAttr = getAttrValue(pPr, ATTR_LVL);\n if (lvlAttr !== null) {\n const parsed = Number.parseInt(lvlAttr, 10);\n if (Number.isFinite(parsed)) level = parsed;\n }\n }\n\n // 1. Run's own rPr.\n const runRPr = firstChildElement(run, NAME_A_RPR);\n if (runRPr) mergeRPrLayer(result, parseRPrLikeElement(runRPr, ctx));\n\n // 2. endParaRPr — applies to the last run in the paragraph per the spec.\n const runs = runsOf(paragraph);\n if (runs.length > 0 && runs[runs.length - 1] === run) {\n const endRPr = firstChildElement(paragraph, NAME_A_END_PARA_RPR);\n if (endRPr) mergeRPrLayer(result, parseRPrLikeElement(endRPr, ctx));\n }\n\n // 3. Paragraph-level defaults (pPr/defRPr).\n if (pPr) {\n const defRPr = firstChildElement(pPr, NAME_A_DEF_RPR);\n if (defRPr) mergeRPrLayer(result, parseRPrLikeElement(defRPr, ctx));\n }\n\n // 4. Text-body lstStyle at the paragraph's level.\n const shapeLstStyle = findShapeLstStyleElement(shape);\n const shapeLvlDef = lstStyleLevelDefRPr(shapeLstStyle, level);\n if (shapeLvlDef) mergeRPrLayer(result, parseRPrLikeElement(shapeLvlDef, ctx));\n\n const phIdx = getShapePlaceholderIdx(shape);\n const phType = getShapePlaceholderType(shape);\n const isPlaceholder = shapeIsPlaceholder(shape);\n\n const slide = shape[SHAPE_SLIDE];\n const layout = getSlideLayout(slide);\n\n // Steps 5-6 are placeholder inheritance: skip them entirely for non-\n // placeholder shapes (plain text boxes), which do not read the master's\n // txStyles. Without this guard an unsized text-box run wrongly inherits the\n // master body size (e.g. 32pt) instead of the ~18pt text-box default.\n if (layout && isPlaceholder) {\n // 5. Matching placeholder on the layout — both its inline rPr-bearing\n // paragraph children (if the layout authored prompt text) and its\n // own lstStyle.\n const layoutPh = findPlaceholderShapeIn(layout[LAYOUT_PART].shapes, phIdx, phType);\n if (layoutPh) {\n const layoutLst = extractPlaceholderLstStyle(layoutPh.element);\n const layoutLvlDef = lstStyleLevelDefRPr(layoutLst, level);\n if (layoutLvlDef) mergeRPrLayer(result, parseRPrLikeElement(layoutLvlDef, ctx));\n }\n\n // 6. Walk one rel up to the slide master.\n const pkg = pres[INTERNAL_PACKAGE];\n const layoutPartName = partName(layout[LAYOUT_PART_NAME]);\n const layoutRels = pkg.getRels(layoutPartName);\n if (layoutRels) {\n const masterRel = layoutRels.items.find((r) => r.type === REL_TYPES.slideMaster);\n if (masterRel) {\n const masterPart = pkg.getPart(resolveTarget(layoutPartName, masterRel.target));\n if (masterPart) {\n const masterRoot = parseXml(decode(masterPart.data)).root;\n const { shapes: masterShapes } = readShapeTreeFromCsldRoot(masterRoot, 'sldMaster');\n const masterPh = findPlaceholderShapeIn(masterShapes, phIdx, phType);\n if (masterPh) {\n const masterLst = extractPlaceholderLstStyle(masterPh.element);\n const masterLvlDef = lstStyleLevelDefRPr(masterLst, level);\n if (masterLvlDef) mergeRPrLayer(result, parseRPrLikeElement(masterLvlDef, ctx));\n }\n // Master text-style defaults (title / body / other).\n const txStyle = masterTxStyleFor(masterRoot, phType);\n const txLvlDef = lstStyleLevelDefRPr(txStyle, level);\n if (txLvlDef) mergeRPrLayer(result, parseRPrLikeElement(txLvlDef, ctx));\n }\n }\n }\n }\n\n // 7. Theme fontScheme — typeface resolution.\n //\n // The master often writes its `<a:latin typeface=\"+mj-lt\"/>` /\n // `+mn-lt` placeholder tokens instead of a concrete face. Those\n // tokens must be resolved against the theme to produce a real\n // typeface; otherwise renderers see literal `+mj-lt` and fall\n // back to a generic font.\n //\n // When no layer in the cascade supplied a font at all, pick the\n // major font for title-class placeholders and the minor font for\n // everything else, matching PowerPoint's defaults.\n const fonts = getPresentationFonts(pres);\n if (fonts) {\n const resolveThemeToken = (token: string): string | undefined => {\n switch (token) {\n case '+mj-lt':\n return fonts.majorLatin ?? undefined;\n case '+mn-lt':\n return fonts.minorLatin ?? undefined;\n case '+mj-ea':\n return fonts.majorEastAsian ?? undefined;\n case '+mn-ea':\n return fonts.minorEastAsian ?? undefined;\n case '+mj-cs':\n return fonts.majorComplexScript ?? undefined;\n case '+mn-cs':\n return fonts.minorComplexScript ?? undefined;\n default:\n return undefined;\n }\n };\n if (typeof result.font === 'string' && result.font.startsWith('+')) {\n const resolved = resolveThemeToken(result.font);\n if (resolved) result.font = resolved;\n }\n if (result.font === undefined) {\n const useMajor = phType === 'title' || phType === 'ctrTitle';\n const fallback = useMajor ? fonts.majorLatin : fonts.minorLatin;\n if (fallback) result.font = fallback;\n }\n if (typeof result.fontEastAsian === 'string' && result.fontEastAsian.startsWith('+')) {\n const resolved = resolveThemeToken(result.fontEastAsian);\n if (resolved) result.fontEastAsian = resolved;\n }\n if (result.fontEastAsian === undefined) {\n const useMajor = phType === 'title' || phType === 'ctrTitle';\n const fallback = useMajor ? fonts.majorEastAsian : fonts.minorEastAsian;\n if (fallback) result.fontEastAsian = fallback;\n }\n }\n\n return result as TextFormat;\n};\n\n// -- Effective pPr cascade --------------------------------------------------\n//\n// Mirror of the rPr cascade for paragraph-level properties: alignment,\n// indents, line spacing, paragraph spacing, rtl. Walks the same layers:\n//\n// 1. The paragraph's own `<a:pPr>`\n// 2. The text body's `<a:lstStyle><a:lvl{N+1}pPr>` (paragraph defaults)\n// 3. The matching layout placeholder's lstStyle\n// 4. The matching master placeholder's lstStyle, then\n// `<p:txStyles>/{title|body|other}Style/<a:lvl{N+1}pPr>`\n//\n// Each property merges independently — innermost layer that supplies a\n// value wins for that one property.\n\n/** Effective paragraph properties returned by `getParagraphPropertiesEffective`. */\nexport interface ParagraphProperties {\n /** Horizontal alignment per `ParagraphAlignment`. */\n align: ParagraphAlignment | null;\n /** Outline level (0..8). 0 = top-level paragraph. */\n level: number;\n /** Left indent in EMU. */\n marL: number | null;\n /** Right indent in EMU. */\n marR: number | null;\n /** First-line indent in EMU; negative for hanging indents. */\n indent: number | null;\n /** Line spacing — either a percent multiplier or a fixed point value. */\n lineSpacing:\n | { readonly kind: 'pct'; readonly value: number }\n | { readonly kind: 'pts'; readonly value: number }\n | null;\n /** Space before the paragraph in points. */\n spcBefPts: number | null;\n /** Space after the paragraph in points. */\n spcAftPts: number | null;\n /** Right-to-left paragraph (`<a:pPr rtl=\"1\"/>`). */\n rtl: boolean | null;\n /**\n * Bullet resolved through the cascade (`<a:buChar>` / `<a:buAutoNum>` /\n * `<a:buNone>`). Master `bodyStyle` levels author the PowerPoint default\n * \"•\", so body placeholders get their bullet from here even when no\n * slide-level `<a:pPr>` carries one.\n */\n bullet: BulletStyle | null;\n}\n\n/**\n * Maps an OOXML `algn` token to the friendly `ParagraphAlignment` form the\n * rest of the API speaks. Exported so the table-cell reader normalises the\n * same way the shape-text cascade does.\n *\n * @internal\n */\nexport const ALIGN_TOKEN_MAP: Record<string, ParagraphProperties['align']> = {\n l: 'left',\n ctr: 'center',\n r: 'right',\n just: 'justify',\n justLow: 'justify',\n dist: 'distribute',\n thaiDist: 'distribute',\n};\n\nconst parsePPrLikeElement = (pPr: XmlElement): Partial<ParagraphProperties> => {\n const out: Partial<ParagraphProperties> = {};\n const algn = getAttrValue(pPr, qname('', 'algn', ''));\n if (algn !== null && ALIGN_TOKEN_MAP[algn] !== undefined) out.align = ALIGN_TOKEN_MAP[algn];\n const marL = getAttrValue(pPr, qname('', 'marL', ''));\n if (marL !== null) {\n const n = Number.parseInt(marL, 10);\n if (Number.isFinite(n)) out.marL = n;\n }\n const marR = getAttrValue(pPr, qname('', 'marR', ''));\n if (marR !== null) {\n const n = Number.parseInt(marR, 10);\n if (Number.isFinite(n)) out.marR = n;\n }\n const indent = getAttrValue(pPr, qname('', 'indent', ''));\n if (indent !== null) {\n const n = Number.parseInt(indent, 10);\n if (Number.isFinite(n)) out.indent = n;\n }\n const rtl = getAttrValue(pPr, qname('', 'rtl', ''));\n if (rtl !== null) out.rtl = rtl === '1' || rtl === 'true';\n const lnSpc = firstChildElement(pPr, qname('a', 'lnSpc', NS.dml));\n if (lnSpc) {\n const pct = firstChildElement(lnSpc, qname('a', 'spcPct', NS.dml));\n if (pct) {\n const v = getAttrValue(pct, qname('', 'val', ''));\n if (v !== null) {\n let n = Number.parseFloat(v);\n if (Number.isFinite(n)) {\n if (Math.abs(n) > 1) n = n / 100000;\n out.lineSpacing = { kind: 'pct', value: n };\n }\n }\n } else {\n const pts = firstChildElement(lnSpc, qname('a', 'spcPts', NS.dml));\n if (pts) {\n const v = getAttrValue(pts, qname('', 'val', ''));\n if (v !== null) {\n const n = Number.parseInt(v, 10);\n if (Number.isFinite(n)) out.lineSpacing = { kind: 'pts', value: n / 100 };\n }\n }\n }\n }\n const readSpcSide = (local: 'spcBef' | 'spcAft'): number | null => {\n const side = firstChildElement(pPr, qname('a', local, NS.dml));\n if (!side) return null;\n const pts = firstChildElement(side, qname('a', 'spcPts', NS.dml));\n if (!pts) return null;\n const v = getAttrValue(pts, qname('', 'val', ''));\n if (v === null) return null;\n const n = Number.parseInt(v, 10);\n return Number.isFinite(n) ? n / 100 : null;\n };\n const before = readSpcSide('spcBef');\n if (before !== null) out.spcBefPts = before;\n const after = readSpcSide('spcAft');\n if (after !== null) out.spcAftPts = after;\n // Bullet: buNone / buChar / buAutoNum are mutually exclusive children.\n // Normalisation mirrors getParagraphBullet so both readers speak the same\n // BulletStyle vocabulary.\n for (const c of pPr.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n if (c.name.localName === 'buNone') {\n out.bullet = 'none';\n } else if (c.name.localName === 'buChar') {\n const char = getAttrValue(c, qname('', 'char', ''));\n if (char === '•') out.bullet = 'bullet';\n else if (char !== null) out.bullet = { char };\n } else if (c.name.localName === 'buAutoNum') {\n const t = getAttrValue(c, qname('', 'type', ''));\n if (t === 'arabicPeriod') out.bullet = 'number';\n else if (t !== null) out.bullet = { autoNum: t };\n }\n }\n return out;\n};\n\nconst mergePPrLayer = (\n base: Partial<ParagraphProperties>,\n layer: Partial<ParagraphProperties>,\n): void => {\n if (base.align === undefined && layer.align !== undefined) base.align = layer.align;\n if (base.marL === undefined && layer.marL !== undefined) base.marL = layer.marL;\n if (base.marR === undefined && layer.marR !== undefined) base.marR = layer.marR;\n if (base.indent === undefined && layer.indent !== undefined) base.indent = layer.indent;\n if (base.rtl === undefined && layer.rtl !== undefined) base.rtl = layer.rtl;\n if (base.lineSpacing === undefined && layer.lineSpacing !== undefined) {\n base.lineSpacing = layer.lineSpacing;\n }\n if (base.spcBefPts === undefined && layer.spcBefPts !== undefined) {\n base.spcBefPts = layer.spcBefPts;\n }\n if (base.spcAftPts === undefined && layer.spcAftPts !== undefined) {\n base.spcAftPts = layer.spcAftPts;\n }\n if (base.bullet === undefined && layer.bullet !== undefined) base.bullet = layer.bullet;\n};\n\n/**\n * Resolves a paragraph's effective properties by walking the same\n * inheritance chain `getShapeRunFormatEffective` uses, but for the\n * paragraph-level surface:\n *\n * - alignment, indent (left / right / first-line), line spacing,\n * paragraph spacing (before / after), rtl.\n *\n * Each property is resolved independently; the innermost layer that\n * sets it wins. Fields the cascade can't resolve come through as `null`\n * so renderers know to fall back to their own defaults.\n *\n * Companion to `getParagraphAlignment` / `getParagraphLineSpacing` /\n * `getParagraphIndent` / `getParagraphSpacing`, which only surface the\n * literal `<a:pPr>` and skip the layout / master cascade.\n */\nexport const getParagraphPropertiesEffective = (\n pres: PresentationData,\n shape: SlideShapeData,\n paragraphIndex: number,\n): ParagraphProperties => {\n const paragraph = requireParagraph(shape, paragraphIndex);\n const pPr = firstChildElement(paragraph, NAME_A_PPR);\n\n let level = 0;\n if (pPr) {\n const lvlAttr = getAttrValue(pPr, ATTR_LVL);\n if (lvlAttr !== null) {\n const parsed = Number.parseInt(lvlAttr, 10);\n if (Number.isFinite(parsed)) level = parsed;\n }\n }\n\n const result: Partial<ParagraphProperties> = {};\n\n // 1. Paragraph's own pPr.\n if (pPr) mergePPrLayer(result, parsePPrLikeElement(pPr));\n\n // 2. Text-body lstStyle at the paragraph's level.\n const shapeLstStyle = findShapeLstStyleElement(shape);\n const shapeLvlPPr = lstStyleLevelPPr(shapeLstStyle, level);\n if (shapeLvlPPr) mergePPrLayer(result, parsePPrLikeElement(shapeLvlPPr));\n\n const phIdx = getShapePlaceholderIdx(shape);\n const phType = getShapePlaceholderType(shape);\n const isPlaceholder = shapeIsPlaceholder(shape);\n const slide = shape[SHAPE_SLIDE];\n const layout = getSlideLayout(slide);\n\n // Placeholder inheritance only: a plain text box does not read the master's\n // txStyles for paragraph defaults (align / indent / spacing) either.\n if (layout && isPlaceholder) {\n // 3. Layout placeholder lstStyle.\n const layoutPh = findPlaceholderShapeIn(layout[LAYOUT_PART].shapes, phIdx, phType);\n if (layoutPh) {\n const layoutLst = extractPlaceholderLstStyle(layoutPh.element);\n const layoutLvlPPr = lstStyleLevelPPr(layoutLst, level);\n if (layoutLvlPPr) mergePPrLayer(result, parsePPrLikeElement(layoutLvlPPr));\n }\n\n // 4. Master placeholder lstStyle + master txStyles.\n const pkg = pres[INTERNAL_PACKAGE];\n const layoutPartName = partName(layout[LAYOUT_PART_NAME]);\n const layoutRels = pkg.getRels(layoutPartName);\n if (layoutRels) {\n const masterRel = layoutRels.items.find((r) => r.type === REL_TYPES.slideMaster);\n if (masterRel) {\n const masterPart = pkg.getPart(resolveTarget(layoutPartName, masterRel.target));\n if (masterPart) {\n const masterRoot = parseXml(decode(masterPart.data)).root;\n const { shapes: masterShapes } = readShapeTreeFromCsldRoot(masterRoot, 'sldMaster');\n const masterPh = findPlaceholderShapeIn(masterShapes, phIdx, phType);\n if (masterPh) {\n const masterLst = extractPlaceholderLstStyle(masterPh.element);\n const masterLvlPPr = lstStyleLevelPPr(masterLst, level);\n if (masterLvlPPr) mergePPrLayer(result, parsePPrLikeElement(masterLvlPPr));\n }\n const txStyle = masterTxStyleFor(masterRoot, phType);\n const txLvlPPr = lstStyleLevelPPr(txStyle, level);\n if (txLvlPPr) mergePPrLayer(result, parsePPrLikeElement(txLvlPPr));\n }\n }\n }\n }\n\n return {\n align: result.align ?? null,\n level,\n marL: result.marL ?? null,\n marR: result.marR ?? null,\n indent: result.indent ?? null,\n lineSpacing: result.lineSpacing ?? null,\n spcBefPts: result.spcBefPts ?? null,\n spcAftPts: result.spcAftPts ?? null,\n rtl: result.rtl ?? null,\n bullet: result.bullet ?? null,\n };\n};\n\n/**\n * Applies `format` to a single run. Run-property attributes not\n * addressed by `format` are preserved — partial updates compose.\n *\n * Example: bold the second word of the first paragraph:\n *\n * setShapeRunFormat(shape, 0, 1, { bold: true, color: '#FF0000' });\n */\nexport const setShapeRunFormat = (\n shape: SlideShapeData,\n paragraphIndex: number,\n runIndex: number,\n format: TextFormat,\n): void => {\n const run = requireRun(shape, paragraphIndex, runIndex);\n const rPr = ensureRPr(run);\n applyRunFormatInternal(rPr, format);\n commitAndRefresh(shape);\n};\n\n/**\n * Reads the external URL the first run in the shape's text-body links\n * to (set via `setShapeHyperlink`). Returns `null` when no run carries\n * an `<a:hlinkClick r:id=…/>` or the rId resolves to a non-hyperlink\n * target.\n */\nexport const getShapeHyperlink = (shape: SlideShapeData): string | null => {\n if (shape[SHAPE_SNAPSHOT].kind !== 'shape') return null;\n const txBody = firstChildElement(shape[SHAPE_ELEMENT], NAME_TX_BODY);\n if (!txBody) return null;\n for (const p of txBody.children) {\n if (p.kind !== 'element' || p.name.namespaceURI !== NS.dml || p.name.localName !== 'p')\n continue;\n for (const r of p.children) {\n if (r.kind !== 'element' || r.name.namespaceURI !== NS.dml || r.name.localName !== 'r')\n continue;\n const rPr = firstChildElement(r, qname('a', 'rPr', NS.dml));\n if (!rPr) continue;\n const hlink = firstChildElement(rPr, qname('a', 'hlinkClick', NS.dml));\n if (!hlink) continue;\n const rId = getAttrValue(hlink, qname('r', 'id', NS.officeDocRels));\n if (!rId) continue;\n const slide = shape[SHAPE_SLIDE];\n const rels = slide[INTERNAL_PACKAGE].getRels(slide[SLIDE_PART_NAME]);\n if (!rels) continue;\n const rel = rels.items.find((x) => x.id === rId);\n if (rel?.type === REL_TYPES.hyperlink && rel.targetMode === 'External') {\n return rel.target;\n }\n }\n }\n return null;\n};\n\n/**\n * Sets an external hyperlink on every run in the shape's text. Allocates\n * (or reuses) a `hyperlink` relationship on the slide's `.rels`. Pass\n * `null` to clear.\n */\nexport const setShapeHyperlink = (\n shape: SlideShapeData,\n url: string | null,\n tooltip?: string,\n): void => {\n const slide = shape[SHAPE_SLIDE];\n const txBody = requireTxBody(shape);\n if (url === null) {\n applyHyperlinkToAllRuns(txBody, null);\n } else {\n const pkg = slide[INTERNAL_PACKAGE];\n const rels = pkg.getRels(slide[SLIDE_PART_NAME]) ?? emptyRels();\n const existing = rels.items.find(\n (r) => r.type === REL_TYPES.hyperlink && r.target === url && r.targetMode === 'External',\n );\n const rId =\n existing?.id ??\n (() => {\n const nextId = nextRelId(rels.items.map((r) => r.id));\n rels.items.push({\n id: nextId,\n type: REL_TYPES.hyperlink,\n target: url,\n targetMode: 'External',\n });\n pkg.setRels(slide[SLIDE_PART_NAME], rels);\n return nextId;\n })();\n applyHyperlinkToAllRuns(txBody, rId, tooltip);\n }\n commitAndRefresh(shape);\n};\n","// Slide layouts.\n\nimport { readPosition, readSize } from '../../internal/drawingml/index.ts';\nimport type { Emu } from '../units.ts';\nimport { type SlideLayoutType, readSlideLayoutPart } from '../../internal/presentationml/index.ts';\nimport { parseXml } from '../../internal/xml/index.ts';\nimport {\n INTERNAL_PACKAGE,\n LAYOUT_PART,\n LAYOUT_PART_NAME,\n type PresentationData,\n type SlideLayoutData,\n} from '../_internal-symbols.ts';\nimport { SLIDE_LAYOUT_CONTENT_TYPE, decode } from './_helpers.ts';\nimport { getSlideLayout } from './shape-slide-read.ts';\nimport type { ShapeBounds } from './shapes.ts';\nimport { getSlides } from './slide-query.ts';\n\n// ---------------------------------------------------------------------------\n// Slide layouts.\n\n/** PowerPoint's user-visible layout name. */\nexport const getSlideLayoutName = (layout: SlideLayoutData): string => layout[LAYOUT_PART].name;\n\n/**\n * Returns the package part name (e.g. `/ppt/slideLayouts/slideLayout3.xml`)\n * of `layout`. Useful for surfacing layouts in validator output and\n * other path-keyed UIs.\n */\nexport const getSlideLayoutPartName = (layout: SlideLayoutData): string => layout[LAYOUT_PART_NAME];\n\n/**\n * Returns the slide layout whose package part name equals\n * `partName`, or `null` when no such layout exists. Mirror of\n * `findSlideByPartName` for layouts.\n */\nexport const findSlideLayoutByPartName = (\n pres: PresentationData,\n partName: string,\n): SlideLayoutData | null => {\n for (const layout of getSlideLayouts(pres)) {\n if (layout[LAYOUT_PART_NAME] === partName) return layout;\n }\n return null;\n};\n\n/**\n * Read-only view of one placeholder on a slide layout. Surfaces the\n * three fields a slide-author cares about when binding a slide to a\n * layout: which slot is for the title, which is for the body, etc.\n */\nexport interface SlideLayoutPlaceholder {\n /** `<p:ph type=\"...\">`. `null` when omitted — spec default is `body`. */\n readonly type: string | null;\n /** `<p:ph idx=\"...\">`. `null` when omitted — spec default is `0`. */\n readonly idx: number | null;\n /** `<p:cNvPr name=\"...\">` — what PowerPoint shows in the selection pane. */\n readonly name: string;\n /**\n * Layout-defined position + size in EMU. A slide placeholder with no\n * `<a:xfrm>` of its own inherits these. `null` when the layout\n * placeholder also lacks an explicit transform (rare — usually the\n * master defines it then).\n */\n readonly bounds: ShapeBounds | null;\n}\n\n/**\n * Enumerates the placeholder shapes on a slide layout. Non-placeholder\n * shapes (decorative rectangles, watermarks added to the layout) are\n * filtered out; only entries with a `<p:ph>` element are returned.\n *\n * Use this when you need to discover which placeholder indices a\n * layout exposes — e.g. before `findSlidePlaceholder(slide, ...)` to\n * confirm the slot exists.\n */\nexport const getSlideLayoutPlaceholders = (\n layout: SlideLayoutData,\n): ReadonlyArray<SlideLayoutPlaceholder> => {\n const out: SlideLayoutPlaceholder[] = [];\n for (const shape of layout[LAYOUT_PART].shapes) {\n // Only `p:sp` shapes carry placeholders in real templates; pictures\n // and connectors can technically have `<p:ph>` per the schema but\n // PowerPoint never authors that. Filter for safety either way.\n if (shape.placeholderType === null && shape.placeholderIdx === null) continue;\n const pos = readPosition(shape.element, shape.kind);\n const size = readSize(shape.element, shape.kind);\n const bounds: ShapeBounds | null =\n pos === null || size === null\n ? null\n : { x: pos.x as Emu, y: pos.y as Emu, w: size.w as Emu, h: size.h as Emu };\n out.push({\n type: shape.placeholderType,\n idx: shape.placeholderIdx,\n name: shape.name,\n bounds,\n });\n }\n return out;\n};\n\n/**\n * Finds the first slide layout whose user-visible name matches `name`,\n * or `null` if none does. Accepts a literal string (exact equality)\n * or a `RegExp` for pattern matches — useful when template providers\n * suffix versions onto names (`'Title and Content v2'`).\n *\n * String matching is **case-sensitive** and exact: `findSlideLayout(pres,\n * 'Blank')` matches a layout named `\"Blank\"` but not `\"blank\"`. The\n * user-visible name is also locale-dependent (a deck authored in a\n * non-English PowerPoint localizes `\"Blank\"`), so prefer\n * {@link findSlideLayoutByType} — which matches the locale-stable\n * `<p:sldLayout type=\"…\">` token (`'blank'`, `'title'`, `'obj'`, …) —\n * when you need a robust lookup. Pass a `RegExp` with the `i` flag here\n * for a case-insensitive name match.\n */\nexport const findSlideLayout = (\n pres: PresentationData,\n name: string | RegExp,\n): SlideLayoutData | null => {\n for (const layout of getSlideLayouts(pres)) {\n const n = layout[LAYOUT_PART].name;\n const hit = typeof name === 'string' ? n === name : name.test(n);\n if (hit) return layout;\n }\n return null;\n};\n\n/**\n * Returns every slide layout in the package that exposes a\n * placeholder of the given type token (`'title'`, `'body'`,\n * `'ftr'`, etc.). Useful for \"find every layout that can host a\n * body\" lookups before `addSlide`.\n */\nexport const findLayoutsWithPlaceholderType = (\n pres: PresentationData,\n type: string,\n): ReadonlyArray<SlideLayoutData> => {\n const out: SlideLayoutData[] = [];\n for (const layout of getSlideLayouts(pres)) {\n const phs = getSlideLayoutPlaceholders(layout);\n const hit = phs.some(\n (p) => p.type === type || (type === 'body' && p.type === null && p.idx !== null),\n );\n if (hit) out.push(layout);\n }\n return out;\n};\n\n/**\n * Finds the first slide layout with the given `<p:sldLayout type=\"...\">`\n * token. Unlike `findSlideLayout` (which matches the user-visible\n * name, and is therefore locale-sensitive), this matches the spec\n * token — `title`, `obj`, `twoObj`, `blank`, etc. — and is stable\n * across PowerPoint UI languages.\n */\nexport const findSlideLayoutByType = (\n pres: PresentationData,\n layoutType: SlideLayoutType | string,\n): SlideLayoutData | null => {\n for (const layout of getSlideLayouts(pres)) {\n if (layout[LAYOUT_PART].layoutType === layoutType) return layout;\n }\n return null;\n};\n\n/**\n * Layout type token, when present (`title`, `obj`, `twoObj`, ...).\n * `null` when omitted — the spec default for that case is `cust`.\n */\nexport const getSlideLayoutType = (layout: SlideLayoutData): SlideLayoutType | string | null =>\n layout[LAYOUT_PART].layoutType;\n\n/**\n * Enumerates every slide layout in the package.\n */\nexport const getSlideLayouts = (pres: PresentationData): ReadonlyArray<SlideLayoutData> => {\n const pkg = pres[INTERNAL_PACKAGE];\n const out: SlideLayoutData[] = [];\n for (const part of pkg.parts) {\n if (part.contentType !== SLIDE_LAYOUT_CONTENT_TYPE) continue;\n const root = parseXml(decode(part.data)).root;\n out.push({\n [LAYOUT_PART_NAME]: part.name,\n [LAYOUT_PART]: readSlideLayoutPart(root),\n });\n }\n return out;\n};\n\n/**\n * Layouts in the package that no slide references. Useful when\n * trimming a template deck — these layouts contribute parts and rels\n * without ever rendering. Iteration order matches `getSlideLayouts`.\n */\nexport const getUnusedSlideLayouts = (pres: PresentationData): ReadonlyArray<SlideLayoutData> => {\n const referenced = new Set<string>();\n for (const slide of getSlides(pres)) {\n const layout = getSlideLayout(slide);\n if (layout !== null) referenced.add(getSlideLayoutName(layout));\n }\n return getSlideLayouts(pres).filter((l) => !referenced.has(getSlideLayoutName(l)));\n};\n\n/**\n * Returns a map of layout name → number of slides that reference it.\n * Every layout enumerated by `getSlideLayouts` appears as a key (zero\n * count for unreferenced layouts), so this surfaces unused layouts\n * directly — e.g. for templates that ship with placeholder layouts the\n * deck never picks up.\n */\n/**\n * Histogram of slide-layout type token (e.g. `title`, `obj`, `twoObj`,\n * `blank`) → number of slides that use a layout of that type. Useful\n * for \"how many content slides vs. dividers vs. title slides?\" audits\n * — keyed on the OOXML enum, so stable across locales (unlike\n * `getSlideLayoutUsageCounts`, which keys on the user-visible name).\n * Layouts with no `type` token are skipped (the spec default is\n * `cust`).\n */\nexport const getSlideLayoutUsageCountsByType = (\n pres: PresentationData,\n): Readonly<Record<string, number>> => {\n const counts: Record<string, number> = {};\n for (const slide of getSlides(pres)) {\n const layout = getSlideLayout(slide);\n if (layout === null) continue;\n const t = layout[LAYOUT_PART].layoutType;\n if (t === null) continue;\n counts[t] = (counts[t] ?? 0) + 1;\n }\n return counts;\n};\n\nexport const getSlideLayoutUsageCounts = (\n pres: PresentationData,\n): Readonly<Record<string, number>> => {\n const counts: Record<string, number> = {};\n for (const layout of getSlideLayouts(pres)) {\n counts[getSlideLayoutName(layout)] = 0;\n }\n for (const slide of getSlides(pres)) {\n const layout = getSlideLayout(slide);\n if (layout === null) continue;\n const name = getSlideLayoutName(layout);\n counts[name] = (counts[name] ?? 0) + 1;\n }\n return counts;\n};\n","// Core properties and extended properties.\n\nimport { emptyRels, nextRelId, partName } from '../../internal/opc/index.ts';\nimport { REL_TYPES } from '../../internal/presentationml/index.ts';\nimport {\n type XmlElement,\n elem,\n firstChildElement,\n parseXml,\n qname,\n serializeXml,\n text as textNode,\n} from '../../internal/xml/index.ts';\nimport { INTERNAL_PACKAGE, type PresentationData } from '../_internal-symbols.ts';\nimport { decode, encode } from './_helpers.ts';\n\n// ---------------------------------------------------------------------------\n// Core properties (`/docProps/core.xml`).\n\nconst NS_CORE_PROPS = 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties';\nconst NS_DC = 'http://purl.org/dc/elements/1.1/';\nconst NS_DCTERMS = 'http://purl.org/dc/terms/';\nconst CORE_PROPS_PART_NAME = partName('/docProps/core.xml');\n\n/**\n * Document-level metadata from `/docProps/core.xml` (Open Packaging\n * Conventions). Surfaces the fields PowerPoint, Keynote, and\n * everyone else exchange via OPC core-properties — these are the\n * values shown in PowerPoint's \"File › Properties\" / \"Info\" panel.\n */\nexport interface CoreProperties {\n readonly title: string | null;\n readonly subject: string | null;\n readonly creator: string | null;\n readonly keywords: string | null;\n readonly description: string | null;\n readonly lastModifiedBy: string | null;\n readonly revision: string | null;\n /** ISO-8601 timestamp string when set; `null` otherwise. */\n readonly created: string | null;\n /** ISO-8601 timestamp string when set; `null` otherwise. */\n readonly modified: string | null;\n readonly category: string | null;\n}\n\n/**\n * Reads `/docProps/core.xml`. Returns `null` when the package has\n * no core-properties part. Each field is `null` when the\n * corresponding element is absent or empty.\n */\n/**\n * Convenience: bumps core-properties' `cp:revision` by one (treating\n * an unset / unparseable value as 0). Returns the new revision\n * number. Useful right before `savePresentation` so consumers can\n * tell decks apart.\n */\nexport const incrementRevision = (pres: PresentationData): number => {\n const props = getCoreProperties(pres);\n const current =\n props?.revision === null || props?.revision === undefined\n ? 0\n : Number.parseInt(props.revision, 10);\n const next = (Number.isFinite(current) ? current : 0) + 1;\n setCoreProperties(pres, { revision: String(next) });\n return next;\n};\n\n/**\n * Convenience: writes `new Date().toISOString()` to\n * `dcterms:modified`. Useful right before `savePresentation` so\n * \"last edited\" shows the actual save time. Pass an explicit\n * `Date` to set a specific value.\n */\nexport const touchModified = (pres: PresentationData, at: Date = new Date()): void => {\n setCoreProperties(pres, { modified: at.toISOString() });\n};\n\n/**\n * Convenience: the timestamp from core-properties' `dcterms:created`,\n * parsed as a `Date`. Returns `null` when no created field is set\n * or the value isn't a recognizable W3C-DTF / ISO-8601 string.\n */\nexport const getPresentationCreated = (pres: PresentationData): Date | null => {\n const props = getCoreProperties(pres);\n if (!props || props.created === null) return null;\n const d = new Date(props.created);\n return Number.isFinite(d.getTime()) ? d : null;\n};\n\n/**\n * Convenience: the timestamp from core-properties' `dcterms:modified`,\n * parsed as a `Date`. Returns `null` when no modified field is set\n * or the value isn't a recognizable W3C-DTF / ISO-8601 string.\n */\nexport const getPresentationModified = (pres: PresentationData): Date | null => {\n const props = getCoreProperties(pres);\n if (!props || props.modified === null) return null;\n const d = new Date(props.modified);\n return Number.isFinite(d.getTime()) ? d : null;\n};\n\nexport const getCoreProperties = (pres: PresentationData): CoreProperties | null => {\n const pkg = pres[INTERNAL_PACKAGE];\n const part = pkg.getPart(CORE_PROPS_PART_NAME);\n if (!part) return null;\n const root = parseXml(decode(part.data)).root;\n const read = (uri: string, local: string): string | null => {\n const el = firstChildElement(root, qname('', local, uri));\n if (!el) return null;\n let s = '';\n for (const c of el.children) if (c.kind === 'text') s += c.data;\n return s.length === 0 ? null : s;\n };\n return {\n title: read(NS_DC, 'title'),\n subject: read(NS_DC, 'subject'),\n creator: read(NS_DC, 'creator'),\n keywords: read(NS_CORE_PROPS, 'keywords'),\n description: read(NS_DC, 'description'),\n lastModifiedBy: read(NS_CORE_PROPS, 'lastModifiedBy'),\n revision: read(NS_CORE_PROPS, 'revision'),\n created: read(NS_DCTERMS, 'created'),\n modified: read(NS_DCTERMS, 'modified'),\n category: read(NS_CORE_PROPS, 'category'),\n };\n};\n\nconst CORE_PROPS_CONTENT_TYPE = 'application/vnd.openxmlformats-package.core-properties+xml';\n\nconst CORE_PROP_FIELDS: ReadonlyArray<{\n key: keyof CoreProperties;\n uri: string;\n prefix: string;\n local: string;\n}> = [\n { key: 'title', uri: NS_DC, prefix: 'dc', local: 'title' },\n { key: 'subject', uri: NS_DC, prefix: 'dc', local: 'subject' },\n { key: 'creator', uri: NS_DC, prefix: 'dc', local: 'creator' },\n { key: 'keywords', uri: NS_CORE_PROPS, prefix: 'cp', local: 'keywords' },\n { key: 'description', uri: NS_DC, prefix: 'dc', local: 'description' },\n { key: 'lastModifiedBy', uri: NS_CORE_PROPS, prefix: 'cp', local: 'lastModifiedBy' },\n { key: 'revision', uri: NS_CORE_PROPS, prefix: 'cp', local: 'revision' },\n { key: 'created', uri: NS_DCTERMS, prefix: 'dcterms', local: 'created' },\n { key: 'modified', uri: NS_DCTERMS, prefix: 'dcterms', local: 'modified' },\n { key: 'category', uri: NS_CORE_PROPS, prefix: 'cp', local: 'category' },\n];\n\nconst buildEmptyCorePropsRoot = (): XmlElement => {\n const prefixDecls = new Map<string, string>([\n ['cp', NS_CORE_PROPS],\n ['dc', NS_DC],\n ['dcterms', NS_DCTERMS],\n ]);\n return {\n kind: 'element',\n name: qname('cp', 'coreProperties', NS_CORE_PROPS),\n attrs: [],\n prefixDecls,\n children: [],\n };\n};\n\n/**\n * Writes selected fields on `/docProps/core.xml`. Unspecified fields\n * are left as-is; pass `null` to clear a field that's currently set.\n * Bootstraps the part (and the `/_rels/.rels` entry + content-type\n * override) if the package didn't have one.\n *\n * Note: setting `created` / `modified` requires an ISO-8601 timestamp\n * string (e.g. `'2026-05-15T12:34:56Z'`). PowerPoint expects the\n * `xsi:type=\"dcterms:W3CDTF\"` attribute on these elements but readers\n * we tested all accept missing-attribute output too; this helper\n * therefore omits the attribute for simplicity.\n */\nexport const setCoreProperties = (\n pres: PresentationData,\n values: Partial<CoreProperties>,\n): void => {\n const pkg = pres[INTERNAL_PACKAGE];\n let part = pkg.getPart(CORE_PROPS_PART_NAME);\n let root: XmlElement;\n let doc: ReturnType<typeof parseXml>;\n if (part) {\n doc = parseXml(decode(part.data));\n root = doc.root;\n } else {\n root = buildEmptyCorePropsRoot();\n doc = { kind: 'document', decl: null, prolog: [], root, epilog: [] };\n }\n\n for (const field of CORE_PROP_FIELDS) {\n if (!(field.key in values)) continue;\n const value = values[field.key] ?? null;\n const name = qname(field.prefix, field.local, field.uri);\n const existing = firstChildElement(root, name);\n if (value === null) {\n if (existing) {\n existing.children = [];\n }\n continue;\n }\n if (existing) {\n existing.children = [textNode(value)];\n } else {\n root.children.push(elem(name, { children: [textNode(value)] }));\n }\n }\n\n const bytes = encode(serializeXml(doc));\n if (part) {\n part.data = bytes;\n return;\n }\n\n // Bootstrap: register override, add part, wire root rel.\n pkg.contentTypes.overrides.push({\n partName: CORE_PROPS_PART_NAME,\n contentType: CORE_PROPS_CONTENT_TYPE,\n });\n pkg.addPart(CORE_PROPS_PART_NAME, CORE_PROPS_CONTENT_TYPE, bytes);\n\n const rootRels = pkg.rootRels() ?? emptyRels();\n const rId = nextRelId(rootRels.items.map((r) => r.id));\n rootRels.items.push({\n id: rId,\n type: REL_TYPES.coreProperties,\n target: 'docProps/core.xml',\n targetMode: 'Internal',\n });\n pkg.setRootRels(rootRels);\n};\n\n// ---------------------------------------------------------------------------\n// Extended properties (`/docProps/app.xml`).\n\nconst NS_EXT_PROPS = 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties';\nconst EXT_PROPS_PART_NAME = partName('/docProps/app.xml');\n\n/**\n * Selected string fields from `/docProps/app.xml`\n * (extended-properties / \"app props\"). PowerPoint exposes these\n * under File › Info / Properties as the \"Origin\" and \"Related\n * People\" groups.\n *\n * Numeric / derived fields (`Slides`, `Words`, `Paragraphs`, …) are\n * intentionally omitted — they're recomputed by PowerPoint on save\n * and reading them tends to lie about decks edited outside Office.\n */\nexport interface ExtendedProperties {\n readonly application: string | null;\n readonly appVersion: string | null;\n readonly company: string | null;\n readonly manager: string | null;\n readonly presentationFormat: string | null;\n readonly hyperlinkBase: string | null;\n}\n\n/**\n * Reads `/docProps/app.xml`. Returns `null` if the package has no\n * extended-properties part. Each field is `null` when the\n * corresponding element is absent or empty.\n */\nexport const getExtendedProperties = (pres: PresentationData): ExtendedProperties | null => {\n const pkg = pres[INTERNAL_PACKAGE];\n const part = pkg.getPart(EXT_PROPS_PART_NAME);\n if (!part) return null;\n const root = parseXml(decode(part.data)).root;\n const read = (local: string): string | null => {\n const el = firstChildElement(root, qname('', local, NS_EXT_PROPS));\n if (!el) return null;\n let s = '';\n for (const c of el.children) if (c.kind === 'text') s += c.data;\n return s.length === 0 ? null : s;\n };\n return {\n application: read('Application'),\n appVersion: read('AppVersion'),\n company: read('Company'),\n manager: read('Manager'),\n presentationFormat: read('PresentationFormat'),\n hyperlinkBase: read('HyperlinkBase'),\n };\n};\n\nconst EXT_PROP_FIELDS: ReadonlyArray<{ key: keyof ExtendedProperties; local: string }> = [\n { key: 'application', local: 'Application' },\n { key: 'appVersion', local: 'AppVersion' },\n { key: 'company', local: 'Company' },\n { key: 'manager', local: 'Manager' },\n { key: 'presentationFormat', local: 'PresentationFormat' },\n { key: 'hyperlinkBase', local: 'HyperlinkBase' },\n];\n\n/**\n * Writes selected fields on `/docProps/app.xml`. Throws when the\n * package has no extended-properties part — unlike core-properties,\n * we don't bootstrap app.xml from scratch because its schema\n * requires several derived `<vt:*>` elements (`HeadingPairs`,\n * `TitlesOfParts`, …) that aren't user-facing.\n *\n * Pass `null` to clear an existing field's text. Unspecified keys\n * are left untouched.\n */\nexport const setExtendedProperties = (\n pres: PresentationData,\n values: Partial<ExtendedProperties>,\n): void => {\n const pkg = pres[INTERNAL_PACKAGE];\n const part = pkg.getPart(EXT_PROPS_PART_NAME);\n if (!part) {\n throw new Error('setExtendedProperties: /docProps/app.xml not present; cannot bootstrap');\n }\n const doc = parseXml(decode(part.data));\n for (const field of EXT_PROP_FIELDS) {\n if (!(field.key in values)) continue;\n const value = values[field.key] ?? null;\n const name = qname('', field.local, NS_EXT_PROPS);\n const existing = firstChildElement(doc.root, name);\n if (value === null) {\n if (existing) existing.children = [];\n continue;\n }\n if (existing) {\n existing.children = [textNode(value)];\n } else {\n doc.root.children.push(elem(name, { children: [textNode(value)] }));\n }\n }\n part.data = encode(serializeXml(doc));\n};\n","// Document thumbnail.\n\nimport {\n type ImageFormat,\n type PartName,\n contentTypeForFormat,\n detectImageFormat,\n emptyRels,\n extensionForFormat,\n nextRelId,\n partName,\n} from '../../internal/opc/index.ts';\nimport type { OpcPackage } from '../../internal/parts/index.ts';\nimport { REL_TYPES } from '../../internal/presentationml/index.ts';\nimport { INTERNAL_PACKAGE, type PresentationData } from '../_internal-symbols.ts';\nimport { setOpcDefault } from './_helpers.ts';\n\n// ---------------------------------------------------------------------------\n// Document thumbnail (`/docProps/thumbnail.jpeg` typically).\n\n/**\n * The package's thumbnail image, when present. PowerPoint, the OS\n * file picker, and SharePoint preview decks via this. Format is\n * what's encoded in the thumbnail part — usually JPEG.\n */\nexport interface PresentationThumbnail {\n readonly format: ImageFormat;\n readonly bytes: Uint8Array;\n}\n\nconst findThumbnailRel = (pkg: OpcPackage): { partName: PartName; rId: string } | null => {\n const rootRels = pkg.rootRels();\n if (!rootRels) return null;\n const rel = rootRels.items.find((r) => r.type === REL_TYPES.thumbnail);\n if (!rel) return null;\n const target = rel.target;\n const name = target.startsWith('/') ? partName(target) : partName(`/${target}`);\n return { partName: name, rId: rel.id };\n};\n\n/**\n * Returns the package's thumbnail bytes, plus the detected image\n * format. Returns `null` when the package has no thumbnail rel or\n * the rel target part is missing.\n *\n * The returned `bytes` is a live view into the thumbnail part —\n * treat it as read-only; copy if you need an independent buffer.\n */\nexport const getThumbnail = (pres: PresentationData): PresentationThumbnail | null => {\n const pkg = pres[INTERNAL_PACKAGE];\n const hit = findThumbnailRel(pkg);\n if (!hit) return null;\n const part = pkg.getPart(hit.partName);\n if (!part) return null;\n const format = detectImageFormat(part.data);\n if (format === null) return null;\n return { format, bytes: part.data };\n};\n\n/**\n * Replaces the package's thumbnail. Auto-detects the image format\n * from the bytes (pass `options.format` to override). Bootstraps the\n * thumbnail part + root rel + content-type default if the package\n * had no thumbnail; otherwise replaces the existing thumbnail in\n * place, switching its filename / extension if the format changed.\n */\nexport const setThumbnail = (\n pres: PresentationData,\n bytes: Uint8Array,\n options: { format?: ImageFormat } = {},\n): void => {\n const format = options.format ?? detectImageFormat(bytes);\n if (format === null) {\n throw new Error('setThumbnail: could not detect image format. Pass options.format explicitly.');\n }\n const pkg = pres[INTERNAL_PACKAGE];\n const contentType = contentTypeForFormat(format);\n const extension = extensionForFormat(format);\n const desiredName = partName(`/docProps/thumbnail.${extension}`);\n\n const hit = findThumbnailRel(pkg);\n if (hit) {\n // Replace in place if the existing part is the same path; otherwise\n // remove the old one and add a new one with the right extension.\n if (hit.partName === desiredName) {\n const part = pkg.getPart(hit.partName);\n if (!part) throw new Error(`thumbnail rel points at missing part ${hit.partName}`);\n part.data = bytes;\n part.contentType = contentType;\n setOpcDefault(pkg, extension, contentType);\n return;\n }\n pkg.removePart(hit.partName);\n pkg.addPart(desiredName, contentType, bytes);\n setOpcDefault(pkg, extension, contentType);\n const rootRels = pkg.rootRels() ?? emptyRels();\n const existing = rootRels.items.find((r) => r.id === hit.rId);\n if (existing) {\n existing.target = `docProps/thumbnail.${extension}`;\n }\n pkg.setRootRels(rootRels);\n return;\n }\n\n // Bootstrap.\n setOpcDefault(pkg, extension, contentType);\n pkg.addPart(desiredName, contentType, bytes);\n const rootRels = pkg.rootRels() ?? emptyRels();\n const rId = nextRelId(rootRels.items.map((r) => r.id));\n rootRels.items.push({\n id: rId,\n type: REL_TYPES.thumbnail,\n target: `docProps/thumbnail.${extension}`,\n targetMode: 'Internal',\n });\n pkg.setRootRels(rootRels);\n};\n\n/**\n * Removes the package's thumbnail entirely (drops the rel + the\n * underlying part). No-op when the package has no thumbnail.\n */\nexport const removeThumbnail = (pres: PresentationData): void => {\n const pkg = pres[INTERNAL_PACKAGE];\n const hit = findThumbnailRel(pkg);\n if (!hit) return;\n pkg.removePart(hit.partName);\n const rootRels = pkg.rootRels();\n if (!rootRels) return;\n rootRels.items = rootRels.items.filter((r) => r.id !== hit.rId);\n pkg.setRootRels(rootRels);\n};\n","// Table cell access.\n\nimport { resolveChartPartName } from './charts.ts';\nimport {\n applyAlignmentToAllParagraphs,\n applyFormatToAllRuns,\n buildColorElement,\n clearFill as clearFillImpl,\n setSolidFill,\n setTextBody,\n type TextFormat,\n type ParagraphAlignment,\n} from '../../internal/drawingml/index.ts';\nimport type { Emu } from '../units.ts';\nimport { buildTableCell, buildTableRow } from '../../internal/presentationml/index.ts';\nimport {\n NS,\n type XmlElement,\n allChildElements,\n attr,\n elem,\n firstChildElement,\n getAttrValue,\n insertChildByRank,\n qname,\n text,\n} from '../../internal/xml/index.ts';\nimport {\n CELL_COL,\n CELL_ELEMENT,\n CELL_ROW,\n CELL_TABLE,\n type PresentationData,\n SHAPE_ELEMENT,\n SHAPE_SLIDE,\n SHAPE_SNAPSHOT,\n SLIDE_SHAPES,\n type SlideData,\n type SlideShapeData,\n type TableCellData,\n} from '../_internal-symbols.ts';\nimport { emuCoordinate32, emuExtent, lineWidthEmu, normalizeGuid } from '../../internal/bounds.ts';\nimport { commitSlideData, refreshSlideData } from './_helpers.ts';\nimport { type ShapeParagraphElement, readParagraphElements } from './shape-runs.ts';\nimport { ALIGN_TOKEN_MAP } from './shape-paragraph.ts';\nimport { getPresentationTheme } from './package.ts';\nimport { resolveDrawingColor } from './shapes.ts';\nimport { getSlides } from './slide-query.ts';\n\n// ---------------------------------------------------------------------------\n// Table cell access.\n//\n// `addSlideTable` builds the cell tree under `<a:graphic>/<a:graphicData>/\n// <a:tbl>`. These helpers let callers reach individual `<a:tc>` cells to\n// re-fill text, paint backgrounds, or align contents without rebuilding\n// the table.\n\nexport type { TableCellData };\n\nconst NAME_A_GRAPHIC_TBL = qname('a', 'graphic', NS.dml);\nconst NAME_A_GRAPHIC_DATA_TBL = qname('a', 'graphicData', NS.dml);\nconst NAME_A_TBL = qname('a', 'tbl', NS.dml);\nconst NAME_A_TC_PR = qname('a', 'tcPr', NS.dml);\nconst NAME_A_TX_BODY_TBL = qname('a', 'txBody', NS.dml);\n\nconst findTblElement = (shape: SlideShapeData): XmlElement | null => {\n if (shape[SHAPE_SNAPSHOT].kind !== 'graphicFrame') return null;\n const graphic = firstChildElement(shape[SHAPE_ELEMENT], NAME_A_GRAPHIC_TBL);\n if (!graphic) return null;\n const graphicData = firstChildElement(graphic, NAME_A_GRAPHIC_DATA_TBL);\n if (!graphicData) return null;\n return firstChildElement(graphicData, NAME_A_TBL);\n};\n\n/**\n * `true` when the shape is a `<p:graphicFrame>` wrapping `<a:tbl>` —\n * i.e. a table. Sharper than `getShapeKind(shape) === 'graphicFrame'`,\n * which also matches charts and SmartArt frames.\n */\nexport const isTableShape = (shape: SlideShapeData): boolean => findTblElement(shape) !== null;\n\n/**\n * Returns every table graphic-frame shape on the slide, in document\n * order. Convenience over `getSlideShapes(slide).filter(isTableShape)`\n * — pairs `getSlideCharts(slide)` for cases where the caller wants\n * just the tables.\n */\nexport const getSlideTables = (slide: SlideData): ReadonlyArray<SlideShapeData> => {\n const out: SlideShapeData[] = [];\n for (const shape of slide[SLIDE_SHAPES]) {\n if (isTableShape(shape)) out.push(shape);\n }\n return out;\n};\n\n/**\n * Dense per-slide table count array. Counts `isTableShape` matches per\n * slide. Rounds out the density-array family alongside the chart,\n * shape, text, and comment counters.\n */\nexport const getPresentationTableCountsBySlide = (pres: PresentationData): ReadonlyArray<number> =>\n getSlides(pres).map((s) => getSlideTables(s).length);\n\n/**\n * `true` when the shape is a `<p:graphicFrame>` wrapping a chart\n * reference (`<c:chart>`). Charts, tables, and SmartArt all share\n * the graphic-frame kind; this predicate filters down to charts only.\n */\nexport const isChartShape = (shape: SlideShapeData): boolean =>\n resolveChartPartName(shape[SHAPE_SLIDE], shape) !== null;\n\nconst NAME_A_GRID_COL = qname('a', 'gridCol', NS.dml);\nconst ATTR_W_TBL = qname('', 'w', '');\nconst ATTR_H_TBL = qname('', 'h', '');\n\nconst tableRows = (tbl: XmlElement): XmlElement[] =>\n tbl.children.filter(\n (c): c is XmlElement =>\n c.kind === 'element' && c.name.namespaceURI === NS.dml && c.name.localName === 'tr',\n );\n\nconst rowCells = (tr: XmlElement): XmlElement[] =>\n tr.children.filter(\n (c): c is XmlElement =>\n c.kind === 'element' && c.name.namespaceURI === NS.dml && c.name.localName === 'tc',\n );\n\nconst buildCellHandle = (\n table: SlideShapeData,\n tc: XmlElement,\n row: number,\n col: number,\n): TableCellData => ({\n [CELL_TABLE]: table,\n [CELL_ELEMENT]: tc,\n [CELL_ROW]: row,\n [CELL_COL]: col,\n});\n\n/**\n * Returns a 2D array of cell handles for the given table shape, in\n * row-major order. Throws if the shape isn't a table graphic frame.\n */\nexport const getTableCells = (\n table: SlideShapeData,\n): ReadonlyArray<ReadonlyArray<TableCellData>> => {\n const tbl = findTblElement(table);\n if (!tbl) throw new Error('getTableCells: shape is not a table graphic frame');\n const rows = tableRows(tbl);\n return rows.map((tr, rowIdx) =>\n rowCells(tr).map((tc, colIdx) => buildCellHandle(table, tc, rowIdx, colIdx)),\n );\n};\n\n/**\n * Reads the table-style GUID from `<a:tbl><a:tblPr><a:tableStyleId>`.\n * PowerPoint uses GUIDs to reference built-in table styles\n * (`{5C22544A-7EE6-4342-B048-85BDC9FD1C3A}` = \"Medium Style 2 -\n * Accent 1\", etc.) and theme-local styles. Returns `null` when the\n * table doesn't reference one (uses the slide's default style).\n */\nexport const getTableStyleId = (table: SlideShapeData): string | null => {\n const tbl = findTblElement(table);\n if (!tbl) return null;\n const tblPr = firstChildElement(tbl, qname('a', 'tblPr', NS.dml));\n if (!tblPr) return null;\n const idEl = firstChildElement(tblPr, qname('a', 'tableStyleId', NS.dml));\n if (!idEl) return null;\n let acc = '';\n for (const c of idEl.children) {\n if (c.kind === 'text' || c.kind === 'cdata') acc += c.data;\n }\n return acc.trim() || null;\n};\n\n/**\n * Writes `<a:tbl><a:tblPr><a:tableStyleId>` to the given GUID. Pass\n * `null` to remove the element so the table falls back to the slide's\n * default style. The GUID must include its curly braces — e.g.\n * `'{5C22544A-7EE6-4342-B048-85BDC9FD1C3A}'` (PowerPoint's \"Medium\n * Style 2 - Accent 1\"). Creates `<a:tblPr>` if absent. Throws when the\n * shape isn't a table graphic frame.\n */\nexport const setTableStyleId = (table: SlideShapeData, styleId: string | null): void => {\n const tbl = findTblElement(table);\n if (!tbl) throw new Error('setTableStyleId: shape is not a table graphic frame');\n const tblPr = ensureTblPr(tbl);\n // tableStyleId is the LAST child of <a:tblPr> per CT_TableProperties.\n tblPr.children = tblPr.children.filter(\n (c) =>\n !(\n c.kind === 'element' &&\n c.name.namespaceURI === NS.dml &&\n c.name.localName === 'tableStyleId'\n ),\n );\n if (styleId !== null) {\n // ST_Guid requires uppercase hex in braces; normalize so a lowercase GUID\n // (e.g. from crypto.randomUUID) is accepted, and reject non-GUID strings.\n const guid = normalizeGuid(styleId, 'setTableStyleId: styleId');\n tblPr.children.push(elem(qname('a', 'tableStyleId', NS.dml), { children: [text(guid)] }));\n }\n commitSlideData(table[SHAPE_SLIDE]);\n refreshSlideData(table[SHAPE_SLIDE]);\n};\n\n/**\n * Reads the boolean style flags off `<a:tblPr>` — which header /\n * footer rows + columns are banded or emphasised. Mirrors the\n * `firstRow` / `bandRow` flags exposed by `addSlideTable`.\n *\n * Per ECMA-376 §17.18.95 / §21.1.3.15:\n *\n * - `firstRow` — header row is styled differently.\n * - `lastRow` — total row is styled differently.\n * - `firstCol` — first column is styled differently.\n * - `lastCol` — last column is styled differently.\n * - `bandRow` — alternating row shading.\n * - `bandCol` — alternating column shading.\n *\n * Renderers use these to switch on the corresponding table style\n * variant. Returns all-`false` for tables that don't author `<a:tblPr>`.\n */\nexport const getTableStyleFlags = (\n table: SlideShapeData,\n): {\n firstRow: boolean;\n lastRow: boolean;\n firstCol: boolean;\n lastCol: boolean;\n bandRow: boolean;\n bandCol: boolean;\n} => {\n const empty = {\n firstRow: false,\n lastRow: false,\n firstCol: false,\n lastCol: false,\n bandRow: false,\n bandCol: false,\n };\n const tbl = findTblElement(table);\n if (!tbl) return empty;\n const tblPr = firstChildElement(tbl, qname('a', 'tblPr', NS.dml));\n if (!tblPr) return empty;\n const readBool = (attr: string): boolean => {\n const v = getAttrValue(tblPr, qname('', attr, ''));\n return v === '1' || v === 'true';\n };\n return {\n firstRow: readBool('firstRow'),\n lastRow: readBool('lastRow'),\n firstCol: readBool('firstCol'),\n lastCol: readBool('lastCol'),\n bandRow: readBool('bandRow'),\n bandCol: readBool('bandCol'),\n };\n};\n\nconst ensureTblPr = (tbl: XmlElement): XmlElement => {\n let tblPr = firstChildElement(tbl, qname('a', 'tblPr', NS.dml));\n if (tblPr === null) {\n tblPr = elem(qname('a', 'tblPr', NS.dml));\n // <a:tblPr> is the FIRST child of <a:tbl> per the schema.\n tbl.children.unshift(tblPr);\n }\n return tblPr;\n};\n\nconst TABLE_STYLE_FLAG_KEYS = [\n 'firstRow',\n 'lastRow',\n 'firstCol',\n 'lastCol',\n 'bandRow',\n 'bandCol',\n] as const;\n\n/**\n * Sets one or more boolean style flags on `<a:tblPr>`. Only the keys\n * present in `flags` are touched — omitted keys are left at their\n * current state. A flag set to `false` strips the attribute (rather\n * than emitting `=\"0\"`), matching how PowerPoint round-trips defaults.\n *\n * See `getTableStyleFlags` for the meaning of each flag.\n */\nexport const setTableStyleFlags = (\n table: SlideShapeData,\n flags: {\n firstRow?: boolean;\n lastRow?: boolean;\n firstCol?: boolean;\n lastCol?: boolean;\n bandRow?: boolean;\n bandCol?: boolean;\n },\n): void => {\n const tbl = findTblElement(table);\n if (!tbl) throw new Error('setTableStyleFlags: shape is not a table graphic frame');\n const tblPr = ensureTblPr(tbl);\n for (const key of TABLE_STYLE_FLAG_KEYS) {\n const v = flags[key];\n if (v === undefined) continue;\n tblPr.attrs = tblPr.attrs.filter(\n (a) => !(a.name.namespaceURI === '' && a.name.localName === key),\n );\n if (v) tblPr.attrs.push(attr(qname('', key, ''), '1'));\n }\n commitSlideData(table[SHAPE_SLIDE]);\n refreshSlideData(table[SHAPE_SLIDE]);\n};\n\n/**\n * Returns the table's row + column counts. Throws when the shape\n * isn't a table graphic frame.\n */\nexport const getTableDimensions = (\n table: SlideShapeData,\n): { readonly rows: number; readonly cols: number } => {\n const tbl = findTblElement(table);\n if (!tbl) throw new Error('getTableDimensions: shape is not a table graphic frame');\n const rows = tableRows(tbl);\n const cols = rows[0] !== undefined ? rowCells(rows[0]).length : 0;\n return { rows: rows.length, cols };\n};\n\n/**\n * Returns each column's width in EMU, in left-to-right order, as\n * declared on `<a:tblGrid>/<a:gridCol w=\"...\">`. Missing or\n * unparseable widths default to 0. Throws when the shape isn't a\n * table graphic frame.\n */\nexport const getTableColumnWidths = (table: SlideShapeData): ReadonlyArray<Emu> => {\n const tbl = findTblElement(table);\n if (!tbl) throw new Error('getTableColumnWidths: shape is not a table graphic frame');\n const grid = firstChildElement(tbl, qname('a', 'tblGrid', NS.dml));\n if (!grid) return [];\n const out: Emu[] = [];\n for (const col of allChildElements(grid, NAME_A_GRID_COL)) {\n const v = getAttrValue(col, ATTR_W_TBL);\n const n = v !== null ? Number.parseInt(v, 10) : 0;\n out.push((Number.isFinite(n) ? n : 0) as Emu);\n }\n return out;\n};\n\n/**\n * Returns the table's nominal `(width, height)` derived from\n * summing the `<a:gridCol w>` and `<a:tr h>` attributes (both in\n * EMU). Useful for layout pipelines that want to know how big a\n * table really is without dereferencing the shape's `<a:xfrm>`.\n *\n * Throws when the shape isn't a table graphic frame.\n */\nexport const getTableSize = (\n table: SlideShapeData,\n): { readonly width: Emu; readonly height: Emu } => {\n const widths = getTableColumnWidths(table);\n const heights = getTableRowHeights(table);\n const width = widths.reduce((sum, w) => sum + w, 0) as Emu;\n const height = heights.reduce((sum, h) => sum + h, 0) as Emu;\n return { width, height };\n};\n\n/**\n * Returns each row's height in EMU, in top-to-bottom order, from\n * `<a:tr h=\"...\">`. Missing or unparseable heights default to 0.\n * Throws when the shape isn't a table graphic frame.\n */\nexport const getTableRowHeights = (table: SlideShapeData): ReadonlyArray<Emu> => {\n const tbl = findTblElement(table);\n if (!tbl) throw new Error('getTableRowHeights: shape is not a table graphic frame');\n const out: Emu[] = [];\n for (const tr of tableRows(tbl)) {\n const v = getAttrValue(tr, ATTR_H_TBL);\n const n = v !== null ? Number.parseInt(v, 10) : 0;\n out.push((Number.isFinite(n) ? n : 0) as Emu);\n }\n return out;\n};\n\n/**\n * Sets a single column's width on the table grid. Throws on\n * out-of-range column indices or non-table shapes. The total table\n * width is not auto-adjusted — callers are responsible for keeping\n * the sum consistent with the table's `<a:xfrm>` extent if PowerPoint\n * is to render the table without clipping.\n */\nexport const setTableColumnWidth = (table: SlideShapeData, col: number, width: Emu): void => {\n const tbl = requireTbl(table);\n const grid = firstChildElement(tbl, qname('a', 'tblGrid', NS.dml));\n if (!grid) throw new Error('table has no <a:tblGrid>');\n const cols = allChildElements(grid, NAME_A_GRID_COL);\n const target = cols[col];\n if (!target) throw new RangeError(`table column ${col} out of range (have ${cols.length})`);\n target.attrs = target.attrs.filter(\n (a) => !(a.name.namespaceURI === '' && a.name.localName === 'w'),\n );\n target.attrs.push(attr(ATTR_W_TBL, String(emuExtent(width, 'setTableColumnWidth: width'))));\n commitSlideData(table[SHAPE_SLIDE]);\n refreshSlideData(table[SHAPE_SLIDE]);\n};\n\n/**\n * Sets a single row's height. Throws on out-of-range row indices or\n * non-table shapes. As with `setTableColumnWidth`, the table's\n * `<a:xfrm>` extent is left to the caller.\n */\nexport const setTableRowHeight = (table: SlideShapeData, row: number, height: Emu): void => {\n const tbl = requireTbl(table);\n const rows = tableRows(tbl);\n const target = rows[row];\n if (!target) throw new RangeError(`table row ${row} out of range (have ${rows.length})`);\n target.attrs = target.attrs.filter(\n (a) => !(a.name.namespaceURI === '' && a.name.localName === 'h'),\n );\n target.attrs.push(attr(ATTR_H_TBL, String(emuExtent(height, 'setTableRowHeight: height'))));\n commitSlideData(table[SHAPE_SLIDE]);\n refreshSlideData(table[SHAPE_SLIDE]);\n};\n\n/**\n * Returns the cell at `(row, col)`. Throws on out-of-range coordinates\n * or non-table shapes.\n */\nexport const getTableCell = (table: SlideShapeData, row: number, col: number): TableCellData => {\n const cells = getTableCells(table);\n const r = cells[row];\n if (!r) throw new RangeError(`table row ${row} out of range (have ${cells.length})`);\n const c = r[col];\n if (!c) throw new RangeError(`table column ${col} out of range in row ${row} (have ${r.length})`);\n return c;\n};\n\nconst commitTableCell = (cell: TableCellData): void => {\n const shape = cell[CELL_TABLE];\n commitSlideData(shape[SHAPE_SLIDE]);\n refreshSlideData(shape[SHAPE_SLIDE]);\n};\n\nconst ensureCellTxBody = (cell: TableCellData): XmlElement => {\n const tc = cell[CELL_ELEMENT];\n let txBody = firstChildElement(tc, NAME_A_TX_BODY_TBL);\n if (txBody === null) {\n txBody = elem(NAME_A_TX_BODY_TBL);\n // bodyPr lstStyle a:p — keep the canonical ordering.\n txBody.children.push(elem(qname('a', 'bodyPr', NS.dml)));\n txBody.children.push(elem(qname('a', 'lstStyle', NS.dml)));\n // Insert before <a:tcPr> per the schema.\n const tcPrIdx = tc.children.findIndex(\n (c) => c.kind === 'element' && c.name.namespaceURI === NS.dml && c.name.localName === 'tcPr',\n );\n if (tcPrIdx >= 0) tc.children.splice(tcPrIdx, 0, txBody);\n else tc.children.push(txBody);\n }\n return txBody;\n};\n\nconst ensureCellTcPr = (cell: TableCellData): XmlElement => {\n const tc = cell[CELL_ELEMENT];\n let tcPr = firstChildElement(tc, NAME_A_TC_PR);\n if (tcPr === null) {\n tcPr = elem(NAME_A_TC_PR);\n // <a:tcPr> is the LAST child of <a:tc>.\n tc.children.push(tcPr);\n }\n return tcPr;\n};\n\n/** Replaces a cell's text. `\\n` starts a new paragraph. */\nexport const setTableCellText = (cell: TableCellData, text: string): void => {\n const txBody = ensureCellTxBody(cell);\n setTextBody(txBody, text);\n commitTableCell(cell);\n};\n\n/**\n * Reads the cell's merge / span attributes:\n *\n * - `gridSpan` — number of columns this cell spans (≥1, default 1).\n * - `rowSpan` — number of rows this cell spans (≥1, default 1).\n * - `hMerge` — `true` when this cell is the right half of a horizontal\n * span (it's painted by an earlier cell with `gridSpan > 1`).\n * - `vMerge` — `true` when this cell is the bottom half of a vertical\n * span (it's painted by an earlier cell with `rowSpan > 1`).\n *\n * Renderers should skip painting cells where `hMerge` or `vMerge` is\n * true; those cells exist only so the row/column grid stays consistent.\n */\nexport const getTableCellSpan = (\n cell: TableCellData,\n): { gridSpan: number; rowSpan: number; hMerge: boolean; vMerge: boolean } => {\n const el = cell[CELL_ELEMENT];\n const gs = getAttrValue(el, qname('', 'gridSpan', ''));\n const rs = getAttrValue(el, qname('', 'rowSpan', ''));\n const hm = getAttrValue(el, qname('', 'hMerge', ''));\n const vm = getAttrValue(el, qname('', 'vMerge', ''));\n const parseSpan = (v: string | null): number => {\n if (v === null) return 1;\n const n = Number.parseInt(v, 10);\n return Number.isFinite(n) && n > 0 ? n : 1;\n };\n return {\n gridSpan: parseSpan(gs),\n rowSpan: parseSpan(rs),\n hMerge: hm === '1' || hm === 'true',\n vMerge: vm === '1' || vm === 'true',\n };\n};\n\nconst ATTR_GRID_SPAN = qname('', 'gridSpan', '');\nconst ATTR_ROW_SPAN = qname('', 'rowSpan', '');\nconst ATTR_H_MERGE = qname('', 'hMerge', '');\nconst ATTR_V_MERGE = qname('', 'vMerge', '');\n\nconst setSpanAttr = (tc: XmlElement, name: ReturnType<typeof qname>, value: string): void => {\n tc.attrs = tc.attrs.filter(\n (a) => !(a.name.namespaceURI === '' && a.name.localName === name.localName),\n );\n tc.attrs.push(attr(name, value));\n};\n\n/** A cell already carries a merge marker / multi-cell span. */\nconst cellIsMergedAlready = (tc: XmlElement): boolean => {\n const gs = getAttrValue(tc, ATTR_GRID_SPAN);\n const rs = getAttrValue(tc, ATTR_ROW_SPAN);\n const hm = getAttrValue(tc, ATTR_H_MERGE);\n const vm = getAttrValue(tc, ATTR_V_MERGE);\n return (\n (gs !== null && Number.parseInt(gs, 10) > 1) ||\n (rs !== null && Number.parseInt(rs, 10) > 1) ||\n hm === '1' ||\n hm === 'true' ||\n vm === '1' ||\n vm === 'true'\n );\n};\n\n/**\n * Merges a rectangular block of table cells into a single visual cell.\n *\n * The block's top-left cell `(row, col)` becomes the anchor and carries\n * `gridSpan` (= `colSpan`) / `rowSpan`; the cells it covers are marked\n * `hMerge` / `vMerge` per ECMA-376 §21.1.3.18 (`CT_TableCell`) so the\n * grid stays rectangular while PowerPoint paints only the anchor. This\n * is the write counterpart to {@link getTableCellSpan}.\n *\n * Constraints, enforced loudly (these are authoring-boundary inputs):\n *\n * - `rowSpan` / `colSpan` must be ≥ 1, and at least one must be > 1\n * (a 1×1 \"merge\" is a no-op the caller didn't mean).\n * - The block must lie fully inside the table grid.\n * - No cell in the block may already participate in another merge —\n * overlapping merges corrupt the grid and trip PowerPoint's repair\n * dialog. Split the existing merge first.\n *\n * The anchor cell's text is preserved; covered cells keep their own\n * `<a:txBody>` in the XML (PowerPoint ignores it while the merge marker\n * is set) so the operation stays losslessly reversible.\n */\nexport const mergeTableCells = (\n table: SlideShapeData,\n block: {\n readonly row: number;\n readonly col: number;\n readonly rowSpan: number;\n readonly colSpan: number;\n },\n): void => {\n const { row, col, rowSpan, colSpan } = block;\n if (!Number.isInteger(rowSpan) || !Number.isInteger(colSpan) || rowSpan < 1 || colSpan < 1) {\n throw new RangeError(\n `mergeTableCells: rowSpan / colSpan must be integers ≥ 1 (got ${rowSpan} × ${colSpan})`,\n );\n }\n if (rowSpan === 1 && colSpan === 1) {\n throw new RangeError('mergeTableCells: a 1×1 block is not a merge');\n }\n if (!Number.isInteger(row) || !Number.isInteger(col) || row < 0 || col < 0) {\n throw new RangeError(\n `mergeTableCells: row / col must be non-negative integers (got ${row}, ${col})`,\n );\n }\n\n const cells = getTableCells(table);\n const lastRow = row + rowSpan - 1;\n const lastCol = col + colSpan - 1;\n if (lastRow >= cells.length) {\n throw new RangeError(\n `mergeTableCells: block rows ${row}..${lastRow} exceed table height ${cells.length}`,\n );\n }\n for (let r = row; r <= lastRow; r++) {\n const rowCellsArr = cells[r]!;\n if (lastCol >= rowCellsArr.length) {\n throw new RangeError(\n `mergeTableCells: block cols ${col}..${lastCol} exceed row ${r} width ${rowCellsArr.length}`,\n );\n }\n }\n\n // Reject overlaps with any pre-existing merge before mutating anything,\n // so a rejected call leaves the table untouched.\n for (let r = row; r <= lastRow; r++) {\n for (let c = col; c <= lastCol; c++) {\n if (cellIsMergedAlready(cells[r]![c]![CELL_ELEMENT])) {\n throw new Error(\n `mergeTableCells: cell (${r}, ${c}) is already part of a merge; split it before re-merging`,\n );\n }\n }\n }\n\n for (let r = row; r <= lastRow; r++) {\n for (let c = col; c <= lastCol; c++) {\n const tc = cells[r]![c]![CELL_ELEMENT];\n if (r === row && c === col) {\n if (colSpan > 1) setSpanAttr(tc, ATTR_GRID_SPAN, String(colSpan));\n if (rowSpan > 1) setSpanAttr(tc, ATTR_ROW_SPAN, String(rowSpan));\n continue;\n }\n // Covered cells: a column offset from the anchor sets hMerge; a row\n // offset sets vMerge. The bottom-right block carries both.\n if (c > col) setSpanAttr(tc, ATTR_H_MERGE, '1');\n if (r > row) setSpanAttr(tc, ATTR_V_MERGE, '1');\n }\n }\n\n commitSlideData(table[SHAPE_SLIDE]);\n refreshSlideData(table[SHAPE_SLIDE]);\n};\n\n/**\n * One side of a cell's border, as read from `<a:tcPr><a:ln{L|R|T|B}>`.\n * `widthEmu` is the line width in EMU; `color` is `#RRGGBB` or `null`\n * when the border is inherited / un-styled.\n */\nexport interface TableCellBorder {\n // Read contract: `getTableCellBorders` always populates all three (each is the\n // concrete value or `null` when un-styled). The setter takes a `Partial` of\n // this (see `setTableCellBorders`), so authoring `{ color, widthEmu }` without\n // `dash` is allowed without widening what reads return.\n readonly color: string | null;\n readonly widthEmu: number | null;\n readonly dash: string | null;\n}\n\nexport interface TableCellBorders {\n readonly left: TableCellBorder | null;\n readonly right: TableCellBorder | null;\n readonly top: TableCellBorder | null;\n readonly bottom: TableCellBorder | null;\n readonly tlToBr: TableCellBorder | null;\n readonly blToTr: TableCellBorder | null;\n}\n\n/**\n * Reads the per-side borders on a cell. Returns `null` for sides with\n * no explicit `<a:ln{Side}>` element (those inherit from the table\n * style / theme). All four cardinal sides plus the two diagonals\n * (TL→BR, BL→TR) are surfaced because real templates use them all.\n */\nexport const getTableCellBorders = (\n pres: PresentationData,\n cell: TableCellData,\n): TableCellBorders => {\n const tcPr = firstChildElement(cell[CELL_ELEMENT], NAME_A_TC_PR);\n const theme = getPresentationTheme(pres);\n const empty: TableCellBorders = {\n left: null,\n right: null,\n top: null,\n bottom: null,\n tlToBr: null,\n blToTr: null,\n };\n if (!tcPr) return empty;\n const readLn = (local: string): TableCellBorder | null => {\n const ln = firstChildElement(tcPr, qname('a', local, NS.dml));\n if (!ln) return null;\n const w = getAttrValue(ln, qname('', 'w', ''));\n const widthEmu = w !== null ? Number.parseInt(w, 10) : null;\n let color: string | null = null;\n const solid = firstChildElement(ln, qname('a', 'solidFill', NS.dml));\n if (solid) {\n for (const c of solid.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n color = resolveDrawingColor(c, theme);\n break;\n }\n }\n const prstDash = firstChildElement(ln, qname('a', 'prstDash', NS.dml));\n const dash = prstDash ? getAttrValue(prstDash, qname('', 'val', '')) : null;\n return { color, widthEmu, dash };\n };\n return {\n left: readLn('lnL'),\n right: readLn('lnR'),\n top: readLn('lnT'),\n bottom: readLn('lnB'),\n tlToBr: readLn('lnTlToBr'),\n blToTr: readLn('lnBlToTr'),\n };\n};\n\nconst BORDER_SIDE_LOCALS = {\n left: 'lnL',\n right: 'lnR',\n top: 'lnT',\n bottom: 'lnB',\n tlToBr: 'lnTlToBr',\n blToTr: 'lnBlToTr',\n} as const;\n\n// CT_TableCellProperties (a:tcPr) is an xsd:sequence: the six border lines\n// (lnL/lnR/lnT/lnB/lnTlToBr/lnBlToTr), then cell3D, then the fill choice, then\n// headers, then extLst. Border setters must drop their element at the mandated\n// slot, or styling a cell's fill before its borders emits invalid order.\nconst TCPR_CHILD_RANK: Record<string, number> = {\n lnL: 0,\n lnR: 1,\n lnT: 2,\n lnB: 3,\n lnTlToBr: 4,\n lnBlToTr: 5,\n cell3D: 6,\n noFill: 7,\n solidFill: 7,\n gradFill: 7,\n blipFill: 7,\n pattFill: 7,\n grpFill: 7,\n headers: 8,\n extLst: 9,\n};\nconst tcPrChildRank = (el: XmlElement): number =>\n el.name.namespaceURI === NS.dml ? (TCPR_CHILD_RANK[el.name.localName] ?? 99) : 99;\n\nconst writeBorderLn = (\n tcPr: XmlElement,\n local: 'lnL' | 'lnR' | 'lnT' | 'lnB' | 'lnTlToBr' | 'lnBlToTr',\n border: Partial<TableCellBorder> | null,\n): void => {\n // Strip any prior side first.\n tcPr.children = tcPr.children.filter(\n (c) => !(c.kind === 'element' && c.name.namespaceURI === NS.dml && c.name.localName === local),\n );\n if (border === null) return;\n const lnAttrs = [];\n if (border.widthEmu !== null && border.widthEmu !== undefined) {\n const w = lineWidthEmu(border.widthEmu, 'setTableCellBorders: widthEmu');\n lnAttrs.push(attr(qname('', 'w', ''), String(w)));\n }\n const children: XmlElement[] = [];\n if (border.color !== null && border.color !== undefined) {\n children.push(\n elem(qname('a', 'solidFill', NS.dml), { children: [buildColorElement(border.color)] }),\n );\n }\n if (border.dash !== null && border.dash !== undefined) {\n children.push(\n elem(qname('a', 'prstDash', NS.dml), { attrs: [attr(qname('', 'val', ''), border.dash)] }),\n );\n }\n insertChildByRank(\n tcPr,\n elem(qname('a', local, NS.dml), { attrs: lnAttrs, children }),\n tcPrChildRank,\n );\n};\n\n/**\n * Sets one or more side borders on a cell. Sides listed with `null` are\n * removed from the `<a:tcPr>`; sides omitted from the partial are left\n * untouched. Pass the whole `sides` arg as `null` to clear every side\n * in one call. Creates `<a:tcPr>` if absent.\n *\n * The diagonal sides (`tlToBr` / `blToTr`) are independent of the\n * cardinal four — a strikethrough cell can have only a diagonal.\n */\nexport const setTableCellBorders = (\n cell: TableCellData,\n sides: {\n left?: Partial<TableCellBorder> | null;\n right?: Partial<TableCellBorder> | null;\n top?: Partial<TableCellBorder> | null;\n bottom?: Partial<TableCellBorder> | null;\n tlToBr?: Partial<TableCellBorder> | null;\n blToTr?: Partial<TableCellBorder> | null;\n } | null,\n): void => {\n const tcPr = ensureCellTcPr(cell);\n if (sides === null) {\n for (const local of Object.values(BORDER_SIDE_LOCALS)) writeBorderLn(tcPr, local, null);\n } else {\n for (const [key, local] of Object.entries(BORDER_SIDE_LOCALS) as ReadonlyArray<\n [\n keyof typeof BORDER_SIDE_LOCALS,\n (typeof BORDER_SIDE_LOCALS)[keyof typeof BORDER_SIDE_LOCALS],\n ]\n >) {\n const v = sides[key];\n if (v === undefined) continue;\n writeBorderLn(tcPr, local, v);\n }\n }\n commitTableCell(cell);\n};\n\n/**\n * Reads the cell's text direction (`<a:tcPr vert=\"…\"/>`) — same tokens\n * as `getShapeTextDirection`. Returns `null` for the default\n * horizontal direction.\n *\n * Vertical column headers in tables almost always emit `<a:tcPr\n * vert=\"vert270\"/>` or `\"eaVert\"` so the header label reads bottom-to-\n * top alongside its column.\n */\nexport const getTableCellTextDirection = (\n cell: TableCellData,\n): 'vert' | 'vert270' | 'wordArtVert' | 'eaVert' | 'mongolianVert' | 'wordArtVertRtl' | null => {\n const tcPr = firstChildElement(cell[CELL_ELEMENT], NAME_A_TC_PR);\n if (!tcPr) return null;\n const v = getAttrValue(tcPr, qname('', 'vert', ''));\n if (\n v === 'vert' ||\n v === 'vert270' ||\n v === 'wordArtVert' ||\n v === 'eaVert' ||\n v === 'mongolianVert' ||\n v === 'wordArtVertRtl'\n )\n return v;\n return null;\n};\n\n/**\n * Sets the cell's text-direction via `<a:tcPr vert=\"…\"/>`. Same six\n * `ST_TextVerticalType` values as `setShapeTextDirection`. Passing\n * `null` (or `'horz'`) clears the attribute so the cell uses the\n * default horizontal direction. Creates `<a:tcPr>` if absent.\n */\nexport const setTableCellTextDirection = (\n cell: TableCellData,\n direction:\n | 'horz'\n | 'vert'\n | 'vert270'\n | 'wordArtVert'\n | 'eaVert'\n | 'mongolianVert'\n | 'wordArtVertRtl'\n | null,\n): void => {\n const tcPr = ensureCellTcPr(cell);\n tcPr.attrs = tcPr.attrs.filter(\n (a) => !(a.name.namespaceURI === '' && a.name.localName === 'vert'),\n );\n if (direction !== null && direction !== 'horz') {\n tcPr.attrs.push(attr(qname('', 'vert', ''), direction));\n }\n commitTableCell(cell);\n};\n\n/**\n * Reads the cell's vertical text anchor (`<a:tcPr anchor=\"t|ctr|b\"/>`)\n * — `'top'`, `'center'`, `'bottom'`, or `null` for the default\n * (`ctr` / center per the schema).\n */\nexport const getTableCellAnchor = (cell: TableCellData): 'top' | 'center' | 'bottom' | null => {\n const tcPr = firstChildElement(cell[CELL_ELEMENT], NAME_A_TC_PR);\n if (!tcPr) return null;\n const v = getAttrValue(tcPr, qname('', 'anchor', ''));\n if (v === 't') return 'top';\n if (v === 'ctr') return 'center';\n if (v === 'b') return 'bottom';\n return null;\n};\n\n/**\n * Sets the cell's vertical text anchor (`<a:tcPr anchor=\"t|ctr|b\"/>`).\n * Pass `null` to clear the attribute so the cell uses the table's\n * default (`ctr`). Creates `<a:tcPr>` if absent.\n */\nexport const setTableCellAnchor = (\n cell: TableCellData,\n anchor: 'top' | 'center' | 'bottom' | null,\n): void => {\n const tcPr = ensureCellTcPr(cell);\n tcPr.attrs = tcPr.attrs.filter(\n (a) => !(a.name.namespaceURI === '' && a.name.localName === 'anchor'),\n );\n if (anchor !== null) {\n const mapped = anchor === 'top' ? 't' : anchor === 'center' ? 'ctr' : 'b';\n tcPr.attrs.push(attr(qname('', 'anchor', ''), mapped));\n }\n commitTableCell(cell);\n};\n\n/**\n * Reads the cell's inset margins (`<a:tcPr marL marR marT marB>`) in\n * EMU. Each side is `null` when the cell doesn't author it (renderers\n * should fall back to PowerPoint's defaults — 91440 EMU / 0.1 inch\n * for the horizontal margins, 45720 EMU for the vertical).\n */\nexport const getTableCellMargins = (\n cell: TableCellData,\n): { left: number | null; right: number | null; top: number | null; bottom: number | null } => {\n const tcPr = firstChildElement(cell[CELL_ELEMENT], NAME_A_TC_PR);\n const empty = { left: null, right: null, top: null, bottom: null };\n if (!tcPr) return empty;\n const read = (name: string): number | null => {\n const v = getAttrValue(tcPr, qname('', name, ''));\n if (v === null) return null;\n const n = Number.parseInt(v, 10);\n return Number.isFinite(n) ? n : null;\n };\n return {\n left: read('marL'),\n right: read('marR'),\n top: read('marT'),\n bottom: read('marB'),\n };\n};\n\n/**\n * Sets the cell's inset margins (`<a:tcPr marL marR marT marB>`) in\n * EMU. Sides set to `null` are stripped from the XML so they fall back\n * to PowerPoint's defaults. Creates `<a:tcPr>` if absent.\n *\n * Pass `null` for the whole `margins` arg to drop every authored side\n * at once.\n */\nexport const setTableCellMargins = (\n cell: TableCellData,\n margins: {\n left?: number | null;\n right?: number | null;\n top?: number | null;\n bottom?: number | null;\n } | null,\n): void => {\n const tcPr = ensureCellTcPr(cell);\n const MAR_ATTRS = new Set(['marL', 'marR', 'marT', 'marB']);\n tcPr.attrs = tcPr.attrs.filter(\n (a) => !(a.name.namespaceURI === '' && MAR_ATTRS.has(a.name.localName)),\n );\n if (margins !== null) {\n const pairs: ReadonlyArray<['marL' | 'marR' | 'marT' | 'marB', number | null | undefined]> = [\n ['marL', margins.left],\n ['marR', margins.right],\n ['marT', margins.top],\n ['marB', margins.bottom],\n ];\n for (const [name, val] of pairs) {\n if (val !== null && val !== undefined) {\n const emu = emuCoordinate32(val, `setTableCellMargins: ${name}`);\n tcPr.attrs.push(attr(qname('', name, ''), String(emu)));\n }\n }\n }\n commitTableCell(cell);\n};\n\n/** Reads the cell's plain text (paragraphs joined with `\\n`). */\nexport const getTableCellText = (cell: TableCellData): string => {\n const txBody = firstChildElement(cell[CELL_ELEMENT], NAME_A_TX_BODY_TBL);\n if (!txBody) return '';\n const lines: string[] = [];\n for (const p of txBody.children) {\n if (p.kind !== 'element' || p.name.namespaceURI !== NS.dml || p.name.localName !== 'p')\n continue;\n let line = '';\n for (const r of p.children) {\n if (r.kind !== 'element' || r.name.namespaceURI !== NS.dml || r.name.localName !== 'r')\n continue;\n const tEl = firstChildElement(r, qname('a', 't', NS.dml));\n if (!tEl) continue;\n for (const child of tEl.children) {\n if (child.kind === 'text' || child.kind === 'cdata') line += child.data;\n }\n }\n lines.push(line);\n }\n return lines.join('\\n');\n};\n\n/** One paragraph of a cell's text, with its alignment and inline elements. */\nexport interface TableCellParagraph {\n /**\n * Horizontal alignment from `<a:pPr algn>`, or `null` when unset (the\n * cell then inherits PowerPoint's left default).\n */\n readonly align: ParagraphAlignment | null;\n /** Runs / fields / breaks in document order, with their literal `<a:rPr>` format. */\n readonly elements: ReadonlyArray<ShapeParagraphElement>;\n}\n\n/**\n * Reads a cell's text as structured paragraphs — each carrying its\n * alignment and per-run format (`size`, `bold`, `italic`, `color`,\n * `font`, …) — for renderers that need to reproduce styled cell text.\n * `getTableCellText` is the flat-string counterpart when only the visible\n * characters matter. Returns an empty array when the cell has no\n * `<a:txBody>`.\n *\n * The cell's `<a:txBody>` uses the same DrawingML paragraph grammar as a\n * shape's, so this shares `readParagraphElements` with\n * `getShapeParagraphElements`. Table-style and theme-level defaults are not\n * folded in here: explicit run properties win, and absent ones are left\n * `undefined` for the caller to resolve.\n */\nexport const getTableCellParagraphs = (cell: TableCellData): ReadonlyArray<TableCellParagraph> => {\n const txBody = firstChildElement(cell[CELL_ELEMENT], NAME_A_TX_BODY_TBL);\n if (!txBody) return [];\n const out: TableCellParagraph[] = [];\n for (const p of txBody.children) {\n if (p.kind !== 'element' || p.name.namespaceURI !== NS.dml || p.name.localName !== 'p')\n continue;\n const pPr = firstChildElement(p, qname('a', 'pPr', NS.dml));\n const algn = pPr ? getAttrValue(pPr, qname('', 'algn', '')) : null;\n // Normalise the raw OOXML token (`ctr`, `l`, …) to the friendly form the\n // rest of the API uses, mirroring the shape-text alignment cascade. A\n // token outside the map is malformed input and reads as unset.\n const align: ParagraphAlignment | null = algn !== null ? (ALIGN_TOKEN_MAP[algn] ?? null) : null;\n out.push({ align, elements: readParagraphElements(p) });\n }\n return out;\n};\n\n/** Sets a solid background color on a cell (`<a:tcPr><a:solidFill>`). */\nexport const setTableCellFill = (cell: TableCellData, color: string): void => {\n const tcPr = ensureCellTcPr(cell);\n setSolidFill(tcPr, color);\n commitTableCell(cell);\n};\n\n/** Removes any background fill from a cell. */\nexport const clearTableCellFill = (cell: TableCellData): void => {\n const tcPr = ensureCellTcPr(cell);\n clearFillImpl(tcPr);\n commitTableCell(cell);\n};\n\n/**\n * Reads the cell's solid background color. Returns `#RRGGBB` for\n * `<a:srgbClr>`, `scheme:<token>` for `<a:schemeClr>`, or `null` when\n * the cell has no fill, no `<a:tcPr>`, or the fill is non-solid\n * (gradient / pattern / image).\n */\nexport const getTableCellFill = (cell: TableCellData): string | null => {\n const tcPr = firstChildElement(cell[CELL_ELEMENT], NAME_A_TC_PR);\n if (!tcPr) return null;\n const solid = firstChildElement(tcPr, qname('a', 'solidFill', NS.dml));\n if (!solid) return null;\n const srgb = firstChildElement(solid, qname('a', 'srgbClr', NS.dml));\n if (srgb) {\n const v = getAttrValue(srgb, qname('', 'val', ''));\n if (v) return `#${v.toUpperCase()}`;\n }\n const scheme = firstChildElement(solid, qname('a', 'schemeClr', NS.dml));\n if (scheme) {\n const v = getAttrValue(scheme, qname('', 'val', ''));\n if (v) return `scheme:${v}`;\n }\n return null;\n};\n\n/** Applies a TextFormat to every run in the cell's text. */\nexport const setTableCellTextFormat = (cell: TableCellData, format: TextFormat): void => {\n const txBody = ensureCellTxBody(cell);\n applyFormatToAllRuns(txBody, format);\n commitTableCell(cell);\n};\n\n/** Sets horizontal alignment on every paragraph in the cell. */\nexport const setTableCellAlignment = (cell: TableCellData, align: ParagraphAlignment): void => {\n const txBody = ensureCellTxBody(cell);\n applyAlignmentToAllParagraphs(txBody, align);\n commitTableCell(cell);\n};\n\n/** Zero-based (row, col) of the cell. */\nexport const getTableCellPosition = (cell: TableCellData): { row: number; col: number } => ({\n row: cell[CELL_ROW],\n col: cell[CELL_COL],\n});\n\n/**\n * Reads the horizontal alignment from the cell's first paragraph\n * (`l`, `ctr`, `r`, `just`, `dist`, `justLow`, `thaiDist`). Returns\n * `null` when the cell has no `<a:txBody>` or its first paragraph\n * has no explicit `algn` attribute (PowerPoint then defaults to `l`).\n */\nexport const getTableCellAlignment = (cell: TableCellData): ParagraphAlignment | null => {\n const txBody = firstChildElement(cell[CELL_ELEMENT], NAME_A_TX_BODY_TBL);\n if (!txBody) return null;\n for (const p of txBody.children) {\n if (p.kind !== 'element' || p.name.namespaceURI !== NS.dml || p.name.localName !== 'p')\n continue;\n const pPr = firstChildElement(p, qname('a', 'pPr', NS.dml));\n if (!pPr) return null;\n const v = getAttrValue(pPr, qname('', 'algn', ''));\n return (v as ParagraphAlignment | null) ?? null;\n }\n return null;\n};\n\nconst requireTbl = (table: SlideShapeData): XmlElement => {\n const tbl = findTblElement(table);\n if (!tbl) throw new Error('table shape is not a table graphic frame');\n return tbl;\n};\n\nconst tableColumnCount = (tbl: XmlElement): number => {\n const grid = firstChildElement(tbl, qname('a', 'tblGrid', NS.dml));\n if (!grid) return 0;\n return allChildElements(grid, NAME_A_GRID_COL).length;\n};\n\nconst rowDefaultHeight = (tbl: XmlElement): number => {\n // Use the average height of existing rows, or 370000 (≈ 0.4in) as a\n // sane default when the table has no rows yet.\n const rows = tableRows(tbl);\n if (rows.length === 0) return 370000;\n let sum = 0;\n let count = 0;\n for (const r of rows) {\n const h = getAttrValue(r, ATTR_H_TBL);\n if (h !== null) {\n const n = Number.parseInt(h, 10);\n if (Number.isFinite(n)) {\n sum += n;\n count++;\n }\n }\n }\n return count > 0 ? Math.round(sum / count) : 370000;\n};\n\n/**\n * Inserts a row into the table. `atIndex` is 0-based; `undefined`\n * appends at the end. `cells` supplies cell values; missing cells\n * become blank, extras are dropped. The row's height matches the\n * average of existing rows (or a 0.4in default for empty tables).\n */\nexport const insertTableRow = (\n table: SlideShapeData,\n atIndex?: number,\n cells: ReadonlyArray<string> = [],\n): void => {\n const tbl = requireTbl(table);\n const colCount = tableColumnCount(tbl);\n const padded: string[] = [];\n for (let i = 0; i < colCount; i++) padded.push(cells[i] ?? '');\n const row = buildTableRow(padded, rowDefaultHeight(tbl));\n\n const rows = tableRows(tbl);\n const insertAt =\n atIndex !== undefined ? Math.max(0, Math.min(atIndex, rows.length)) : rows.length;\n if (insertAt === rows.length) {\n tbl.children.push(row);\n } else {\n const target = rows[insertAt]!;\n const idx = tbl.children.indexOf(target);\n tbl.children.splice(idx, 0, row);\n }\n commitSlideData(table[SHAPE_SLIDE]);\n refreshSlideData(table[SHAPE_SLIDE]);\n};\n\n/** Removes the row at `atIndex` from the table. Throws on out-of-range. */\nexport const removeTableRow = (table: SlideShapeData, atIndex: number): void => {\n const tbl = requireTbl(table);\n const rows = tableRows(tbl);\n if (atIndex < 0 || atIndex >= rows.length) {\n throw new RangeError(`removeTableRow: index ${atIndex} out of range (have ${rows.length})`);\n }\n const target = rows[atIndex]!;\n tbl.children = tbl.children.filter((c) => c !== target);\n commitSlideData(table[SHAPE_SLIDE]);\n refreshSlideData(table[SHAPE_SLIDE]);\n};\n\n/**\n * Inserts a column into the table. `atIndex` defaults to the end.\n * `widthEmu` defaults to the average of existing column widths (or\n * 914400 = 1in if the table has no columns). Existing rows get a new\n * blank cell at `atIndex`.\n */\nexport const insertTableColumn = (\n table: SlideShapeData,\n atIndex?: number,\n widthEmu?: number,\n): void => {\n const tbl = requireTbl(table);\n const grid = firstChildElement(tbl, qname('a', 'tblGrid', NS.dml));\n if (!grid) throw new Error('table is missing <a:tblGrid>');\n const cols = allChildElements(grid, NAME_A_GRID_COL);\n const insertAt =\n atIndex !== undefined ? Math.max(0, Math.min(atIndex, cols.length)) : cols.length;\n\n // Default width: average of existing widths.\n let defaultWidth = widthEmu;\n if (defaultWidth === undefined) {\n let sum = 0;\n let count = 0;\n for (const col of cols) {\n const w = getAttrValue(col, ATTR_W_TBL);\n if (w !== null) {\n const n = Number.parseInt(w, 10);\n if (Number.isFinite(n)) {\n sum += n;\n count++;\n }\n }\n }\n defaultWidth = count > 0 ? Math.round(sum / count) : 914400;\n }\n const newCol = elem(NAME_A_GRID_COL, { attrs: [attr(ATTR_W_TBL, String(defaultWidth))] });\n if (insertAt === cols.length) {\n grid.children.push(newCol);\n } else {\n const target = cols[insertAt]!;\n const idx = grid.children.indexOf(target);\n grid.children.splice(idx, 0, newCol);\n }\n\n // Add a blank <a:tc> at the same column index in every row.\n for (const tr of tableRows(tbl)) {\n const tcs = rowCells(tr);\n const newCell = buildTableCell('');\n if (insertAt >= tcs.length) {\n tr.children.push(newCell);\n } else {\n const target = tcs[insertAt]!;\n const idx = tr.children.indexOf(target);\n tr.children.splice(idx, 0, newCell);\n }\n }\n\n commitSlideData(table[SHAPE_SLIDE]);\n refreshSlideData(table[SHAPE_SLIDE]);\n};\n\n/** Removes the column at `atIndex` (and the corresponding cell in every row). */\nexport const removeTableColumn = (table: SlideShapeData, atIndex: number): void => {\n const tbl = requireTbl(table);\n const grid = firstChildElement(tbl, qname('a', 'tblGrid', NS.dml));\n if (!grid) throw new Error('table is missing <a:tblGrid>');\n const cols = allChildElements(grid, NAME_A_GRID_COL);\n if (atIndex < 0 || atIndex >= cols.length) {\n throw new RangeError(`removeTableColumn: index ${atIndex} out of range (have ${cols.length})`);\n }\n const targetCol = cols[atIndex]!;\n grid.children = grid.children.filter((c) => c !== targetCol);\n for (const tr of tableRows(tbl)) {\n const tcs = rowCells(tr);\n if (atIndex < tcs.length) {\n tr.children = tr.children.filter((c) => c !== tcs[atIndex]);\n }\n }\n commitSlideData(table[SHAPE_SLIDE]);\n refreshSlideData(table[SHAPE_SLIDE]);\n};\n","// Lightweight invariant validator.\n//\n// Scope: catch common authoring mistakes without depending on an XSD\n// engine. Runs in Node and the browser, so it's safe to expose as a\n// public free function in `fn.ts`. XSD-level validation lives in\n// `test/lib/expect-schema-valid.ts` and stays Node-only (xmllint\n// subprocess).\n//\n// What this catches today:\n//\n// - `/ppt/presentation.xml` or its `.rels` part missing.\n// - A `<p:sldId>` whose `r:id` has no matching rel.\n// - A slide rel whose target part is absent from the package.\n// - A slide that has no `slideLayout` rel.\n// - A slide layout that has no `slideMaster` rel.\n// - Duplicate `<p:sldId>` `id` or `r:id` within `<p:sldIdLst>`.\n//\n// What this doesn't catch (yet):\n//\n// - XSD-level structural problems (use the Layer-1 test path for that).\n// - Theme / colorMap consistency.\n// - Chart / xlsx round-trip integrity.\n// - PowerPoint-vs-spec quirks (handled by the planned quirks module).\n\nimport { type PartName, type Relationship, partName, resolveTarget } from '../opc/index.ts';\nimport type { OpcPackage } from '../parts/index.ts';\nimport { REL_TYPES } from '../presentationml/index.ts';\nimport {\n NS,\n allChildElements,\n firstChildElement,\n getAttrValue,\n parseXml,\n qname,\n} from '../xml/index.ts';\n\nconst PRES_PART = partName('/ppt/presentation.xml');\nconst PRES_RELS = partName('/ppt/_rels/presentation.xml.rels');\n\nconst NAME_SLD_ID_LST = qname('p', 'sldIdLst', NS.pml);\nconst NAME_SLD_ID = qname('p', 'sldId', NS.pml);\nconst ATTR_ID = qname('', 'id', '');\nconst ATTR_R_ID = qname('r', 'id', NS.officeDocRels);\n\nexport type IssueSeverity = 'error' | 'warning';\n\nexport interface ValidationIssue {\n readonly severity: IssueSeverity;\n readonly message: string;\n readonly partName?: PartName;\n}\n\nconst decoder = new TextDecoder();\n\nconst decode = (b: Uint8Array): string => decoder.decode(b);\n\nconst targetPartName = (sourcePart: PartName, rel: Relationship): PartName =>\n rel.target.startsWith('/') ? partName(rel.target) : resolveTarget(sourcePart, rel.target);\n\n/**\n * Runs every invariant check in this module against `pkg`. Returns a\n * list of issues; an empty list means the deck passes every check. The\n * function never throws — callers decide how to surface issues (some\n * may treat warnings as informational, others may want a strict gate).\n */\nexport const validatePresentationPackage = (pkg: OpcPackage): ValidationIssue[] => {\n const issues: ValidationIssue[] = [];\n\n const presPart = pkg.getPart(PRES_PART);\n if (!presPart) {\n issues.push({\n severity: 'error',\n message: '/ppt/presentation.xml is missing',\n partName: PRES_PART,\n });\n return issues;\n }\n const presRels = pkg.getRels(PRES_PART);\n if (!presRels) {\n issues.push({\n severity: 'error',\n message: '/ppt/presentation.xml has no .rels part',\n partName: PRES_RELS,\n });\n return issues;\n }\n\n let presDocRoot: ReturnType<typeof parseXml>['root'];\n try {\n presDocRoot = parseXml(decode(presPart.data)).root;\n } catch (e) {\n issues.push({\n severity: 'error',\n message: `presentation.xml failed to parse: ${(e as Error).message}`,\n partName: PRES_PART,\n });\n return issues;\n }\n\n // Walk <p:sldIdLst> for duplicate id / r:id collisions and resolve\n // every slide reference back into a real part.\n const sldIdLst = firstChildElement(presDocRoot, NAME_SLD_ID_LST);\n const seenIds = new Set<string>();\n const seenRIds = new Set<string>();\n const slidePartNames: PartName[] = [];\n\n if (sldIdLst !== null) {\n for (const sldId of allChildElements(sldIdLst, NAME_SLD_ID)) {\n const idRaw = getAttrValue(sldId, ATTR_ID);\n const rIdRaw = getAttrValue(sldId, ATTR_R_ID);\n if (idRaw === null) {\n issues.push({\n severity: 'error',\n message: '<p:sldId> missing id attribute',\n partName: PRES_PART,\n });\n continue;\n }\n if (rIdRaw === null) {\n issues.push({\n severity: 'error',\n message: `<p:sldId id=\"${idRaw}\"> missing r:id`,\n partName: PRES_PART,\n });\n continue;\n }\n if (seenIds.has(idRaw)) {\n issues.push({\n severity: 'error',\n message: `duplicate <p:sldId id=\"${idRaw}\">`,\n partName: PRES_PART,\n });\n } else {\n seenIds.add(idRaw);\n }\n if (seenRIds.has(rIdRaw)) {\n issues.push({\n severity: 'error',\n message: `duplicate r:id=\"${rIdRaw}\" in <p:sldIdLst>`,\n partName: PRES_PART,\n });\n } else {\n seenRIds.add(rIdRaw);\n }\n\n const rel = presRels.items.find((r) => r.id === rIdRaw);\n if (!rel) {\n issues.push({\n severity: 'error',\n message: `<p:sldId r:id=\"${rIdRaw}\"> has no matching rel`,\n partName: PRES_PART,\n });\n continue;\n }\n const slidePartName = targetPartName(PRES_PART, rel);\n if (pkg.getPart(slidePartName) === null) {\n issues.push({\n severity: 'error',\n message: `slide rel target ${slidePartName} not in package`,\n partName: slidePartName,\n });\n continue;\n }\n slidePartNames.push(slidePartName);\n }\n }\n\n // Each slide must have a layout rel; each layout a master rel.\n for (const slideName of slidePartNames) {\n const slideRels = pkg.getRels(slideName);\n if (!slideRels) {\n issues.push({\n severity: 'warning',\n message: `slide ${slideName} has no .rels part`,\n partName: slideName,\n });\n continue;\n }\n const layoutRel = slideRels.items.find((r) => r.type === REL_TYPES.slideLayout);\n if (!layoutRel) {\n issues.push({\n severity: 'error',\n message: `slide ${slideName} is missing a slideLayout rel`,\n partName: slideName,\n });\n continue;\n }\n const layoutName = targetPartName(slideName, layoutRel);\n if (pkg.getPart(layoutName) === null) {\n issues.push({\n severity: 'error',\n message: `slide ${slideName} references missing layout ${layoutName}`,\n partName: slideName,\n });\n continue;\n }\n const layoutRels = pkg.getRels(layoutName);\n if (!layoutRels) {\n issues.push({\n severity: 'warning',\n message: `slide layout ${layoutName} has no .rels part`,\n partName: layoutName,\n });\n continue;\n }\n const masterRel = layoutRels.items.find((r) => r.type === REL_TYPES.slideMaster);\n if (!masterRel) {\n issues.push({\n severity: 'error',\n message: `slide layout ${layoutName} is missing a slideMaster rel`,\n partName: layoutName,\n });\n continue;\n }\n const masterName = targetPartName(layoutName, masterRel);\n if (pkg.getPart(masterName) === null) {\n issues.push({\n severity: 'error',\n message: `slide layout ${layoutName} references missing master ${masterName}`,\n partName: layoutName,\n });\n }\n\n // Dangling media / chart / hyperlink rels.\n for (const rel of slideRels.items) {\n if (rel.targetMode === 'External') continue;\n if (\n rel.type !== REL_TYPES.image &&\n rel.type !== REL_TYPES.chart &&\n rel.type !== REL_TYPES.notesSlide &&\n rel.type !== REL_TYPES.comments &&\n rel.type !== REL_TYPES.oleObject &&\n rel.type !== REL_TYPES.package\n ) {\n continue;\n }\n const targetName = targetPartName(slideName, rel);\n if (pkg.getPart(targetName) === null) {\n issues.push({\n severity: 'error',\n message: `slide ${slideName} has dangling ${rel.type.split('/').pop()} rel → ${targetName}`,\n partName: slideName,\n });\n }\n }\n }\n\n // Per-slide: duplicate `<p:cNvPr id=\"N\">` collisions inside\n // `<p:spTree>`. PowerPoint requires every shape's non-visual ID to be\n // unique within the slide; duplicates often appear when callers paste\n // shapes from another slide without re-allocating IDs.\n for (const slideName of slidePartNames) {\n const slidePart = pkg.getPart(slideName);\n if (!slidePart) continue;\n let slideRoot: ReturnType<typeof parseXml>['root'];\n try {\n slideRoot = parseXml(decode(slidePart.data)).root;\n } catch {\n // Parse failure on the slide itself is surfaced by other checks\n // upstream; skip here.\n continue;\n }\n const cSld = firstChildElement(slideRoot, qname('p', 'cSld', NS.pml));\n if (!cSld) continue;\n const spTree = firstChildElement(cSld, qname('p', 'spTree', NS.pml));\n if (!spTree) continue;\n const seenShapeIds = new Map<string, number>();\n const walk = (host: ReturnType<typeof parseXml>['root']): void => {\n for (const child of host.children) {\n if (child.kind !== 'element') continue;\n if (child.name.namespaceURI === NS.pml && child.name.localName === 'grpSp') {\n // Group shapes nest <p:sp> children; recurse so duplicates\n // inside groups don't slip past the check.\n walk(child);\n continue;\n }\n const nvHost =\n firstChildElement(child, qname('p', 'nvSpPr', NS.pml)) ??\n firstChildElement(child, qname('p', 'nvPicPr', NS.pml)) ??\n firstChildElement(child, qname('p', 'nvCxnSpPr', NS.pml)) ??\n firstChildElement(child, qname('p', 'nvGrpSpPr', NS.pml)) ??\n firstChildElement(child, qname('p', 'nvGraphicFramePr', NS.pml));\n if (!nvHost) continue;\n const cNvPr = firstChildElement(nvHost, qname('p', 'cNvPr', NS.pml));\n if (!cNvPr) continue;\n const id = getAttrValue(cNvPr, ATTR_ID);\n if (id === null) continue;\n seenShapeIds.set(id, (seenShapeIds.get(id) ?? 0) + 1);\n }\n };\n walk(spTree);\n for (const [id, count] of seenShapeIds) {\n if (count > 1) {\n issues.push({\n severity: 'error',\n message: `duplicate shape id=\"${id}\" appears ${count}× in slide ${slideName}`,\n partName: slideName,\n });\n }\n }\n }\n\n // Chart parts must resolve to their embedded xlsx workbooks.\n for (const part of pkg.parts) {\n if (part.contentType !== 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml') {\n continue;\n }\n const chartRels = pkg.getRels(part.name);\n if (!chartRels) {\n issues.push({\n severity: 'warning',\n message: `chart part ${part.name} has no .rels`,\n partName: part.name,\n });\n continue;\n }\n const xlsxRel = chartRels.items.find((r) => r.type === REL_TYPES.package);\n if (xlsxRel) {\n const xlsxName = targetPartName(part.name, xlsxRel);\n if (pkg.getPart(xlsxName) === null) {\n issues.push({\n severity: 'error',\n message: `chart ${part.name} references missing embedded workbook ${xlsxName}`,\n partName: part.name,\n });\n }\n }\n }\n\n return issues;\n};\n","// Package validation.\n\nimport {\n type IssueSeverity,\n type ValidationIssue,\n validatePresentationPackage,\n} from '../../internal/validator/index.ts';\nimport { INTERNAL_PACKAGE, type PresentationData } from '../_internal-symbols.ts';\n// ---------------------------------------------------------------------------\n// Validator.\n\nexport type { IssueSeverity, ValidationIssue };\n\n/**\n * Runs a set of lightweight invariant checks on the package and\n * returns the list of issues found. An empty array means the deck\n * passes every check.\n *\n * Catches the common authoring mistakes — missing presentation.xml,\n * dangling slide rels, slides without a layout, etc. — without\n * depending on a heavyweight XSD engine, so it runs identically in\n * Node and the browser.\n *\n * Use it as a pre-save sanity check, especially after orchestrating\n * lots of mutations against the same package. Higher-fidelity XSD\n * validation lives in the test harness (Layer 1) and stays Node-only.\n */\nexport const validatePresentation = (pres: PresentationData): ReadonlyArray<ValidationIssue> =>\n validatePresentationPackage(pres[INTERNAL_PACKAGE]);\n","// Package introspection escape hatches.\nimport { getSlides, isSlideHidden } from './slide-query.ts';\n\nimport { partName } from '../../internal/opc/index.ts';\nimport type { OpcPackage } from '../../internal/parts/index.ts';\nimport { type ShapeKind } from '../../internal/presentationml/index.ts';\nimport { NS } from '../../internal/xml/index.ts';\nimport {\n INTERNAL_PACKAGE,\n type PresentationData,\n SHAPE_SNAPSHOT,\n SLIDE_DOCUMENT,\n SLIDE_PART_NAME,\n SLIDE_SHAPES,\n type SlideData,\n} from '../_internal-symbols.ts';\nimport { getPresentationTheme } from './theme.ts';\nimport { getSlideLayouts } from './layouts.ts';\nimport { getSlideSections } from './sections.ts';\n\n// ---------------------------------------------------------------------------\n// Package introspection escape hatches.\n//\n// `_internalPackageOf` is the heavy escape hatch for hot-path power\n// users; these two helpers cover the 80% case (just enumerate parts\n// or read a single part's bytes) without exposing the OpcPackage\n// class.\n\n/**\n * Power-user escape hatch. Returns the underlying `OpcPackage`\n * backing `pres`. Use this when you need to manipulate parts /\n * rels directly. Most callers should use the typed helpers above\n * (`listPackageParts`, `readPackagePart`, `getMediaParts`, etc.).\n *\n * @internal — used by `pptx-kit/node` to mount fs-backed helpers.\n */\nexport const _internalPackageOf = (pres: PresentationData): OpcPackage => pres[INTERNAL_PACKAGE];\n\n/** One entry in the package's parts list. */\nexport interface PackagePartInfo {\n readonly name: string;\n readonly contentType: string;\n readonly byteLength: number;\n}\n\n/**\n * Enumerates every OPC part in the package. Useful for advanced\n * inspection (e.g. \"what parts does this template carry?\") without\n * dropping to `_internalPackageOf`.\n */\nexport const listPackageParts = (pres: PresentationData): ReadonlyArray<PackagePartInfo> =>\n pres[INTERNAL_PACKAGE].parts.map((p) => ({\n name: p.name,\n contentType: p.contentType,\n byteLength: p.data.byteLength,\n }));\n\n/**\n * Reads a single OPC part's bytes by part name (e.g.\n * `'/ppt/slides/slide1.xml'`). Returns `null` when no such part\n * exists. The returned `Uint8Array` is a live view into the\n * package — DO NOT mutate it. Use this for read-only inspection\n * (e.g. parsing custom extension parts).\n */\nexport const readPackagePart = (pres: PresentationData, name: string): Uint8Array | null => {\n // OPC part names compare case-insensitively (ECMA-376 Part 2 §9.1.1), and\n // OpcPackage.getPart already honors that — match it so a caller passing\n // `/ppt/Media/Image1.PNG` resolves the same part the package stores.\n const target = name.toLowerCase();\n const part = pres[INTERNAL_PACKAGE].parts.find((p) => p.name.toLowerCase() === target);\n return part?.data ?? null;\n};\n\n/** A media (image / video / audio) part embedded in the package. */\nexport interface MediaPart {\n readonly name: string;\n readonly contentType: string;\n readonly data: Uint8Array;\n}\n\n/**\n * Returns the total size of the package's parts in bytes\n * (uncompressed). Useful for storage estimation, quota checks,\n * and \"how big is this deck before save?\" diagnostics. The\n * actual `savePresentation` output is typically smaller after\n * DEFLATE; this is an upper bound.\n */\nexport const getPackageSize = (pres: PresentationData): number => {\n let total = 0;\n for (const part of pres[INTERNAL_PACKAGE].parts) total += part.data.byteLength;\n return total;\n};\n\n/**\n * Returns every `/ppt/media/...` part in the package. Useful for\n * audit / export workflows — e.g. \"extract every embedded image.\"\n */\nexport const getMediaParts = (pres: PresentationData): ReadonlyArray<MediaPart> => {\n const out: MediaPart[] = [];\n for (const p of pres[INTERNAL_PACKAGE].parts) {\n if (p.name.startsWith('/ppt/media/')) {\n out.push({ name: p.name, contentType: p.contentType, data: p.data });\n }\n }\n return out;\n};\n\n/**\n * Returns every media part NOT referenced by any rels in the\n * package — the set `compactPackage` would remove. Non-destructive;\n * the caller decides whether to delete.\n *\n * Useful for audit UIs that want to surface bloat before cleaning,\n * and for \"is this asset still used?\" checks.\n */\nexport const getOrphanMediaPartNames = (pres: PresentationData): ReadonlyArray<string> => {\n const pkg = pres[INTERNAL_PACKAGE];\n const referenced = new Set<string>();\n const resolve = (sourcePart: string, target: string): string => {\n if (target.startsWith('/')) return target;\n const dir = sourcePart.split('/').slice(0, -1);\n const segments: string[] = [];\n for (const seg of [...dir, ...target.split('/')]) {\n if (seg === '..') segments.pop();\n else if (seg !== '.' && seg.length > 0) segments.push(seg);\n }\n return `/${segments.join('/')}`;\n };\n for (const part of pkg.parts) {\n if (!part.name.endsWith('.rels')) continue;\n // /ppt/slides/_rels/slide1.xml.rels → /ppt/slides/slide1.xml\n const m = part.name.match(/^(.*)\\/_rels\\/(.+)\\.rels$/);\n let sourceName: string;\n if (part.name === '/_rels/.rels') {\n sourceName = '/';\n } else if (m) {\n sourceName = `${m[1]}/${m[2]}`;\n } else {\n continue;\n }\n const sourceRels = sourceName === '/' ? pkg.rootRels() : pkg.getRels(sourceName as never);\n if (!sourceRels) continue;\n for (const rel of sourceRels.items) {\n if (rel.targetMode === 'External') continue;\n // Lowercase keys: OPC part names compare case-insensitively, so a rel\n // target whose case differs from the media part name still counts as a\n // reference (otherwise a referenced image is wrongly reported as orphan /\n // deleted by compactPackage).\n referenced.add(resolve(sourceName, rel.target).toLowerCase());\n }\n }\n const out: string[] = [];\n for (const part of pkg.parts) {\n if (!part.name.startsWith('/ppt/media/')) continue;\n if (!referenced.has(part.name.toLowerCase())) out.push(part.name);\n }\n return out;\n};\n\n/**\n * Returns every media part name the slide's rels reference\n * (typically `/ppt/media/imageN.ext`). Walks the slide's rels\n * graph and resolves each internal target. Useful for \"which\n * media files does this slide depend on?\" audits.\n */\nexport const getSlideMediaPartNames = (slide: SlideData): ReadonlyArray<string> => {\n const pkg = slide[INTERNAL_PACKAGE];\n const rels = pkg.getRels(slide[SLIDE_PART_NAME]);\n if (!rels) return [];\n const resolve = (sourcePart: string, target: string): string => {\n if (target.startsWith('/')) return target;\n const dir = sourcePart.split('/').slice(0, -1);\n const segments: string[] = [];\n for (const seg of [...dir, ...target.split('/')]) {\n if (seg === '..') segments.pop();\n else if (seg !== '.' && seg.length > 0) segments.push(seg);\n }\n return `/${segments.join('/')}`;\n };\n const out: string[] = [];\n const seen = new Set<string>();\n for (const rel of rels.items) {\n if (rel.targetMode === 'External') continue;\n const resolved = resolve(slide[SLIDE_PART_NAME], rel.target);\n if (!resolved.startsWith('/ppt/media/')) continue;\n if (seen.has(resolved)) continue;\n seen.add(resolved);\n out.push(resolved);\n }\n return out;\n};\n\n/**\n * Returns every slide that references the given media part name\n * (typically `/ppt/media/imageN.ext`). Walks each slide's rels and\n * checks whether any internal rel resolves to `mediaPartName`.\n *\n * Useful for image-audit workflows: \"before I replace this image,\n * which slides will the change affect?\"\n */\nexport const slidesUsingMediaPart = (\n pres: PresentationData,\n mediaPartName: string,\n): ReadonlyArray<SlideData> => {\n const pkg = pres[INTERNAL_PACKAGE];\n const resolve = (sourcePart: string, target: string): string => {\n if (target.startsWith('/')) return target;\n const dir = sourcePart.split('/').slice(0, -1);\n const segments: string[] = [];\n for (const seg of [...dir, ...target.split('/')]) {\n if (seg === '..') segments.pop();\n else if (seg !== '.' && seg.length > 0) segments.push(seg);\n }\n return `/${segments.join('/')}`;\n };\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n const rels = pkg.getRels(slide[SLIDE_PART_NAME]);\n if (!rels) continue;\n const hit = rels.items.some(\n (r) =>\n r.targetMode !== 'External' && resolve(slide[SLIDE_PART_NAME], r.target) === mediaPartName,\n );\n if (hit) out.push(slide);\n }\n return out;\n};\n\n/**\n * Removes media parts that no rels graph references. Returns the\n * list of removed part names. Useful after a sequence of slide\n * removals leaves orphan images behind.\n *\n * Only `/ppt/media/...` parts are considered. The check walks every\n * `.rels` part in the package and resolves each internal rel target\n * against its source part name to build the live media set.\n */\nexport const compactPackage = (\n pres: PresentationData,\n): { readonly removed: ReadonlyArray<string> } => {\n const pkg = pres[INTERNAL_PACKAGE];\n const referenced = new Set<string>();\n\n const resolve = (sourcePart: string, target: string): string => {\n if (target.startsWith('/')) return target;\n const dir = sourcePart.split('/').slice(0, -1);\n const segments: string[] = [];\n for (const seg of [...dir, ...target.split('/')]) {\n if (seg === '..') segments.pop();\n else if (seg !== '.' && seg.length > 0) segments.push(seg);\n }\n return `/${segments.join('/')}`;\n };\n\n for (const part of pkg.parts) {\n if (!part.name.endsWith('.rels')) continue;\n // /ppt/slides/_rels/slide1.xml.rels → /ppt/slides/slide1.xml\n // /_rels/.rels → / (package root)\n let sourceName = part.name.replace('/_rels/', '/').replace(/\\.rels$/, '');\n if (sourceName === '/' || sourceName === '') {\n // Root rels — `rel.target` is relative to the package root.\n // We don't need to consult pkg.getRels for it (the only thing it\n // points at that we care about is the presentation.xml, which\n // has its own rels we'll walk). Just parse the part data\n // directly for completeness.\n sourceName = '/';\n }\n const rels = sourceName === '/' ? null : pkg.getRels(partName(sourceName));\n if (!rels) continue;\n for (const rel of rels.items) {\n if (rel.targetMode === 'External') continue;\n // Lowercase keys: OPC part names compare case-insensitively, so a rel\n // target whose case differs from the media part name still counts as a\n // reference (otherwise a referenced image is wrongly reported as orphan /\n // deleted by compactPackage).\n referenced.add(resolve(sourceName, rel.target).toLowerCase());\n }\n }\n\n const removed: string[] = [];\n const orphans: string[] = [];\n for (const part of pkg.parts) {\n if (!part.name.startsWith('/ppt/media/')) continue;\n if (!referenced.has(part.name.toLowerCase())) orphans.push(part.name);\n }\n for (const name of orphans) {\n pkg.removePart(partName(name));\n removed.push(name);\n }\n return { removed };\n};\n\n/**\n * Replaces the bytes of a media part in place. Returns `true` if the\n * part was found and updated, `false` otherwise. The content type is\n * preserved.\n *\n * Useful for the \"swap every instance of this logo\" workflow — pick\n * the right `partName` via `getMediaParts` and call this once. Every\n * `<a:blip r:embed=\"…\"/>` reference is unaffected because the rels\n * already point at this part name.\n */\nexport const setMediaPartBytes = (\n pres: PresentationData,\n partName: string,\n bytes: Uint8Array,\n): boolean => {\n // Case-insensitive match, consistent with OPC part-name semantics and\n // OpcPackage.getPart (see readPackagePart).\n const target = partName.toLowerCase();\n const part = pres[INTERNAL_PACKAGE].parts.find((p) => p.name.toLowerCase() === target);\n if (!part) return false;\n part.data = bytes;\n return true;\n};\n\n/**\n * High-level snapshot of the presentation's structure. Useful as a\n * diagnostic checklist when debugging a template or generating audit\n * reports. The numbers reflect what's reachable through the typed\n * API on the current package state.\n */\nexport interface PresentationSummary {\n readonly slideCount: number;\n readonly hiddenSlideCount: number;\n readonly totalShapes: number;\n readonly shapesByKind: Readonly<Record<ShapeKind, number>>;\n readonly layoutCount: number;\n readonly sectionCount: number;\n readonly partCount: number;\n readonly hasCharts: boolean;\n readonly hasComments: boolean;\n readonly hasAnimations: boolean;\n readonly themeName: string | null;\n}\n\nconst CHART_CONTENT_TYPE_FN = 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml';\nconst COMMENTS_CONTENT_TYPE_FN =\n 'application/vnd.openxmlformats-officedocument.presentationml.comments+xml';\n\nexport const getPresentationSummary = (pres: PresentationData): PresentationSummary => {\n const pkg = pres[INTERNAL_PACKAGE];\n const slides = getSlides(pres);\n let hiddenSlideCount = 0;\n let totalShapes = 0;\n const shapesByKind: Record<ShapeKind, number> = {\n shape: 0,\n picture: 0,\n group: 0,\n graphicFrame: 0,\n connector: 0,\n };\n let hasAnimations = false;\n for (const slide of slides) {\n if (isSlideHidden(slide)) hiddenSlideCount++;\n for (const s of slide[SLIDE_SHAPES]) {\n totalShapes++;\n shapesByKind[s[SHAPE_SNAPSHOT].kind]++;\n }\n // <p:timing> presence = at least one animation.\n if (\n !hasAnimations &&\n slide[SLIDE_DOCUMENT].root.children.some(\n (c) =>\n c.kind === 'element' && c.name.namespaceURI === NS.pml && c.name.localName === 'timing',\n )\n ) {\n hasAnimations = true;\n }\n }\n\n const hasCharts = pkg.parts.some((p) => p.contentType === CHART_CONTENT_TYPE_FN);\n const hasComments = pkg.parts.some((p) => p.contentType === COMMENTS_CONTENT_TYPE_FN);\n const theme = getPresentationTheme(pres);\n\n return {\n slideCount: slides.length,\n hiddenSlideCount,\n totalShapes,\n shapesByKind,\n layoutCount: getSlideLayouts(pres).length,\n sectionCount: getSlideSections(pres).length,\n partCount: pkg.parts.length,\n hasCharts,\n hasComments,\n hasAnimations,\n themeName: theme?.name ?? null,\n };\n};\n","// Slide transitions.\n\nimport { NS, type XmlElement, getAttrValue, qname } from '../../internal/xml/index.ts';\nimport { type TransitionOptions, buildTransition } from '../../internal/presentationml/index.ts';\nimport { SLIDE_DOCUMENT, type SlideData } from '../_internal-symbols.ts';\nimport { commitSlideData, refreshSlideData } from './_helpers.ts';\n\nconst removeTransition = (slide: SlideData): void => {\n slide[SLIDE_DOCUMENT].root.children = slide[SLIDE_DOCUMENT].root.children.filter(\n (c) =>\n !(\n c.kind === 'element' &&\n c.name.namespaceURI === NS.pml &&\n c.name.localName === 'transition'\n ),\n );\n};\n\nconst insertAfterClrMapOvr = (slide: SlideData, t: XmlElement): void => {\n const children = slide[SLIDE_DOCUMENT].root.children;\n let insertAt = children.length;\n for (let i = 0; i < children.length; i++) {\n const c = children[i];\n if (c?.kind !== 'element' || c.name.namespaceURI !== NS.pml) continue;\n if (c.name.localName === 'clrMapOvr') {\n insertAt = i + 1;\n } else if (c.name.localName === 'cSld' && insertAt === children.length) {\n insertAt = i + 1;\n }\n }\n children.splice(insertAt, 0, t);\n};\n\n/**\n * Reads back the slide's current transition (or `null` if no\n * `<p:transition>` is present). The returned shape mirrors what\n * `setSlideTransition` accepts.\n */\nexport const getSlideTransition = (slide: SlideData): TransitionOptions | null => {\n const transition = slide[SLIDE_DOCUMENT].root.children.find(\n (c): c is XmlElement =>\n c.kind === 'element' && c.name.namespaceURI === NS.pml && c.name.localName === 'transition',\n );\n if (!transition) return null;\n const speed = getAttrValue(transition, qname('', 'spd', '')) as 'slow' | 'med' | 'fast' | null;\n const advClick = getAttrValue(transition, qname('', 'advClick', ''));\n const advTm = getAttrValue(transition, qname('', 'advTm', ''));\n // First child element identifies the effect (`p:fade`, `p:wipe`, ...).\n let effect: string | null = null;\n let direction: string | null = null;\n let orientation: 'horz' | 'vert' | null = null;\n let thruBlack: boolean | undefined;\n for (const child of transition.children) {\n if (child.kind !== 'element' || child.name.namespaceURI !== NS.pml) continue;\n effect = child.name.localName;\n direction = getAttrValue(child, qname('', 'dir', ''));\n const o = getAttrValue(child, qname('', 'orient', ''));\n if (o === 'horz' || o === 'vert') orientation = o;\n const tb = getAttrValue(child, qname('', 'thruBlk', ''));\n if (tb !== null) thruBlack = tb === '1';\n break;\n }\n if (effect === null) return null;\n return {\n effect,\n ...(speed !== null ? { speed } : {}),\n ...(direction !== null ? { direction } : {}),\n ...(orientation !== null ? { orientation } : {}),\n ...(thruBlack !== undefined ? { thruBlack } : {}),\n ...(advClick !== null ? { advanceOnClick: advClick !== '0' } : {}),\n ...(advTm !== null ? { advanceAfterMs: Number.parseInt(advTm, 10) } : {}),\n };\n};\n\n/** Sets the slide's transition effect. */\nexport const setSlideTransition = (slide: SlideData, options: TransitionOptions): void => {\n removeTransition(slide);\n insertAfterClrMapOvr(slide, buildTransition(options));\n commitSlideData(slide);\n refreshSlideData(slide);\n};\n\n/** Removes any existing transition on the slide. */\nexport const clearSlideTransition = (slide: SlideData): void => {\n removeTransition(slide);\n commitSlideData(slide);\n refreshSlideData(slide);\n};\n","// Speaker notes and presentation-level aggregators.\n\nimport {\n type PartName,\n emptyRels,\n partName,\n relsPartNameFor,\n resolveTarget,\n} from '../../internal/opc/index.ts';\nimport { REL_TYPES, buildEmptyNotesSlide } from '../../internal/presentationml/index.ts';\nimport { NS, firstChildElement, parseXml, qname, serializeXml } from '../../internal/xml/index.ts';\nimport {\n INTERNAL_PACKAGE,\n type PresentationData,\n SLIDE_PART_NAME,\n SLIDE_SHAPES,\n type SlideCommentData,\n type SlideData,\n type SlideShapeData,\n} from '../_internal-symbols.ts';\nimport { NAME_CSLD, NAME_SP_TREE, decode, encode } from './_helpers.ts';\nimport { setTextBody } from '../../internal/drawingml/index.ts';\nimport { getSlides, isSlideHidden } from './slide-query.ts';\nimport { getShapeHyperlink, setShapeHyperlink } from './shapes.ts';\nimport {\n type SlideChartData,\n findOverlappingShapePairs,\n getSlideCharts,\n getSlideComments,\n hasShapeImage,\n isChartShape,\n isTableShape,\n} from './embedded.ts';\nimport type { ChartKind } from '../../internal/chartml/index.ts';\n\n// ---------------------------------------------------------------------------\n// Speaker notes.\n\nconst findNotesPartName = (slide: SlideData): PartName | null => {\n const rels = slide[INTERNAL_PACKAGE].getRels(slide[SLIDE_PART_NAME]);\n if (!rels) return null;\n const notesRel = rels.items.find((r) => r.type === REL_TYPES.notesSlide);\n if (!notesRel) return null;\n return notesRel.target.startsWith('/')\n ? partName(notesRel.target)\n : resolveTarget(slide[SLIDE_PART_NAME], notesRel.target);\n};\n\n/**\n * Returns the slide's speaker notes (`null` if none). Pulls plain text\n * from the `body` placeholder; multi-line notes use `\\n`.\n */\nexport const getSlideNotes = (slide: SlideData): string | null => {\n const notesPartName = findNotesPartName(slide);\n if (notesPartName === null) return null;\n const part = slide[INTERNAL_PACKAGE].getPart(notesPartName);\n if (part === null) return null;\n const root = parseXml(decode(part.data)).root;\n const cSld = firstChildElement(root, NAME_CSLD);\n if (!cSld) return null;\n const spTree = firstChildElement(cSld, NAME_SP_TREE);\n if (!spTree) return null;\n for (const child of spTree.children) {\n if (child.kind !== 'element' || child.name.namespaceURI !== NS.pml) continue;\n if (child.name.localName !== 'sp') continue;\n const nvSpPr = firstChildElement(child, qname('p', 'nvSpPr', NS.pml));\n if (!nvSpPr) continue;\n const nvPr = firstChildElement(nvSpPr, qname('p', 'nvPr', NS.pml));\n if (!nvPr) continue;\n const ph = firstChildElement(nvPr, qname('p', 'ph', NS.pml));\n if (!ph) continue;\n const txBody = firstChildElement(child, qname('p', 'txBody', NS.pml));\n if (!txBody) continue;\n const lines: string[] = [];\n for (const p of txBody.children) {\n if (p.kind !== 'element' || p.name.namespaceURI !== NS.dml || p.name.localName !== 'p') {\n continue;\n }\n let line = '';\n for (const r of p.children) {\n if (r.kind !== 'element' || r.name.namespaceURI !== NS.dml || r.name.localName !== 'r') {\n continue;\n }\n for (const tElement of r.children) {\n if (\n tElement.kind === 'element' &&\n tElement.name.namespaceURI === NS.dml &&\n tElement.name.localName === 't'\n ) {\n for (const tc of tElement.children) {\n if (tc.kind === 'text') line += tc.data;\n }\n }\n }\n }\n lines.push(line);\n }\n return lines.join('\\n');\n }\n return null;\n};\n\n/**\n * Sets the slide's speaker notes. Creates the `notesSlide` part and\n * wires up the rels (slide ↔ notesSlide ↔ notesMaster) on first call;\n * subsequent calls just replace the body placeholder text.\n */\n/**\n * Returns every slide whose `<p:sldId show=\"0\">` flag is set —\n * complement of `getVisibleSlides`. Useful for audit UIs and\n * batch-unhide operations.\n */\nexport const getHiddenSlides = (pres: PresentationData): ReadonlyArray<SlideData> => {\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n if (isSlideHidden(slide)) out.push(slide);\n }\n return out;\n};\n\n/**\n * Returns every slide in document order whose `<p:sldId show=\"0\">`\n * flag is *not* set. Convenience over `getSlides(pres).filter(s =>\n * !isSlideHidden(s))` — useful when an export pipeline needs to\n * skip hidden slides without touching the `show` attribute itself.\n */\nexport const getVisibleSlides = (pres: PresentationData): ReadonlyArray<SlideData> => {\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n if (!isSlideHidden(slide)) out.push(slide);\n }\n return out;\n};\n\n/**\n * Returns every slide carrying at least one chart graphic frame.\n * Built on `isChartShape`.\n */\nexport const getSlidesWithCharts = (pres: PresentationData): ReadonlyArray<SlideData> => {\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n if (slide[SLIDE_SHAPES].some((s) => isChartShape(s))) out.push(slide);\n }\n return out;\n};\n\n/**\n * Filters `getSlidesWithCharts` to slides carrying at least one chart\n * of the given `kind` (`'bar'`, `'column'`, `'line'`, `'pie'`,\n * `'doughnut'`, `'area'`). Reads each chart's spec via `getSlideCharts`\n * so the predicate respects what the renderers actually see.\n */\nexport const findSlidesWithChartKind = (\n pres: PresentationData,\n kind: ChartKind,\n): ReadonlyArray<SlideData> => {\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n for (const c of getSlideCharts(slide)) {\n if (c.spec?.kind === kind) {\n out.push(slide);\n break;\n }\n }\n }\n return out;\n};\n\n/**\n * Presentation-level version of `findChartsWithTrendlines`. Returns\n * every slide carrying at least one chart with a trendline on any\n * series. Useful for \"audit every trendline in this deck\" workflows\n * before publishing.\n */\nexport const findSlidesWithChartTrendlines = (pres: PresentationData): ReadonlyArray<SlideData> => {\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n for (const c of getSlideCharts(slide)) {\n if (c.spec === null) continue;\n if (c.spec.series.some((s) => s.trendline !== undefined)) {\n out.push(slide);\n break;\n }\n }\n }\n return out;\n};\n\n/**\n * Returns every slide where at least two shapes have overlapping\n * bounding boxes. Built on `findOverlappingShapePairs`. Useful for\n * deck-wide layout audits — surfacing slides that may have stacked\n * or accidentally-colliding content for human review.\n */\nexport const getSlidesWithOverlap = (pres: PresentationData): ReadonlyArray<SlideData> => {\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n if (findOverlappingShapePairs(slide).length > 0) out.push(slide);\n }\n return out;\n};\n\n/**\n * Returns every slide carrying at least one table graphic frame.\n * Built on `isTableShape`.\n */\nexport const getSlidesWithTables = (pres: PresentationData): ReadonlyArray<SlideData> => {\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n if (slide[SLIDE_SHAPES].some((s) => isTableShape(s))) out.push(slide);\n }\n return out;\n};\n\n/**\n * Returns every slide carrying at least one image-bearing shape\n * (a `<p:pic>` picture or a regular shape with `<a:blipFill>`).\n * Built on `hasShapeImage`.\n */\nexport const getSlidesWithImages = (pres: PresentationData): ReadonlyArray<SlideData> => {\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n if (slide[SLIDE_SHAPES].some((s) => hasShapeImage(s))) out.push(slide);\n }\n return out;\n};\n\n/**\n * Returns every slide that has at least one comment attached.\n * Convenience over `getSlides(pres).filter(s =>\n * getSlideComments(s).length > 0)`.\n */\nexport const getSlidesWithComments = (pres: PresentationData): ReadonlyArray<SlideData> => {\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n if (getSlideComments(slide).length > 0) out.push(slide);\n }\n return out;\n};\n\n/**\n * One entry per slide with non-empty notes, carrying its 0-based\n * slide index and the notes text. Useful for \"export speaker\n * notes to a separate document\" workflows that need both the\n * notes and the slide they belong to.\n */\nexport interface PresentationNotesEntry {\n readonly slideIndex: number;\n readonly notes: string;\n}\n\n/**\n * One entry per chart in the deck, carrying both the chart and the\n * 0-based slide it was attached to.\n */\nexport interface PresentationChartEntry {\n readonly slideIndex: number;\n readonly chart: SlideChartData;\n}\n\n/**\n * One entry per image-bearing shape in the deck, carrying the\n * shape (picture or image-filled) and the 0-based slide it lives\n * on. Sibling of `getAllCharts` / `getAllTables`.\n */\nexport interface PresentationImageEntry {\n readonly slideIndex: number;\n readonly shape: SlideShapeData;\n}\n\n/**\n * Returns every image-bearing shape across the deck (pictures and\n * shapes with `<a:blipFill>`), paired with its 0-based slide\n * index. Built on `hasShapeImage`.\n */\nexport const getAllImages = (pres: PresentationData): ReadonlyArray<PresentationImageEntry> => {\n const out: PresentationImageEntry[] = [];\n const slides = getSlides(pres);\n for (let i = 0; i < slides.length; i++) {\n for (const shape of slides[i]![SLIDE_SHAPES]) {\n if (hasShapeImage(shape)) out.push({ slideIndex: i, shape });\n }\n }\n return out;\n};\n\n/**\n * One entry per table in the deck, carrying the table shape and\n * the 0-based slide it sits on. Sibling of `getAllCharts`.\n */\nexport interface PresentationTableEntry {\n readonly slideIndex: number;\n readonly table: SlideShapeData;\n}\n\n/**\n * Returns every table across every slide in the deck, paired with\n * the 0-based index of its slide. Built on `isTableShape`.\n */\nexport const getAllTables = (pres: PresentationData): ReadonlyArray<PresentationTableEntry> => {\n const out: PresentationTableEntry[] = [];\n const slides = getSlides(pres);\n for (let i = 0; i < slides.length; i++) {\n for (const shape of slides[i]![SLIDE_SHAPES]) {\n if (isTableShape(shape)) out.push({ slideIndex: i, table: shape });\n }\n }\n return out;\n};\n\n/**\n * Returns every chart across every slide in the deck, paired with\n * the 0-based index of its slide. Useful for chart-inventory UIs\n * and bulk chart-update pipelines.\n */\nexport const getAllCharts = (pres: PresentationData): ReadonlyArray<PresentationChartEntry> => {\n const out: PresentationChartEntry[] = [];\n const slides = getSlides(pres);\n for (let i = 0; i < slides.length; i++) {\n for (const c of getSlideCharts(slides[i]!)) {\n out.push({ slideIndex: i, chart: c });\n }\n }\n return out;\n};\n\n/**\n * One entry per external hyperlink found in a shape's text body,\n * carrying the URL, the linked shape, and the 0-based slide index.\n * Each hyperlinked shape is reported once (the URL of its first\n * `<a:hlinkClick>` run).\n */\nexport interface PresentationHyperlinkEntry {\n readonly slideIndex: number;\n readonly shape: SlideShapeData;\n readonly url: string;\n}\n\n/**\n * Returns every external hyperlink in the deck — one entry per\n * shape whose text body carries an `<a:hlinkClick>`. Useful for\n * \"link audit\" passes before publishing, and for building a\n * deck-wide table of contents of outbound URLs.\n */\nexport const getAllHyperlinks = (\n pres: PresentationData,\n): ReadonlyArray<PresentationHyperlinkEntry> => {\n const out: PresentationHyperlinkEntry[] = [];\n const slides = getSlides(pres);\n for (let i = 0; i < slides.length; i++) {\n for (const shape of slides[i]![SLIDE_SHAPES]) {\n const url = getShapeHyperlink(shape);\n if (url !== null) out.push({ slideIndex: i, shape, url });\n }\n }\n return out;\n};\n\n/**\n * Dense per-slide hyperlink count array. Counts shapes whose\n * `getShapeHyperlink` is non-null, mirroring `getAllHyperlinks` but\n * cheaper when the caller only wants per-slide counts. Rounds out the\n * deck-density family alongside the chart / table / image / shape /\n * text / comment counters.\n */\nexport const getPresentationHyperlinkCountsBySlide = (\n pres: PresentationData,\n): ReadonlyArray<number> =>\n getSlides(pres).map((s) => s[SLIDE_SHAPES].filter((sh) => getShapeHyperlink(sh) !== null).length);\n\n/**\n * Returns every distinct external URL referenced by any shape in\n * the deck, in first-seen order. Sibling of `getAllHyperlinks`\n * (which keeps duplicates and slide indices). Useful for \"are\n * these URLs all live?\" audits where checking each URL once is\n * enough.\n */\nexport const getDistinctHyperlinkUrls = (pres: PresentationData): ReadonlyArray<string> => {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const slide of getSlides(pres)) {\n for (const shape of slide[SLIDE_SHAPES]) {\n const url = getShapeHyperlink(shape);\n if (url !== null && !seen.has(url)) {\n seen.add(url);\n out.push(url);\n }\n }\n }\n return out;\n};\n\n/**\n * Returns every slide carrying at least one shape with an external\n * hyperlink. Built on `findHyperlinkedShapes`. Useful for navigation\n * UIs that want to surface only the slides containing outbound URLs.\n */\nexport const getSlidesWithHyperlinks = (pres: PresentationData): ReadonlyArray<SlideData> => {\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n if (slide[SLIDE_SHAPES].some((s) => getShapeHyperlink(s) !== null)) {\n out.push(slide);\n }\n }\n return out;\n};\n\n/**\n * Returns every slide containing at least one shape whose external\n * hyperlink matches `needle` (substring or `RegExp`). Sibling of\n * `findSlidesByText` for outbound-URL audits — e.g. \"every slide\n * that links to old.docs.example.com\".\n */\nexport const findSlidesByHyperlink = (\n pres: PresentationData,\n needle: string | RegExp,\n): ReadonlyArray<SlideData> => {\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n for (const shape of slide[SLIDE_SHAPES]) {\n const url = getShapeHyperlink(shape);\n if (url === null) continue;\n const hit = typeof needle === 'string' ? url.includes(needle) : needle.test(url);\n if (hit) {\n out.push(slide);\n break;\n }\n }\n }\n return out;\n};\n\n/**\n * Bulk URL migration. Re-points every shape across the deck whose\n * first hyperlink exactly equals `from` to instead point at `to`.\n * Returns the number of shapes updated. Built on\n * `setShapeHyperlink`, so each update goes through the standard\n * rels-allocation path and stays schema-valid.\n *\n * Matching is exact (case-sensitive). To migrate by pattern, use\n * `findSlidesByHyperlink` to locate slides and rewrite each shape\n * yourself.\n */\nexport const replaceHyperlink = (pres: PresentationData, from: string, to: string): number => {\n let n = 0;\n for (const slide of getSlides(pres)) {\n for (const shape of slide[SLIDE_SHAPES]) {\n if (getShapeHyperlink(shape) === from) {\n setShapeHyperlink(shape, to);\n n++;\n }\n }\n }\n return n;\n};\n\n/**\n * Removes every external hyperlink across the deck — useful for\n * sanitizing a template before sharing, or for stripping outbound\n * URLs from an exported preview. Returns the number of shapes\n * cleared. Each call goes through `setShapeHyperlink(_, null)`.\n */\nexport const clearAllHyperlinks = (pres: PresentationData): number => {\n let n = 0;\n for (const slide of getSlides(pres)) {\n for (const shape of slide[SLIDE_SHAPES]) {\n if (getShapeHyperlink(shape) !== null) {\n setShapeHyperlink(shape, null);\n n++;\n }\n }\n }\n return n;\n};\n\n/**\n * Slide-scoped sibling of `clearAllHyperlinks`. Removes every\n * external hyperlink on this slide and returns the number of\n * shapes cleared.\n */\nexport const clearSlideHyperlinks = (slide: SlideData): number => {\n let n = 0;\n for (const shape of slide[SLIDE_SHAPES]) {\n if (getShapeHyperlink(shape) !== null) {\n setShapeHyperlink(shape, null);\n n++;\n }\n }\n return n;\n};\n\n/**\n * One entry per comment in the deck, carrying both the comment and\n * the 0-based slide it was attached to.\n */\nexport interface PresentationCommentEntry {\n readonly slideIndex: number;\n readonly comment: SlideCommentData;\n}\n\n/**\n * Returns every comment across every slide in the deck, each paired\n * with the 0-based index of its slide. Useful for review-summary\n * UIs that show all annotations in one chronological list.\n */\nexport const getAllComments = (pres: PresentationData): ReadonlyArray<PresentationCommentEntry> => {\n const out: PresentationCommentEntry[] = [];\n const slides = getSlides(pres);\n for (let i = 0; i < slides.length; i++) {\n for (const c of getSlideComments(slides[i]!)) {\n out.push({ slideIndex: i, comment: c });\n }\n }\n return out;\n};\n\n/**\n * Returns every slide's speaker notes alongside its 0-based index.\n * Skips slides whose notes are empty / unset.\n */\nexport const getAllNotes = (pres: PresentationData): ReadonlyArray<PresentationNotesEntry> => {\n const out: PresentationNotesEntry[] = [];\n const slides = getSlides(pres);\n for (let i = 0; i < slides.length; i++) {\n const notes = getSlideNotes(slides[i]!);\n if (notes !== null && notes.length > 0) out.push({ slideIndex: i, notes });\n }\n return out;\n};\n\n/**\n * Returns every slide in the presentation that carries non-empty\n * speaker notes. Convenience over `getSlides(pres).filter(s =>\n * getSlideNotes(s) !== null && getSlideNotes(s) !== '')`.\n */\nexport const getSlidesWithNotes = (pres: PresentationData): ReadonlyArray<SlideData> => {\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n const notes = getSlideNotes(slide);\n if (notes !== null && notes.length > 0) out.push(slide);\n }\n return out;\n};\n\n/**\n * Predicate sibling of `getSlideNotes`. Returns `true` when the\n * slide carries a non-empty `notesSlide` body — i.e. whatever\n * `getSlideNotes(slide)` would surface is a non-empty string.\n *\n * Cheap to call in hot loops where the caller only needs to know\n * \"are there any notes here?\" without materializing the text.\n */\nexport const hasSlideNotes = (slide: SlideData): boolean => {\n const notes = getSlideNotes(slide);\n return notes !== null && notes.length > 0;\n};\n\n/**\n * Code-point length of the slide's speaker notes, or `0` when the\n * slide has no notes. Counts via `Array.from`, so surrogate-pair\n * characters (emoji, supplementary CJK) count as 1 — matches\n * `getSlideTextLength`.\n */\nexport const getSlideNotesLength = (slide: SlideData): number => {\n const notes = getSlideNotes(slide);\n return notes === null ? 0 : Array.from(notes).length;\n};\n\n/**\n * Concatenated speaker notes from every slide, joined with the\n * given `separator` (defaults to a form-feed, `\\f`). Slides with\n * no notes contribute the empty string. Sibling of\n * `getPresentationText` — useful for search-indexing notes\n * across a whole deck.\n */\nexport const getPresentationNotesText = (\n pres: PresentationData,\n separator: string = '\\f',\n): string => {\n const parts: string[] = [];\n for (const slide of getSlides(pres)) parts.push(getSlideNotes(slide) ?? '');\n return parts.join(separator);\n};\n\n/**\n * Total code-point length of speaker notes across every slide.\n * Sibling of `getPresentationTextLength`; counts surrogate-pair\n * characters as 1 each. Cheaper than `getPresentationNotesText`\n * when the caller only needs the size.\n */\nexport const getPresentationNotesLength = (pres: PresentationData): number => {\n let n = 0;\n for (const slide of getSlides(pres)) n += getSlideNotesLength(slide);\n return n;\n};\n\n/**\n * Dense per-slide notes-length array. Code-point length per\n * `getSlideNotesLength` (`0` when the slide has no notes part). Pair\n * with `getPresentationTextLengthsBySlide` for handout / talk-track\n * audits — slides with no on-screen text but heavy speaker notes are\n * often the slow part of a presentation.\n */\nexport const getPresentationNotesLengthsBySlide = (pres: PresentationData): ReadonlyArray<number> =>\n getSlides(pres).map((s) => getSlideNotesLength(s));\n\n/**\n * Returns every slide whose `<p:spTree>` carries no shapes (per\n * `getSlideShapes`). Useful as a \"find the section dividers I forgot\n * to fill in\" pre-publish check.\n */\nexport const getEmptySlides = (pres: PresentationData): ReadonlyArray<SlideData> => {\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n if (slide[SLIDE_SHAPES].length === 0) out.push(slide);\n }\n return out;\n};\n\n/**\n * Appends `text` to the slide's existing notes on its own line.\n * Equivalent to `setSlideNotes(slide, (getSlideNotes(slide) ?? '') + '\\n' + text)`,\n * minus the leading newline when there were no notes yet.\n */\nexport const appendSlideNotes = (slide: SlideData, text: string): void => {\n const existing = getSlideNotes(slide);\n const value = existing === null || existing.length === 0 ? text : `${existing}\\n${text}`;\n setSlideNotes(slide, value);\n};\n\nexport const setSlideNotes = (slide: SlideData, value: string): void => {\n const pkg = slide[INTERNAL_PACKAGE];\n const notesPartName = findNotesPartName(slide);\n if (notesPartName !== null) {\n const part = pkg.getPart(notesPartName);\n if (part === null) throw new Error(`notes rel points at missing part ${notesPartName}`);\n const doc = parseXml(decode(part.data));\n const cSld = firstChildElement(doc.root, NAME_CSLD);\n if (!cSld) throw new Error('notesSlide has no <p:cSld>');\n const spTree = firstChildElement(cSld, NAME_SP_TREE);\n if (!spTree) throw new Error('notesSlide has no <p:spTree>');\n for (const child of spTree.children) {\n if (child.kind !== 'element' || child.name.namespaceURI !== NS.pml) continue;\n if (child.name.localName !== 'sp') continue;\n const nvSpPr = firstChildElement(child, qname('p', 'nvSpPr', NS.pml));\n if (!nvSpPr) continue;\n const nvPr = firstChildElement(nvSpPr, qname('p', 'nvPr', NS.pml));\n if (!nvPr) continue;\n const ph = firstChildElement(nvPr, qname('p', 'ph', NS.pml));\n if (!ph) continue;\n const txBody = firstChildElement(child, qname('p', 'txBody', NS.pml));\n if (!txBody) continue;\n setTextBody(txBody, value);\n part.data = encode(serializeXml(doc));\n return;\n }\n throw new Error('notesSlide has no body placeholder to fill');\n }\n\n // Create a new notesSlide part.\n const notesMasterPart = pkg.parts.find((p) => p.contentType.endsWith('notesMaster+xml'));\n let nextN = 1;\n const pattern = /^\\/ppt\\/notesSlides\\/notesSlide(\\d+)\\.xml$/;\n for (const p of pkg.parts) {\n const m = p.name.match(pattern);\n if (m?.[1] !== undefined) {\n const n = Number.parseInt(m[1], 10);\n if (Number.isFinite(n) && n >= nextN) nextN = n + 1;\n }\n }\n const notesName = partName(`/ppt/notesSlides/notesSlide${nextN}.xml`);\n const doc = buildEmptyNotesSlide(value);\n pkg.addPart(\n notesName,\n 'application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml',\n encode(serializeXml(doc)),\n );\n\n const notesRels = emptyRels();\n const slideBase = slide[SLIDE_PART_NAME].split('/').pop() ?? 'slide.xml';\n notesRels.items.push({\n id: 'rId1',\n type: REL_TYPES.slide,\n target: `../slides/${slideBase}`,\n targetMode: 'Internal',\n });\n if (notesMasterPart) {\n const notesMasterBase = notesMasterPart.name.split('/').pop() ?? 'notesMaster1.xml';\n notesRels.items.push({\n id: 'rId2',\n type: REL_TYPES.notesMaster,\n target: `../notesMasters/${notesMasterBase}`,\n targetMode: 'Internal',\n });\n }\n pkg.setRels(notesName, notesRels);\n\n const slideRels = pkg.getRels(slide[SLIDE_PART_NAME]) ?? emptyRels();\n const existingIds = slideRels.items.map((r) => r.id);\n let n = 1;\n while (existingIds.includes(`rId${n}`)) n++;\n slideRels.items.push({\n id: `rId${n}`,\n type: REL_TYPES.notesSlide,\n target: `../notesSlides/notesSlide${nextN}.xml`,\n targetMode: 'Internal',\n });\n pkg.setRels(slide[SLIDE_PART_NAME], slideRels);\n};\n\n/**\n * Removes the slide's speaker-notes part entirely. Drops the\n * `notesSlide` part + its `.rels`, and unwires the slide → notesSlide\n * relationship. No-op when the slide has no notes.\n *\n * The shared `notesMaster` part is left alone; other slides may still\n * reference it.\n */\nexport const removeSlideNotes = (slide: SlideData): void => {\n const notesPartName = findNotesPartName(slide);\n if (notesPartName === null) return;\n const pkg = slide[INTERNAL_PACKAGE];\n pkg.removePart(notesPartName);\n pkg.removePart(relsPartNameFor(notesPartName));\n const slideRels = pkg.getRels(slide[SLIDE_PART_NAME]);\n if (slideRels === null) return;\n slideRels.items = slideRels.items.filter((r) => r.type !== REL_TYPES.notesSlide);\n pkg.setRels(slide[SLIDE_PART_NAME], slideRels);\n};\n\n/**\n * Removes the speaker-notes part from every slide that has one.\n * Built on `removeSlideNotes`. Returns the number of slides\n * stripped. Useful as a privacy/sharing helper before exporting a\n * deck whose notes contain internal commentary.\n */\nexport const clearAllSlideNotes = (pres: PresentationData): number => {\n let n = 0;\n for (const slide of getSlides(pres)) {\n if (findNotesPartName(slide) === null) continue;\n removeSlideNotes(slide);\n n++;\n }\n return n;\n};\n","// Slide size.\n\nimport type { Emu } from '../units.ts';\nimport {\n NS,\n attr,\n elem,\n firstChildElement,\n parseXml,\n qname,\n serializeXml,\n} from '../../internal/xml/index.ts';\nimport { readPresentationPart } from '../../internal/presentationml/index.ts';\nimport { INTERNAL_PACKAGE, type PresentationData } from '../_internal-symbols.ts';\nimport { PRES_PART_NAME, decode, encode } from './_helpers.ts';\n\n// Slide size.\n\n/**\n * Width × height of the slide canvas, in EMU. `type` is PowerPoint's\n * aspect-ratio hint (`screen4x3`, `screen16x9`, ...); the actual size\n * is always `width` × `height`.\n */\nexport interface SlideSize {\n readonly width: Emu;\n readonly height: Emu;\n readonly type?: string;\n}\n\n/** Returns the slide canvas size, or `null` if `presentation.xml` omits it. */\nexport const getSlideSize = (pres: PresentationData): SlideSize | null => {\n const pkg = pres[INTERNAL_PACKAGE];\n const presPart = pkg.getPart(PRES_PART_NAME);\n if (presPart === null) return null;\n const root = parseXml(decode(presPart.data)).root;\n const model = readPresentationPart(root);\n if (model.slideSize === null) return null;\n return {\n width: model.slideSize.cx as Emu,\n height: model.slideSize.cy as Emu,\n ...(model.slideSize.type !== undefined ? { type: model.slideSize.type } : {}),\n };\n};\n\nconst NAME_SLD_SZ_FN = qname('p', 'sldSz', NS.pml);\nconst ATTR_CX = qname('', 'cx', '');\nconst ATTR_CY = qname('', 'cy', '');\nconst ATTR_TYPE = qname('', 'type', '');\nconst NAME_SLD_ID_LST_FN = qname('p', 'sldIdLst', NS.pml);\n\n/**\n * Sets the slide canvas size. Creates `<p:sldSz>` when absent, replaces\n * its attributes when present. The `type` hint is preserved as given.\n *\n * Schema ordering: `<p:sldSz>` follows `<p:sldIdLst>` per ECMA-376\n * §19.2.1.26; we insert at the correct position when bootstrapping.\n */\nexport const setSlideSize = (pres: PresentationData, opts: SlideSize): void => {\n const pkg = pres[INTERNAL_PACKAGE];\n const presPart = pkg.getPart(PRES_PART_NAME);\n if (!presPart) throw new Error('presentation.xml is missing');\n const doc = parseXml(decode(presPart.data));\n\n let sldSz = firstChildElement(doc.root, NAME_SLD_SZ_FN);\n if (sldSz === null) {\n sldSz = elem(NAME_SLD_SZ_FN);\n const sldIdLst = firstChildElement(doc.root, NAME_SLD_ID_LST_FN);\n if (sldIdLst !== null) {\n const idx = doc.root.children.indexOf(sldIdLst);\n doc.root.children.splice(idx + 1, 0, sldSz);\n } else {\n doc.root.children.push(sldSz);\n }\n }\n\n sldSz.attrs = [attr(ATTR_CX, String(opts.width)), attr(ATTR_CY, String(opts.height))];\n if (opts.type !== undefined) sldSz.attrs.push(attr(ATTR_TYPE, opts.type));\n\n presPart.data = encode(serializeXml(doc));\n};\n\nimport { emu as emuValue } from '../units.ts';\n\n/** 10in × 7.5in (`screen4x3`). */\nexport const SLIDE_SIZE_4_3: SlideSize = {\n width: emuValue(9144000),\n height: emuValue(6858000),\n type: 'screen4x3',\n};\n\n/** 13.333in × 7.5in (`screen16x9`) — Office 2013+ default. */\nexport const SLIDE_SIZE_16_9: SlideSize = {\n width: emuValue(12192000),\n height: emuValue(6858000),\n type: 'screen16x9',\n};\n\n/** 13.333in × 8.33in (`screen16x10`). */\nexport const SLIDE_SIZE_16_10: SlideSize = {\n width: emuValue(12192000),\n height: emuValue(7620000),\n type: 'screen16x10',\n};\n","// Picture opacity and cropping.\nimport { getSlides } from './slide-query.ts';\n\nimport { getPictureEmbedRId } from '../../internal/drawingml/index.ts';\nimport {\n type ImageFormat,\n detectImageFormat,\n partName,\n resolveTarget,\n} from '../../internal/opc/index.ts';\nimport { type SlideLayoutType } from '../../internal/presentationml/index.ts';\nimport {\n NS,\n type XmlElement,\n attr,\n elem,\n firstChildElement,\n getAttrValue,\n qname,\n} from '../../internal/xml/index.ts';\nimport {\n INTERNAL_PACKAGE,\n type PresentationData,\n SHAPE_ELEMENT,\n SHAPE_SLIDE,\n SHAPE_SNAPSHOT,\n SLIDE_PART_NAME,\n SLIDE_SHAPES,\n type SlideData,\n type SlideShapeData,\n} from '../_internal-symbols.ts';\nimport { commitAndRefresh } from './_helpers.ts';\nimport { getSlideLayoutPartName } from './layouts.ts';\nimport { getPresentationTheme, getSlideLayoutName, getSlideLayoutType } from './package.ts';\nimport {\n getShapeBounds,\n getShapeFlip,\n getSlideLayout,\n resolveDrawingColor,\n shapesOverlap,\n} from './shapes.ts';\nimport { getSlideSize } from './features.ts';\n\n// ---------------------------------------------------------------------------\n// Picture opacity — `<a:alphaModFix>` inside the picture's `<a:blip>`.\n//\n// `amt` is ECMA-376's ST_PositiveFixedPercentage (0–100000, scale 1/1000\n// of a percent). PowerPoint defaults to fully opaque when the element\n// is absent. Pass `null` to remove a prior `<a:alphaModFix>`.\n\nconst NAME_ALPHA_MOD_FIX_FN = qname('a', 'alphaModFix', NS.dml);\nconst ATTR_AMT_FN = qname('', 'amt', '');\n\n/**\n * Sets the picture's opacity (0–1 fraction; `1` is fully opaque, `0`\n * fully transparent). Pass `null` to remove an existing opacity\n * override and restore PowerPoint's default behavior.\n *\n * Throws for non-picture shapes and on opacities outside `[0, 1]`.\n */\n/**\n * Returns the embedded image bytes for a picture shape, or `null`\n * when the shape isn't a picture or has no `r:embed` reference\n * (external images aren't followed).\n *\n * The returned `Uint8Array` is a live view into the package media\n * part — treat it as read-only; copy if you need an independent\n * buffer.\n */\nexport const getShapeImageBytes = (shape: SlideShapeData): Uint8Array | null => {\n if (shape[SHAPE_SNAPSHOT].kind !== 'picture') return null;\n const rEmbed = getPictureEmbedRId(shape[SHAPE_ELEMENT]);\n if (rEmbed === null) return null;\n const slide = shape[SHAPE_SLIDE];\n const pkg = slide[INTERNAL_PACKAGE];\n const rels = pkg.getRels(slide[SLIDE_PART_NAME]);\n if (!rels) return null;\n const rel = rels.items.find((r) => r.id === rEmbed);\n if (!rel || rel.targetMode === 'External') return null;\n const mediaName = rel.target.startsWith('/')\n ? partName(rel.target)\n : resolveTarget(slide[SLIDE_PART_NAME], rel.target);\n const part = pkg.getPart(mediaName);\n return part?.data ?? null;\n};\n\n/**\n * `true` when the shape's text body carries any visible characters.\n * Tighter than checking `getShapeText(shape) !== ''` because it\n * doesn't allocate the concatenated string.\n */\nexport const hasShapeText = (shape: SlideShapeData): boolean => {\n const text = shape[SHAPE_SNAPSHOT].text;\n return typeof text === 'string' && text.length > 0;\n};\n\n/**\n * `true` when the shape carries an embedded image — either a\n * `<p:pic>` picture or a `<p:spPr>/<a:blipFill>` image fill on a\n * regular shape. External `r:link` references count too.\n */\nexport const hasShapeImage = (shape: SlideShapeData): boolean => {\n if (shape[SHAPE_SNAPSHOT].kind === 'picture') {\n return getPictureEmbedRId(shape[SHAPE_ELEMENT]) !== null;\n }\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (!spPr) return false;\n return firstChildElement(spPr, qname('a', 'blipFill', NS.dml)) !== null;\n};\n\n/**\n * Dense per-slide image count array. Counts every shape that\n * `hasShapeImage` matches on each slide. Rounds out the density-array\n * family alongside the chart, table, shape, text, and comment\n * counters.\n */\nexport const getPresentationImageCountsBySlide = (pres: PresentationData): ReadonlyArray<number> =>\n getSlides(pres).map((s) => s[SLIDE_SHAPES].filter((sh) => hasShapeImage(sh)).length);\n\n/**\n * Returns every shape on the slide that is mirrored — horizontally\n * (`flipH`), vertically (`flipV`), or both.\n */\nexport const findFlippedShapes = (slide: SlideData): ReadonlyArray<SlideShapeData> =>\n slide[SLIDE_SHAPES].filter((s) => {\n const flip = getShapeFlip(s);\n return flip !== null && (flip.horizontal || flip.vertical);\n });\n\n/**\n * Returns every unordered pair of shapes on the slide whose\n * bounding boxes overlap. Built on `shapesOverlap`. Pairs are\n * returned with `a` strictly preceding `b` in document order, and\n * each pair appears at most once.\n *\n * Useful for layout audits — \"do any boxes collide on this slide?\"\n * Shapes without `<a:xfrm>` bounds never overlap anything.\n */\nexport const findOverlappingShapePairs = (\n slide: SlideData,\n): ReadonlyArray<readonly [SlideShapeData, SlideShapeData]> => {\n const shapes = slide[SLIDE_SHAPES];\n const out: (readonly [SlideShapeData, SlideShapeData])[] = [];\n for (let i = 0; i < shapes.length; i++) {\n for (let j = i + 1; j < shapes.length; j++) {\n if (shapesOverlap(shapes[i]!, shapes[j]!)) {\n out.push([shapes[i]!, shapes[j]!] as const);\n }\n }\n }\n return out;\n};\n\n/**\n * Returns every shape on the slide whose bounding box extends past\n * the slide canvas (`getSlideSize(pres)`). Useful audit helper for\n * catching shapes that PowerPoint will silently render off-screen\n * or clip on export. Shapes without `<a:xfrm>` bounds are skipped.\n *\n * If the presentation has no slide-size declared, every positioned\n * shape is returned (caller can't audit against an absent canvas).\n */\nexport const findShapesOutsideCanvas = (\n slide: SlideData,\n pres: PresentationData,\n): ReadonlyArray<SlideShapeData> => {\n const size = getSlideSize(pres);\n const out: SlideShapeData[] = [];\n for (const shape of slide[SLIDE_SHAPES]) {\n const b = getShapeBounds(shape);\n if (b === null) continue;\n if (size === null) {\n out.push(shape);\n continue;\n }\n if (b.x < 0 || b.y < 0 || b.x + b.w > size.width || b.y + b.h > size.height) {\n out.push(shape);\n }\n }\n return out;\n};\n\n/**\n * Every slide whose layout's `cSld@name` matches the given string.\n * Useful for batch operations on slides sharing a layout — for\n * example, restyling every \"Title and Content\" slide in a deck.\n *\n * Matching is exact (case-sensitive). Slides without a resolved\n * layout are skipped.\n */\nexport const findSlidesByLayoutName = (\n pres: PresentationData,\n layoutName: string | RegExp,\n): ReadonlyArray<SlideData> => {\n const matches =\n typeof layoutName === 'string'\n ? (n: string) => n === layoutName\n : (n: string) => layoutName.test(n);\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n const layout = getSlideLayout(slide);\n if (layout !== null && matches(getSlideLayoutName(layout))) out.push(slide);\n }\n return out;\n};\n\n/**\n * Every slide whose resolved layout part name equals `layoutPartName`\n * (e.g. `'/ppt/slideLayouts/slideLayout3.xml'`). Stable across\n * template-name collisions and locale renames — keyed on the actual\n * package path. Pair to `findSlidesByLayoutName` /\n * `findSlidesByLayoutType` for cases where the caller already has a\n * layout part name in hand (typical when iterating over a layouts\n * collection programmatically).\n */\nexport const findSlidesByLayoutPartName = (\n pres: PresentationData,\n layoutPartName: string,\n): ReadonlyArray<SlideData> => {\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n const layout = getSlideLayout(slide);\n if (layout !== null && getSlideLayoutPartName(layout) === layoutPartName) out.push(slide);\n }\n return out;\n};\n\n/**\n * Every slide whose layout `@type` (e.g. `'title'`, `'blank'`,\n * `'obj'`) matches. Sibling of `findSlidesByLayoutName`, but keyed\n * on the OOXML layout-type enum rather than the human-facing name —\n * stable across locales and template providers.\n */\nexport const findSlidesByLayoutType = (\n pres: PresentationData,\n layoutType: SlideLayoutType | string,\n): ReadonlyArray<SlideData> => {\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n const layout = getSlideLayout(slide);\n if (layout !== null && getSlideLayoutType(layout) === layoutType) out.push(slide);\n }\n return out;\n};\n\n/**\n * Returns the package part name (`/ppt/media/imageN.ext`) of\n * whichever image the shape carries — picture (`<p:pic>`) or\n * image-fill (`<a:blipFill>` nested under `<p:spPr>`). Returns\n * `null` when the shape has no embedded image, or the rel points\n * at an external `r:link` rather than an internal target.\n *\n * Useful for addressing the media part directly with\n * `setMediaPartBytes` or `readPackagePart`.\n */\n/**\n * Returns the external URL of the picture when its `<a:blip>` carries an\n * `r:link` (external) relationship rather than an `r:embed`. Returns\n * `null` for embedded pictures, non-picture shapes, or when the\n * relationship doesn't resolve.\n *\n * PowerPoint emits `r:link` when the user inserts via \"Link to file\"\n * instead of \"Insert Picture\". The bytes live outside the package, so\n * `getShapeImageBytes` can't render them — readers / preview tools\n * should fall back to this URL or a placeholder.\n */\n/**\n * Returns `true` when the picture's `<a:blip>` carries `<a:grayscl/>`\n * — PowerPoint's \"Color > Grayscale\" recolor preset. Renderers can\n * project this onto a CSS `filter: grayscale(100%)` or an SVG\n * `<feColorMatrix>` desaturation.\n */\nexport const isShapeImageGrayscale = (shape: SlideShapeData): boolean => {\n let blip: XmlElement | null = null;\n if (shape[SHAPE_SNAPSHOT].kind === 'picture') {\n const blipFill = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'blipFill', NS.pml));\n if (blipFill) blip = firstChildElement(blipFill, qname('a', 'blip', NS.dml));\n } else {\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (spPr) {\n const bf = firstChildElement(spPr, qname('a', 'blipFill', NS.dml));\n if (bf) blip = firstChildElement(bf, qname('a', 'blip', NS.dml));\n }\n }\n return blip !== null && firstChildElement(blip, qname('a', 'grayscl', NS.dml)) !== null;\n};\n\n/**\n * Returns the threshold of the picture's `<a:blip><a:biLevel thresh=\"…\"/>`\n * effect — PowerPoint's \"Color > Black and White\" preset. Threshold is\n * a percent (0..100); pixels brighter become white, darker become black.\n * Returns `null` when no biLevel transform is set.\n */\nexport const getShapeImageBiLevelThreshold = (shape: SlideShapeData): number | null => {\n let blip: XmlElement | null = null;\n if (shape[SHAPE_SNAPSHOT].kind === 'picture') {\n const blipFill = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'blipFill', NS.pml));\n if (blipFill) blip = firstChildElement(blipFill, qname('a', 'blip', NS.dml));\n } else {\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (spPr) {\n const bf = firstChildElement(spPr, qname('a', 'blipFill', NS.dml));\n if (bf) blip = firstChildElement(bf, qname('a', 'blip', NS.dml));\n }\n }\n if (!blip) return null;\n const biLevel = firstChildElement(blip, qname('a', 'biLevel', NS.dml));\n if (!biLevel) return null;\n const t = getAttrValue(biLevel, qname('', 'thresh', ''));\n if (t === null) return null;\n let n = Number.parseFloat(t);\n if (!Number.isFinite(n)) return null;\n if (Math.abs(n) > 1) n = n / 100000;\n return n * 100;\n};\n\n/**\n * Reads the picture's duotone color transform from `<a:blip><a:duotone>`.\n * PowerPoint emits two `<a:srgbClr>` (or scheme color) children for a\n * two-color duotone effect — typical \"Picture Tools › Recolor\".\n * Returns `null` when no duotone is set.\n */\nexport const getShapeImageDuotone = (\n pres: PresentationData,\n shape: SlideShapeData,\n): { firstColor: string | null; secondColor: string | null } | null => {\n let blip: XmlElement | null = null;\n if (shape[SHAPE_SNAPSHOT].kind === 'picture') {\n const blipFill = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'blipFill', NS.pml));\n if (blipFill) blip = firstChildElement(blipFill, qname('a', 'blip', NS.dml));\n } else {\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (spPr) {\n const bf = firstChildElement(spPr, qname('a', 'blipFill', NS.dml));\n if (bf) blip = firstChildElement(bf, qname('a', 'blip', NS.dml));\n }\n }\n if (!blip) return null;\n const duotone = firstChildElement(blip, qname('a', 'duotone', NS.dml));\n if (!duotone) return null;\n const theme = getPresentationTheme(pres);\n const colors: Array<string | null> = [];\n for (const c of duotone.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n if (\n c.name.localName === 'srgbClr' ||\n c.name.localName === 'schemeClr' ||\n c.name.localName === 'sysClr' ||\n c.name.localName === 'prstClr'\n ) {\n colors.push(resolveDrawingColor(c, theme));\n if (colors.length === 2) break;\n }\n }\n return {\n firstColor: colors[0] ?? null,\n secondColor: colors[1] ?? null,\n };\n};\n\nexport const getShapeImageLinkUrl = (shape: SlideShapeData): string | null => {\n const slide = shape[SHAPE_SLIDE];\n const rels = slide[INTERNAL_PACKAGE].getRels(slide[SLIDE_PART_NAME]);\n if (!rels) return null;\n // Find the blip element on either picture or shape-with-image-fill.\n let blip: XmlElement | null = null;\n if (shape[SHAPE_SNAPSHOT].kind === 'picture') {\n const blipFill = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'blipFill', NS.pml));\n if (blipFill) blip = firstChildElement(blipFill, qname('a', 'blip', NS.dml));\n } else {\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (spPr) {\n const bf = firstChildElement(spPr, qname('a', 'blipFill', NS.dml));\n if (bf) blip = firstChildElement(bf, qname('a', 'blip', NS.dml));\n }\n }\n if (!blip) return null;\n const rLink = getAttrValue(blip, qname('r', 'link', NS.officeDocRels));\n if (!rLink) return null;\n const rel = rels.items.find((r) => r.id === rLink);\n if (!rel || rel.targetMode !== 'External') return null;\n return rel.target;\n};\n\nexport const getShapeImagePartName = (shape: SlideShapeData): string | null => {\n const slide = shape[SHAPE_SLIDE];\n const rels = slide[INTERNAL_PACKAGE].getRels(slide[SLIDE_PART_NAME]);\n if (!rels) return null;\n\n const resolve = (rEmbed: string | null): string | null => {\n if (rEmbed === null) return null;\n const rel = rels.items.find((r) => r.id === rEmbed);\n if (!rel || rel.targetMode === 'External') return null;\n const name = rel.target.startsWith('/')\n ? partName(rel.target)\n : resolveTarget(slide[SLIDE_PART_NAME], rel.target);\n return name;\n };\n\n // Picture shape: <p:pic><p:blipFill><a:blip r:embed=\"...\"/>.\n if (shape[SHAPE_SNAPSHOT].kind === 'picture') {\n const rEmbed = getPictureEmbedRId(shape[SHAPE_ELEMENT]);\n return resolve(rEmbed);\n }\n\n // Other shapes with image fill: <p:spPr><a:blipFill><a:blip r:embed=\"...\"/>.\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (!spPr) return null;\n const blipFill = firstChildElement(spPr, qname('a', 'blipFill', NS.dml));\n if (!blipFill) return null;\n const blip = firstChildElement(blipFill, qname('a', 'blip', NS.dml));\n if (!blip) return null;\n return resolve(getAttrValue(blip, qname('r', 'embed', NS.officeDocRels)));\n};\n\n/**\n * Returns the bytes of the image used as this shape's *fill*\n * (`<a:blipFill>` nested under `<p:spPr>`, as written by\n * `setShapeImageFill`). Distinct from `getShapeImageBytes`, which only\n * applies to `<p:pic>` picture shapes.\n *\n * Returns null if the shape has no image fill, the blip has no\n * `r:embed`, or the embed points at an external `r:link`.\n */\nexport const getShapeImageFillBytes = (shape: SlideShapeData): Uint8Array | null => {\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (!spPr) return null;\n const blipFill = firstChildElement(spPr, qname('a', 'blipFill', NS.dml));\n if (!blipFill) return null;\n const blip = firstChildElement(blipFill, qname('a', 'blip', NS.dml));\n if (!blip) return null;\n const rEmbed = getAttrValue(blip, qname('r', 'embed', NS.officeDocRels));\n if (rEmbed === null) return null;\n const slide = shape[SHAPE_SLIDE];\n const pkg = slide[INTERNAL_PACKAGE];\n const rels = pkg.getRels(slide[SLIDE_PART_NAME]);\n if (!rels) return null;\n const rel = rels.items.find((r) => r.id === rEmbed);\n if (!rel || rel.targetMode === 'External') return null;\n const mediaName = rel.target.startsWith('/')\n ? partName(rel.target)\n : resolveTarget(slide[SLIDE_PART_NAME], rel.target);\n const part = pkg.getPart(mediaName);\n return part?.data ?? null;\n};\n\n/**\n * Returns the image format token (`'png'`, `'jpeg'`, …) for whichever\n * image bytes the shape carries — picture (`<p:pic>`) or image-fill\n * (`<a:blipFill>` on `<p:spPr>`). Returns `null` if the shape has no\n * embedded image or the bytes don't match a recognized signature.\n */\nexport const getShapeImageFormat = (shape: SlideShapeData): ImageFormat | null => {\n const bytes = getShapeImageBytes(shape) ?? getShapeImageFillBytes(shape);\n if (bytes === null) return null;\n return detectImageFormat(bytes);\n};\n\n/**\n * Reads the picture's opacity (0–1 fraction). Returns `null` when no\n * `<a:alphaModFix>` is present (PowerPoint treats absence as fully\n * opaque); returns `1` when an explicit alphaModFix sets full opacity.\n */\nexport const getShapeImageOpacity = (shape: SlideShapeData): number | null => {\n if (shape[SHAPE_SNAPSHOT].kind !== 'picture') return null;\n const blipFill = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'blipFill', NS.pml));\n if (!blipFill) return null;\n const blip = firstChildElement(blipFill, qname('a', 'blip', NS.dml));\n if (!blip) return null;\n const alpha = firstChildElement(blip, qname('a', 'alphaModFix', NS.dml));\n if (!alpha) return null;\n const amt = getAttrValue(alpha, qname('', 'amt', ''));\n if (amt === null) return 1;\n const n = Number.parseInt(amt, 10);\n if (!Number.isFinite(n)) return null;\n return n / 100000;\n};\n\n/**\n * Reads the picture's crop fractions. Returns `null` when no\n * `<a:srcRect>` is present; otherwise returns a fully-populated object\n * with every side filled in (0 for omitted sides on disk).\n */\nexport const getShapeImageCrop = (shape: SlideShapeData): ImageCrop | null => {\n if (shape[SHAPE_SNAPSHOT].kind !== 'picture') return null;\n const blipFill = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'blipFill', NS.pml));\n if (!blipFill) return null;\n const srcRect = firstChildElement(blipFill, qname('a', 'srcRect', NS.dml));\n if (!srcRect) return null;\n const parseSide = (local: string): number => {\n const v = getAttrValue(srcRect, qname('', local, ''));\n if (v === null) return 0;\n const n = Number.parseInt(v, 10);\n return Number.isFinite(n) ? n / 100000 : 0;\n };\n return {\n left: parseSide('l'),\n top: parseSide('t'),\n right: parseSide('r'),\n bottom: parseSide('b'),\n };\n};\n\n// Brightness and contrast are two attributes of a SINGLE `<a:lum>` effect\n// (CT_LuminanceEffect: `bright` / `contrast`, both ST_FixedPercentage ×100000).\n// `<a:lumOff>` / `<a:lumMod>` are color-transform children — they are NOT in\n// the CT_Blip effect choice, so emitting them under `<a:blip>` is schema-invalid.\n// Both setters share the one element: writing one attribute preserves the\n// other, and removing the last attribute drops the `<a:lum>` element entirely.\nconst NAME_LUM = qname('a', 'lum', NS.dml);\n\nconst requirePictureBlip = (shape: SlideShapeData, fnName: string): XmlElement => {\n if (shape[SHAPE_SNAPSHOT].kind !== 'picture') {\n throw new Error(\n `${fnName} only works on picture shapes; ${shape[SHAPE_SNAPSHOT].kind} is not one`,\n );\n }\n const blipFill = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'blipFill', NS.pml));\n if (!blipFill) throw new Error('picture has no <p:blipFill>');\n const blip = firstChildElement(blipFill, qname('a', 'blip', NS.dml));\n if (!blip) throw new Error('picture <p:blipFill> has no <a:blip>');\n return blip;\n};\n\nconst setLumAttr = (blip: XmlElement, local: 'bright' | 'contrast', value: number | null): void => {\n let lum = firstChildElement(blip, NAME_LUM);\n if (lum) {\n lum.attrs = lum.attrs.filter(\n (a) => !(a.name.namespaceURI === '' && a.name.localName === local),\n );\n }\n if (value !== null && value !== 0) {\n // `<a:lum>` is part of CT_Blip's unbounded effect choice, so its position\n // among sibling effects (e.g. alphaModFix) is unconstrained — append.\n if (!lum) {\n lum = elem(NAME_LUM);\n blip.children.push(lum);\n }\n lum.attrs.push(attr(qname('', local, ''), String(Math.round(value * 100000))));\n }\n if (lum && lum.attrs.length === 0) {\n blip.children = blip.children.filter((c) => c !== lum);\n }\n};\n\nconst getLumAttr = (shape: SlideShapeData, local: 'bright' | 'contrast'): number | null => {\n if (shape[SHAPE_SNAPSHOT].kind !== 'picture') return null;\n const blipFill = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'blipFill', NS.pml));\n if (!blipFill) return null;\n const blip = firstChildElement(blipFill, qname('a', 'blip', NS.dml));\n if (!blip) return null;\n const lum = firstChildElement(blip, NAME_LUM);\n if (!lum) return null;\n const v = getAttrValue(lum, qname('', local, ''));\n if (v === null) return null;\n const n = Number.parseInt(v, 10);\n return Number.isFinite(n) ? n / 100000 : null;\n};\n\n/**\n * Adjusts the picture's brightness via `<a:blip><a:lum bright=\"…\"/>`. The value\n * is a -1..1 fraction:\n *\n * - `1` → +100% brightness\n * - `0` or `null` → no brightness change (the `bright` attribute is removed)\n * - `-1` → -100% brightness\n *\n * Brightness and contrast share the one `<a:lum>` element, so setting one keeps\n * the other. Throws for non-picture shapes and on values outside [-1, 1].\n */\nexport const setShapeImageBrightness = (shape: SlideShapeData, value: number | null): void => {\n const blip = requirePictureBlip(shape, 'setShapeImageBrightness');\n if (value !== null && value !== 0 && (!Number.isFinite(value) || value < -1 || value > 1)) {\n throw new RangeError(`brightness must be in [-1, 1], got ${value}`);\n }\n setLumAttr(blip, 'bright', value);\n commitAndRefresh(shape);\n};\n\n/**\n * Adjusts the picture's contrast via `<a:blip><a:lum contrast=\"…\"/>`. The value\n * is a -1..1 fraction (ECMA-376 `ST_FixedPercentage`):\n *\n * - `0` or `null` → no contrast change (the `contrast` attribute is removed)\n * - `0.5` → +50% contrast (boosted)\n * - `-0.5` → -50% contrast (washed out)\n *\n * Brightness and contrast share the one `<a:lum>` element, so setting one keeps\n * the other. Throws on non-picture shapes and on values outside [-1, 1].\n */\nexport const setShapeImageContrast = (shape: SlideShapeData, value: number | null): void => {\n const blip = requirePictureBlip(shape, 'setShapeImageContrast');\n if (value !== null && value !== 0 && (!Number.isFinite(value) || value < -1 || value > 1)) {\n throw new RangeError(`contrast must be in [-1, 1], got ${value}`);\n }\n setLumAttr(blip, 'contrast', value);\n commitAndRefresh(shape);\n};\n\n/**\n * Reads the picture's contrast (the `<a:lum contrast>` fraction in [-1, 1]).\n * Returns `null` when no contrast adjustment is present.\n */\nexport const getShapeImageContrast = (shape: SlideShapeData): number | null =>\n getLumAttr(shape, 'contrast');\n\n/**\n * Reads the picture's brightness (the `<a:lum bright>` fraction in [-1, 1]).\n * Returns `null` when no brightness adjustment is present.\n */\nexport const getShapeImageBrightness = (shape: SlideShapeData): number | null =>\n getLumAttr(shape, 'bright');\n\nexport const setShapeImageOpacity = (shape: SlideShapeData, opacity: number | null): void => {\n if (shape[SHAPE_SNAPSHOT].kind !== 'picture') {\n throw new Error(\n `setShapeImageOpacity only works on picture shapes; ${shape[SHAPE_SNAPSHOT].kind} is not one`,\n );\n }\n const blipFill = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'blipFill', NS.pml));\n if (!blipFill) throw new Error('picture has no <p:blipFill>');\n const blip = firstChildElement(blipFill, qname('a', 'blip', NS.dml));\n if (!blip) throw new Error('picture <p:blipFill> has no <a:blip>');\n\n blip.children = blip.children.filter(\n (c) =>\n !(\n c.kind === 'element' &&\n c.name.namespaceURI === NS.dml &&\n c.name.localName === 'alphaModFix'\n ),\n );\n\n if (opacity !== null) {\n if (!Number.isFinite(opacity) || opacity < 0 || opacity > 1) {\n throw new RangeError(`opacity must be in [0, 1], got ${opacity}`);\n }\n blip.children.push(\n elem(NAME_ALPHA_MOD_FIX_FN, {\n attrs: [attr(ATTR_AMT_FN, String(Math.round(opacity * 100000)))],\n }),\n );\n }\n commitAndRefresh(shape);\n};\n\n// ---------------------------------------------------------------------------\n// Picture cropping — `<a:srcRect>` inside the picture's `<p:blipFill>`.\n//\n// Percentages are 0-1 fractions per side, converted to ECMA-376's\n// `ST_Percentage` units (1/1000 of a percent, so 0.25 → \"25000\"). Pass\n// `null` to remove an existing crop.\n\n/** Crop a picture by fraction of each side. Omitted sides default to 0. */\nexport interface ImageCrop {\n readonly left?: number;\n readonly top?: number;\n readonly right?: number;\n readonly bottom?: number;\n}\n\nconst NAME_BLIP_FILL_FN = qname('p', 'blipFill', NS.pml);\nconst NAME_SRC_RECT_FN = qname('a', 'srcRect', NS.dml);\nconst NAME_BLIP_FN = qname('a', 'blip', NS.dml);\nconst ATTR_CROP_L = qname('', 'l', '');\nconst ATTR_CROP_T = qname('', 't', '');\nconst ATTR_CROP_R = qname('', 'r', '');\nconst ATTR_CROP_B = qname('', 'b', '');\n\nconst fractionToST = (n: number | undefined): string | null => {\n if (n === undefined || n === 0) return null;\n if (!Number.isFinite(n) || n < 0 || n >= 1) {\n throw new RangeError(`crop fraction must be in [0, 1), got ${n}`);\n }\n return String(Math.round(n * 100000));\n};\n\n/**\n * Sets (or clears) a `<a:srcRect>` on a picture shape, cropping the\n * embedded image by the given fraction on each side. Pass `null` to\n * remove an existing crop.\n *\n * Fractions are in `[0, 1)` per side. `{ left: 0.25 }` clips 25% off\n * the left edge; the visible image stretches to fill the original\n * frame. The shape's geometry (`<a:xfrm>`) is unchanged.\n */\nexport const setShapeImageCrop = (shape: SlideShapeData, crop: ImageCrop | null): void => {\n if (shape[SHAPE_SNAPSHOT].kind !== 'picture') {\n throw new Error(\n `setShapeImageCrop only works on picture shapes; ${shape[SHAPE_SNAPSHOT].kind} is not one`,\n );\n }\n const pic = shape[SHAPE_ELEMENT];\n const blipFill = firstChildElement(pic, NAME_BLIP_FILL_FN);\n if (!blipFill) throw new Error('picture has no <p:blipFill>');\n\n // Remove any existing srcRect first.\n blipFill.children = blipFill.children.filter(\n (c) =>\n !(c.kind === 'element' && c.name.namespaceURI === NS.dml && c.name.localName === 'srcRect'),\n );\n\n if (crop === null) {\n commitAndRefresh(shape);\n return;\n }\n\n const attrs: Array<ReturnType<typeof attr>> = [];\n const l = fractionToST(crop.left);\n const t = fractionToST(crop.top);\n const r = fractionToST(crop.right);\n const b = fractionToST(crop.bottom);\n if (l !== null) attrs.push(attr(ATTR_CROP_L, l));\n if (t !== null) attrs.push(attr(ATTR_CROP_T, t));\n if (r !== null) attrs.push(attr(ATTR_CROP_R, r));\n if (b !== null) attrs.push(attr(ATTR_CROP_B, b));\n\n // <a:srcRect> sits between <a:blip> and <a:stretch> per the schema.\n const srcRect = elem(NAME_SRC_RECT_FN, { attrs });\n const blipIdx = blipFill.children.findIndex(\n (c) => c.kind === 'element' && c.name.namespaceURI === NS.dml && c.name.localName === 'blip',\n );\n if (blipIdx === -1) {\n // No <a:blip>? Just prepend the srcRect.\n blipFill.children.unshift(srcRect);\n } else {\n blipFill.children.splice(blipIdx + 1, 0, srcRect);\n }\n commitAndRefresh(shape);\n};\n\nvoid NAME_BLIP_FN;\n","// Slide animations.\n\nimport {\n type AnimationEffect,\n type AnimationOptions,\n buildSingleEffectTiming,\n} from '../../internal/presentationml/index.ts';\nimport {\n NS,\n type XmlElement,\n allChildElements,\n elem,\n firstChildElement,\n getAttrValue,\n qname,\n} from '../../internal/xml/index.ts';\nimport {\n SHAPE_SLIDE,\n SHAPE_SNAPSHOT,\n SLIDE_DOCUMENT,\n SLIDE_SHAPES,\n type SlideData,\n type SlideShapeData,\n} from '../_internal-symbols.ts';\nimport { commitSlideData, refreshSlideData } from './_helpers.ts';\n// ---------------------------------------------------------------------------\n// Animations (single-effect, click-triggered).\n//\n// v1 scope: exactly one effect per slide, click-triggered, entrance or\n// exit preset family. The plan calls this the curated subset; full\n// multi-effect timing-tree authoring is post-1.0.\n\nexport type { AnimationEffect, AnimationOptions };\n\nconst NAME_TIMING_FN = qname('p', 'timing', NS.pml);\nconst ATTR_ID_FN = qname('', 'id', '');\n\nconst removeExistingTiming = (slide: SlideData): void => {\n slide[SLIDE_DOCUMENT].root.children = slide[SLIDE_DOCUMENT].root.children.filter(\n (c) =>\n !(c.kind === 'element' && c.name.namespaceURI === NS.pml && c.name.localName === 'timing'),\n );\n};\n\nconst findTiming = (slide: SlideData): XmlElement | null =>\n slide[SLIDE_DOCUMENT].root.children.find(\n (c): c is XmlElement =>\n c.kind === 'element' && c.name.namespaceURI === NS.pml && c.name.localName === 'timing',\n ) ?? null;\n\nconst insertTimingAtEnd = (slide: SlideData, timing: XmlElement): void => {\n // Schema ordering: `<p:timing>` is one of the last children of `<p:sld>`\n // (after cSld, clrMapOvr, transition). Appending to the end of\n // `<p:sld>` keeps the file valid.\n slide[SLIDE_DOCUMENT].root.children.push(timing);\n};\n\n// Depth-first search for the first descendant (or self) matching `pred`.\nconst findDescendant = (el: XmlElement, pred: (e: XmlElement) => boolean): XmlElement | null => {\n if (pred(el)) return el;\n for (const c of el.children) {\n if (c.kind === 'element') {\n const found = findDescendant(c, pred);\n if (found) return found;\n }\n }\n return null;\n};\n\nconst isPml = (el: XmlElement, local: string): boolean =>\n el.name.namespaceURI === NS.pml && el.name.localName === local;\n\n// Largest numeric `<p:cTn id=\"N\">` anywhere in the tree (0 when none).\nconst maxCTnId = (el: XmlElement): number => {\n let max = 0;\n const walk = (e: XmlElement): void => {\n if (isPml(e, 'cTn')) {\n const n = Number.parseInt(getAttrValue(e, ATTR_ID_FN) ?? '', 10);\n if (Number.isFinite(n) && n > max) max = n;\n }\n for (const c of e.children) if (c.kind === 'element') walk(c);\n };\n walk(el);\n return max;\n};\n\nconst shiftCTnIds = (el: XmlElement, offset: number): void => {\n const walk = (e: XmlElement): void => {\n if (isPml(e, 'cTn')) {\n const raw = getAttrValue(e, ATTR_ID_FN);\n const n = raw === null ? Number.NaN : Number.parseInt(raw, 10);\n if (Number.isFinite(n)) {\n e.attrs = e.attrs.map((a) =>\n a.name.namespaceURI === '' && a.name.localName === 'id'\n ? { ...a, value: String(n + offset) }\n : a,\n );\n }\n }\n for (const c of e.children) if (c.kind === 'element') walk(c);\n };\n walk(el);\n};\n\n// Largest numeric `grpId` attribute anywhere in the tree (-1 when none), so a\n// freshly-merged build group can take max+1 and never collide with an existing\n// one even when the authored grpIds have gaps.\nconst maxGrpId = (el: XmlElement): number => {\n let max = -1;\n const walk = (e: XmlElement): void => {\n const raw = getAttrValue(e, qname('', 'grpId', ''));\n if (raw !== null) {\n const n = Number.parseInt(raw, 10);\n if (Number.isFinite(n) && n > max) max = n;\n }\n for (const c of e.children) if (c.kind === 'element') walk(c);\n };\n walk(el);\n return max;\n};\n\nconst setGrpId = (el: XmlElement, grpId: string): void => {\n el.attrs = el.attrs.map((a) =>\n a.name.namespaceURI === '' && a.name.localName === 'grpId' ? { ...a, value: grpId } : a,\n );\n};\n\n// Merges a freshly-built single-effect timing into an existing `<p:timing>`,\n// renumbering the new effect's cTn ids so they stay unique. Returns false when\n// the existing tree lacks the mainSeq structure we know how to extend (so the\n// caller can avoid destroying it). This is what lets a second shape animate\n// without wiping a template's pre-existing animations.\nconst mergeEffectInto = (existing: XmlElement, fresh: XmlElement): boolean => {\n const existingMainSeqChildTnLst = (() => {\n const mainSeq = findDescendant(\n existing,\n (e) => isPml(e, 'cTn') && getAttrValue(e, qname('', 'nodeType', '')) === 'mainSeq',\n );\n return mainSeq ? firstChildElement(mainSeq, qname('p', 'childTnLst', NS.pml)) : null;\n })();\n if (!existingMainSeqChildTnLst) return false;\n\n // The fresh tree's click-effect wrapper is the <p:par> under its own mainSeq\n // childTnLst. Lift it out and renumber its cTn ids past the existing max.\n const freshMainSeq = findDescendant(\n fresh,\n (e) => isPml(e, 'cTn') && getAttrValue(e, qname('', 'nodeType', '')) === 'mainSeq',\n );\n const freshChildTnLst = freshMainSeq\n ? firstChildElement(freshMainSeq, qname('p', 'childTnLst', NS.pml))\n : null;\n const newPar = freshChildTnLst\n ? freshChildTnLst.children.find((c): c is XmlElement => c.kind === 'element' && isPml(c, 'par'))\n : null;\n const freshBldP = findDescendant(fresh, (e) => isPml(e, 'bldP'));\n if (!newPar || !freshBldP) return false;\n\n const offset = maxCTnId(existing) - 2; // fresh effect ids start at 3\n if (offset > 0) shiftCTnIds(newPar, offset);\n\n // Group the build with its effect under a fresh grpId so PowerPoint renders\n // each shape's effect independently. Use max-existing-grpId + 1 (not a count)\n // because a template's authored build grpIds need not be the contiguous\n // 0..n-1 sequence — PowerPoint can leave gaps after a delete/reorder, and a\n // count would then collide with an existing group.\n const newGrpId = String(maxGrpId(existing) + 1);\n const effectCTn = findDescendant(\n newPar,\n (e) => getAttrValue(e, qname('', 'presetID', '')) !== null,\n );\n if (effectCTn) setGrpId(effectCTn, newGrpId);\n setGrpId(freshBldP, newGrpId);\n\n existingMainSeqChildTnLst.children.push(newPar);\n const existingBldLst = findDescendant(existing, (e) => isPml(e, 'bldLst'));\n if (existingBldLst) existingBldLst.children.push(freshBldP);\n else existing.children.push(elem(qname('p', 'bldLst', NS.pml), { children: [freshBldP] }));\n return true;\n};\n\n/**\n * Sets a single click-triggered animation effect on the given shape.\n *\n * The effect is *merged* into any existing `<p:timing>` on the slide rather\n * than replacing it: animating a second shape (or re-running on a template that\n * already has authored animations) preserves the existing effects and appends\n * this one as the next click stop, with cTn ids renumbered to stay unique. To\n * clear every animation first, call `clearSlideAnimations`.\n *\n * Supported `effect` tokens:\n *\n * - `'fadeIn'` entrance fade\n * - `'fadeOut'` exit fade\n * - `'appear'` instant entrance\n * - `'disappear'` instant exit\n *\n * `durationMs` defaults to 500ms (fades only — `appear`/`disappear`\n * are instantaneous).\n */\nexport const setShapeAnimation = (shape: SlideShapeData, opts: AnimationOptions): void => {\n const slide = shape[SHAPE_SLIDE];\n const spid = shape[SHAPE_SNAPSHOT].id;\n const fresh = buildSingleEffectTiming(spid, opts);\n const existing = findTiming(slide);\n if (existing === null) {\n insertTimingAtEnd(slide, fresh);\n } else if (!mergeEffectInto(existing, fresh)) {\n // A timing tree we don't know how to extend (no mainSeq). Leave it intact\n // rather than silently destroying authored animations.\n throw new Error(\n 'setShapeAnimation: the slide already has an animation timing tree this single-effect ' +\n 'API cannot safely extend. Call clearSlideAnimations(slide) first to reset it.',\n );\n }\n commitSlideData(slide);\n refreshSlideData(slide);\n};\n\n/**\n * Returns the animation effect bound to this shape via the slide's\n * `<p:timing>` tree, or `null` if the shape has no animation in the\n * v1 single-effect schema we model. Unknown presets are reported as a\n * raw `null` rather than guessing.\n */\nexport const getShapeAnimation = (shape: SlideShapeData): AnimationEffect | null => {\n const slide = shape[SHAPE_SLIDE];\n const timing = slide[SLIDE_DOCUMENT].root.children.find(\n (c): c is XmlElement =>\n c.kind === 'element' && c.name.namespaceURI === NS.pml && c.name.localName === 'timing',\n );\n if (!timing) return null;\n\n // Confirm the shape's spid appears in <p:bldLst><p:bldP spid=\"...\"/>.\n const bldLst = firstChildElement(timing, qname('p', 'bldLst', NS.pml));\n if (!bldLst) return null;\n const spidStr = String(shape[SHAPE_SNAPSHOT].id);\n const matched = allChildElements(bldLst, qname('p', 'bldP', NS.pml)).some(\n (b) => getAttrValue(b, qname('', 'spid', '')) === spidStr,\n );\n if (!matched) return null;\n\n // Walk the timing tree to find the effect cTn for this shape. Our\n // builder emits `<p:cTn presetID=\"N\" presetClass=\"entr|exit\" ...\n // nodeType=\"clickEffect\">` with a `<p:spTgt spid=\"...\"/>` inside. We\n // accept any cTn carrying that combination.\n let presetID: string | null = null;\n let presetClass: string | null = null;\n const walk = (el: XmlElement): boolean => {\n if (el.name.namespaceURI === NS.pml && el.name.localName === 'cTn') {\n const cls = getAttrValue(el, qname('', 'presetClass', ''));\n const id = getAttrValue(el, qname('', 'presetID', ''));\n if (cls && id) {\n // Confirm this cTn targets our shape via a descendant spTgt.\n const targetsShape = (sub: XmlElement): boolean => {\n if (\n sub.name.namespaceURI === NS.pml &&\n sub.name.localName === 'spTgt' &&\n getAttrValue(sub, qname('', 'spid', '')) === spidStr\n ) {\n return true;\n }\n for (const c of sub.children) {\n if (c.kind === 'element' && targetsShape(c)) return true;\n }\n return false;\n };\n if (targetsShape(el)) {\n presetClass = cls;\n presetID = id;\n return true;\n }\n }\n }\n for (const c of el.children) {\n if (c.kind === 'element' && walk(c)) return true;\n }\n return false;\n };\n walk(timing);\n if (!presetID || !presetClass) return null;\n\n // Map back to AnimationEffect.\n const id = Number.parseInt(presetID, 10);\n if (presetClass === 'entr' && id === 1) return 'appear';\n if (presetClass === 'entr' && id === 10) return 'fadeIn';\n if (presetClass === 'exit' && id === 1) return 'disappear';\n if (presetClass === 'exit' && id === 10) return 'fadeOut';\n return null;\n};\n\n/** Removes the slide's `<p:timing>` element entirely. */\n/**\n * Returns every shape on the slide that has an authored animation\n * effect (i.e. `getShapeAnimation(shape)` is not `null`). Pair to\n * `slideHasAnimations`. Useful for audit reports — \"which shapes on\n * this slide actually animate?\" before exporting to a video pipeline\n * that doesn't honor PowerPoint's timing tree.\n */\nexport const findShapesWithAnimation = (slide: SlideData): ReadonlyArray<SlideShapeData> => {\n const out: SlideShapeData[] = [];\n for (const shape of slide[SLIDE_SHAPES]) {\n if (getShapeAnimation(shape) !== null) out.push(shape);\n }\n return out;\n};\n\nexport const clearSlideAnimations = (slide: SlideData): void => {\n removeExistingTiming(slide);\n commitSlideData(slide);\n refreshSlideData(slide);\n};\n\nvoid NAME_TIMING_FN;\n","// Slide title convenience.\n\nimport { SHAPE_SNAPSHOT, type SlideData } from '../_internal-symbols.ts';\nimport { findSlidePlaceholder, setShapeText } from './shapes.ts';\n\n// ---------------------------------------------------------------------------\n// Slide title convenience.\n//\n// Most decks bind their title placeholder to `type=\"title\"` or `type=\"ctrTitle\"`\n// (the latter is the centered hero title on a \"Title Slide\" layout).\n// These two helpers cover ~90% of the \"set the slide title\" use case.\n\n/**\n * Returns the slide's title text, or `null` if neither a `title` nor\n * a `ctrTitle` placeholder is present.\n */\nexport const getSlideTitle = (slide: SlideData): string | null => {\n const titleShape =\n findSlidePlaceholder(slide, 'title') ?? findSlidePlaceholder(slide, 'ctrTitle');\n if (titleShape === null) return null;\n return titleShape[SHAPE_SNAPSHOT].text ?? null;\n};\n\n/**\n * Returns the slide's body text, or `null` if no `body` placeholder\n * is present. Mirror of `getSlideTitle`; pairs with `setSlideBody`.\n */\nexport const getSlideBody = (slide: SlideData): string | null => {\n const bodyShape = findSlidePlaceholder(slide, 'body');\n if (bodyShape === null) return null;\n return bodyShape[SHAPE_SNAPSHOT].text ?? null;\n};\n\n/**\n * Sets the slide's title text. Looks for a `title` placeholder first,\n * falling back to `ctrTitle`. Throws if neither exists — the slide's\n * layout has no title slot.\n */\nexport const setSlideTitle = (slide: SlideData, title: string): void => {\n const titleShape =\n findSlidePlaceholder(slide, 'title') ?? findSlidePlaceholder(slide, 'ctrTitle');\n if (titleShape === null) {\n throw new Error('setSlideTitle: slide has no title / ctrTitle placeholder');\n }\n setShapeText(titleShape, title);\n};\n\n/**\n * Bulk-fills slide placeholders by type token. Each entry in\n * `byType` maps a `<p:ph type>` token (e.g. `'title'`, `'body'`,\n * `'ftr'`, `'dt'`) to the text to set. Silently skips entries\n * whose placeholder isn't present on the slide.\n *\n * Useful for template-fill workflows where the caller has all the\n * data in one struct.\n */\nexport const setSlidePlaceholders = (\n slide: SlideData,\n byType: Readonly<Record<string, string>>,\n): void => {\n for (const [type, text] of Object.entries(byType)) {\n const shape =\n type === 'title'\n ? (findSlidePlaceholder(slide, 'title') ?? findSlidePlaceholder(slide, 'ctrTitle'))\n : findSlidePlaceholder(slide, type);\n if (shape !== null) setShapeText(shape, text);\n }\n};\n\n/**\n * Writes `text` into the first body placeholder on the slide.\n * Newlines start a new paragraph (each becomes its own bullet on\n * layouts that bullet their body placeholder).\n *\n * Throws when the slide has no body placeholder — pair with\n * `findSlideLayoutByType(pres, 'obj')` / `'tx'` to add the slide\n * onto a layout that has one.\n */\nexport const setSlideBody = (slide: SlideData, text: string): void => {\n const bodyShape = findSlidePlaceholder(slide, 'body');\n if (bodyShape === null) {\n throw new Error('setSlideBody: slide has no body placeholder');\n }\n setShapeText(bodyShape, text);\n};\n","// Per-run text accessors.\n\nimport { parseRPrLikeElement, resolveDrawingColor } from './shape-color.ts';\nimport {\n type BulletStyle,\n type ParagraphAlignment,\n type TextFormat,\n applyBulletToParagraph,\n} from '../../internal/drawingml/index.ts';\nimport { emptyRels, nextRelId, partName, resolveTarget } from '../../internal/opc/index.ts';\nimport { REL_TYPES } from '../../internal/presentationml/index.ts';\nimport {\n NS,\n type XmlElement,\n attr,\n elem,\n firstChildElement,\n getAttrValue,\n insertChildByRank,\n qname,\n} from '../../internal/xml/index.ts';\nimport {\n INTERNAL_PACKAGE,\n type PresentationData,\n SHAPE_ELEMENT,\n SHAPE_SLIDE,\n SHAPE_SNAPSHOT,\n SLIDE_PART_NAME,\n type SlideShapeData,\n} from '../_internal-symbols.ts';\nimport { commitAndRefresh, requireTxBody } from './_helpers.ts';\nimport { getPresentationTheme } from './theme.ts';\nimport { getSlides } from './slide-query.ts';\nimport { findCNvPr, NAME_HLINK_CLICK_FN, type ShapeClickAction } from './embedded.ts';\n\nconst NAME_TX_BODY = qname('p', 'txBody', NS.pml);\n\n// ---------------------------------------------------------------------------\n// Per-run text accessors.\n//\n// Lets callers reach into a shape's text body to read or format a\n// specific paragraph or run. `applyFormatToAllRuns` covers the bulk-edit\n// case; these helpers cover \"make this one word red.\"\n\nconst NAME_A_P = qname('a', 'p', NS.dml);\nconst NAME_A_R = qname('a', 'r', NS.dml);\nexport const NAME_A_RPR = qname('a', 'rPr', NS.dml);\nconst NAME_A_T = qname('a', 't', NS.dml);\n\nconst paragraphsOf = (txBody: XmlElement): XmlElement[] =>\n txBody.children.filter(\n (c): c is XmlElement =>\n c.kind === 'element' &&\n c.name.namespaceURI === NAME_A_P.namespaceURI &&\n c.name.localName === 'p',\n );\n\nexport const runsOf = (paragraph: XmlElement): XmlElement[] =>\n paragraph.children.filter(\n (c): c is XmlElement =>\n c.kind === 'element' &&\n c.name.namespaceURI === NAME_A_R.namespaceURI &&\n c.name.localName === 'r',\n );\n\nexport const requireParagraph = (shape: SlideShapeData, paragraphIndex: number): XmlElement => {\n const txBody = requireTxBody(shape);\n const paragraphs = paragraphsOf(txBody);\n const paragraph = paragraphs[paragraphIndex];\n if (!paragraph) {\n throw new RangeError(\n `paragraph index ${paragraphIndex} out of range (have ${paragraphs.length})`,\n );\n }\n return paragraph;\n};\n\nexport const requireRun = (\n shape: SlideShapeData,\n paragraphIndex: number,\n runIndex: number,\n): XmlElement => {\n const paragraph = requireParagraph(shape, paragraphIndex);\n const runs = runsOf(paragraph);\n const run = runs[runIndex];\n if (!run) {\n throw new RangeError(\n `run index ${runIndex} out of range in paragraph ${paragraphIndex} (have ${runs.length})`,\n );\n }\n return run;\n};\n\nexport const ensureRPr = (run: XmlElement): XmlElement => {\n const existing = firstChildElement(run, NAME_A_RPR);\n if (existing !== null) return existing;\n // `<a:rPr>` is the first child of `<a:r>` per the schema.\n const fresh = elem(NAME_A_RPR);\n run.children.unshift(fresh);\n return fresh;\n};\n\nconst readRunText = (run: XmlElement): string => {\n const tEl = firstChildElement(run, NAME_A_T);\n if (tEl === null) return '';\n let out = '';\n for (const child of tEl.children) {\n if (child.kind === 'text' || child.kind === 'cdata') out += child.data;\n }\n return out;\n};\n\nconst writeRunText = (run: XmlElement, value: string): void => {\n let tEl = firstChildElement(run, NAME_A_T);\n if (tEl === null) {\n tEl = elem(NAME_A_T);\n run.children.push(tEl);\n }\n tEl.children = [{ kind: 'text', data: value }];\n};\n\n/** Number of paragraphs in the shape's text body. Throws for non-text shapes. */\nexport const getShapeParagraphCount = (shape: SlideShapeData): number =>\n paragraphsOf(requireTxBody(shape)).length;\n\n/**\n * One inline element in a paragraph as ordered: a literal text run\n * (`<a:r>`), a field substitution (`<a:fld>` — slide number, date, etc.),\n * or a line break (`<a:br>`). Renderers walk this list instead of the\n * strict `<a:r>`-only `getShapeRunCount` / `getShapeRunText` pair when\n * they need to reproduce the paragraph's full visible content.\n *\n * `text` is the cached value (`<a:t>` content for `r` and `fld`; `''`\n * for `br`). `format` is the literal `<a:rPr>` on the element when\n * present; use `getShapeRunFormatEffective` to walk inheritance.\n *\n * Field kinds (`fld.type`): typical ECMA-376 `ST_TextFieldType` tokens\n * are `slidenum`, `datetime` (variants `1`..`13`), `presentationDate`,\n * `headerfooter`, `footer`, etc. Unrecognised tokens come through\n * unchanged so renderers can decide whether to substitute live values.\n */\nexport type ShapeParagraphElement =\n | { readonly kind: 'r'; readonly text: string; readonly format: TextFormat | null }\n | {\n readonly kind: 'fld';\n readonly text: string;\n readonly format: TextFormat | null;\n readonly type: string | null;\n }\n | { readonly kind: 'br'; readonly format: TextFormat | null };\n\n/**\n * Returns the inline children of a paragraph in document order — runs,\n * field placeholders, and line breaks. Used by renderers that need to\n * reproduce the paragraph faithfully (the `<a:r>`-only run accessors\n * silently drop fields and breaks).\n */\nexport const getShapeParagraphElements = (\n shape: SlideShapeData,\n paragraphIndex: number,\n): ReadonlyArray<ShapeParagraphElement> =>\n readParagraphElements(requireParagraph(shape, paragraphIndex));\n\n/**\n * Walks a single `<a:p>` element and returns its inline children in\n * document order. Shared by the shape-text reader above and the table-cell\n * text reader: both use the identical DrawingML run/field/break grammar, so\n * only the way the paragraph element is located differs.\n *\n * @internal\n */\nexport const readParagraphElements = (\n paragraph: XmlElement,\n): ReadonlyArray<ShapeParagraphElement> => {\n const out: ShapeParagraphElement[] = [];\n const readT = (parent: XmlElement): string => {\n const tEl = firstChildElement(parent, NAME_A_T);\n if (!tEl) return '';\n let acc = '';\n for (const c of tEl.children) {\n if (c.kind === 'text' || c.kind === 'cdata') acc += c.data;\n }\n return acc;\n };\n const readFmt = (parent: XmlElement): TextFormat | null => {\n const rPr = firstChildElement(parent, NAME_A_RPR);\n if (!rPr) return null;\n return parseRPrLikeElement(rPr) as TextFormat;\n };\n for (const child of paragraph.children) {\n if (child.kind !== 'element' || child.name.namespaceURI !== NS.dml) continue;\n if (child.name.localName === 'r') {\n out.push({ kind: 'r', text: readT(child), format: readFmt(child) });\n } else if (child.name.localName === 'fld') {\n const type = getAttrValue(child, qname('', 'type', ''));\n out.push({ kind: 'fld', text: readT(child), format: readFmt(child), type });\n } else if (child.name.localName === 'br') {\n out.push({ kind: 'br', format: readFmt(child) });\n }\n }\n return out;\n};\n\n/**\n * Number of text runs in the given paragraph. Throws on out-of-range\n * paragraph index or non-text shapes.\n */\nexport const getShapeRunCount = (shape: SlideShapeData, paragraphIndex: number): number =>\n runsOf(requireParagraph(shape, paragraphIndex)).length;\n\n/** Visible text of a single run. */\nexport const getShapeRunText = (\n shape: SlideShapeData,\n paragraphIndex: number,\n runIndex: number,\n): string => readRunText(requireRun(shape, paragraphIndex, runIndex));\n\n/**\n * Sets `<a:hlinkClick>` on a single run. Per-run counterpart to\n * `setShapeHyperlink` (which targets every run in the shape). Pass\n * `null` to clear the link on that run alone — other runs are\n * untouched. Allocates or reuses a hyperlink rel on the slide\n * exactly like the shape-level setter.\n */\nexport const setShapeRunHyperlink = (\n shape: SlideShapeData,\n paragraphIndex: number,\n runIndex: number,\n url: string | null,\n tooltip?: string,\n): void => {\n const run = requireRun(shape, paragraphIndex, runIndex);\n let rPr = firstChildElement(run, qname('a', 'rPr', NS.dml));\n if (rPr === null) {\n rPr = elem(qname('a', 'rPr', NS.dml));\n run.children.unshift(rPr);\n }\n rPr.children = rPr.children.filter(\n (c) =>\n !(\n c.kind === 'element' &&\n c.name.namespaceURI === NS.dml &&\n c.name.localName === 'hlinkClick'\n ),\n );\n if (url !== null) {\n const slide = shape[SHAPE_SLIDE];\n const pkg = slide[INTERNAL_PACKAGE];\n const rels = pkg.getRels(slide[SLIDE_PART_NAME]) ?? emptyRels();\n const existing = rels.items.find(\n (r) => r.type === REL_TYPES.hyperlink && r.target === url && r.targetMode === 'External',\n );\n let rId: string;\n if (existing) {\n rId = existing.id;\n } else {\n rId = nextRelId(rels.items.map((r) => r.id));\n rels.items.push({\n id: rId,\n type: REL_TYPES.hyperlink,\n target: url,\n targetMode: 'External',\n });\n pkg.setRels(slide[SLIDE_PART_NAME], rels);\n }\n const hlinkAttrs = [attr(qname('r', 'id', NS.officeDocRels), rId)];\n if (tooltip !== undefined) {\n hlinkAttrs.push(attr(qname('', 'tooltip', ''), tooltip));\n }\n rPr.children.push(\n elem(qname('a', 'hlinkClick', NS.dml), {\n attrs: hlinkAttrs,\n }),\n );\n }\n commitAndRefresh(shape);\n};\n\n/**\n * Reads the external URL on a single run's `<a:hlinkClick>`. Per-run\n * counterpart to `getShapeHyperlink` (which only surfaces the first\n * link it finds). Returns `null` when this run has no link, or the\n * link's `r:id` resolves to a non-hyperlink rel.\n */\nexport const getShapeRunHyperlink = (\n shape: SlideShapeData,\n paragraphIndex: number,\n runIndex: number,\n): string | null => {\n const run = requireRun(shape, paragraphIndex, runIndex);\n const rPr = firstChildElement(run, qname('a', 'rPr', NS.dml));\n if (!rPr) return null;\n const hlink = firstChildElement(rPr, qname('a', 'hlinkClick', NS.dml));\n if (!hlink) return null;\n const rId = getAttrValue(hlink, qname('r', 'id', NS.officeDocRels));\n if (!rId) return null;\n const slide = shape[SHAPE_SLIDE];\n const rels = slide[INTERNAL_PACKAGE].getRels(slide[SLIDE_PART_NAME]);\n if (!rels) return null;\n const rel = rels.items.find((x) => x.id === rId);\n if (rel?.type === REL_TYPES.hyperlink && rel.targetMode === 'External') return rel.target;\n return null;\n};\n\n/**\n * Reads the tooltip text on the shape's `<a:hlinkClick tooltip=\"…\"/>`.\n * Returns `null` when no hyperlink is set or the link doesn't author\n * a tooltip. Tooltips show up in PowerPoint when the user hovers over\n * a linked shape in slide-show mode.\n *\n * Scans run-level `<a:rPr><a:hlinkClick>` first (where\n * `setShapeHyperlink` writes) and falls back to the\n * `<p:nvSpPr><p:cNvPr><a:hlinkClick>` shape-click hyperlink. Mirrors\n * `getShapeHyperlink`'s read path so the writer / reader pair is\n * consistent.\n */\nexport const getShapeHyperlinkTooltip = (shape: SlideShapeData): string | null => {\n if (shape[SHAPE_SNAPSHOT].kind === 'shape') {\n const txBody = firstChildElement(shape[SHAPE_ELEMENT], NAME_TX_BODY);\n if (txBody) {\n for (const p of txBody.children) {\n if (p.kind !== 'element' || p.name.namespaceURI !== NS.dml || p.name.localName !== 'p')\n continue;\n for (const r of p.children) {\n if (r.kind !== 'element' || r.name.namespaceURI !== NS.dml || r.name.localName !== 'r')\n continue;\n const rPr = firstChildElement(r, qname('a', 'rPr', NS.dml));\n if (!rPr) continue;\n const hlink = firstChildElement(rPr, qname('a', 'hlinkClick', NS.dml));\n if (!hlink) continue;\n const tt = getAttrValue(hlink, qname('', 'tooltip', ''));\n if (tt !== null) return tt;\n }\n }\n }\n }\n const cNvPr = findCNvPr(shape);\n if (!cNvPr) return null;\n const hlink = firstChildElement(cNvPr, NAME_HLINK_CLICK_FN);\n if (!hlink) return null;\n const tt = getAttrValue(hlink, qname('', 'tooltip', ''));\n return tt ?? null;\n};\n\n/**\n * Reads the tooltip on a per-run `<a:rPr><a:hlinkClick tooltip=\"…\"/>`.\n * Same semantics as `getShapeHyperlinkTooltip` but scoped to a single\n * run.\n */\nexport const getShapeRunHyperlinkTooltip = (\n shape: SlideShapeData,\n paragraphIndex: number,\n runIndex: number,\n): string | null => {\n const run = requireRun(shape, paragraphIndex, runIndex);\n const rPr = firstChildElement(run, qname('a', 'rPr', NS.dml));\n if (!rPr) return null;\n const hlink = firstChildElement(rPr, qname('a', 'hlinkClick', NS.dml));\n if (!hlink) return null;\n const tt = getAttrValue(hlink, qname('', 'tooltip', ''));\n return tt ?? null;\n};\n\n/**\n * Same as `getShapeClickAction` but reads the per-run\n * `<a:rPr><a:hlinkClick action=… r:id=…/>`. Recognises:\n *\n * - `{ kind: 'url', url }` — external hyperlink rel\n * - `{ kind: 'slide', slide }` — slide-jump action + slide rel\n * - `{ kind: 'nextSlide' | 'prevSlide' | 'firstSlide' | 'lastSlide' }`\n *\n * Returns `null` for runs without an action or unknown action tokens.\n */\nexport const getShapeRunClickAction = (\n shape: SlideShapeData,\n paragraphIndex: number,\n runIndex: number,\n): ShapeClickAction | null => {\n const run = requireRun(shape, paragraphIndex, runIndex);\n const rPr = firstChildElement(run, qname('a', 'rPr', NS.dml));\n if (!rPr) return null;\n const hlink = firstChildElement(rPr, qname('a', 'hlinkClick', NS.dml));\n if (!hlink) return null;\n const action = getAttrValue(hlink, qname('', 'action', ''));\n const rId = getAttrValue(hlink, qname('r', 'id', NS.officeDocRels));\n\n if (action === 'ppaction://hlinkshowjump?jump=nextslide') return { kind: 'nextSlide' };\n if (action === 'ppaction://hlinkshowjump?jump=previousslide') return { kind: 'prevSlide' };\n if (action === 'ppaction://hlinkshowjump?jump=firstslide') return { kind: 'firstSlide' };\n if (action === 'ppaction://hlinkshowjump?jump=lastslide') return { kind: 'lastSlide' };\n\n if (rId === null || rId === '') return null;\n const slide = shape[SHAPE_SLIDE];\n const pkg = slide[INTERNAL_PACKAGE];\n const rels = pkg.getRels(slide[SLIDE_PART_NAME]);\n if (!rels) return null;\n const rel = rels.items.find((r) => r.id === rId);\n if (!rel) return null;\n if (action === 'ppaction://hlinksldjump' && rel.type === REL_TYPES.slide) {\n const targetPartName = rel.target.startsWith('/')\n ? partName(rel.target)\n : resolveTarget(slide[SLIDE_PART_NAME], rel.target);\n const pres: PresentationData = { [INTERNAL_PACKAGE]: pkg, _slidesCache: null };\n for (const candidate of getSlides(pres)) {\n if (candidate[SLIDE_PART_NAME] === targetPartName) return { kind: 'slide', slide: candidate };\n }\n return null;\n }\n if (rel.type === REL_TYPES.hyperlink && rel.targetMode === 'External') {\n return { kind: 'url', url: rel.target };\n }\n return null;\n};\n\nexport const NAME_A_PPR = qname('a', 'pPr', NS.dml);\nexport const ATTR_LVL = qname('', 'lvl', '');\nconst ATTR_ALGN_FN = qname('', 'algn', '');\n\nconst ensurePPr = (paragraph: XmlElement): XmlElement => {\n const existing = firstChildElement(paragraph, NAME_A_PPR);\n if (existing !== null) return existing;\n const fresh = elem(NAME_A_PPR);\n // <a:pPr> must be the first child of <a:p>.\n paragraph.children.unshift(fresh);\n return fresh;\n};\n\nconst alignTokenForFn = (a: ParagraphAlignment): string => {\n switch (a) {\n case 'left':\n case 'l':\n return 'l';\n case 'center':\n case 'ctr':\n return 'ctr';\n case 'right':\n case 'r':\n return 'r';\n case 'justify':\n case 'just':\n return 'just';\n case 'distribute':\n case 'dist':\n return 'dist';\n default:\n return a;\n }\n};\n\n/**\n * Sets the horizontal alignment of a single paragraph. Same token set\n * as `setShapeAlignment`. Other paragraphs are untouched.\n */\nexport const setParagraphAlignment = (\n shape: SlideShapeData,\n paragraphIndex: number,\n align: ParagraphAlignment,\n): void => {\n const paragraph = requireParagraph(shape, paragraphIndex);\n const pPr = ensurePPr(paragraph);\n pPr.attrs = pPr.attrs.filter((a) => a.name.localName !== 'algn');\n pPr.attrs.push(attr(ATTR_ALGN_FN, alignTokenForFn(align)));\n commitAndRefresh(shape);\n};\n\n/**\n * Sets the paragraph's nesting level (`<a:pPr lvl=\"N\"/>`). Levels are\n * 0-indexed; PowerPoint accepts 0 through 8. Pass `0` to clear an\n * existing level — `<a:pPr lvl=\"0\"/>` is the same as omitting the attr.\n *\n * Used in tandem with bullets to author nested lists:\n *\n * setShapeText(shape, 'Item 1\\nNested\\nItem 2');\n * setShapeBullets(shape, 'bullet');\n * setParagraphLevel(shape, 1, 1); // indent the second line\n */\nexport const setParagraphLevel = (\n shape: SlideShapeData,\n paragraphIndex: number,\n level: number,\n): void => {\n if (!Number.isInteger(level) || level < 0 || level > 8) {\n throw new RangeError(`paragraph level must be an integer in [0, 8], got ${level}`);\n }\n const paragraph = requireParagraph(shape, paragraphIndex);\n const pPr = ensurePPr(paragraph);\n pPr.attrs = pPr.attrs.filter((a) => a.name.localName !== 'lvl');\n if (level > 0) pPr.attrs.push(attr(ATTR_LVL, String(level)));\n commitAndRefresh(shape);\n};\n\n/**\n * Reads the paragraph's horizontal alignment. Returns `null` when no\n * `algn` attribute is present (inherits from layout / master).\n */\nexport const getParagraphAlignment = (\n shape: SlideShapeData,\n paragraphIndex: number,\n): ParagraphAlignment | null => {\n const paragraph = requireParagraph(shape, paragraphIndex);\n const pPr = firstChildElement(paragraph, NAME_A_PPR);\n if (pPr === null) return null;\n const v = getAttrValue(pPr, ATTR_ALGN_FN);\n return (v as ParagraphAlignment | null) ?? null;\n};\n\n/**\n * Reads the paragraph's nesting level (`lvl` attribute), or `0` when\n * absent — PowerPoint's default. Returns `null` for non-existent\n * paragraphs.\n */\nexport const getParagraphLevel = (shape: SlideShapeData, paragraphIndex: number): number => {\n const paragraph = requireParagraph(shape, paragraphIndex);\n const pPr = firstChildElement(paragraph, NAME_A_PPR);\n if (pPr === null) return 0;\n const v = getAttrValue(pPr, ATTR_LVL);\n if (v === null) return 0;\n const n = Number.parseInt(v, 10);\n return Number.isFinite(n) ? n : 0;\n};\n\n// CT_TextParagraphProperties (a:pPr) is an xsd:sequence: line spacing, then\n// before/after spacing, then the bullet-related groups, then tabLst/defRPr.\n// Setters strip their element then re-insert at the mandated slot.\nconst PPR_CHILD_RANK: Record<string, number> = {\n lnSpc: 0,\n spcBef: 1,\n spcAft: 2,\n buClrTx: 3,\n buClr: 3,\n buSzTx: 4,\n buSzPct: 4,\n buSzPts: 4,\n buFontTx: 5,\n buFont: 5,\n buNone: 6,\n buAutoNum: 6,\n buChar: 6,\n tabLst: 7,\n defRPr: 8,\n extLst: 9,\n};\nconst pPrChildRank = (el: XmlElement): number =>\n el.name.namespaceURI === NS.dml ? (PPR_CHILD_RANK[el.name.localName] ?? 99) : 99;\n\n/**\n * Sets the spacing before and/or after a paragraph, in points (where\n * a \"point\" is 1/72 inch). PowerPoint stores these as hundredths of a\n * point inside `<a:pPr><a:spcBef>/<a:spcAft><a:spcPts val=\"…\"/>` —\n * the helper converts.\n *\n * setParagraphSpacing(shape, 0, { beforePts: 6, afterPts: 3 });\n *\n * Omitting a side keeps the existing value (or layout default).\n * Passing a side as `null` removes that spacing element.\n */\nexport const setParagraphSpacing = (\n shape: SlideShapeData,\n paragraphIndex: number,\n opts: { beforePts?: number | null; afterPts?: number | null },\n): void => {\n const paragraph = requireParagraph(shape, paragraphIndex);\n const pPr = ensurePPr(paragraph);\n\n const writeSide = (localName: 'spcBef' | 'spcAft', value: number | null | undefined): void => {\n if (value === undefined) return;\n pPr.children = pPr.children.filter(\n (c) =>\n !(c.kind === 'element' && c.name.namespaceURI === NS.dml && c.name.localName === localName),\n );\n if (value === null) return;\n if (!Number.isFinite(value) || value < 0) {\n throw new RangeError(`paragraph ${localName} must be a non-negative number, got ${value}`);\n }\n const spcEl = elem(qname('a', localName, NS.dml), {\n children: [\n elem(qname('a', 'spcPts', NS.dml), {\n attrs: [attr(qname('', 'val', ''), String(Math.round(value * 100)))],\n }),\n ],\n });\n // spcBef/spcAft must precede any bullet (buChar/buAutoNum/buFont/...) and\n // tabLst/defRPr in CT_TextParagraphProperties; insert at the schema slot\n // rather than pushing to the end of a paragraph that already has bullets.\n insertChildByRank(pPr, spcEl, pPrChildRank);\n };\n\n writeSide('spcBef', opts.beforePts);\n writeSide('spcAft', opts.afterPts);\n commitAndRefresh(shape);\n};\n\n/**\n * Reads back paragraph spacing in points. Returns `{ beforePts,\n * afterPts }`; each side is `null` when no `<a:spcBef>` / `<a:spcAft>`\n * is present or when the inner element isn't `<a:spcPts>` (percentage\n * spacing is reported as `null` for now).\n */\nexport const getParagraphSpacing = (\n shape: SlideShapeData,\n paragraphIndex: number,\n): { readonly beforePts: number | null; readonly afterPts: number | null } => {\n const paragraph = requireParagraph(shape, paragraphIndex);\n const pPr = firstChildElement(paragraph, NAME_A_PPR);\n if (!pPr) return { beforePts: null, afterPts: null };\n const readSide = (localName: 'spcBef' | 'spcAft'): number | null => {\n const side = firstChildElement(pPr, qname('a', localName, NS.dml));\n if (!side) return null;\n const spcPts = firstChildElement(side, qname('a', 'spcPts', NS.dml));\n if (!spcPts) return null;\n const v = getAttrValue(spcPts, qname('', 'val', ''));\n if (v === null) return null;\n const n = Number.parseInt(v, 10);\n return Number.isFinite(n) ? n / 100 : null;\n };\n return { beforePts: readSide('spcBef'), afterPts: readSide('spcAft') };\n};\n\n/**\n * Reads the paragraph's left / right / first-line indents from\n * `<a:pPr marL=\"…\" marR=\"…\" indent=\"…\"/>`. Each is in EMU (matching\n * PowerPoint's internal storage); positive means a positive indent,\n * negative `indent` is a hanging indent (typical for bullets).\n *\n * Returns `null` for sides the paragraph doesn't set (those inherit\n * from the layout / master).\n */\nexport const getParagraphIndent = (\n shape: SlideShapeData,\n paragraphIndex: number,\n): { leftEmu: number | null; rightEmu: number | null; firstLineEmu: number | null } => {\n const paragraph = requireParagraph(shape, paragraphIndex);\n const pPr = firstChildElement(paragraph, NAME_A_PPR);\n if (!pPr) return { leftEmu: null, rightEmu: null, firstLineEmu: null };\n const read = (name: string): number | null => {\n const raw = getAttrValue(pPr, qname('', name, ''));\n if (raw === null) return null;\n const n = Number.parseInt(raw, 10);\n return Number.isFinite(n) ? n : null;\n };\n return {\n leftEmu: read('marL'),\n rightEmu: read('marR'),\n firstLineEmu: read('indent'),\n };\n};\n\n/**\n * Reads the paragraph's `<a:lnSpc>` line spacing. PowerPoint stores\n * line spacing two ways:\n *\n * - Multiple of the natural line height — `<a:spcPct val=\"150000\"/>`\n * (= 1.5×). Returns `{ kind: 'pct', value }` with value as the unit\n * fraction (1.5).\n * - Fixed points — `<a:spcPts val=\"2400\"/>` (= 24pt). Returns\n * `{ kind: 'pts', value }` with value in points.\n *\n * Returns `null` when no `<a:lnSpc>` is present (the paragraph\n * inherits line spacing from the layout / master).\n */\nexport const getParagraphLineSpacing = (\n shape: SlideShapeData,\n paragraphIndex: number,\n):\n | { readonly kind: 'pct'; readonly value: number }\n | { readonly kind: 'pts'; readonly value: number }\n | null => {\n const paragraph = requireParagraph(shape, paragraphIndex);\n const pPr = firstChildElement(paragraph, NAME_A_PPR);\n if (!pPr) return null;\n const lnSpc = firstChildElement(pPr, qname('a', 'lnSpc', NS.dml));\n if (!lnSpc) return null;\n const pct = firstChildElement(lnSpc, qname('a', 'spcPct', NS.dml));\n if (pct) {\n const v = getAttrValue(pct, qname('', 'val', ''));\n if (v !== null) {\n let n = Number.parseFloat(v);\n if (Number.isFinite(n)) {\n if (Math.abs(n) > 1) n = n / 100000;\n return { kind: 'pct', value: n };\n }\n }\n }\n const pts = firstChildElement(lnSpc, qname('a', 'spcPts', NS.dml));\n if (pts) {\n const v = getAttrValue(pts, qname('', 'val', ''));\n if (v !== null) {\n const n = Number.parseInt(v, 10);\n if (Number.isFinite(n)) return { kind: 'pts', value: n / 100 };\n }\n }\n return null;\n};\n\n/**\n * Sets a paragraph's line spacing — the writer counterpart to\n * `getParagraphLineSpacing`. Two modes (mirroring `<a:lnSpc>`):\n *\n * - `{ kind: 'pct', value }` — a multiple of single spacing\n * (`1` = single, `1.5` = 150%, `2` = double) → `<a:spcPct>`.\n * - `{ kind: 'pts', value }` — a fixed leading in points → `<a:spcPts>`.\n *\n * Pass `null` to clear the override (the paragraph then inherits line\n * spacing from the layout / master).\n */\nexport const setParagraphLineSpacing = (\n shape: SlideShapeData,\n paragraphIndex: number,\n spacing:\n | { readonly kind: 'pct'; readonly value: number }\n | { readonly kind: 'pts'; readonly value: number }\n | null,\n): void => {\n const paragraph = requireParagraph(shape, paragraphIndex);\n const pPr = ensurePPr(paragraph);\n pPr.children = pPr.children.filter(\n (c) =>\n !(c.kind === 'element' && c.name.namespaceURI === NS.dml && c.name.localName === 'lnSpc'),\n );\n if (spacing !== null) {\n if (!Number.isFinite(spacing.value) || spacing.value < 0) {\n throw new RangeError(\n `line spacing value must be a non-negative number, got ${spacing.value}`,\n );\n }\n const inner =\n spacing.kind === 'pct'\n ? elem(qname('a', 'spcPct', NS.dml), {\n attrs: [attr(qname('', 'val', ''), String(Math.round(spacing.value * 100000)))],\n })\n : elem(qname('a', 'spcPts', NS.dml), {\n attrs: [attr(qname('', 'val', ''), String(Math.round(spacing.value * 100)))],\n });\n // <a:lnSpc> is the first child of CT_TextParagraphProperties.\n insertChildByRank(pPr, elem(qname('a', 'lnSpc', NS.dml), { children: [inner] }), pPrChildRank);\n }\n commitAndRefresh(shape);\n};\n\n/**\n * Reads back the bullet style on a single paragraph, or `null` when\n * no `<a:buChar>` / `<a:buAutoNum>` / `<a:buNone>` is present (the\n * paragraph inherits its bullet from the layout / master).\n */\nexport const getParagraphBullet = (\n shape: SlideShapeData,\n paragraphIndex: number,\n): BulletStyle | null => {\n const paragraph = requireParagraph(shape, paragraphIndex);\n const pPr = firstChildElement(paragraph, NAME_A_PPR);\n if (pPr === null) return null;\n for (const c of pPr.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n if (c.name.localName === 'buNone') return 'none';\n if (c.name.localName === 'buChar') {\n const char = getAttrValue(c, qname('', 'char', ''));\n if (char === '•') return 'bullet';\n if (char !== null) return { char };\n }\n if (c.name.localName === 'buAutoNum') {\n const t = getAttrValue(c, qname('', 'type', ''));\n if (t === 'arabicPeriod') return 'number';\n if (t !== null) return { autoNum: t };\n }\n }\n return null;\n};\n\n/**\n * Returns `true` when the paragraph uses an image as its bullet\n * (`<a:pPr><a:buBlip r:embed=\"…\"/>`). Renderers without image\n * support should fall back to a generic bullet glyph.\n *\n * The underlying rId / image bytes aren't surfaced here — resolving\n * that would need the rels of the layout / master the paragraph\n * inherits from, which can be cumbersome. Knowing that the bullet\n * *is* an image is usually enough for the UI to pick a fallback.\n */\nexport const isParagraphBulletPicture = (\n shape: SlideShapeData,\n paragraphIndex: number,\n): boolean => {\n const paragraph = requireParagraph(shape, paragraphIndex);\n const pPr = firstChildElement(paragraph, NAME_A_PPR);\n if (!pPr) return false;\n return firstChildElement(pPr, qname('a', 'buBlip', NS.dml)) !== null;\n};\n\n/**\n * Returns the embedded image bytes backing a paragraph's picture bullet\n * (`<a:pPr><a:buBlip><a:blip r:embed=\"…\"/>`), or `null` when the\n * paragraph has no picture bullet or the relationship can't be resolved\n * (external `r:link`, missing media part, etc.).\n *\n * The `r:embed` is resolved against the *slide's* relationships, matching\n * `getShapeImageBytes` — a bullet whose blip lives only on an inherited\n * layout/master paragraph isn't followed. The returned `Uint8Array` is a\n * live view into the package media part; treat it as read-only.\n */\nexport const getParagraphBulletImageBytes = (\n shape: SlideShapeData,\n paragraphIndex: number,\n): Uint8Array | null => {\n const paragraph = requireParagraph(shape, paragraphIndex);\n const pPr = firstChildElement(paragraph, NAME_A_PPR);\n if (!pPr) return null;\n const buBlip = firstChildElement(pPr, qname('a', 'buBlip', NS.dml));\n if (!buBlip) return null;\n const blip = firstChildElement(buBlip, qname('a', 'blip', NS.dml));\n if (!blip) return null;\n const rEmbed = getAttrValue(blip, qname('r', 'embed', NS.officeDocRels));\n if (rEmbed === null) return null;\n const slide = shape[SHAPE_SLIDE];\n const pkg = slide[INTERNAL_PACKAGE];\n const rels = pkg.getRels(slide[SLIDE_PART_NAME]);\n if (!rels) return null;\n const rel = rels.items.find((r) => r.id === rEmbed);\n if (!rel || rel.targetMode === 'External') return null;\n const mediaName = rel.target.startsWith('/')\n ? partName(rel.target)\n : resolveTarget(slide[SLIDE_PART_NAME], rel.target);\n const part = pkg.getPart(mediaName);\n return part?.data ?? null;\n};\n\n/**\n * Reads the bullet's per-paragraph color, size, and font overrides —\n * `<a:buClr>` (theme-resolved hex), `<a:buSzPct>` / `<a:buSzPts>`\n * (size relative to run or fixed pt), and `<a:buFont typeface=\"…\"/>`.\n *\n * Returns `{ color: null, sizePct: null, sizePts: null, font: null }`\n * when the paragraph doesn't override any of them (the bullet inherits\n * from the run / layout).\n */\nexport const getParagraphBulletStyle = (\n pres: PresentationData,\n shape: SlideShapeData,\n paragraphIndex: number,\n): {\n color: string | null;\n sizePct: number | null;\n sizePts: number | null;\n font: string | null;\n} => {\n const paragraph = requireParagraph(shape, paragraphIndex);\n const pPr = firstChildElement(paragraph, NAME_A_PPR);\n if (!pPr) return { color: null, sizePct: null, sizePts: null, font: null };\n const theme = getPresentationTheme(pres);\n let color: string | null = null;\n let sizePct: number | null = null;\n let sizePts: number | null = null;\n let font: string | null = null;\n const buClr = firstChildElement(pPr, qname('a', 'buClr', NS.dml));\n if (buClr) {\n for (const c of buClr.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n color = resolveDrawingColor(c, theme);\n break;\n }\n }\n const buSzPct = firstChildElement(pPr, qname('a', 'buSzPct', NS.dml));\n if (buSzPct) {\n const v = getAttrValue(buSzPct, qname('', 'val', ''));\n if (v !== null) {\n let n = Number.parseFloat(v);\n if (Number.isFinite(n)) {\n if (Math.abs(n) > 1) n = n / 100000;\n sizePct = n;\n }\n }\n }\n const buSzPts = firstChildElement(pPr, qname('a', 'buSzPts', NS.dml));\n if (buSzPts) {\n const v = getAttrValue(buSzPts, qname('', 'val', ''));\n if (v !== null) {\n const n = Number.parseInt(v, 10);\n if (Number.isFinite(n)) sizePts = n / 100;\n }\n }\n const buFont = firstChildElement(pPr, qname('a', 'buFont', NS.dml));\n if (buFont) {\n const t = getAttrValue(buFont, qname('', 'typeface', ''));\n if (t !== null) font = t;\n }\n return { color, sizePct, sizePts, font };\n};\n\n/**\n * Sets the bullet style on a single paragraph. Same `BulletStyle` shape\n * as `setShapeBullets` — pass `'bullet'` / `'number'` / `'none'` or an\n * object like `{ char: '◆' }` / `{ autoNum: 'romanLcPeriod' }`.\n */\nexport const setParagraphBullet = (\n shape: SlideShapeData,\n paragraphIndex: number,\n style: BulletStyle,\n): void => {\n const paragraph = requireParagraph(shape, paragraphIndex);\n applyBulletToParagraph(paragraph, style);\n commitAndRefresh(shape);\n};\n\n/**\n * Sets the text of a single run. Existing rPr (font, size, color, ...)\n * is preserved — only the visible characters change.\n */\nexport const setShapeRunText = (\n shape: SlideShapeData,\n paragraphIndex: number,\n runIndex: number,\n text: string,\n): void => {\n const run = requireRun(shape, paragraphIndex, runIndex);\n writeRunText(run, text);\n commitAndRefresh(shape);\n};\n","// Color transforms and rPr-like element parsing.\n\nimport { NAME_A_RPR, requireRun } from './shape-runs.ts';\nimport { type TextFormat } from '../../internal/drawingml/index.ts';\nimport {\n NS,\n type XmlElement,\n firstChildElement,\n getAttrValue,\n qname,\n} from '../../internal/xml/index.ts';\nimport { type SlideShapeData } from '../_internal-symbols.ts';\nimport { type PresentationTheme } from './theme.ts';\n// -- Color transforms (ECMA-376 §20.1.2.3.x) --------------------------------\n//\n// DrawingML color elements (`<a:srgbClr>`, `<a:schemeClr>`, `<a:sysClr>`,\n// `<a:prstClr>`) may carry one or more transform children — `lumMod`,\n// `lumOff`, `shade`, `tint`, `satMod`, `hueMod`, `alpha`, `gray`, `inv`,\n// `comp`, etc. — that adjust the base color before it's painted. Real\n// templates use them heavily for \"tinted accent\" backgrounds and \"shaded\n// hover\" states, so any visual-fidelity story has to apply them.\n//\n// Percentages in the spec use the `ST_Percentage` style — `100000`\n// represents 100% — though some third-party tools emit bare floats; we\n// accept both forms.\n\ntype ColorTransformOp =\n | {\n readonly kind:\n | 'lumMod'\n | 'lumOff'\n | 'shade'\n | 'tint'\n | 'satMod'\n | 'satOff'\n | 'hueMod'\n | 'hueOff'\n | 'alpha'\n | 'alphaMod'\n | 'alphaOff';\n readonly val: number;\n }\n | { readonly kind: 'gray' | 'inv' | 'comp' };\n\nconst COLOR_TRANSFORM_LOCALS: ReadonlySet<string> = new Set([\n 'lumMod',\n 'lumOff',\n 'shade',\n 'tint',\n 'satMod',\n 'satOff',\n 'hueMod',\n 'hueOff',\n 'alpha',\n 'alphaMod',\n 'alphaOff',\n 'gray',\n 'inv',\n 'comp',\n]);\n\nconst parseColorTransforms = (colorEl: XmlElement): readonly ColorTransformOp[] => {\n const out: ColorTransformOp[] = [];\n for (const child of colorEl.children) {\n if (child.kind !== 'element' || child.name.namespaceURI !== NS.dml) continue;\n const local = child.name.localName;\n if (!COLOR_TRANSFORM_LOCALS.has(local)) continue;\n if (local === 'gray' || local === 'inv' || local === 'comp') {\n out.push({ kind: local });\n continue;\n }\n const raw = getAttrValue(child, qname('', 'val', ''));\n if (raw === null) continue;\n let n = Number.parseFloat(raw);\n if (!Number.isFinite(n)) continue;\n // PowerPoint emits ST_Percentage (`100000` = 100%); tolerate the\n // bare-float form some third-party tools emit.\n if (Math.abs(n) > 1) n = n / 100000;\n out.push({ kind: local as Exclude<ColorTransformOp['kind'], 'gray' | 'inv' | 'comp'>, val: n });\n }\n return out;\n};\n\nconst hexToRgb01 = (hex: string): [number, number, number] => {\n const h = hex.startsWith('#') ? hex.slice(1) : hex;\n return [\n Number.parseInt(h.slice(0, 2), 16) / 255,\n Number.parseInt(h.slice(2, 4), 16) / 255,\n Number.parseInt(h.slice(4, 6), 16) / 255,\n ];\n};\n\nconst rgb01ToHex = (r: number, g: number, b: number): string => {\n const clamp = (v: number): number => Math.max(0, Math.min(255, Math.round(v * 255)));\n const part = (n: number): string => n.toString(16).padStart(2, '0').toUpperCase();\n return `#${part(clamp(r))}${part(clamp(g))}${part(clamp(b))}`;\n};\n\nconst rgbToHsl = (r: number, g: number, b: number): [number, number, number] => {\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n if (max === min) return [0, 0, l];\n const d = max - min;\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n let h: number;\n if (max === r) h = (g - b) / d + (g < b ? 6 : 0);\n else if (max === g) h = (b - r) / d + 2;\n else h = (r - g) / d + 4;\n return [h / 6, s, l];\n};\n\nconst hueToRgb = (p: number, q: number, t: number): number => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n};\n\nconst hslToRgb = (h: number, s: number, l: number): [number, number, number] => {\n if (s === 0) return [l, l, l];\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n return [hueToRgb(p, q, h + 1 / 3), hueToRgb(p, q, h), hueToRgb(p, q, h - 1 / 3)];\n};\n\n// PowerPoint applies <a:tint> / <a:shade> in LINEAR-LIGHT RGB, not in sRGB —\n// this contradicts the literal ECMA-376 \"N% of input + (100-N)% white/black\"\n// wording, but it is what PowerPoint computes and what LibreOffice renders\n// (a 75% tint of black is mid-gray ~#8B8B8B, not the sRGB-lerp #404040). The\n// next reader will expect the sRGB formula, hence this note.\nconst srgbToLinear = (c: number): number =>\n c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\nconst linearToSrgb = (c: number): number =>\n c <= 0.0031308 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - 0.055;\n\nconst applyColorTransforms = (hex: string, transforms: readonly ColorTransformOp[]): string => {\n if (transforms.length === 0) return hex;\n let [r, g, b] = hexToRgb01(hex);\n for (const t of transforms) {\n switch (t.kind) {\n case 'inv':\n r = 1 - r;\n g = 1 - g;\n b = 1 - b;\n break;\n case 'gray': {\n const y = 0.3 * r + 0.59 * g + 0.11 * b;\n r = g = b = y;\n break;\n }\n case 'comp': {\n const [h, s, l] = rgbToHsl(r, g, b);\n [r, g, b] = hslToRgb((h + 0.5) % 1, s, l);\n break;\n }\n case 'shade':\n // Mix toward black in linear light: out = srgb(linear(base) * val)\n r = linearToSrgb(srgbToLinear(r) * t.val);\n g = linearToSrgb(srgbToLinear(g) * t.val);\n b = linearToSrgb(srgbToLinear(b) * t.val);\n break;\n case 'tint':\n // Mix toward white in linear light: out = srgb(linear(base)*val + (1-val))\n r = linearToSrgb(srgbToLinear(r) * t.val + (1 - t.val));\n g = linearToSrgb(srgbToLinear(g) * t.val + (1 - t.val));\n b = linearToSrgb(srgbToLinear(b) * t.val + (1 - t.val));\n break;\n case 'lumMod':\n case 'lumOff': {\n const [h, s, l] = rgbToHsl(r, g, b);\n const newL = Math.max(0, Math.min(1, t.kind === 'lumMod' ? l * t.val : l + t.val));\n [r, g, b] = hslToRgb(h, s, newL);\n break;\n }\n case 'satMod':\n case 'satOff': {\n const [h, s, l] = rgbToHsl(r, g, b);\n const newS = Math.max(0, Math.min(1, t.kind === 'satMod' ? s * t.val : s + t.val));\n [r, g, b] = hslToRgb(h, newS, l);\n break;\n }\n case 'hueMod':\n case 'hueOff': {\n const [h, s, l] = rgbToHsl(r, g, b);\n const newH = (((t.kind === 'hueMod' ? h * t.val : h + t.val / 360) % 1) + 1) % 1;\n [r, g, b] = hslToRgb(newH, s, l);\n break;\n }\n // alpha / alphaMod / alphaOff intentionally don't touch RGB — they\n // surface as `fill-opacity`, not as a tinted color.\n }\n }\n return rgb01ToHex(r, g, b);\n};\n\nconst SCHEME_TOKEN_TO_THEME_KEY: Record<string, keyof Omit<PresentationTheme, 'name'>> = {\n tx1: 'dark1',\n dk1: 'dark1',\n bg1: 'light1',\n lt1: 'light1',\n tx2: 'dark2',\n dk2: 'dark2',\n bg2: 'light2',\n lt2: 'light2',\n accent1: 'accent1',\n accent2: 'accent2',\n accent3: 'accent3',\n accent4: 'accent4',\n accent5: 'accent5',\n accent6: 'accent6',\n hlink: 'hyperlink',\n folHlink: 'followedHyperlink',\n};\n\n/**\n * Resolves a scheme token (`tx1`, `bg1`, `accent1`, …) to its `#RRGGBB`.\n *\n * When `clrMap` is supplied, the slide token is first remapped through it\n * (`<p:clrMap>` / `<a:overrideClrMapping>`) — `tx1` may point at `dk1` or\n * `lt1` depending on the deck — and only then indexed into the theme. Without\n * a map the token is indexed directly, preserving the historical behavior\n * (correct for the standard map, the overwhelming common case).\n *\n * @internal\n */\nexport const resolveSchemeToken = (\n token: string,\n theme: PresentationTheme | null,\n clrMap?: Readonly<Record<string, string>> | null,\n): string | null => {\n if (!theme) return null;\n const mapped = clrMap?.[token] ?? token;\n const key = SCHEME_TOKEN_TO_THEME_KEY[mapped] ?? SCHEME_TOKEN_TO_THEME_KEY[token];\n if (!key) return null;\n const hex = theme[key];\n if (typeof hex !== 'string') return null;\n const normalized = hex.startsWith('#') ? hex : `#${hex}`;\n return /^#[0-9A-Fa-f]{6}$/.test(normalized) ? normalized.toUpperCase() : null;\n};\n\n/**\n * Resolves a DrawingML color element (`<a:srgbClr>` / `<a:schemeClr>` /\n * `<a:sysClr>` / `<a:prstClr>`) with all its `<a:lumMod>` / `<a:tint>` /\n * `<a:shade>` / `<a:satMod>` etc. transform children applied. Returns\n * `null` when the color is a scheme token and no theme is supplied to\n * resolve it.\n *\n * Exposed because both run-format and fill-format code paths need to\n * apply the same transform pipeline; keeping a single implementation\n * means future spec-coverage additions only have to land in one place.\n */\nexport const resolveDrawingColor = (\n colorEl: XmlElement,\n theme: PresentationTheme | null,\n clrMap?: Readonly<Record<string, string>> | null,\n): string | null => {\n if (colorEl.name.namespaceURI !== NS.dml) return null;\n const local = colorEl.name.localName;\n let baseHex: string | null = null;\n if (local === 'srgbClr') {\n const v = getAttrValue(colorEl, qname('', 'val', ''));\n if (v) baseHex = `#${v.toUpperCase()}`;\n } else if (local === 'schemeClr') {\n const v = getAttrValue(colorEl, qname('', 'val', ''));\n if (v) baseHex = resolveSchemeToken(v, theme, clrMap);\n } else if (local === 'sysClr') {\n const last = getAttrValue(colorEl, qname('', 'lastClr', ''));\n if (last) baseHex = `#${last.toUpperCase()}`;\n } else if (local === 'prstClr') {\n // Preset colors aren't worth a full lookup table in this pass —\n // black / white cover most cases anyone reaches for in PresentationML.\n const v = getAttrValue(colorEl, qname('', 'val', ''));\n if (v === 'black') baseHex = '#000000';\n else if (v === 'white') baseHex = '#FFFFFF';\n }\n if (!baseHex) return null;\n return applyColorTransforms(baseHex, parseColorTransforms(colorEl));\n};\n\n// Reads any element shaped like `CT_TextCharacterProperties` (the schema\n// shared by `<a:rPr>`, `<a:defRPr>`, and `<a:endParaRPr>`) into a partial\n// TextFormat. Used by both the literal-only `getShapeRunFormat` and the\n// inheritance-aware `getShapeRunFormatEffective`.\n//\n// When `ctx.theme` is provided, scheme tokens are resolved to concrete\n// `#RRGGBB` and color transforms (`<a:lumMod>` etc.) are applied. Without\n// a theme, transforms are not applied and theme tokens are passed through\n// verbatim — this preserves the legacy `getShapeRunFormat` behavior.\nexport const parseRPrLikeElement = (\n rPr: XmlElement,\n ctx?: { readonly theme: PresentationTheme | null },\n): Partial<TextFormat> => {\n const out: Partial<TextFormat> = {};\n const sz = getAttrValue(rPr, qname('', 'sz', ''));\n if (sz !== null) {\n const n = Number.parseInt(sz, 10);\n if (Number.isFinite(n)) out.size = n / 100;\n }\n const b = getAttrValue(rPr, qname('', 'b', ''));\n if (b !== null) out.bold = b !== '0';\n const i = getAttrValue(rPr, qname('', 'i', ''));\n if (i !== null) out.italic = i !== '0';\n const u = getAttrValue(rPr, qname('', 'u', ''));\n if (u !== null) {\n if (u === 'none') out.underline = false;\n else if (u === 'sng') out.underline = true;\n else out.underline = u;\n }\n const strike = getAttrValue(rPr, qname('', 'strike', ''));\n if (strike !== null) {\n if (strike === 'noStrike') out.strike = false;\n else if (strike === 'sngStrike') out.strike = true;\n else out.strike = strike;\n }\n const spc = getAttrValue(rPr, qname('', 'spc', ''));\n if (spc !== null) {\n const n = Number.parseInt(spc, 10);\n if (Number.isFinite(n)) out.spc = n;\n }\n const kern = getAttrValue(rPr, qname('', 'kern', ''));\n if (kern !== null) {\n const n = Number.parseInt(kern, 10);\n if (Number.isFinite(n)) out.kern = n;\n }\n const baselineAttr = getAttrValue(rPr, qname('', 'baseline', ''));\n if (baselineAttr !== null) {\n // ST_Percentage: 100000 = 100%; tolerate bare floats.\n let n = Number.parseFloat(baselineAttr);\n if (Number.isFinite(n)) {\n if (Math.abs(n) > 1) n = n / 100000;\n out.baseline = n;\n }\n }\n const cap = getAttrValue(rPr, qname('', 'cap', ''));\n if (cap === 'none' || cap === 'small' || cap === 'all') {\n out.cap = cap;\n }\n // <a:highlight><a:srgbClr val=\"…\"/></a:highlight>\n const highlight = firstChildElement(rPr, qname('a', 'highlight', NS.dml));\n if (highlight !== null) {\n let hlChild: XmlElement | null = null;\n for (const c of highlight.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n hlChild = c;\n break;\n }\n if (hlChild) {\n if (ctx) {\n const hex = resolveDrawingColor(hlChild, ctx.theme);\n if (hex !== null) out.highlight = hex;\n } else if (hlChild.name.localName === 'srgbClr') {\n const v = getAttrValue(hlChild, qname('', 'val', ''));\n if (v !== null) out.highlight = `#${v.toUpperCase()}`;\n } else if (hlChild.name.localName === 'schemeClr') {\n const v = getAttrValue(hlChild, qname('', 'val', ''));\n if (v !== null) out.highlight = v;\n }\n }\n }\n const solidFill = firstChildElement(rPr, qname('a', 'solidFill', NS.dml));\n if (solidFill !== null) {\n // Find the inner color element (srgbClr / schemeClr / sysClr / prstClr).\n // CT_SolidColorFillProperties holds exactly one EG_ColorChoice child.\n let colorChild: XmlElement | null = null;\n for (const c of solidFill.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n colorChild = c;\n break;\n }\n if (colorChild) {\n if (ctx) {\n // Apply transforms + resolve scheme tokens to hex.\n const hex = resolveDrawingColor(colorChild, ctx.theme);\n if (hex !== null) out.color = hex;\n else if (colorChild.name.localName === 'schemeClr') {\n // Theme not provided / token not in scheme — surface the raw token.\n const v = getAttrValue(colorChild, qname('', 'val', ''));\n if (v !== null) out.color = v;\n }\n } else {\n // Legacy `getShapeRunFormat` path: no transforms, scheme tokens\n // emitted as bare strings to match prior public behavior.\n if (colorChild.name.localName === 'srgbClr') {\n const v = getAttrValue(colorChild, qname('', 'val', ''));\n if (v !== null) out.color = `#${v.toUpperCase()}`;\n } else if (colorChild.name.localName === 'schemeClr') {\n const v = getAttrValue(colorChild, qname('', 'val', ''));\n if (v !== null) out.color = v;\n }\n }\n }\n }\n const latin = firstChildElement(rPr, qname('a', 'latin', NS.dml));\n if (latin !== null) {\n const t = getAttrValue(latin, qname('', 'typeface', ''));\n if (t !== null) out.font = t;\n }\n const ea = firstChildElement(rPr, qname('a', 'ea', NS.dml));\n if (ea !== null) {\n const t = getAttrValue(ea, qname('', 'typeface', ''));\n if (t !== null) out.fontEastAsian = t;\n }\n return out;\n};\n\n/**\n * Reads back the format of a single run. Returns `null` when the run\n * has no `<a:rPr>` (it inherits its format from the paragraph /\n * layout / master). Boolean attributes that are explicitly `\"0\"`\n * decode to `false`.\n *\n * Use `getShapeRunFormatEffective` if you want the resolved format\n * after walking the placeholder / lstStyle / master inheritance chain.\n */\nexport const getShapeRunFormat = (\n shape: SlideShapeData,\n paragraphIndex: number,\n runIndex: number,\n): TextFormat | null => {\n const run = requireRun(shape, paragraphIndex, runIndex);\n const rPr = firstChildElement(run, NAME_A_RPR);\n if (rPr === null) return null;\n return parseRPrLikeElement(rPr) as TextFormat;\n};\n","// Shape mutation: geometry, fill, stroke.\n\nimport { resolveDrawingColor } from './shape-color.ts';\nimport {\n type ArrowOptions,\n type GradientFillOptions,\n type LineDash,\n type PatternFillOptions,\n type StrokeOptions,\n clearFill as clearFillImpl,\n clearStroke as clearStrokeImpl,\n setFlip as writeFlip,\n setGradientFill,\n setPatternFill,\n setNoFill as setNoFillImpl,\n setNoStroke as setNoStrokeImpl,\n setPosition as writePosition,\n setRotation as writeRotation,\n setSize as writeSize,\n setSolidFill,\n setSolidStroke,\n setStrokeArrow,\n setStrokeCap,\n setStrokeCompound,\n setStrokeJoin,\n setStrokeDash,\n} from '../../internal/drawingml/index.ts';\nimport type { Emu } from '../units.ts';\nimport {\n contentTypeForFormat,\n detectImageFormat,\n emptyRels,\n extensionForFormat,\n type ImageFormat,\n nextRelId,\n partName,\n} from '../../internal/opc/index.ts';\nimport { REL_TYPES } from '../../internal/presentationml/index.ts';\nimport {\n NS,\n attr,\n elem,\n firstChildElement,\n getAttrValue,\n qname,\n} from '../../internal/xml/index.ts';\nimport {\n INTERNAL_PACKAGE,\n type PresentationData,\n SHAPE_ELEMENT,\n SHAPE_SLIDE,\n SHAPE_SNAPSHOT,\n SLIDE_PART_NAME,\n type SlideShapeData,\n} from '../_internal-symbols.ts';\nimport { commitAndRefresh, requireSpPr, setOpcDefault } from './_helpers.ts';\nimport { getPresentationTheme } from './theme.ts';\n// ---------------------------------------------------------------------------\n// Shape mutation — geometry.\n\n/** Sets the shape's position in EMU. Companion to `setShapeSize`. */\nexport const setShapePosition = (shape: SlideShapeData, x: Emu, y: Emu): void => {\n writePosition(shape[SHAPE_ELEMENT], shape[SHAPE_SNAPSHOT].kind, x, y);\n commitAndRefresh(shape);\n};\n\n/** Sets the shape's size in EMU. */\nexport const setShapeSize = (shape: SlideShapeData, w: Emu, h: Emu): void => {\n writeSize(shape[SHAPE_ELEMENT], shape[SHAPE_SNAPSHOT].kind, w, h);\n commitAndRefresh(shape);\n};\n\n/**\n * Sets the shape's rotation in degrees (positive clockwise). Values are\n * normalized into `[0, 360)`; pass `0` to clear an existing rotation.\n */\nexport const setShapeRotation = (shape: SlideShapeData, degrees: number): void => {\n writeRotation(shape[SHAPE_ELEMENT], shape[SHAPE_SNAPSHOT].kind, degrees);\n commitAndRefresh(shape);\n};\n\n/** Sets the shape's flip flags. Properties default to current state when omitted. */\nexport const setShapeFlip = (\n shape: SlideShapeData,\n options: { horizontal?: boolean; vertical?: boolean },\n): void => {\n writeFlip(shape[SHAPE_ELEMENT], shape[SHAPE_SNAPSHOT].kind, options);\n commitAndRefresh(shape);\n};\n\n// ---------------------------------------------------------------------------\n// Shape mutation — fill / stroke.\n\n/** Sets a solid fill on the shape (color in `#RRGGBB` or scheme token). */\nexport const setShapeFill = (shape: SlideShapeData, color: string): void => {\n setSolidFill(requireSpPr(shape), color);\n commitAndRefresh(shape);\n};\n\n/**\n * Sets a linear gradient fill on the shape. Stops must lie in `[0, 1]`;\n * `angleDeg` defaults to `90` (top → bottom).\n *\n * Example: red → blue top-to-bottom:\n *\n * setShapeGradientFill(shape, {\n * stops: [{ offset: 0, color: '#FF0000' }, { offset: 1, color: '#0000FF' }],\n * angleDeg: 90,\n * });\n */\nexport const setShapeGradientFill = (shape: SlideShapeData, options: GradientFillOptions): void => {\n setGradientFill(requireSpPr(shape), options);\n commitAndRefresh(shape);\n};\n\n/**\n * Sets a preset pattern fill on the shape (e.g. `pct50`, `dkUpDiag`).\n *\n * `foreground` is the pattern stroke color; `background` fills behind\n * the pattern. Both accept `#RRGGBB`, bare `RRGGBB`, or scheme tokens\n * (`accent1`, `bg1`, ...).\n */\nexport const setShapePatternFill = (shape: SlideShapeData, options: PatternFillOptions): void => {\n setPatternFill(requireSpPr(shape), options);\n commitAndRefresh(shape);\n};\n\n/**\n * Reads back the pattern fill on a shape: returns the preset token\n * plus the foreground / background colors resolved against the theme.\n * Returns `null` when the shape has no `<a:pattFill>`.\n *\n * The preset string is the literal `ST_PresetPatternVal` token from\n * §20.1.10.49 — e.g. `'pct50'`, `'dkUpDiag'`, `'cross'`, `'wave'`.\n * Renderers can map it onto an SVG `<pattern>` definition.\n */\nexport const getShapePatternFill = (\n pres: PresentationData,\n shape: SlideShapeData,\n): { preset: string; foreground: string; background: string } | null => {\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (!spPr) return null;\n const pattFill = firstChildElement(spPr, qname('a', 'pattFill', NS.dml));\n if (!pattFill) return null;\n const preset = getAttrValue(pattFill, qname('', 'prst', '')) ?? 'pct50';\n const theme = getPresentationTheme(pres);\n const colorFrom = (parentName: string, fallback: string): string => {\n const parent = firstChildElement(pattFill, qname('a', parentName, NS.dml));\n if (!parent) return fallback;\n for (const c of parent.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n const hex = resolveDrawingColor(c, theme);\n if (hex) return hex;\n }\n return fallback;\n };\n return {\n preset,\n foreground: colorFrom('fgClr', '#000000'),\n background: colorFrom('bgClr', '#FFFFFF'),\n };\n};\n\n/**\n * Sets a picture fill on the shape, embedding `bytes` as a new media\n * part and replacing any prior fill choice on the shape's `<p:spPr>`.\n *\n * The image stretches to fill the shape (`<a:stretch><a:fillRect/>`).\n * Format is detected from magic bytes; pass `options.format` to\n * override (useful for SVG or unusual extensions).\n *\n * Throws if the format can't be detected and isn't provided explicitly,\n * or if the shape kind doesn't carry a `<p:spPr>` (e.g. groups).\n */\nexport const setShapeImageFill = (\n shape: SlideShapeData,\n bytes: Uint8Array,\n options: { format?: ImageFormat } = {},\n): void => {\n const format = options.format ?? detectImageFormat(bytes);\n if (format === null) {\n throw new Error(\n 'setShapeImageFill: could not detect image format. Pass options.format explicitly.',\n );\n }\n const contentType = contentTypeForFormat(format);\n const extension = extensionForFormat(format);\n const slide = shape[SHAPE_SLIDE];\n const pkg = slide[INTERNAL_PACKAGE];\n\n // Allocate /ppt/media/imageN.<ext> (shared with addSlideImage's\n // numbering — both feed off the same /ppt/media space).\n let nextN = 1;\n const mediaPattern = /^\\/ppt\\/media\\/image(\\d+)\\./;\n for (const p of pkg.parts) {\n const m = p.name.match(mediaPattern);\n if (m?.[1] !== undefined) {\n const n = Number.parseInt(m[1], 10);\n if (Number.isFinite(n) && n >= nextN) nextN = n + 1;\n }\n }\n const newMediaName = partName(`/ppt/media/image${nextN}.${extension}`);\n setOpcDefault(pkg, extension, contentType);\n pkg.addPart(newMediaName, contentType, bytes);\n\n // Slide → image rel.\n const rels = pkg.getRels(slide[SLIDE_PART_NAME]) ?? emptyRels();\n const newRId = nextRelId(rels.items.map((r) => r.id));\n rels.items.push({\n id: newRId,\n type: REL_TYPES.image,\n target: `../media/image${nextN}.${extension}`,\n targetMode: 'Internal',\n });\n pkg.setRels(slide[SLIDE_PART_NAME], rels);\n\n // Replace the shape's fill choice with <a:blipFill>.\n const spPr = requireSpPr(shape);\n const FILL_CHOICES = new Set([\n 'noFill',\n 'solidFill',\n 'gradFill',\n 'blipFill',\n 'pattFill',\n 'grpFill',\n ]);\n spPr.children = spPr.children.filter(\n (c) =>\n !(\n c.kind === 'element' &&\n c.name.namespaceURI === NS.dml &&\n FILL_CHOICES.has(c.name.localName)\n ),\n );\n const blipName = qname('a', 'blip', NS.dml);\n const stretchName = qname('a', 'stretch', NS.dml);\n const fillRectName = qname('a', 'fillRect', NS.dml);\n const blipFillName = qname('a', 'blipFill', NS.dml);\n const blip = elem(blipName, { attrs: [attr(qname('r', 'embed', NS.officeDocRels), newRId)] });\n const stretch = elem(stretchName, { children: [elem(fillRectName)] });\n const blipFill = elem(blipFillName, { children: [blip, stretch] });\n // <a:blipFill> takes the same slot as <a:solidFill>; insert at the\n // current insertion index. We use the same heuristic as setSolidFill —\n // before <a:ln> / effectLst / scene3d / extLst.\n let insertAt = spPr.children.length;\n for (let i = 0; i < spPr.children.length; i++) {\n const c = spPr.children[i];\n if (c?.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n if (\n c.name.localName === 'ln' ||\n c.name.localName === 'effectLst' ||\n c.name.localName === 'effectDag' ||\n c.name.localName === 'scene3d' ||\n c.name.localName === 'sp3d' ||\n c.name.localName === 'extLst'\n ) {\n insertAt = i;\n break;\n }\n }\n spPr.children.splice(insertAt, 0, blipFill);\n commitAndRefresh(shape);\n};\n\n/** Sets `<a:noFill>` on the shape, leaving it transparent. */\nexport const setShapeNoFill = (shape: SlideShapeData): void => {\n setNoFillImpl(requireSpPr(shape));\n commitAndRefresh(shape);\n};\n\n/**\n * Removes any fill choice from the shape; it then inherits its fill\n * from the layout / master placeholder it descends from.\n */\nexport const clearShapeFill = (shape: SlideShapeData): void => {\n clearFillImpl(requireSpPr(shape));\n commitAndRefresh(shape);\n};\n\n/** Sets a solid-color outline on the shape. */\nexport const setShapeStroke = (\n shape: SlideShapeData,\n options: { color?: string; widthEmu?: number },\n): void => {\n setSolidStroke(requireSpPr(shape), options as StrokeOptions);\n commitAndRefresh(shape);\n};\n\n/** Sets an explicit \"no outline\" on the shape. */\nexport const setShapeNoStroke = (shape: SlideShapeData): void => {\n setNoStrokeImpl(requireSpPr(shape));\n commitAndRefresh(shape);\n};\n\n/** Reads back the shape's stroke dash style, or `null` if none. */\nexport const getShapeStrokeDash = (shape: SlideShapeData): LineDash | null => {\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (!spPr) return null;\n const ln = firstChildElement(spPr, qname('a', 'ln', NS.dml));\n if (!ln) return null;\n const prstDash = firstChildElement(ln, qname('a', 'prstDash', NS.dml));\n if (!prstDash) return null;\n const v = getAttrValue(prstDash, qname('', 'val', ''));\n return (v as LineDash | null) ?? null;\n};\n\n/**\n * Reads back the shape's arrowhead on one end of `<a:ln>`, or `null`\n * when no `<a:headEnd>` / `<a:tailEnd>` is present.\n */\nexport const getShapeStrokeArrow = (\n shape: SlideShapeData,\n end: 'head' | 'tail',\n): ArrowOptions | null => {\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (!spPr) return null;\n const ln = firstChildElement(spPr, qname('a', 'ln', NS.dml));\n if (!ln) return null;\n const arr = firstChildElement(ln, qname('a', end === 'head' ? 'headEnd' : 'tailEnd', NS.dml));\n if (!arr) return null;\n const type = getAttrValue(arr, qname('', 'type', ''));\n if (!type) return null;\n const width = getAttrValue(arr, qname('', 'w', ''));\n const length = getAttrValue(arr, qname('', 'len', ''));\n const result: {\n type: ArrowOptions['type'];\n width?: 'sm' | 'med' | 'lg';\n length?: 'sm' | 'med' | 'lg';\n } = {\n type: type as ArrowOptions['type'],\n };\n if (width === 'sm' || width === 'med' || width === 'lg') result.width = width;\n if (length === 'sm' || length === 'med' || length === 'lg') result.length = length;\n return result;\n};\n\n/**\n * Sets the dash pattern for the shape's outline (`<a:prstDash>`). One\n * of ECMA-376's `ST_PresetLineDashVal` tokens:\n *\n * `'solid'` | `'dot'` | `'dash'` | `'lgDash'` | `'dashDot'` |\n * `'lgDashDot'` | `'lgDashDotDot'` | `'sysDash'` | `'sysDot'` |\n * `'sysDashDot'` | `'sysDashDotDot'`\n *\n * Creates `<a:ln>` if absent. Pairs naturally with `setShapeStroke`:\n * users typically set a color + width first, then the dash.\n */\nexport const setShapeStrokeDash = (shape: SlideShapeData, dash: LineDash): void => {\n setStrokeDash(requireSpPr(shape), dash);\n commitAndRefresh(shape);\n};\n\n/**\n * Sets an arrowhead on one end of the shape's outline.\n *\n * - `end: 'head'` writes `<a:headEnd>` (the start of the line).\n * - `end: 'tail'` writes `<a:tailEnd>` (the end).\n *\n * Useful primarily on connector shapes added via `addSlideLine`.\n * `type: 'none'` clears the arrowhead.\n */\nexport const setShapeStrokeArrow = (\n shape: SlideShapeData,\n end: 'head' | 'tail',\n options: ArrowOptions,\n): void => {\n setStrokeArrow(requireSpPr(shape), end, options);\n commitAndRefresh(shape);\n};\n\n/** Removes any outline override; the shape then inherits stroke from layout. */\nexport const clearShapeStroke = (shape: SlideShapeData): void => {\n clearStrokeImpl(requireSpPr(shape));\n commitAndRefresh(shape);\n};\n\n/**\n * Sets the line-cap style on the shape's outline (`<a:ln cap=\"…\">`).\n *\n * - `'rnd'` — rounded ends.\n * - `'sq'` — square ends extending past the endpoint.\n * - `'flat'` — square ends flush at the endpoint (the OOXML default).\n *\n * Pass `null` to clear the attribute so the cap inherits the default.\n * Creates `<a:ln>` if absent.\n */\nexport const setShapeStrokeCap = (\n shape: SlideShapeData,\n cap: 'rnd' | 'sq' | 'flat' | null,\n): void => {\n setStrokeCap(requireSpPr(shape), cap);\n commitAndRefresh(shape);\n};\n\n/**\n * Sets the line-join style on the shape's outline. Picks one of the\n * three child-element variants of `<a:ln>`:\n *\n * - `'round'` → `<a:round/>`\n * - `'bevel'` → `<a:bevel/>`\n * - `'miter'` → `<a:miter/>`\n *\n * Pass `null` to clear any prior join child so the shape inherits the\n * default. Creates `<a:ln>` if absent.\n */\nexport const setShapeStrokeJoin = (\n shape: SlideShapeData,\n join: 'round' | 'bevel' | 'miter' | null,\n): void => {\n setStrokeJoin(requireSpPr(shape), join);\n commitAndRefresh(shape);\n};\n\n/**\n * Sets the compound-line style on the shape's outline\n * (`<a:ln cmpd=\"…\">`) — single, double, triple, or thick/thin variants.\n * ECMA-376 §20.1.10.31 `ST_CompoundLine`. Pass `null` to clear the\n * attribute. Creates `<a:ln>` if absent.\n */\nexport const setShapeStrokeCompound = (\n shape: SlideShapeData,\n cmpd: 'sng' | 'dbl' | 'thickThin' | 'thinThick' | 'tri' | null,\n): void => {\n setStrokeCompound(requireSpPr(shape), cmpd);\n commitAndRefresh(shape);\n};\n","// Shape reads: identity, geometry, placeholders, bounds, group.\n\nimport { setShapePosition } from './shape-fill-stroke.ts';\nimport { getSlideLayout } from './shape-slide-read.ts';\nimport {\n type CustomGeometry,\n type GeomCommand,\n type GeomPath,\n type GeomPoint,\n type PathFillMode,\n type Position,\n type Size,\n parseCustomGeometry,\n readFlip,\n readPosition,\n readRotation,\n readSize,\n setPosition as writePosition,\n setSize as writeSize,\n} from '../../internal/drawingml/index.ts';\nimport type { Emu } from '../units.ts';\nimport { partName, resolveTarget } from '../../internal/opc/index.ts';\nimport {\n REL_TYPES,\n type ShapeKind,\n readGroupChildren,\n readPresentationPart,\n readShapeTreeFromCsldRoot,\n} from '../../internal/presentationml/index.ts';\nimport {\n NS,\n type XmlElement,\n attr,\n firstChildElement,\n getAttrValue,\n parseXml,\n qname,\n} from '../../internal/xml/index.ts';\nimport {\n INTERNAL_PACKAGE,\n LAYOUT_PART,\n LAYOUT_PART_NAME,\n type PresentationData,\n SHAPE_ELEMENT,\n SHAPE_SLIDE,\n SHAPE_SNAPSHOT,\n SLIDE_SHAPES,\n type SlideData,\n type SlideShapeData,\n} from '../_internal-symbols.ts';\nimport { PRES_PART_NAME, commitAndRefresh, decode } from './_helpers.ts';\nimport { getSlides } from './slide-query.ts';\nimport { findCNvPr } from './embedded.ts';\n\n// ---------------------------------------------------------------------------\n// SlideShape-level reads.\n\nexport const getShapeKind = (shape: SlideShapeData): ShapeKind => shape[SHAPE_SNAPSHOT].kind;\n\nexport const getShapeId = (shape: SlideShapeData): number => shape[SHAPE_SNAPSHOT].id;\n\n/**\n * Returns the preset-geometry token (`'rect'`, `'ellipse'`, `'star5'`,\n * `'rightArrow'`, ...) for shapes whose body carries a\n * `<a:prstGeom prst=\"…\"/>`. Returns `null` for:\n *\n * - non-`'shape'` kinds (pictures, connectors, group shapes, tables,\n * charts — they have their own geometry tags or no geometry),\n * - shapes using custom geometry (`<a:custGeom>`),\n * - shapes whose preset is missing (malformed but possible).\n *\n * Useful for renderers / inspectors that want to draw a faithful\n * approximation of each shape without dropping to the raw XML.\n */\nexport const getShapePreset = (shape: SlideShapeData): string | null => {\n if (shape[SHAPE_SNAPSHOT].kind !== 'shape' && shape[SHAPE_SNAPSHOT].kind !== 'connector')\n return null;\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (!spPr) return null;\n const prstGeom = firstChildElement(spPr, qname('a', 'prstGeom', NS.dml));\n if (!prstGeom) return null;\n for (const a of prstGeom.attrs) {\n if (a.name.localName === 'prst') return a.value;\n }\n return null;\n};\n\n/**\n * Reads the preset's adjust-handle values (`<a:prstGeom><a:avLst>\n * <a:gd name=\"adj\" fmla=\"val 30000\"/></a:avLst>`) as a map from guide\n * name → numeric value. Per ECMA-376 §20.1.9.4, guides are stored\n * with a formula prefix — `val 12345` is a literal number, and the\n * other prefixes (`pin`, `+-`, etc.) compute from other guides. We\n * only surface the `val` form because other formulas reference the\n * preset's built-in guides and don't make sense without them.\n *\n * Returns an empty record when no adjust values are authored (the\n * shape paints at its preset defaults).\n */\nexport const getShapeAdjustValues = (shape: SlideShapeData): Record<string, number> => {\n const out: Record<string, number> = {};\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (!spPr) return out;\n const prstGeom = firstChildElement(spPr, qname('a', 'prstGeom', NS.dml));\n if (!prstGeom) return out;\n const avLst = firstChildElement(prstGeom, qname('a', 'avLst', NS.dml));\n if (!avLst) return out;\n for (const gd of avLst.children) {\n if (gd.kind !== 'element' || gd.name.namespaceURI !== NS.dml || gd.name.localName !== 'gd')\n continue;\n const name = getAttrValue(gd, qname('', 'name', ''));\n const fmla = getAttrValue(gd, qname('', 'fmla', ''));\n if (!name || !fmla) continue;\n const match = /^val\\s+(-?\\d+(?:\\.\\d+)?)$/.exec(fmla);\n if (!match) continue;\n const n = Number.parseFloat(match[1]!);\n if (Number.isFinite(n)) out[name] = n;\n }\n return out;\n};\n\nexport type { CustomGeometry, GeomCommand, GeomPath, GeomPoint, PathFillMode };\n\n/**\n * Reads a shape's custom geometry (`<a:custGeom>`, ECMA-376 §20.1.9) as a\n * fully-evaluated path list. Returns `null` when the shape has no\n * `<a:custGeom>` in its own `<p:spPr>` (it uses a preset, inherits\n * geometry, or isn't a drawable shape), and also `null` when the geometry\n * is present but malformed — an unresolved guide reference, an unknown\n * `fmla` operator, or a command missing its points — so callers can fall\n * back rather than emit broken output.\n *\n * Guide formulas in `<a:avLst>` / `<a:gdLst>` are evaluated in document\n * order against the implicit built-in guides (`w`, `h`, `ss`, `hc`, the\n * `cdN` angle constants, …) derived from the shape extents. Per spec,\n * division by zero yields `0`. The returned commands carry only numbers —\n * no guide names survive.\n *\n * Pairs with `getShapePreset` (which returns `null` for custom-geometry\n * shapes): a renderer calls `getShapePreset` first, and falls through to\n * this when it gets `null`.\n */\nexport const getShapeCustomGeometry = (shape: SlideShapeData): CustomGeometry | null => {\n const kind = shape[SHAPE_SNAPSHOT].kind;\n if (kind !== 'shape' && kind !== 'connector') return null;\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (!spPr) return null;\n const custGeom = firstChildElement(spPr, qname('a', 'custGeom', NS.dml));\n if (!custGeom) return null;\n // Built-in guides (`w`/`h`/`ss`/…) come from the shape's own extents.\n // A custGeom shape that defers its size to a layout placeholder is\n // degenerate, so fall back rather than guess.\n const size = readSize(shape[SHAPE_ELEMENT], kind);\n if (size === null) return null;\n return parseCustomGeometry(custGeom, size.w, size.h);\n};\n\n/**\n * Returns the highest `cNvPr@id` used by any shape on the slide,\n * or `0` when the slide has no shapes with non-negative ids.\n *\n * Useful when hand-rolling a custom shape and you need an id known\n * not to collide. The official allocator inside `addSlideShape` /\n * `addSlideTextBox` etc. already does this — call those instead\n * when you don't need a custom id.\n */\nexport const getMaxShapeId = (slide: SlideData): number => {\n let max = 0;\n for (const shape of slide[SLIDE_SHAPES]) {\n const id = shape[SHAPE_SNAPSHOT].id;\n if (id > max) max = id;\n }\n return max;\n};\n\n/**\n * Deck-wide sibling of `getMaxShapeId`. Returns the highest\n * `cNvPr@id` across every shape on every slide, or `0` when the\n * deck has no shapes.\n *\n * Note: shape ids are scoped to a slide in OOXML — collisions\n * across slides are fine. This helper is for the rare cases where\n * a caller wants a single id known to be higher than anything in\n * the deck (e.g. to keep ids monotonically increasing).\n */\nexport const getMaxShapeIdInPresentation = (pres: PresentationData): number => {\n let max = 0;\n for (const slide of getSlides(pres)) {\n for (const shape of slide[SLIDE_SHAPES]) {\n const id = shape[SHAPE_SNAPSHOT].id;\n if (id > max) max = id;\n }\n }\n return max;\n};\n\n/**\n * Returns the number of slide masters declared in the\n * presentation's `<p:sldMasterIdLst>`. Most decks use exactly one\n * master; multi-master decks come from templates that combine\n * brand variants (e.g. a corporate master + a sponsor master).\n *\n * Returns `0` if `presentation.xml` is missing.\n */\nexport const getSlideMasterCount = (pres: PresentationData): number => {\n const pkg = pres[INTERNAL_PACKAGE];\n const presPart = pkg.getPart(PRES_PART_NAME);\n if (presPart === null) return 0;\n const root = parseXml(decode(presPart.data)).root;\n const model = readPresentationPart(root);\n return model.slideMasters.length;\n};\n\n/**\n * Returns the package part name of every slide master declared in\n * `presentation.xml`, resolved through the presentation's `.rels`.\n * Sibling of `getSlideMasterCount` for downstream tooling that\n * needs the master URIs (e.g. byte-level diff, custom validators).\n *\n * Returns an empty array when `presentation.xml` or its `.rels`\n * are missing.\n */\n/**\n * Returns the part name of the slide master a slide inherits from\n * (`/ppt/slideMasters/slideMaster1.xml`), or `null` when the slide\n * has no layout or its layout has no master rel.\n *\n * Useful for multi-master decks where different slides live under\n * different brand templates and the caller needs to scope theme /\n * fontScheme / clrMap lookups to the correct master.\n */\nexport const getSlideMasterPartName = (slide: SlideData): string | null => {\n const layout = getSlideLayout(slide);\n if (!layout) return null;\n const pkg = slide[INTERNAL_PACKAGE];\n const layoutPartName = partName(layout[LAYOUT_PART_NAME]);\n const layoutRels = pkg.getRels(layoutPartName);\n if (!layoutRels) return null;\n const masterRel = layoutRels.items.find((r) => r.type === REL_TYPES.slideMaster);\n if (!masterRel) return null;\n return resolveTarget(layoutPartName, masterRel.target);\n};\n\nexport const getSlideMasterPartNames = (pres: PresentationData): ReadonlyArray<string> => {\n const pkg = pres[INTERNAL_PACKAGE];\n const presPart = pkg.getPart(PRES_PART_NAME);\n if (presPart === null) return [];\n const root = parseXml(decode(presPart.data)).root;\n const model = readPresentationPart(root);\n const rels = pkg.getRels(PRES_PART_NAME);\n if (rels === null) return [];\n const out: string[] = [];\n for (const m of model.slideMasters) {\n const rel = rels.items.find((r) => r.id === m.rId);\n if (rel === undefined) continue;\n const resolved = rel.target.startsWith('/')\n ? partName(rel.target)\n : resolveTarget(PRES_PART_NAME, rel.target);\n out.push(resolved);\n }\n return out;\n};\n\n/**\n * Histogram of master part name → number of slides whose layout chains\n * up to that master. Every master in the package appears as a key\n * (count `0` for unreferenced masters), so the function surfaces\n * unused masters directly — useful for trimming multi-master template\n * decks. Pair with `getSlideLayoutUsageCounts` for the layout layer.\n */\nexport const getSlideMasterUsageCounts = (\n pres: PresentationData,\n): Readonly<Record<string, number>> => {\n const counts: Record<string, number> = {};\n for (const masterName of getSlideMasterPartNames(pres)) {\n counts[masterName] = 0;\n }\n for (const slide of getSlides(pres)) {\n const name = getSlideMasterPartName(slide);\n if (name === null) continue;\n counts[name] = (counts[name] ?? 0) + 1;\n }\n return counts;\n};\n\n/**\n * Master part names that no slide chains to (count of `0` in\n * `getSlideMasterUsageCounts`). Pair to `getUnusedSlideLayouts`.\n * Useful when trimming multi-master template decks of dead theme\n * variants.\n */\nexport const getUnusedSlideMasters = (pres: PresentationData): ReadonlyArray<string> => {\n const counts = getSlideMasterUsageCounts(pres);\n return getSlideMasterPartNames(pres).filter((m) => (counts[m] ?? 0) === 0);\n};\n\nexport const getShapeName = (shape: SlideShapeData): string => shape[SHAPE_SNAPSHOT].name;\n\n/**\n * Renames the shape's `cNvPr@name`. The display name is what\n * PowerPoint shows in the Selection Pane and what `findShapeByName`\n * matches on. Empty strings are allowed (matches PowerPoint behavior).\n */\n/**\n * Reads the shape's alt-text description (`<p:cNvPr descr=\"...\">`).\n * Accessibility tools (screen readers, contrast checkers) and\n * PowerPoint's \"Alt Text\" pane look at this field. Returns `null`\n * when no description is set.\n */\nexport const getShapeDescription = (shape: SlideShapeData): string | null => {\n const cNvPr = findCNvPr(shape);\n if (!cNvPr) return null;\n return getAttrValue(cNvPr, qname('', 'descr', ''));\n};\n\n/**\n * Sets the shape's alt-text description (`<p:cNvPr descr=\"...\">`).\n * Pass `null` to clear. Important for accessibility — image shapes\n * and decorative graphics should carry a descr that conveys the\n * visual meaning to screen readers.\n */\nexport const setShapeDescription = (shape: SlideShapeData, description: string | null): void => {\n const cNvPr = findCNvPr(shape);\n if (!cNvPr) {\n throw new Error(`setShapeDescription: ${shape[SHAPE_SNAPSHOT].kind} shape has no cNvPr`);\n }\n cNvPr.attrs = cNvPr.attrs.filter(\n (a) => !(a.name.namespaceURI === '' && a.name.localName === 'descr'),\n );\n if (description !== null && description !== '') {\n cNvPr.attrs.push(attr(qname('', 'descr', ''), description));\n }\n commitAndRefresh(shape);\n};\n\n/**\n * Reads the shape's alt-text title (`<p:cNvPr title=\"...\">`).\n * PowerPoint surfaces this alongside `descr` in its Alt Text pane\n * as a short heading. Returns `null` when no title is set.\n */\nexport const getShapeAltTitle = (shape: SlideShapeData): string | null => {\n const cNvPr = findCNvPr(shape);\n if (!cNvPr) return null;\n return getAttrValue(cNvPr, qname('', 'title', ''));\n};\n\n/**\n * Sets the shape's alt-text title (`<p:cNvPr title=\"...\">`). Pass\n * `null` to clear. Distinct from `renameShape`, which writes the\n * `name` attribute used in the selection pane.\n */\nexport const setShapeAltTitle = (shape: SlideShapeData, title: string | null): void => {\n const cNvPr = findCNvPr(shape);\n if (!cNvPr) {\n throw new Error(`setShapeAltTitle: ${shape[SHAPE_SNAPSHOT].kind} shape has no cNvPr`);\n }\n cNvPr.attrs = cNvPr.attrs.filter(\n (a) => !(a.name.namespaceURI === '' && a.name.localName === 'title'),\n );\n if (title !== null && title !== '') {\n cNvPr.attrs.push(attr(qname('', 'title', ''), title));\n }\n commitAndRefresh(shape);\n};\n\n/**\n * `true` when the shape's `<p:cNvPr hidden=\"1\">` is set. Hidden\n * shapes are skipped by PowerPoint's renderer but stay in the\n * shape tree — useful for variant slides that toggle which boxes\n * are visible.\n */\nexport const isShapeHidden = (shape: SlideShapeData): boolean => {\n const cNvPr = findCNvPr(shape);\n if (!cNvPr) return false;\n const v = getAttrValue(cNvPr, qname('', 'hidden', ''));\n return v === '1' || v === 'true';\n};\n\n/**\n * Sets or clears `<p:cNvPr hidden=\"...\">` on the shape. Hidden\n * shapes remain in the document but PowerPoint doesn't render them.\n */\nexport const setShapeHidden = (shape: SlideShapeData, hidden: boolean): void => {\n const cNvPr = findCNvPr(shape);\n if (!cNvPr) {\n throw new Error(`setShapeHidden: ${shape[SHAPE_SNAPSHOT].kind} shape has no cNvPr`);\n }\n cNvPr.attrs = cNvPr.attrs.filter(\n (a) => !(a.name.namespaceURI === '' && a.name.localName === 'hidden'),\n );\n if (hidden) cNvPr.attrs.push(attr(qname('', 'hidden', ''), '1'));\n commitAndRefresh(shape);\n};\n\nexport const renameShape = (shape: SlideShapeData, newName: string): void => {\n const cNvPr = findCNvPr(shape);\n if (!cNvPr) {\n throw new Error(`renameShape: ${shape[SHAPE_SNAPSHOT].kind} shape has no cNvPr to rename`);\n }\n cNvPr.attrs = cNvPr.attrs.filter(\n (a) => !(a.name.namespaceURI === '' && a.name.localName === 'name'),\n );\n cNvPr.attrs.push(attr(qname('', 'name', ''), newName));\n commitAndRefresh(shape);\n};\n\nexport const getShapePlaceholderType = (shape: SlideShapeData): string | null =>\n shape[SHAPE_SNAPSHOT].placeholderType;\n\nexport const getShapePlaceholderIdx = (shape: SlideShapeData): number | null =>\n shape[SHAPE_SNAPSHOT].placeholderIdx;\n\n/**\n * `true` when the shape carries `<p:nvSpPr><p:nvPr><p:ph>` — i.e. it\n * inherits from a layout/master placeholder. False for decorative\n * geometry the slide author dropped onto the canvas. Decoupled from\n * the more specific `getShapePlaceholderType` / `getShapePlaceholderIdx`\n * (either can be null on a real placeholder; together they identify it).\n */\nexport const isShapePlaceholder = (shape: SlideShapeData): boolean => {\n const snap = shape[SHAPE_SNAPSHOT];\n return snap.placeholderType !== null || snap.placeholderIdx !== null;\n};\n\nconst NAME_P_NV_SP_PR = qname('p', 'nvSpPr', NS.pml);\nconst NAME_P_C_NV_SP_PR = qname('p', 'cNvSpPr', NS.pml);\nconst ATTR_TX_BOX = qname('', 'txBox', '');\n\n/**\n * `true` when the shape is a **text box** (`<p:cNvSpPr txBox=\"1\">`) rather than\n * an autoshape. The distinction drives default text formatting: PowerPoint /\n * LibreOffice left-align and top-anchor text-box text, but center-align and\n * middle-anchor autoshape text when the deck author left those unset.\n */\nexport const isShapeTextBox = (shape: SlideShapeData): boolean => {\n const nvSpPr = firstChildElement(shape[SHAPE_ELEMENT], NAME_P_NV_SP_PR);\n if (!nvSpPr) return false;\n const cNvSpPr = firstChildElement(nvSpPr, NAME_P_C_NV_SP_PR);\n if (!cNvSpPr) return false;\n const v = getAttrValue(cNvSpPr, ATTR_TX_BOX);\n return v === '1' || v === 'true';\n};\n\nexport const getShapeText = (shape: SlideShapeData): string => shape[SHAPE_SNAPSHOT].text;\n\nexport const getShapePosition = (shape: SlideShapeData): Position | null =>\n readPosition(shape[SHAPE_ELEMENT], shape[SHAPE_SNAPSHOT].kind);\n\nexport const getShapeSize = (shape: SlideShapeData): Size | null =>\n readSize(shape[SHAPE_ELEMENT], shape[SHAPE_SNAPSHOT].kind);\n\nexport const getShapeRotation = (shape: SlideShapeData): number =>\n readRotation(shape[SHAPE_ELEMENT], shape[SHAPE_SNAPSHOT].kind);\n\nexport const getShapeFlip = (\n shape: SlideShapeData,\n): { horizontal: boolean; vertical: boolean } | null =>\n readFlip(shape[SHAPE_ELEMENT], shape[SHAPE_SNAPSHOT].kind);\n\n/**\n * Enumerates the shapes nested inside a `<p:grpSp>` group, one level\n * deep (nested groups come through as `kind: 'group'` themselves —\n * call this again on each one to recurse).\n *\n * Returns an empty array for non-group shapes. Each child carries its\n * own bounds in the group's *internal* coordinate system; pair with\n * `getGroupTransform` to project them onto the slide.\n */\nexport const getGroupChildren = (shape: SlideShapeData): ReadonlyArray<SlideShapeData> => {\n if (shape[SHAPE_SNAPSHOT].kind !== 'group') return [];\n const children = readGroupChildren(shape[SHAPE_ELEMENT]);\n return children.map((child) => ({\n [SHAPE_SLIDE]: shape[SHAPE_SLIDE],\n [SHAPE_ELEMENT]: child.element,\n [SHAPE_SNAPSHOT]: child,\n }));\n};\n\n/**\n * Returns the group's slide-relative bounds (`outer`) and the internal\n * coordinate system the children's `<a:xfrm>` values live in\n * (`inner`). Renderers project a child point `(cx, cy)` onto the slide\n * with:\n *\n * slideX = outer.x + (cx - inner.x) * (outer.w / inner.w)\n * slideY = outer.y + (cy - inner.y) * (outer.h / inner.h)\n *\n * Returns `null` for non-group shapes or for groups whose\n * `<p:grpSpPr>` omits an `<a:xfrm>`.\n */\nexport const getGroupTransform = (\n shape: SlideShapeData,\n): {\n readonly outer: ShapeBounds;\n readonly inner: ShapeBounds;\n} | null => {\n if (shape[SHAPE_SNAPSHOT].kind !== 'group') return null;\n const grpSpPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'grpSpPr', NS.pml));\n if (!grpSpPr) return null;\n const xfrm = firstChildElement(grpSpPr, qname('a', 'xfrm', NS.dml));\n if (!xfrm) return null;\n const off = firstChildElement(xfrm, qname('a', 'off', NS.dml));\n const ext = firstChildElement(xfrm, qname('a', 'ext', NS.dml));\n const chOff = firstChildElement(xfrm, qname('a', 'chOff', NS.dml));\n const chExt = firstChildElement(xfrm, qname('a', 'chExt', NS.dml));\n if (!off || !ext) return null;\n const parseAttr = (el: XmlElement, name: string): number | null => {\n const raw = getAttrValue(el, qname('', name, ''));\n if (raw === null) return null;\n const n = Number.parseInt(raw, 10);\n return Number.isFinite(n) ? n : null;\n };\n const ox = parseAttr(off, 'x');\n const oy = parseAttr(off, 'y');\n const ow = parseAttr(ext, 'cx');\n const oh = parseAttr(ext, 'cy');\n if (ox === null || oy === null || ow === null || oh === null) return null;\n // Per ECMA-376, `<a:chOff>/<a:chExt>` default to the same values as\n // `<a:off>/<a:ext>` when omitted (i.e. no internal-to-outer\n // transform).\n const ix = chOff ? (parseAttr(chOff, 'x') ?? ox) : ox;\n const iy = chOff ? (parseAttr(chOff, 'y') ?? oy) : oy;\n const iw = chExt ? (parseAttr(chExt, 'cx') ?? ow) : ow;\n const ih = chExt ? (parseAttr(chExt, 'cy') ?? oh) : oh;\n return {\n outer: { x: ox as Emu, y: oy as Emu, w: ow as Emu, h: oh as Emu },\n inner: { x: ix as Emu, y: iy as Emu, w: iw as Emu, h: ih as Emu },\n };\n};\n\n/**\n * Combined bounds — position + size in one object. Returns `null` when\n * the shape inherits both position and size from its layout (so the\n * `<a:xfrm>` element is absent or incomplete).\n */\nexport interface ShapeBounds {\n readonly x: Emu;\n readonly y: Emu;\n readonly w: Emu;\n readonly h: Emu;\n}\n\nexport const getShapeBounds = (shape: SlideShapeData): ShapeBounds | null => {\n const pos = readPosition(shape[SHAPE_ELEMENT], shape[SHAPE_SNAPSHOT].kind);\n const size = readSize(shape[SHAPE_ELEMENT], shape[SHAPE_SNAPSHOT].kind);\n if (pos === null || size === null) return null;\n return {\n x: pos.x as Emu,\n y: pos.y as Emu,\n w: size.w as Emu,\n h: size.h as Emu,\n };\n};\n\n/**\n * OOXML placeholder-type equivalence for inheritance. A `ctrTitle` inherits\n * from a `title` placeholder (and vice versa), and a `subTitle` from `body` —\n * so a centered title on a title-slide layout still picks up the master title\n * placeholder's bodyPr / lstStyle / geometry. Returns the acceptable\n * layout/master placeholder types for `phType`, most specific first.\n */\nexport const placeholderTypeCandidates = (phType: string | null): string[] => {\n if (phType === null) return [];\n if (phType === 'ctrTitle') return ['ctrTitle', 'title'];\n if (phType === 'title') return ['title', 'ctrTitle'];\n if (phType === 'subTitle') return ['subTitle', 'body'];\n return [phType];\n};\n\n/**\n * Finds the layout/master placeholder shape that `(phIdx, phType)` inherits\n * from: match by `<p:ph idx>` first, then by `<p:ph type>` using the\n * equivalence above. Shared by the bounds / bodyPr / rPr / pPr resolvers so\n * they agree on what a placeholder inherits.\n */\nexport const matchPlaceholderShape = <\n T extends { placeholderIdx: number | null; placeholderType: string | null },\n>(\n shapes: ReadonlyArray<T>,\n phIdx: number | null,\n phType: string | null,\n): T | undefined => {\n if (phIdx !== null) {\n const byIdx = shapes.find((s) => s.placeholderIdx === phIdx);\n if (byIdx) return byIdx;\n }\n for (const t of placeholderTypeCandidates(phType)) {\n const byType = shapes.find((s) => s.placeholderType === t);\n if (byType) return byType;\n }\n return undefined;\n};\n\n/**\n * Same as `getShapeBounds` but walks the placeholder inheritance chain\n * when the shape has no `<a:xfrm>` of its own:\n *\n * 1. The shape's own bounds.\n * 2. The matching placeholder on the slide's layout (by `<p:ph idx>`,\n * falling back to `<p:ph type>`).\n * 3. The matching placeholder on the layout's slide master.\n *\n * This is what renderers want when they need to draw a placeholder\n * that the deck author left unsized — real templates only override\n * geometry per placeholder when it differs from the master.\n *\n * Returns `null` when none of the three levels carries explicit bounds.\n */\nexport const getShapeBoundsResolved = (\n pres: PresentationData,\n shape: SlideShapeData,\n): ShapeBounds | null => {\n const direct = getShapeBounds(shape);\n if (direct) return direct;\n\n const slide = shape[SHAPE_SLIDE];\n const layout = getSlideLayout(slide);\n if (!layout) return null;\n\n const phIdx = getShapePlaceholderIdx(shape);\n const phType = getShapePlaceholderType(shape);\n\n const findInShapes = (\n shapes: ReadonlyArray<{\n placeholderIdx: number | null;\n placeholderType: string | null;\n element: XmlElement;\n kind: ShapeKind;\n }>,\n ): ShapeBounds | null => {\n const match = matchPlaceholderShape(shapes, phIdx, phType);\n if (!match) return null;\n const pos = readPosition(match.element, match.kind);\n const size = readSize(match.element, match.kind);\n if (pos === null || size === null) return null;\n return {\n x: pos.x as Emu,\n y: pos.y as Emu,\n w: size.w as Emu,\n h: size.h as Emu,\n };\n };\n\n const layoutHit = findInShapes(layout[LAYOUT_PART].shapes);\n if (layoutHit) return layoutHit;\n\n // Walk one level up: layout → slideMaster rel.\n const pkg = pres[INTERNAL_PACKAGE];\n const layoutPartName = partName(layout[LAYOUT_PART_NAME]);\n const layoutRels = pkg.getRels(layoutPartName);\n if (!layoutRels) return null;\n const masterRel = layoutRels.items.find((r) => r.type === REL_TYPES.slideMaster);\n if (!masterRel) return null;\n const masterPart = pkg.getPart(resolveTarget(layoutPartName, masterRel.target));\n if (!masterPart) return null;\n\n const masterRoot = parseXml(decode(masterPart.data)).root;\n const { shapes: masterShapes } = readShapeTreeFromCsldRoot(masterRoot, 'sldMaster');\n return findInShapes(masterShapes);\n};\n\n/**\n * Returns the center point of the shape's bounds in EMU, or `null`\n * when the shape has no `<a:xfrm>`. Convenience for layout\n * pipelines that compute alignment / overlap from center points.\n */\nexport const getShapeCenter = (\n shape: SlideShapeData,\n): { readonly x: Emu; readonly y: Emu } | null => {\n const bounds = getShapeBounds(shape);\n if (bounds === null) return null;\n return {\n x: (bounds.x + Math.round(bounds.w / 2)) as Emu,\n y: (bounds.y + Math.round(bounds.h / 2)) as Emu,\n };\n};\n\n/**\n * `true` when point `(x, y)` (in EMU) lies inside the shape's\n * axis-aligned bounds. Closed on the top-left edge, open on the\n * bottom-right (standard half-open rectangle). Returns `false`\n * when the shape has no bounds.\n *\n * Useful for hit-testing in custom interaction handlers.\n */\nexport const pointInShape = (shape: SlideShapeData, x: number, y: number): boolean => {\n const bounds = getShapeBounds(shape);\n if (bounds === null) return false;\n return x >= bounds.x && x < bounds.x + bounds.w && y >= bounds.y && y < bounds.y + bounds.h;\n};\n\n/**\n * Returns every shape on the slide whose bounds contain `(x, y)`\n * (in EMU). Built on `pointInShape`. The list is in document\n * order, so callers can index by z-stack from front (last) to\n * back (first) if they want one-hit semantics.\n */\nexport const findShapesAtPoint = (\n slide: SlideData,\n x: number,\n y: number,\n): ReadonlyArray<SlideShapeData> => slide[SLIDE_SHAPES].filter((s) => pointInShape(s, x, y));\n\n/**\n * Returns every shape on the slide whose bounds overlap the rectangle\n * `(x, y, w, h)` (in EMU). \"Overlap\" means the rectangles intersect at\n * all — touching edges count. Shapes with no resolvable bounds (e.g.\n * placeholders that inherit position from the layout) are skipped.\n *\n * Useful for marquee-style region selection — e.g. \"give me every\n * shape that lives in the right half of the slide\" — without\n * iterating every shape and comparing bounds by hand.\n */\nexport const findShapesInRect = (\n slide: SlideData,\n x: number,\n y: number,\n w: number,\n h: number,\n): ReadonlyArray<SlideShapeData> => {\n const rx2 = x + w;\n const ry2 = y + h;\n const out: SlideShapeData[] = [];\n for (const shape of slide[SLIDE_SHAPES]) {\n const b = getShapeBounds(shape);\n if (b === null) continue;\n const sx2 = b.x + b.w;\n const sy2 = b.y + b.h;\n if (b.x <= rx2 && sx2 >= x && b.y <= ry2 && sy2 >= y) out.push(shape);\n }\n return out;\n};\n\n/**\n * Moves the shape so its center sits at the slide canvas center.\n * Reads the presentation's slide size, then sets the shape's\n * position to `(slideWidth/2 - shapeWidth/2, slideHeight/2 - shapeHeight/2)`.\n *\n * No-op when the shape has no bounds or the presentation has no\n * configured slide size.\n */\nexport const centerShapeOnSlide = (shape: SlideShapeData): void => {\n const bounds = getShapeBounds(shape);\n if (bounds === null) return;\n const slide = shape[SHAPE_SLIDE];\n const pkg = slide[INTERNAL_PACKAGE];\n const presPart = pkg.getPart(PRES_PART_NAME);\n if (!presPart) return;\n const presRoot = parseXml(decode(presPart.data)).root;\n const model = readPresentationPart(presRoot);\n if (model.slideSize === null) return;\n const newX = Math.round(model.slideSize.cx / 2 - bounds.w / 2) as Emu;\n const newY = Math.round(model.slideSize.cy / 2 - bounds.h / 2) as Emu;\n setShapePosition(shape, newX, newY);\n};\n\n/**\n * `true` when two shapes' axis-aligned bounding boxes overlap.\n * Returns `false` when either shape has no bounds. Doesn't account\n * for rotation — uses the raw `<a:xfrm>` rectangle, not the\n * visual bounding box after rotation.\n *\n * Useful for collision detection in custom layout pipelines.\n */\nexport const shapesOverlap = (a: SlideShapeData, b: SlideShapeData): boolean => {\n const ba = getShapeBounds(a);\n const bb = getShapeBounds(b);\n if (ba === null || bb === null) return false;\n return ba.x < bb.x + bb.w && ba.x + ba.w > bb.x && ba.y < bb.y + bb.h && ba.y + ba.h > bb.y;\n};\n\n/**\n * Sets both position and size in one call. Equivalent to calling\n * `setShapePosition` followed by `setShapeSize`, but commits the slide\n * just once.\n */\nexport const setShapeBounds = (shape: SlideShapeData, bounds: ShapeBounds): void => {\n writePosition(shape[SHAPE_ELEMENT], shape[SHAPE_SNAPSHOT].kind, bounds.x, bounds.y);\n writeSize(shape[SHAPE_ELEMENT], shape[SHAPE_SNAPSHOT].kind, bounds.w, bounds.h);\n commitAndRefresh(shape);\n};\n\n/**\n * Reads back the fill choice on the shape's `<p:spPr>`. Returns:\n *\n * - `{ kind: 'solid', color: '#RRGGBB' }` for a solid sRGB fill.\n * - `{ kind: 'solid', color: 'scheme:accent1' }` for a scheme color.\n * - `{ kind: 'gradient' }` / `'pattern'` / `'image'` for those choices\n * (without breaking out their parameters — call the dedicated\n * setter to overwrite).\n * - `{ kind: 'none' }` for `<a:noFill>`.\n * - `{ kind: 'inherit' }` when no fill choice is present on this\n * shape (it inherits from the layout / master placeholder).\n */\n","// Slide-level reads (shape queries on a slide).\n\nimport {\n getShapeBounds,\n getShapePreset,\n isShapePlaceholder,\n type ShapeBounds,\n} from './shape-read-base.ts';\nimport { setShapePosition } from './shape-fill-stroke.ts';\nimport { replaceTokensInTree } from '../../internal/drawingml/index.ts';\nimport type { Emu } from '../units.ts';\nimport {\n basename,\n emptyRels,\n nextRelId,\n partName,\n resolveTarget,\n} from '../../internal/opc/index.ts';\nimport {\n REL_TYPES,\n type ShapeKind,\n readSlideLayoutPart,\n} from '../../internal/presentationml/index.ts';\nimport { parseXml, serializeXml } from '../../internal/xml/index.ts';\nimport {\n INTERNAL_PACKAGE,\n LAYOUT_PART,\n LAYOUT_PART_NAME,\n type PresentationData,\n SHAPE_ELEMENT,\n SHAPE_SLIDE,\n SHAPE_SNAPSHOT,\n SLIDE_DOCUMENT,\n SLIDE_PART_NAME,\n SLIDE_SHAPES,\n type SlideData,\n type SlideLayoutData,\n type SlideShapeData,\n} from '../_internal-symbols.ts';\nimport { commitSlideData, decode, refreshSlideData } from './_helpers.ts';\nimport { getShapeHyperlink } from './shape-paragraph.ts';\nimport { getSlides } from './slide-query.ts';\nimport { hasShapeText } from './embedded.ts';\n\n// ---------------------------------------------------------------------------\n// Slide-level reads.\n\n/**\n * Shapes on a slide, in document order with group children flattened.\n */\nexport const getSlideShapes = (slide: SlideData): ReadonlyArray<SlideShapeData> =>\n slide[SLIDE_SHAPES];\n\n/**\n * Rebinds the slide to a different layout. The slide's own content\n * (shapes, text, geometry) is preserved verbatim; only the\n * `slideLayout` rel is updated so PowerPoint re-renders with the new\n * layout's placeholder positions and theme.\n *\n * The new layout must already be a part of the package — pass one\n * returned by `getSlideLayouts(pres)` or `findSlideLayout(pres, name)`.\n */\nexport const setSlideLayout = (slide: SlideData, layout: SlideLayoutData): void => {\n const pkg = slide[INTERNAL_PACKAGE];\n const layoutPartName = layout[LAYOUT_PART_NAME];\n if (pkg.getPart(layoutPartName) === null) {\n throw new Error(`setSlideLayout: layout ${layoutPartName} not in package`);\n }\n const rels = pkg.getRels(slide[SLIDE_PART_NAME]) ?? emptyRels();\n const layoutBase = basename(layoutPartName);\n const newTarget = `../slideLayouts/${layoutBase}`;\n\n // Replace any existing slideLayout rel. Keep the same rId where\n // possible so other parts that already reference it stay valid.\n const existing = rels.items.find((r) => r.type === REL_TYPES.slideLayout);\n if (existing) {\n existing.target = newTarget;\n } else {\n rels.items.push({\n id: nextRelId(rels.items.map((r) => r.id)),\n type: REL_TYPES.slideLayout,\n target: newTarget,\n targetMode: 'Internal',\n });\n }\n pkg.setRels(slide[SLIDE_PART_NAME], rels);\n};\n\n/**\n * The slide layout this slide is bound to, or `null` if the slide has\n * no layout relationship.\n */\nexport const getSlideLayout = (slide: SlideData): SlideLayoutData | null => {\n const pkg = slide[INTERNAL_PACKAGE];\n const rels = pkg.getRels(slide[SLIDE_PART_NAME]);\n if (rels === null) return null;\n const layoutRel = rels.items.find((r) => r.type === REL_TYPES.slideLayout);\n if (!layoutRel) return null;\n const layoutName = layoutRel.target.startsWith('/')\n ? partName(layoutRel.target)\n : resolveTarget(slide[SLIDE_PART_NAME], layoutRel.target);\n const layoutPart = pkg.getPart(layoutName);\n if (layoutPart === null) return null;\n const root = parseXml(decode(layoutPart.data)).root;\n return {\n [LAYOUT_PART_NAME]: layoutName,\n [LAYOUT_PART]: readSlideLayoutPart(root),\n };\n};\n\n/**\n * Returns the first placeholder shape with the given `type` (or `null`\n * if no match). Shapes whose `<p:ph>` omits an explicit type default to\n * `'body'` per ECMA-376 §19.7.10.\n */\nexport const findSlidePlaceholder = (slide: SlideData, type: string): SlideShapeData | null => {\n for (const shape of slide[SLIDE_SHAPES]) {\n const snap = shape[SHAPE_SNAPSHOT];\n if (snap.placeholderType === type) return shape;\n if (type === 'body' && snap.placeholderType === null && snap.placeholderIdx !== null) {\n return shape;\n }\n }\n return null;\n};\n\n/**\n * Returns every placeholder shape on the slide whose text body is\n * empty. Useful for \"spot the slots that still need filling\" UIs\n * before a slide is published, and for validation hooks that warn\n * about empty slots.\n */\nexport const findEmptyPlaceholders = (slide: SlideData): ReadonlyArray<SlideShapeData> => {\n const out: SlideShapeData[] = [];\n for (const shape of slide[SLIDE_SHAPES]) {\n if (!isShapePlaceholder(shape)) continue;\n if (hasShapeText(shape)) continue;\n out.push(shape);\n }\n return out;\n};\n\n/**\n * Returns the union bounding box of a group of shapes, or `null`\n * when none of them have bounds. Useful for \"select all and move\n * together\" patterns where the caller needs a single rectangle\n * across the group.\n */\nexport const getShapesBounds = (shapes: ReadonlyArray<SlideShapeData>): ShapeBounds | null => {\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n let found = false;\n for (const shape of shapes) {\n const b = getShapeBounds(shape);\n if (!b) continue;\n found = true;\n if (b.x < minX) minX = b.x;\n if (b.y < minY) minY = b.y;\n if (b.x + b.w > maxX) maxX = b.x + b.w;\n if (b.y + b.h > maxY) maxY = b.y + b.h;\n }\n if (!found) return null;\n return {\n x: minX as Emu,\n y: minY as Emu,\n w: (maxX - minX) as Emu,\n h: (maxY - minY) as Emu,\n };\n};\n\n/**\n * Translates every shape in `shapes` by `(dxEmu, dyEmu)`. Useful\n * for \"move this group of shapes 1cm right\" patterns without\n * looping yourself. Shapes without bounds are skipped silently.\n */\nexport const translateShapes = (\n shapes: ReadonlyArray<SlideShapeData>,\n dxEmu: number,\n dyEmu: number,\n): void => {\n for (const shape of shapes) {\n const bounds = getShapeBounds(shape);\n if (bounds === null) continue;\n setShapePosition(shape, (bounds.x + dxEmu) as Emu, (bounds.y + dyEmu) as Emu);\n }\n};\n\n/**\n * Returns every slide in the deck that has at least one empty\n * placeholder shape. Built on `findEmptyPlaceholders`. Useful for\n * \"which slides still need editorial attention?\" pre-publish\n * audits.\n */\nexport const getSlidesWithEmptyPlaceholders = (\n pres: PresentationData,\n): ReadonlyArray<SlideData> => {\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n if (findEmptyPlaceholders(slide).length > 0) out.push(slide);\n }\n return out;\n};\n\n/**\n * Returns the first placeholder shape whose `<p:ph idx=\"...\">`\n * matches `idx`, or `null` when none does. Real templates often\n * disambiguate same-type placeholders (e.g. two body slots) by\n * `idx`, so this is what you reach for when type-only lookup is\n * ambiguous.\n */\nexport const findSlidePlaceholderByIdx = (slide: SlideData, idx: number): SlideShapeData | null => {\n for (const shape of slide[SLIDE_SHAPES]) {\n if (shape[SHAPE_SNAPSHOT].placeholderIdx === idx) return shape;\n }\n return null;\n};\n\n/**\n * Returns every placeholder shape with the given `type`. Useful for\n * \"two-content\" / \"comparison\" layouts where multiple body\n * placeholders share a type and the caller needs to fill them all.\n * Like `findSlidePlaceholder`, omitted `<p:ph type>` is treated as\n * `body` per ECMA-376 §19.7.10.\n */\nexport const findSlidePlaceholders = (\n slide: SlideData,\n type: string,\n): ReadonlyArray<SlideShapeData> => {\n const out: SlideShapeData[] = [];\n for (const shape of slide[SLIDE_SHAPES]) {\n const snap = shape[SHAPE_SNAPSHOT];\n if (snap.placeholderType === type) {\n out.push(shape);\n continue;\n }\n if (type === 'body' && snap.placeholderType === null && snap.placeholderIdx !== null) {\n out.push(shape);\n }\n }\n return out;\n};\n\n/**\n * First shape on the slide whose `cNvPr@name` matches `name`. Accepts\n * either a literal string (exact-equality) or a `RegExp` for pattern\n * matches — mirroring `findShapeByText`. Returns `null` when nothing\n * matches.\n */\nexport const findShapeByName = (slide: SlideData, name: string | RegExp): SlideShapeData | null => {\n if (typeof name === 'string') {\n for (const shape of slide[SLIDE_SHAPES]) {\n if (shape[SHAPE_SNAPSHOT].name === name) return shape;\n }\n return null;\n }\n for (const shape of slide[SLIDE_SHAPES]) {\n if (name.test(shape[SHAPE_SNAPSHOT].name)) return shape;\n }\n return null;\n};\n\n/**\n * Returns the shape with the given OOXML internal id (`cNvPr@id`), or\n * `null` when no such shape exists. Shape ids are unique within a\n * slide; pair with `getShapeId` to round-trip references that arrive\n * from external XML (e.g. animations, hyperlinks).\n */\nexport const findShapeById = (slide: SlideData, id: number): SlideShapeData | null => {\n for (const shape of slide[SLIDE_SHAPES]) {\n if (shape[SHAPE_SNAPSHOT].id === id) return shape;\n }\n return null;\n};\n\n/**\n * Every shape on the slide whose `cNvPr@name` matches `name`. Accepts\n * either a literal string (exact-equality, case-sensitive) or a\n * `RegExp` for pattern matches — useful when template-cloned shapes\n * share a prefix (`'TextPlaceholder1'`, `'TextPlaceholder2'`, …).\n */\nexport const findShapesByName = (\n slide: SlideData,\n name: string | RegExp,\n): ReadonlyArray<SlideShapeData> => {\n if (typeof name === 'string') {\n return slide[SLIDE_SHAPES].filter((s) => s[SHAPE_SNAPSHOT].name === name);\n }\n return slide[SLIDE_SHAPES].filter((s) => name.test(s[SHAPE_SNAPSHOT].name));\n};\n\n/**\n * First shape on the slide whose visible text matches `needle`\n * (substring or `RegExp`), or `null` when none does. Convenience\n * over `getSlideShapes(slide).find(...)` when the caller is hunting\n * for a label in a template (\"find the box that says 'Q1'\").\n */\nexport const findShapeByText = (\n slide: SlideData,\n needle: string | RegExp,\n): SlideShapeData | null => {\n for (const shape of slide[SLIDE_SHAPES]) {\n const text = shape[SHAPE_SNAPSHOT].text;\n if (typeof needle === 'string' ? text.includes(needle) : needle.test(text)) {\n return shape;\n }\n }\n return null;\n};\n\n/**\n * Every shape on the slide whose visible text matches `needle`. Use\n * when more than one shape can share the same text (common with\n * cloned bullet templates) — multi-match variant of\n * `findShapeByText`.\n */\nexport const findShapesByText = (\n slide: SlideData,\n needle: string | RegExp,\n): ReadonlyArray<SlideShapeData> => {\n const out: SlideShapeData[] = [];\n for (const shape of slide[SLIDE_SHAPES]) {\n const text = shape[SHAPE_SNAPSHOT].text;\n if (typeof needle === 'string' ? text.includes(needle) : needle.test(text)) {\n out.push(shape);\n }\n }\n return out;\n};\n\n/** Every shape on the slide of the given kind. */\nexport const findShapesByKind = (\n slide: SlideData,\n kind: ShapeKind,\n): ReadonlyArray<SlideShapeData> =>\n slide[SLIDE_SHAPES].filter((s) => s[SHAPE_SNAPSHOT].kind === kind);\n\n/**\n * Every shape on the slide whose hyperlink target matches `url`\n * (substring or `RegExp`). Pairs the existing presentation-level\n * `findSlidesByHyperlink` for cases where the caller already has a\n * specific slide and wants the linking shapes inside it.\n */\nexport const findShapesByHyperlink = (\n slide: SlideData,\n url: string | RegExp,\n): ReadonlyArray<SlideShapeData> => {\n const out: SlideShapeData[] = [];\n for (const shape of slide[SLIDE_SHAPES]) {\n const target = getShapeHyperlink(shape);\n if (target === null) continue;\n if (typeof url === 'string' ? target.includes(url) : url.test(target)) {\n out.push(shape);\n }\n }\n return out;\n};\n\n/**\n * Every shape on the slide that carries any hyperlink (regardless of\n * target). Useful for \"audit every clickable shape on this slide\" —\n * counterpart to `findShapesByHyperlink(slide, url)`, which requires a\n * matching URL.\n */\nexport const findShapesWithHyperlinks = (slide: SlideData): ReadonlyArray<SlideShapeData> => {\n const out: SlideShapeData[] = [];\n for (const shape of slide[SLIDE_SHAPES]) {\n if (getShapeHyperlink(shape) !== null) out.push(shape);\n }\n return out;\n};\n\n/**\n * Returns every shape on the slide whose `<a:prstGeom prst=\"…\"/>`\n * token matches `preset`. Useful for diagram introspection: find all\n * `'leftArrow'` shapes for a workflow swap, replace every `'cloud'`\n * with `'rect'`, etc.\n *\n * Shapes without a preset (custGeom / pictures / charts / tables /\n * connectors / groups) are filtered out.\n */\nexport const findShapesByPreset = (\n slide: SlideData,\n preset: string,\n): ReadonlyArray<SlideShapeData> => slide[SLIDE_SHAPES].filter((s) => getShapePreset(s) === preset);\n\n/**\n * Returns the slide that owns `shape`. Useful when callers receive a\n * shape from an unfiltered walk (`getAllShapes`, `findShapeInPresentation`,\n * search results) and need to know which slide it's on.\n */\nexport const getShapeSlide = (shape: SlideShapeData): SlideData => shape[SHAPE_SLIDE];\n\n/**\n * Returns the shape's current XML element as a string. Diagnostic\n * sibling of `getSlideXmlString`; useful for snapshot tests, bug\n * reports, and before/after dumps during transformations.\n */\nexport const getShapeXmlString = (shape: SlideShapeData): string =>\n serializeXml({\n kind: 'document',\n decl: null,\n root: shape[SHAPE_ELEMENT],\n prolog: [],\n epilog: [],\n });\n\n/**\n * Returns the 0-based document-order index of `shape` on its slide,\n * or `-1` when the shape is stale (e.g. after a `removeShape` that\n * rebuilt the slide's shape list).\n */\nexport const getShapeIndex = (shape: SlideShapeData): number => {\n const shapes = shape[SHAPE_SLIDE][SLIDE_SHAPES];\n return shapes.indexOf(shape);\n};\n\n/**\n * Walks every slide and returns the first shape whose name matches.\n * Accepts a literal string (exact equality) or a `RegExp` for\n * pattern matches — same shape as `findShapeByName` but deck-scoped.\n * Useful for \"find the logo placeholder anywhere in the deck.\"\n */\nexport const findShapeInPresentation = (\n pres: PresentationData,\n name: string | RegExp,\n): SlideShapeData | null => {\n for (const slide of getSlides(pres)) {\n const hit = findShapeByName(slide, name);\n if (hit !== null) return hit;\n }\n return null;\n};\n\n/**\n * Replaces `{{key}}` tokens in every text-bearing shape on this slide.\n * Returns the number of substitutions performed.\n *\n * Tokens must fit within a single text run (see `replaceTokensInTree`\n * in `drawingml/`). Cross-run replacements aren't supported — use\n * `findSlidePlaceholder` + a setText path when PowerPoint has\n * fragmented the run sequence.\n */\nexport const replaceTokensInSlide = (slide: SlideData, tokens: Record<string, string>): number => {\n const n = replaceTokensInTree(slide[SLIDE_DOCUMENT].root, tokens);\n if (n > 0) {\n commitSlideData(slide);\n refreshSlideData(slide);\n }\n return n;\n};\n","// Shape reads: fill and stroke.\n\nimport { resolveDrawingColor } from './shape-color.ts';\nimport { getShapePlaceholderIdx, getShapePlaceholderType } from './shape-read-base.ts';\nimport { getSlideLayout } from './shape-slide-read.ts';\nimport { partName, resolveTarget } from '../../internal/opc/index.ts';\nimport { REL_TYPES, readShapeTreeFromCsldRoot } from '../../internal/presentationml/index.ts';\nimport {\n NS,\n type XmlElement,\n firstChildElement,\n getAttrValue,\n parseXml,\n qname,\n} from '../../internal/xml/index.ts';\nimport {\n INTERNAL_PACKAGE,\n LAYOUT_PART,\n LAYOUT_PART_NAME,\n type PresentationData,\n SHAPE_ELEMENT,\n SHAPE_SLIDE,\n type SlideShapeData,\n} from '../_internal-symbols.ts';\nimport { decode } from './_helpers.ts';\nimport { getPresentationTheme } from './theme.ts';\nexport type ShapeFill =\n | { readonly kind: 'solid'; readonly color: string }\n | { readonly kind: 'gradient' }\n | { readonly kind: 'pattern' }\n | { readonly kind: 'image' }\n | { readonly kind: 'none' }\n | { readonly kind: 'inherit' };\n\n/**\n * Reads back the shape's stroke (`<a:ln>`). Returns:\n *\n * - `{ kind: 'solid', color, widthEmu? }` for a solid-color outline.\n * - `{ kind: 'none' }` when an `<a:noFill>` sits inside `<a:ln>`.\n * - `{ kind: 'inherit' }` when no `<a:ln>` is present.\n */\nexport type ShapeStroke =\n | { readonly kind: 'solid'; readonly color: string; readonly widthEmu?: number }\n | { readonly kind: 'none' }\n | { readonly kind: 'inherit' };\n\n/**\n * Convenience over `getShapeStroke(shape)`: returns the solid-\n * stroke color (`#RRGGBB` / `scheme:<token>`) or `null` when the\n * stroke is inherited / removed.\n */\nexport const getShapeStrokeColor = (shape: SlideShapeData): string | null => {\n const stroke = getShapeStroke(shape);\n return stroke.kind === 'solid' ? stroke.color : null;\n};\n\n/**\n * Convenience over `getShapeStroke(shape)`: returns the stroke\n * width in EMU when the stroke is solid and an explicit width is\n * set, or `null` otherwise.\n */\nexport const getShapeStrokeWidth = (shape: SlideShapeData): number | null => {\n const stroke = getShapeStroke(shape);\n return stroke.kind === 'solid' && stroke.widthEmu !== undefined ? stroke.widthEmu : null;\n};\n\n/**\n * Returns the shape's stroke color resolved to a concrete `#RRGGBB`:\n * scheme tokens are mapped through the deck's color scheme and\n * `<a:lumMod>` / `<a:tint>` / `<a:shade>` / etc. transform children\n * are applied. Returns `null` when the stroke isn't a solid color\n * (inherits / `noFill`) or when the color can't be resolved.\n *\n * Companion to `getShapeStrokeColor`, which surfaces only the raw\n * `#RRGGBB` / `scheme:<token>` string — fine for round-tripping but\n * wrong for rendering, because PowerPoint paints the *transformed*\n * color, not the base one.\n */\nexport const getShapeStrokeColorResolved = (\n pres: PresentationData,\n shape: SlideShapeData,\n): string | null => {\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (!spPr) return null;\n const ln = firstChildElement(spPr, qname('a', 'ln', NS.dml));\n if (!ln) return null;\n const solid = firstChildElement(ln, qname('a', 'solidFill', NS.dml));\n if (!solid) return null;\n for (const inner of solid.children) {\n if (inner.kind !== 'element' || inner.name.namespaceURI !== NS.dml) continue;\n return resolveDrawingColor(inner, getPresentationTheme(pres));\n }\n return null;\n};\n\n/**\n * Reads the stroke's line cap style — `'rnd'` (round), `'sq'` (square),\n * `'flat'`, or `null` when the attribute isn't set. Per ECMA-376\n * §20.1.2.3.10 (`ST_LineCap`).\n */\nexport const getShapeStrokeCap = (shape: SlideShapeData): 'rnd' | 'sq' | 'flat' | null => {\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (!spPr) return null;\n const ln = firstChildElement(spPr, qname('a', 'ln', NS.dml));\n if (!ln) return null;\n const v = getAttrValue(ln, qname('', 'cap', ''));\n if (v === 'rnd' || v === 'sq' || v === 'flat') return v;\n return null;\n};\n\n/**\n * Reads the stroke's line join style — `'round'` / `'bevel'` / `'miter'`,\n * or `null` when no explicit join element is present. Maps from the\n * three child-element variants `<a:round/>`, `<a:bevel/>`, `<a:miter/>`.\n */\nexport const getShapeStrokeJoin = (shape: SlideShapeData): 'round' | 'bevel' | 'miter' | null => {\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (!spPr) return null;\n const ln = firstChildElement(spPr, qname('a', 'ln', NS.dml));\n if (!ln) return null;\n for (const c of ln.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n if (c.name.localName === 'round') return 'round';\n if (c.name.localName === 'bevel') return 'bevel';\n if (c.name.localName === 'miter') return 'miter';\n }\n return null;\n};\n\n/**\n * Reads the stroke's compound-line style (`<a:ln cmpd=\"…\">`) — single,\n * double, triple, or thick/thin / thin/thick parallel lines. ECMA-376\n * §20.1.2.3.11 (`ST_CompoundLine`).\n */\nexport const getShapeStrokeCompound = (\n shape: SlideShapeData,\n): 'sng' | 'dbl' | 'thickThin' | 'thinThick' | 'tri' | null => {\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (!spPr) return null;\n const ln = firstChildElement(spPr, qname('a', 'ln', NS.dml));\n if (!ln) return null;\n const v = getAttrValue(ln, qname('', 'cmpd', ''));\n if (v === 'sng' || v === 'dbl' || v === 'thickThin' || v === 'thinThick' || v === 'tri') return v;\n return null;\n};\n\n/**\n * Same as `getShapeStroke` but walks the layout → master placeholder\n * cascade when the shape itself reports `'inherit'`. First non-inherit\n * stroke layer wins.\n */\nexport const getShapeStrokeEffective = (\n pres: PresentationData,\n shape: SlideShapeData,\n): ShapeStroke => {\n const own = getShapeStroke(shape);\n if (own.kind !== 'inherit') return own;\n\n const phIdx = getShapePlaceholderIdx(shape);\n const phType = getShapePlaceholderType(shape);\n if (phIdx === null && phType === null) return own;\n\n const layout = getSlideLayout(shape[SHAPE_SLIDE]);\n if (!layout) return own;\n\n const readStrokeFromSpPr = (el: XmlElement): ShapeStroke | null => {\n const spPr = firstChildElement(el, qname('p', 'spPr', NS.pml));\n if (!spPr) return null;\n const ln = firstChildElement(spPr, qname('a', 'ln', NS.dml));\n if (!ln) return null;\n const wRaw = getAttrValue(ln, qname('', 'w', ''));\n const widthEmu = wRaw !== null ? Number.parseInt(wRaw, 10) : undefined;\n for (const c of ln.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n if (c.name.localName === 'noFill') return { kind: 'none' };\n if (c.name.localName === 'solidFill') {\n for (const inner of c.children) {\n if (inner.kind !== 'element' || inner.name.namespaceURI !== NS.dml) continue;\n if (inner.name.localName === 'srgbClr') {\n const val = getAttrValue(inner, qname('', 'val', ''));\n if (val !== null) {\n return {\n kind: 'solid',\n color: `#${val.toUpperCase()}`,\n ...(widthEmu !== undefined ? { widthEmu } : {}),\n };\n }\n }\n if (inner.name.localName === 'schemeClr') {\n const val = getAttrValue(inner, qname('', 'val', ''));\n if (val !== null) {\n return {\n kind: 'solid',\n color: `scheme:${val}`,\n ...(widthEmu !== undefined ? { widthEmu } : {}),\n };\n }\n }\n }\n }\n }\n return null;\n };\n\n const findPh = (\n shapes: ReadonlyArray<{\n placeholderIdx: number | null;\n placeholderType: string | null;\n element: XmlElement;\n }>,\n ): XmlElement | null => {\n let match = phIdx !== null ? shapes.find((s) => s.placeholderIdx === phIdx) : undefined;\n if (!match && phType !== null) match = shapes.find((s) => s.placeholderType === phType);\n return match?.element ?? null;\n };\n\n const layoutPh = findPh(layout[LAYOUT_PART].shapes);\n if (layoutPh) {\n const s = readStrokeFromSpPr(layoutPh);\n if (s) return s;\n }\n const pkg = pres[INTERNAL_PACKAGE];\n const layoutPartName = partName(layout[LAYOUT_PART_NAME]);\n const layoutRels = pkg.getRels(layoutPartName);\n if (!layoutRels) return own;\n const masterRel = layoutRels.items.find((r) => r.type === REL_TYPES.slideMaster);\n if (!masterRel) return own;\n const masterPart = pkg.getPart(resolveTarget(layoutPartName, masterRel.target));\n if (!masterPart) return own;\n const masterRoot = parseXml(decode(masterPart.data)).root;\n const { shapes: masterShapes } = readShapeTreeFromCsldRoot(masterRoot, 'sldMaster');\n const masterPh = findPh(masterShapes);\n if (masterPh) {\n const s = readStrokeFromSpPr(masterPh);\n if (s) return s;\n }\n return own;\n};\n\nexport const getShapeStroke = (shape: SlideShapeData): ShapeStroke => {\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (!spPr) return { kind: 'inherit' };\n const ln = firstChildElement(spPr, qname('a', 'ln', NS.dml));\n if (!ln) return { kind: 'inherit' };\n\n const wRaw = getAttrValue(ln, qname('', 'w', ''));\n const widthEmu = wRaw !== null ? Number.parseInt(wRaw, 10) : undefined;\n\n for (const c of ln.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n if (c.name.localName === 'noFill') return { kind: 'none' };\n if (c.name.localName === 'solidFill') {\n for (const inner of c.children) {\n if (inner.kind !== 'element' || inner.name.namespaceURI !== NS.dml) continue;\n if (inner.name.localName === 'srgbClr') {\n const val = getAttrValue(inner, qname('', 'val', ''));\n if (val !== null) {\n return {\n kind: 'solid',\n color: `#${val.toUpperCase()}`,\n ...(widthEmu !== undefined ? { widthEmu } : {}),\n };\n }\n }\n if (inner.name.localName === 'schemeClr') {\n const val = getAttrValue(inner, qname('', 'val', ''));\n if (val !== null) {\n return {\n kind: 'solid',\n color: `scheme:${val}`,\n ...(widthEmu !== undefined ? { widthEmu } : {}),\n };\n }\n }\n }\n return {\n kind: 'solid',\n color: '',\n ...(widthEmu !== undefined ? { widthEmu } : {}),\n };\n }\n }\n return { kind: 'inherit' };\n};\n\n/**\n * Convenience over `getShapeFill(shape)`: returns the solid-fill\n * color string (`#RRGGBB` or `scheme:<token>`) when the shape has\n * one, or `null` otherwise. Use when the caller only cares about\n * the color and doesn't need to distinguish \"inherit\" / \"no fill\" /\n * \"gradient\" / \"pattern\" / \"image\" from each other.\n */\nexport const getShapeFillColor = (shape: SlideShapeData): string | null => {\n const fill = getShapeFill(shape);\n return fill.kind === 'solid' ? fill.color : null;\n};\n\n/**\n * Returns the shape's solid fill resolved to a concrete `#RRGGBB`:\n * scheme tokens are mapped through the deck's color scheme and\n * `<a:lumMod>` / `<a:tint>` / `<a:shade>` / etc. transform children\n * are applied. Returns `null` when the fill isn't solid (gradient,\n * pattern, image, none, inherit) or when the color can't be resolved.\n *\n * Companion to `getShapeFillColor`, which surfaces only the raw\n * `#RRGGBB` / `scheme:<token>` string. Renderers and exporters that\n * need the color PowerPoint actually paints should call this.\n */\nexport const getShapeFillColorResolved = (\n pres: PresentationData,\n shape: SlideShapeData,\n): string | null => {\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (!spPr) return null;\n const solid = firstChildElement(spPr, qname('a', 'solidFill', NS.dml));\n if (!solid) return null;\n for (const inner of solid.children) {\n if (inner.kind !== 'element' || inner.name.namespaceURI !== NS.dml) continue;\n return resolveDrawingColor(inner, getPresentationTheme(pres));\n }\n return null;\n};\n\n/**\n * Same as `getShapeFill` but walks the layout → master placeholder\n * cascade when the shape itself reports `'inherit'`. Returns the first\n * non-inherit fill found, or `{ kind: 'inherit' }` when neither layer\n * supplies one. Useful for renderers that want the actual fill the\n * placeholder will paint with.\n */\nexport const getShapeFillEffective = (pres: PresentationData, shape: SlideShapeData): ShapeFill => {\n const own = getShapeFill(shape);\n if (own.kind !== 'inherit') return own;\n\n const phIdx = getShapePlaceholderIdx(shape);\n const phType = getShapePlaceholderType(shape);\n if (phIdx === null && phType === null) return own;\n\n const layout = getSlideLayout(shape[SHAPE_SLIDE]);\n if (!layout) return own;\n\n const readFillFromSpPr = (el: XmlElement): ShapeFill | null => {\n const spPr = firstChildElement(el, qname('p', 'spPr', NS.pml));\n if (!spPr) return null;\n for (const c of spPr.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n switch (c.name.localName) {\n case 'noFill':\n return { kind: 'none' };\n case 'solidFill': {\n for (const inner of c.children) {\n if (inner.kind !== 'element' || inner.name.namespaceURI !== NS.dml) continue;\n if (inner.name.localName === 'srgbClr') {\n const val = getAttrValue(inner, qname('', 'val', ''));\n if (val !== null) return { kind: 'solid', color: `#${val.toUpperCase()}` };\n }\n if (inner.name.localName === 'schemeClr') {\n const val = getAttrValue(inner, qname('', 'val', ''));\n if (val !== null) return { kind: 'solid', color: `scheme:${val}` };\n }\n }\n return { kind: 'solid', color: '' };\n }\n case 'gradFill':\n return { kind: 'gradient' };\n case 'pattFill':\n return { kind: 'pattern' };\n case 'blipFill':\n return { kind: 'image' };\n }\n }\n return null;\n };\n\n const findPh = (\n shapes: ReadonlyArray<{\n placeholderIdx: number | null;\n placeholderType: string | null;\n element: XmlElement;\n }>,\n ): XmlElement | null => {\n let match = phIdx !== null ? shapes.find((s) => s.placeholderIdx === phIdx) : undefined;\n if (!match && phType !== null) match = shapes.find((s) => s.placeholderType === phType);\n return match?.element ?? null;\n };\n\n const layoutPh = findPh(layout[LAYOUT_PART].shapes);\n if (layoutPh) {\n const f = readFillFromSpPr(layoutPh);\n if (f) return f;\n }\n\n const pkg = pres[INTERNAL_PACKAGE];\n const layoutPartName = partName(layout[LAYOUT_PART_NAME]);\n const layoutRels = pkg.getRels(layoutPartName);\n if (!layoutRels) return own;\n const masterRel = layoutRels.items.find((r) => r.type === REL_TYPES.slideMaster);\n if (!masterRel) return own;\n const masterPart = pkg.getPart(resolveTarget(layoutPartName, masterRel.target));\n if (!masterPart) return own;\n const masterRoot = parseXml(decode(masterPart.data)).root;\n const { shapes: masterShapes } = readShapeTreeFromCsldRoot(masterRoot, 'sldMaster');\n const masterPh = findPh(masterShapes);\n if (masterPh) {\n const f = readFillFromSpPr(masterPh);\n if (f) return f;\n }\n return own;\n};\n\nexport const getShapeFill = (shape: SlideShapeData): ShapeFill => {\n const spPrName = qname('p', 'spPr', NS.pml);\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], spPrName);\n if (!spPr) return { kind: 'inherit' };\n for (const c of spPr.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n switch (c.name.localName) {\n case 'noFill':\n return { kind: 'none' };\n case 'solidFill': {\n // Look for the immediate color choice; report sRGB verbatim,\n // scheme colors as \"scheme:<token>\".\n for (const inner of c.children) {\n if (inner.kind !== 'element' || inner.name.namespaceURI !== NS.dml) continue;\n if (inner.name.localName === 'srgbClr') {\n const val = getAttrValue(inner, qname('', 'val', ''));\n if (val !== null) return { kind: 'solid', color: `#${val.toUpperCase()}` };\n }\n if (inner.name.localName === 'schemeClr') {\n const val = getAttrValue(inner, qname('', 'val', ''));\n if (val !== null) return { kind: 'solid', color: `scheme:${val}` };\n }\n }\n return { kind: 'solid', color: '' };\n }\n case 'gradFill':\n return { kind: 'gradient' };\n case 'pattFill':\n return { kind: 'pattern' };\n case 'blipFill':\n return { kind: 'image' };\n }\n }\n return { kind: 'inherit' };\n};\n","// Detailed gradient-fill reader.\n\nimport { getShapePlaceholderIdx, getShapePlaceholderType } from './shape-read-base.ts';\nimport { getSlideLayout } from './shape-slide-read.ts';\nimport { type GradientFillOptions } from '../../internal/drawingml/index.ts';\nimport { partName, resolveTarget } from '../../internal/opc/index.ts';\nimport { REL_TYPES, readShapeTreeFromCsldRoot } from '../../internal/presentationml/index.ts';\nimport {\n NS,\n type XmlElement,\n firstChildElement,\n getAttrValue,\n parseXml,\n qname,\n} from '../../internal/xml/index.ts';\nimport {\n INTERNAL_PACKAGE,\n LAYOUT_PART,\n LAYOUT_PART_NAME,\n type PresentationData,\n SHAPE_ELEMENT,\n SHAPE_SLIDE,\n type SlideShapeData,\n} from '../_internal-symbols.ts';\nimport { decode } from './_helpers.ts';\n// ---------------------------------------------------------------------------\n// Detailed gradient-fill reader. Companion to `getShapeFill`, which\n// only reports the discriminated `kind`. Returns the full stop list +\n// angle when the shape carries a `<a:gradFill>` of its own, or\n// `null` for solid / pattern / image / none / inherited fills.\n//\n// Useful for renderers (preview generators, PDF exporters) that need\n// to reproduce the gradient instead of substituting a placeholder.\n\nexport const NAME_A_GRAD_FILL = qname('a', 'gradFill', NS.dml);\nexport const NAME_A_GS_LST = qname('a', 'gsLst', NS.dml);\nexport const NAME_A_LIN = qname('a', 'lin', NS.dml);\n\nexport const readColorFromContainer = (parent: XmlElement): string | null => {\n for (const c of parent.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n if (c.name.localName === 'srgbClr') {\n const val = getAttrValue(c, qname('', 'val', ''));\n if (val !== null) return `#${val.toUpperCase()}`;\n }\n if (c.name.localName === 'schemeClr') {\n const val = getAttrValue(c, qname('', 'val', ''));\n if (val !== null) return `scheme:${val}`;\n }\n }\n return null;\n};\n\n// Parses one `<a:gradFill>` element into the stop list + direction.\n// Shared by the shape-own reader and the placeholder-cascade reader.\nconst parseGradFill = (gradFill: XmlElement): GradientFillOptions | null => {\n const gsLst = firstChildElement(gradFill, NAME_A_GS_LST);\n if (!gsLst) return null;\n const stops: Array<{ offset: number; color: string }> = [];\n for (const c of gsLst.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml || c.name.localName !== 'gs') {\n continue;\n }\n const posRaw = getAttrValue(c, qname('', 'pos', ''));\n if (posRaw === null) continue;\n const pos = Number.parseInt(posRaw, 10);\n if (!Number.isFinite(pos)) continue;\n const color = readColorFromContainer(c);\n if (color === null) continue;\n stops.push({ offset: pos / 100_000, color });\n }\n if (stops.length === 0) return null;\n // ECMA-376 §20.1.8.33: gradFill has either <a:lin> (linear) or <a:path>\n // (radial / rectangular / shape-following) as a child to describe the\n // direction. We surface both so renderers can faithfully reproduce\n // non-linear gradients.\n let angleDeg = 0;\n const lin = firstChildElement(gradFill, NAME_A_LIN);\n if (lin) {\n const angRaw = getAttrValue(lin, qname('', 'ang', ''));\n if (angRaw !== null) {\n const ang = Number.parseInt(angRaw, 10);\n if (Number.isFinite(ang)) angleDeg = ang / 60_000;\n }\n }\n const pathEl = firstChildElement(gradFill, qname('a', 'path', NS.dml));\n if (pathEl) {\n const p = getAttrValue(pathEl, qname('', 'path', ''));\n const pathVal: 'circle' | 'rect' | 'shape' | null =\n p === 'circle' || p === 'rect' || p === 'shape' ? p : null;\n if (pathVal) {\n let focus: GradientFillOptions['focus'];\n const fillToRect = firstChildElement(pathEl, qname('a', 'fillToRect', NS.dml));\n if (fillToRect) {\n const pct = (name: string): number | undefined => {\n const v = getAttrValue(fillToRect, qname('', name, ''));\n if (v === null) return undefined;\n let n = Number.parseFloat(v);\n if (!Number.isFinite(n)) return undefined;\n if (Math.abs(n) > 1) n = n / 100000;\n return n;\n };\n const l = pct('l') ?? 0.5;\n const t = pct('t') ?? 0.5;\n const r = pct('r') ?? 0.5;\n const b = pct('b') ?? 0.5;\n focus = { left: l, top: t, right: r, bottom: b };\n }\n return { stops, angleDeg, path: pathVal, ...(focus ? { focus } : {}) };\n }\n }\n return { stops, angleDeg };\n};\n\n/**\n * Returns the full gradient definition (`stops` + `angleDeg`) when the\n * shape's `<p:spPr>` carries an `<a:gradFill>`. Returns `null` for any\n * other fill kind, including `inherit` — the function does not walk the\n * layout / master cascade. Use `getShapeGradientFillEffective` for that.\n */\nexport const getShapeGradientFill = (shape: SlideShapeData): GradientFillOptions | null => {\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (!spPr) return null;\n const gradFill = firstChildElement(spPr, NAME_A_GRAD_FILL);\n if (!gradFill) return null;\n return parseGradFill(gradFill);\n};\n\n/**\n * Same as `getShapeGradientFill` but walks the layout → master\n * placeholder cascade when the shape itself carries no `<a:gradFill>`.\n * Returns the first gradient found, or `null` when neither the shape\n * nor its inherited placeholder defines one.\n *\n * Resolves only gradients authored as a literal `<a:gradFill>` on the\n * shape or its placeholder ancestors. Gradients referenced through the\n * theme style matrix (`<p:style><a:fillRef>` → `<a:fillStyleLst>`) are\n * not modelled by the core yet, so those still report `inherit` and\n * fall through here.\n */\nexport const getShapeGradientFillEffective = (\n pres: PresentationData,\n shape: SlideShapeData,\n): GradientFillOptions | null => {\n const own = getShapeGradientFill(shape);\n if (own) return own;\n\n const phIdx = getShapePlaceholderIdx(shape);\n const phType = getShapePlaceholderType(shape);\n if (phIdx === null && phType === null) return null;\n\n const layout = getSlideLayout(shape[SHAPE_SLIDE]);\n if (!layout) return null;\n\n const readGradFromSpPr = (el: XmlElement): GradientFillOptions | null => {\n const spPr = firstChildElement(el, qname('p', 'spPr', NS.pml));\n if (!spPr) return null;\n const gradFill = firstChildElement(spPr, NAME_A_GRAD_FILL);\n if (!gradFill) return null;\n return parseGradFill(gradFill);\n };\n\n const findPh = (\n shapes: ReadonlyArray<{\n placeholderIdx: number | null;\n placeholderType: string | null;\n element: XmlElement;\n }>,\n ): XmlElement | null => {\n let match = phIdx !== null ? shapes.find((s) => s.placeholderIdx === phIdx) : undefined;\n if (!match && phType !== null) match = shapes.find((s) => s.placeholderType === phType);\n return match?.element ?? null;\n };\n\n const layoutPh = findPh(layout[LAYOUT_PART].shapes);\n if (layoutPh) {\n const g = readGradFromSpPr(layoutPh);\n if (g) return g;\n }\n\n const pkg = pres[INTERNAL_PACKAGE];\n const layoutPartName = partName(layout[LAYOUT_PART_NAME]);\n const layoutRels = pkg.getRels(layoutPartName);\n if (!layoutRels) return null;\n const masterRel = layoutRels.items.find((r) => r.type === REL_TYPES.slideMaster);\n if (!masterRel) return null;\n const masterPart = pkg.getPart(resolveTarget(layoutPartName, masterRel.target));\n if (!masterPart) return null;\n const masterRoot = parseXml(decode(masterPart.data)).root;\n const { shapes: masterShapes } = readShapeTreeFromCsldRoot(masterRoot, 'sldMaster');\n const masterPh = findPh(masterShapes);\n if (masterPh) {\n const g = readGradFromSpPr(masterPh);\n if (g) return g;\n }\n return null;\n};\n","// Shape mutation: shadow + glow effects.\n\nimport { resolveDrawingColor } from './shape-color.ts';\nimport { getShapePlaceholderIdx, getShapePlaceholderType } from './shape-read-base.ts';\nimport { getSlideLayout } from './shape-slide-read.ts';\nimport {\n type GlowOptions,\n type ShadowOptions,\n clearEffects as clearEffectsImpl,\n setGlow,\n setShadow,\n} from '../../internal/drawingml/index.ts';\nimport { partName, resolveTarget } from '../../internal/opc/index.ts';\nimport { REL_TYPES, readShapeTreeFromCsldRoot } from '../../internal/presentationml/index.ts';\nimport {\n NS,\n type XmlElement,\n firstChildElement,\n getAttrValue,\n parseXml,\n qname,\n} from '../../internal/xml/index.ts';\nimport {\n INTERNAL_PACKAGE,\n LAYOUT_PART,\n LAYOUT_PART_NAME,\n type PresentationData,\n SHAPE_ELEMENT,\n SHAPE_SLIDE,\n SLIDE_SHAPES,\n type SlideData,\n type SlideShapeData,\n} from '../_internal-symbols.ts';\nimport { commitAndRefresh, decode, requireSpPr } from './_helpers.ts';\nimport { type PresentationTheme, getPresentationTheme } from './theme.ts';\n// ---------------------------------------------------------------------------\n// Effects: shadow + glow.\n\n/**\n * Read-back for `setShapeShadow` / `setShapeGlow`. Returns the kind\n * of effect currently on the shape's `<a:effectLst>`, or `null` when\n * none. Decodes the configured color + numeric parameters when\n * present.\n */\nexport type ShapeEffect =\n | {\n readonly kind: 'shadow';\n readonly color: string;\n readonly blurEmu: number;\n readonly offsetEmu: number;\n readonly angleDeg: number;\n readonly opacity?: number;\n }\n | {\n readonly kind: 'glow';\n readonly color: string;\n readonly radiusEmu: number;\n };\n\n/**\n * Discriminated union covering every effect in\n * `CT_EffectStyleItem` (ECMA-376 §20.1.8.x) — outer shadow, inner\n * shadow, glow, reflection, soft-edge, blur. Returned in document\n * order so renderers can chain filters with the same composition\n * PowerPoint applies.\n *\n * Lengths are EMU; angles are degrees clockwise from 3 o'clock;\n * opacity is a unit fraction (0..1) when the spec exposes one.\n */\nexport type ShapeEffectAny =\n | {\n readonly kind: 'outerShdw';\n readonly color: string;\n readonly opacity?: number;\n readonly blurEmu: number;\n readonly distEmu: number;\n readonly angleDeg: number;\n }\n | {\n readonly kind: 'innerShdw';\n readonly color: string;\n readonly opacity?: number;\n readonly blurEmu: number;\n readonly distEmu: number;\n readonly angleDeg: number;\n }\n | {\n readonly kind: 'glow';\n readonly color: string;\n readonly opacity?: number;\n readonly radiusEmu: number;\n }\n | {\n readonly kind: 'reflection';\n // `opacity` is the far-end alpha (`endA`); `startOpacity` the\n // near-end alpha (`stA`). Both are unit fractions when authored.\n readonly opacity?: number;\n readonly startOpacity?: number;\n // Vertical scale (`sy`) as a signed unit fraction — PowerPoint\n // encodes the mirror as a negative `sy` (e.g. -1 = full-height\n // flip), so renderers must honor the sign, not just the magnitude.\n readonly scaleY?: number;\n readonly blurEmu: number;\n readonly distEmu: number;\n readonly angleDeg: number;\n }\n | { readonly kind: 'softEdge'; readonly radiusEmu: number }\n | { readonly kind: 'blur'; readonly radiusEmu: number };\n\nexport const getShapeEffect = (shape: SlideShapeData): ShapeEffect | null => {\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (!spPr) return null;\n const effectLst = firstChildElement(spPr, qname('a', 'effectLst', NS.dml));\n if (!effectLst) return null;\n\n const readColor = (host: XmlElement): { color: string; opacity?: number } => {\n const srgb = firstChildElement(host, qname('a', 'srgbClr', NS.dml));\n if (!srgb) return { color: '' };\n const val = getAttrValue(srgb, qname('', 'val', ''));\n const color = val !== null ? `#${val.toUpperCase()}` : '';\n const alpha = firstChildElement(srgb, qname('a', 'alpha', NS.dml));\n if (alpha) {\n const a = getAttrValue(alpha, qname('', 'val', ''));\n if (a !== null) {\n const n = Number.parseInt(a, 10);\n if (Number.isFinite(n)) return { color, opacity: n / 100000 };\n }\n }\n return { color };\n };\n\n const outerShdw = firstChildElement(effectLst, qname('a', 'outerShdw', NS.dml));\n if (outerShdw) {\n const blur = Number.parseInt(getAttrValue(outerShdw, qname('', 'blurRad', '')) ?? '0', 10);\n const dist = Number.parseInt(getAttrValue(outerShdw, qname('', 'dist', '')) ?? '0', 10);\n const dirRaw = Number.parseInt(getAttrValue(outerShdw, qname('', 'dir', '')) ?? '0', 10);\n const c = readColor(outerShdw);\n return {\n kind: 'shadow',\n color: c.color,\n blurEmu: blur,\n offsetEmu: dist,\n angleDeg: dirRaw / 60000,\n ...(c.opacity !== undefined ? { opacity: c.opacity } : {}),\n };\n }\n const glow = firstChildElement(effectLst, qname('a', 'glow', NS.dml));\n if (glow) {\n const rad = Number.parseInt(getAttrValue(glow, qname('', 'rad', '')) ?? '0', 10);\n const c = readColor(glow);\n return { kind: 'glow', color: c.color, radiusEmu: rad };\n }\n return null;\n};\n\n/**\n * Returns every effect attached to the shape's `<a:effectLst>` in\n * document order — outer shadow, inner shadow, glow, reflection,\n * soft edge, blur. Empty array when no effects apply.\n *\n * Companion to `getShapeEffect`, which is the v1 \"first effect only\"\n * helper. `getShapeEffects` is what renderers want because PowerPoint\n * composes multiple effects in a single filter (shadow + glow, etc.).\n */\n// Parses an `<a:effectLst>` element into the typed effect union.\n// Pulled out of `getShapeEffects` so the cascade-aware variant can\n// reuse it.\nconst parseEffectLst = (\n effectLst: XmlElement,\n theme: PresentationTheme | null,\n): ShapeEffectAny[] => {\n const readEffectColor = (host: XmlElement): { color: string; opacity?: number } => {\n let inner: XmlElement | null = null;\n for (const c of host.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n if (\n c.name.localName === 'srgbClr' ||\n c.name.localName === 'schemeClr' ||\n c.name.localName === 'sysClr' ||\n c.name.localName === 'prstClr'\n ) {\n inner = c;\n break;\n }\n }\n if (!inner) return { color: '' };\n let opacity: number | undefined;\n const alphaEl = firstChildElement(inner, qname('a', 'alpha', NS.dml));\n if (alphaEl) {\n const a = getAttrValue(alphaEl, qname('', 'val', ''));\n if (a !== null) {\n let n = Number.parseFloat(a);\n if (Number.isFinite(n)) {\n if (Math.abs(n) > 1) n = n / 100000;\n opacity = n;\n }\n }\n }\n const hex = resolveDrawingColor(inner, theme);\n return { color: hex ?? '', ...(opacity !== undefined ? { opacity } : {}) };\n };\n\n const out: ShapeEffectAny[] = [];\n for (const child of effectLst.children) {\n if (child.kind !== 'element' || child.name.namespaceURI !== NS.dml) continue;\n const local = child.name.localName;\n if (local === 'outerShdw' || local === 'innerShdw') {\n const blur = Number.parseInt(getAttrValue(child, qname('', 'blurRad', '')) ?? '0', 10) || 0;\n const dist = Number.parseInt(getAttrValue(child, qname('', 'dist', '')) ?? '0', 10) || 0;\n const dir = Number.parseInt(getAttrValue(child, qname('', 'dir', '')) ?? '0', 10) || 0;\n const c = readEffectColor(child);\n out.push({\n kind: local,\n color: c.color,\n blurEmu: blur,\n distEmu: dist,\n angleDeg: dir / 60000,\n ...(c.opacity !== undefined ? { opacity: c.opacity } : {}),\n });\n } else if (local === 'glow') {\n const rad = Number.parseInt(getAttrValue(child, qname('', 'rad', '')) ?? '0', 10) || 0;\n const c = readEffectColor(child);\n out.push({\n kind: 'glow',\n color: c.color,\n radiusEmu: rad,\n ...(c.opacity !== undefined ? { opacity: c.opacity } : {}),\n });\n } else if (local === 'reflection') {\n const blur = Number.parseInt(getAttrValue(child, qname('', 'blurRad', '')) ?? '0', 10) || 0;\n const dist = Number.parseInt(getAttrValue(child, qname('', 'dist', '')) ?? '0', 10) || 0;\n const dir = Number.parseInt(getAttrValue(child, qname('', 'dir', '')) ?? '0', 10) || 0;\n // `stA`/`endA` are ST_PositiveFixedPercentage (0..100000); `sy` is\n // ST_Percentage and may be negative to encode the mirror flip.\n const pctFraction = (name: string): number | undefined => {\n const raw = getAttrValue(child, qname('', name, ''));\n if (raw === null) return undefined;\n let n = Number.parseFloat(raw);\n if (!Number.isFinite(n)) return undefined;\n if (Math.abs(n) > 1) n = n / 100000;\n return n;\n };\n const opacity = pctFraction('endA');\n const startOpacity = pctFraction('stA');\n const scaleY = pctFraction('sy');\n out.push({\n kind: 'reflection',\n blurEmu: blur,\n distEmu: dist,\n angleDeg: dir / 60000,\n ...(opacity !== undefined ? { opacity } : {}),\n ...(startOpacity !== undefined ? { startOpacity } : {}),\n ...(scaleY !== undefined ? { scaleY } : {}),\n });\n } else if (local === 'softEdge') {\n const rad = Number.parseInt(getAttrValue(child, qname('', 'rad', '')) ?? '0', 10) || 0;\n out.push({ kind: 'softEdge', radiusEmu: rad });\n } else if (local === 'blur') {\n const rad = Number.parseInt(getAttrValue(child, qname('', 'rad', '')) ?? '0', 10) || 0;\n out.push({ kind: 'blur', radiusEmu: rad });\n }\n }\n return out;\n};\n\nexport const getShapeEffects = (\n pres: PresentationData,\n shape: SlideShapeData,\n): readonly ShapeEffectAny[] => {\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n if (!spPr) return [];\n const effectLst = firstChildElement(spPr, qname('a', 'effectLst', NS.dml));\n if (!effectLst) return [];\n return parseEffectLst(effectLst, getPresentationTheme(pres));\n};\n\n/**\n * Every shape on the slide whose `<a:effectLst>` carries an effect\n * of the given `kind` (`'outerShdw'`, `'innerShdw'`, `'glow'`,\n * `'reflection'`, `'softEdge'`, `'blur'`). Pure presence check — only\n * looks at the shape's own effect list, not the layout / master\n * cascade. Pair with `findShapesByEffect(pres, slide, 'softEdge')`\n * style call sites for visual-effect audits.\n */\nexport const findShapesByEffect = (\n pres: PresentationData,\n slide: SlideData,\n kind: ShapeEffectAny['kind'],\n): ReadonlyArray<SlideShapeData> => {\n const out: SlideShapeData[] = [];\n for (const shape of slide[SLIDE_SHAPES]) {\n if (getShapeEffects(pres, shape).some((e) => e.kind === kind)) out.push(shape);\n }\n return out;\n};\n\n/**\n * Same as `getShapeEffects` but walks the layout → master placeholder\n * cascade when the shape itself has no `<a:effectLst>`. Inherits\n * \"all or nothing\" — once any layer supplies an effect list, that\n * list is used; layers further down aren't merged in. This matches\n * PowerPoint's behaviour (effect lists override rather than compose).\n */\nexport const getShapeEffectsEffective = (\n pres: PresentationData,\n shape: SlideShapeData,\n): readonly ShapeEffectAny[] => {\n const own = getShapeEffects(pres, shape);\n if (own.length > 0) return own;\n\n const phIdx = getShapePlaceholderIdx(shape);\n const phType = getShapePlaceholderType(shape);\n if (phIdx === null && phType === null) return own;\n\n const theme = getPresentationTheme(pres);\n const layout = getSlideLayout(shape[SHAPE_SLIDE]);\n if (!layout) return own;\n\n const findPh = (\n shapes: ReadonlyArray<{\n placeholderIdx: number | null;\n placeholderType: string | null;\n element: XmlElement;\n }>,\n ): XmlElement | null => {\n let match = phIdx !== null ? shapes.find((s) => s.placeholderIdx === phIdx) : undefined;\n if (!match && phType !== null) match = shapes.find((s) => s.placeholderType === phType);\n return match?.element ?? null;\n };\n\n const readEffectsOn = (el: XmlElement): readonly ShapeEffectAny[] => {\n const spPr = firstChildElement(el, qname('p', 'spPr', NS.pml));\n if (!spPr) return [];\n const eff = firstChildElement(spPr, qname('a', 'effectLst', NS.dml));\n if (!eff) return [];\n return parseEffectLst(eff, theme);\n };\n\n const layoutPh = findPh(layout[LAYOUT_PART].shapes);\n if (layoutPh) {\n const layoutEffects = readEffectsOn(layoutPh);\n if (layoutEffects.length > 0) return layoutEffects;\n }\n\n const pkg = pres[INTERNAL_PACKAGE];\n const layoutPartName = partName(layout[LAYOUT_PART_NAME]);\n const layoutRels = pkg.getRels(layoutPartName);\n if (!layoutRels) return own;\n const masterRel = layoutRels.items.find((r) => r.type === REL_TYPES.slideMaster);\n if (!masterRel) return own;\n const masterPart = pkg.getPart(resolveTarget(layoutPartName, masterRel.target));\n if (!masterPart) return own;\n const masterRoot = parseXml(decode(masterPart.data)).root;\n const { shapes: masterShapes } = readShapeTreeFromCsldRoot(masterRoot, 'sldMaster');\n const masterPh = findPh(masterShapes);\n if (masterPh) {\n const masterEffects = readEffectsOn(masterPh);\n if (masterEffects.length > 0) return masterEffects;\n }\n return own;\n};\n\n/**\n * Sets an outer drop shadow on the shape. Defaults: black, 4pt blur,\n * 3pt offset, 45° (down-right). Pass `opacity` (0–1) to soften the\n * shadow.\n */\nexport const setShapeShadow = (shape: SlideShapeData, options: ShadowOptions = {}): void => {\n setShadow(requireSpPr(shape), options);\n commitAndRefresh(shape);\n};\n\n/**\n * Sets a glow around the shape. The radius is in EMU (default 5pt =\n * 63500). Mutually exclusive with `setShapeShadow` in v1 — calling\n * either replaces the prior `<a:effectLst>` entirely.\n */\nexport const setShapeGlow = (shape: SlideShapeData, options: GlowOptions): void => {\n setGlow(requireSpPr(shape), options);\n commitAndRefresh(shape);\n};\n\n/** Removes any effects (shadow / glow / future presets) from the shape. */\nexport const clearShapeEffects = (shape: SlideShapeData): void => {\n clearEffectsImpl(requireSpPr(shape));\n commitAndRefresh(shape);\n};\n","// Shape mutation: text body, autofit, margins, wrap, anchor.\n\nimport {\n getShapePlaceholderIdx,\n getShapePlaceholderType,\n matchPlaceholderShape,\n} from './shape-read-base.ts';\nimport { getSlideLayout } from './shape-slide-read.ts';\nimport {\n type BulletStyle,\n type ParagraphAlignment,\n type TextFormat,\n applyAlignmentToAllParagraphs,\n applyBulletToAllParagraphs,\n applyFormatToAllRuns,\n setTextBody,\n} from '../../internal/drawingml/index.ts';\nimport {\n angle60000,\n emuCoordinate32,\n emuPositiveCoordinate32,\n textColumnCount,\n} from '../../internal/bounds.ts';\nimport { partName, resolveTarget } from '../../internal/opc/index.ts';\nimport { REL_TYPES, readShapeTreeFromCsldRoot } from '../../internal/presentationml/index.ts';\nimport {\n NS,\n type XmlElement,\n attr,\n elem,\n firstChildElement,\n getAttrValue,\n parseXml,\n qname,\n} from '../../internal/xml/index.ts';\nimport {\n INTERNAL_PACKAGE,\n LAYOUT_PART,\n LAYOUT_PART_NAME,\n type PresentationData,\n SHAPE_ELEMENT,\n SHAPE_SLIDE,\n SHAPE_SNAPSHOT,\n type SlideShapeData,\n} from '../_internal-symbols.ts';\nimport { commitAndRefresh, decode, requireTxBody } from './_helpers.ts';\nconst NAME_TX_BODY = qname('p', 'txBody', NS.pml);\n\n// ---------------------------------------------------------------------------\n// Shape mutation — text.\n\n/**\n * Replaces the shape's visible text with `value`. Newlines start a new\n * paragraph. Existing run/paragraph properties are preserved so font,\n * color, size, alignment, and bullet style stay intact.\n */\nexport const setShapeText = (\n shape: SlideShapeData,\n value: string,\n options: { bullets?: BulletStyle } = {},\n): void => {\n if (shape[SHAPE_SNAPSHOT].kind !== 'shape') {\n throw new Error(\n `setShapeText only works on text-bearing shapes; ${shape[SHAPE_SNAPSHOT].kind} is not one`,\n );\n }\n const txBody = firstChildElement(shape[SHAPE_ELEMENT], NAME_TX_BODY);\n if (txBody === null) {\n throw new Error(`shape \"${shape[SHAPE_SNAPSHOT].name}\" has no <p:txBody>`);\n }\n setTextBody(txBody, value);\n if (options.bullets !== undefined) {\n applyBulletToAllParagraphs(txBody, options.bullets);\n }\n commitAndRefresh(shape);\n};\n\n/**\n * Appends `value` to the shape's existing text on a new line. The\n * shape's existing run / paragraph formatting is preserved by\n * `setTextBody`; the new paragraph inherits the same template.\n *\n * Equivalent to `setShapeText(shape, getShapeText(shape) + '\\n' + value)`,\n * minus the leading newline when there was no existing text.\n */\nexport const appendShapeText = (shape: SlideShapeData, value: string): void => {\n if (shape[SHAPE_SNAPSHOT].kind !== 'shape') {\n throw new Error(\n `appendShapeText only works on text-bearing shapes; ${shape[SHAPE_SNAPSHOT].kind} is not one`,\n );\n }\n const txBody = firstChildElement(shape[SHAPE_ELEMENT], NAME_TX_BODY);\n if (txBody === null) {\n throw new Error(`shape \"${shape[SHAPE_SNAPSHOT].name}\" has no <p:txBody>`);\n }\n const existing = shape[SHAPE_SNAPSHOT].text;\n const combined = existing.length === 0 ? value : `${existing}\\n${value}`;\n setTextBody(txBody, combined);\n commitAndRefresh(shape);\n};\n\n/**\n * Sets the vertical text anchor on the shape's text body\n * (`<a:bodyPr anchor=\"...\"/>`). Choices map to ECMA-376 tokens:\n *\n * - `'top'` → `anchor=\"t\"`\n * - `'center'` → `anchor=\"ctr\"`\n * - `'bottom'` → `anchor=\"b\"`\n *\n * The bodyPr is created if absent. Throws for non-text-bearing shape\n * kinds.\n */\nexport type TextAnchor = 'top' | 'center' | 'bottom';\n\nconst NAME_A_BODY_PR = qname('a', 'bodyPr', NS.dml);\n\n/**\n * Word wrap mode on a text body. `'square'` (PowerPoint default for\n * textboxes) wraps lines at the shape's width; `'none'` lets text\n * overflow horizontally.\n */\nexport type TextWrap = 'none' | 'square';\n\n/** Auto-fit mode on a text body. */\nexport type TextAutoFit =\n | 'none' // <a:noAutofit/>\n | 'normal' // <a:normAutofit/> — shrink text to fit\n | 'shape'; // <a:spAutoFit/> — resize shape to fit text\n\nconst AUTO_FIT_LOCALS = new Set(['noAutofit', 'normAutofit', 'spAutoFit']);\n\nconst requireBodyPr = (shape: SlideShapeData): XmlElement => {\n const txBody = requireTxBody(shape);\n let bodyPr = firstChildElement(txBody, NAME_A_BODY_PR);\n if (bodyPr === null) {\n bodyPr = elem(NAME_A_BODY_PR);\n txBody.children.unshift(bodyPr);\n }\n return bodyPr;\n};\n\n/**\n * Sets the text-body word-wrap mode.\n *\n * - `'square'` writes `wrap=\"square\"` — PowerPoint default for textboxes.\n * - `'none'` writes `wrap=\"none\"` — text can overflow horizontally.\n *\n * Throws for non-text-bearing shape kinds.\n */\nexport const setShapeTextWrap = (shape: SlideShapeData, wrap: TextWrap): void => {\n const bodyPr = requireBodyPr(shape);\n const ATTR_WRAP = qname('', 'wrap', '');\n bodyPr.attrs = bodyPr.attrs.filter(\n (a) => !(a.name.namespaceURI === '' && a.name.localName === 'wrap'),\n );\n bodyPr.attrs.push(attr(ATTR_WRAP, wrap));\n commitAndRefresh(shape);\n};\n\n/** Reads back the bodyPr `wrap` attribute, or `null` when absent. */\nexport const getShapeTextWrap = (shape: SlideShapeData): TextWrap | null => {\n const txBody = firstChildElement(shape[SHAPE_ELEMENT], NAME_TX_BODY);\n if (!txBody) return null;\n const bodyPr = firstChildElement(txBody, NAME_A_BODY_PR);\n if (!bodyPr) return null;\n const v = getAttrValue(bodyPr, qname('', 'wrap', ''));\n if (v === 'none' || v === 'square') return v;\n return null;\n};\n\n/**\n * Sets the text-body auto-fit mode:\n *\n * - `'none'` → `<a:noAutofit/>`\n * - `'normal'` → `<a:normAutofit/>` shrink text to fit the shape\n * - `'shape'` → `<a:spAutoFit/>` grow the shape to fit text\n *\n * Replaces any prior auto-fit child on `<a:bodyPr>`. Throws for\n * non-text-bearing shape kinds.\n */\nexport const setShapeTextAutoFit = (shape: SlideShapeData, mode: TextAutoFit): void => {\n const bodyPr = requireBodyPr(shape);\n bodyPr.children = bodyPr.children.filter(\n (c) =>\n !(\n c.kind === 'element' &&\n c.name.namespaceURI === NS.dml &&\n AUTO_FIT_LOCALS.has(c.name.localName)\n ),\n );\n const local = mode === 'none' ? 'noAutofit' : mode === 'normal' ? 'normAutofit' : 'spAutoFit';\n bodyPr.children.push(elem(qname('a', local, NS.dml)));\n commitAndRefresh(shape);\n};\n\n/**\n * Reads back the bodyPr auto-fit child, or `null` when none is\n * present (PowerPoint applies a layout-inherited default in that case).\n */\nexport const getShapeTextAutoFit = (shape: SlideShapeData): TextAutoFit | null => {\n const txBody = firstChildElement(shape[SHAPE_ELEMENT], NAME_TX_BODY);\n if (!txBody) return null;\n const bodyPr = firstChildElement(txBody, NAME_A_BODY_PR);\n if (!bodyPr) return null;\n for (const c of bodyPr.children) {\n if (c.kind !== 'element' || c.name.namespaceURI !== NS.dml) continue;\n if (c.name.localName === 'noAutofit') return 'none';\n if (c.name.localName === 'normAutofit') return 'normal';\n if (c.name.localName === 'spAutoFit') return 'shape';\n }\n return null;\n};\n\n/**\n * Reads the scale parameters PowerPoint stores on `<a:normAutofit>`\n * once it has shrunk a text body to fit. Returns `null` if the body\n * doesn't carry `<a:normAutofit>` or the attributes are absent. Both\n * fields are unitless ratios in `[0, 1]`:\n *\n * - `fontScale` — multiply every run's font size by this. Default `1`.\n * - `lnSpcReduction` — subtract from the line-height ratio. Default `0`.\n *\n * Companion to `getShapeTextAutoFit`. Renderers that want to match\n * PowerPoint's actual on-screen text size apply these factors to the\n * authored font sizes; without them, every long title overflows.\n */\nexport const getShapeTextAutoFitParams = (\n shape: SlideShapeData,\n): { fontScale: number; lnSpcReduction: number } | null => {\n const txBody = firstChildElement(shape[SHAPE_ELEMENT], NAME_TX_BODY);\n if (!txBody) return null;\n const bodyPr = firstChildElement(txBody, NAME_A_BODY_PR);\n if (!bodyPr) return null;\n for (const c of bodyPr.children) {\n if (\n c.kind === 'element' &&\n c.name.namespaceURI === NS.dml &&\n c.name.localName === 'normAutofit'\n ) {\n const fsRaw = getAttrValue(c, qname('', 'fontScale', ''));\n const lsRaw = getAttrValue(c, qname('', 'lnSpcReduction', ''));\n const fs = fsRaw === null ? 100_000 : Number.parseInt(fsRaw, 10);\n const ls = lsRaw === null ? 0 : Number.parseInt(lsRaw, 10);\n return {\n fontScale: Number.isFinite(fs) ? fs / 100_000 : 1,\n lnSpcReduction: Number.isFinite(ls) ? ls / 100_000 : 0,\n };\n }\n }\n return null;\n};\n\n/**\n * Reads back the vertical text anchor on the shape's `<a:bodyPr>`.\n * Maps the ECMA-376 tokens back to the public union:\n *\n * `'t'` → `'top'`, `'ctr'` → `'center'`, `'b'` → `'bottom'`\n *\n * Returns `null` when the bodyPr is absent or has no anchor attribute.\n */\nexport const getShapeTextAnchor = (shape: SlideShapeData): TextAnchor | null => {\n const txBody = firstChildElement(shape[SHAPE_ELEMENT], NAME_TX_BODY);\n if (!txBody) return null;\n const bodyPr = firstChildElement(txBody, NAME_A_BODY_PR);\n if (!bodyPr) return null;\n const v = getAttrValue(bodyPr, qname('', 'anchor', ''));\n if (v === 't') return 'top';\n if (v === 'ctr') return 'center';\n if (v === 'b') return 'bottom';\n return null;\n};\n\n/**\n * Reads back the internal margins of the shape's text frame. Sides\n * that are absent in the XML default to `null` (PowerPoint applies\n * its built-in default for the missing side).\n */\n/**\n * Reads the multi-column layout on a text body — `<a:bodyPr\n * numCol=\"N\" spcCol=\"EMU\"/>`. Returns `null` when columns aren't\n * configured (the default single column). `gapEmu` is the\n * inter-column gap in EMU; omitted when `<a:bodyPr>` has no\n * `spcCol` attribute.\n */\nexport const getShapeTextColumns = (\n shape: SlideShapeData,\n): { count: number; gapEmu?: number } | null => {\n const txBody = firstChildElement(shape[SHAPE_ELEMENT], NAME_TX_BODY);\n if (!txBody) return null;\n const bodyPr = firstChildElement(txBody, NAME_A_BODY_PR);\n if (!bodyPr) return null;\n const numColRaw = getAttrValue(bodyPr, qname('', 'numCol', ''));\n if (numColRaw === null) return null;\n const count = Number.parseInt(numColRaw, 10);\n if (!Number.isFinite(count) || count < 2) return null;\n const gapRaw = getAttrValue(bodyPr, qname('', 'spcCol', ''));\n if (gapRaw !== null) {\n const g = Number.parseInt(gapRaw, 10);\n if (Number.isFinite(g)) return { count, gapEmu: g };\n }\n return { count };\n};\n\n/**\n * Sets the multi-column layout on the shape's text body — writes\n * `<a:bodyPr numCol=\"N\" [spcCol=\"EMU\"]/>`. Pass `null` to clear both\n * attributes so the text body falls back to PowerPoint's default\n * single column. `count` must be in `2..16` (ST_TextColumnCount caps at\n * 16, and single column is the `null` default). `gapEmu`, when omitted,\n * removes any prior `spcCol`. Throws for non-text-bearing shape kinds.\n */\nexport const setShapeTextColumns = (\n shape: SlideShapeData,\n columns: { count: number; gapEmu?: number } | null,\n): void => {\n const bodyPr = requireBodyPr(shape);\n bodyPr.attrs = bodyPr.attrs.filter(\n (a) =>\n !(\n a.name.namespaceURI === '' &&\n (a.name.localName === 'numCol' || a.name.localName === 'spcCol')\n ),\n );\n if (columns !== null) {\n if (columns.count < 2) {\n throw new Error(\n `setShapeTextColumns: count must be >= 2 (single column is the default — pass null instead). Got ${columns.count}.`,\n );\n }\n // ST_TextColumnCount caps at 16; spcCol is ST_PositiveCoordinate32.\n const numCol = textColumnCount(columns.count, 'setShapeTextColumns: count');\n bodyPr.attrs.push(attr(qname('', 'numCol', ''), String(numCol)));\n if (columns.gapEmu !== undefined) {\n const spcCol = emuPositiveCoordinate32(columns.gapEmu, 'setShapeTextColumns: gapEmu');\n bodyPr.attrs.push(attr(qname('', 'spcCol', ''), String(spcCol)));\n }\n }\n commitAndRefresh(shape);\n};\n\n/**\n * Reads the shape's text-body rotation from `<a:bodyPr rot=\"N\"/>`.\n * `rot` is stored in 60000ths of a degree (OOXML angle units); the\n * returned value is in degrees. Positive values rotate clockwise per\n * PowerPoint's convention. Returns `null` when the attribute is\n * absent.\n *\n * Distinct from the shape's own `<p:xfrm rot=…>` (the geometry\n * rotation surfaced via the shape's `rotation`); `bodyPr rot` rotates\n * the text body inside the shape without rotating the shape itself.\n */\nexport const getShapeTextBodyRotationDeg = (shape: SlideShapeData): number | null => {\n const txBody = firstChildElement(shape[SHAPE_ELEMENT], NAME_TX_BODY);\n if (!txBody) return null;\n const bodyPr = firstChildElement(txBody, NAME_A_BODY_PR);\n if (!bodyPr) return null;\n const v = getAttrValue(bodyPr, qname('', 'rot', ''));\n if (v === null) return null;\n const n = Number.parseInt(v, 10);\n return Number.isFinite(n) ? n / 60000 : null;\n};\n\n/**\n * Sets the shape's text-body rotation (`<a:bodyPr rot=\"N\"/>`), measured\n * in degrees. Positive rotates clockwise per PowerPoint's convention.\n * Passing `null` clears the attribute so the shape inherits the default\n * (`0`). Throws for non-text-bearing shape kinds.\n *\n * Companion to `setShapeRotation`, which rotates the *whole* shape\n * via `<p:xfrm rot>`. `bodyPr rot` rotates only the text inside.\n */\nexport const setShapeTextBodyRotationDeg = (\n shape: SlideShapeData,\n rotationDeg: number | null,\n): void => {\n const bodyPr = requireBodyPr(shape);\n // Strip any prior rot attribute.\n bodyPr.attrs = bodyPr.attrs.filter(\n (a) => !(a.name.namespaceURI === '' && a.name.localName === 'rot'),\n );\n if (rotationDeg !== null && rotationDeg !== 0) {\n // `rot` is ST_Angle in 1/60000 degree (xsd:int); guard the *60000 overflow.\n const rot = angle60000(rotationDeg * 60000, 'setShapeTextBodyRotationDeg: rotationDeg');\n bodyPr.attrs.push(attr(qname('', 'rot', ''), String(rot)));\n }\n commitAndRefresh(shape);\n};\n\n/**\n * Reads the shape's text-direction token from `<a:bodyPr vert=\"…\"/>`.\n * Per ECMA-376 §17.18.93 `ST_TextVerticalType`:\n *\n * - `horz` — default left-to-right, top-to-bottom (returns `null`).\n * - `vert` — 90° rotation, lines run top-to-bottom, columns right-to-left.\n * - `vert270` — 270° rotation, lines top-to-bottom, columns left-to-right.\n * - `wordArtVert` — characters not rotated, stacked vertically.\n * - `eaVert` — East-Asian vertical: characters upright, columns right-to-left.\n * - `mongolianVert` — Mongolian: rotated 90°, columns left-to-right.\n * - `wordArtVertRtl` — RTL word-art stacked vertically.\n *\n * Returns `null` when the attribute is absent or set to the default\n * `horz`.\n */\nexport const getShapeTextDirection = (\n shape: SlideShapeData,\n): 'vert' | 'vert270' | 'wordArtVert' | 'eaVert' | 'mongolianVert' | 'wordArtVertRtl' | null => {\n const txBody = firstChildElement(shape[SHAPE_ELEMENT], NAME_TX_BODY);\n if (!txBody) return null;\n const bodyPr = firstChildElement(txBody, NAME_A_BODY_PR);\n if (!bodyPr) return null;\n const v = getAttrValue(bodyPr, qname('', 'vert', ''));\n if (\n v === 'vert' ||\n v === 'vert270' ||\n v === 'wordArtVert' ||\n v === 'eaVert' ||\n v === 'mongolianVert' ||\n v === 'wordArtVertRtl'\n )\n return v;\n return null;\n};\n\n/**\n * Sets the shape's text-direction via `<a:bodyPr vert=\"…\"/>`. See\n * `getShapeTextDirection` for the meaning of each value. Passing `null`\n * (or `'horz'`) clears the attribute so the shape uses the default\n * horizontal direction. Throws for non-text-bearing shape kinds.\n */\nexport const setShapeTextDirection = (\n shape: SlideShapeData,\n direction:\n | 'horz'\n | 'vert'\n | 'vert270'\n | 'wordArtVert'\n | 'eaVert'\n | 'mongolianVert'\n | 'wordArtVertRtl'\n | null,\n): void => {\n const bodyPr = requireBodyPr(shape);\n bodyPr.attrs = bodyPr.attrs.filter(\n (a) => !(a.name.namespaceURI === '' && a.name.localName === 'vert'),\n );\n if (direction !== null && direction !== 'horz') {\n bodyPr.attrs.push(attr(qname('', 'vert', ''), direction));\n }\n commitAndRefresh(shape);\n};\n\nexport const getShapeTextMargins = (\n shape: SlideShapeData,\n): {\n readonly left: number | null;\n readonly top: number | null;\n readonly right: number | null;\n readonly bottom: number | null;\n} | null => {\n const txBody = firstChildElement(shape[SHAPE_ELEMENT], NAME_TX_BODY);\n if (!txBody) return null;\n const bodyPr = firstChildElement(txBody, NAME_A_BODY_PR);\n if (!bodyPr) return null;\n const readSide = (local: string): number | null => {\n const v = getAttrValue(bodyPr, qname('', local, ''));\n if (v === null) return null;\n const n = Number.parseInt(v, 10);\n return Number.isFinite(n) ? n : null;\n };\n return {\n left: readSide('lIns'),\n top: readSide('tIns'),\n right: readSide('rIns'),\n bottom: readSide('bIns'),\n };\n};\n\n/**\n * Resolves the effective `<a:bodyPr>` properties — anchor, wrap, vertical\n * direction, and inset margins — by walking the layout / master cascade\n * the same way `getShapeRunFormatEffective` walks rPr. Returns the\n * innermost value that the cascade supplies, or `null` for properties\n * neither the shape nor any inherited placeholder authors.\n *\n * Companion to `getShapeTextAnchor` / `getShapeTextWrap` /\n * `getShapeTextDirection` / `getShapeTextMargins`, which only report the\n * literal value on the shape itself.\n */\nexport const getShapeBodyPrEffective = (\n pres: PresentationData,\n shape: SlideShapeData,\n): {\n anchor: TextAnchor | null;\n wrap: TextWrap | null;\n vert: ReturnType<typeof getShapeTextDirection>;\n margins: { left: number | null; top: number | null; right: number | null; bottom: number | null };\n} => {\n const result = {\n anchor: null as TextAnchor | null,\n wrap: null as TextWrap | null,\n vert: null as ReturnType<typeof getShapeTextDirection>,\n margins: {\n left: null as number | null,\n top: null as number | null,\n right: null as number | null,\n bottom: null as number | null,\n },\n };\n const parseBodyPr = (bodyPr: XmlElement): void => {\n if (result.anchor === null) {\n const a = getAttrValue(bodyPr, qname('', 'anchor', ''));\n if (a === 't') result.anchor = 'top';\n else if (a === 'ctr') result.anchor = 'center';\n else if (a === 'b') result.anchor = 'bottom';\n }\n if (result.wrap === null) {\n const w = getAttrValue(bodyPr, qname('', 'wrap', ''));\n if (w === 'square') result.wrap = 'square';\n else if (w === 'none') result.wrap = 'none';\n }\n if (result.vert === null) {\n const v = getAttrValue(bodyPr, qname('', 'vert', ''));\n if (\n v === 'vert' ||\n v === 'vert270' ||\n v === 'wordArtVert' ||\n v === 'eaVert' ||\n v === 'mongolianVert' ||\n v === 'wordArtVertRtl'\n )\n result.vert = v;\n }\n for (const side of ['l', 't', 'r', 'b'] as const) {\n const target =\n side === 'l' ? 'left' : side === 't' ? 'top' : side === 'r' ? 'right' : 'bottom';\n if (result.margins[target] !== null) continue;\n const v = getAttrValue(bodyPr, qname('', `${side}Ins`, ''));\n if (v === null) continue;\n const n = Number.parseInt(v, 10);\n if (Number.isFinite(n)) result.margins[target] = n;\n }\n };\n\n // 1. The shape's own bodyPr.\n const txBody = firstChildElement(shape[SHAPE_ELEMENT], NAME_TX_BODY);\n if (txBody) {\n const bodyPr = firstChildElement(txBody, NAME_A_BODY_PR);\n if (bodyPr) parseBodyPr(bodyPr);\n }\n\n // 2-3. Walk layout placeholder and master placeholder bodyPr.\n const phIdx = getShapePlaceholderIdx(shape);\n const phType = getShapePlaceholderType(shape);\n const slide = shape[SHAPE_SLIDE];\n const layout = getSlideLayout(slide);\n if (!layout) return result;\n\n const findPh = (\n shapes: ReadonlyArray<{\n placeholderIdx: number | null;\n placeholderType: string | null;\n element: XmlElement;\n }>,\n ): XmlElement | null => matchPlaceholderShape(shapes, phIdx, phType)?.element ?? null;\n\n const layoutPhEl = findPh(layout[LAYOUT_PART].shapes);\n if (layoutPhEl) {\n const layoutTxBody = firstChildElement(layoutPhEl, NAME_TX_BODY);\n if (layoutTxBody) {\n const bodyPr = firstChildElement(layoutTxBody, NAME_A_BODY_PR);\n if (bodyPr) parseBodyPr(bodyPr);\n }\n }\n\n const pkg = pres[INTERNAL_PACKAGE];\n const layoutPartName = partName(layout[LAYOUT_PART_NAME]);\n const layoutRels = pkg.getRels(layoutPartName);\n if (!layoutRels) return result;\n const masterRel = layoutRels.items.find((r) => r.type === REL_TYPES.slideMaster);\n if (!masterRel) return result;\n const masterPart = pkg.getPart(resolveTarget(layoutPartName, masterRel.target));\n if (!masterPart) return result;\n const masterRoot = parseXml(decode(masterPart.data)).root;\n const { shapes: masterShapes } = readShapeTreeFromCsldRoot(masterRoot, 'sldMaster');\n const masterPhEl = findPh(masterShapes);\n if (masterPhEl) {\n const masterTxBody = firstChildElement(masterPhEl, NAME_TX_BODY);\n if (masterTxBody) {\n const bodyPr = firstChildElement(masterTxBody, NAME_A_BODY_PR);\n if (bodyPr) parseBodyPr(bodyPr);\n }\n }\n return result;\n};\n\nexport const setShapeTextAnchor = (shape: SlideShapeData, anchor: TextAnchor): void => {\n const txBody = requireTxBody(shape);\n let bodyPr = firstChildElement(txBody, NAME_A_BODY_PR);\n if (bodyPr === null) {\n bodyPr = elem(NAME_A_BODY_PR);\n txBody.children.unshift(bodyPr);\n }\n const token = anchor === 'top' ? 't' : anchor === 'center' ? 'ctr' : 'b';\n const ATTR_ANCHOR = qname('', 'anchor', '');\n // Replace any existing anchor attribute.\n bodyPr.attrs = bodyPr.attrs.filter(\n (a) => !(a.name.namespaceURI === '' && a.name.localName === 'anchor'),\n );\n bodyPr.attrs.push(attr(ATTR_ANCHOR, token));\n commitAndRefresh(shape);\n};\n\n/**\n * Sets the internal margins of the shape's text frame in EMU. Each\n * side is independent; omitted sides keep their current value (or the\n * layout-inherited default when the attribute is absent).\n *\n * PowerPoint's defaults for a textbox: left/right 91440 (0.1in),\n * top/bottom 45720 (0.05in).\n *\n * setShapeTextMargins(shape, { left: 0, right: 0 }); // flush-left text\n */\nexport const setShapeTextMargins = (\n shape: SlideShapeData,\n margins: { left?: number; top?: number; right?: number; bottom?: number },\n): void => {\n const txBody = requireTxBody(shape);\n let bodyPr = firstChildElement(txBody, NAME_A_BODY_PR);\n if (bodyPr === null) {\n bodyPr = elem(NAME_A_BODY_PR);\n txBody.children.unshift(bodyPr);\n }\n const writes: Array<{ name: string; value: number }> = [];\n if (margins.left !== undefined) writes.push({ name: 'lIns', value: margins.left });\n if (margins.top !== undefined) writes.push({ name: 'tIns', value: margins.top });\n if (margins.right !== undefined) writes.push({ name: 'rIns', value: margins.right });\n if (margins.bottom !== undefined) writes.push({ name: 'bIns', value: margins.bottom });\n\n const localsToClear = new Set(writes.map((w) => w.name));\n bodyPr.attrs = bodyPr.attrs.filter(\n (a) => !(a.name.namespaceURI === '' && localsToClear.has(a.name.localName)),\n );\n for (const w of writes) {\n // Insets are ST_Coordinate32 (xsd:int EMU).\n const emu = emuCoordinate32(w.value, `setShapeTextMargins: ${w.name}`);\n bodyPr.attrs.push(attr(qname('', w.name, ''), String(emu)));\n }\n commitAndRefresh(shape);\n};\n\n/** Sets the bullet style on every paragraph in the shape's text body. */\nexport const setShapeBullets = (shape: SlideShapeData, style: BulletStyle): void => {\n applyBulletToAllParagraphs(requireTxBody(shape), style);\n commitAndRefresh(shape);\n};\n\n/** Sets the horizontal alignment of every paragraph in the shape's text. */\nexport const setShapeAlignment = (shape: SlideShapeData, align: ParagraphAlignment): void => {\n applyAlignmentToAllParagraphs(requireTxBody(shape), align);\n commitAndRefresh(shape);\n};\n\n/**\n * Applies `format` to every run in the shape's text. Run-property\n * attributes not addressed by `format` are preserved, so partial\n * updates compose.\n */\nexport const setShapeTextFormat = (shape: SlideShapeData, format: TextFormat): void => {\n applyFormatToAllRuns(requireTxBody(shape), format);\n commitAndRefresh(shape);\n};\n","// Shape removal and z-order.\n\nimport { emptyRels, nextRelId } from '../../internal/opc/index.ts';\nimport { NS, type XmlElement, firstChildElement, qname } from '../../internal/xml/index.ts';\nimport {\n INTERNAL_PACKAGE,\n SHAPE_ELEMENT,\n SHAPE_SLIDE,\n SLIDE_DOCUMENT,\n SLIDE_PART_NAME,\n type SlideData,\n type SlideShapeData,\n} from '../_internal-symbols.ts';\nimport {\n appendAndReturnNewShape,\n commitSlideData,\n nextShapeId,\n rebuildShapesFromDocument,\n requireSpTree,\n} from './_helpers.ts';\n// ---------------------------------------------------------------------------\n// Shape mutation — removal.\n\n/**\n * Copies a shape into `targetSlide`. The source XML is cloned and\n * appended to the target's `<p:spTree>`. Image rels on the source\n * shape are followed: the linked media part is referenced from the\n * target slide via a freshly allocated rId (no media bytes are\n * copied — both slides share the underlying part).\n *\n * v1 requires source and target to live in the same package\n * (`sourceShape`'s slide and `targetSlide` must share the same\n * `OpcPackage`). Cross-package copy is `importSlide` territory.\n *\n * Returns the new `SlideShapeData` on `targetSlide`.\n */\nexport const copyShape = (targetSlide: SlideData, sourceShape: SlideShapeData): SlideShapeData => {\n const sourceSlide = sourceShape[SHAPE_SLIDE];\n if (sourceSlide[INTERNAL_PACKAGE] !== targetSlide[INTERNAL_PACKAGE]) {\n throw new Error(\n 'copyShape: source and target must be in the same package. Use importSlide for cross-deck copies.',\n );\n }\n const pkg = targetSlide[INTERNAL_PACKAGE];\n const sourceEl = sourceShape[SHAPE_ELEMENT];\n\n // Deep-clone the XML by serializing + re-parsing one element.\n // We wrap in a temporary parent so we can extract the cloned element\n // back out without ambient namespaces leaking from the slide root.\n const cloned = cloneXmlElement(sourceEl);\n\n // Allocate a fresh shape id on the target slide and overwrite the\n // cNvPr/cNvPr id attribute.\n const newId = nextShapeId(targetSlide);\n rewriteCNvPrId(cloned, newId);\n\n // Walk the cloned element for r:embed / r:link references. For each\n // referenced rId in the source slide's rels, copy the rel onto the\n // target slide's rels (allocating a fresh rId) and update the cloned\n // attribute. This covers picture blips + media references.\n const sourceRels = pkg.getRels(sourceSlide[SLIDE_PART_NAME]);\n if (sourceRels) {\n const targetRels = pkg.getRels(targetSlide[SLIDE_PART_NAME]) ?? emptyRels();\n const usedIds = new Set(targetRels.items.map((r) => r.id));\n rewriteRIdReferences(cloned, (oldRId) => {\n const sourceRel = sourceRels.items.find((r) => r.id === oldRId);\n if (!sourceRel) return oldRId;\n // Look for an existing rel on target with the same type+target;\n // reuse if found to avoid duplicates.\n const existing = targetRels.items.find(\n (r) =>\n r.type === sourceRel.type &&\n r.target === sourceRel.target &&\n r.targetMode === sourceRel.targetMode,\n );\n if (existing) return existing.id;\n const newRId = nextRelId([...usedIds]);\n usedIds.add(newRId);\n targetRels.items.push({ ...sourceRel, id: newRId });\n return newRId;\n });\n pkg.setRels(targetSlide[SLIDE_PART_NAME], targetRels);\n }\n\n return appendAndReturnNewShape(targetSlide, cloned);\n};\n\n/** Recursively clone an XML element (no parent, deep). */\nconst cloneXmlElement = (el: XmlElement): XmlElement => ({\n kind: 'element',\n name: el.name,\n attrs: el.attrs.map((a) => ({ name: a.name, value: a.value })),\n prefixDecls: new Map(el.prefixDecls),\n children: el.children.map((c) => {\n if (c.kind === 'element') return cloneXmlElement(c);\n return { ...c };\n }),\n});\n\nconst rewriteCNvPrId = (root: XmlElement, newId: number): void => {\n const walk = (el: XmlElement): boolean => {\n if (\n el.name.namespaceURI === NS.pml &&\n el.name.localName === 'cNvPr' &&\n el.attrs.some((a) => a.name.namespaceURI === '' && a.name.localName === 'id')\n ) {\n el.attrs = el.attrs.map((a) =>\n a.name.namespaceURI === '' && a.name.localName === 'id'\n ? { name: a.name, value: String(newId) }\n : a,\n );\n return true;\n }\n for (const c of el.children) {\n if (c.kind === 'element' && walk(c)) return true;\n }\n return false;\n };\n walk(root);\n};\n\nconst rewriteRIdReferences = (root: XmlElement, map: (oldRId: string) => string): void => {\n const walk = (el: XmlElement): void => {\n el.attrs = el.attrs.map((a) => {\n if (\n a.name.namespaceURI === NS.officeDocRels &&\n (a.name.localName === 'id' || a.name.localName === 'embed' || a.name.localName === 'link')\n ) {\n return { name: a.name, value: map(a.value) };\n }\n return a;\n });\n for (const c of el.children) {\n if (c.kind === 'element') walk(c);\n }\n };\n walk(root);\n};\n\n// ---------------------------------------------------------------------------\n// Z-order — move shapes forward / backward inside the slide's spTree.\n//\n// OOXML shape z-order is just the document order of children of\n// `<p:spTree>`: the first child renders behind, the last in front.\n// PowerPoint's \"Bring to Front\" / \"Send to Back\" affordances translate\n// directly to reordering those children.\n//\n// Each function targets only \"real\" shape children — `<p:sp>`, `<p:pic>`,\n// `<p:cxnSp>`, `<p:graphicFrame>`, `<p:grpSp>`. The required\n// `<p:nvGrpSpPr>` / `<p:grpSpPr>` preface stays at the top.\n\nconst SHAPE_CHILD_LOCALS = new Set(['sp', 'pic', 'cxnSp', 'graphicFrame', 'grpSp']);\n\nconst isShapeChild = (node: {\n kind: string;\n name?: { namespaceURI: string; localName: string };\n}): boolean =>\n node.kind === 'element' &&\n node.name?.namespaceURI === NS.pml &&\n SHAPE_CHILD_LOCALS.has(node.name.localName);\n\n/** Move `shape` to the end of its spTree (render in front of all others). */\nexport const bringShapeToFront = (shape: SlideShapeData): void => {\n const slide = shape[SHAPE_SLIDE];\n const spTree = requireSpTree(slide);\n const target = shape[SHAPE_ELEMENT];\n const idx = spTree.children.indexOf(target);\n if (idx < 0) return;\n if (idx === spTree.children.length - 1) return; // already at front\n spTree.children.splice(idx, 1);\n spTree.children.push(target);\n commitSlideData(slide);\n rebuildShapesFromDocument(slide);\n};\n\n/**\n * Move `shape` behind every other shape on the slide. The\n * `<p:nvGrpSpPr>` / `<p:grpSpPr>` preface — required by the schema —\n * stays at the top.\n */\nexport const sendShapeToBack = (shape: SlideShapeData): void => {\n const slide = shape[SHAPE_SLIDE];\n const spTree = requireSpTree(slide);\n const target = shape[SHAPE_ELEMENT];\n const idx = spTree.children.indexOf(target);\n if (idx < 0) return;\n\n // First \"shape child\" position — after nvGrpSpPr / grpSpPr.\n let firstShapeAt = spTree.children.length;\n for (let i = 0; i < spTree.children.length; i++) {\n const c = spTree.children[i];\n if (c && isShapeChild(c)) {\n firstShapeAt = i;\n break;\n }\n }\n if (idx <= firstShapeAt) return;\n spTree.children.splice(idx, 1);\n spTree.children.splice(firstShapeAt, 0, target);\n commitSlideData(slide);\n rebuildShapesFromDocument(slide);\n};\n\n/** Swap `shape` with the next shape sibling (move one step forward). */\nexport const bringShapeForward = (shape: SlideShapeData): void => {\n const slide = shape[SHAPE_SLIDE];\n const spTree = requireSpTree(slide);\n const target = shape[SHAPE_ELEMENT];\n const idx = spTree.children.indexOf(target);\n if (idx < 0) return;\n // Find next shape sibling.\n for (let i = idx + 1; i < spTree.children.length; i++) {\n const c = spTree.children[i];\n if (c && isShapeChild(c)) {\n const next = c;\n spTree.children[idx] = next;\n spTree.children[i] = target;\n commitSlideData(slide);\n rebuildShapesFromDocument(slide);\n return;\n }\n }\n};\n\n/**\n * Returns the shape's z-index among the slide's \"real\" shape children\n * (`<p:sp>` / `<p:pic>` / `<p:cxnSp>` / `<p:graphicFrame>` / `<p:grpSp>`),\n * skipping the required `<p:nvGrpSpPr>` / `<p:grpSpPr>` preface.\n * Higher numbers render in front.\n */\nexport const getShapeZIndex = (shape: SlideShapeData): number => {\n const slide = shape[SHAPE_SLIDE];\n const spTree = requireSpTree(slide);\n let i = 0;\n for (const c of spTree.children) {\n if (!isShapeChild(c)) continue;\n if (c === shape[SHAPE_ELEMENT]) return i;\n i++;\n }\n return -1;\n};\n\n/**\n * Moves the shape to a specific z-index among the slide's \"real\"\n * shape children. Index is clamped to the available range. Higher\n * numbers render in front. The required preface elements stay at the\n * top of `<p:spTree>`.\n */\nexport const setShapeZIndex = (shape: SlideShapeData, toIndex: number): void => {\n const slide = shape[SHAPE_SLIDE];\n const spTree = requireSpTree(slide);\n const target = shape[SHAPE_ELEMENT];\n const allShapeChildren = spTree.children.filter((c): c is XmlElement => isShapeChild(c));\n const clamped = Math.max(0, Math.min(toIndex, allShapeChildren.length - 1));\n\n // Remove the target from the tree, then re-insert at the position\n // corresponding to z-index `clamped` among the remaining shapes.\n spTree.children = spTree.children.filter((c) => c !== target);\n const remainingShapes = spTree.children.filter((c): c is XmlElement => isShapeChild(c));\n if (clamped >= remainingShapes.length) {\n spTree.children.push(target);\n } else {\n const anchor = remainingShapes[clamped]!;\n const anchorIdx = spTree.children.indexOf(anchor);\n spTree.children.splice(anchorIdx, 0, target);\n }\n commitSlideData(slide);\n rebuildShapesFromDocument(slide);\n};\n\n/** Swap `shape` with the previous shape sibling (move one step backward). */\nexport const sendShapeBackward = (shape: SlideShapeData): void => {\n const slide = shape[SHAPE_SLIDE];\n const spTree = requireSpTree(slide);\n const target = shape[SHAPE_ELEMENT];\n const idx = spTree.children.indexOf(target);\n if (idx < 0) return;\n for (let i = idx - 1; i >= 0; i--) {\n const c = spTree.children[i];\n if (c && isShapeChild(c)) {\n const prev = c;\n spTree.children[idx] = prev;\n spTree.children[i] = target;\n commitSlideData(slide);\n rebuildShapesFromDocument(slide);\n return;\n }\n }\n};\n\n/**\n * Removes the shape from its slide's shape tree. Subsequent property\n * reads on this handle reflect the stale snapshot — discard it after.\n *\n * Removing a picture does NOT delete the underlying media part — it\n * may be referenced from other slides.\n */\n/**\n * Removes every shape (sp / pic / cxnSp / graphicFrame / grpSp) from\n * the slide's `<p:spTree>`. The required `<p:nvGrpSpPr>` and\n * `<p:grpSpPr>` preface stays in place, so the slide is still valid\n * and re-applies its layout's placeholders on the next open.\n *\n * Useful for \"start this slide over but keep its layout binding.\"\n */\nexport const clearSlideShapes = (slide: SlideData): void => {\n const spTree = requireSpTree(slide);\n spTree.children = spTree.children.filter(\n (c) =>\n !(\n c.kind === 'element' &&\n c.name.namespaceURI === NS.pml &&\n SHAPE_CHILD_LOCALS.has(c.name.localName)\n ),\n );\n commitSlideData(slide);\n rebuildShapesFromDocument(slide);\n};\n\nexport const removeShape = (shape: SlideShapeData): void => {\n const slide = shape[SHAPE_SLIDE];\n const doc = slide[SLIDE_DOCUMENT];\n const cSld = firstChildElement(doc.root, qname('p', 'cSld', NS.pml));\n if (!cSld) return;\n const spTree = firstChildElement(cSld, qname('p', 'spTree', NS.pml));\n if (!spTree) return;\n const idx = spTree.children.indexOf(shape[SHAPE_ELEMENT]);\n if (idx < 0) return;\n spTree.children.splice(idx, 1);\n commitSlideData(slide);\n rebuildShapesFromDocument(slide);\n};\n","// Slide-level shape authoring.\n\nimport type { Emu } from '../units.ts';\nimport {\n contentTypeForFormat,\n detectImageFormat,\n emptyRels,\n extensionForFormat,\n type ImageFormat,\n nextRelId,\n partName,\n readImagePixelSize,\n} from '../../internal/opc/index.ts';\nimport { type ImageFit, fitImageRect } from './shape-image.ts';\nimport {\n REL_TYPES,\n type PresetShape,\n buildConnector,\n buildPicture,\n buildShape,\n buildTable,\n buildTextBox,\n} from '../../internal/presentationml/index.ts';\nimport {\n INTERNAL_PACKAGE,\n SLIDE_PART_NAME,\n type SlideData,\n type SlideShapeData,\n} from '../_internal-symbols.ts';\nimport { appendAndReturnNewShape, nextShapeId } from './_helpers.ts';\nimport { resolveDeckBodyTextColor } from './color-map.ts';\n// ---------------------------------------------------------------------------\n// Slide-level shape authoring.\n//\n// Each `addXxx` builds an XML element via an internal builder, appends\n// it to the slide's `<p:spTree>`, commits, rebuilds the typed view, and\n// returns the new SlideShapeData.\n\n/**\n * Adds a free-form text box to the slide. Returns the new shape.\n *\n * The box is a plain rectangle with no fill or outline carrying one\n * paragraph with one run. The shape id is allocated as one more than\n * the current max id.\n */\nexport const addSlideTextBox = (\n slide: SlideData,\n opts: { x: Emu; y: Emu; w: Emu; h: Emu; text: string; name?: string },\n): SlideShapeData => {\n const sp = buildTextBox({\n id: nextShapeId(slide),\n ...(opts.name !== undefined ? { name: opts.name } : {}),\n x: opts.x,\n y: opts.y,\n w: opts.w,\n h: opts.h,\n text: opts.text,\n });\n return appendAndReturnNewShape(slide, sp);\n};\n\n/**\n * Adds a preset shape (rectangle, ellipse, arrow, ...) to the slide.\n * Optional `text` seeds a single run.\n */\nexport const addSlideShape = (\n slide: SlideData,\n opts: {\n preset: PresetShape | string;\n x: Emu;\n y: Emu;\n w: Emu;\n h: Emu;\n text?: string;\n /** Vertical text anchor (`t` / `ctr` / `b`). Horizontal alignment is set\n * separately via `setShapeAlignment` / `setParagraphAlignment`. */\n textAnchor?: 'ctr' | 't' | 'b';\n name?: string;\n },\n): SlideShapeData => {\n const sp = buildShape({\n id: nextShapeId(slide),\n ...(opts.name !== undefined ? { name: opts.name } : {}),\n preset: opts.preset,\n x: opts.x,\n y: opts.y,\n w: opts.w,\n h: opts.h,\n ...(opts.text !== undefined ? { text: opts.text } : {}),\n ...(opts.textAnchor !== undefined ? { textAnchor: opts.textAnchor } : {}),\n });\n return appendAndReturnNewShape(slide, sp);\n};\n\n/** Adds a straight-line connector between two points. */\nexport const addSlideLine = (\n slide: SlideData,\n opts: {\n from: { x: Emu; y: Emu };\n to: { x: Emu; y: Emu };\n color?: string;\n widthEmu?: number;\n name?: string;\n },\n): SlideShapeData => {\n const cxn = buildConnector({\n id: nextShapeId(slide),\n ...(opts.name !== undefined ? { name: opts.name } : {}),\n from: opts.from,\n to: opts.to,\n ...(opts.color !== undefined ? { color: opts.color } : {}),\n ...(opts.widthEmu !== undefined ? { widthEmu: opts.widthEmu } : {}),\n });\n return appendAndReturnNewShape(slide, cxn);\n};\n\n/**\n * Adds a table to the slide. Cells render as plain text; `firstRow` /\n * `bandRow` flags drive PowerPoint's banded-header look unless options say\n * otherwise.\n *\n * Cell text color is baked from the deck's resolved body-text color so the\n * table stays readable even on templates with an inverted color map\n * (`bg1=\"dk1\" tx1=\"lt1\"`), where the default `tx1` text token would otherwise\n * paint the text the same as the background. Override per cell afterwards with\n * `setTableCellTextFormat`.\n */\nexport const addSlideTable = (\n slide: SlideData,\n opts: {\n x: Emu;\n y: Emu;\n w: Emu;\n h: Emu;\n rows: ReadonlyArray<ReadonlyArray<string>>;\n colWidths?: ReadonlyArray<Emu>;\n rowHeights?: ReadonlyArray<Emu>;\n firstRow?: boolean;\n bandRow?: boolean;\n name?: string;\n },\n): SlideShapeData => {\n const textColorHex = resolveDeckBodyTextColor(slide);\n const frame = buildTable({\n id: nextShapeId(slide),\n ...(opts.name !== undefined ? { name: opts.name } : {}),\n x: opts.x,\n y: opts.y,\n w: opts.w,\n h: opts.h,\n rows: opts.rows,\n ...(opts.colWidths !== undefined ? { colWidths: opts.colWidths } : {}),\n ...(opts.rowHeights !== undefined ? { rowHeights: opts.rowHeights } : {}),\n ...(opts.firstRow !== undefined ? { firstRow: opts.firstRow } : {}),\n ...(opts.bandRow !== undefined ? { bandRow: opts.bandRow } : {}),\n ...(textColorHex !== null ? { textColorHex } : {}),\n });\n return appendAndReturnNewShape(slide, frame);\n};\n\n/**\n * Adds a picture to the slide from raw bytes. Returns the new shape.\n *\n * Allocates a `/ppt/media/imageN.<ext>` part, registers a Content_Types\n * Default if the extension isn't yet covered, allocates a slide→image\n * rel, and appends a `<p:pic>` element to the slide's `<p:spTree>`.\n *\n * Format is detected from magic bytes; pass `opts.format` to override.\n *\n * `opts.fit` controls how the image fills the `w × h` box. `'fill'` (the\n * default) stretches to the exact box, ignoring aspect ratio. `'contain'`\n * scales the image to fit inside the box preserving its aspect ratio and\n * centers it — measured from the PNG / JPEG header. For other formats (or\n * an unreadable header) `'contain'` falls back to `'fill'` rather than\n * erroring, since the natural size is unknown.\n */\nexport const addSlideImage = (\n slide: SlideData,\n bytes: Uint8Array,\n opts: { x: Emu; y: Emu; w: Emu; h: Emu; format?: ImageFormat; name?: string; fit?: ImageFit },\n): SlideShapeData => {\n const pkg = slide[INTERNAL_PACKAGE];\n const format = opts.format ?? detectImageFormat(bytes);\n if (format === null) {\n throw new Error(\n 'addSlideImage: could not detect image format. Pass options.format explicitly.',\n );\n }\n const contentType = contentTypeForFormat(format);\n const extension = extensionForFormat(format);\n\n let nextN = 1;\n const mediaPattern = /^\\/ppt\\/media\\/image(\\d+)\\./;\n for (const p of pkg.parts) {\n const m = p.name.match(mediaPattern);\n if (m?.[1] !== undefined) {\n const n = Number.parseInt(m[1], 10);\n if (Number.isFinite(n) && n >= nextN) nextN = n + 1;\n }\n }\n const newMediaName = partName(`/ppt/media/image${nextN}.${extension}`);\n\n const hasDefault = pkg.contentTypes.defaults.some((d) => d.extension.toLowerCase() === extension);\n if (!hasDefault) {\n pkg.contentTypes.defaults.push({ extension, contentType });\n }\n pkg.addPart(newMediaName, contentType, bytes);\n\n const rels = pkg.getRels(slide[SLIDE_PART_NAME]) ?? emptyRels();\n const newRId = nextRelId(rels.items.map((r) => r.id));\n rels.items.push({\n id: newRId,\n type: REL_TYPES.image,\n target: `../media/image${nextN}.${extension}`,\n targetMode: 'Internal',\n });\n pkg.setRels(slide[SLIDE_PART_NAME], rels);\n\n const rect = fitImageRect(\n { x: opts.x, y: opts.y, w: opts.w, h: opts.h },\n opts.fit ?? 'fill',\n readImagePixelSize(bytes),\n );\n const pic = buildPicture({\n id: nextShapeId(slide),\n ...(opts.name !== undefined ? { name: opts.name } : {}),\n rEmbed: newRId,\n x: rect.x,\n y: rect.y,\n w: rect.w,\n h: rect.h,\n });\n return appendAndReturnNewShape(slide, pic);\n};\n","// Slide-level queries: enumeration, factories, search, outline, info,\n// visibility, and text replacement.\n\nimport { replaceTextInTree, replaceTokensInTree } from '../../internal/drawingml/index.ts';\nimport { type PartName, partName } from '../../internal/opc/index.ts';\nimport type { OpcPackage } from '../../internal/parts/index.ts';\nimport {\n readPresentationPart,\n readSlidePart,\n slideText,\n} from '../../internal/presentationml/index.ts';\nimport { NS, attr, getAttrValue, parseXml, qname, serializeXml } from '../../internal/xml/index.ts';\nimport {\n INTERNAL_PACKAGE,\n LAYOUT_PART,\n LAYOUT_PART_NAME,\n type PresentationData,\n SHAPE_ELEMENT,\n SHAPE_SLIDE,\n SHAPE_SNAPSHOT,\n SLIDE_DOCUMENT,\n SLIDE_PART,\n SLIDE_PART_NAME,\n SLIDE_SHAPES,\n type SlideData,\n type SlideLayoutData,\n type SlideShapeData,\n} from '../_internal-symbols.ts';\nimport {\n PRES_PART_NAME,\n SLIDE_CONTENT_TYPE,\n SLIDE_LAYOUT_CONTENT_TYPE,\n commitSlideData,\n decode,\n encode,\n refreshSlideData,\n} from './_helpers.ts';\nimport { findSlidePlaceholder, getSlideLayout, getSlideShapes } from './shapes.ts';\nimport { getSlideNotes, setSlideNotes } from './features.ts';\nimport { getSlideTitle } from './embedded.ts';\n\n// Build a SlideData handle from a part's bytes. Used by `getSlides` on\n// cold load; deck mutators that change the shape count rebuild via\n// `_helpers.rebuildShapesFromDocument` instead.\nconst buildSlideData = (pkg: OpcPackage, partNameValue: PartName, bytes: Uint8Array): SlideData => {\n const doc = parseXml(decode(bytes));\n const part = readSlidePart(doc.root);\n const shapes: SlideShapeData[] = [];\n const slide: SlideData = {\n [INTERNAL_PACKAGE]: pkg,\n [SLIDE_PART_NAME]: partNameValue,\n [SLIDE_DOCUMENT]: doc,\n [SLIDE_PART]: part,\n [SLIDE_SHAPES]: shapes,\n };\n for (const snap of part.shapes) {\n shapes.push({\n [SHAPE_SLIDE]: slide,\n [SHAPE_ELEMENT]: snap.element,\n [SHAPE_SNAPSHOT]: snap,\n });\n }\n return slide;\n};\n\n/**\n * Enumerates slides in presentation order. Returns opaque `SlideData`\n * handles that pass to every slide-level fn-API helper.\n *\n * Throws if any referenced slide part is missing — a structurally\n * invalid PPTX cannot honor the L1 contract.\n */\n/**\n * Returns the shape at the given 0-based `index` on the slide, or\n * `null` when `index` is out of range. Convenience over\n * `getSlideShapes(slide)[index] ?? null`.\n */\nexport const getShapeAt = (slide: SlideData, index: number): SlideShapeData | null =>\n slide[SLIDE_SHAPES][index] ?? null;\n\n/**\n * Returns the slide count without forcing every slide part to be\n * parsed. Reads only `presentation.xml` and walks `<p:sldIdLst>`.\n *\n * Equivalent to `getSlides(pres).length`, but cheaper on cold reads\n * — useful when the caller only wants a count for UI badges or\n * validation logic.\n */\nexport const getSlideCount = (pres: PresentationData): number => {\n const cached = pres._slidesCache;\n if (cached !== null) return cached.length;\n const pkg = pres[INTERNAL_PACKAGE];\n const presPart = pkg.getPart(PRES_PART_NAME);\n if (!presPart) return 0;\n const root = parseXml(decode(presPart.data)).root;\n const model = readPresentationPart(root);\n return model.slides.length;\n};\n\n/**\n * Returns the number of slide layouts in the package. Walks the\n * content-type map; cheaper than `getSlideLayouts(pres).length`\n * because it avoids parsing each layout's XML body.\n */\nexport const getSlideLayoutCount = (pres: PresentationData): number => {\n const pkg = pres[INTERNAL_PACKAGE];\n let n = 0;\n for (const part of pkg.parts) {\n if (part.contentType === SLIDE_LAYOUT_CONTENT_TYPE) n++;\n }\n return n;\n};\n\nexport const getSlides = (pres: PresentationData): ReadonlyArray<SlideData> => {\n const cached = pres._slidesCache;\n if (cached !== null) return cached as ReadonlyArray<SlideData>;\n\n const pkg = pres[INTERNAL_PACKAGE];\n const presPart = pkg.getPart(PRES_PART_NAME);\n if (presPart === null) {\n const empty: SlideData[] = [];\n pres._slidesCache = empty;\n return empty;\n }\n const presRels = pkg.getRels(PRES_PART_NAME);\n if (presRels === null) {\n const empty: SlideData[] = [];\n pres._slidesCache = empty;\n return empty;\n }\n\n const presRoot = parseXml(decode(presPart.data)).root;\n const presModel = readPresentationPart(presRoot);\n\n const out: SlideData[] = [];\n for (const sld of presModel.slides) {\n const rel = presRels.items.find((r) => r.id === sld.rId);\n if (!rel) throw new Error(`presentation.xml.rels missing entry for ${sld.rId}`);\n const target = rel.target;\n const slideName = partName(target.startsWith('/') ? target : `/ppt/${target}`);\n const slidePart = pkg.getPart(slideName);\n if (slidePart === null) throw new Error(`slide part ${slideName} not found`);\n out.push(buildSlideData(pkg, slideName, slidePart.data));\n }\n pres._slidesCache = out;\n return out;\n};\n\n/**\n * Concatenated visible text of a slide. Convenience wrapper that walks\n * the slide's shape tree without instantiating any class.\n */\nexport const getSlideText = (slide: SlideData): string => slideText(slide[SLIDE_PART]);\n\n/**\n * Length (in code points) of the slide's concatenated visible text.\n * Counts Unicode code points via `Array.from`, so surrogate-pair\n * characters (emoji, supplementary CJK) count as 1, matching the\n * library's invariant on text editing.\n */\nexport const getSlideTextLength = (slide: SlideData): number =>\n Array.from(getSlideText(slide)).length;\n\n/**\n * A single slide's outline entry: its index, title (or `null`), and\n * the text of its body placeholder (or `null`). Used by\n * `getSlideOutline`.\n */\nexport interface SlideOutlineEntry {\n readonly index: number;\n readonly title: string | null;\n readonly body: string | null;\n}\n\n/**\n * Returns a one-entry-per-slide outline: title + body-placeholder\n * text. Useful for building thumbnail panes, table-of-contents\n * inserts, or quick-look previews without rendering the slide.\n *\n * \"Body\" here is the first matching `body` placeholder per\n * `findSlidePlaceholder(slide, 'body')`. Non-placeholder text on\n * the slide isn't surfaced; use `getSlideText(slide)` for that.\n */\nexport const getSlideOutline = (pres: PresentationData): ReadonlyArray<SlideOutlineEntry> => {\n const out: SlideOutlineEntry[] = [];\n const slides = getSlides(pres);\n for (let i = 0; i < slides.length; i++) {\n const slide = slides[i]!;\n const body = findSlidePlaceholder(slide, 'body');\n out.push({\n index: i,\n title: getSlideTitle(slide),\n body: body !== null ? body[SHAPE_SNAPSHOT].text : null,\n });\n }\n return out;\n};\n\n/**\n * Concatenated title + body text from every slide, joined with the\n * given `separator` (defaults to `'\\n\\n'`). Useful for generating\n * a table-of-contents handout from a deck. Slides without a title\n * still contribute their body (and vice versa); slides without\n * both are skipped.\n */\nexport const getOutlineText = (pres: PresentationData, separator: string = '\\n\\n'): string => {\n const parts: string[] = [];\n for (const entry of getSlideOutline(pres)) {\n const segments: string[] = [];\n if (entry.title !== null) segments.push(entry.title);\n if (entry.body !== null) segments.push(entry.body);\n if (segments.length > 0) parts.push(segments.join('\\n'));\n }\n return parts.join(separator);\n};\n\n/**\n * Concatenated visible text from every slide, joined with the\n * given `separator` (defaults to a form-feed, `\\f`, between slides).\n * Useful for search-indexing a whole deck without iterating slides\n * yourself.\n */\nexport const getPresentationText = (pres: PresentationData, separator: string = '\\f'): string => {\n const parts: string[] = [];\n for (const slide of getSlides(pres)) parts.push(slideText(slide[SLIDE_PART]));\n return parts.join(separator);\n};\n\n/**\n * Total code-point length of visible text across every slide.\n * Sibling of `getSlideTextLength`; counts surrogate-pair characters\n * (emoji, supplementary CJK) as 1 each. Cheaper than building the\n * concatenated string when only the length matters.\n */\nexport const getPresentationTextLength = (pres: PresentationData): number => {\n let n = 0;\n for (const slide of getSlides(pres)) {\n n += Array.from(slideText(slide[SLIDE_PART])).length;\n }\n return n;\n};\n\n/**\n * Dense per-slide shape count array, 0-based by slide index. Counts\n * top-level + group-children shapes (whatever `getSlideShapes` flattens).\n * Useful for charting shape density per slide and identifying outliers\n * (the 200-shape \"soup\" slide everybody complains about) for cleanup.\n */\nexport const getPresentationShapeCountsBySlide = (pres: PresentationData): ReadonlyArray<number> =>\n getSlides(pres).map((s) => s[SLIDE_SHAPES].length);\n\n/**\n * Dense per-slide visible-text length array, 0-based by slide index.\n * Counts code points (surrogate pairs as 1) per `getSlideTextLength`.\n * Pair with `getPresentationShapeCountsBySlide` for slide-density\n * audits — high text length on a slide with few shapes usually means\n * one paragraph-heavy text box; low text on a many-shape slide\n * usually means a busy diagram.\n */\nexport const getPresentationTextLengthsBySlide = (pres: PresentationData): ReadonlyArray<number> =>\n getSlides(pres).map((s) => Array.from(slideText(s[SLIDE_PART])).length);\n\n/**\n * Returns the 0-based index of `slide` within `pres`, or `-1` if the\n * slide doesn't belong to this presentation (e.g. after a removeSlide\n * call, or if it was constructed from a different package).\n */\nexport const getSlideIndex = (pres: PresentationData, slide: SlideData): number => {\n const slides = getSlides(pres);\n return slides.indexOf(slide);\n};\n\n/**\n * Returns the slide at the given 0-based `index`, or `null` if `index`\n * is out of range. Convenience over `getSlides(pres)[index] ?? null`.\n */\nexport const getSlideAt = (pres: PresentationData, index: number): SlideData | null => {\n const slides = getSlides(pres);\n return slides[index] ?? null;\n};\n\n/**\n * Per-slide summary suitable for slide pickers or audit reports.\n *\n * `index` is the 0-based position in the deck. `title` falls back to\n * `null` when the slide has no title placeholder. `layoutName` falls\n * back to `null` when the slide has no `slideLayout` rel or the\n * layout doesn't carry a user-visible name.\n */\nexport interface SlideInfo {\n readonly index: number;\n readonly title: string | null;\n readonly hidden: boolean;\n readonly shapeCount: number;\n readonly layoutName: string | null;\n}\n\nexport const getSlideInfo = (pres: PresentationData, slide: SlideData): SlideInfo => {\n const layout = getSlideLayout(slide);\n return {\n index: getSlideIndex(pres, slide),\n title: getSlideTitle(slide),\n hidden: isSlideHidden(slide),\n shapeCount: getSlideShapes(slide).length,\n layoutName: layout ? layout[LAYOUT_PART].name : null,\n };\n};\n\n/**\n * Returns every slide bound to the given `layout`. Useful for \"find\n * all slides using the `Title and Content` layout\" workflows; pair\n * with `findSlideLayout(pres, name)` to look up the layout by name.\n */\nexport const getSlidesByLayout = (\n pres: PresentationData,\n layout: SlideLayoutData,\n): ReadonlyArray<SlideData> => {\n const target = layout[LAYOUT_PART_NAME];\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n const found = getSlideLayout(slide);\n if (found !== null && found[LAYOUT_PART_NAME] === target) out.push(slide);\n }\n return out;\n};\n\n/**\n * Returns the first slide whose title-placeholder text equals\n * `title` exactly. Returns `null` when no slide matches. Different\n * from `findSlideByText`, which matches any visible text — this one\n * is title-placeholder-scoped. Accepts a literal string (exact\n * equality) or a `RegExp` for pattern matches.\n */\nexport const findSlideByTitle = (\n pres: PresentationData,\n title: string | RegExp,\n): SlideData | null => {\n for (const slide of getSlides(pres)) {\n const t = getSlideTitle(slide);\n if (t === null) continue;\n const hit = typeof title === 'string' ? t === title : title.test(t);\n if (hit) return slide;\n }\n return null;\n};\n\n/**\n * Returns the slide whose package part name equals `partName`\n * (typically `/ppt/slides/slideN.xml`), or `null` when no such\n * slide exists. Useful for callers that walk validator output,\n * `listPackageParts`, or any other low-level path-keyed API and\n * need the matching `SlideData` handle.\n */\nexport const findSlideByPartName = (pres: PresentationData, partName: string): SlideData | null => {\n for (const slide of getSlides(pres)) {\n if (slide[SLIDE_PART_NAME] === partName) return slide;\n }\n return null;\n};\n\n/**\n * Returns the package part name (e.g. `/ppt/slides/slide3.xml`) of\n * `slide`. Useful for surfacing slides in validator output, error\n * messages, or any path-keyed sidebar UI.\n */\nexport const getSlidePartName = (slide: SlideData): string => slide[SLIDE_PART_NAME];\n\n/**\n * Returns the slide's current XML body as a string. Re-serializes\n * from the typed AST, so this reflects any pending edits that\n * haven't been written back to the package yet.\n *\n * Intended for diagnostics: dumping into bug reports, asserting\n * structure in tests, snapshotting before / after a transformation.\n * Do NOT parse this back yourself — round-trip safely through\n * `loadPresentation` / `savePresentation`.\n */\nexport const getSlideXmlString = (slide: SlideData): string => serializeXml(slide[SLIDE_DOCUMENT]);\n\n/**\n * Returns the first slide whose concatenated visible text contains\n * `needle` (substring; case-sensitive). Pass a `RegExp` to test\n * against the slide's text body instead. Returns `null` when no\n * slide matches.\n */\nexport const findSlideByText = (\n pres: PresentationData,\n needle: string | RegExp,\n): SlideData | null => {\n for (const slide of getSlides(pres)) {\n const text = slideText(slide[SLIDE_PART]);\n if (typeof needle === 'string' ? text.includes(needle) : needle.test(text)) {\n return slide;\n }\n }\n return null;\n};\n\n/**\n * Every slide whose concatenated visible text contains `needle`\n * (substring) or matches the given `RegExp`.\n */\nexport const findSlidesByText = (\n pres: PresentationData,\n needle: string | RegExp,\n): ReadonlyArray<SlideData> => {\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n const text = slideText(slide[SLIDE_PART]);\n if (typeof needle === 'string' ? text.includes(needle) : needle.test(text)) {\n out.push(slide);\n }\n }\n return out;\n};\n\n/**\n * Every slide whose speaker notes contain `needle` (substring) or\n * match the given `RegExp`. Sibling of `findSlidesByText` — useful\n * for surfacing reviewer-facing annotations stored in notes (e.g.\n * \"every slide whose notes say TODO\").\n *\n * Slides without notes are skipped.\n */\nexport const findSlidesByNotes = (\n pres: PresentationData,\n needle: string | RegExp,\n): ReadonlyArray<SlideData> => {\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n const notes = getSlideNotes(slide);\n if (notes === null || notes.length === 0) continue;\n if (typeof needle === 'string' ? notes.includes(needle) : needle.test(notes)) {\n out.push(slide);\n }\n }\n return out;\n};\n\n/**\n * Returns every slide where `needle` appears in **either** the\n * visible text or the speaker notes. Each slide is reported once,\n * in document order. Sibling of `findSlidesByText` /\n * `findSlidesByNotes` — useful for a generic \"search the deck\"\n * UX where the caller doesn't care which surface matched.\n */\nexport const searchSlides = (\n pres: PresentationData,\n needle: string | RegExp,\n): ReadonlyArray<SlideData> => {\n const matchesString = (haystack: string): boolean =>\n typeof needle === 'string' ? haystack.includes(needle) : needle.test(haystack);\n const out: SlideData[] = [];\n for (const slide of getSlides(pres)) {\n if (matchesString(slideText(slide[SLIDE_PART]))) {\n out.push(slide);\n continue;\n }\n const notes = getSlideNotes(slide);\n if (notes !== null && notes.length > 0 && matchesString(notes)) out.push(slide);\n }\n return out;\n};\n\n/**\n * Replaces every occurrence of `from` in every slide's speaker\n * notes with `to`. Returns the number of slides updated. Sibling\n * of `replaceTextInPresentation` for the reviewer-annotation pass.\n *\n * Slides without notes are skipped. For string needles, replacement\n * is global; for RegExp needles, the global flag is forced.\n */\nexport const replaceTextInNotes = (\n pres: PresentationData,\n from: string | RegExp,\n to: string,\n): number => {\n let n = 0;\n for (const slide of getSlides(pres)) {\n if (replaceTextInSlideNotes(slide, from, to)) n++;\n }\n return n;\n};\n\n/**\n * Slide-scoped sibling of `replaceTextInNotes`. Replaces every\n * occurrence of `from` in the slide's speaker notes with `to`.\n * Returns `true` if the notes changed, `false` otherwise (no notes\n * present, or no match).\n */\nexport const replaceTextInSlideNotes = (\n slide: SlideData,\n from: string | RegExp,\n to: string,\n): boolean => {\n const notes = getSlideNotes(slide);\n if (notes === null || notes.length === 0) return false;\n let next: string;\n if (typeof from === 'string') {\n if (!notes.includes(from)) return false;\n next = notes.split(from).join(to);\n } else {\n const re = from.global ? from : new RegExp(from.source, `${from.flags}g`);\n if (!re.test(notes)) return false;\n re.lastIndex = 0;\n next = notes.replace(re, to);\n }\n if (next === notes) return false;\n setSlideNotes(slide, next);\n return true;\n};\n\n/**\n * Every shape on every slide, paired with its slide and the slide's\n * 0-based index. Useful for cross-deck audits (\"find every picture\",\n * \"list shape names anywhere\") without writing the nested-loop\n * boilerplate yourself.\n */\nexport interface AllShapesEntry {\n readonly slide: SlideData;\n readonly slideIndex: number;\n readonly shape: SlideShapeData;\n}\n\nexport const getAllShapes = (pres: PresentationData): ReadonlyArray<AllShapesEntry> => {\n const out: AllShapesEntry[] = [];\n const slides = getSlides(pres);\n for (let i = 0; i < slides.length; i++) {\n const slide = slides[i]!;\n for (const shape of getSlideShapes(slide)) {\n out.push({ slide, slideIndex: i, shape });\n }\n }\n return out;\n};\n\n// ---------------------------------------------------------------------------\n// Slide visibility — `<p:sld show=\"0\">` hides a slide from the slideshow\n// without removing it from the deck. `show=\"1\"` (or omission) is visible.\n\nconst ATTR_SHOW = qname('', 'show', '');\n\n/**\n * Returns `true` when the slide carries `show=\"0\"` on its root\n * `<p:sld>` element. PowerPoint hides such slides from the slideshow\n * but keeps them in the editing surface.\n */\nexport const isSlideHidden = (slide: SlideData): boolean => {\n const show = getAttrValue(slide[SLIDE_DOCUMENT].root, ATTR_SHOW);\n return show === '0';\n};\n\n/**\n * Returns `true` when the slide carries a `<p:timing>` block — i.e.,\n * has at least one authored animation effect. Per-slide complement to\n * `getPresentationSummary().hasAnimations`, which only reports a\n * deck-wide flag.\n */\nexport const slideHasAnimations = (slide: SlideData): boolean => {\n return slide[SLIDE_DOCUMENT].root.children.some(\n (c) => c.kind === 'element' && c.name.namespaceURI === NS.pml && c.name.localName === 'timing',\n );\n};\n\n/**\n * Toggles the slide's visibility in the slideshow. Hiding adds\n * `show=\"0\"`; showing removes the attribute (PowerPoint treats absence\n * as the default `show=\"1\"`).\n */\nexport const setSlideHidden = (slide: SlideData, hidden: boolean): void => {\n const root = slide[SLIDE_DOCUMENT].root;\n root.attrs = root.attrs.filter(\n (a) => !(a.name.namespaceURI === '' && a.name.localName === 'show'),\n );\n if (hidden) root.attrs.push(attr(ATTR_SHOW, '0'));\n commitSlideData(slide);\n};\n\n/**\n * Replaces `{{key}}` tokens on every slide. Returns the total number of\n * substitutions performed.\n */\nexport const replaceTokensInPresentation = (\n pres: PresentationData,\n tokens: Record<string, string>,\n): number => {\n const pkg = pres[INTERNAL_PACKAGE];\n let count = 0;\n for (const part of pkg.parts) {\n if (part.contentType !== SLIDE_CONTENT_TYPE) continue;\n const doc = parseXml(decode(part.data));\n const n = replaceTokensInTree(doc.root, tokens);\n if (n > 0) {\n part.data = encode(serializeXml(doc));\n count += n;\n }\n }\n pres._slidesCache = null;\n return count;\n};\n\n/**\n * Replaces every occurrence of `from` in every slide's text with `to`.\n * `from` may be a string (treated as a literal) or a `RegExp`. Returns\n * the number of `<a:t>` elements mutated across the whole deck.\n *\n * Use this for the broad \"rename product X to Y\" pattern; for\n * `{{token}}` style substitutions, prefer\n * `replaceTokensInPresentation` which is more explicit about intent.\n */\nexport const replaceTextInPresentation = (\n pres: PresentationData,\n from: string | RegExp,\n to: string,\n): number => {\n const pkg = pres[INTERNAL_PACKAGE];\n let count = 0;\n for (const part of pkg.parts) {\n if (part.contentType !== SLIDE_CONTENT_TYPE) continue;\n const doc = parseXml(decode(part.data));\n const n = replaceTextInTree(doc.root, from, to);\n if (n > 0) {\n part.data = encode(serializeXml(doc));\n count += n;\n }\n }\n pres._slidesCache = null;\n return count;\n};\n\n/**\n * Replaces every occurrence of `from` in the slide's text with `to`.\n * Returns the number of `<a:t>` elements mutated on this slide.\n */\nexport const replaceTextInSlide = (slide: SlideData, from: string | RegExp, to: string): number => {\n const n = replaceTextInTree(slide[SLIDE_DOCUMENT].root, from, to);\n if (n > 0) {\n commitSlideData(slide);\n refreshSlideData(slide);\n }\n return n;\n};\n","// Slide sections (p14 extension).\n\nimport {\n NS,\n type XmlElement,\n allChildElements,\n attr,\n elem,\n firstChildElement,\n getAttrValue,\n parseXml,\n qname,\n serializeXml,\n} from '../../internal/xml/index.ts';\nimport {\n INTERNAL_PACKAGE,\n type PresentationData,\n SLIDE_PART_NAME,\n type SlideData,\n} from '../_internal-symbols.ts';\nimport { PRES_PART_NAME, decode, encode } from './_helpers.ts';\nimport { readPresentationPart } from '../../internal/presentationml/index.ts';\nimport { getSlides } from './slide-query.ts';\n\n// ---------------------------------------------------------------------------\n// Slide sections (p14 extension).\n//\n// PowerPoint 2010+ supports grouping slides into named sections. The\n// data lives in `<p:presentation>/<p:extLst>/<p:ext uri=\"{…}\">/<p14:sectionLst>`.\n// We expose it as a flat array of `SlideSection` objects, each\n// carrying the section name and the slides in display order.\n\n/** One section in the deck. `slides` is a snapshot at read time. */\nexport interface SlideSection {\n readonly name: string;\n readonly slides: ReadonlyArray<SlideData>;\n}\n\nconst NS_P14 = 'http://schemas.microsoft.com/office/powerpoint/2010/main';\nconst SECTION_LST_EXT_URI = '{521415D9-36F7-43E2-AB2F-B90AF26B5E84}';\n\nconst NAME_EXT_LST = qname('p', 'extLst', NS.pml);\nconst NAME_P_EXT = qname('p', 'ext', NS.pml);\nconst NAME_P14_SECTION_LST = qname('p14', 'sectionLst', NS_P14);\nconst NAME_P14_SECTION = qname('p14', 'section', NS_P14);\nconst NAME_P14_SLD_ID_LST = qname('p14', 'sldIdLst', NS_P14);\nconst NAME_P14_SLD_ID = qname('p14', 'sldId', NS_P14);\nconst ATTR_URI = qname('', 'uri', '');\nconst ATTR_NAME_SEC = qname('', 'name', '');\nconst ATTR_ID_SEC = qname('', 'id', '');\nconst ATTR_SLD_ID_REF = qname('', 'id', '');\n\nconst findSectionLstElement = (presDocRoot: XmlElement): XmlElement | null => {\n const extLst = firstChildElement(presDocRoot, NAME_EXT_LST);\n if (!extLst) return null;\n for (const ext of allChildElements(extLst, NAME_P_EXT)) {\n if (getAttrValue(ext, ATTR_URI) === SECTION_LST_EXT_URI) {\n return firstChildElement(ext, NAME_P14_SECTION_LST);\n }\n }\n return null;\n};\n\nconst ensureSectionLst = (presDocRoot: XmlElement): XmlElement => {\n let extLst = firstChildElement(presDocRoot, NAME_EXT_LST);\n if (!extLst) {\n extLst = elem(NAME_EXT_LST);\n presDocRoot.children.push(extLst);\n }\n for (const ext of allChildElements(extLst, NAME_P_EXT)) {\n if (getAttrValue(ext, ATTR_URI) === SECTION_LST_EXT_URI) {\n let sectionLst = firstChildElement(ext, NAME_P14_SECTION_LST);\n if (!sectionLst) {\n sectionLst = elem(NAME_P14_SECTION_LST);\n ext.children.push(sectionLst);\n }\n return sectionLst;\n }\n }\n const sectionLst = elem(NAME_P14_SECTION_LST, {\n prefixDecls: new Map([['p14', NS_P14]]),\n });\n const ext = elem(NAME_P_EXT, {\n attrs: [attr(ATTR_URI, SECTION_LST_EXT_URI)],\n children: [sectionLst],\n });\n extLst.children.push(ext);\n return sectionLst;\n};\n\n/**\n * Returns every section defined in `<p14:sectionLst>`, with each\n * section's slides resolved to `SlideData` handles via the\n * presentation's `<p:sldIdLst>`. Sections referencing missing slides\n * are dropped silently; empty arrays are preserved.\n *\n * Returns an empty array when no sectionLst is present.\n */\nexport const getSlideSections = (pres: PresentationData): ReadonlyArray<SlideSection> => {\n const pkg = pres[INTERNAL_PACKAGE];\n const presPart = pkg.getPart(PRES_PART_NAME);\n if (!presPart) return [];\n const doc = parseXml(decode(presPart.data));\n const sectionLst = findSectionLstElement(doc.root);\n if (!sectionLst) return [];\n\n // Build a map from `sldId` to SlideData by walking the deck.\n const slideById = new Map<string, SlideData>();\n const presRels = pkg.getRels(PRES_PART_NAME);\n if (presRels) {\n const presModel = readPresentationPart(doc.root);\n const slides = getSlides(pres);\n // Map presModel.slides[i].id → slides[i] (they're in the same order).\n for (let i = 0; i < presModel.slides.length && i < slides.length; i++) {\n slideById.set(String(presModel.slides[i]!.id), slides[i]!);\n }\n }\n\n const out: SlideSection[] = [];\n for (const sec of allChildElements(sectionLst, NAME_P14_SECTION)) {\n const name = getAttrValue(sec, ATTR_NAME_SEC) ?? '';\n const sldIdLst = firstChildElement(sec, NAME_P14_SLD_ID_LST);\n const slides: SlideData[] = [];\n if (sldIdLst) {\n for (const sldId of allChildElements(sldIdLst, NAME_P14_SLD_ID)) {\n const id = getAttrValue(sldId, ATTR_SLD_ID_REF);\n if (id !== null) {\n const slide = slideById.get(id);\n if (slide) slides.push(slide);\n }\n }\n }\n out.push({ name, slides });\n }\n return out;\n};\n\n/**\n * Replaces the deck's section list with `sections`. Each section is\n * given a fresh GUID `id` attribute (PowerPoint generates one per\n * section; we synthesize a deterministic-ish one based on index +\n * timestamp for v1).\n *\n * Pass `[]` to clear all sections — the helper drops the\n * `<p14:sectionLst>` extension entirely when no sections remain.\n */\nexport const setSlideSections = (\n pres: PresentationData,\n sections: ReadonlyArray<{ name: string; slides: ReadonlyArray<SlideData> }>,\n): void => {\n const pkg = pres[INTERNAL_PACKAGE];\n const presPart = pkg.getPart(PRES_PART_NAME);\n if (!presPart) throw new Error('presentation.xml is missing');\n const doc = parseXml(decode(presPart.data));\n\n // Build a reverse map from SlideData identity → sldId.\n const idBySlide = new Map<SlideData, string>();\n const presModel = readPresentationPart(doc.root);\n const slides = getSlides(pres);\n for (let i = 0; i < presModel.slides.length && i < slides.length; i++) {\n idBySlide.set(slides[i]!, String(presModel.slides[i]!.id));\n }\n\n // Reach for the matching slide id by part name, since SlideData\n // identity may have been rebuilt across calls.\n const idByPartName = new Map<string, string>();\n if (presModel.slides.length > 0) {\n const presRels = pkg.getRels(PRES_PART_NAME);\n if (presRels) {\n for (const s of presModel.slides) {\n const rel = presRels.items.find((r) => r.id === s.rId);\n if (!rel) continue;\n const slideName = rel.target.startsWith('/') ? rel.target : `/ppt/${rel.target}`;\n idByPartName.set(slideName, String(s.id));\n }\n }\n }\n const sldIdFor = (slide: SlideData): string | null => {\n const direct = idBySlide.get(slide);\n if (direct) return direct;\n return idByPartName.get(slide[SLIDE_PART_NAME]) ?? null;\n };\n\n if (sections.length === 0) {\n // Drop the sectionLst entirely.\n const extLst = firstChildElement(doc.root, NAME_EXT_LST);\n if (extLst) {\n extLst.children = extLst.children.filter(\n (c) =>\n !(\n c.kind === 'element' &&\n c.name.namespaceURI === NS.pml &&\n c.name.localName === 'ext' &&\n getAttrValue(c, ATTR_URI) === SECTION_LST_EXT_URI\n ),\n );\n // Drop the empty extLst itself if no other extensions remain.\n if (extLst.children.length === 0) {\n doc.root.children = doc.root.children.filter((c) => c !== extLst);\n }\n }\n presPart.data = encode(serializeXml(doc));\n return;\n }\n\n const sectionLst = ensureSectionLst(doc.root);\n sectionLst.children = sections.map((section, i) => {\n // Synthesize a GUID-shaped id from index + timestamp.\n const ts = Date.now().toString(16).padStart(8, '0').slice(-8).toUpperCase();\n const id = `{${ts.slice(0, 8)}-${String(i).padStart(4, '0')}-4000-8000-000000000000}`;\n const sldIds: XmlElement[] = [];\n for (const slide of section.slides) {\n const sldId = sldIdFor(slide);\n if (sldId !== null) {\n sldIds.push(elem(NAME_P14_SLD_ID, { attrs: [attr(ATTR_SLD_ID_REF, sldId)] }));\n }\n }\n return elem(NAME_P14_SECTION, {\n attrs: [attr(ATTR_NAME_SEC, section.name), attr(ATTR_ID_SEC, id)],\n children: [elem(NAME_P14_SLD_ID_LST, { children: sldIds })],\n });\n });\n\n presPart.data = encode(serializeXml(doc));\n};\n","// Deck manipulation: add, remove, reorder, duplicate, import, merge.\n\nimport {\n basename,\n emptyRels,\n nextRelId,\n partName,\n relsPartNameFor,\n resolveTarget,\n} from '../../internal/opc/index.ts';\nimport type { OpcPackage } from '../../internal/parts/index.ts';\nimport { REL_TYPES, buildSlideFromLayout } from '../../internal/presentationml/index.ts';\nimport {\n NS,\n type XmlDocument,\n type XmlElement,\n allChildElements,\n attr,\n elem,\n firstChildElement,\n getAttrValue,\n parseXml,\n serializeXml,\n} from '../../internal/xml/index.ts';\nimport {\n INTERNAL_PACKAGE,\n LAYOUT_PART,\n LAYOUT_PART_NAME,\n type PresentationData,\n SLIDE_PART_NAME,\n type SlideData,\n type SlideLayoutData,\n} from '../_internal-symbols.ts';\nimport {\n ATTR_ID,\n ATTR_R_ID,\n NAME_CSLD,\n NAME_PRESENTATION,\n NAME_SLD_ID,\n NAME_SLD_ID_LST,\n NAME_SLD_MASTER_ID_LST,\n NAME_SP_TREE,\n PRES_PART_NAME,\n SLD_ID_MAX,\n SLD_ID_MIN,\n SLIDE_CONTENT_TYPE,\n decode,\n encode,\n setOpcDefault,\n} from './_helpers.ts';\nimport {\n findSlideLayoutByType,\n getSlideLayoutType,\n getSlideLayouts,\n getSlideLayoutPlaceholders,\n} from './layouts.ts';\nimport { getSlides } from './slide-query.ts';\nimport { setSlideBody, setSlideTitle } from './embedded.ts';\n\n// ---------------------------------------------------------------------------\n// Deck manipulation.\n\nconst ensureSldIdLst = (presentationRoot: XmlElement): XmlElement => {\n const existing = firstChildElement(presentationRoot, NAME_SLD_ID_LST);\n if (existing !== null) return existing;\n const fresh = elem(NAME_SLD_ID_LST);\n const masterLst = firstChildElement(presentationRoot, NAME_SLD_MASTER_ID_LST);\n if (masterLst === null) {\n presentationRoot.children.unshift(fresh);\n return fresh;\n }\n const idx = presentationRoot.children.indexOf(masterLst);\n presentationRoot.children.splice(idx + 1, 0, fresh);\n return fresh;\n};\n\nconst allocateSldId = (sldIdLst: XmlElement): number => {\n let max = SLD_ID_MIN - 1;\n for (const sldId of allChildElements(sldIdLst, NAME_SLD_ID)) {\n const raw = getAttrValue(sldId, ATTR_ID);\n if (raw === null) continue;\n const n = Number.parseInt(raw, 10);\n if (Number.isFinite(n) && n > max) max = n;\n }\n const next = Math.max(SLD_ID_MIN, max + 1);\n if (next > SLD_ID_MAX) {\n throw new Error(`sldId allocator exhausted (next would be ${next}, max ${SLD_ID_MAX})`);\n }\n return next;\n};\n\nconst allocateSlideN = (pkg: OpcPackage): number => {\n let next = 1;\n for (const p of pkg.parts) {\n const m = p.name.match(/^\\/ppt\\/slides\\/slide(\\d+)\\.xml$/);\n if (m?.[1] !== undefined) {\n const n = Number.parseInt(m[1], 10);\n if (Number.isFinite(n) && n >= next) next = n + 1;\n }\n }\n return next;\n};\n\nconst requirePresentationDoc = (pkg: OpcPackage): XmlDocument => {\n const presPart = pkg.getPart(PRES_PART_NAME);\n if (!presPart) throw new Error('presentation.xml is missing');\n const doc = parseXml(decode(presPart.data));\n if (\n doc.root.name.namespaceURI !== NAME_PRESENTATION.namespaceURI ||\n doc.root.name.localName !== 'presentation'\n ) {\n throw new Error('presentation.xml root is not <p:presentation>');\n }\n return doc;\n};\n\n/**\n * Adds a new slide bound to `layout`. Returns the new `SlideData`.\n *\n * Allocates a fresh part name, sldId, and rId; clones layout\n * placeholders into the slide; writes `[Content_Types].xml`, the\n * slide's `.rels`, presentation's `.rels`, and `<p:sldIdLst>`. The\n * deck-cache on `pres` is invalidated so the next `getSlides` call\n * sees the new entry.\n */\n/**\n * Convenience over `addSlide` that picks a layout automatically:\n *\n * 1. The layout with `<p:sldLayout type=\"blank\">`, if present.\n * 2. Otherwise, the first available layout (alphabetical by\n * part name).\n *\n * Throws when the package carries no layouts at all (which would\n * be a structurally-broken deck).\n */\nexport const addBlankSlide = (pres: PresentationData): SlideData => {\n const blank = findSlideLayoutByType(pres, 'blank');\n if (blank) return addSlide(pres, { layout: blank });\n const layouts = getSlideLayouts(pres);\n if (layouts.length === 0) {\n throw new Error('addBlankSlide: package has no slide layouts to inherit from');\n }\n return addSlide(pres, { layout: layouts[0]! });\n};\n\n/**\n * Sugar over `addSlide` + `setSlideTitle` + `setSlideBody` for the\n * \"title + body\" pattern. Picks the `obj` (Title and Content)\n * layout when present, falling back to the first layout with a\n * body placeholder.\n *\n * Throws if no layout in the package offers a body slot.\n */\nexport const addContentSlide = (\n pres: PresentationData,\n opts: { title?: string; body?: string },\n): SlideData => {\n const objLayout = findSlideLayoutByType(pres, 'obj');\n const layout =\n objLayout ??\n getSlideLayouts(pres).find((l) =>\n getSlideLayoutPlaceholders(l).some((p) => p.type === null || p.type === 'body'),\n );\n if (!layout) {\n throw new Error('addContentSlide: no layout with a body placeholder found');\n }\n const slide = addSlide(pres, { layout });\n if (opts.title !== undefined) setSlideTitle(slide, opts.title);\n if (opts.body !== undefined) setSlideBody(slide, opts.body);\n return slide;\n};\n\n/**\n * Sugar over `addSlide` + `setSlideTitle` for the section-divider\n * pattern. Picks `<p:sldLayout type=\"secHead\">` when present (the\n * PowerPoint \"Section Header\" layout); otherwise falls back to a\n * `title`-typed layout or the first available layout.\n */\nexport const addSectionHeaderSlide = (pres: PresentationData, title: string): SlideData => {\n const layout =\n findSlideLayoutByType(pres, 'secHead') ??\n findSlideLayoutByType(pres, 'title') ??\n getSlideLayouts(pres)[0];\n if (!layout) {\n throw new Error('addSectionHeaderSlide: package has no slide layouts to inherit from');\n }\n const slide = addSlide(pres, { layout });\n setSlideTitle(slide, title);\n return slide;\n};\n\n/**\n * Sugar over `addSlide` + `setSlideTitle` for the common\n * \"title slide + set heading\" pattern. Picks the `title` layout\n * first, then falls back to the first non-blank layout.\n *\n * Throws when the package carries no layouts at all.\n */\nexport const addTitleSlide = (pres: PresentationData, title: string): SlideData => {\n const titleLayout =\n findSlideLayoutByType(pres, 'title') ?? findSlideLayoutByType(pres, 'obj') ?? null;\n const layout =\n titleLayout ??\n getSlideLayouts(pres).find((l) => getSlideLayoutType(l) !== 'blank') ??\n getSlideLayouts(pres)[0];\n if (!layout) {\n throw new Error('addTitleSlide: package has no slide layouts to inherit from');\n }\n const slide = addSlide(pres, { layout });\n setSlideTitle(slide, title);\n return slide;\n};\n\nexport const addSlide = (\n pres: PresentationData,\n options: { layout: SlideLayoutData },\n): SlideData => {\n const pkg = pres[INTERNAL_PACKAGE];\n const layout = options.layout;\n const layoutPart = layout[LAYOUT_PART];\n const layoutPartName = layout[LAYOUT_PART_NAME];\n\n const presDoc = requirePresentationDoc(pkg);\n const presPart = pkg.getPart(PRES_PART_NAME);\n if (!presPart) throw new Error('presentation.xml is missing');\n\n const sldIdLst = ensureSldIdLst(presDoc.root);\n const newSldId = allocateSldId(sldIdLst);\n const slideN = allocateSlideN(pkg);\n const newSlidePartName = partName(`/ppt/slides/slide${slideN}.xml`);\n\n const layoutCsld = firstChildElement(layoutPart.root, NAME_CSLD);\n if (!layoutCsld) throw new Error(`layout ${layoutPartName} missing <p:cSld>`);\n const layoutSpTree = firstChildElement(layoutCsld, NAME_SP_TREE);\n if (!layoutSpTree) throw new Error(`layout ${layoutPartName} missing <p:spTree>`);\n\n const slideDoc = buildSlideFromLayout(layoutSpTree);\n const slideBytes = encode(serializeXml(slideDoc));\n pkg.addPart(newSlidePartName, SLIDE_CONTENT_TYPE, slideBytes);\n\n const slideRels = emptyRels();\n slideRels.items.push({\n id: 'rId1',\n type: REL_TYPES.slideLayout,\n target: `../slideLayouts/${basename(layoutPartName)}`,\n targetMode: 'Internal',\n });\n pkg.setRels(newSlidePartName, slideRels);\n\n const presRels = pkg.getRels(PRES_PART_NAME) ?? emptyRels();\n const newRId = nextRelId(presRels.items.map((r) => r.id));\n presRels.items.push({\n id: newRId,\n type: REL_TYPES.slide,\n target: `slides/slide${slideN}.xml`,\n targetMode: 'Internal',\n });\n pkg.setRels(PRES_PART_NAME, presRels);\n\n sldIdLst.children.push(\n elem(NAME_SLD_ID, {\n attrs: [attr(ATTR_ID, String(newSldId)), attr(ATTR_R_ID, newRId)],\n }),\n );\n presPart.data = encode(serializeXml(presDoc));\n\n pres._slidesCache = null;\n const slides = getSlides(pres);\n const last = slides[slides.length - 1];\n if (!last) throw new Error('addSlide: post-condition failed; slide not in cache');\n return last;\n};\n\n/**\n * Removes the given slide from the deck. Removes the `<p:sldId>`, the\n * `presentation.xml.rels` entry, and the slide part + its `.rels` part.\n *\n * Media parts are intentionally NOT cleaned up — they may be shared\n * with other slides. The freed `sldId` is NOT reused on subsequent\n * `addSlide` calls (PowerPoint quirk, see plan §Risks).\n */\nexport const removeSlide = (pres: PresentationData, slide: SlideData): void => {\n const pkg = pres[INTERNAL_PACKAGE];\n const slidePartName = slide[SLIDE_PART_NAME];\n if (pkg.getPart(slidePartName) === null) {\n throw new Error(`removeSlide: ${slidePartName} not present in package`);\n }\n\n const presRels = pkg.getRels(PRES_PART_NAME);\n if (!presRels) throw new Error('presentation.xml has no rels');\n const slideTargetRel = `slides/${basename(slidePartName)}`;\n const removedRel = presRels.items.find(\n (r) => r.type === REL_TYPES.slide && r.target === slideTargetRel,\n );\n if (!removedRel) {\n throw new Error(`presentation.xml.rels missing entry for slide ${slidePartName}`);\n }\n presRels.items = presRels.items.filter((r) => r.id !== removedRel.id);\n pkg.setRels(PRES_PART_NAME, presRels);\n\n const presPart = pkg.getPart(PRES_PART_NAME);\n if (!presPart) throw new Error('presentation.xml missing');\n const presDoc = parseXml(decode(presPart.data));\n const sldIdLst = firstChildElement(presDoc.root, NAME_SLD_ID_LST);\n if (sldIdLst !== null) {\n sldIdLst.children = sldIdLst.children.filter((c) => {\n if (c.kind !== 'element') return true;\n if (c.name.namespaceURI !== NS.pml || c.name.localName !== 'sldId') return true;\n return getAttrValue(c, ATTR_R_ID) !== removedRel.id;\n });\n }\n presPart.data = encode(serializeXml(presDoc));\n\n pkg.removePart(relsPartNameFor(slidePartName));\n pkg.removePart(slidePartName);\n pres._slidesCache = null;\n};\n\n/**\n * Reorders every slide in the deck via a custom comparator. The\n * comparator is invoked with two `SlideData` handles and returns the\n * usual `Array.prototype.sort` ordering (-1 / 0 / 1).\n *\n * sortSlides(pres, (a, b) => getSlideTitle(a)?.localeCompare(getSlideTitle(b) ?? '') ?? 0);\n *\n * Internally walks `<p:sldIdLst>` and re-emits its `<p:sldId>` children\n * in the new order. Slide parts and rels are untouched — only the\n * order in which PowerPoint plays them changes.\n */\nexport const sortSlides = (\n pres: PresentationData,\n compareFn: (a: SlideData, b: SlideData) => number,\n): void => {\n const pkg = pres[INTERNAL_PACKAGE];\n const presPart = pkg.getPart(PRES_PART_NAME);\n if (!presPart) throw new Error('presentation.xml missing');\n const doc = parseXml(decode(presPart.data));\n const sldIdLst = firstChildElement(doc.root, NAME_SLD_ID_LST);\n if (!sldIdLst) return; // nothing to reorder\n\n const slides = getSlides(pres);\n const presRels = pkg.getRels(PRES_PART_NAME);\n if (!presRels) return;\n\n // Build a map from rId → SlideData and from rId → its <p:sldId> element.\n const slideByRId = new Map<string, SlideData>();\n for (const slide of slides) {\n const rel = presRels.items.find(\n (r) =>\n r.type === REL_TYPES.slide && r.target === `slides/${basename(slide[SLIDE_PART_NAME])}`,\n );\n if (rel) slideByRId.set(rel.id, slide);\n }\n const sldIdElements = sldIdLst.children.filter(\n (c): c is XmlElement =>\n c.kind === 'element' && c.name.namespaceURI === NS.pml && c.name.localName === 'sldId',\n );\n const sortedSlides = [...slides].sort(compareFn);\n const newOrder: XmlElement[] = [];\n for (const slide of sortedSlides) {\n let matchedRId: string | undefined;\n for (const [rId, s] of slideByRId.entries()) {\n if (s === slide) {\n matchedRId = rId;\n break;\n }\n }\n if (matchedRId === undefined) continue;\n const el = sldIdElements.find((e) => getAttrValue(e, ATTR_R_ID) === matchedRId);\n if (el) newOrder.push(el);\n }\n\n // Replace the children, preserving any non-sldId children (whitespace\n // or comments — unlikely but defensive).\n const nonSldIdChildren = sldIdLst.children.filter(\n (c) =>\n !(c.kind === 'element' && c.name.namespaceURI === NS.pml && c.name.localName === 'sldId'),\n );\n sldIdLst.children = [...nonSldIdChildren, ...newOrder];\n presPart.data = encode(serializeXml(doc));\n pres._slidesCache = null;\n};\n\n/**\n * Reverses the slide order across the whole deck. Built on\n * `sortSlides` for predictable rels behavior.\n */\nexport const reverseSlides = (pres: PresentationData): void => {\n const indexBy = new Map<SlideData, number>();\n for (const [i, slide] of getSlides(pres).entries()) indexBy.set(slide, i);\n sortSlides(pres, (a, b) => (indexBy.get(b) ?? 0) - (indexBy.get(a) ?? 0));\n};\n\n/**\n * Swaps the positions of the slides at `indexA` and `indexB`.\n * No-op when the indices are equal. Throws on out-of-range indices.\n * Implemented on top of `moveSlide` for predictable rels behavior.\n */\nexport const swapSlides = (pres: PresentationData, indexA: number, indexB: number): void => {\n if (indexA === indexB) return;\n const slides = getSlides(pres);\n const a = slides[indexA];\n const b = slides[indexB];\n if (!a) throw new RangeError(`swapSlides: indexA ${indexA} out of range (have ${slides.length})`);\n if (!b) throw new RangeError(`swapSlides: indexB ${indexB} out of range (have ${slides.length})`);\n // Move the lower-index slide to the higher index first so the\n // remaining slide stays at its original index.\n const [lo, hi] = indexA < indexB ? [indexA, indexB] : [indexB, indexA];\n moveSlide(pres, slides[lo]!, hi);\n // After the first move, the slide originally at hi is now at hi-1.\n const refreshed = getSlides(pres);\n moveSlide(pres, refreshed[hi - 1]!, lo);\n};\n\n/**\n * Reorders a slide. The slide's identity (part, rels, sldId) is\n * unchanged — only `<p:sldIdLst>`'s child order changes.\n */\nexport const moveSlide = (pres: PresentationData, slide: SlideData, toIndex: number): void => {\n const pkg = pres[INTERNAL_PACKAGE];\n const slideRelTarget = `slides/${basename(slide[SLIDE_PART_NAME])}`;\n const presRels = pkg.getRels(PRES_PART_NAME);\n if (!presRels) throw new Error('presentation.xml has no rels');\n const slideRel = presRels.items.find(\n (r) => r.type === REL_TYPES.slide && r.target === slideRelTarget,\n );\n if (!slideRel) throw new Error(`moveSlide: slide ${slide[SLIDE_PART_NAME]} has no rel`);\n\n const presPart = pkg.getPart(PRES_PART_NAME);\n if (!presPart) throw new Error('presentation.xml missing');\n const presDoc = parseXml(decode(presPart.data));\n const sldIdLst = firstChildElement(presDoc.root, NAME_SLD_ID_LST);\n if (!sldIdLst) throw new Error('presentation.xml has no <p:sldIdLst>');\n\n const sldIdElements = sldIdLst.children.filter(\n (c): c is XmlElement =>\n c.kind === 'element' && c.name.namespaceURI === NS.pml && c.name.localName === 'sldId',\n );\n const target = sldIdElements.find((e) => getAttrValue(e, ATTR_R_ID) === slideRel.id);\n if (!target) throw new Error(`moveSlide: <p:sldId> for ${slideRel.id} not found`);\n\n const remaining = sldIdLst.children.filter((c) => c !== target);\n const remainingSldIds = remaining.filter(\n (c): c is XmlElement =>\n c.kind === 'element' && c.name.namespaceURI === NS.pml && c.name.localName === 'sldId',\n );\n const clamped = Math.max(0, Math.min(toIndex, remainingSldIds.length));\n if (clamped === remainingSldIds.length) {\n remaining.push(target);\n } else {\n const before = remainingSldIds[clamped];\n const insertAt = before === undefined ? remaining.length : remaining.indexOf(before);\n remaining.splice(insertAt, 0, target);\n }\n sldIdLst.children = remaining;\n presPart.data = encode(serializeXml(presDoc));\n pres._slidesCache = null;\n};\n\n/**\n * Duplicates a slide. Returns the new `SlideData` appended to deck order.\n *\n * Part bytes and rels are cloned verbatim; media parts are NOT copied —\n * the duplicate shares the original's media references (PowerPoint\n * does the same).\n */\nexport const duplicateSlide = (pres: PresentationData, slide: SlideData): SlideData => {\n const pkg = pres[INTERNAL_PACKAGE];\n const sourcePartName = slide[SLIDE_PART_NAME];\n const sourcePart = pkg.getPart(sourcePartName);\n if (!sourcePart) throw new Error(`duplicateSlide: source ${sourcePartName} not found`);\n\n const presPart = pkg.getPart(PRES_PART_NAME);\n if (!presPart) throw new Error('presentation.xml missing');\n const presDoc = parseXml(decode(presPart.data));\n const sldIdLst = ensureSldIdLst(presDoc.root);\n const newSldId = allocateSldId(sldIdLst);\n\n const slideN = allocateSlideN(pkg);\n const newSlidePartName = partName(`/ppt/slides/slide${slideN}.xml`);\n pkg.addPart(newSlidePartName, sourcePart.contentType, new Uint8Array(sourcePart.data));\n\n const sourceRels = pkg.getRels(sourcePartName);\n if (sourceRels !== null) {\n pkg.setRels(newSlidePartName, { items: sourceRels.items.map((r) => ({ ...r })) });\n }\n\n const presRels = pkg.getRels(PRES_PART_NAME) ?? emptyRels();\n const newRId = nextRelId(presRels.items.map((r) => r.id));\n presRels.items.push({\n id: newRId,\n type: REL_TYPES.slide,\n target: `slides/slide${slideN}.xml`,\n targetMode: 'Internal',\n });\n pkg.setRels(PRES_PART_NAME, presRels);\n\n sldIdLst.children.push(\n elem(NAME_SLD_ID, {\n attrs: [attr(ATTR_ID, String(newSldId)), attr(ATTR_R_ID, newRId)],\n }),\n );\n presPart.data = encode(serializeXml(presDoc));\n\n pres._slidesCache = null;\n const slides = getSlides(pres);\n const dup = slides[slides.length - 1];\n if (!dup) throw new Error('duplicateSlide: post-condition failed');\n return dup;\n};\n\n/**\n * Convenience over `addSlide` + `moveSlide`. Inserts the new slide\n * at the given 0-based index (clamped to `[0, getSlides(pres).length]`).\n */\nexport const addSlideAt = (\n pres: PresentationData,\n atIndex: number,\n options: { layout: SlideLayoutData },\n): SlideData => {\n const slide = addSlide(pres, options);\n moveSlide(pres, slide, atIndex);\n const slides = getSlides(pres);\n const clamped = Math.max(0, Math.min(atIndex, slides.length - 1));\n return slides[clamped]!;\n};\n\n/**\n * Convenience over `duplicateSlide` + `moveSlide`. Duplicates `slide`\n * and inserts the duplicate at `atIndex` instead of at the end.\n */\nexport const duplicateSlideAt = (\n pres: PresentationData,\n atIndex: number,\n slide: SlideData,\n): SlideData => {\n const dup = duplicateSlide(pres, slide);\n moveSlide(pres, dup, atIndex);\n const slides = getSlides(pres);\n const clamped = Math.max(0, Math.min(atIndex, slides.length - 1));\n return slides[clamped]!;\n};\n\n// Collects every relationship id referenced (r:id / r:embed / r:link) anywhere\n// in `el`'s subtree. Relationship-typed attributes live in the officeDocRels\n// namespace regardless of local name.\nconst collectRelRefs = (el: XmlElement, into: Set<string>): void => {\n for (const a of el.attrs) {\n if (a.name.namespaceURI === NS.officeDocRels) into.add(a.value);\n }\n for (const c of el.children) {\n if (c.kind === 'element') collectRelRefs(c, into);\n }\n};\n\n// importSlide copies the body verbatim but only carries image + hyperlink rels\n// across (charts / diagrams / OLE are dropped in v1). A `<p:graphicFrame>` that\n// still points at a dropped rel would be a dangling r:id — PowerPoint reports\n// the whole package corrupt. Drop those frames so the imported slide stays valid\n// (a chart-less slide is the documented v1 behavior). Recurses through groups.\nconst pruneDanglingGraphicFrames = (el: XmlElement, keptRelIds: Set<string>): void => {\n el.children = el.children.filter((c) => {\n if (c.kind !== 'element') return true;\n if (c.name.namespaceURI === NS.pml && c.name.localName === 'graphicFrame') {\n const refs = new Set<string>();\n collectRelRefs(c, refs);\n for (const id of refs) {\n if (!keptRelIds.has(id)) return false;\n }\n }\n return true;\n });\n for (const c of el.children) {\n if (c.kind === 'element') pruneDanglingGraphicFrames(c, keptRelIds);\n }\n};\n\n/**\n * Imports a slide from another presentation into `targetPres`. The\n * slide's part bytes are copied verbatim; image rels are followed and\n * the linked media is copied into the target package with fresh part\n * names. The new slide is bound to the supplied `targetLayout` so it\n * still renders without the original deck's layouts.\n *\n * Limitations (v1):\n *\n * - Only `image` rels are copied across. Other rels (charts, embedded\n * workbooks, oleObjects, comments) are dropped from the imported\n * slide. A diagnostic message is appended for each dropped rel.\n * - Hyperlinks (external URLs) are preserved.\n * - Slide → notesSlide is dropped (notes don't follow imports).\n *\n * Returns the new `SlideData` appended to `targetPres`.\n */\nexport const importSlide = (\n targetPres: PresentationData,\n sourceSlide: SlideData,\n targetLayout: SlideLayoutData,\n): SlideData => {\n const sourcePkg = sourceSlide[INTERNAL_PACKAGE];\n const sourcePartName = sourceSlide[SLIDE_PART_NAME];\n const sourcePart = sourcePkg.getPart(sourcePartName);\n if (!sourcePart) throw new Error(`importSlide: source ${sourcePartName} not found`);\n const sourceRels = sourcePkg.getRels(sourcePartName);\n\n const targetPkg = targetPres[INTERNAL_PACKAGE];\n const presPart = targetPkg.getPart(PRES_PART_NAME);\n if (!presPart) throw new Error('presentation.xml missing in target');\n const presDoc = parseXml(decode(presPart.data));\n const sldIdLst = ensureSldIdLst(presDoc.root);\n const newSldId = allocateSldId(sldIdLst);\n\n const slideN = allocateSlideN(targetPkg);\n const newSlidePartName = partName(`/ppt/slides/slide${slideN}.xml`);\n\n // Copy the source slide bytes verbatim.\n targetPkg.addPart(newSlidePartName, sourcePart.contentType, new Uint8Array(sourcePart.data));\n\n // Build the new slide's rels:\n // - one slideLayout pointing at the supplied target layout\n // - one image rel per source image (with media imported)\n // - external hyperlink rels copied verbatim\n const newRels = emptyRels();\n const layoutPartName = targetLayout[LAYOUT_PART_NAME];\n if (targetPkg.getPart(layoutPartName) === null) {\n throw new Error(`importSlide: layout ${layoutPartName} not in target package`);\n }\n // The copied slide body keeps its original `r:embed` / `r:link` ids, so image\n // and hyperlink rels are preserved verbatim below. The layout rel is NOT\n // referenced from the body (PowerPoint resolves it by relationship type), so\n // we can give it any id — but it must not collide with a preserved source id.\n // Allocating past the source max keeps every rId on the new slide unique.\n const layoutRelId = nextRelId(sourceRels?.items.map((r) => r.id) ?? []);\n newRels.items.push({\n id: layoutRelId,\n type: REL_TYPES.slideLayout,\n target: `../slideLayouts/${basename(layoutPartName)}`,\n targetMode: 'Internal',\n });\n\n if (sourceRels !== null) {\n for (const rel of sourceRels.items) {\n if (rel.type === REL_TYPES.slideLayout) continue; // handled above\n if (rel.type === REL_TYPES.notesSlide) continue;\n if (rel.type === REL_TYPES.image && rel.targetMode === 'Internal') {\n // Copy the media part across with a fresh name.\n const mediaName = rel.target.startsWith('/')\n ? partName(rel.target)\n : resolveTarget(sourcePartName, rel.target);\n const mediaPart = sourcePkg.getPart(mediaName);\n if (!mediaPart) continue;\n const dotIdx = mediaName.lastIndexOf('.');\n const extension = dotIdx >= 0 ? mediaName.slice(dotIdx + 1) : 'bin';\n let nextN = 1;\n const re = /^\\/ppt\\/media\\/image(\\d+)\\./;\n for (const p of targetPkg.parts) {\n const m = p.name.match(re);\n if (m?.[1] !== undefined) {\n const n = Number.parseInt(m[1], 10);\n if (Number.isFinite(n) && n >= nextN) nextN = n + 1;\n }\n }\n const newMediaName = partName(`/ppt/media/image${nextN}.${extension}`);\n setOpcDefault(targetPkg, extension.toLowerCase(), mediaPart.contentType);\n targetPkg.addPart(newMediaName, mediaPart.contentType, new Uint8Array(mediaPart.data));\n newRels.items.push({\n id: rel.id,\n type: REL_TYPES.image,\n target: `../media/image${nextN}.${extension}`,\n targetMode: 'Internal',\n });\n continue;\n }\n if (rel.type === REL_TYPES.hyperlink) {\n newRels.items.push({ ...rel });\n continue;\n }\n // Other internal rels (chart/oleObject/etc) are dropped in v1.\n }\n }\n targetPkg.setRels(newSlidePartName, newRels);\n\n // The verbatim body may still reference a dropped rel (e.g. a chart frame's\n // `<c:chart r:id=\"rId2\"/>`). Strip any graphicFrame whose r:id is no longer in\n // the slide's rels so we never emit a dangling relationship. Only re-serialize\n // when there is actually a dangling reference, to keep the common (frame-less)\n // import byte-for-byte identical.\n const newPart = targetPkg.getPart(newSlidePartName);\n if (newPart) {\n const keptRelIds = new Set(newRels.items.map((r) => r.id));\n const bodyDoc = parseXml(decode(newPart.data));\n const bodyRefs = new Set<string>();\n collectRelRefs(bodyDoc.root, bodyRefs);\n let hasDangling = false;\n for (const id of bodyRefs) {\n if (!keptRelIds.has(id)) {\n hasDangling = true;\n break;\n }\n }\n if (hasDangling) {\n pruneDanglingGraphicFrames(bodyDoc.root, keptRelIds);\n newPart.data = encode(serializeXml(bodyDoc));\n }\n }\n\n // presentation → slide rel + sldIdLst entry.\n const presRels = targetPkg.getRels(PRES_PART_NAME) ?? emptyRels();\n const newRId = nextRelId(presRels.items.map((r) => r.id));\n presRels.items.push({\n id: newRId,\n type: REL_TYPES.slide,\n target: `slides/slide${slideN}.xml`,\n targetMode: 'Internal',\n });\n targetPkg.setRels(PRES_PART_NAME, presRels);\n\n sldIdLst.children.push(\n elem(NAME_SLD_ID, {\n attrs: [attr(ATTR_ID, String(newSldId)), attr(ATTR_R_ID, newRId)],\n }),\n );\n presPart.data = encode(serializeXml(presDoc));\n\n targetPres._slidesCache = null;\n const slides = getSlides(targetPres);\n const last = slides[slides.length - 1];\n if (!last) throw new Error('importSlide: post-condition failed');\n return last;\n};\n\n/**\n * Appends every slide from `sourcePres` into `targetPres`, in source\n * order. Built on top of `importSlide`: media is propagated, charts\n * are dropped (not yet supported across decks), and the slide's\n * layout is rebound to `targetLayout` on the target side.\n *\n * `targetLayout` can be a single layout used for every imported\n * slide (common), or a function called once per source slide for\n * per-slide layout selection.\n *\n * Returns the imported slides in target order.\n */\nexport const mergePresentations = (\n targetPres: PresentationData,\n sourcePres: PresentationData,\n targetLayout: SlideLayoutData | ((sourceSlide: SlideData, index: number) => SlideLayoutData),\n): ReadonlyArray<SlideData> => {\n const sourceSlides = getSlides(sourcePres);\n const out: SlideData[] = [];\n const resolveLayout =\n typeof targetLayout === 'function' ? targetLayout : (): SlideLayoutData => targetLayout;\n for (let i = 0; i < sourceSlides.length; i++) {\n const src = sourceSlides[i]!;\n const layout = resolveLayout(src, i);\n out.push(importSlide(targetPres, src, layout));\n }\n return out;\n};\n","// Group / ungroup shapes (`<p:grpSp>`).\n//\n// PowerPoint's \"Group\" command wraps a selection's shapes in a `<p:grpSp>`\n// whose transform maps a child coordinate space onto the slide. At\n// creation time the child space is set 1:1 with the group's own slide-space\n// bounds (`chOff == off`, `chExt == ext`) — see `group-builder.ts`. That\n// convention is what makes `ungroupShapes` a pure structural move in the\n// common case (no move/resize since grouping): children already carry\n// slide-space coordinates, so no rescale is needed. If the group *was*\n// subsequently moved or resized (its `off`/`ext` diverged from its\n// `chOff`/`chExt`), ungrouping rescales each child's own transform so it\n// keeps its on-slide position and size.\n\nimport {\n readPosition,\n readSize,\n setPosition as writePosition,\n setSize as writeSize,\n} from '../../internal/drawingml/index.ts';\nimport { buildGroup, readGroupChildren } from '../../internal/presentationml/index.ts';\nimport { type XmlElement } from '../../internal/xml/index.ts';\nimport {\n SHAPE_ELEMENT,\n SHAPE_SLIDE,\n SHAPE_SNAPSHOT,\n SLIDE_SHAPES,\n type SlideShapeData,\n} from '../_internal-symbols.ts';\nimport {\n commitSlideData,\n nextShapeId,\n rebuildShapesFromDocument,\n requireSpTree,\n} from './_helpers.ts';\nimport { getGroupTransform } from './shape-read-base.ts';\n\n/**\n * Groups two or more top-level shapes into a single `<p:grpSp>`,\n * returning the new group as a `SlideShapeData`. The group's\n * slide-space bounds are the union of its members' bounds; the members\n * keep their own relative position/size (nothing is rescaled). The\n * target slide is taken from the first shape — every shape must belong\n * to the same slide.\n *\n * Every shape must:\n * - belong to the same slide as the others,\n * - be a direct child of the slide's shape tree (not already nested\n * inside another group — ungroup first, then re-group),\n * - have an explicit `<a:xfrm>` (placeholders that inherit position\n * from the layout have none and can't be grouped),\n * - appear at most once in `shapes` (grouping the same shape twice\n * would duplicate its id).\n *\n * The group replaces its members at the position of the earliest one in\n * z-order, so grouping doesn't change how the selection stacks against\n * shapes that weren't part of it.\n */\nexport const groupShapes = (\n shapes: ReadonlyArray<SlideShapeData>,\n opts: { name?: string } = {},\n): SlideShapeData => {\n if (shapes.length < 2) {\n throw new Error('groupShapes: at least 2 shapes are required');\n }\n const slide = shapes[0]![SHAPE_SLIDE];\n const spTree = requireSpTree(slide);\n\n const elements: XmlElement[] = [];\n const seen = new Set<XmlElement>();\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n for (const shape of shapes) {\n if (shape[SHAPE_SLIDE] !== slide) {\n throw new Error('groupShapes: all shapes must belong to the same slide');\n }\n const el = shape[SHAPE_ELEMENT];\n if (seen.has(el)) {\n throw new Error(`groupShapes: shape \"${shape[SHAPE_SNAPSHOT].name}\" was passed twice`);\n }\n seen.add(el);\n if (!spTree.children.includes(el)) {\n throw new Error(\n `groupShapes: shape \"${shape[SHAPE_SNAPSHOT].name}\" is not a direct child of the ` +\n 'slide (it may already be inside a group)',\n );\n }\n const kind = shape[SHAPE_SNAPSHOT].kind;\n const pos = readPosition(el, kind);\n const size = readSize(el, kind);\n if (pos === null || size === null) {\n throw new Error(\n `groupShapes: shape \"${shape[SHAPE_SNAPSHOT].name}\" has no explicit position/size ` +\n \"(placeholders that inherit geometry from the layout can't be grouped)\",\n );\n }\n elements.push(el);\n minX = Math.min(minX, pos.x);\n minY = Math.min(minY, pos.y);\n maxX = Math.max(maxX, pos.x + size.w);\n maxY = Math.max(maxY, pos.y + size.h);\n }\n\n // Build the group element before touching `spTree.children` — it\n // validates the computed bounds as EMU coordinates and can throw. Doing\n // that after removing the members from the tree would leave the slide\n // missing shapes with no group to replace them.\n const grp = buildGroup({\n id: nextShapeId(slide),\n ...(opts.name !== undefined ? { name: opts.name } : {}),\n x: minX,\n y: minY,\n w: maxX - minX,\n h: maxY - minY,\n children: elements,\n });\n\n const insertAt = Math.min(...elements.map((el) => spTree.children.indexOf(el)));\n spTree.children = spTree.children.filter((c) => c.kind !== 'element' || !seen.has(c));\n spTree.children.splice(insertAt, 0, grp);\n\n commitSlideData(slide);\n rebuildShapesFromDocument(slide);\n const created = slide[SLIDE_SHAPES].find((s) => s[SHAPE_ELEMENT] === grp);\n if (!created) throw new Error('groupShapes: post-condition failed');\n return created;\n};\n\n/**\n * Reverses `groupShapes`: removes the `<p:grpSp>` and re-inserts its\n * immediate children as top-level shapes at the group's former position,\n * rescaling each child's own transform so it keeps its on-slide position\n * and size (matters when the group was moved/resized after creation, so\n * its `off`/`ext` diverged from its `chOff`/`chExt`). Returns the\n * children as fresh `SlideShapeData` handles, in their original order.\n *\n * Throws if `group` isn't a group shape, or its `<p:grpSpPr>` carries no\n * `<a:xfrm>` (malformed — every authored group has one).\n */\nexport const ungroupShapes = (group: SlideShapeData): ReadonlyArray<SlideShapeData> => {\n if (group[SHAPE_SNAPSHOT].kind !== 'group') {\n throw new Error('ungroupShapes: shape is not a group');\n }\n const transform = getGroupTransform(group);\n if (!transform) {\n throw new Error('ungroupShapes: group has no <a:xfrm> on <p:grpSpPr>');\n }\n const { outer, inner } = transform;\n const scaleX = inner.w === 0 ? 1 : outer.w / inner.w;\n const scaleY = inner.h === 0 ? 1 : outer.h / inner.h;\n\n const slide = group[SHAPE_SLIDE];\n const spTree = requireSpTree(slide);\n const groupEl = group[SHAPE_ELEMENT];\n const idx = spTree.children.indexOf(groupEl);\n if (idx < 0) throw new Error('ungroupShapes: group is not attached to the slide');\n\n const children = readGroupChildren(groupEl);\n const childElements = children.map((child) => {\n const pos = readPosition(child.element, child.kind);\n const size = readSize(child.element, child.kind);\n if (pos !== null && size !== null) {\n const newX = Math.round(outer.x + (pos.x - inner.x) * scaleX);\n const newY = Math.round(outer.y + (pos.y - inner.y) * scaleY);\n writePosition(child.element, child.kind, newX, newY);\n writeSize(\n child.element,\n child.kind,\n Math.round(size.w * scaleX),\n Math.round(size.h * scaleY),\n );\n }\n return child.element;\n });\n\n spTree.children.splice(idx, 1, ...childElements);\n\n commitSlideData(slide);\n rebuildShapesFromDocument(slide);\n const byElement = new Map(slide[SLIDE_SHAPES].map((s) => [s[SHAPE_ELEMENT], s] as const));\n return childElements.map((el) => {\n const found = byElement.get(el);\n if (!found) throw new Error('ungroupShapes: post-condition failed');\n return found;\n });\n};\n","// Public API surface. The only directory users are intended to import from.\n//\n// pptx-kit exposes a single tree-shakeable free-function API\n// (`loadPresentation`, `savePresentation`, `addSlide`, ...). Importing\n// only what you use lets modern bundlers drop the rest. See\n// `test/tree-shake.test.ts` for the CI guard.\n\nexport { type Emu, cm, emu, inches, mm, pt } from './units.ts';\n\n// Tree-shakeable free-function API.\nexport type {\n PresentationData,\n SlideCommentData,\n SlideData,\n SlideLayoutData,\n SlideShapeData,\n TableCellData,\n} from './_internal-symbols.ts';\nexport type {\n CommentAuthor,\n CommentPosition,\n SlideComment,\n} from '../internal/presentationml/index.ts';\nexport type { PresentationInput, PresentationSize, SlideSize } from './fn.ts';\nexport { SLIDE_SIZE_4_3, SLIDE_SIZE_16_9, SLIDE_SIZE_16_10 } from './fn.ts';\nexport type { ImageFormat } from '../internal/opc/index.ts';\nexport type {\n ChartAxisScaling,\n ChartDataLabels,\n ChartGrouping,\n ChartKind,\n ChartDataLabelPosition,\n ChartSeries,\n ChartSpec,\n ChartTextStyle,\n ChartTrendline,\n} from '../internal/chartml/index.ts';\nexport type { SlideChartData } from './fn.ts';\nexport type { ShapeClickAction } from './fn.ts';\nexport type { IssueSeverity, ValidationIssue } from './fn.ts';\nexport type { AnimationEffect, AnimationOptions } from './fn.ts';\nexport type { ImageCrop } from './fn.ts';\nexport type { ImageFit } from './fn.ts';\nexport type {\n ArrowOptions,\n GlowOptions,\n GradientFillOptions,\n GradientStop,\n LineDash,\n LineEndSize,\n LineEndType,\n PatternFillOptions,\n PatternPreset,\n ShadowOptions,\n} from '../internal/drawingml/index.ts';\nexport type {\n AllShapesEntry,\n CoreProperties,\n CustomGeometry,\n ExtendedProperties,\n GeomCommand,\n GeomPath,\n GeomPoint,\n MediaPart,\n PackagePartInfo,\n PathFillMode,\n PresentationChartEntry,\n PresentationCommentEntry,\n PresentationFonts,\n PresentationFontsInput,\n PresentationHyperlinkEntry,\n PresentationImageEntry,\n PresentationNotesEntry,\n PresentationSummary,\n PresentationTableEntry,\n PresentationTheme,\n TableCellBorder,\n TableCellBorders,\n PresentationThumbnail,\n ShapeBounds,\n ShapeEffect,\n ShapeEffectAny,\n ShapeFill,\n ShapeStroke,\n SlideBackground,\n SlideLayoutBackgroundShape,\n SlideInfo,\n SlideLayoutPlaceholder,\n SlideOutlineEntry,\n SlideSection,\n TextAnchor,\n TextAutoFit,\n TextWrap,\n} from './fn.ts';\nexport {\n _internalPackageOf,\n addBlankSlide,\n addContentSlide,\n addSectionHeaderSlide,\n addSlide,\n addSlideAt,\n addSlideChart,\n bringShapeForward,\n bringShapeToFront,\n centerShapeOnSlide,\n addSlideComment,\n addSlideImage,\n addSlideLine,\n addSlideShape,\n addSlideTable,\n addSlideTextBox,\n addTitleSlide,\n appendShapeText,\n appendSlideNotes,\n clearShapeEffects,\n clearShapeFill,\n clearAllHyperlinks,\n clearAllSlideComments,\n clearAllSlideNotes,\n clearShapeStroke,\n clearSlideAnimations,\n clearSlideBackground,\n clearSlideComments,\n clearSlideHyperlinks,\n clearSlideShapes,\n clearSlideTransition,\n clearTableCellFill,\n compactPackage,\n copyShape,\n createPresentation,\n duplicateSlide,\n duplicateSlideAt,\n findChartByKind,\n findChartsBySeriesName,\n findChartsWithDataLabels,\n findChartsWithTrendlines,\n findCommentAuthorByName,\n findCommentsAfter,\n findCommentsBefore,\n findCommentsByAuthor,\n findCommentsByText,\n findEmptyPlaceholders,\n findLayoutsWithPlaceholderType,\n findFlippedShapes,\n findOverlappingShapePairs,\n findShapeById,\n findShapeByName,\n findShapeByText,\n findShapeInPresentation,\n findShapesByEffect,\n findShapesByHyperlink,\n findShapesInRect,\n findShapesWithAnimation,\n findShapesWithHyperlinks,\n findSlidesWithChartKind,\n findSlidesWithChartTrendlines,\n findShapesByKind,\n findShapesByName,\n findShapesByPreset,\n findShapesAtPoint,\n findShapesByText,\n findShapesOutsideCanvas,\n findSlideByPartName,\n findSlideByText,\n findSlideByTitle,\n findSlideLayout,\n findSlideLayoutByPartName,\n findSlideLayoutByType,\n findSlidePlaceholder,\n findSlidePlaceholderByIdx,\n findSlidePlaceholders,\n findSlidesByHyperlink,\n findSlidesByLayoutName,\n findSlidesByLayoutPartName,\n findSlidesByLayoutType,\n findSlidesByNotes,\n findSlidesByText,\n findSlidesWithCommentsByAuthor,\n getAllCharts,\n getAllComments,\n getAllHyperlinks,\n getAllImages,\n getAllNotes,\n getAllShapes,\n getAllTables,\n getCommentAuthor,\n getCommentAuthors,\n getCommentDate,\n getCommentPosition,\n getCommentSlide,\n getCommentText,\n getCommentsSortedByDate,\n getCoreProperties,\n getDistinctHyperlinkUrls,\n getEffectiveColorMap,\n getEmptySlides,\n getGroupChildren,\n getGroupTransform,\n groupShapes,\n ungroupShapes,\n getHiddenSlides,\n getExtendedProperties,\n getParagraphAlignment,\n getParagraphBullet,\n getParagraphBulletStyle,\n getParagraphBulletImageBytes,\n getParagraphIndent,\n getParagraphLevel,\n getParagraphLineSpacing,\n getParagraphPropertiesEffective,\n getParagraphSpacing,\n getShapeAdjustValues,\n getShapeAltTitle,\n getShapeAnimation,\n getShapeAt,\n getShapeBounds,\n getShapeBodyPrEffective,\n getShapeBoundsResolved,\n getShapeCenter,\n getShapeChartCategories,\n getShapeChartKind,\n getShapeChartSeriesNames,\n getShapeChartSeriesValues,\n getShapeChartSpec,\n getShapeClickAction,\n getShapeCustomGeometry,\n getShapeDescription,\n getShapeEffect,\n getShapeEffects,\n getShapeEffectsEffective,\n getShapeFill,\n getShapeFillEffective,\n getShapeGradientFill,\n getShapeGradientFillEffective,\n getShapeFillColor,\n getShapeFillColorResolved,\n getShapeFlip,\n getShapeHyperlink,\n getShapeHyperlinkTooltip,\n getShapeId,\n getShapeImageBiLevelThreshold,\n getShapeImageBrightness,\n getShapeImageBytes,\n getShapeImageContrast,\n getShapeImageCrop,\n getShapeImageDuotone,\n getShapeImageFillBytes,\n getShapeImageFormat,\n getShapeImageLinkUrl,\n getShapeImageOpacity,\n getShapeImagePartName,\n getShapeIndex,\n getShapeKind,\n getShapeName,\n getShapePatternFill,\n getShapeParagraphCount,\n getShapeParagraphElements,\n getShapePlaceholderIdx,\n getShapePreset,\n getMaxShapeId,\n getMaxShapeIdInPresentation,\n getMediaParts,\n getOrphanMediaPartNames,\n getOutlineText,\n getPackageSize,\n getPresentationChartCountsBySlide,\n getPresentationChartKindCounts,\n getPresentationCommentCountsByAuthor,\n getPresentationCommentCountsBySlide,\n getPresentationCommenters,\n getPresentationCreated,\n getPresentationFonts,\n getPresentationModified,\n getPresentationSummary,\n getPresentationNotesLength,\n getPresentationNotesLengthsBySlide,\n getPresentationNotesText,\n getPresentationHyperlinkCountsBySlide,\n getPresentationImageCountsBySlide,\n getPresentationShapeCountsBySlide,\n getPresentationTableCountsBySlide,\n getPresentationText,\n getPresentationTextLength,\n getPresentationTextLengthsBySlide,\n getPresentationTheme,\n getShapePlaceholderType,\n getShapePosition,\n getShapeRotation,\n getShapeRunClickAction,\n getShapeRunCount,\n getShapeRunFormat,\n getShapeRunFormatEffective,\n getShapeRunHyperlink,\n getShapeRunHyperlinkTooltip,\n getShapeRunText,\n getShapeSize,\n getShapesBounds,\n getShapeSlide,\n getShapeStroke,\n getShapeStrokeEffective,\n getShapeStrokeArrow,\n getShapeStrokeCap,\n getShapeStrokeColor,\n getShapeStrokeColorResolved,\n getShapeStrokeCompound,\n getShapeStrokeDash,\n getShapeStrokeJoin,\n getShapeStrokeWidth,\n getShapeText,\n getShapeTextAnchor,\n getShapeTextAutoFitParams,\n getShapeTextAutoFit,\n getShapeTextBodyRotationDeg,\n getShapeTextColumns,\n getShapeTextDirection,\n getShapeTextMargins,\n getShapeTextWrap,\n getShapeXmlString,\n getShapeZIndex,\n getSlideAt,\n getSlideBackground,\n getSlideBackgroundGradientFill,\n getSlideBackgroundImageBytes,\n getSlideBackgroundPatternFill,\n getSlideBody,\n getSlideCharts,\n getSlideColorMapOverride,\n getSlideCommentAuthors,\n getSlideComments,\n getSlideCount,\n getSlideIndex,\n getSlideInfo,\n getSlideLayout,\n getSlideLayoutBackground,\n getSlideLayoutBackgroundGradientFill,\n getSlideLayoutBackgroundImageBytes,\n getSlideLayoutBackgroundPatternFill,\n getSlideLayoutBackgroundShapes,\n getSlideLayoutCount,\n getSlideLayoutName,\n getSlideLayoutPartName,\n getSlideLayoutPlaceholders,\n getSlideLayoutShapes,\n getSlideLayouts,\n getSlideLayoutType,\n getSlideLayoutUsageCounts,\n getSlideLayoutUsageCountsByType,\n getUnusedSlideLayouts,\n getUnusedSlideMasters,\n getSlideMasterBackground,\n getSlideMasterShapes,\n getSlideMasterBackgroundGradientFill,\n getSlideMasterBackgroundImageBytes,\n getSlideMasterBackgroundPatternFill,\n getSlideMasterCount,\n getSlideMasterPartName,\n getSlideMasterPartNames,\n getSlideMasterUsageCounts,\n getSlideMediaPartNames,\n getSlideNotes,\n getSlideNotesLength,\n getSlideOutline,\n getSlidePartName,\n getSlideSections,\n getSlideShapes,\n getSlideTables,\n getSlideSize,\n getSlideText,\n getSlideTextLength,\n getSlideTitle,\n getSlideTransition,\n getSlideXmlString,\n getSlides,\n getSlidesByLayout,\n getSlidesWithCharts,\n getSlidesWithComments,\n getSlidesWithEmptyPlaceholders,\n getSlidesWithHyperlinks,\n getSlidesWithImages,\n getSlidesWithNotes,\n getSlidesWithOverlap,\n getSlidesWithTables,\n getTableCell,\n getTableCellAlignment,\n getTableCellAnchor,\n getTableCellBorders,\n getTableCellFill,\n getTableCellMargins,\n getTableCellParagraphs,\n getTableCellPosition,\n getTableCellSpan,\n getTableCellText,\n getTableCellTextDirection,\n hasShapeImage,\n getTableCells,\n getTableColumnWidths,\n getTableDimensions,\n getTableRowHeights,\n getTableSize,\n getTableStyleFlags,\n getTableStyleId,\n mergeTableCells,\n getThumbnail,\n getVisibleSlides,\n hasShapeText,\n hasSlideNotes,\n importSlide,\n incrementRevision,\n insertTableColumn,\n insertTableRow,\n isChartShape,\n isParagraphBulletPicture,\n isShapeHidden,\n isShapeImageGrayscale,\n isShapePlaceholder,\n isShapeTextBox,\n isSlideHidden,\n isTableShape,\n listPackageParts,\n loadPresentation,\n mergePresentations,\n moveSlide,\n readPackagePart,\n removeShape,\n removeSlide,\n removeSlideComment,\n removeSlideNotes,\n removeThumbnail,\n removeTableColumn,\n removeTableRow,\n renameShape,\n replaceHyperlink,\n resolveDeckBodyTextColor,\n resolveDrawingColor,\n replaceTextInNotes,\n replaceTextInPresentation,\n replaceTextInSlide,\n replaceTextInSlideNotes,\n replaceTokensInPresentation,\n replaceTokensInSlide,\n reverseSlides,\n savePresentation,\n searchSlides,\n sendShapeBackward,\n sendShapeToBack,\n setChartSpec,\n setCoreProperties,\n setExtendedProperties,\n setMediaPartBytes,\n setShapeAlignment,\n setShapeAltTitle,\n setShapeAnimation,\n setShapeBounds,\n setShapeBullets,\n setShapeFill,\n setShapeFlip,\n setShapeGlow,\n setShapeGradientFill,\n setShapeHidden,\n setShapeShadow,\n setShapeHyperlink,\n setShapeImage,\n setShapeImageBrightness,\n setShapeImageContrast,\n setShapeImageCrop,\n setShapeImageFill,\n setShapeImageOpacity,\n setShapeClickAction,\n setShapeDescription,\n setShapeNoFill,\n setShapeNoStroke,\n setShapePatternFill,\n setParagraphAlignment,\n setParagraphBullet,\n setParagraphLevel,\n setParagraphLineSpacing,\n setParagraphSpacing,\n setShapePosition,\n setShapeRotation,\n setShapeRunFormat,\n setShapeRunHyperlink,\n setShapeRunText,\n setShapeSize,\n setShapeStroke,\n setShapeStrokeArrow,\n setShapeStrokeCap,\n setShapeStrokeCompound,\n setShapeStrokeDash,\n setShapeStrokeJoin,\n setShapeText,\n setShapeTextAnchor,\n setShapeTextAutoFit,\n setShapeTextBodyRotationDeg,\n setShapeTextColumns,\n setShapeTextDirection,\n setShapeTextFormat,\n setShapeTextMargins,\n setShapeTextWrap,\n setShapeZIndex,\n setPresentationFonts,\n setPresentationTheme,\n setSlideBackground,\n setSlideBackgroundImage,\n setSlideBody,\n setSlideHidden,\n setSlideLayout,\n setSlideNotes,\n setSlidePlaceholders,\n setSlideSections,\n setSlideSize,\n setSlideTitle,\n setSlideTransition,\n setTableCellAlignment,\n setTableCellAnchor,\n setTableCellBorders,\n setTableCellFill,\n setTableCellMargins,\n setTableCellText,\n setTableCellTextDirection,\n setTableCellTextFormat,\n setTableColumnWidth,\n setTableRowHeight,\n setTableStyleFlags,\n setTableStyleId,\n setThumbnail,\n pointInShape,\n shapesOverlap,\n slideHasAnimations,\n slidesUsingMediaPart,\n sortSlides,\n swapSlides,\n touchModified,\n translateShapes,\n validatePresentation,\n} from './fn.ts';\n\nexport type { BulletStyle, ParagraphAlignment, TextFormat } from '../internal/drawingml/index.ts';\nexport type { ParagraphProperties, ShapeParagraphElement } from './fn.ts';\nexport type { TableCellParagraph } from './fn.ts';\nexport type {\n PresetShape,\n TransitionEffect,\n TransitionOptions,\n} from '../internal/presentationml/index.ts';\n\n// Library version. Replaced at build time by the package version\n// via the `__PPTX_KIT_VERSION__` define in tsdown.config.ts. The literal\n// fallback is only reached when running source directly (vitest / tsx).\ndeclare const __PPTX_KIT_VERSION__: string;\nexport const VERSION =\n typeof __PPTX_KIT_VERSION__ === 'string' ? __PPTX_KIT_VERSION__ : '0.0.0-dev';\n"],"mappings":"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"}
|