@office-kit/pptx 0.18.1 → 0.18.2
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 +10 -0
- package/dist/{api-DlzYhUxG.js → api-CXMliYZu.js} +56 -28
- package/dist/api-CXMliYZu.js.map +1 -0
- package/dist/{index-CAPRpjn2.d.ts → index-C7AWT-mg.d.ts} +21 -19
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/node.d.ts +1 -1
- package/dist/node.js +1 -1
- package/package.json +1 -1
- package/dist/api-DlzYhUxG.js.map +0 -1
package/dist/api-DlzYhUxG.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api-DlzYhUxG.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_SRGB_CLR","NAME_SCHEME_CLR","ATTR_VAL","NAME_RPR","NAME_SOLID_FILL","NAME_SRGB_CLR","NAME_SCHEME_CLR","ATTR_TYPEFACE","ATTR_VAL","setSolidFill","NAME_BU_NONE","ATTR_TYPEFACE","NAME_P","NAME_R","NAME_T","NAME_RPR","NAME_PPR","ATTR_ALGN","ATTR_MAR_L","ATTR_INDENT","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_FMLA","ATTR_X","ATTR_Y","ATTR_W","ATTR_H","ATTR_FILL","NAME_AV_LST","NAME_RPR","NAME_HLINK_CLICK","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_PRST_GEOM","NAME_AV_LST","ATTR_NAME","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_NV_PIC_PR","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_R_EMBED","ATTR_NO_CHANGE_ASPECT","NAME_C_NV_PR","NAME_NV_PR","NAME_EXT_LST","NAME_EXT","NAME_TIMING","NAME_TN_LST","NAME_PAR","NAME_C_TN","NAME_CHILD_TN_LST","NAME_ST_COND_LST","NAME_COND","NAME_TGT_EL","NAME_SP_TGT","ATTR_R_ID","ATTR_URI","ATTR_ID","ATTR_DUR","ATTR_RESTART","ATTR_NODE_TYPE","ATTR_FILL","ATTR_DELAY","ATTR_SPID","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_TIMING","NAME_TN_LST","NAME_PAR","NAME_C_TN","NAME_CHILD_TN_LST","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","TIME_UNITS","NS_C","NS_A","ATTR_VAL","ATTR_IDX","validateLineWidthEmu","lineWidthEmu","exhaustive","NAME_SOLID_FILL","NAME_A_RPR","NAME_A_DEF_RPR","NAME_A_PPR","decode","decode","encode","decode","NAME_A_END_PARA_RPR","NAME_P_NV_SP_PR","NAME_TX_BODY","decode","decode","decode","textNode","encode","ATTR_ID","decode","encode","decode","encode","emuValue","NAME_EXT_LST","NAME_TX_BODY","writeAdjustValues","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/opc/media-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/bounds.ts","../src/internal/enum-values.ts","../src/internal/drawingml/color.ts","../src/internal/drawingml/text-format.ts","../src/internal/drawingml/text-body-mutation.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/media-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/enum-validation.ts","../src/internal/chartml/embedded-xlsx.ts","../src/internal/chartml/sheet-layout.ts","../src/internal/chartml/chart-builder.ts","../src/internal/chartml/chart-reader.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/_media-timing.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/internal/parts/duplicate-graph.ts","../src/api/fn/slide-deck.ts","../src/api/fn/shape-grouping.ts","../src/api/fn/media.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 'webm',\n 'ogg',\n 'wma',\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 (NEL / LS). XML 1.0 §2.11 end-of-line\n// handling is applied: CR LF and a lone CR read as LF, while ` `\n// still yields a CR.\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 // XML 1.0 §2.11: normalize line ends before tokenizing so a raw CR LF\n // (pptxgenjs writes one inside <a:t>) reads as the LF a conforming\n // parser hands the application. Character references are decoded later,\n // so ` ` is untouched and still yields a CR.\n const cur: Cursor = { src: stripped.replace(/\\r\\n?/g, '\\n'), 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 characters outside the XML 1.0 Char production.\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 §2.2 excludes C0 controls other than tab / LF / CR, U+FFFE,\n// U+FFFF, and unpaired surrogates. Numeric references cannot rescue them.\n// Iterate by code point so valid surrogate pairs remain legal supplementary\n// characters, while lone surrogates are rejected before UTF-8 replaces them.\nconst rejectForbiddenChar = (c: number): void => {\n const control = c < 0x20 && c !== 0x09 && c !== 0x0a && c !== 0x0d;\n if (control || (c >= 0xd800 && c <= 0xdfff) || c === 0xfffe || c === 0xffff) {\n const hex = c.toString(16).toUpperCase().padStart(4, '0');\n const kind = control ? 'control character' : 'character';\n throw new Error(\n `XML-illegal ${kind} U+${hex} in text; strip ${control ? 'control' : 'illegal'} 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 (const char of s) {\n const c = char.codePointAt(0)!;\n rejectForbiddenChar(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 += char;\n }\n return out;\n};\n\nconst escapeText = (s: string): string => {\n let out = '';\n for (const char of s) {\n const c = char.codePointAt(0)!;\n rejectForbiddenChar(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 += char;\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","// Video / audio container detection from raw bytes, plus the content type each\n// container is registered under. Counterpart of `image-format.ts`.\n//\n// A format token doubles as the part's file extension. Detection is by\n// container signature only — we never look at the codecs inside, so whether\n// the clip actually plays depends on the codecs the viewer has installed.\n\nexport type VideoFormat = 'mp4' | 'm4v' | 'mov' | 'webm' | 'avi' | 'wmv';\nexport type AudioFormat = 'mp3' | 'wav' | 'm4a' | 'ogg' | 'wma';\n\nconst VIDEO_CONTENT_TYPES: Readonly<Record<VideoFormat, string>> = {\n mp4: 'video/mp4',\n // PowerPoint registers .m4v under the mp4 type rather than video/x-m4v.\n m4v: 'video/mp4',\n mov: 'video/quicktime',\n webm: 'video/webm',\n avi: 'video/x-msvideo',\n wmv: 'video/x-ms-wmv',\n};\n\nconst AUDIO_CONTENT_TYPES: Readonly<Record<AudioFormat, string>> = {\n mp3: 'audio/mpeg',\n // PowerPoint writes the legacy `x-wav` token, not RFC 2361's `audio/wav`.\n wav: 'audio/x-wav',\n m4a: 'audio/mp4',\n ogg: 'audio/ogg',\n wma: 'audio/x-ms-wma',\n};\n\nexport const contentTypeForVideoFormat = (format: VideoFormat): string =>\n VIDEO_CONTENT_TYPES[format];\nexport const contentTypeForAudioFormat = (format: AudioFormat): string =>\n AUDIO_CONTENT_TYPES[format];\n\nconst hasBytesAt = (bytes: Uint8Array, at: number, signature: ReadonlyArray<number>): boolean => {\n if (bytes.length < at + signature.length) return false;\n for (let i = 0; i < signature.length; i++) {\n if (bytes[at + i] !== signature[i]) return false;\n }\n return true;\n};\n\nconst hasAsciiAt = (bytes: Uint8Array, at: number, text: string): boolean =>\n hasBytesAt(\n bytes,\n at,\n Array.from(text, (ch) => ch.charCodeAt(0)),\n );\n\n// ISO base media (mp4 / mov / m4a / m4v): a `ftyp` box first, major brand at 8.\nconst isoBrand = (bytes: Uint8Array): string | null =>\n hasAsciiAt(bytes, 4, 'ftyp') && bytes.length >= 12\n ? String.fromCharCode(bytes[8]!, bytes[9]!, bytes[10]!, bytes[11]!)\n : null;\n\nconst isRiff = (bytes: Uint8Array, form: string): boolean =>\n hasAsciiAt(bytes, 0, 'RIFF') && hasAsciiAt(bytes, 8, form);\n\n// ASF header object GUID — the container of both .wmv and .wma. The two are\n// byte-identical at this level, so the caller's video/audio intent decides.\nconst ASF_HEADER = [0x30, 0x26, 0xb2, 0x75, 0x8e, 0x66, 0xcf, 0x11];\n\nconst EBML_HEADER = [0x1a, 0x45, 0xdf, 0xa3];\n// The EBML DocType string sits within the first few dozen bytes of the header.\nconst EBML_DOCTYPE_WINDOW = 64;\nconst isWebm = (bytes: Uint8Array): boolean => {\n if (!hasBytesAt(bytes, 0, EBML_HEADER)) return false;\n // Matroska (.mkv) shares the EBML magic; only the DocType tells them apart.\n const limit = Math.min(bytes.length, EBML_DOCTYPE_WINDOW) - 4;\n for (let i = 4; i <= limit; i++) {\n if (hasAsciiAt(bytes, i, 'webm')) return true;\n }\n return false;\n};\n\n/** Detects a video container, or `null` when no known signature matches. */\nexport const detectVideoFormat = (bytes: Uint8Array): VideoFormat | null => {\n const brand = isoBrand(bytes);\n if (brand !== null) {\n if (brand === 'qt ') return 'mov';\n if (brand === 'M4V ') return 'm4v';\n return 'mp4';\n }\n if (isWebm(bytes)) return 'webm';\n if (isRiff(bytes, 'AVI ')) return 'avi';\n if (hasBytesAt(bytes, 0, ASF_HEADER)) return 'wmv';\n return null;\n};\n\n/** Detects an audio container, or `null` when no known signature matches. */\nexport const detectAudioFormat = (bytes: Uint8Array): AudioFormat | null => {\n if (isoBrand(bytes) !== null) return 'm4a';\n if (isRiff(bytes, 'WAVE')) return 'wav';\n if (hasAsciiAt(bytes, 0, 'OggS')) return 'ogg';\n if (hasBytesAt(bytes, 0, ASF_HEADER)) return 'wma';\n // MP3: an ID3v2 tag, or a bare MPEG audio frame (11 set sync bits).\n if (hasAsciiAt(bytes, 0, 'ID3')) return 'mp3';\n if (bytes.length >= 2 && bytes[0] === 0xff && (bytes[1]! & 0xe0) === 0xe0) return 'mp3';\n return null;\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).\n//\n// The per-script `<a:font script=\"…\">` lists in majorFont / minorFont do not\n// come from that fixture — they are the standard Office theme lists (47\n// entries each), transcribed verbatim. They are what a renderer consults for\n// a script the run names no face for: under this theme a Thai run resolves to\n// Cordia New (minor) or Angsana New (major) rather than to whatever the\n// renderer would pick on its own. CT_FontCollection orders them after\n// latin / ea / cs. `test/fn-create-presentation.test.ts` pins both lists\n// entry by entry.\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:font script=\"Jpan\" typeface=\"游ゴシック Light\"/><a:font script=\"Hang\" typeface=\"맑은 고딕\"/><a:font script=\"Hans\" typeface=\"等线 Light\"/><a:font script=\"Hant\" typeface=\"新細明體\"/><a:font script=\"Arab\" typeface=\"Times New Roman\"/><a:font script=\"Hebr\" typeface=\"Times New Roman\"/><a:font script=\"Thai\" typeface=\"Angsana New\"/><a:font script=\"Ethi\" typeface=\"Nyala\"/><a:font script=\"Beng\" typeface=\"Vrinda\"/><a:font script=\"Gujr\" typeface=\"Shruti\"/><a:font script=\"Khmr\" typeface=\"MoolBoran\"/><a:font script=\"Knda\" typeface=\"Tunga\"/><a:font script=\"Guru\" typeface=\"Raavi\"/><a:font script=\"Cans\" typeface=\"Euphemia\"/><a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/><a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/><a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/><a:font script=\"Thaa\" typeface=\"MV Boli\"/><a:font script=\"Deva\" typeface=\"Mangal\"/><a:font script=\"Telu\" typeface=\"Gautami\"/><a:font script=\"Taml\" typeface=\"Latha\"/><a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Orya\" typeface=\"Kalinga\"/><a:font script=\"Mlym\" typeface=\"Kartika\"/><a:font script=\"Laoo\" typeface=\"DokChampa\"/><a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/><a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/><a:font script=\"Viet\" typeface=\"Times New Roman\"/><a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/><a:font script=\"Geor\" typeface=\"Sylfaen\"/><a:font script=\"Armn\" typeface=\"Arial\"/><a:font script=\"Bugi\" typeface=\"Leelawadee UI\"/><a:font script=\"Bopo\" typeface=\"Microsoft JhengHei\"/><a:font script=\"Java\" typeface=\"Javanese Text\"/><a:font script=\"Lisu\" typeface=\"Segoe UI\"/><a:font script=\"Mymr\" typeface=\"Myanmar Text\"/><a:font script=\"Nkoo\" typeface=\"Ebrima\"/><a:font script=\"Olck\" typeface=\"Nirmala UI\"/><a:font script=\"Osma\" typeface=\"Ebrima\"/><a:font script=\"Phag\" typeface=\"Phagspa\"/><a:font script=\"Syrn\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Syrj\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Syre\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Sora\" typeface=\"Nirmala UI\"/><a:font script=\"Tale\" typeface=\"Microsoft Tai Le\"/><a:font script=\"Talu\" typeface=\"Microsoft New Tai Lue\"/><a:font script=\"Tfng\" typeface=\"Ebrima\"/></a:majorFont><a:minorFont><a:latin typeface=\"Calibri\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/><a:font script=\"Jpan\" typeface=\"游ゴシック\"/><a:font script=\"Hang\" typeface=\"맑은 고딕\"/><a:font script=\"Hans\" typeface=\"等线\"/><a:font script=\"Hant\" typeface=\"新細明體\"/><a:font script=\"Arab\" typeface=\"Arial\"/><a:font script=\"Hebr\" typeface=\"Arial\"/><a:font script=\"Thai\" typeface=\"Cordia New\"/><a:font script=\"Ethi\" typeface=\"Nyala\"/><a:font script=\"Beng\" typeface=\"Vrinda\"/><a:font script=\"Gujr\" typeface=\"Shruti\"/><a:font script=\"Khmr\" typeface=\"DaunPenh\"/><a:font script=\"Knda\" typeface=\"Tunga\"/><a:font script=\"Guru\" typeface=\"Raavi\"/><a:font script=\"Cans\" typeface=\"Euphemia\"/><a:font script=\"Cher\" typeface=\"Plantagenet Cherokee\"/><a:font script=\"Yiii\" typeface=\"Microsoft Yi Baiti\"/><a:font script=\"Tibt\" typeface=\"Microsoft Himalaya\"/><a:font script=\"Thaa\" typeface=\"MV Boli\"/><a:font script=\"Deva\" typeface=\"Mangal\"/><a:font script=\"Telu\" typeface=\"Gautami\"/><a:font script=\"Taml\" typeface=\"Latha\"/><a:font script=\"Syrc\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Orya\" typeface=\"Kalinga\"/><a:font script=\"Mlym\" typeface=\"Kartika\"/><a:font script=\"Laoo\" typeface=\"DokChampa\"/><a:font script=\"Sinh\" typeface=\"Iskoola Pota\"/><a:font script=\"Mong\" typeface=\"Mongolian Baiti\"/><a:font script=\"Viet\" typeface=\"Arial\"/><a:font script=\"Uigh\" typeface=\"Microsoft Uighur\"/><a:font script=\"Geor\" typeface=\"Sylfaen\"/><a:font script=\"Armn\" typeface=\"Arial\"/><a:font script=\"Bugi\" typeface=\"Leelawadee UI\"/><a:font script=\"Bopo\" typeface=\"Microsoft JhengHei\"/><a:font script=\"Java\" typeface=\"Javanese Text\"/><a:font script=\"Lisu\" typeface=\"Segoe UI\"/><a:font script=\"Mymr\" typeface=\"Myanmar Text\"/><a:font script=\"Nkoo\" typeface=\"Ebrima\"/><a:font script=\"Olck\" typeface=\"Nirmala UI\"/><a:font script=\"Osma\" typeface=\"Ebrima\"/><a:font script=\"Phag\" typeface=\"Phagspa\"/><a:font script=\"Syrn\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Syrj\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Syre\" typeface=\"Estrangelo Edessa\"/><a:font script=\"Sora\" typeface=\"Nirmala UI\"/><a:font script=\"Tale\" typeface=\"Microsoft Tai Le\"/><a:font script=\"Talu\" typeface=\"Microsoft New Tai Lue\"/><a:font script=\"Tfng\" typeface=\"Ebrima\"/></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>@office-kit/pptx</dc:creator><cp:lastModifiedBy>@office-kit/pptx</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>@office-kit/pptx</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 (`@office-kit/pptx` → dist/index.js) and the Node entry\n// (`@office-kit/pptx/node` → dist/node.js) are distinct bundles, each with its own\n// copy of this file; companion packages (e.g. `@office-kit/pptx-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 `@office-kit/pptx.` 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('@office-kit/pptx.package');\nexport const SLIDE_PART_NAME = Symbol.for('@office-kit/pptx.slide.partName');\nexport const SLIDE_DOCUMENT = Symbol.for('@office-kit/pptx.slide.document');\nexport const SLIDE_PART = Symbol.for('@office-kit/pptx.slide.part');\nexport const SLIDE_SHAPES = Symbol.for('@office-kit/pptx.slide.shapes');\nexport const SHAPE_SLIDE = Symbol.for('@office-kit/pptx.shape.slide');\nexport const SHAPE_ELEMENT = Symbol.for('@office-kit/pptx.shape.element');\nexport const SHAPE_SNAPSHOT = Symbol.for('@office-kit/pptx.shape.snapshot');\nexport const LAYOUT_PART_NAME = Symbol.for('@office-kit/pptx.layout.partName');\nexport const LAYOUT_PART = Symbol.for('@office-kit/pptx.layout.part');\nexport const COMMENT_SLIDE = Symbol.for('@office-kit/pptx.comment.slide');\nexport const COMMENT_SNAPSHOT = Symbol.for('@office-kit/pptx.comment.snapshot');\nexport const CELL_TABLE = Symbol.for('@office-kit/pptx.cell.table');\nexport const CELL_ELEMENT = Symbol.for('@office-kit/pptx.cell.element');\nexport const CELL_ROW = Symbol.for('@office-kit/pptx.cell.row');\nexport const CELL_COL = Symbol.for('@office-kit/pptx.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_2007 = 'http://schemas.microsoft.com/office/2007/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 // A clip carries two rels to the same part: the ECMA-376 `video` / `audio`\n // one (`<a:videoFile r:link>`) and PowerPoint 2010's `media` one\n // (`<p14:media r:embed>`), which lives in Microsoft's 2007 namespace.\n media: `${MS_2007}/media`,\n video: `${OFFICE_DOC}/video`,\n audio: `${OFFICE_DOC}/audio`,\n font: `${OFFICE_DOC}/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","// 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 rotX: [-90, 90], // ST_RotX (3-D elevation, degrees)\n rotY: [0, 360], // ST_RotY (3-D rotation, degrees)\n perspective: [0, 240], // ST_Perspective\n depthPercent: [20, 2000], // ST_DepthPercentUShort\n heightPercent: [5, 500], // ST_HPercentUShort\n secondPieSize: [5, 200], // ST_SecondPieSizeUShort\n bubbleScale: [0, 300], // ST_BubbleScaleUInt\n percent100000: [0, 100000], // ST_PositiveFixedPercentage (<a:alpha>, 1/1000 %)\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","// ECMA-376 transitional enum domains; keep full-schema string inputs valid.\n\n// ST_ShapeType\nexport const SHAPE_PRESETS = [\n 'line',\n 'lineInv',\n 'triangle',\n 'rtTriangle',\n 'rect',\n 'diamond',\n 'parallelogram',\n 'trapezoid',\n 'nonIsoscelesTrapezoid',\n 'pentagon',\n 'hexagon',\n 'heptagon',\n 'octagon',\n 'decagon',\n 'dodecagon',\n 'star4',\n 'star5',\n 'star6',\n 'star7',\n 'star8',\n 'star10',\n 'star12',\n 'star16',\n 'star24',\n 'star32',\n 'roundRect',\n 'round1Rect',\n 'round2SameRect',\n 'round2DiagRect',\n 'snipRoundRect',\n 'snip1Rect',\n 'snip2SameRect',\n 'snip2DiagRect',\n 'plaque',\n 'ellipse',\n 'teardrop',\n 'homePlate',\n 'chevron',\n 'pieWedge',\n 'pie',\n 'blockArc',\n 'donut',\n 'noSmoking',\n 'rightArrow',\n 'leftArrow',\n 'upArrow',\n 'downArrow',\n 'stripedRightArrow',\n 'notchedRightArrow',\n 'bentUpArrow',\n 'leftRightArrow',\n 'upDownArrow',\n 'leftUpArrow',\n 'leftRightUpArrow',\n 'quadArrow',\n 'leftArrowCallout',\n 'rightArrowCallout',\n 'upArrowCallout',\n 'downArrowCallout',\n 'leftRightArrowCallout',\n 'upDownArrowCallout',\n 'quadArrowCallout',\n 'bentArrow',\n 'uturnArrow',\n 'circularArrow',\n 'leftCircularArrow',\n 'leftRightCircularArrow',\n 'curvedRightArrow',\n 'curvedLeftArrow',\n 'curvedUpArrow',\n 'curvedDownArrow',\n 'swooshArrow',\n 'cube',\n 'can',\n 'lightningBolt',\n 'heart',\n 'sun',\n 'moon',\n 'smileyFace',\n 'irregularSeal1',\n 'irregularSeal2',\n 'foldedCorner',\n 'bevel',\n 'frame',\n 'halfFrame',\n 'corner',\n 'diagStripe',\n 'chord',\n 'arc',\n 'leftBracket',\n 'rightBracket',\n 'leftBrace',\n 'rightBrace',\n 'bracketPair',\n 'bracePair',\n 'straightConnector1',\n 'bentConnector2',\n 'bentConnector3',\n 'bentConnector4',\n 'bentConnector5',\n 'curvedConnector2',\n 'curvedConnector3',\n 'curvedConnector4',\n 'curvedConnector5',\n 'callout1',\n 'callout2',\n 'callout3',\n 'accentCallout1',\n 'accentCallout2',\n 'accentCallout3',\n 'borderCallout1',\n 'borderCallout2',\n 'borderCallout3',\n 'accentBorderCallout1',\n 'accentBorderCallout2',\n 'accentBorderCallout3',\n 'wedgeRectCallout',\n 'wedgeRoundRectCallout',\n 'wedgeEllipseCallout',\n 'cloudCallout',\n 'cloud',\n 'ribbon',\n 'ribbon2',\n 'ellipseRibbon',\n 'ellipseRibbon2',\n 'leftRightRibbon',\n 'verticalScroll',\n 'horizontalScroll',\n 'wave',\n 'doubleWave',\n 'plus',\n 'flowChartProcess',\n 'flowChartDecision',\n 'flowChartInputOutput',\n 'flowChartPredefinedProcess',\n 'flowChartInternalStorage',\n 'flowChartDocument',\n 'flowChartMultidocument',\n 'flowChartTerminator',\n 'flowChartPreparation',\n 'flowChartManualInput',\n 'flowChartManualOperation',\n 'flowChartConnector',\n 'flowChartPunchedCard',\n 'flowChartPunchedTape',\n 'flowChartSummingJunction',\n 'flowChartOr',\n 'flowChartCollate',\n 'flowChartSort',\n 'flowChartExtract',\n 'flowChartMerge',\n 'flowChartOfflineStorage',\n 'flowChartOnlineStorage',\n 'flowChartMagneticTape',\n 'flowChartMagneticDisk',\n 'flowChartMagneticDrum',\n 'flowChartDisplay',\n 'flowChartDelay',\n 'flowChartAlternateProcess',\n 'flowChartOffpageConnector',\n 'actionButtonBlank',\n 'actionButtonHome',\n 'actionButtonHelp',\n 'actionButtonInformation',\n 'actionButtonForwardNext',\n 'actionButtonBackPrevious',\n 'actionButtonEnd',\n 'actionButtonBeginning',\n 'actionButtonReturn',\n 'actionButtonDocument',\n 'actionButtonSound',\n 'actionButtonMovie',\n 'gear6',\n 'gear9',\n 'funnel',\n 'mathPlus',\n 'mathMinus',\n 'mathMultiply',\n 'mathDivide',\n 'mathEqual',\n 'mathNotEqual',\n 'cornerTabs',\n 'squareTabs',\n 'plaqueTabs',\n 'chartX',\n 'chartStar',\n 'chartPlus',\n] as const;\n\n// ST_PresetLineDashVal\nexport const LINE_DASHES = [\n 'solid',\n 'dot',\n 'dash',\n 'lgDash',\n 'dashDot',\n 'lgDashDot',\n 'lgDashDotDot',\n 'sysDash',\n 'sysDot',\n 'sysDashDot',\n 'sysDashDotDot',\n] as const;\n\n// ST_TextVerticalType\nexport const TEXT_DIRECTIONS = [\n 'horz',\n 'vert',\n 'vert270',\n 'wordArtVert',\n 'eaVert',\n 'mongolianVert',\n 'wordArtVertRtl',\n] as const;\n\n// ST_TextAutonumberScheme\nexport const AUTO_NUMBER_SCHEMES = [\n 'alphaLcParenBoth',\n 'alphaUcParenBoth',\n 'alphaLcParenR',\n 'alphaUcParenR',\n 'alphaLcPeriod',\n 'alphaUcPeriod',\n 'arabicParenBoth',\n 'arabicParenR',\n 'arabicPeriod',\n 'arabicPlain',\n 'romanLcParenBoth',\n 'romanUcParenBoth',\n 'romanLcParenR',\n 'romanUcParenR',\n 'romanLcPeriod',\n 'romanUcPeriod',\n 'circleNumDbPlain',\n 'circleNumWdBlackPlain',\n 'circleNumWdWhitePlain',\n 'arabicDbPeriod',\n 'arabicDbPlain',\n 'ea1ChsPeriod',\n 'ea1ChsPlain',\n 'ea1ChtPeriod',\n 'ea1ChtPlain',\n 'ea1JpnChsDbPeriod',\n 'ea1JpnKorPlain',\n 'ea1JpnKorPeriod',\n 'arabic1Minus',\n 'arabic2Minus',\n 'hebrew2Minus',\n 'thaiAlphaPeriod',\n 'thaiAlphaParenR',\n 'thaiAlphaParenBoth',\n 'thaiNumPeriod',\n 'thaiNumParenR',\n 'thaiNumParenBoth',\n 'hindiAlphaPeriod',\n 'hindiNumPeriod',\n 'hindiNumParenR',\n 'hindiAlpha1Period',\n] as const;\n\n// ST_TextUnderlineType\nexport const UNDERLINES = [\n 'none',\n 'words',\n 'sng',\n 'dbl',\n 'heavy',\n 'dotted',\n 'dottedHeavy',\n 'dash',\n 'dashHeavy',\n 'dashLong',\n 'dashLongHeavy',\n 'dotDash',\n 'dotDashHeavy',\n 'dotDotDash',\n 'dotDotDashHeavy',\n 'wavy',\n 'wavyHeavy',\n 'wavyDbl',\n] as const;\n\n// ST_TextStrikeType\nexport const STRIKES = ['noStrike', 'sngStrike', 'dblStrike'] as const;\n\n// ST_SlideSizeType\nexport const SLIDE_SIZE_TYPES = [\n 'screen4x3',\n 'letter',\n 'A4',\n '35mm',\n 'overhead',\n 'banner',\n 'custom',\n 'ledger',\n 'A3',\n 'B4ISO',\n 'B5ISO',\n 'B4JIS',\n 'B5JIS',\n 'hagakiCard',\n 'screen16x9',\n 'screen16x10',\n] as const;\n\nexport const TEXT_ANCHORS = { top: 't', center: 'ctr', bottom: 'b' } as const;\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 { UNDERLINES, STRIKES } from '../enum-values.ts';\nimport { oneOf, 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 /**\n * Complex-script font family. Sets `<a:cs>`, the typeface renderers pick\n * for complex scripts such as Arabic, Hebrew and Thai — independently of\n * `font` (Latin) and `fontEastAsian` (CJK).\n */\n fontComplexScript?: 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 setComplexScript = (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 === 'cs'),\n );\n if (font === null) return;\n insertChildByRank(rPr, elem(NAME_CS, { 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\nexport const validateFormatEnums = (format: TextFormat, caller: string): void => {\n if (format.underline != null && typeof format.underline !== 'boolean')\n oneOf(format.underline, UNDERLINES, `${caller}: underline`);\n if (format.strike != null && typeof format.strike !== 'boolean')\n oneOf(format.strike, STRIKES, `${caller}: strike`);\n if (format.cap != null) oneOf(format.cap, ['none', 'small', 'all'], `${caller}: cap`);\n};\n\n/** Mutates `rPr` in place per `format`. */\nexport const applyRunFormat = (\n rPr: XmlElement,\n format: TextFormat,\n caller = 'setShapeRunFormat',\n): void => {\n validateFormatEnums(format, caller);\n applyValidatedRunFormat(rPr, format);\n};\n\nconst applyValidatedRunFormat = (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.fontComplexScript !== undefined) setComplexScript(rPr, format.fontComplexScript);\n if (format.color !== undefined) setSolidFill(rPr, format.color);\n if (format.highlight !== undefined) setHighlight(rPr, format.highlight);\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 = (\n txBody: XmlElement,\n format: TextFormat,\n caller = 'setShapeTextFormat',\n): void => {\n validateFormatEnums(format, caller);\n applyValidatedFormatToAllRuns(txBody, format);\n};\n\nexport const applyValidatedFormatToAllRuns = (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 applyValidatedRunFormat(rPr, format);\n }\n }\n // Force-touch a NAME_R reference so it isn't elided as unused.\n void NAME_R;\n};\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 { oneOf } from '../bounds.ts';\nimport { AUTO_NUMBER_SCHEMES } from '../enum-values.ts';\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';\nimport { type TextFormat, applyRunFormat } from './text-format.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 NAME_END_PARA_RPR = qname('a', 'endParaRPr', 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 caller: string,\n): { kind: 'char'; char: string } | { kind: 'autoNum'; type: string } | { kind: 'none' } => {\n if (typeof s === 'string') oneOf(s, ['bullet', 'number', 'none'], `${caller}: bullets`);\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 {\n kind: 'autoNum',\n type: oneOf(s.autoNum, AUTO_NUMBER_SCHEMES, `${caller}: bullets.autoNum`),\n };\n};\n\ntype NormalizedBullet = ReturnType<typeof normalizeBulletStyle>;\n\nconst buildBulletElement = (n: NormalizedBullet): XmlElement => {\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 | ParagraphAlignmentToken;\n\nconst ALIGNMENT_TOKENS = ['l', 'ctr', 'r', 'just', 'dist', 'justLow', 'thaiDist'] as const;\n\n/**\n * The `ST_TextAlignType` tokens themselves — what a literal `algn` read\n * returns. Setters take the wider `ParagraphAlignment`; reads never produce a\n * plain-English name, because `justLow` and `thaiDist` have none and a read\n * must not lose them.\n */\nexport type ParagraphAlignmentToken = (typeof ALIGNMENT_TOKENS)[number];\n\n/**\n * Parses an `algn` attribute value from a file. A value outside\n * `ST_TextAlignType` is malformed input and reads as unset.\n */\nexport const parseAlignmentToken = (value: string | null): ParagraphAlignmentToken | null =>\n ALIGNMENT_TOKENS.find((token) => token === value) ?? null;\n\nexport const alignToken = (a: ParagraphAlignment, caller: string): string => {\n oneOf(\n a,\n [\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 ],\n `${caller}: align`,\n );\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 caller = 'setShapeAlignment',\n): void => {\n applyAlignmentTokenToAllParagraphs(txBody, alignToken(align, caller));\n};\n\nexport const applyAlignmentTokenToAllParagraphs = (txBody: XmlElement, token: string): 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 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\nexport const updateBulletIndentForLevel = (\n pPr: XmlElement,\n previousLevel: number,\n level: number,\n): void => {\n const previous = bulletIndentForLevel(previousLevel);\n const marL = pPr.attrs.find((a) => a.name.namespaceURI === '' && a.name.localName === 'marL');\n const indent = pPr.attrs.find((a) => a.name.namespaceURI === '' && a.name.localName === 'indent');\n if (marL?.value !== String(previous.marL) || indent?.value !== String(previous.indent)) return;\n const next = bulletIndentForLevel(level);\n pPr.attrs = pPr.attrs.map((a) =>\n a === marL\n ? attr(a.name, String(next.marL))\n : a === indent\n ? attr(a.name, String(next.indent))\n : a,\n );\n};\n\nconst hasAttr = (el: XmlElement, local: string): boolean =>\n el.attrs.some((a) => a.name.namespaceURI === '' && a.name.localName === local);\n\nconst applyNormalizedBullet = (paragraph: XmlElement, style: NormalizedBullet): 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.kind !== '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 (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\nexport const applyBulletToParagraph = (paragraph: XmlElement, style: BulletStyle): void => {\n applyNormalizedBullet(paragraph, normalizeBulletStyle(style, 'setParagraphBullet'));\n};\n\nexport const applyBulletToAllParagraphs = (txBody: XmlElement, style: BulletStyle): void => {\n const normalized = normalizeBulletStyle(style, 'setShapeBullets');\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 applyNormalizedBullet(p, normalized);\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, bullets?: BulletStyle): void => {\n const normalized =\n bullets === undefined ? undefined : normalizeBulletStyle(bullets, 'setShapeText');\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 if (normalized !== undefined) applyNormalizedBullet(p, normalized);\n txBody.children.push(p);\n }\n void ATTR_XML_SPACE;\n};\n\n/** One run of a `ParagraphSpec`: text plus the format applied to its `<a:rPr>`. */\nexport interface RunSpec {\n /**\n * Run text, written verbatim — unlike `setShapeText`, newlines are not\n * split into paragraphs (PowerPoint shows a CR LF inside a run as a line\n * break, which some exporters rely on).\n */\n readonly text: string;\n readonly format?: TextFormat;\n}\n\n/** One paragraph for `setTextBodyParagraphs`: optional alignment plus its runs. */\nexport interface ParagraphSpec {\n readonly align?: ParagraphAlignment;\n readonly runs: ReadonlyArray<RunSpec>;\n /**\n * Format of the paragraph-end mark (`<a:endParaRPr>`), the place to give a\n * paragraph with no runs a font size. Omit to write no `<a:endParaRPr>`.\n */\n readonly endFormat?: TextFormat;\n}\n\n/**\n * Builds the `<a:p>` elements for `paragraphs`. Every format is validated\n * here, so a caller that builds before it touches the tree leaves the\n * existing text intact when a value is rejected.\n */\nexport const buildTextBodyParagraphs = (\n paragraphs: ReadonlyArray<ParagraphSpec>,\n caller = 'setShapeParagraphs',\n): ReadonlyArray<XmlElement> => {\n // CT_TextBody requires at least one <a:p>; `[{ runs: [] }]` is the empty body.\n if (paragraphs.length === 0) {\n throw new Error('setTextBodyParagraphs: at least one paragraph is required');\n }\n const built: XmlElement[] = [];\n // for...of, not map: map skips the holes of a sparse array and would hand\n // them on as undefined children.\n for (const para of paragraphs) {\n const children: XmlElement[] = [];\n if (para.align !== undefined) {\n children.push(elem(NAME_PPR, { attrs: [attr(ATTR_ALGN, alignToken(para.align, caller))] }));\n }\n for (const run of para.runs) {\n const rPr = elem(NAME_RPR);\n if (run.format !== undefined) applyRunFormat(rPr, run.format, caller);\n const t = elem(NAME_T, { children: run.text.length > 0 ? [text(run.text)] : [] });\n children.push(elem(NAME_R, { children: [rPr, t] }));\n }\n // CT_TextParagraph is a sequence: <a:endParaRPr> comes after every run.\n if (para.endFormat !== undefined) {\n const endParaRPr = elem(NAME_END_PARA_RPR);\n applyRunFormat(endParaRPr, para.endFormat, caller);\n children.push(endParaRPr);\n }\n built.push(elem(NAME_P, { children }));\n }\n return built;\n};\n\nexport const replaceTextBodyParagraphs = (\n txBody: XmlElement,\n built: ReadonlyArray<XmlElement>,\n): void => {\n removeAllParagraphs(txBody);\n txBody.children.push(...built);\n};\n\n/**\n * Replaces every paragraph of `txBody` with explicitly structured ones.\n * Unlike `setTextBody`, nothing is inherited from the existing runs: each\n * run gets a fresh `<a:rPr>` carrying only its own `format`. A rejected\n * format throws before `txBody` changes.\n */\nexport const setTextBodyParagraphs = (\n txBody: XmlElement,\n paragraphs: ReadonlyArray<ParagraphSpec>,\n): void => {\n replaceTextBodyParagraphs(txBody, buildTextBodyParagraphs(paragraphs));\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.path !== undefined)\n oneOf(options.path, ['linear', 'circle', 'rect', 'shape'], 'setShapeGradientFill: path');\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 { LINE_DASHES } from '../enum-values.ts';\nimport { oneOf, 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 oneOf(dash, LINE_DASHES, 'setShapeStrokeDash: dash');\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 oneOf(end, ['head', 'tail'], 'setShapeStrokeArrow: end');\n oneOf(\n options.type,\n ['none', 'triangle', 'stealth', 'diamond', 'oval', 'arrow'],\n 'setShapeStrokeArrow: type',\n );\n if (options.width !== undefined)\n oneOf(options.width, ['sm', 'med', 'lg'], 'setShapeStrokeArrow: width');\n if (options.length !== undefined)\n oneOf(options.length, ['sm', 'med', 'lg'], 'setShapeStrokeArrow: length');\n const ln = ensureLn(spPr);\n const localName = { head: 'headEnd', tail: 'tailEnd' }[end];\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 if (cap !== null) oneOf(cap, ['rnd', 'sq', 'flat'], 'setShapeStrokeCap: cap');\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 if (join !== null) oneOf(join, ['round', 'bevel', 'miter'], 'setShapeStrokeJoin: join');\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 if (cmpd !== null)\n oneOf(cmpd, ['sng', 'dbl', 'thickThin', 'thinThick', 'tri'], 'setShapeStrokeCompound: cmpd');\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\nconst NAME_PRST_GEOM = qname('a', 'prstGeom', NS.dml);\nconst NAME_AV_LST = qname('a', 'avLst', NS.dml);\nconst NAME_GD = qname('a', 'gd', NS.dml);\nconst ATTR_NAME = qname('', 'name', '');\nconst ATTR_FMLA = qname('', 'fmla', '');\n\n/**\n * Writes the preset geometry's adjust-handle values (`<a:prstGeom><a:avLst>\n * <a:gd name=\"..\" fmla=\"val N\"/></a:avLst>`), replacing any guides already in\n * the `<a:avLst>`. Values are the raw ECMA-376 guide numbers and are rounded\n * to integers on the way out (guide values are stored as integers). For the\n * `roundRect` preset the `adj` guide runs `0..50000` (thousandths of a\n * percent of the shorter side; `50000` = fully rounded).\n *\n * Returns `false` — writing nothing — when the shape carries no\n * `<a:prstGeom>` (it uses custom or inherited geometry, so there is no\n * adjust list to author). Mirrors `getShapeAdjustValues`, which reads the\n * same `val`-form guides.\n */\nexport const setAdjustValues = (\n shape: XmlElement,\n values: Readonly<Record<string, number>>,\n): boolean => {\n const spPr = firstChildElement(shape, NAME_SP_PR);\n if (spPr === null) return false;\n const prstGeom = firstChildElement(spPr, NAME_PRST_GEOM);\n if (prstGeom === null) return false;\n\n let avLst = firstChildElement(prstGeom, NAME_AV_LST);\n if (avLst === null) {\n avLst = elem(NAME_AV_LST);\n prstGeom.children.push(avLst);\n }\n\n avLst.children = Object.entries(values).map(([name, value]) =>\n elem(NAME_GD, {\n attrs: [attr(ATTR_NAME, name), attr(ATTR_FMLA, `val ${String(Math.round(value))}`)],\n }),\n );\n return true;\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","import { oneOf } from '../bounds.ts';\nimport { SHAPE_PRESETS } from '../enum-values.ts';\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 oneOf(opts.preset, SHAPE_PRESETS, 'addSlideShape: preset');\n if (opts.textAnchor !== undefined)\n oneOf(opts.textAnchor, ['t', 'ctr', 'b'], 'addSlideShape: textAnchor');\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 and reads the media flavour of a picture shape (`<p:pic>`).\n//\n// PowerPoint stores an inserted video / audio clip as an ordinary picture (the\n// poster frame) whose non-visual properties point at the media:\n//\n// <p:pic>\n// <p:nvPicPr>\n// <p:cNvPr id=\"X\" name=\"...\">\n// <a:hlinkClick r:id=\"\" action=\"ppaction://media\"/>\n// </p:cNvPr>\n// <p:cNvPicPr><a:picLocks noChangeAspect=\"1\"/></p:cNvPicPr>\n// <p:nvPr>\n// <a:videoFile r:link=\"rIdV\"/> (or <a:audioFile>)\n// <p:extLst>\n// <p:ext uri=\"{DAA4B4D4-6D71-4841-9C94-3DE7FCFB9230}\">\n// <p14:media r:embed=\"rIdM\"/>\n// </p:ext>\n// </p:extLst>\n// </p:nvPr>\n// </p:nvPicPr>\n// <p:blipFill><a:blip r:embed=\"rIdPoster\"/>...</p:blipFill>\n// <p:spPr>...</p:spPr>\n// </p:pic>\n//\n// `r:link` is the ECMA-376 (2006) reference and `p14:media r:embed` the\n// PowerPoint 2010+ one; both relationships target the same media part. An\n// online video has only the `r:link`, pointing at an external URL.\n//\n// The slide also needs a media time node under `<p:timing>`:\n//\n// <p:video> (or <p:audio>)\n// <p:cMediaNode vol=\"80000\">\n// <p:cTn id=\"N\" fill=\"hold\" display=\"0\">\n// <p:stCondLst><p:cond delay=\"indefinite\"/></p:stCondLst>\n// </p:cTn>\n// <p:tgtEl><p:spTgt spid=\"X\"/></p:tgtEl>\n// </p:cMediaNode>\n// </p:video>\n//\n// Without that node PowerPoint shows the poster but no play button / seek bar\n// in the slide show, so the clip cannot be controlled.\n\nimport {\n NS,\n type XmlElement,\n attr,\n elem,\n firstChildElement,\n getAttrValue,\n qname,\n} from '../xml/index.ts';\nimport { type PictureOptions, buildPicture } from './picture-builder.ts';\n\n/** Which media time node / DrawingML file element a clip uses. */\nexport type MediaFileKind = 'video' | 'audio';\n\nconst NAME_NV_PIC_PR = qname('p', 'nvPicPr', NS.pml);\nconst NAME_C_NV_PR = qname('p', 'cNvPr', NS.pml);\nconst NAME_NV_PR = qname('p', 'nvPr', NS.pml);\nconst NAME_HLINK_CLICK = qname('a', 'hlinkClick', NS.dml);\nconst NAME_VIDEO_FILE = qname('a', 'videoFile', NS.dml);\nconst NAME_AUDIO_FILE = qname('a', 'audioFile', NS.dml);\nconst NAME_EXT_LST = qname('p', 'extLst', NS.pml);\nconst NAME_EXT = qname('p', 'ext', NS.pml);\nconst NAME_P14_MEDIA = qname('p14', 'media', NS.p14);\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_VIDEO = qname('p', 'video', NS.pml);\nconst NAME_AUDIO = qname('p', 'audio', NS.pml);\nconst NAME_C_MEDIA_NODE = qname('p', 'cMediaNode', NS.pml);\nconst NAME_ST_COND_LST = qname('p', 'stCondLst', 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);\n\nconst ATTR_R_ID = qname('r', 'id', NS.officeDocRels);\nconst ATTR_R_LINK = qname('r', 'link', NS.officeDocRels);\nconst ATTR_R_EMBED = qname('r', 'embed', NS.officeDocRels);\nconst ATTR_ACTION = qname('', 'action', '');\nconst ATTR_URI = qname('', 'uri', '');\nconst ATTR_ID = qname('', 'id', '');\nconst ATTR_DUR = qname('', 'dur', '');\nconst ATTR_RESTART = qname('', 'restart', '');\nconst ATTR_NODE_TYPE = qname('', 'nodeType', '');\nconst ATTR_VOL = qname('', 'vol', '');\nconst ATTR_FILL = qname('', 'fill', '');\nconst ATTR_DISPLAY = qname('', 'display', '');\nconst ATTR_DELAY = qname('', 'delay', '');\nconst ATTR_SPID = qname('', 'spid', '');\n\nconst MEDIA_ACTION = 'ppaction://media';\n// The `<p:ext>` URI PowerPoint 2010+ uses for its `<p14:media>` reference.\nconst P14_MEDIA_EXT_URI = '{DAA4B4D4-6D71-4841-9C94-3DE7FCFB9230}';\n// PowerPoint's default clip volume (ST_PositiveFixedPercentage, 80%).\nconst DEFAULT_MEDIA_VOLUME = '80000';\n\nexport interface MediaPictureOptions extends PictureOptions {\n kind: MediaFileKind;\n /** rId of the `video` / `audio` relationship (internal part or external URL). */\n rLink: string;\n /** rId of the `media` relationship to the embedded part. Omit for linked media. */\n rMedia?: string;\n}\n\n/** Returns a media `<p:pic>`; `opts.rEmbed` is the poster image relationship. */\nexport const buildMediaPicture = (opts: MediaPictureOptions): XmlElement => {\n const pic = buildPicture(opts);\n // buildPicture always emits nvPicPr / cNvPr / nvPr.\n const nvPicPr = firstChildElement(pic, NAME_NV_PIC_PR)!;\n const cNvPr = firstChildElement(nvPicPr, NAME_C_NV_PR)!;\n const nvPr = firstChildElement(nvPicPr, NAME_NV_PR)!;\n\n // The empty r:id is intentional: `ppaction://media` carries no target, and\n // PowerPoint itself writes `r:id=\"\"` here.\n cNvPr.children.push(\n elem(NAME_HLINK_CLICK, { attrs: [attr(ATTR_R_ID, ''), attr(ATTR_ACTION, MEDIA_ACTION)] }),\n );\n\n nvPr.children.push(\n elem(opts.kind === 'video' ? NAME_VIDEO_FILE : NAME_AUDIO_FILE, {\n attrs: [attr(ATTR_R_LINK, opts.rLink)],\n }),\n );\n if (opts.rMedia !== undefined) {\n // Declared locally, as PowerPoint does: the slide root only binds a / r / p.\n const media = elem(NAME_P14_MEDIA, {\n attrs: [attr(ATTR_R_EMBED, opts.rMedia)],\n prefixDecls: new Map([['p14', NS.p14]]),\n });\n const ext = elem(NAME_EXT, { attrs: [attr(ATTR_URI, P14_MEDIA_EXT_URI)], children: [media] });\n nvPr.children.push(elem(NAME_EXT_LST, { children: [ext] }));\n }\n return pic;\n};\n\n/** Returns the `<p:video>` / `<p:audio>` time node that targets shape `spid`. */\nexport const buildMediaTimingNode = (\n kind: MediaFileKind,\n spid: number,\n cTnId: number,\n): XmlElement => {\n const cTn = elem(NAME_C_TN, {\n attrs: [attr(ATTR_ID, String(cTnId)), attr(ATTR_FILL, 'hold'), attr(ATTR_DISPLAY, '0')],\n children: [\n elem(NAME_ST_COND_LST, {\n children: [elem(NAME_COND, { attrs: [attr(ATTR_DELAY, 'indefinite')] })],\n }),\n ],\n });\n const tgtEl = elem(NAME_TGT_EL, {\n children: [elem(NAME_SP_TGT, { attrs: [attr(ATTR_SPID, String(spid))] })],\n });\n const cMediaNode = elem(NAME_C_MEDIA_NODE, {\n attrs: [attr(ATTR_VOL, DEFAULT_MEDIA_VOLUME)],\n children: [cTn, tgtEl],\n });\n return elem(kind === 'video' ? NAME_VIDEO : NAME_AUDIO, { children: [cMediaNode] });\n};\n\n/**\n * Returns a `<p:timing>` holding only the root time node, with `nodes` as its\n * children. `nodes` must be non-empty (`<p:childTnLst>` requires a child).\n */\nexport const buildTimingRoot = (nodes: ReadonlyArray<XmlElement>): XmlElement => {\n const cTn = 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: [...nodes] })],\n });\n return elem(NAME_TIMING, {\n children: [elem(NAME_TN_LST, { children: [elem(NAME_PAR, { children: [cTn] })] })],\n });\n};\n\n/** `true` for a `<p:video>` / `<p:audio>` time node. */\nexport const isMediaTimingNode = (el: XmlElement): boolean =>\n el.name.namespaceURI === NS.pml &&\n (el.name.localName === 'video' || el.name.localName === 'audio');\n\n/** Shape id a media time node targets, or `null` when it has no `<p:spTgt>`. */\nexport const mediaTimingNodeTarget = (node: XmlElement): number | null => {\n const cMediaNode = firstChildElement(node, NAME_C_MEDIA_NODE);\n const tgtEl = cMediaNode ? firstChildElement(cMediaNode, NAME_TGT_EL) : null;\n const spTgt = tgtEl ? firstChildElement(tgtEl, NAME_SP_TGT) : null;\n const raw = spTgt ? getAttrValue(spTgt, ATTR_SPID) : null;\n if (raw === null) return null;\n const spid = Number.parseInt(raw, 10);\n return Number.isFinite(spid) ? spid : null;\n};\n\n/** The relationship ids a media picture references. */\nexport interface PictureMediaRef {\n readonly kind: MediaFileKind;\n /** `r:link` (or `r:embed` for `<a:wavAudioFile>`) on the DrawingML file element. */\n readonly fileRId: string | null;\n /** `r:embed` on `<p14:media>`. */\n readonly mediaRId: string | null;\n}\n\n// Every EG_Media member that carries a relationship (`<a:audioCd>` does not).\n// `<a:wavAudioFile>` is the only one that uses `r:embed`.\nconst MEDIA_FILE_ELEMENTS: Readonly<Record<string, MediaFileKind>> = {\n videoFile: 'video',\n quickTimeFile: 'video',\n audioFile: 'audio',\n wavAudioFile: 'audio',\n};\n\n/** Reads the media reference off a `<p:pic>`, or `null` for a plain picture. */\nexport const readPictureMediaRef = (pic: XmlElement): PictureMediaRef | null => {\n const nvPicPr = firstChildElement(pic, NAME_NV_PIC_PR);\n const nvPr = nvPicPr ? firstChildElement(nvPicPr, NAME_NV_PR) : null;\n if (!nvPr) return null;\n for (const child of nvPr.children) {\n if (child.kind !== 'element' || child.name.namespaceURI !== NS.dml) continue;\n const kind = MEDIA_FILE_ELEMENTS[child.name.localName];\n if (kind === undefined) continue;\n const fileRId =\n child.name.localName === 'wavAudioFile'\n ? getAttrValue(child, ATTR_R_EMBED)\n : getAttrValue(child, ATTR_R_LINK);\n return { kind, fileRId, mediaRId: readP14MediaRId(nvPr) };\n }\n return null;\n};\n\nconst readP14MediaRId = (nvPr: XmlElement): string | null => {\n const extLst = firstChildElement(nvPr, NAME_EXT_LST);\n if (!extLst) return null;\n for (const ext of extLst.children) {\n if (ext.kind !== 'element') continue;\n const media = firstChildElement(ext, NAME_P14_MEDIA);\n if (media) return getAttrValue(media, ATTR_R_EMBED);\n }\n return null;\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 oneOf(opts.orientation, ['horz', 'vert'], 'setSlideTransition: orientation');\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 if (opts.speed !== undefined)\n oneOf(opts.speed, ['slow', 'med', 'fast'], 'setSlideTransition: speed');\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 { oneOf, 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.\n */\nexport const buildSingleEffectTiming = (spid: number, opts: AnimationOptions): XmlElement => {\n const effect = oneOf(\n opts.effect,\n ['fadeIn', 'fadeOut', 'appear', 'disappear'],\n 'setShapeAnimation: effect',\n );\n const preset = PRESETS[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","import { oneOf } from '../bounds.ts';\nimport { LINE_DASHES } from '../enum-values.ts';\nimport type { ChartSpec, ChartDataLabels, ChartAxisScaling } from './types.ts';\n\nexport const LABEL_POSITIONS = [\n 'ctr',\n 'inEnd',\n 'outEnd',\n 'inBase',\n 't',\n 'b',\n 'l',\n 'r',\n 'bestFit',\n] as const;\nexport const DISPLAY_UNITS = [\n 'hundreds',\n 'thousands',\n 'tenThousands',\n 'hundredThousands',\n 'millions',\n 'tenMillions',\n 'hundredMillions',\n 'billions',\n 'trillions',\n] as const;\nexport const LABEL_ALIGNMENTS = ['ctr', 'l', 'r'] as const;\nexport const DISPLAY_BLANKS = ['gap', 'zero', 'span'] as const;\nexport const SCATTER_STYLES = [\n 'none',\n 'line',\n 'lineMarker',\n 'marker',\n 'smooth',\n 'smoothMarker',\n] as const;\nexport const RADAR_STYLES = ['standard', 'marker', 'filled'] as const;\nexport const BAR_3D_SHAPES = [\n 'box',\n 'cone',\n 'coneToMax',\n 'cylinder',\n 'pyramid',\n 'pyramidToMax',\n] as const;\nexport const OF_PIE_TYPES = ['pie', 'bar'] as const;\nexport const SPLIT_TYPES = ['auto', 'cust', 'percent', 'pos', 'val'] as const;\nexport const LAYOUT_TARGETS = ['inner', 'outer'] as const;\nexport const AXIS_CROSSES = ['autoZero', 'min', 'max'] as const;\nexport const LEGEND_POSITIONS = ['r', 't', 'b', 'l', 'tr'] as const;\nexport const MARKER_SYMBOLS = [\n 'none',\n 'auto',\n 'circle',\n 'square',\n 'diamond',\n 'triangle',\n 'star',\n 'x',\n 'plus',\n 'dash',\n 'dot',\n 'picture',\n] as const;\nexport const TRENDLINE_TYPES = ['linear', 'exp', 'log', 'poly', 'power', 'movingAvg'] as const;\nexport const ERROR_BAR_TYPES = ['both', 'plus', 'minus'] as const;\nexport const ERROR_VALUE_TYPES = ['fixedVal', 'percentage', 'stdDev', 'stdErr', 'cust'] as const;\n\nexport const GROUPINGS = ['clustered', 'stacked', 'percentStacked', 'standard'] as const;\nexport const TICK_MARKS = ['in', 'out', 'cross', 'none'] as const;\nexport const TICK_LABEL_POSITIONS = ['none', 'low', 'high', 'nextTo'] as const;\nexport const ORIENTATIONS = ['minMax', 'maxMin'] as const;\nexport const CROSS_BETWEEN = ['between', 'midCat'] as const;\nexport const TIME_UNITS = ['days', 'months', 'years'] as const;\n\nconst validateLabels = (labels: ChartDataLabels | null | undefined, field: string): void => {\n if (labels?.position !== undefined) oneOf(labels.position, LABEL_POSITIONS, `${field}.position`);\n};\n\nconst validateScaling = (scaling: ChartAxisScaling | undefined, field: string): void => {\n if (scaling?.displayUnits !== undefined)\n oneOf(scaling.displayUnits, DISPLAY_UNITS, `${field}.displayUnits`);\n};\n\n/** Validate before chart XML or its embedded workbook is changed. */\nexport const validateChartSpecEnums = (spec: ChartSpec, caller: string): void => {\n oneOf(\n spec.kind,\n [\n 'bar',\n 'column',\n 'line',\n 'pie',\n 'doughnut',\n 'area',\n 'scatter',\n 'radar',\n 'bubble',\n 'stock',\n 'surface',\n ],\n `${caller}: kind`,\n );\n if (spec.grouping !== undefined) oneOf(spec.grouping, GROUPINGS, `${caller}: grouping`);\n if (spec.valueAxisMajorTickMark !== undefined)\n oneOf(spec.valueAxisMajorTickMark, TICK_MARKS, `${caller}: valueAxisMajorTickMark`);\n if (spec.valueAxisMinorTickMark !== undefined)\n oneOf(spec.valueAxisMinorTickMark, TICK_MARKS, `${caller}: valueAxisMinorTickMark`);\n if (spec.categoryAxisMajorTickMark !== undefined)\n oneOf(spec.categoryAxisMajorTickMark, TICK_MARKS, `${caller}: categoryAxisMajorTickMark`);\n if (spec.categoryAxisMinorTickMark !== undefined)\n oneOf(spec.categoryAxisMinorTickMark, TICK_MARKS, `${caller}: categoryAxisMinorTickMark`);\n if (spec.valueAxisTickLabelPos !== undefined)\n oneOf(spec.valueAxisTickLabelPos, TICK_LABEL_POSITIONS, `${caller}: valueAxisTickLabelPos`);\n if (spec.categoryAxisTickLabelPos !== undefined)\n oneOf(\n spec.categoryAxisTickLabelPos,\n TICK_LABEL_POSITIONS,\n `${caller}: categoryAxisTickLabelPos`,\n );\n if (spec.categoryAxisLabelAlign !== undefined)\n oneOf(spec.categoryAxisLabelAlign, LABEL_ALIGNMENTS, `${caller}: categoryAxisLabelAlign`);\n if (spec.categoryAxisOrientation !== undefined)\n oneOf(spec.categoryAxisOrientation, ORIENTATIONS, `${caller}: categoryAxisOrientation`);\n if (spec.valueAxisOrientation !== undefined)\n oneOf(spec.valueAxisOrientation, ORIENTATIONS, `${caller}: valueAxisOrientation`);\n if (spec.valueAxisCrossBetween !== undefined)\n oneOf(spec.valueAxisCrossBetween, CROSS_BETWEEN, `${caller}: valueAxisCrossBetween`);\n if (spec.dispBlanksAs !== undefined)\n oneOf(spec.dispBlanksAs, DISPLAY_BLANKS, `${caller}: dispBlanksAs`);\n if (spec.scatterStyle !== undefined)\n oneOf(spec.scatterStyle, SCATTER_STYLES, `${caller}: scatterStyle`);\n if (spec.radarStyle !== undefined) oneOf(spec.radarStyle, RADAR_STYLES, `${caller}: radarStyle`);\n if (spec.bubbleSizeRepresents !== undefined)\n oneOf(spec.bubbleSizeRepresents, ['area', 'width'], `${caller}: bubbleSizeRepresents`);\n if (spec.bar3DShape !== undefined) oneOf(spec.bar3DShape, BAR_3D_SHAPES, `${caller}: bar3DShape`);\n if (spec.secondaryValueAxis?.majorTickMark !== undefined)\n oneOf(\n spec.secondaryValueAxis.majorTickMark,\n TICK_MARKS,\n `${caller}: secondaryValueAxis.majorTickMark`,\n );\n if (spec.secondaryValueAxis?.minorTickMark !== undefined)\n oneOf(\n spec.secondaryValueAxis.minorTickMark,\n TICK_MARKS,\n `${caller}: secondaryValueAxis.minorTickMark`,\n );\n if (spec.secondaryValueAxis?.tickLabelPos !== undefined)\n oneOf(\n spec.secondaryValueAxis.tickLabelPos,\n TICK_LABEL_POSITIONS,\n `${caller}: secondaryValueAxis.tickLabelPos`,\n );\n if (spec.secondaryValueAxis?.crossBetween !== undefined)\n oneOf(\n spec.secondaryValueAxis.crossBetween,\n CROSS_BETWEEN,\n `${caller}: secondaryValueAxis.crossBetween`,\n );\n if (spec.seriesAxis?.orientation !== undefined)\n oneOf(spec.seriesAxis.orientation, ORIENTATIONS, `${caller}: seriesAxis.orientation`);\n if (spec.seriesAxis?.tickLabelPos !== undefined)\n oneOf(spec.seriesAxis.tickLabelPos, TICK_LABEL_POSITIONS, `${caller}: seriesAxis.tickLabelPos`);\n if (spec.categoryAxisDate?.baseTimeUnit !== undefined)\n oneOf(\n spec.categoryAxisDate.baseTimeUnit,\n TIME_UNITS,\n `${caller}: categoryAxisDate.baseTimeUnit`,\n );\n if (spec.categoryAxisDate?.majorTimeUnit !== undefined)\n oneOf(\n spec.categoryAxisDate.majorTimeUnit,\n TIME_UNITS,\n `${caller}: categoryAxisDate.majorTimeUnit`,\n );\n if (spec.categoryAxisDate?.minorTimeUnit !== undefined)\n oneOf(\n spec.categoryAxisDate.minorTimeUnit,\n TIME_UNITS,\n `${caller}: categoryAxisDate.minorTimeUnit`,\n );\n if (spec.ofPie?.type !== undefined) oneOf(spec.ofPie.type, OF_PIE_TYPES, `${caller}: ofPie.type`);\n if (spec.ofPie?.splitType !== undefined)\n oneOf(spec.ofPie.splitType, SPLIT_TYPES, `${caller}: ofPie.splitType`);\n if (spec.plotAreaLayout?.target !== undefined)\n oneOf(spec.plotAreaLayout.target, LAYOUT_TARGETS, `${caller}: plotAreaLayout.target`);\n if (spec.legend?.layout?.target !== undefined)\n oneOf(spec.legend.layout.target, LAYOUT_TARGETS, `${caller}: legend.layout.target`);\n if (spec.valueAxisCrosses !== undefined && typeof spec.valueAxisCrosses !== 'object')\n oneOf(spec.valueAxisCrosses, AXIS_CROSSES, `${caller}: valueAxisCrosses`);\n if (spec.legend?.position != null)\n oneOf(spec.legend.position, LEGEND_POSITIONS, `${caller}: legend.position`);\n validateLabels(spec.dataLabels, `${caller}: dataLabels`);\n validateScaling(spec.valueAxis, `${caller}: valueAxis`);\n validateScaling(spec.categoryAxisScaling, `${caller}: categoryAxisScaling`);\n validateScaling(spec.secondaryValueAxis?.scaling, `${caller}: secondaryValueAxis.scaling`);\n for (const [index, series] of spec.series.entries()) {\n const field = `${caller}: series[${index}]`;\n if (series.chartKind !== undefined)\n oneOf(series.chartKind, ['bar', 'column', 'line', 'area'], `${field}.chartKind`);\n if (series.lineDash !== undefined) oneOf(series.lineDash, LINE_DASHES, `${field}.lineDash`);\n if (series.markerSymbol !== undefined)\n oneOf(series.markerSymbol, MARKER_SYMBOLS, `${field}.markerSymbol`);\n if (series.trendline !== undefined)\n oneOf(series.trendline.type, TRENDLINE_TYPES, `${field}.trendline.type`);\n validateLabels(series.dataLabels, `${field}.dataLabels`);\n for (const [point, labels] of (series.pointDataLabels ?? []).entries())\n validateLabels(labels, `${field}.pointDataLabels[${point}]`);\n for (const direction of ['errorBars', 'xErrorBars'] as const) {\n const bars = series[direction];\n if (bars === undefined) continue;\n oneOf(bars.barType, ERROR_BAR_TYPES, `${field}.${direction}.barType`);\n oneOf(bars.amount.type, ERROR_VALUE_TYPES, `${field}.${direction}.amount.type`);\n }\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/** One sheet cell: text, a number, or `null` for an empty cell. */\nexport type SheetCell = string | number | null;\n\n/**\n * Builds the bytes of a fresh xlsx whose only sheet holds `grid`, row by\n * row from A1. Which cell means what is the caller's business — see\n * `layoutChartSheet`, which also produces the `<c:f>` formulas that point\n * back into this grid.\n */\nexport const buildEmbeddedXlsx = (grid: ReadonlyArray<ReadonlyArray<SheetCell>>): 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 grid.forEach((row, r) => {\n sheetXmlParts.push(`<row r=\"${r + 1}\">`);\n row.forEach((cell, col) => {\n if (cell === null) return; // omit empty cell.\n sheetXmlParts.push(\n typeof cell === 'number'\n ? `<c r=\"${cellRef(r, col)}\"><v>${cell}</v></c>`\n : `<c r=\"${cellRef(r, col)}\" t=\"inlineStr\"><is><t>${xmlEscape(cell)}</t></is></c>`,\n );\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 = (\n sheet: string,\n startRow: number,\n col: number,\n count: number,\n // A multi-level category axis spans several columns; every other channel\n // is a single one.\n endCol: number = col,\n): string =>\n `${sheet}!$${colLetter(col)}$${startRow + 1}:$${colLetter(endCol)}$${startRow + count}`;\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","// Where each chart channel lives in the embedded workbook.\n//\n// The chart XML and the workbook must agree cell for cell: every `<c:f>`\n// formula in the chart names a range, and PowerPoint's \"Edit data\" rewrites\n// the chart from whatever it finds there. Computing the grid and the\n// formulas in one place is what keeps the two from drifting.\n\nimport { type SheetCell, cellAddr, cellRange } from './embedded-xlsx.ts';\nimport type { ChartSpec } from './types.ts';\n\nconst SHEET = 'Sheet1';\n\n/** `<c:f>` formulas of one series' channels. */\nexport interface SeriesSheetRefs {\n /** The header cell holding the series name (`<c:tx>`). */\n readonly name: string;\n /** `<c:val>` / `<c:yVal>`. */\n readonly values: string;\n /** `<c:xVal>` — xy kinds only. */\n readonly xValues?: string;\n /** `<c:bubbleSize>` — bubble only. */\n readonly bubbleSizes?: string;\n}\n\nexport interface ChartSheetLayout {\n readonly grid: ReadonlyArray<ReadonlyArray<SheetCell>>;\n /**\n * `<c:cat>` range shared by every series. Spans all the level columns\n * for a multi-level axis. Absent for the xy kinds, which have no\n * categories.\n */\n readonly categories?: string;\n readonly series: ReadonlyArray<SeriesSheetRefs>;\n}\n\nconst isXyKind = (spec: ChartSpec): boolean => spec.kind === 'scatter' || spec.kind === 'bubble';\n\n/** Parses a date-axis category; the caller has validated it is numeric. */\nexport const dateSerial = (category: string): number => Number(category);\n\n// Category kinds — the layout Excel itself produces for a chart sheet:\n//\n// | (level columns, outermost first) | series 0 | series 1 | …\n// | 2024 | Q1 | 10 | 7 |\n// | | Q2 | 12 | 9 |\nconst layoutCategorySheet = (spec: ChartSpec): ChartSheetLayout => {\n const outerLevels = [...(spec.categoryGroupLevels ?? [])].reverse();\n const levelCount = outerLevels.length + 1;\n const rowCount = spec.categories.length;\n const isDateAxis = spec.categoryAxisDate !== undefined;\n\n // A1 (and the rest of the level header) is written as an empty string\n // rather than omitted, the way Excel marks the corner of a chart range.\n const header: SheetCell[] = [\n ...Array.from({ length: levelCount }, () => ''),\n ...spec.series.map((s) => s.name),\n ];\n const grid: SheetCell[][] = [header];\n for (let r = 0; r < rowCount; r++) {\n const category = spec.categories[r] ?? '';\n const row: SheetCell[] = outerLevels.map((level) => {\n const label = level[r] ?? '';\n return label === '' ? null : label;\n });\n row.push(isDateAxis ? dateSerial(category) : category);\n for (const s of spec.series) row.push(s.values[r] ?? null);\n grid.push(row);\n }\n\n return {\n grid,\n categories: cellRange(SHEET, 1, 0, rowCount, levelCount - 1),\n series: spec.series.map((_, i) => ({\n name: cellAddr(SHEET, 0, levelCount + i),\n values: cellRange(SHEET, 1, levelCount + i, rowCount),\n })),\n };\n};\n\n// xy kinds — each series owns its x channel, so each gets its own block of\n// columns (x, y[, size]). The series name heads the y column because that\n// is the cell `<c:tx>` points at.\nconst layoutXySheet = (spec: ChartSpec): ChartSheetLayout => {\n const isBubble = spec.kind === 'bubble';\n const stride = isBubble ? 3 : 2;\n const rowCount = Math.max(\n 0,\n ...spec.series.map((s) =>\n Math.max(s.values.length, s.xValues?.length ?? 0, s.bubbleSizes?.length ?? 0),\n ),\n );\n const header: SheetCell[] = [];\n for (const s of spec.series) {\n header.push('X', s.name);\n if (isBubble) header.push('Size');\n }\n const grid: SheetCell[][] = [header];\n for (let r = 0; r < rowCount; r++) {\n const row: SheetCell[] = [];\n for (const s of spec.series) {\n row.push(s.xValues?.[r] ?? null, s.values[r] ?? null);\n if (isBubble) row.push(s.bubbleSizes?.[r] ?? null);\n }\n grid.push(row);\n }\n return {\n grid,\n series: spec.series.map((s, i) => {\n const base = i * stride;\n const pointCount = s.values.length;\n return {\n name: cellAddr(SHEET, 0, base + 1),\n xValues: cellRange(SHEET, 1, base, pointCount),\n values: cellRange(SHEET, 1, base + 1, pointCount),\n ...(isBubble ? { bubbleSizes: cellRange(SHEET, 1, base + 2, pointCount) } : {}),\n };\n }),\n };\n};\n\n/** Lays `spec` out as a sheet grid plus the formulas that address it. */\nexport const layoutChartSheet = (spec: ChartSpec): ChartSheetLayout =>\n isXyKind(spec) ? layoutXySheet(spec) : layoutCategorySheet(spec);\n","// Chart XML builder.\n//\n// Produces a complete `<c:chartSpace>` for any `ChartSpec` — every\n// plot-group element of CT_PlotArea. 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 boundedInt,\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 ChartSheetLayout, dateSerial, layoutChartSheet } from './sheet-layout.ts';\nimport type {\n ChartAxisScaling,\n ChartDataLabels,\n ChartErrorBars,\n ChartManualLayout,\n ChartSpec,\n ChartTextStyle,\n ChartView3D,\n} 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\n// The CT_NumData body shared by `<c:numCache>` and `<c:numLit>`. Empty\n// points are left out; `ptCount` still counts them.\nconst numDataChildren = (\n points: ReadonlyArray<number | null>,\n formatCode: string,\n): XmlElement[] => [\n elem(c('formatCode'), { children: [text(formatCode)] }),\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\nconst numRef = (\n formula: string,\n points: ReadonlyArray<number | null>,\n formatCode = 'General',\n): XmlElement =>\n elem(c('numRef'), {\n children: [\n elem(c('f'), { children: [text(formula)] }),\n elem(c('numCache'), { children: numDataChildren(points, formatCode) }),\n ],\n });\n\n// `<c:multiLvlStrRef>` — `levels[0]` is the innermost level (the category\n// labels themselves), as CT_MultiLvlStrData orders its `<c:lvl>` children.\n// An outer level's empty entries mean \"same group as before\" and are left\n// out, which is how PowerPoint spans one label over several categories.\nconst multiLvlStrRef = (\n formula: string,\n levels: ReadonlyArray<ReadonlyArray<string>>,\n pointCount: number,\n): XmlElement =>\n elem(c('multiLvlStrRef'), {\n children: [\n elem(c('f'), { children: [text(formula)] }),\n elem(c('multiLvlStrCache'), {\n children: [\n valNode(c('ptCount'), pointCount),\n ...levels.map((level, depth) =>\n elem(c('lvl'), {\n children: level\n .map((label, i) => (depth > 0 && label === '' ? null : ptNode(i, label)))\n .filter((n): n is XmlElement => n !== null),\n }),\n ),\n ],\n }),\n ],\n });\n\nconst hexOf = (color: string): string => color.replace(/^#/, '').toUpperCase();\n\n// `<a:solidFill><a:srgbClr val>` with an optional `<a:alpha>`; `opacity` is\n// 0..1 and the wire unit is 1/1000 percent.\nconst solidFill = (color: string, opacity?: number): XmlElement =>\n elem(a('solidFill'), {\n children: [\n elem(a('srgbClr'), {\n attrs: [attr(ATTR_VAL, hexOf(color))],\n children:\n opacity !== undefined\n ? [\n valNode(\n a('alpha'),\n boundedInt(opacity * 100000, 'percent100000', 'chart series: fillOpacity'),\n ),\n ]\n : [],\n }),\n ],\n });\n\nconst solidFillSpPr = (color: string, opacity?: number): XmlElement =>\n elem(c('spPr'), { children: [solidFill(color, opacity)] });\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.\n// `<c:spPr><a:ln w?>` with an optional solid color, or null when neither is\n// authored. Every child of <a:ln> is optional, so a width alone is valid.\nconst lineSpPr = (\n color: string | undefined,\n widthEmu: number | undefined,\n field: string,\n // An axis line can be switched off while its labels stay; a hidden line\n // has no color or width left to write.\n hidden = false,\n): XmlElement | null => {\n if (hidden) {\n return elem(c('spPr'), { children: [elem(a('ln'), { children: [elem(a('noFill'))] })] });\n }\n if (color === undefined && widthEmu === undefined) return null;\n const ln = elem(a('ln'), {\n attrs:\n widthEmu !== undefined\n ? [attr(qname('', 'w', ''), String(validateLineWidthEmu(widthEmu, field)))]\n : [],\n children:\n color !== undefined\n ? [\n elem(a('solidFill'), {\n children: [\n elem(a('srgbClr'), {\n attrs: [attr(qname('', 'val', ''), color.replace(/^#/, '').toUpperCase())],\n }),\n ],\n }),\n ]\n : [],\n });\n return elem(c('spPr'), { children: [ln] });\n};\n\nconst gridlinesElement = (\n local: 'majorGridlines' | 'minorGridlines',\n color: string | undefined,\n widthEmu: number | undefined,\n field: string,\n): XmlElement => {\n const spPr = lineSpPr(color, widthEmu, field);\n return spPr === null ? elem(c(local)) : elem(c(local), { children: [spPr] });\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 + <a:ln> (line color, width,\n// dash). The reader extracts color from solidFill and the line props from\n// the ln; this writer keeps them in lock-step.\nconst seriesSpPr = (\n color: string,\n // `null` hides the connecting line (`<a:ln><a:noFill/>`). That, not the\n // chart-level style token, is what PowerPoint honors for a markers-only\n // scatter series and for the invisible series of a stock chart.\n lineColor: string | null,\n lineWidthEmu: number | undefined,\n lineDash: string | undefined,\n fillOpacity: number | undefined,\n): XmlElement => {\n const lnChildren: XmlElement[] = [lineColor === null ? elem(a('noFill')) : solidFill(lineColor)];\n if (lineColor !== null && 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'), { children: [solidFill(color, fillOpacity), ln] });\n};\n\n// `<c:marker>` for a series. PowerPoint paints a marker without <c:spPr> in\n// the theme's automatic series color, not the series' own color, so the fill\n// and outline colors are always written.\nconst markerElement = (\n symbol: string | undefined,\n sizePt: number | undefined,\n color: string,\n lineColor: string,\n): XmlElement => {\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 if (symbol !== 'none') {\n const fill = (hex: string): XmlElement =>\n elem(a('solidFill'), {\n children: [elem(a('srgbClr'), { attrs: [attr(qname('', 'val', ''), hex)] })],\n });\n children.push(\n elem(c('spPr'), { children: [fill(color), elem(a('ln'), { children: [fill(lineColor)] })] }),\n );\n }\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 fillOpacity: number | undefined,\n bubble3D: boolean,\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 on every dPt, 0 outside 3-D bubble charts.\n valNode(c('bubble3D'), bubble3D ? '1' : '0'),\n ];\n if (expl !== null) children.push(valNode(c('explosion'), Math.round(expl)));\n if (color !== null) children.push(solidFillSpPr(color, fillOpacity));\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\n// `<c:errBars>` (CT_ErrBars). `direction` is written for the xy kinds only:\n// their series take one element per direction, while a category series has\n// a single value direction and PowerPoint leaves `<c:errDir>` out.\nconst errBarsElement = (bars: ChartErrorBars, direction: 'x' | 'y' | null): XmlElement => {\n const children: XmlElement[] = [];\n if (direction !== null) children.push(valNode(c('errDir'), direction));\n children.push(valNode(c('errBarType'), bars.barType), valNode(c('errValType'), bars.amount.type));\n if (bars.noEndCap !== undefined) children.push(valNode(c('noEndCap'), bars.noEndCap ? '1' : '0'));\n if (bars.amount.type === 'cust') {\n // Literal amounts: error margins rarely live in the chart's data sheet,\n // and a `<c:numLit>` needs no workbook range to stay valid.\n const literal = (name: 'plus' | 'minus', points: ReadonlyArray<number | null>): XmlElement =>\n elem(c(name), {\n children: [elem(c('numLit'), { children: numDataChildren(points, 'General') })],\n });\n if (bars.amount.plus !== undefined) children.push(literal('plus', bars.amount.plus));\n if (bars.amount.minus !== undefined) children.push(literal('minus', bars.amount.minus));\n } else if (bars.amount.type !== 'stdErr') {\n children.push(valNode(c('val'), bars.amount.value));\n }\n const spPr = lineSpPr(bars.color, bars.lineWidthEmu, 'chart series: errorBars.lineWidthEmu');\n if (spPr !== null) children.push(spPr);\n return elem(c('errBars'), { children });\n};\n\n// Which CT_*Ser a series serializes as. It decides the children a series\n// may carry and their order; a stock chart's series are CT_LineSer.\ntype SeriesShape = 'bar' | 'line' | 'area' | 'pie' | 'scatter' | 'bubble' | 'radar' | 'surface';\n\nconst SERIES_SHAPE: Readonly<Record<ChartSpec['kind'], SeriesShape>> = {\n bar: 'bar',\n column: 'bar',\n line: 'line',\n stock: 'line',\n area: 'area',\n pie: 'pie',\n doughnut: 'pie',\n scatter: 'scatter',\n bubble: 'bubble',\n radar: 'radar',\n surface: 'surface',\n};\n\n// Children each series shape allows beyond the shared head, per dml-chart.xsd.\n// Emitting one outside its shape is schema-invalid.\nconst SHAPES_WITH_MARKER: ReadonlySet<SeriesShape> = new Set(['line', 'scatter', 'radar']);\nconst SHAPES_WITH_TRENDLINE: ReadonlySet<SeriesShape> = new Set([\n 'bar',\n 'line',\n 'area',\n 'scatter',\n 'bubble',\n]);\nconst SHAPES_WITH_ERR_BARS = SHAPES_WITH_TRENDLINE;\nconst SHAPES_WITH_INVERT: ReadonlySet<SeriesShape> = new Set(['bar', 'bubble']);\n\n// Scatter sub-types that draw the connecting line / the point markers.\nconst SCATTER_STYLES_WITH_LINE: ReadonlySet<string> = new Set([\n 'line',\n 'lineMarker',\n 'smooth',\n 'smoothMarker',\n]);\nconst SCATTER_STYLES_WITH_MARKER: ReadonlySet<string> = new Set([\n 'marker',\n 'lineMarker',\n 'smoothMarker',\n]);\n\n// The `<c:cat>` channel shared by every series of a category chart.\nconst categoryChannel = (spec: ChartSpec, formula: string): XmlElement => {\n if (spec.categoryAxisDate !== undefined) {\n return elem(c('cat'), {\n children: [\n numRef(\n formula,\n spec.categories.map(dateSerial),\n spec.categoryAxisNumberFormat ?? 'General',\n ),\n ],\n });\n }\n if (spec.categoryGroupLevels !== undefined && spec.categoryGroupLevels.length > 0) {\n return elem(c('cat'), {\n children: [\n multiLvlStrRef(\n formula,\n [spec.categories, ...spec.categoryGroupLevels],\n spec.categories.length,\n ),\n ],\n });\n }\n return elem(c('cat'), { children: [strRef(formula, spec.categories)] });\n};\n\nconst padTo = (\n values: ReadonlyArray<number | null> | undefined,\n length: number,\n): Array<number | null> => Array.from({ length }, (_, i) => values?.[i] ?? null);\n\nconst seriesElement = (\n spec: ChartSpec,\n seriesIdx: number,\n layout: ChartSheetLayout,\n): XmlElement => {\n const series = spec.series[seriesIdx];\n const refs = layout.series[seriesIdx];\n if (!series || !refs) throw new Error('seriesElement: out of range');\n\n const color =\n series.color !== undefined\n ? hexOf(series.color)\n : (DEFAULT_ACCENT_COLORS[seriesIdx % DEFAULT_ACCENT_COLORS.length] ?? '4472C4');\n\n // A combo series is shaped by its own plot group, not the chart's kind.\n const kind = series.chartKind ?? spec.kind;\n const shape = SERIES_SHAPE[kind];\n const children: XmlElement[] = [\n valNode(c('idx'), seriesIdx),\n valNode(c('order'), seriesIdx),\n elem(c('tx'), { children: [strRef(refs.name, [series.name])] }),\n ];\n\n // The data channels. Category shapes right-pad `values` to the category\n // count so the points line up with the axis; xy shapes pair their channels\n // point by point against the series' own length.\n const isXy = shape === 'scatter' || shape === 'bubble';\n const pointCount = isXy ? series.values.length : spec.categories.length;\n const channels: XmlElement[] = [];\n if (isXy) {\n if (refs.xValues === undefined) throw new Error('seriesElement: xy series without an x range');\n channels.push(\n elem(c('xVal'), { children: [numRef(refs.xValues, padTo(series.xValues, pointCount))] }),\n elem(c('yVal'), { children: [numRef(refs.values, padTo(series.values, pointCount))] }),\n );\n if (shape === 'bubble') {\n if (refs.bubbleSizes === undefined) {\n throw new Error('seriesElement: bubble series without a size range');\n }\n channels.push(\n elem(c('bubbleSize'), {\n children: [numRef(refs.bubbleSizes, padTo(series.bubbleSizes, pointCount))],\n }),\n valNode(c('bubble3D'), spec.bubble3D === true ? '1' : '0'),\n );\n }\n } else {\n if (layout.categories === undefined) {\n throw new Error('seriesElement: category series without a category range');\n }\n channels.push(\n categoryChannel(spec, layout.categories),\n elem(c('val'), { children: [numRef(refs.values, padTo(series.values, pointCount))] }),\n );\n }\n\n // A surface is colored by value band, not by series, and CT_SurfaceSer\n // has no child besides its channels — nothing below applies to it.\n if (shape === 'surface') {\n return elem(c('ser'), { children: [...children, ...channels] });\n }\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 const scatterStyle = spec.scatterStyle ?? 'marker';\n // Stock series are invisible carriers for the high-low lines and up/down\n // bars; a scatter series without a line sub-type shows its markers only.\n const lineHidden =\n spec.kind === 'stock' || (shape === 'scatter' && !SCATTER_STYLES_WITH_LINE.has(scatterStyle));\n if (\n lineHidden ||\n shape === 'line' ||\n shape === 'scatter' ||\n shape === 'radar' ||\n series.lineWidthEmu !== undefined ||\n series.lineColor !== undefined ||\n series.lineDash !== undefined\n ) {\n const lineColor = lineHidden\n ? null\n : series.lineColor !== undefined\n ? hexOf(series.lineColor)\n : color;\n children.push(\n seriesSpPr(color, lineColor, series.lineWidthEmu, series.lineDash, series.fillOpacity),\n );\n } else {\n children.push(solidFillSpPr(color, series.fillOpacity));\n }\n // invertIfNegative only exists on CT_BarSer and CT_BubbleSer. Emitting it on\n // a line/pie/area series is schema-invalid, so gate on those shapes.\n if (series.invertIfNegative === true && SHAPES_WITH_INVERT.has(shape)) {\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 (SHAPES_WITH_MARKER.has(shape)) {\n const markerColor = series.markerColor !== undefined ? hexOf(series.markerColor) : color;\n const markerLineColor =\n series.markerLineColor !== undefined ? hexOf(series.markerLineColor) : markerColor;\n // Markers are on by default, so the sub-types that have none must say so\n // on every series: stock charts, marker-less scatter styles, and the\n // standard / filled radar.\n const markersOff =\n spec.kind === 'stock' ||\n (shape === 'scatter' && !SCATTER_STYLES_WITH_MARKER.has(scatterStyle)) ||\n (shape === 'radar' && spec.radarStyle !== 'marker');\n children.push(\n markerElement(\n series.markerSymbol ?? (markersOff ? 'none' : undefined),\n series.markerSizePt,\n markerColor,\n markerLineColor,\n ),\n );\n }\n // <c:dPt> overrides go after invertIfNegative / marker per schema.\n for (const dPt of dPtElements(\n series.pointColors,\n series.pointExplosions,\n series.fillOpacity,\n spec.bubble3D === true,\n )) {\n children.push(dPt);\n }\n // Without the series-level show* group, LibreOffice treats the missing\n // toggles as on and paints every label kind on the points that have no\n // override — so per-point labels require the series defaults.\n if (series.pointDataLabels !== undefined && series.dataLabels === undefined) {\n throw new Error(\n `chart: series '${series.name}' sets pointDataLabels without dataLabels; add the series-level dataLabels the overrides fall back to`,\n );\n }\n const serDLbls = buildDLblsFromLabels(series.dataLabels, series.pointDataLabels);\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 (series.trendline && SHAPES_WITH_TRENDLINE.has(shape) && spec.kind !== 'stock') {\n children.push(trendlineElement(series.trendline));\n }\n if (series.errorBars !== undefined || series.xErrorBars !== undefined) {\n if (!SHAPES_WITH_ERR_BARS.has(shape)) {\n throw new Error(\n `chart: series '${series.name}' sets error bars, which a ${kind} series cannot carry (bar / column / line / area / scatter / bubble only)`,\n );\n }\n if (series.xErrorBars !== undefined && !isXy) {\n throw new Error(\n `chart: series '${series.name}' sets xErrorBars, which only scatter / bubble series have an x channel for`,\n );\n }\n // CT_ErrBars order is free between the two, PowerPoint writes x then y.\n if (series.xErrorBars !== undefined) children.push(errBarsElement(series.xErrorBars, 'x'));\n if (series.errorBars !== undefined) {\n children.push(errBarsElement(series.errorBars, isXy ? 'y' : null));\n }\n }\n // CT_BubbleSer closes with bubbleSize + bubble3D; nothing follows them.\n children.push(...channels);\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 / CT_ScatterSer carry smooth —\n // emitting it on a bar/pie series would be schema-invalid.)\n if (shape === 'line') {\n children.push(valNode(c('smooth'), series.smooth === true ? '1' : '0'));\n } else if (shape === 'scatter') {\n const smooth = series.smooth ?? (scatterStyle === 'smooth' || scatterStyle === 'smoothMarker');\n children.push(valNode(c('smooth'), smooth ? '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// Secondary axis pair for combo charts (series with `secondaryAxis: true`).\nconst SEC_CAT_AX_ID = 333333333;\nconst SEC_VAL_AX_ID = 444444444;\n\ninterface AxisIdPair {\n readonly cat: number;\n readonly val: number;\n}\n\nconst PRIMARY_AXES: AxisIdPair = { cat: CAT_AX_ID, val: VAL_AX_ID };\nconst SECONDARY_AXES: AxisIdPair = { cat: SEC_CAT_AX_ID, val: SEC_VAL_AX_ID };\n\n/** Category kinds that can participate in a combo plot-group split. */\nconst COMBO_KINDS = new Set<string>(['bar', 'column', 'line', 'area']);\n\nconst effectiveSeriesKind = (spec: ChartSpec, seriesIdx: number): ChartSpec['kind'] =>\n spec.series[seriesIdx]?.chartKind ?? spec.kind;\n\n/**\n * Splits the series into plot groups keyed by (effective kind, axis).\n * Primary-axis groups come first so secondary overlays paint on top,\n * and bar groups precede line/area within each axis for the same reason\n * (matching PowerPoint's combo emit order).\n */\nconst comboPlotGroups = (\n spec: ChartSpec,\n): { kind: ChartSpec['kind']; secondary: boolean; indices: number[] }[] => {\n const groups = new Map<\n string,\n { kind: ChartSpec['kind']; secondary: boolean; indices: number[] }\n >();\n for (let i = 0; i < spec.series.length; i++) {\n const kind = effectiveSeriesKind(spec, i);\n const secondary = spec.series[i]?.secondaryAxis === true;\n const key = `${kind}|${secondary ? '1' : '0'}`;\n const group = groups.get(key);\n if (group) group.indices.push(i);\n else groups.set(key, { kind, secondary, indices: [i] });\n }\n const paintOrder = (g: { kind: ChartSpec['kind']; secondary: boolean }): number =>\n (g.secondary ? 2 : 0) + (g.kind === 'line' || g.kind === 'area' ? 1 : 0);\n return [...groups.values()].sort((a, b) => paintOrder(a) - paintOrder(b));\n};\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 dateAxis = spec.categoryAxisDate;\n // CT_Scaling order: logBase, orientation, max, min. Only a date axis has a\n // numeric range to bound; `validateSpec` rejects scaling on a text axis.\n const scalingChildren: XmlElement[] = [valNode(c('orientation'), catOrientation)];\n if (spec.categoryAxisScaling?.max !== undefined) {\n scalingChildren.push(valNode(c('max'), spec.categoryAxisScaling.max));\n }\n if (spec.categoryAxisScaling?.min !== undefined) {\n scalingChildren.push(valNode(c('min'), spec.categoryAxisScaling.min));\n }\n const children: XmlElement[] = [\n valNode(c('axId'), CAT_AX_ID),\n elem(c('scaling'), { children: scalingChildren }),\n valNode(c('delete'), spec.categoryAxisHidden ? '1' : '0'),\n valNode(c('axPos'), isHorizontalBar(spec) ? 'l' : 'b'),\n ];\n if (spec.categoryAxisMajorGridlines) {\n children.push(\n gridlinesElement(\n 'majorGridlines',\n spec.categoryAxisMajorGridlineColor,\n spec.categoryAxisMajorGridlineWidthEmu,\n 'chart: categoryAxisMajorGridlineWidthEmu',\n ),\n );\n }\n if (spec.categoryAxisMinorGridlines) {\n children.push(\n gridlinesElement(\n 'minorGridlines',\n spec.categoryAxisMinorGridlineColor,\n spec.categoryAxisMinorGridlineWidthEmu,\n 'chart: categoryAxisMinorGridlineWidthEmu',\n ),\n );\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 const catLine = lineSpPr(\n spec.categoryAxisLineColor,\n spec.categoryAxisLineWidthEmu,\n 'chart: categoryAxisLineWidthEmu',\n spec.categoryAxisLineHidden === true,\n );\n if (catLine !== null) children.push(catLine);\n const catTxPr = axisTxPrElement(spec.categoryAxisLabelStyle, spec.categoryAxisLabelRotationDeg);\n if (catTxPr) children.push(catTxPr);\n children.push(valNode(c('crossAx'), VAL_AX_ID));\n if (dateAxis !== undefined) {\n // CT_DateAx tail: auto, lblOffset, then the unit pairs. `auto` is off —\n // with it on PowerPoint re-decides between a text and a date axis from\n // the data and may discard the authored units.\n children.push(valNode(c('auto'), '0'));\n if (spec.categoryAxisLabelOffset !== undefined) {\n children.push(valNode(c('lblOffset'), spec.categoryAxisLabelOffset));\n }\n if (dateAxis.baseTimeUnit !== undefined) {\n children.push(valNode(c('baseTimeUnit'), dateAxis.baseTimeUnit));\n }\n if (dateAxis.majorUnit !== undefined)\n children.push(valNode(c('majorUnit'), dateAxis.majorUnit));\n if (dateAxis.majorTimeUnit !== undefined) {\n children.push(valNode(c('majorTimeUnit'), dateAxis.majorTimeUnit));\n }\n if (dateAxis.minorUnit !== undefined)\n children.push(valNode(c('minorUnit'), dateAxis.minorUnit));\n if (dateAxis.minorTimeUnit !== undefined) {\n children.push(valNode(c('minorTimeUnit'), dateAxis.minorTimeUnit));\n }\n return elem(c('dateAx'), { children });\n }\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\n// The primary and secondary value axes share one element shape; only the\n// axis ids, the position, and the crossing differ. Every field is spelled\n// out (with `undefined`) so both callers must decide about each one.\ninterface ValueAxisFields {\n readonly scaling: ChartAxisScaling | undefined;\n readonly orientation: 'minMax' | 'maxMin' | undefined;\n readonly hidden: boolean | undefined;\n readonly majorGridlines: boolean | undefined;\n readonly majorGridlineColor: string | undefined;\n readonly majorGridlineWidthEmu: number | undefined;\n readonly minorGridlines: boolean | undefined;\n readonly minorGridlineColor: string | undefined;\n readonly minorGridlineWidthEmu: number | undefined;\n readonly title: string | undefined;\n readonly titleStyle: ChartTextStyle | undefined;\n readonly titleRotationDeg: number | undefined;\n readonly majorTickMark: 'in' | 'out' | 'cross' | 'none' | undefined;\n readonly minorTickMark: 'in' | 'out' | 'cross' | 'none' | undefined;\n readonly tickLabelPos: 'none' | 'low' | 'high' | 'nextTo' | undefined;\n readonly lineColor: string | undefined;\n readonly lineWidthEmu: number | undefined;\n readonly lineHidden: boolean | undefined;\n /** Spec paths of this axis' width fields, for validation messages. */\n readonly widthFields: {\n readonly majorGridline: string;\n readonly minorGridline: string;\n readonly line: string;\n };\n readonly labelStyle: ChartTextStyle | undefined;\n readonly labelRotationDeg: number | undefined;\n readonly crosses: ChartSpec['valueAxisCrosses'];\n readonly crossBetween: 'between' | 'midCat' | undefined;\n}\n\nconst valueAxisElement = (\n f: ValueAxisFields,\n ids: { axId: number; crossAxId: number; axPos: 'l' | 'r' | 'b' | 't' },\n): 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 (f.scaling?.logBase !== undefined) {\n scalingChildren.push(valNode(c('logBase'), f.scaling.logBase));\n }\n scalingChildren.push(valNode(c('orientation'), f.orientation ?? 'minMax'));\n if (f.scaling?.max !== undefined) {\n scalingChildren.push(valNode(c('max'), f.scaling.max));\n }\n if (f.scaling?.min !== undefined) {\n scalingChildren.push(valNode(c('min'), f.scaling.min));\n }\n const children: XmlElement[] = [\n valNode(c('axId'), ids.axId),\n elem(c('scaling'), { children: scalingChildren }),\n valNode(c('delete'), f.hidden ? '1' : '0'),\n valNode(c('axPos'), ids.axPos),\n ];\n if (f.majorGridlines) {\n children.push(\n gridlinesElement(\n 'majorGridlines',\n f.majorGridlineColor,\n f.majorGridlineWidthEmu,\n `chart: ${f.widthFields.majorGridline}`,\n ),\n );\n }\n if (f.minorGridlines) {\n children.push(\n gridlinesElement(\n 'minorGridlines',\n f.minorGridlineColor,\n f.minorGridlineWidthEmu,\n `chart: ${f.widthFields.minorGridline}`,\n ),\n );\n }\n if (f.title !== undefined) {\n children.push(titleElement(f.title, f.titleStyle, f.titleRotationDeg));\n }\n if (f.scaling?.numberFormat !== undefined) {\n children.push(\n elem(c('numFmt'), {\n attrs: [\n attr(qname('', 'formatCode', ''), f.scaling.numberFormat),\n attr(qname('', 'sourceLinked', ''), '0'),\n ],\n }),\n );\n }\n if (f.majorTickMark !== undefined) {\n children.push(valNode(c('majorTickMark'), f.majorTickMark));\n }\n if (f.minorTickMark !== undefined) {\n children.push(valNode(c('minorTickMark'), f.minorTickMark));\n }\n if (f.tickLabelPos !== undefined) {\n children.push(valNode(c('tickLblPos'), f.tickLabelPos));\n }\n const axisLine = lineSpPr(\n f.lineColor,\n f.lineWidthEmu,\n `chart: ${f.widthFields.line}`,\n f.lineHidden === true,\n );\n if (axisLine !== null) children.push(axisLine);\n const valTxPr = axisTxPrElement(f.labelStyle, f.labelRotationDeg);\n if (valTxPr) children.push(valTxPr);\n children.push(valNode(c('crossAx'), ids.crossAxId));\n // <c:crosses val>/`crossesAt val>` — mutually exclusive per the\n // schema. Object form `{ at: N }` → crossesAt; string form → crosses.\n const xross = f.crosses;\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 (f.crossBetween !== undefined) {\n children.push(valNode(c('crossBetween'), f.crossBetween));\n }\n if (f.scaling?.majorUnit !== undefined) {\n children.push(valNode(c('majorUnit'), f.scaling.majorUnit));\n }\n if (f.scaling?.minorUnit !== undefined) {\n children.push(valNode(c('minorUnit'), f.scaling.minorUnit));\n }\n if (f.scaling?.displayUnits !== undefined) {\n children.push(\n elem(c('dispUnits'), {\n children: [\n valNode(c('builtInUnit'), f.scaling.displayUnits),\n // An empty label element is \"show the caption, positioned and\n // worded by the application\".\n ...(f.scaling.displayUnitsLabel === true ? [elem(c('dispUnitsLbl'))] : []),\n ],\n }),\n );\n }\n return elem(c('valAx'), { children });\n};\n\n// Horizontal bars swap the axis positions: categories run down the left\n// edge and values along the bottom. PowerPoint and PptxGenJS both write\n// `catAx axPos=\"l\"` / `valAx axPos=\"b\"` for `barDir=\"bar\"`.\nconst isHorizontalBar = (spec: ChartSpec): boolean => spec.kind === 'bar';\n\nconst valAxis = (spec: ChartSpec): XmlElement =>\n valueAxisElement(\n {\n scaling: spec.valueAxis,\n orientation: spec.valueAxisOrientation,\n hidden: spec.valueAxisHidden,\n majorGridlines: spec.valueAxisMajorGridlines,\n majorGridlineColor: spec.valueAxisMajorGridlineColor,\n majorGridlineWidthEmu: spec.valueAxisMajorGridlineWidthEmu,\n minorGridlines: spec.valueAxisMinorGridlines,\n minorGridlineColor: spec.valueAxisMinorGridlineColor,\n minorGridlineWidthEmu: spec.valueAxisMinorGridlineWidthEmu,\n title: spec.valueAxisTitle,\n titleStyle: spec.valueAxisTitleStyle,\n titleRotationDeg: spec.valueAxisTitleRotationDeg,\n majorTickMark: spec.valueAxisMajorTickMark,\n minorTickMark: spec.valueAxisMinorTickMark,\n tickLabelPos: spec.valueAxisTickLabelPos,\n lineColor: spec.valueAxisLineColor,\n lineWidthEmu: spec.valueAxisLineWidthEmu,\n lineHidden: spec.valueAxisLineHidden,\n widthFields: {\n majorGridline: 'valueAxisMajorGridlineWidthEmu',\n minorGridline: 'valueAxisMinorGridlineWidthEmu',\n line: 'valueAxisLineWidthEmu',\n },\n labelStyle: spec.valueAxisLabelStyle,\n labelRotationDeg: spec.valueAxisLabelRotationDeg,\n crosses: spec.valueAxisCrosses,\n crossBetween: spec.valueAxisCrossBetween,\n },\n { axId: VAL_AX_ID, crossAxId: CAT_AX_ID, axPos: isHorizontalBar(spec) ? 'b' : 'l' },\n );\n\n/**\n * The horizontal axis of a scatter / bubble chart. Both of their axes are\n * `<c:valAx>`; this one takes the spec's `categoryAxis*` fields, so an\n * author formats \"the axis along the bottom\" the same way for every kind.\n * It keeps the category axis' id, which the y axis already crosses.\n */\nconst xValAxis = (spec: ChartSpec): XmlElement =>\n valueAxisElement(\n {\n scaling: {\n ...spec.categoryAxisScaling,\n ...(spec.categoryAxisNumberFormat !== undefined\n ? { numberFormat: spec.categoryAxisNumberFormat }\n : {}),\n },\n orientation: spec.categoryAxisOrientation,\n hidden: spec.categoryAxisHidden,\n majorGridlines: spec.categoryAxisMajorGridlines,\n majorGridlineColor: spec.categoryAxisMajorGridlineColor,\n majorGridlineWidthEmu: spec.categoryAxisMajorGridlineWidthEmu,\n minorGridlines: spec.categoryAxisMinorGridlines,\n minorGridlineColor: spec.categoryAxisMinorGridlineColor,\n minorGridlineWidthEmu: spec.categoryAxisMinorGridlineWidthEmu,\n title: spec.categoryAxisTitle,\n titleStyle: spec.categoryAxisTitleStyle,\n titleRotationDeg: spec.categoryAxisTitleRotationDeg,\n majorTickMark: spec.categoryAxisMajorTickMark,\n minorTickMark: spec.categoryAxisMinorTickMark,\n tickLabelPos: spec.categoryAxisTickLabelPos,\n lineColor: spec.categoryAxisLineColor,\n lineWidthEmu: spec.categoryAxisLineWidthEmu,\n lineHidden: spec.categoryAxisLineHidden,\n widthFields: {\n majorGridline: 'categoryAxisMajorGridlineWidthEmu',\n minorGridline: 'categoryAxisMinorGridlineWidthEmu',\n line: 'categoryAxisLineWidthEmu',\n },\n labelStyle: spec.categoryAxisLabelStyle,\n labelRotationDeg: spec.categoryAxisLabelRotationDeg,\n crosses: undefined,\n // Points sit on the tick marks of a numeric axis, not between them.\n crossBetween: 'midCat',\n },\n { axId: CAT_AX_ID, crossAxId: VAL_AX_ID, axPos: 'b' },\n );\n\n// Series (depth) axis id — see the axis-id note above.\nconst SER_AX_ID = 555555555;\n\n/** `<c:serAx>` — the depth axis of a 3-D or surface chart; it crosses the value axis. */\nconst serAxis = (spec: ChartSpec): XmlElement => {\n const s = spec.seriesAxis ?? {};\n const children: XmlElement[] = [\n valNode(c('axId'), SER_AX_ID),\n elem(c('scaling'), { children: [valNode(c('orientation'), s.orientation ?? 'minMax')] }),\n valNode(c('delete'), s.hidden ? '1' : '0'),\n valNode(c('axPos'), 'b'),\n ];\n if (s.majorGridlines) children.push(elem(c('majorGridlines')));\n if (s.title !== undefined) children.push(titleElement(s.title, s.titleStyle));\n if (s.tickLabelPos !== undefined) children.push(valNode(c('tickLblPos'), s.tickLabelPos));\n const line = lineSpPr(s.lineColor, undefined, 'chart: seriesAxis');\n if (line !== null) children.push(line);\n const txPr = axisTxPrElement(s.labelStyle, undefined);\n if (txPr !== null) children.push(txPr);\n children.push(valNode(c('crossAx'), VAL_AX_ID));\n if (s.tickLabelSkip !== undefined) children.push(valNode(c('tickLblSkip'), s.tickLabelSkip));\n return elem(c('serAx'), { 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 = (\n dl: ChartDataLabels | undefined,\n pointLabels: ReadonlyArray<ChartDataLabels | null> | undefined = undefined,\n): XmlElement | null => {\n // CT_DLbls: the per-point <c:dLbl> overrides precede the series-level\n // group, and a <c:dLbls> holding only overrides is schema-valid.\n const children: XmlElement[] = [];\n pointLabels?.forEach((pl, i) => {\n if (pl === null) return;\n children.push(\n elem(c('dLbl'), {\n children: [\n valNode(c('idx'), i),\n // CT_DLbl only: a literal <c:tx> sits between idx and the shared group.\n ...(pl.text !== undefined ? [elem(c('tx'), { children: [richText(pl.text)] })] : []),\n ...dLblGroupChildren(pl),\n ],\n }),\n );\n });\n if (dl) {\n children.push(...dLblGroupChildren(dl));\n // Group_DLbls only: showLeaderLines follows separator in schema order.\n if (dl.showLeaderLines !== undefined) {\n children.push(valNode(c('showLeaderLines'), dl.showLeaderLines ? '1' : '0'));\n }\n }\n return children.length === 0 ? null : elem(c('dLbls'), { children });\n};\n\n// The shared tail of CT_DLbl / CT_DLbls (Group_DLbl / Group_DLbls): numFmt,\n// txPr, dLblPos, the show* toggles, separator — in schema order.\nconst dLblGroupChildren = (dl: ChartDataLabels): XmlElement[] => {\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.fillColor !== undefined) children.push(solidFillSpPr(dl.fillColor));\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'), dl.showLegendKey ? '1' : '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'), dl.showBubbleSize ? '1' : '0'),\n );\n if (dl.separator !== undefined) {\n children.push(elem(c('separator'), { children: [text(dl.separator)] }));\n }\n return children;\n};\n\nconst dLblsElement = (spec: ChartSpec): XmlElement | null => buildDLblsFromLabels(spec.dataLabels);\n\n// Plot groups ---------------------------------------------------------------\n\n/** What every plot-group builder needs: the chart, its sheet, its series, its axes. */\ninterface PlotGroup {\n readonly spec: ChartSpec;\n readonly layout: ChartSheetLayout;\n readonly seriesIndices: ReadonlyArray<number>;\n readonly axes: AxisIdPair;\n}\n\nconst groupSeries = (g: PlotGroup): XmlElement[] =>\n g.seriesIndices.map((i) => seriesElement(g.spec, i, g.layout));\n\nconst groupDLbls = (g: PlotGroup): XmlElement[] => {\n const dl = dLblsElement(g.spec);\n return dl ? [dl] : [];\n};\n\nconst isThreeD = (spec: ChartSpec): boolean => spec.view3D !== undefined;\n\n/**\n * Whether the chart carries a series (depth) axis. `<c:line3DChart>` and\n * the surface elements require three axes; 3-D bar / area charts only lay\n * their series out in depth — and so only have the axis — under the\n * `standard` grouping.\n */\nconst hasSeriesAxis = (spec: ChartSpec): boolean => {\n if (spec.kind === 'surface') return true;\n if (!isThreeD(spec)) return false;\n if (spec.kind === 'line') return true;\n return (\n (spec.kind === 'bar' || spec.kind === 'column' || spec.kind === 'area') &&\n spec.grouping === 'standard'\n );\n};\n\nconst axIdNodes = (g: PlotGroup): XmlElement[] => [\n valNode(c('axId'), g.axes.cat),\n valNode(c('axId'), g.axes.val),\n ...(hasSeriesAxis(g.spec) ? [valNode(c('axId'), SER_AX_ID)] : []),\n];\n\nconst gapDepthNodes = (spec: ChartSpec): XmlElement[] =>\n spec.gapDepthPct !== undefined\n ? [valNode(c('gapDepth'), gapAmountPercent(spec.gapDepthPct, 'chart: gapDepthPct'))]\n : [];\n\nconst buildBarChart = (g: PlotGroup, direction: 'col' | 'bar'): XmlElement => {\n const { spec } = g;\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 ...groupSeries(g),\n ...groupDLbls(g),\n ];\n if (spec.gapWidthPct !== undefined) {\n children.push(valNode(c('gapWidth'), gapAmountPercent(spec.gapWidthPct, 'chart: gapWidthPct')));\n }\n if (isThreeD(spec)) {\n // CT_Bar3DChart swaps <c:overlap> for <c:gapDepth> + <c:shape>.\n children.push(...gapDepthNodes(spec));\n if (spec.bar3DShape !== undefined) children.push(valNode(c('shape'), spec.bar3DShape));\n children.push(...axIdNodes(g));\n return elem(c('bar3DChart'), { children });\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(...axIdNodes(g));\n return elem(c('barChart'), { children });\n};\n\n// CT_Grouping (line / area) has no `clustered`, unlike CT_BarGrouping; a\n// combo chart's bar grouping maps to the plain `standard` for those groups.\nconst lineAreaGrouping = (spec: ChartSpec): 'standard' | 'stacked' | 'percentStacked' =>\n spec.grouping === 'stacked' || spec.grouping === 'percentStacked' ? spec.grouping : 'standard';\n\n// `<c:upDownBars>`; an empty <c:upBars/> / <c:downBars/> takes the\n// application's automatic fill (white up, black down in PowerPoint).\nconst upDownBarsElement = (bars: NonNullable<ChartSpec['upDownBars']>): XmlElement => {\n const bar = (name: 'upBars' | 'downBars', color: string | undefined): XmlElement =>\n elem(c(name), { children: color !== undefined ? [solidFillSpPr(color)] : [] });\n return elem(c('upDownBars'), {\n children: [\n ...(bars.gapWidthPct !== undefined\n ? [\n valNode(\n c('gapWidth'),\n gapAmountPercent(bars.gapWidthPct, 'chart: upDownBars.gapWidthPct'),\n ),\n ]\n : []),\n bar('upBars', bars.upColor),\n bar('downBars', bars.downColor),\n ],\n });\n};\n\nconst buildLineChart = (g: PlotGroup): XmlElement => {\n const { spec } = g;\n const children: XmlElement[] = [\n valNode(c('grouping'), lineAreaGrouping(spec)),\n valNode(c('varyColors'), spec.varyColors ? '1' : '0'),\n ...groupSeries(g),\n ...groupDLbls(g),\n ];\n if (spec.dropLines) children.push(elem(c('dropLines')));\n if (isThreeD(spec)) {\n // CT_Line3DChart ends the shared head here: no high-low lines, up/down\n // bars or markers in 3-D.\n if (spec.hiLowLines || spec.upDownBars !== undefined) {\n throw new Error('chart: hiLowLines / upDownBars are not available on a 3-D line chart');\n }\n children.push(...gapDepthNodes(spec), ...axIdNodes(g));\n return elem(c('line3DChart'), { children });\n }\n if (spec.hiLowLines) children.push(elem(c('hiLowLines')));\n if (spec.upDownBars !== undefined) children.push(upDownBarsElement(spec.upDownBars));\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(valNode(c('marker'), spec.lineMarkers === false ? '0' : '1'), ...axIdNodes(g));\n return elem(c('lineChart'), { children });\n};\n\nconst buildAreaChart = (g: PlotGroup): XmlElement => {\n const { spec } = g;\n const children: XmlElement[] = [\n valNode(c('grouping'), lineAreaGrouping(spec)),\n valNode(c('varyColors'), spec.varyColors ? '1' : '0'),\n ...groupSeries(g),\n ...groupDLbls(g),\n ];\n // Drop lines belong to the group they were authored for: in a combo chart\n // the line group already carries them.\n if (spec.dropLines && spec.kind === 'area') children.push(elem(c('dropLines')));\n if (isThreeD(spec)) {\n children.push(...gapDepthNodes(spec), ...axIdNodes(g));\n return elem(c('area3DChart'), { children });\n }\n children.push(...axIdNodes(g));\n return elem(c('areaChart'), { children });\n};\n\nconst requireSingleSeries = (spec: ChartSpec): void => {\n if (spec.series.length !== 1) {\n throw new Error(`${spec.kind} chart requires exactly one series`);\n }\n};\n\nconst firstSliceAngNodes = (spec: ChartSpec): XmlElement[] =>\n spec.firstSliceAngleDeg !== undefined\n ? [\n valNode(\n c('firstSliceAng'),\n firstSliceAngle(spec.firstSliceAngleDeg, 'chart: firstSliceAngleDeg'),\n ),\n ]\n : [];\n\nconst buildOfPieChart = (g: PlotGroup, ofPie: NonNullable<ChartSpec['ofPie']>): XmlElement => {\n const children: XmlElement[] = [\n valNode(c('ofPieType'), ofPie.type),\n valNode(c('varyColors'), '1'),\n ...groupSeries(g),\n ...groupDLbls(g),\n ];\n if (ofPie.gapWidthPct !== undefined) {\n children.push(\n valNode(c('gapWidth'), gapAmountPercent(ofPie.gapWidthPct, 'chart: ofPie.gapWidthPct')),\n );\n }\n if (ofPie.customSplit !== undefined && ofPie.splitType !== 'cust') {\n throw new Error(\"chart: ofPie.customSplit requires ofPie.splitType 'cust'\");\n }\n if (ofPie.splitType !== undefined) children.push(valNode(c('splitType'), ofPie.splitType));\n if (ofPie.splitPos !== undefined) children.push(valNode(c('splitPos'), ofPie.splitPos));\n if (ofPie.customSplit !== undefined) {\n children.push(\n elem(c('custSplit'), {\n children: ofPie.customSplit.map((idx) => valNode(c('secondPiePt'), idx)),\n }),\n );\n }\n if (ofPie.secondPieSizePct !== undefined) {\n children.push(\n valNode(\n c('secondPieSize'),\n boundedInt(ofPie.secondPieSizePct, 'secondPieSize', 'chart: ofPie.secondPieSizePct'),\n ),\n );\n }\n if (ofPie.seriesLines) children.push(elem(c('serLines')));\n return elem(c('ofPieChart'), { children });\n};\n\nconst buildPieChart = (g: PlotGroup): XmlElement => {\n const { spec } = g;\n requireSingleSeries(spec);\n if (spec.ofPie !== undefined) {\n if (isThreeD(spec)) throw new Error('chart: ofPie and view3D cannot be combined');\n return buildOfPieChart(g, spec.ofPie);\n }\n const children: XmlElement[] = [\n valNode(c('varyColors'), '1'),\n ...groupSeries(g),\n ...groupDLbls(g),\n ];\n if (isThreeD(spec)) {\n // CT_Pie3DChart has no <c:firstSliceAng>: a 3-D pie turns with the camera.\n if (spec.firstSliceAngleDeg !== undefined) {\n throw new Error('chart: a 3-D pie has no firstSliceAngleDeg; rotate it with view3D.rotY');\n }\n return elem(c('pie3DChart'), { children });\n }\n children.push(...firstSliceAngNodes(spec));\n return elem(c('pieChart'), { children });\n};\n\nconst buildDoughnutChart = (g: PlotGroup): XmlElement => {\n const { spec } = g;\n requireSingleSeries(spec);\n return elem(c('doughnutChart'), {\n children: [\n valNode(c('varyColors'), '1'),\n ...groupSeries(g),\n ...groupDLbls(g),\n ...firstSliceAngNodes(spec),\n valNode(c('holeSize'), holeSizePercent(spec.holeSizePct ?? 50, 'chart: holeSizePct')),\n ],\n });\n};\n\nconst buildScatterChart = (g: PlotGroup): XmlElement =>\n elem(c('scatterChart'), {\n children: [\n // The token is written as authored so it reads back unchanged, but\n // PowerPoint draws from the per-series line / marker properties —\n // `seriesElement` sets those to match.\n valNode(c('scatterStyle'), g.spec.scatterStyle ?? 'marker'),\n valNode(c('varyColors'), g.spec.varyColors ? '1' : '0'),\n ...groupSeries(g),\n ...groupDLbls(g),\n ...axIdNodes(g),\n ],\n });\n\nconst buildBubbleChart = (g: PlotGroup): XmlElement => {\n const { spec } = g;\n const children: XmlElement[] = [\n valNode(c('varyColors'), spec.varyColors ? '1' : '0'),\n ...groupSeries(g),\n ...groupDLbls(g),\n ];\n // `spec.bubble3D` is written per series only. CT_BubbleChart allows a\n // chart-level `<c:bubble3D>`, but PowerPoint (16.x, macOS) offers to repair\n // any deck that has one, whatever its value.\n if (spec.bubbleScale !== undefined) {\n children.push(\n valNode(c('bubbleScale'), boundedInt(spec.bubbleScale, 'bubbleScale', 'chart: bubbleScale')),\n );\n }\n if (spec.showNegativeBubbles !== undefined) {\n children.push(valNode(c('showNegBubbles'), spec.showNegativeBubbles ? '1' : '0'));\n }\n if (spec.bubbleSizeRepresents !== undefined) {\n // ST_SizeRepresents spells width as `w`.\n children.push(\n valNode(c('sizeRepresents'), spec.bubbleSizeRepresents === 'width' ? 'w' : 'area'),\n );\n }\n children.push(...axIdNodes(g));\n return elem(c('bubbleChart'), { children });\n};\n\nconst buildRadarChart = (g: PlotGroup): XmlElement =>\n elem(c('radarChart'), {\n children: [\n valNode(c('radarStyle'), g.spec.radarStyle ?? 'standard'),\n valNode(c('varyColors'), g.spec.varyColors ? '1' : '0'),\n ...groupSeries(g),\n ...groupDLbls(g),\n ...axIdNodes(g),\n ],\n });\n\n// CT_StockChart takes 3 series (high, low, close) or 4 (open first).\nconst STOCK_SERIES_WITH_OPEN = 4;\nconst STOCK_SERIES_WITHOUT_OPEN = 3;\n\nconst buildStockChart = (g: PlotGroup): XmlElement => {\n const { spec } = g;\n const count = spec.series.length;\n if (count !== STOCK_SERIES_WITHOUT_OPEN && count !== STOCK_SERIES_WITH_OPEN) {\n throw new Error(\n `stock chart requires 3 series (high, low, close) or 4 (open, high, low, close); got ${count}`,\n );\n }\n const children: XmlElement[] = [...groupSeries(g), ...groupDLbls(g)];\n if (spec.dropLines) children.push(elem(c('dropLines')));\n // The series themselves are invisible; the high-low lines are the chart.\n // Opt out with `hiLowLines: false`.\n if (spec.hiLowLines !== false) children.push(elem(c('hiLowLines')));\n // Up/down bars span open → close, so they need the open series; with one\n // they are the candlestick bodies and on by default.\n if (spec.upDownBars !== undefined && count !== STOCK_SERIES_WITH_OPEN) {\n throw new Error('stock chart: upDownBars require the 4-series form (open, high, low, close)');\n }\n if (count === STOCK_SERIES_WITH_OPEN) children.push(upDownBarsElement(spec.upDownBars ?? {}));\n children.push(...axIdNodes(g));\n return elem(c('stockChart'), { children });\n};\n\nconst buildSurfaceChart = (g: PlotGroup): XmlElement => {\n const { spec } = g;\n const children: XmlElement[] = [];\n if (spec.surfaceWireframe !== undefined) {\n children.push(valNode(c('wireframe'), spec.surfaceWireframe ? '1' : '0'));\n }\n children.push(...groupSeries(g), ...axIdNodes(g));\n return elem(c(spec.surfaceContour === true ? 'surfaceChart' : 'surface3DChart'), { children });\n};\n\n/** One plot group, dispatched by its effective kind. */\nconst buildPlotGroup = (g: PlotGroup, kind: ChartSpec['kind']): XmlElement => {\n switch (kind) {\n case 'column':\n return buildBarChart(g, 'col');\n case 'bar':\n return buildBarChart(g, 'bar');\n case 'line':\n return buildLineChart(g);\n case 'area':\n return buildAreaChart(g);\n case 'pie':\n return buildPieChart(g);\n case 'doughnut':\n return buildDoughnutChart(g);\n case 'scatter':\n return buildScatterChart(g);\n case 'bubble':\n return buildBubbleChart(g);\n case 'radar':\n return buildRadarChart(g);\n case 'stock':\n return buildStockChart(g);\n case 'surface':\n return buildSurfaceChart(g);\n default: {\n const exhaustive: never = kind;\n throw new Error(`unsupported chart kind: ${String(exhaustive)}`);\n }\n }\n};\n\n/**\n * Secondary value axis (`axPos=\"r\"`, crossing at the category maximum) —\n * the right-hand axis PowerPoint pairs with `secondaryAxis` series.\n * Formatting comes from `spec.secondaryValueAxis`; PowerPoint's defaults\n * apply for everything left out.\n */\nconst secondaryValAxis = (spec: ChartSpec): XmlElement => {\n const s = spec.secondaryValueAxis ?? {};\n return valueAxisElement(\n {\n scaling: s.scaling,\n orientation: undefined,\n hidden: undefined,\n majorGridlines: s.majorGridlines,\n majorGridlineColor: s.majorGridlineColor,\n majorGridlineWidthEmu: s.majorGridlineWidthEmu,\n minorGridlines: undefined,\n minorGridlineColor: undefined,\n minorGridlineWidthEmu: undefined,\n title: s.title,\n titleStyle: s.titleStyle,\n titleRotationDeg: undefined,\n majorTickMark: s.majorTickMark,\n minorTickMark: s.minorTickMark,\n tickLabelPos: s.tickLabelPos,\n lineColor: s.lineColor,\n lineWidthEmu: s.lineWidthEmu,\n lineHidden: undefined,\n widthFields: {\n majorGridline: 'secondaryValueAxis.majorGridlineWidthEmu',\n minorGridline: 'secondaryValueAxis.minorGridlineWidthEmu',\n line: 'secondaryValueAxis.lineWidthEmu',\n },\n labelStyle: s.labelStyle,\n labelRotationDeg: undefined,\n crosses: 'max',\n crossBetween: s.crossBetween,\n },\n { axId: SEC_VAL_AX_ID, crossAxId: SEC_CAT_AX_ID, axPos: 'r' },\n );\n};\n\n/**\n * Deleted companion category axis for the secondary pair. PowerPoint\n * requires every plot group's axId pair to resolve to a cat+val pair,\n * so the secondary group gets its own (hidden) category axis.\n */\nconst secondaryCatAxis = (spec: ChartSpec): XmlElement =>\n elem(c('catAx'), {\n children: [\n valNode(c('axId'), SEC_CAT_AX_ID),\n elem(c('scaling'), { children: [valNode(c('orientation'), 'minMax')] }),\n valNode(c('delete'), '1'),\n valNode(c('axPos'), isHorizontalBar(spec) ? 'l' : 'b'),\n valNode(c('crossAx'), SEC_VAL_AX_ID),\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> / <a:cs> follow the fill group in\n // CT_TextCharacterProperties, in that order; ea carries the same face as\n // latin so CJK glyphs aren't dropped to the renderer's latin-only fallback\n // (the latin slot is ignored for east-asian script). cs stays separate:\n // `font` alone must not change how complex scripts render.\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 if (style?.fontComplexScript !== undefined) {\n children.push(\n elem(a('cs'), { attrs: [attr(qname('', 'typeface', ''), style.fontComplexScript)] }),\n );\n }\n return { attrs, children };\n};\n\n// `<c:layout><c:manualLayout>`. x / y are measured from the chart's top-left\n// corner (`edge`); w / h stay in the default `factor` mode, where they are a\n// share of the chart size — under `edge` they would be the right / bottom\n// coordinates instead. `size` is absent for a title, which sizes to its text.\nconst manualLayoutElement = (\n position: { readonly x: number; readonly y: number },\n size?: { readonly w: number; readonly h: number },\n target?: ChartManualLayout['target'],\n): XmlElement =>\n elem(c('layout'), {\n children: [\n elem(c('manualLayout'), {\n children: [\n ...(target !== undefined ? [valNode(c('layoutTarget'), target)] : []),\n valNode(c('xMode'), 'edge'),\n valNode(c('yMode'), 'edge'),\n valNode(c('x'), position.x),\n valNode(c('y'), position.y),\n ...(size !== undefined ? [valNode(c('w'), size.w), valNode(c('h'), size.h)] : []),\n ],\n }),\n ],\n });\n\n// A one-run `<c:rich>` body with no formatting of its own.\nconst richText = (value: string): XmlElement =>\n elem(c('rich'), {\n children: [\n elem(a('bodyPr')),\n elem(a('lstStyle')),\n elem(a('p'), {\n children: [elem(a('r'), { children: [elem(a('t'), { children: [text(value)] })] })],\n }),\n ],\n });\n\nconst titleElement = (\n title: string,\n style?: ChartTextStyle,\n rotationDeg?: number,\n placement?: { readonly overlay?: boolean; readonly layout?: { x: number; y: number } },\n): XmlElement => {\n // The paragraph defaults stay empty so an unset size falls back to the\n // application default; the run-level <a:rPr> carries the authored style.\n //\n // No `lang`: it names the language of the run's text, and hard-coding\n // `en-US` on a title we did not author the words of is a claim we cannot\n // make. The chart-level language tag is `ChartSpec.language` (`<c:lang>`).\n const pPr = elem(a('pPr'), { children: [elem(a('defRPr'))] });\n const { attrs: runAttrs, children: runChildren } = rPrAttrsFromStyle(style);\n const runRPr = elem(a('rPr'), { attrs: runAttrs, children: runChildren });\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 // `rot` and `vert` are only written when authored: PowerPoint reads a\n // `vert=\"horz\"` without `rot` as \"not rotated\" and lays a value-axis title\n // out horizontally instead of applying its vertical default.\n const rich = elem(c('rich'), {\n children: [\n elem(a('bodyPr'), {\n attrs: [\n ...(rotationDeg !== undefined\n ? [attr(qname('', 'rot', ''), String(Math.round(rotationDeg * 60000)))]\n : []),\n attr(qname('', 'spcFirstLastPara', ''), '1'),\n attr(qname('', 'vertOverflow', ''), 'ellipsis'),\n ...(rotationDeg !== undefined ? [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 // CT_Title order: tx, layout, overlay.\n return elem(c('title'), {\n children: [\n elem(c('tx'), { children: [rich] }),\n ...(placement?.layout !== undefined ? [manualLayoutElement(placement.layout)] : []),\n valNode(c('overlay'), placement?.overlay === true ? '1' : '0'),\n ],\n });\n};\n\n// Camera defaults PowerPoint itself writes for each 3-D chart family. They\n// are spelled out so the view never depends on what a consuming application\n// falls back to for an empty <c:view3D/>.\nconst view3DDefaults = (spec: ChartSpec): ChartView3D => {\n if (spec.kind === 'surface' && spec.surfaceContour === true) {\n // A contour plot is the surface seen from straight above.\n return { rotX: 90, rotY: 0, rightAngleAxes: false, perspective: 0 };\n }\n if (spec.kind === 'pie') return { rotX: 30, rotY: 0, rightAngleAxes: false };\n if (spec.kind === 'surface')\n return { rotX: 15, rotY: 20, rightAngleAxes: false, perspective: 30 };\n return { rotX: 15, rotY: 20, rightAngleAxes: true };\n};\n\n// `<c:view3D>` in CT_View3D order: rotX, hPercent, rotY, depthPercent, rAngAx, perspective.\nconst view3DElement = (spec: ChartSpec): XmlElement => {\n const v: ChartView3D = { ...view3DDefaults(spec), ...spec.view3D };\n const children: XmlElement[] = [];\n if (v.rotX !== undefined) {\n children.push(valNode(c('rotX'), boundedInt(v.rotX, 'rotX', 'chart: view3D.rotX')));\n }\n if (v.heightPercent !== undefined) {\n children.push(\n valNode(\n c('hPercent'),\n boundedInt(v.heightPercent, 'heightPercent', 'chart: view3D.heightPercent'),\n ),\n );\n }\n if (v.rotY !== undefined) {\n children.push(valNode(c('rotY'), boundedInt(v.rotY, 'rotY', 'chart: view3D.rotY')));\n }\n if (v.depthPercent !== undefined) {\n children.push(\n valNode(\n c('depthPercent'),\n boundedInt(v.depthPercent, 'depthPercent', 'chart: view3D.depthPercent'),\n ),\n );\n }\n if (v.rightAngleAxes !== undefined) {\n children.push(valNode(c('rAngAx'), v.rightAngleAxes ? '1' : '0'));\n }\n if (v.perspective !== undefined) {\n children.push(\n valNode(\n c('perspective'),\n boundedInt(v.perspective, 'perspective', 'chart: view3D.perspective'),\n ),\n );\n }\n return elem(c('view3D'), { children });\n};\n\nconst KINDS_WITH_VIEW_3D: ReadonlySet<ChartSpec['kind']> = new Set([\n 'bar',\n 'column',\n 'line',\n 'area',\n 'pie',\n 'surface',\n]);\nconst AXISLESS_KINDS: ReadonlySet<ChartSpec['kind']> = new Set(['pie', 'doughnut']);\nconst XY_KINDS: ReadonlySet<ChartSpec['kind']> = new Set(['scatter', 'bubble']);\n\n// Cross-field rules of a spec that no single element builder owns. Each one\n// would otherwise serialize into a chart PowerPoint repairs or misdraws.\nconst validateSpec = (spec: ChartSpec, usesComboFields: boolean): void => {\n if (usesComboFields && !COMBO_KINDS.has(spec.kind)) {\n throw new Error(\n `chart kind '${spec.kind}' does not support per-series chartKind / secondaryAxis (combo charts require a bar / column / line / area base kind)`,\n );\n }\n if (spec.view3D !== undefined) {\n if (!KINDS_WITH_VIEW_3D.has(spec.kind)) {\n throw new Error(\n `chart kind '${spec.kind}' has no 3-D variant; view3D applies to bar / column / line / area / pie / surface`,\n );\n }\n // PowerPoint cannot mix a 3-D plot group with any other group.\n if (usesComboFields) throw new Error('chart: view3D cannot be combined with a combo chart');\n }\n if (\n (spec.bar3DShape !== undefined || spec.gapDepthPct !== undefined) &&\n spec.view3D === undefined\n ) {\n throw new Error('chart: bar3DShape / gapDepthPct require view3D');\n }\n if (spec.ofPie !== undefined && spec.kind !== 'pie') {\n throw new Error(`chart: ofPie applies to kind 'pie', not '${spec.kind}'`);\n }\n if (spec.dataTable !== undefined && (AXISLESS_KINDS.has(spec.kind) || XY_KINDS.has(spec.kind))) {\n throw new Error(`chart kind '${spec.kind}' cannot show a data table`);\n }\n if (spec.categoryAxisDate !== undefined) {\n if (AXISLESS_KINDS.has(spec.kind) || XY_KINDS.has(spec.kind)) {\n throw new Error(`chart kind '${spec.kind}' has no category axis to make a date axis of`);\n }\n if (spec.categoryGroupLevels !== undefined) {\n throw new Error('chart: a date axis cannot have categoryGroupLevels');\n }\n spec.categories.forEach((category, i) => {\n if (category.trim() === '' || !Number.isFinite(Number(category))) {\n throw new Error(\n `chart: categories[${i}] is ${JSON.stringify(category)}; a date axis needs date serial numbers (e.g. \"45292\" for 2024-01-01)`,\n );\n }\n });\n }\n if (\n spec.categoryAxisScaling !== undefined &&\n spec.categoryAxisDate === undefined &&\n !XY_KINDS.has(spec.kind)\n ) {\n throw new Error(\n 'chart: categoryAxisScaling needs a numeric horizontal axis — a scatter / bubble chart or a date axis',\n );\n }\n spec.categoryGroupLevels?.forEach((level, i) => {\n if (level.length !== spec.categories.length) {\n throw new Error(\n `chart: categoryGroupLevels[${i}] has ${level.length} entries for ${spec.categories.length} categories`,\n );\n }\n });\n if (XY_KINDS.has(spec.kind)) {\n spec.series.forEach((series) => {\n if (series.xValues === undefined) {\n throw new Error(`chart: ${spec.kind} series '${series.name}' needs xValues`);\n }\n if (spec.kind === 'bubble' && series.bubbleSizes === undefined) {\n throw new Error(`chart: bubble series '${series.name}' needs bubbleSizes`);\n }\n });\n }\n};\n\n// `<c:dTable>`. All four toggles are always written, as PowerPoint does, so a\n// consumer's default for an absent toggle never decides how the table looks.\nconst dataTableElement = (table: NonNullable<ChartSpec['dataTable']>): XmlElement => {\n const children: XmlElement[] = [\n valNode(c('showHorzBorder'), table.showHorizontalBorder === false ? '0' : '1'),\n valNode(c('showVertBorder'), table.showVerticalBorder === false ? '0' : '1'),\n valNode(c('showOutline'), table.showOutline === false ? '0' : '1'),\n valNode(c('showKeys'), table.showKeys === false ? '0' : '1'),\n ];\n const txPr = axisTxPrElement(table.textStyle, undefined);\n if (txPr !== null) children.push(txPr);\n return elem(c('dTable'), { children });\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 usesComboFields = spec.series.some(\n (series) => series.chartKind !== undefined || series.secondaryAxis === true,\n );\n validateSpec(spec, usesComboFields);\n\n const layout = layoutChartSheet(spec);\n let plottedGroups: XmlElement[];\n let hasSecondary = false;\n if (usesComboFields) {\n const groups = comboPlotGroups(spec);\n hasSecondary = groups.some((group) => group.secondary);\n plottedGroups = groups.map((group) =>\n buildPlotGroup(\n {\n spec,\n layout,\n seriesIndices: group.indices,\n axes: group.secondary ? SECONDARY_AXES : PRIMARY_AXES,\n },\n group.kind,\n ),\n );\n } else {\n plottedGroups = [\n buildPlotGroup(\n { spec, layout, seriesIndices: spec.series.map((_, i) => i), axes: PRIMARY_AXES },\n spec.kind,\n ),\n ];\n }\n\n const plotLayout = spec.plotAreaLayout;\n const plotAreaChildren: XmlElement[] = [\n plotLayout !== undefined\n ? manualLayoutElement(plotLayout, plotLayout, plotLayout.target)\n : elem(c('layout')),\n ...plottedGroups,\n ];\n if (!AXISLESS_KINDS.has(spec.kind)) {\n plotAreaChildren.push(XY_KINDS.has(spec.kind) ? xValAxis(spec) : catAxis(spec), valAxis(spec));\n if (hasSeriesAxis(spec)) plotAreaChildren.push(serAxis(spec));\n if (hasSecondary) {\n plotAreaChildren.push(secondaryValAxis(spec), secondaryCatAxis(spec));\n }\n }\n if (spec.dataTable !== undefined) plotAreaChildren.push(dataTableElement(spec.dataTable));\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 chartChildren.push(\n titleElement(spec.title, spec.titleStyle, undefined, {\n ...(spec.titleOverlay !== undefined ? { overlay: spec.titleOverlay } : {}),\n ...(spec.titleLayout !== undefined ? { layout: spec.titleLayout } : {}),\n }),\n );\n }\n chartChildren.push(valNode(c('autoTitleDeleted'), spec.title !== undefined ? '0' : '1'));\n // A surface chart is 3-D (or a top-down view of one) whether or not the\n // author positioned the camera, so it always carries <c:view3D>.\n if (spec.view3D !== undefined || spec.kind === 'surface') {\n chartChildren.push(view3DElement(spec));\n }\n chartChildren.push(plotArea);\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 // CT_Legend order: legendPos, legendEntry*, layout, overlay.\n if (spec.legend.layout !== undefined) {\n legendChildren.push(manualLayoutElement(spec.legend.layout, spec.legend.layout));\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 @office-kit/pptx 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 ChartDataTable,\n ChartDateAxis,\n ChartErrorBarAmount,\n ChartErrorBars,\n ChartGrouping,\n ChartKind,\n ChartManualLayout,\n ChartOfPie,\n ChartSecondaryValueAxis,\n ChartSeries,\n ChartSeriesAxis,\n ChartSpec,\n ChartTextStyle,\n ChartTrendline,\n ChartUpDownBars,\n ChartView3D,\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_PT_COUNT = qname('c', 'ptCount', NS_C);\n// Excel's row limit — the most points a chart cache can legitimately hold.\nconst MAX_PT_COUNT = 1_048_576;\nconst NAME_V = qname('c', 'v', NS_C);\nconst NAME_D_LBLS = qname('c', 'dLbls', NS_C);\nconst NAME_D_LBL = qname('c', 'dLbl', NS_C);\nconst NAME_VAL_AX = qname('c', 'valAx', 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\n/** Kinds a combo plot group can carry (mirrors `ChartSeries.chartKind`). */\nconst isComboSeriesKind = (kind: ChartKind): kind is 'bar' | 'column' | 'line' | 'area' =>\n kind === 'bar' || kind === 'column' || kind === 'line' || kind === 'area';\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, so they read as the flat kind; `ChartSpec.view3D` (read\n // from `<c:view3D>`) is what marks the chart as 3-D.\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.\n { localName: 'scatterChart', kind: 'scatter' },\n { localName: 'bubbleChart', kind: 'bubble' },\n { localName: 'radarChart', kind: 'radar' },\n // Stock series are read by position: [open,] high, low, close.\n { localName: 'stockChart', kind: 'stock' },\n // `surfaceChart` is the top-down contour view (`surfaceContour`).\n { localName: 'surfaceChart', kind: 'surface' },\n { localName: 'surface3DChart', kind: 'surface' },\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\n// `<c:ptCount val>` of a cache / literal; NaN when absent or malformed.\nconst readPtCount = (host: XmlElement): number => {\n const ptCountEl = firstChildElement(host, NAME_PT_COUNT);\n const raw = ptCountEl !== null ? getAttrValue(ptCountEl, ATTR_VAL) : null;\n return raw !== null ? Number.parseInt(raw, 10) : Number.NaN;\n};\n\n// CT_Boolean: an absent `val` means true (schema default); PowerPoint writes\n// \"0\" / \"1\", other writers spell \"true\" / \"false\".\nconst readXmlBool = (el: XmlElement): boolean => {\n const v = getAttrValue(el, ATTR_VAL);\n return v === null || v === '1' || v === 'true';\n};\n\n// A point index (`idx`) from untrusted input: an unsigned integer below\n// `limit`, else null, so a huge idx never allocates a huge sparse array.\nconst parsePointIndex = (raw: string | null, limit: number): number | null => {\n if (raw === null || !/^\\d+$/.test(raw)) return null;\n const idx = Number.parseInt(raw, 10);\n return idx < limit ? idx : null;\n};\n\n// `<c:idx val>` of a `<c:dPt>` / `<c:dLbl>`, bounded by the series' point count.\nconst readPointIndex = (host: XmlElement, pointCount: number): number | null => {\n const idxEl = firstChildElement(host, qname('c', 'idx', NS_C));\n return parsePointIndex(idxEl !== null ? getAttrValue(idxEl, ATTR_VAL) : null, pointCount);\n};\n\n// `countHost` holds the `<c:ptCount>` when it is not `cache` itself: a\n// `<c:multiLvlStrCache>` counts once for every `<c:lvl>` under it.\nconst readPtArray = (cache: XmlElement, countHost: XmlElement = cache): string[] => {\n const out: string[] = [];\n const ptCount = readPtCount(countHost);\n // `<c:pt idx>` past the authored count (or the hard cap) is dropped.\n const idxLimit = Number.isFinite(ptCount) ? Math.min(ptCount, MAX_PT_COUNT) : MAX_PT_COUNT;\n for (const pt of allChildElements(cache, NAME_PT)) {\n const idx = parsePointIndex(getAttrValue(pt, ATTR_IDX), idxLimit);\n if (idx === null) 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 // Writers (this builder included) omit `<c:pt>` for empty cells, so the\n // authored point count — not the last present idx — is the array length.\n // Untrusted input: a huge ptCount must not allocate a huge array.\n if (Number.isFinite(ptCount) && ptCount <= MAX_PT_COUNT) {\n for (let i = 0; i < ptCount; i++) {\n if (out[i] === undefined) out[i] = '';\n }\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 && cache) return readPtArray(lvl, cache);\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 pointCount: number,\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 idx = readPointIndex(c, pointCount);\n if (idx === null) 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\nconst readSolidSrgb = (host: XmlElement | null): string | undefined => {\n const fill = host !== null ? firstChildElement(host, NAME_SOLID_FILL) : null;\n const srgb = fill !== null ? firstChildElement(fill, NAME_SRGB_CLR) : null;\n const color = srgb !== null ? getAttrValue(srgb, ATTR_VAL) : null;\n return color !== null ? `#${color.toUpperCase()}` : undefined;\n};\n\n// Per-series marker symbol, size + fill / outline color from <c:ser><c:marker>.\nconst readSeriesMarker = (\n ser: XmlElement,\n): {\n markerSymbol?: ChartSeries['markerSymbol'];\n markerSizePt?: number;\n markerColor?: string;\n markerLineColor?: string;\n} => {\n const m = firstChildElement(ser, qname('c', 'marker', NS_C));\n if (!m) return {};\n const out: {\n markerSymbol?: ChartSeries['markerSymbol'];\n markerSizePt?: number;\n markerColor?: string;\n markerLineColor?: string;\n } = {};\n const spPr = firstChildElement(m, NAME_SP_PR_C);\n const color = readSolidSrgb(spPr);\n if (color !== undefined) out.markerColor = color;\n const lineColor = readSolidSrgb(\n spPr !== null ? firstChildElement(spPr, qname('a', 'ln', NS_A)) : null,\n );\n if (lineColor !== undefined) out.markerLineColor = lineColor;\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, color + dash from <c:ser><c:spPr><a:ln>.\nconst readSeriesLineProps = (\n ser: XmlElement,\n): { lineWidthEmu?: number; lineColor?: string; 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; lineColor?: string; lineDash?: string } = {};\n const lnFill = firstChildElement(ln, NAME_SOLID_FILL);\n const lnSrgb = lnFill !== null ? firstChildElement(lnFill, NAME_SRGB_CLR) : null;\n const lnColor = lnSrgb !== null ? getAttrValue(lnSrgb, ATTR_VAL) : null;\n if (lnColor !== null) out.lineColor = `#${lnColor.toUpperCase()}`;\n const w = getAttrValue(ln, qname('', 'w', ''));\n if (w !== null) {\n const n = Number.parseInt(w, 10);\n // 0 is a valid ST_LineWidth and the builder writes it, so it reads back.\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 NAME_A_CS = qname('a', 'cs', 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 fontComplexScript: 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 const cs = firstChildElement(rPr, NAME_A_CS);\n if (cs) {\n const tf = getAttrValue(cs, ATTR_TYPEFACE);\n if (tf !== null && tf !== '') fontComplexScript = tf;\n }\n if (\n font === undefined &&\n fontComplexScript === 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 ...(fontComplexScript !== undefined ? { fontComplexScript } : {}),\n ...(sizePt !== undefined ? { sizePt } : {}),\n ...(bold !== undefined ? { bold } : {}),\n ...(italic !== undefined ? { italic } : {}),\n ...(color !== undefined ? { color } : {}),\n };\n};\n\n// Reads the authored text style of a chart label's `<c:rich>` / `<c:txPr>`\n// block: the first styled run's `<a:rPr>` over the paragraph's `<a:defRPr>`\n// (a run attribute wins, the rest falls back to the paragraph defaults, as\n// renderers resolve it). Returns `undefined` when nothing is authored.\nconst readLabelStyle = (richHost: XmlElement): ChartTextStyle | undefined => {\n for (const p of allChildElements(richHost, NAME_P_DML)) {\n let runStyle: ChartTextStyle | undefined;\n for (const r of allChildElements(p, NAME_R_DML)) {\n const rPr = firstChildElement(r, NAME_A_RPR);\n runStyle = rPr !== null ? readRunStyle(rPr) : undefined;\n if (runStyle !== undefined) break;\n }\n const pPr = firstChildElement(p, NAME_A_PPR);\n const defRPr = pPr !== null ? firstChildElement(pPr, NAME_A_DEF_RPR) : null;\n const defStyle = defRPr !== null ? readRunStyle(defRPr) : undefined;\n if (runStyle === undefined && defStyle === undefined) continue;\n return { ...defStyle, ...runStyle };\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// The shared tail of CT_DLbls / CT_DLbl (Group_DLbls / Group_DLbl): the\n// show* toggles plus optional numFmt, position, separator, txPr.\n// A toggle the host leaves out takes the `inherited` group's value (a\n// per-point `<c:dLbl>` inherits from its series `<c:dLbls>`), else false.\nconst readDataLabelsGroup = (\n host: XmlElement,\n inherited: ChartDataLabels | undefined,\n): ChartDataLabels => {\n const readToggle = (local: string, fallback: boolean): boolean => {\n const el = firstChildElement(host, qname('c', local, NS_C));\n return el !== null ? readXmlBool(el) : fallback;\n };\n const nfEl = firstChildElement(host, 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(host);\n const separator = readDataLabelSeparator(host);\n const txPrEl = firstChildElement(host, qname('c', 'txPr', NS_C));\n const textStyle = txPrEl ? readLabelStyle(txPrEl) : undefined;\n // The two optional toggles surface only when on, so a chart that never\n // used them reads back without the extra keys.\n const showBubbleSize = readToggle('showBubbleSize', inherited?.showBubbleSize ?? false);\n const showLegendKey = readToggle('showLegendKey', inherited?.showLegendKey ?? false);\n const spPr = firstChildElement(host, NAME_SP_PR_C);\n const fillColor = spPr !== null ? readSolidSrgb(spPr) : undefined;\n return {\n showValue: readToggle('showVal', inherited?.showValue ?? false),\n showCategory: readToggle('showCatName', inherited?.showCategory ?? false),\n showSeriesName: readToggle('showSerName', inherited?.showSeriesName ?? false),\n showPercent: readToggle('showPercent', inherited?.showPercent ?? false),\n ...(numberFormat !== undefined ? { numberFormat } : {}),\n ...(position !== undefined ? { position } : {}),\n ...(separator !== undefined ? { separator } : {}),\n ...(textStyle !== undefined ? { textStyle } : {}),\n ...(showBubbleSize ? { showBubbleSize } : {}),\n ...(showLegendKey ? { showLegendKey } : {}),\n ...(fillColor !== undefined ? { fillColor } : {}),\n };\n};\n\n// Literal text of a `<c:tx><c:rich>` — every run of every paragraph, with\n// paragraphs joined by a newline.\nconst readRichText = (host: XmlElement): string | undefined => {\n const tx = firstChildElement(host, NAME_TX);\n const rich = tx !== null ? firstChildElement(tx, NAME_RICH) : null;\n if (rich === null) return undefined;\n const paragraphs: string[] = [];\n for (const p of allChildElements(rich, NAME_P_DML)) {\n let line = '';\n for (const r of allChildElements(p, NAME_R_DML)) {\n const t = firstChildElement(r, NAME_T);\n if (t === null) continue;\n for (const child of t.children) {\n if (child.kind === 'text' || child.kind === 'cdata') line += child.data;\n }\n }\n paragraphs.push(line);\n }\n return paragraphs.join('\\n');\n};\n\n// Series- / chart-level `<c:dLbls>`: the shared group plus\n// `<c:showLeaderLines>`, which Group_DLbl (a per-point `<c:dLbl>`) lacks.\nconst readSeriesLevelDataLabels = (dLbls: XmlElement): ChartDataLabels => {\n const group = readDataLabelsGroup(dLbls, undefined);\n const leaderEl = firstChildElement(dLbls, qname('c', 'showLeaderLines', NS_C));\n return leaderEl !== null ? { ...group, showLeaderLines: readXmlBool(leaderEl) } : group;\n};\n\n// True when `<c:dLbls>` carries series-level settings (anything besides the\n// per-point `<c:dLbl>` overrides and the extension list).\nconst hasDataLabelGroupChild = (dLbls: XmlElement): boolean =>\n dLbls.children.some(\n (ch) =>\n ch.kind === 'element' &&\n ch.name.namespaceURI === NS_C &&\n ch.name.localName !== 'dLbl' &&\n ch.name.localName !== 'extLst',\n );\n\n// A deleted point label reads as an override with every toggle off — the\n// same shape the builder writes back for it, so it round-trips stably.\nconst DELETED_POINT_LABEL: ChartDataLabels = {\n showValue: false,\n showCategory: false,\n showSeriesName: false,\n showPercent: false,\n};\n\n// `<c:dLbls><c:dLbl><c:idx val=\"N\"/>…` per-point overrides, as a sparse\n// array indexed by point (`null` where no override is authored). Toggles a\n// point leaves out inherit the series-level group (`seriesLabels`).\nconst readPointDataLabels = (\n dLbls: XmlElement,\n pointCount: number,\n seriesLabels: ChartDataLabels | undefined,\n): ReadonlyArray<ChartDataLabels | null> | undefined => {\n const out: Array<ChartDataLabels | null> = [];\n let any = false;\n for (const dLbl of allChildElements(dLbls, NAME_D_LBL)) {\n const idx = readPointIndex(dLbl, pointCount);\n if (idx === null) continue;\n const deleteEl = firstChildElement(dLbl, qname('c', 'delete', NS_C));\n if (deleteEl !== null && readXmlBool(deleteEl)) {\n out[idx] = DELETED_POINT_LABEL;\n } else {\n const group = readDataLabelsGroup(dLbl, seriesLabels);\n const literal = readRichText(dLbl);\n out[idx] = literal !== undefined ? { ...group, text: literal } : group;\n }\n any = true;\n }\n if (!any) return undefined;\n for (let i = 0; i < out.length; i++) out[i] ??= null;\n return out;\n};\n\n// `<c:valAx>` scaling: <c:scaling><c:min/>/<c:max/> as the authored axis\n// range, plus optional <c:majorUnit> / <c:minorUnit> tick spacing,\n// <c:numFmt>, <c:dispUnits>. Shared by the primary and secondary axes.\nconst readValueAxisScaling = (valAx: XmlElement): ChartAxisScaling | undefined => {\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 let displayUnitsLabel = false;\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 displayUnitsLabel = firstChildElement(dispUnits, qname('c', 'dispUnitsLbl', NS_C)) !== null;\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 return {\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 ...(displayUnits !== undefined && displayUnitsLabel ? { displayUnitsLabel } : {}),\n };\n }\n return undefined;\n};\n\n// Small typed accessors for `<c:child val=\"…\"/>` leaves ----------------------\n\nconst childVal = (parent: XmlElement, local: string): string | null => {\n const el = firstChildElement(parent, qname('c', local, NS_C));\n return el !== null ? getAttrValue(el, ATTR_VAL) : null;\n};\n\nconst childNumber = (parent: XmlElement, local: string): number | undefined => {\n const raw = childVal(parent, local);\n if (raw === null) return undefined;\n const n = Number.parseFloat(raw);\n return Number.isFinite(n) ? n : undefined;\n};\n\nconst childBool = (parent: XmlElement, local: string): boolean | undefined => {\n const el = firstChildElement(parent, qname('c', local, NS_C));\n return el !== null ? readXmlBool(el) : undefined;\n};\n\n// A `val` token, kept only when it is one of `allowed` — untrusted input\n// must not widen a union type.\nconst childToken = <T extends string>(\n parent: XmlElement,\n local: string,\n allowed: ReadonlyArray<T>,\n): T | undefined => {\n const raw = childVal(parent, local);\n return allowed.find((token) => token === raw);\n};\n\n// `<a:alpha val>` of the series' fill, as 0..1. The wire unit is 1/1000 %.\nconst ALPHA_OPAQUE = 100000;\nconst readSeriesFillOpacity = (ser: XmlElement): number | undefined => {\n const spPr = firstChildElement(ser, NAME_SP_PR_C);\n const fill = spPr !== null ? firstChildElement(spPr, NAME_SOLID_FILL) : null;\n const srgb = fill !== null ? firstChildElement(fill, NAME_SRGB_CLR) : null;\n const alpha = srgb !== null ? firstChildElement(srgb, qname('a', 'alpha', NS_A)) : null;\n const raw = alpha !== null ? getAttrValue(alpha, ATTR_VAL) : null;\n if (raw === null || !/^\\d+$/.test(raw)) return undefined;\n const n = Number.parseInt(raw, 10);\n return n <= ALPHA_OPAQUE ? n / ALPHA_OPAQUE : undefined;\n};\n\nconst readErrorBarAmount = (errBars: XmlElement): ChartErrorBarAmount | undefined => {\n const type = childToken(errBars, 'errValType', [\n 'cust',\n 'fixedVal',\n 'percentage',\n 'stdDev',\n 'stdErr',\n ]);\n if (type === undefined) return undefined;\n if (type === 'stdErr') return { type };\n if (type === 'cust') {\n const side = (local: 'plus' | 'minus'): Array<number | null> | undefined => {\n const el = firstChildElement(errBars, qname('c', local, NS_C));\n return el !== null ? (readNumChannel(el) ?? undefined) : undefined;\n };\n const plus = side('plus');\n const minus = side('minus');\n return {\n type,\n ...(plus !== undefined ? { plus } : {}),\n ...(minus !== undefined ? { minus } : {}),\n };\n }\n const value = childNumber(errBars, 'val');\n return value !== undefined ? { type, value } : undefined;\n};\n\n// `<c:ser><c:errBars>` — up to two, told apart by `<c:errDir>`. A series of a\n// category chart has one value direction and usually omits the element.\nconst readErrorBars = (\n ser: XmlElement,\n): { readonly errorBars?: ChartErrorBars; readonly xErrorBars?: ChartErrorBars } => {\n const out: { errorBars?: ChartErrorBars; xErrorBars?: ChartErrorBars } = {};\n for (const el of allChildElements(ser, qname('c', 'errBars', NS_C))) {\n const barType = childToken(el, 'errBarType', ['both', 'minus', 'plus']);\n const amount = readErrorBarAmount(el);\n if (barType === undefined || amount === undefined) continue;\n const noEndCap = childBool(el, 'noEndCap');\n const spPr = firstChildElement(el, NAME_SP_PR_C);\n const ln = spPr !== null ? firstChildElement(spPr, qname('a', 'ln', NS_A)) : null;\n const color = readSolidSrgb(ln);\n const w = ln !== null ? getAttrValue(ln, qname('', 'w', '')) : null;\n const bars: ChartErrorBars = {\n barType,\n amount,\n ...(noEndCap !== undefined ? { noEndCap } : {}),\n ...(color !== undefined ? { color } : {}),\n ...(w !== null && /^\\d+$/.test(w) ? { lineWidthEmu: Number.parseInt(w, 10) } : {}),\n };\n if (childVal(el, 'errDir') === 'x') out.xErrorBars ??= bars;\n else out.errorBars ??= bars;\n }\n return out;\n};\n\n// `<c:chart><c:view3D>`; an element with no readable child still reads as\n// `{}` because its presence alone is what marks the chart as 3-D.\nconst readView3D = (chart: XmlElement): ChartView3D | undefined => {\n const el = firstChildElement(chart, qname('c', 'view3D', NS_C));\n if (el === null) return undefined;\n const rotX = childNumber(el, 'rotX');\n const rotY = childNumber(el, 'rotY');\n const rightAngleAxes = childBool(el, 'rAngAx');\n const perspective = childNumber(el, 'perspective');\n const depthPercent = childNumber(el, 'depthPercent');\n const heightPercent = childNumber(el, 'hPercent');\n return {\n ...(rotX !== undefined ? { rotX } : {}),\n ...(rotY !== undefined ? { rotY } : {}),\n ...(rightAngleAxes !== undefined ? { rightAngleAxes } : {}),\n ...(perspective !== undefined ? { perspective } : {}),\n ...(depthPercent !== undefined ? { depthPercent } : {}),\n ...(heightPercent !== undefined ? { heightPercent } : {}),\n };\n};\n\nconst readOfPie = (group: XmlElement): ChartOfPie | undefined => {\n const type = childToken(group, 'ofPieType', ['pie', 'bar']);\n if (type === undefined) return undefined;\n const splitType = childToken(group, 'splitType', ['auto', 'cust', 'percent', 'pos', 'val']);\n const splitPos = childNumber(group, 'splitPos');\n const secondPieSizePct = childNumber(group, 'secondPieSize');\n const gapWidthPct = childNumber(group, 'gapWidth');\n const custSplit = firstChildElement(group, qname('c', 'custSplit', NS_C));\n const customSplit: number[] = [];\n if (custSplit !== null) {\n for (const pt of allChildElements(custSplit, qname('c', 'secondPiePt', NS_C))) {\n const idx = parsePointIndex(getAttrValue(pt, ATTR_VAL), MAX_PT_COUNT);\n if (idx !== null) customSplit.push(idx);\n }\n }\n const seriesLines = firstChildElement(group, qname('c', 'serLines', NS_C)) !== null;\n return {\n type,\n ...(splitType !== undefined ? { splitType } : {}),\n ...(splitPos !== undefined ? { splitPos } : {}),\n ...(custSplit !== null ? { customSplit } : {}),\n ...(secondPieSizePct !== undefined ? { secondPieSizePct } : {}),\n ...(gapWidthPct !== undefined ? { gapWidthPct } : {}),\n ...(seriesLines ? { seriesLines } : {}),\n };\n};\n\nconst readUpDownBars = (group: XmlElement): ChartUpDownBars | undefined => {\n const el = firstChildElement(group, qname('c', 'upDownBars', NS_C));\n if (el === null) return undefined;\n const barColor = (local: 'upBars' | 'downBars'): string | undefined => {\n const bar = firstChildElement(el, qname('c', local, NS_C));\n return readSolidSrgb(bar !== null ? firstChildElement(bar, NAME_SP_PR_C) : null);\n };\n const gapWidthPct = childNumber(el, 'gapWidth');\n const upColor = barColor('upBars');\n const downColor = barColor('downBars');\n return {\n ...(gapWidthPct !== undefined ? { gapWidthPct } : {}),\n ...(upColor !== undefined ? { upColor } : {}),\n ...(downColor !== undefined ? { downColor } : {}),\n };\n};\n\nconst readDataTable = (plotArea: XmlElement): ChartDataTable | undefined => {\n const el = firstChildElement(plotArea, qname('c', 'dTable', NS_C));\n if (el === null) return undefined;\n const showHorizontalBorder = childBool(el, 'showHorzBorder');\n const showVerticalBorder = childBool(el, 'showVertBorder');\n const showOutline = childBool(el, 'showOutline');\n const showKeys = childBool(el, 'showKeys');\n const txPr = firstChildElement(el, qname('c', 'txPr', NS_C));\n const textStyle = txPr !== null ? readLabelStyle(txPr) : undefined;\n return {\n ...(showHorizontalBorder !== undefined ? { showHorizontalBorder } : {}),\n ...(showVerticalBorder !== undefined ? { showVerticalBorder } : {}),\n ...(showOutline !== undefined ? { showOutline } : {}),\n ...(showKeys !== undefined ? { showKeys } : {}),\n ...(textStyle !== undefined ? { textStyle } : {}),\n };\n};\n\nconst TIME_UNITS = ['days', 'months', 'years'] as const;\n\nconst readDateAxis = (dateAx: XmlElement): ChartDateAxis => {\n const baseTimeUnit = childToken(dateAx, 'baseTimeUnit', TIME_UNITS);\n const majorUnit = childNumber(dateAx, 'majorUnit');\n const majorTimeUnit = childToken(dateAx, 'majorTimeUnit', TIME_UNITS);\n const minorUnit = childNumber(dateAx, 'minorUnit');\n const minorTimeUnit = childToken(dateAx, 'minorTimeUnit', TIME_UNITS);\n return {\n ...(baseTimeUnit !== undefined ? { baseTimeUnit } : {}),\n ...(majorUnit !== undefined ? { majorUnit } : {}),\n ...(majorTimeUnit !== undefined ? { majorTimeUnit } : {}),\n ...(minorUnit !== undefined ? { minorUnit } : {}),\n ...(minorTimeUnit !== undefined ? { minorTimeUnit } : {}),\n };\n};\n\n// The horizontal axis' number format already surfaces as\n// `categoryAxisNumberFormat`; keep it out of `categoryAxisScaling`.\nconst withoutNumberFormat = (\n scaling: ChartAxisScaling | undefined,\n): ChartAxisScaling | undefined => {\n if (scaling === undefined) return undefined;\n const { numberFormat: _numberFormat, ...rest } = scaling;\n return Object.keys(rest).length > 0 ? rest : undefined;\n};\n\nconst minMaxOnly = (scaling: ChartAxisScaling | undefined): ChartAxisScaling | undefined => {\n if (scaling?.min === undefined && scaling?.max === undefined) return undefined;\n return {\n ...(scaling.min !== undefined ? { min: scaling.min } : {}),\n ...(scaling.max !== undefined ? { max: scaling.max } : {}),\n };\n};\n\n// `<a:ln><a:noFill/>` directly under an axis' `<c:spPr>`: the axis line is\n// switched off while the axis (and its labels) stays.\nconst isAxisLineHidden = (axis: XmlElement): boolean => {\n const spPr = firstChildElement(axis, NAME_SP_PR_C);\n const ln = spPr !== null ? firstChildElement(spPr, qname('a', 'ln', NS_A)) : null;\n return ln !== null && firstChildElement(ln, qname('a', 'noFill', NS_A)) !== null;\n};\n\n// Formatting of `<c:serAx>`; `undefined` when the axis carries nothing beyond\n// what the builder writes for an unformatted one.\nconst readSeriesAxis = (plotArea: XmlElement): ChartSeriesAxis | undefined => {\n const el = firstChildElement(plotArea, qname('c', 'serAx', NS_C));\n if (el === null) return undefined;\n const hidden = childBool(el, 'delete');\n const title = readTitle(el);\n const titleEl = firstChildElement(el, NAME_TITLE);\n const titleStyle = titleEl !== null ? readTitleStyleOf(titleEl) : undefined;\n const txPr = firstChildElement(el, qname('c', 'txPr', NS_C));\n const labelStyle = txPr !== null ? readLabelStyle(txPr) : undefined;\n const majorGridlines = firstChildElement(el, qname('c', 'majorGridlines', NS_C)) !== null;\n const scaling = firstChildElement(el, qname('c', 'scaling', NS_C));\n const orientation =\n scaling !== null ? childToken(scaling, 'orientation', ['minMax', 'maxMin']) : undefined;\n const tickLabelPos = childToken(el, 'tickLblPos', ['none', 'low', 'high', 'nextTo']);\n const tickLabelSkip = childNumber(el, 'tickLblSkip');\n const spPr = firstChildElement(el, NAME_SP_PR_C);\n const lineColor = readSolidSrgb(\n spPr !== null ? firstChildElement(spPr, qname('a', 'ln', NS_A)) : null,\n );\n const fields: ChartSeriesAxis = {\n ...(hidden === true ? { hidden } : {}),\n ...(title !== undefined ? { title } : {}),\n ...(titleStyle !== undefined ? { titleStyle } : {}),\n ...(labelStyle !== undefined ? { labelStyle } : {}),\n ...(majorGridlines ? { majorGridlines } : {}),\n ...(orientation === 'maxMin' ? { orientation } : {}),\n ...(tickLabelPos !== undefined ? { tickLabelPos } : {}),\n ...(tickLabelSkip !== undefined ? { tickLabelSkip } : {}),\n ...(lineColor !== undefined ? { lineColor } : {}),\n };\n return Object.keys(fields).length > 0 ? fields : undefined;\n};\n\n// `<c:layout><c:manualLayout>` of `host`, in the `edge` / `factor` shape the\n// builder writes. Other mode combinations position relative to the default\n// layout, which this model cannot express, so they read as \"not authored\".\nconst readManualLayout = (\n host: XmlElement,\n): { x: number; y: number; w?: number; h?: number; target?: 'inner' | 'outer' } | undefined => {\n const layout = firstChildElement(host, qname('c', 'layout', NS_C));\n const manual =\n layout !== null ? firstChildElement(layout, qname('c', 'manualLayout', NS_C)) : null;\n if (manual === null) return undefined;\n if (childVal(manual, 'xMode') !== 'edge' || childVal(manual, 'yMode') !== 'edge')\n return undefined;\n const sizeMode = (local: 'wMode' | 'hMode'): boolean =>\n (childVal(manual, local) ?? 'factor') === 'factor';\n if (!sizeMode('wMode') || !sizeMode('hMode')) return undefined;\n const x = childNumber(manual, 'x');\n const y = childNumber(manual, 'y');\n if (x === undefined || y === undefined) return undefined;\n const w = childNumber(manual, 'w');\n const h = childNumber(manual, 'h');\n const target = childToken(manual, 'layoutTarget', ['inner', 'outer']);\n return {\n x,\n y,\n ...(w !== undefined ? { w } : {}),\n ...(h !== undefined ? { h } : {}),\n ...(target !== undefined ? { target } : {}),\n };\n};\n\n// A box layout needs all four numbers; a partial one reads as \"not authored\".\nconst readBoxLayout = (host: XmlElement): ChartManualLayout | undefined => {\n const layout = readManualLayout(host);\n if (layout === undefined || layout.w === undefined || layout.h === undefined) return undefined;\n return {\n x: layout.x,\n y: layout.y,\n w: layout.w,\n h: layout.h,\n ...(layout.target !== undefined ? { target: layout.target } : {}),\n };\n};\n\n// Outer levels of a `<c:multiLvlStrRef>` category channel, ordered like\n// `ChartSpec.categoryGroupLevels` (the level next to the categories first).\n// `<c:lvl>` children come innermost-first, so level 0 is the categories.\nconst readCategoryGroupLevels = (cat: XmlElement): string[][] | undefined => {\n const multi = firstChildElement(cat, NAME_MULTI_LVL_STR_REF);\n const cache = multi !== null ? firstChildElement(multi, NAME_MULTI_LVL_STR_CACHE) : null;\n if (cache === null) return undefined;\n const outer = allChildElements(cache, NAME_LVL)\n .slice(1)\n .map((lvl) => readPtArray(lvl, cache));\n return outer.length > 0 ? outer : 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 // Collect every \"plotted\" plot-group element the plotArea carries, in\n // document order. Combo charts emit several (`<c:barChart>` +\n // `<c:lineChart>` …); single-kind charts emit one.\n interface PlotGroup {\n readonly element: XmlElement;\n readonly kind: ChartKind;\n }\n const kindByLocalName = new Map(KIND_MAP.map((entry) => [entry.localName, entry] as const));\n const plotGroups: PlotGroup[] = [];\n for (const child of plotArea.children) {\n if (child.kind !== 'element' || child.name.namespaceURI !== NS_C) continue;\n const mapped = kindByLocalName.get(child.name.localName);\n if (!mapped) continue;\n let groupKind: ChartKind = mapped.kind;\n // Resolve bar vs column on a `barChart` / `bar3DChart`.\n if (mapped.localName === 'barChart' || mapped.localName === 'bar3DChart') {\n const barDir = firstChildElement(child, qname('c', 'barDir', NS_C));\n const v = barDir !== null ? getAttrValue(barDir, ATTR_VAL) : null;\n groupKind = v === 'bar' ? 'bar' : 'column';\n }\n plotGroups.push({ element: child, kind: groupKind });\n }\n const firstGroup = plotGroups[0];\n if (!firstGroup) return null;\n const plotted = firstGroup.element;\n const kind = firstGroup.kind;\n\n // Secondary-axis detection: the axes the first plot group references are\n // the primary set; a `<c:valAx>` only later groups reference is the\n // secondary value axis. Axis position can't tell them apart — a scatter\n // group references two primary valAx (X at the bottom or top, Y at the\n // left), while pptxgenjs puts a secondary axis at `r` or `t`.\n const groupAxisIds = (group: XmlElement): string[] => {\n const ids: string[] = [];\n for (const axIdEl of allChildElements(group, qname('c', 'axId', NS_C))) {\n const id = getAttrValue(axIdEl, ATTR_VAL);\n if (id !== null) ids.push(id);\n }\n return ids;\n };\n const valAxisIds = new Set<string>();\n for (const el of allChildElements(plotArea, NAME_VAL_AX)) {\n const axIdEl = firstChildElement(el, qname('c', 'axId', NS_C));\n const id = axIdEl !== null ? getAttrValue(axIdEl, ATTR_VAL) : null;\n if (id !== null) valAxisIds.add(id);\n }\n const primaryAxisIds = new Set(groupAxisIds(plotted));\n const secondaryValAxisIds = new Set<string>();\n for (const group of plotGroups.slice(1)) {\n for (const id of groupAxisIds(group.element)) {\n if (valAxisIds.has(id) && !primaryAxisIds.has(id)) secondaryValAxisIds.add(id);\n }\n }\n const groupUsesSecondaryAxis = (group: XmlElement): boolean =>\n groupAxisIds(group).some((id) => secondaryValAxisIds.has(id));\n\n // Read every <c:ser> from every plot group, tagging series from\n // non-first groups with their group's kind / axis so the round-trip\n // preserves the combo layout.\n const series: ChartSeries[] = [];\n let categoriesFromFirst: string[] | null = null;\n let categoryGroupLevels: string[][] | undefined;\n const serEntries: { ser: XmlElement; groupKind: ChartKind; secondary: boolean }[] = [];\n for (const group of plotGroups) {\n const secondary = groupUsesSecondaryAxis(group.element);\n for (const ser of allChildElements(group.element, NAME_SER)) {\n serEntries.push({ ser, groupKind: group.kind, secondary });\n }\n }\n for (const { ser, groupKind, secondary } of serEntries) {\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 categoryGroupLevels = readCategoryGroupLevels(cat);\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, lineColor, lineDash } = readSeriesLineProps(ser);\n const { markerSymbol, markerSizePt, markerColor, markerLineColor } = readSeriesMarker(ser);\n const invertEl = firstChildElement(ser, qname('c', 'invertIfNegative', NS_C));\n const invertIfNegative = invertEl !== null && readXmlBool(invertEl) ? true : undefined;\n // Per-point overrides address points of the value channel; anything\n // past its end has nothing to override.\n const pointCount = values !== null ? values.length : 0;\n // <c:dPt> data-point overrides — sparse maps idx → color / explosion.\n const { colors: pointColors, explosions: pointExplosions } = readDataPointOverrides(\n ser,\n pointCount,\n );\n // <c:smooth val=\"1\"/> — line / area / scatter only.\n const smoothEl = firstChildElement(ser, qname('c', 'smooth', NS_C));\n const smooth = smoothEl !== null && readXmlBool(smoothEl);\n const trendline = readTrendline(ser);\n const fillOpacity = readSeriesFillOpacity(ser);\n const { errorBars, xErrorBars } = readErrorBars(ser);\n // Per-series <c:dLbls> overrides the chart-level toggles for this\n // one series.\n // A <c:dLbls> holding only per-point <c:dLbl> overrides carries no\n // series-level defaults, so `dataLabels` stays absent in that case.\n const serDLblsEl = firstChildElement(ser, NAME_D_LBLS);\n const serDataLabels =\n serDLblsEl !== null && hasDataLabelGroupChild(serDLblsEl)\n ? readSeriesLevelDataLabels(serDLblsEl)\n : undefined;\n const pointDataLabels =\n serDLblsEl !== null ? readPointDataLabels(serDLblsEl, pointCount, serDataLabels) : undefined;\n series.push({\n name,\n values: values ?? [],\n ...(groupKind !== kind && isComboSeriesKind(groupKind) ? { chartKind: groupKind } : {}),\n ...(secondary ? { secondaryAxis: true } : {}),\n ...(xValues !== null ? { xValues } : {}),\n ...(bubbleSizes !== null ? { bubbleSizes } : {}),\n ...(color !== undefined ? { color } : {}),\n ...(lineWidthEmu !== undefined ? { lineWidthEmu } : {}),\n ...(lineColor !== undefined ? { lineColor } : {}),\n ...(lineDash !== undefined ? { lineDash } : {}),\n ...(markerSymbol !== undefined ? { markerSymbol } : {}),\n ...(markerSizePt !== undefined ? { markerSizePt } : {}),\n ...(markerColor !== undefined ? { markerColor } : {}),\n ...(markerLineColor !== undefined ? { markerLineColor } : {}),\n ...(invertIfNegative !== undefined ? { invertIfNegative } : {}),\n ...(pointColors !== undefined ? { pointColors } : {}),\n ...(pointExplosions !== undefined ? { pointExplosions } : {}),\n ...(pointDataLabels !== undefined ? { pointDataLabels } : {}),\n ...(smoothEl !== null ? { smooth } : {}),\n ...(trendline !== undefined ? { trendline } : {}),\n ...(serDataLabels !== undefined ? { dataLabels: serDataLabels } : {}),\n ...(fillOpacity !== undefined ? { fillOpacity } : {}),\n ...(errorBars !== undefined ? { errorBars } : {}),\n ...(xErrorBars !== undefined ? { xErrorBars } : {}),\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, NAME_D_LBLS);\n const dataLabels = dLbls !== null ? readSeriesLevelDataLabels(dLbls) : undefined;\n\n // <c:valAx> lives on the plotArea (not on the plotted-kind element). The\n // primary axis is the first one no secondary group references — writers\n // may list the secondary pair first.\n let valAx: XmlElement | null = null;\n let secValAx: XmlElement | null = null;\n for (const el of allChildElements(plotArea, NAME_VAL_AX)) {\n const axIdEl = firstChildElement(el, qname('c', 'axId', NS_C));\n const id = axIdEl !== null ? getAttrValue(axIdEl, ATTR_VAL) : null;\n if (id !== null && secondaryValAxisIds.has(id)) secValAx ??= el;\n else valAx ??= el;\n }\n if (valAx === null) {\n valAx = secValAx;\n secValAx = null;\n }\n // Both axes of a scatter / bubble chart are <c:valAx>. The plot group\n // lists the x axis' id first (CT_ScatterChart / CT_BubbleChart), so that\n // one stands in for the category axis and the other is the value axis;\n // document order cannot tell them apart, since PowerPoint writes x first.\n const isXyKind = kind === 'scatter' || kind === 'bubble';\n let xValAx: XmlElement | null = null;\n if (isXyKind) {\n const [xId, yId] = groupAxisIds(plotted);\n const valAxById = new Map<string, XmlElement>();\n for (const el of allChildElements(plotArea, NAME_VAL_AX)) {\n const id = childVal(el, 'axId');\n if (id !== null) valAxById.set(id, el);\n }\n const x = xId !== undefined ? valAxById.get(xId) : undefined;\n const y = yId !== undefined ? valAxById.get(yId) : undefined;\n if (x !== undefined && y !== undefined) {\n xValAx = x;\n valAx = y;\n }\n }\n const valueAxis = valAx !== null ? readValueAxisScaling(valAx) : undefined;\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 let categoryAxisLineWidthEmu: number | undefined;\n let valueAxisLineWidthEmu: number | undefined;\n let categoryAxisMajorGridlineWidthEmu: number | undefined;\n let categoryAxisMinorGridlineWidthEmu: number | undefined;\n let valueAxisMajorGridlineWidthEmu: number | undefined;\n let valueAxisMinorGridlineWidthEmu: number | 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 // `w` of the <c:spPr><a:ln> directly under a gridlines or axis element.\n const readLineWidthEmu = (host: XmlElement): number | undefined => {\n const spPr = firstChildElement(host, NAME_SP_PR_C);\n const ln = spPr !== null ? firstChildElement(spPr, qname('a', 'ln', NS_A)) : null;\n const w = ln !== null ? getAttrValue(ln, qname('', 'w', '')) : null;\n if (w === null || !/^\\d+$/.test(w)) return undefined;\n // `\\d+` already excludes negatives; 0 is a valid ST_LineWidth.\n return Number.parseInt(w, 10);\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 = xValAx ?? findFirst(plotArea, ['catAx', 'dateAx']);\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 let valueAxisTickLabelPos: ChartSpec['valueAxisTickLabelPos'];\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 categoryAxisLineWidthEmu = readLineWidthEmu(catAx);\n const catMajorGl = firstChildElement(catAx, qname('c', 'majorGridlines', NS_C));\n categoryAxisMajorGridlines = catMajorGl !== null;\n if (catMajorGl) {\n categoryAxisMajorGridlineColor = readGridlineColor(catMajorGl);\n categoryAxisMajorGridlineWidthEmu = readLineWidthEmu(catMajorGl);\n }\n const catMinorGl = firstChildElement(catAx, qname('c', 'minorGridlines', NS_C));\n categoryAxisMinorGridlines = catMinorGl !== null;\n if (catMinorGl) {\n categoryAxisMinorGridlineColor = readGridlineColor(catMinorGl);\n categoryAxisMinorGridlineWidthEmu = readLineWidthEmu(catMinorGl);\n }\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 valueAxisLineWidthEmu = readLineWidthEmu(valAx);\n valueAxisOrientation = readAxisOrientation(valAx);\n valueAxisMajorTickMark = readTickMark(valAx);\n valueAxisMinorTickMark = readTickMarkLocal(valAx, 'minorTickMark');\n const valPosEl = firstChildElement(valAx, qname('c', 'tickLblPos', NS_C));\n if (valPosEl) {\n const v = getAttrValue(valPosEl, ATTR_VAL);\n if (v === 'none' || v === 'low' || v === 'high' || v === 'nextTo') {\n valueAxisTickLabelPos = v;\n }\n }\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) {\n valueAxisMajorGridlineColor = readGridlineColor(majorGl);\n valueAxisMajorGridlineWidthEmu = readLineWidthEmu(majorGl);\n }\n const minorGl = firstChildElement(valAx, qname('c', 'minorGridlines', NS_C));\n valueAxisMinorGridlines = minorGl !== null;\n if (minorGl) {\n valueAxisMinorGridlineColor = readGridlineColor(minorGl);\n valueAxisMinorGridlineWidthEmu = readLineWidthEmu(minorGl);\n }\n }\n\n // The secondary value axis is the one only the later plot groups\n // reference; read it with the same helpers as the primary.\n let secondaryValueAxis: ChartSecondaryValueAxis | undefined;\n if (secValAx !== null) {\n const scaling = readValueAxisScaling(secValAx);\n const title = readTitle(secValAx);\n const titleEl = firstChildElement(secValAx, NAME_TITLE);\n const titleStyle = titleEl !== null ? readTitleStyleOf(titleEl) : undefined;\n const txPr = firstChildElement(secValAx, qname('c', 'txPr', NS_C));\n const labelStyle = txPr !== null ? readLabelStyle(txPr) : undefined;\n const majorGl = firstChildElement(secValAx, qname('c', 'majorGridlines', NS_C));\n const majorGridlineColor = majorGl !== null ? readGridlineColor(majorGl) : undefined;\n const majorGridlineWidthEmu = majorGl !== null ? readLineWidthEmu(majorGl) : undefined;\n const lineColor = readAxisLineColor(secValAx);\n const lineWidthEmu = readLineWidthEmu(secValAx);\n const majorTickMark = readTickMark(secValAx);\n const minorTickMark = readTickMarkLocal(secValAx, 'minorTickMark');\n const secPosEl = firstChildElement(secValAx, qname('c', 'tickLblPos', NS_C));\n const secPos = secPosEl !== null ? getAttrValue(secPosEl, ATTR_VAL) : null;\n const tickLabelPos =\n secPos === 'none' || secPos === 'low' || secPos === 'high' || secPos === 'nextTo'\n ? secPos\n : undefined;\n const crossBetweenEl = firstChildElement(secValAx, qname('c', 'crossBetween', NS_C));\n const cb = crossBetweenEl !== null ? getAttrValue(crossBetweenEl, ATTR_VAL) : null;\n const crossBetween = cb === 'between' || cb === 'midCat' ? cb : undefined;\n const fields: ChartSecondaryValueAxis = {\n ...(scaling !== undefined ? { scaling } : {}),\n ...(title !== undefined ? { title } : {}),\n ...(titleStyle !== undefined ? { titleStyle } : {}),\n ...(labelStyle !== undefined ? { labelStyle } : {}),\n ...(majorGl !== null ? { majorGridlines: true } : {}),\n ...(majorGridlineColor !== undefined ? { majorGridlineColor } : {}),\n ...(majorGridlineWidthEmu !== undefined ? { majorGridlineWidthEmu } : {}),\n ...(lineColor !== undefined ? { lineColor } : {}),\n ...(lineWidthEmu !== undefined ? { lineWidthEmu } : {}),\n ...(majorTickMark !== undefined ? { majorTickMark } : {}),\n ...(minorTickMark !== undefined ? { minorTickMark } : {}),\n ...(tickLabelPos !== undefined ? { tickLabelPos } : {}),\n ...(crossBetween !== undefined ? { crossBetween } : {}),\n };\n if (Object.keys(fields).length > 0) secondaryValueAxis = fields;\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 const legendLayout = readBoxLayout(legendEl);\n legend = {\n position,\n ...(overlay ? { overlay } : {}),\n ...(legendLayout !== undefined ? { layout: legendLayout } : {}),\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 // The modifiers and features below hang off the first plot group, the\n // chart element, or the plot area; each helper returns `undefined` when its\n // element is absent.\n const plottedName = plotted.name.localName;\n const view3DEl = readView3D(chart);\n // A 3-D camera on a flat plot group means nothing; PowerPoint leaves a\n // stale <c:view3D> behind when a chart is switched from 3-D back to 2-D.\n const view3D = plottedName.endsWith('3DChart') || kind === 'surface' ? view3DEl : undefined;\n const bar3DShape =\n plottedName === 'bar3DChart'\n ? childToken(plotted, 'shape', [\n 'box',\n 'cone',\n 'coneToMax',\n 'cylinder',\n 'pyramid',\n 'pyramidToMax',\n ])\n : undefined;\n const gapDepthPct = view3D !== undefined ? childNumber(plotted, 'gapDepth') : undefined;\n // The flag lives on each series: PowerPoint repairs a deck whose\n // `<c:bubbleChart>` carries its own `<c:bubble3D>`, so nothing writes that one.\n const bubble3D =\n kind === 'bubble' &&\n allChildElements(plotted, NAME_SER).some((ser) => childBool(ser, 'bubble3D') === true);\n const showNegativeBubbles = kind === 'bubble' ? childBool(plotted, 'showNegBubbles') : undefined;\n const ofPie = plottedName === 'ofPieChart' ? readOfPie(plotted) : undefined;\n const surfaceContour = plottedName === 'surfaceChart';\n const surfaceWireframe = kind === 'surface' ? childBool(plotted, 'wireframe') : undefined;\n const upDownBars = readUpDownBars(plotted);\n const dataTable = readDataTable(plotArea);\n const seriesAxis = readSeriesAxis(plotArea);\n const plotAreaLayout = readBoxLayout(plotArea);\n const chartTitleEl = firstChildElement(chart, NAME_TITLE);\n const titlePosition = chartTitleEl !== null ? readManualLayout(chartTitleEl) : undefined;\n const titleLayout =\n titlePosition !== undefined ? { x: titlePosition.x, y: titlePosition.y } : undefined;\n const categoryAxisDate =\n catAx !== null && catAx.name.localName === 'dateAx' ? readDateAxis(catAx) : undefined;\n // Only a numeric horizontal axis has a scale: the x value axis of an xy\n // chart, or a date axis (whose range is its only scaling field).\n const horizontalScaling = catAx !== null ? readValueAxisScaling(catAx) : undefined;\n const categoryAxisScaling = isXyKind\n ? withoutNumberFormat(horizontalScaling)\n : categoryAxisDate !== undefined\n ? minMaxOnly(horizontalScaling)\n : undefined;\n const valueAxisLineHidden = valAx !== null && isAxisLineHidden(valAx);\n const categoryAxisLineHidden = catAx !== null && isAxisLineHidden(catAx);\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 ...(secondaryValueAxis !== undefined ? { secondaryValueAxis } : {}),\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 ...(valueAxisMajorGridlineWidthEmu !== undefined ? { valueAxisMajorGridlineWidthEmu } : {}),\n ...(valueAxisMajorTickMark !== undefined ? { valueAxisMajorTickMark } : {}),\n ...(valueAxisMinorTickMark !== undefined ? { valueAxisMinorTickMark } : {}),\n ...(valueAxisTickLabelPos !== undefined ? { valueAxisTickLabelPos } : {}),\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 ...(categoryAxisLineWidthEmu !== undefined ? { categoryAxisLineWidthEmu } : {}),\n ...(valueAxisLineWidthEmu !== undefined ? { valueAxisLineWidthEmu } : {}),\n ...(categoryAxisMajorGridlineWidthEmu !== undefined\n ? { categoryAxisMajorGridlineWidthEmu }\n : {}),\n ...(categoryAxisMinorGridlineWidthEmu !== undefined\n ? { categoryAxisMinorGridlineWidthEmu }\n : {}),\n ...(valueAxisMinorGridlineWidthEmu !== undefined ? { valueAxisMinorGridlineWidthEmu } : {}),\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 ...(bubble3D === true ? { bubble3D } : {}),\n ...(showNegativeBubbles !== undefined ? { showNegativeBubbles } : {}),\n ...(view3D !== undefined ? { view3D } : {}),\n ...(bar3DShape !== undefined ? { bar3DShape } : {}),\n ...(gapDepthPct !== undefined ? { gapDepthPct } : {}),\n ...(seriesAxis !== undefined ? { seriesAxis } : {}),\n ...(ofPie !== undefined ? { ofPie } : {}),\n ...(surfaceContour ? { surfaceContour } : {}),\n ...(surfaceWireframe !== undefined ? { surfaceWireframe } : {}),\n ...(upDownBars !== undefined ? { upDownBars } : {}),\n ...(dataTable !== undefined ? { dataTable } : {}),\n ...(categoryAxisDate !== undefined ? { categoryAxisDate } : {}),\n ...(categoryAxisScaling !== undefined ? { categoryAxisScaling } : {}),\n ...(categoryGroupLevels !== undefined ? { categoryGroupLevels } : {}),\n ...(plotAreaLayout !== undefined ? { plotAreaLayout } : {}),\n ...(titleLayout !== undefined ? { titleLayout } : {}),\n ...(valueAxisLineHidden ? { valueAxisLineHidden } : {}),\n ...(categoryAxisLineHidden ? { categoryAxisLineHidden } : {}),\n };\n};\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 { validateChartSpecEnums } from '../../internal/chartml/enum-validation.ts';\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 layoutChartSheet,\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 checkChartColor(\n spec.secondaryValueAxis?.majorGridlineColor,\n 'addSlideChart: secondaryValueAxis.majorGridlineColor',\n );\n checkChartColor(\n spec.secondaryValueAxis?.lineColor,\n 'addSlideChart: secondaryValueAxis.lineColor',\n );\n checkChartColor(spec.dataLabels?.fillColor, 'addSlideChart: dataLabels.fillColor');\n checkChartColor(spec.upDownBars?.upColor, 'addSlideChart: upDownBars.upColor');\n checkChartColor(spec.upDownBars?.downColor, 'addSlideChart: upDownBars.downColor');\n checkChartColor(spec.seriesAxis?.lineColor, 'addSlideChart: seriesAxis.lineColor');\n spec.series.forEach((series, i) => {\n checkChartColor(series.color, `addSlideChart: series[${i}].color`);\n checkChartColor(series.lineColor, `addSlideChart: series[${i}].lineColor`);\n checkChartColor(series.markerColor, `addSlideChart: series[${i}].markerColor`);\n checkChartColor(series.markerLineColor, `addSlideChart: series[${i}].markerLineColor`);\n checkChartColor(series.trendline?.color, `addSlideChart: series[${i}].trendline.color`);\n checkChartColor(series.errorBars?.color, `addSlideChart: series[${i}].errorBars.color`);\n checkChartColor(series.xErrorBars?.color, `addSlideChart: series[${i}].xErrorBars.color`);\n checkChartColor(\n series.dataLabels?.fillColor,\n `addSlideChart: series[${i}].dataLabels.fillColor`,\n );\n series.pointDataLabels?.forEach((label, j) => {\n checkChartColor(\n label?.fillColor,\n `addSlideChart: series[${i}].pointDataLabels[${j}].fillColor`,\n );\n });\n series.pointColors?.forEach((c, j) => {\n checkChartColor(c, `addSlideChart: series[${i}].pointColors[${j}]`);\n });\n });\n};\n\n// The secondary axis pair is emitted next to the primary one, never instead\n// of it: a chart with no primary series has an axis pair nothing plots on,\n// and its reader would hand the secondary series back as primary.\nconst validateChartSpecAxes = (spec: ChartSpec): void => {\n if (spec.series.length > 0 && spec.series.every((series) => series.secondaryAxis === true)) {\n throw new Error('chart: at least one series must plot on the primary axis');\n }\n};\n\n/**\n * Adds a chart to the slide. Returns the new shape handle (kind\n * `graphicFrame`). Every `ChartKind` is authorable, and the `view3D` /\n * `ofPie` / `surfaceContour` modifiers reach the remaining plot-group\n * elements (3-D bar / line / area / pie, pie-of-pie, contour) — see the\n * table on `ChartKind`.\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` / `doughnut` charts require exactly one series; `stock`\n * charts exactly three (high, low, close) or four (open first).\n * - `scatter` / `bubble` series carry their own `xValues` (and\n * `bubbleSizes`); `categories` is unused for them.\n * - All other series should have at most `categories.length` values;\n * missing values are treated as blanks (gaps in the visualization).\n * - A spec whose fields contradict each other (e.g. `view3D` on a\n * scatter chart, error bars on a pie) throws instead of writing a\n * chart PowerPoint would repair.\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 the axis labels, the\n// chart / secondary-axis titles, the legend and the chart-level data labels\n// the caller left unset (authored colors always win). Series-level and\n// per-point label styles, and the category / primary value axis titles, are\n// left as authored.\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 const hasSecondary = spec.series.some((series) => series.secondaryAxis === true);\n const secondary = spec.secondaryValueAxis ?? {};\n return {\n ...spec,\n categoryAxisLabelStyle: withColor(spec.categoryAxisLabelStyle),\n valueAxisLabelStyle: withColor(spec.valueAxisLabelStyle),\n ...(hasSecondary\n ? {\n secondaryValueAxis: {\n ...secondary,\n labelStyle: withColor(secondary.labelStyle),\n ...(secondary.title !== undefined\n ? { titleStyle: withColor(secondary.titleStyle) }\n : {}),\n },\n }\n : {}),\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 validateChartSpecEnums(opts.spec, 'addSlideChart');\n validateChartSpecColors(opts.spec);\n validateChartSpecAxes(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 // The workbook grid and the chart's `<c:f>` formulas come from the same\n // layout, so \"Edit data\" opens onto exactly the cells the chart names.\n const xlsxBytes = buildEmbeddedXlsx(layoutChartSheet(spec).grid);\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 validateChartSpecEnums(spec, 'setChartSpec');\n validateChartSpecColors(spec);\n validateChartSpecAxes(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, with the same unset-color baking as addSlideChart.\n const doc = buildChartSpaceDoc(withChartDefaultTextColor(spec, resolveDeckBodyTextColor(slide)));\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 if (xlsxPart) {\n xlsxPart.data = buildEmbeddedXlsx(layoutChartSheet(spec).grid);\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 stock: 0,\n surface: 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.fontComplexScript === undefined && layer.fontComplexScript !== undefined) {\n base.fontComplexScript = layer.fontComplexScript;\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 if (typeof result.fontComplexScript === 'string' && result.fontComplexScript.startsWith('+')) {\n const resolved = resolveThemeToken(result.fontComplexScript);\n if (resolved) result.fontComplexScript = resolved;\n }\n if (result.fontComplexScript === undefined) {\n const useMajor = phType === 'title' || phType === 'ctrTitle';\n const fallback = useMajor ? fonts.majorComplexScript : fonts.minorComplexScript;\n if (fallback) result.fontComplexScript = 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 { oneOf } from '../../internal/bounds.ts';\nimport { TEXT_ANCHORS, TEXT_DIRECTIONS, LINE_DASHES } from '../../internal/enum-values.ts';\nimport { resolveChartPartName } from './charts.ts';\nimport {\n alignToken,\n applyAlignmentTokenToAllParagraphs,\n applyValidatedFormatToAllRuns,\n validateFormatEnums,\n buildColorElement,\n clearFill as clearFillImpl,\n setSolidFill,\n setTextBody,\n buildTextBodyParagraphs,\n replaceTextBodyParagraphs,\n type TextFormat,\n type ParagraphAlignment,\n type ParagraphAlignmentToken,\n type ParagraphSpec,\n parseAlignmentToken,\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 qnameEquals,\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 {\n type ShapeParagraphElement,\n readParagraphElements,\n readParagraphEndFormat,\n} 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 txBody.children.push(elem(qname('a', 'p', NS.dml)));\n // CT_TableCell is a sequence (txBody?, tcPr?, extLst?): txBody leads.\n tc.children.unshift(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/**\n * Replaces a cell's text. `\\n` starts a new paragraph. The paragraph-end\n * format (`<a:endParaRPr>`) is not kept; author it with `setTableCellParagraphs`.\n */\nexport const setTableCellText = (cell: TableCellData, text: string): void => {\n const txBody = ensureCellTxBody(cell);\n setTextBody(txBody, text);\n commitTableCell(cell);\n};\n\n/**\n * Replaces the cell's text with explicitly structured paragraphs and runs —\n * the table counterpart of `setShapeParagraphs`. Read back with\n * `getTableCellParagraphs`.\n */\nexport const setTableCellParagraphs = (\n cell: TableCellData,\n paragraphs: ReadonlyArray<ParagraphSpec>,\n): void => {\n // Built first: a rejected format must not leave a freshly created, empty\n // (schema-invalid) <a:txBody> on a cell that had none.\n const built = buildTextBodyParagraphs(paragraphs, 'setTableCellParagraphs');\n replaceTextBodyParagraphs(ensureCellTxBody(cell), built);\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. `coveredText: 'keep'` (the default)\n * leaves each covered cell's `<a:txBody>` in the XML; `'drop'` removes it,\n * so the covered cells carry no `<a:txBody>` at all (CT_TableCell allows\n * that), which is how PptxGenJS writes a merge; `getTableCellParagraphs`\n * reads them as `[]`.\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 options?: { readonly coveredText?: 'keep' | 'drop' },\n): void => {\n const { row, col, rowSpan, colSpan } = block;\n const coveredText = options?.coveredText ?? 'keep';\n if (coveredText !== 'keep' && coveredText !== 'drop') {\n throw new TypeError(\n `mergeTableCells: coveredText must be 'keep' or 'drop' (got ${String(coveredText)})`,\n );\n }\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 if (coveredText === 'drop') {\n tc.children = tc.children.filter(\n (child) => !(child.kind === 'element' && qnameEquals(child.name, NAME_A_TX_BODY_TBL)),\n );\n }\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 if (sides !== null) {\n for (const [side, border] of Object.entries(sides)) {\n if (border?.dash != null)\n oneOf(border.dash, LINE_DASHES, `setTableCellBorders: ${side}.dash`);\n }\n }\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 if (direction !== null) oneOf(direction, TEXT_DIRECTIONS, 'setTableCellTextDirection: direction');\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 if (anchor !== null) oneOf(anchor, ['top', 'center', 'bottom'], 'setTableCellAnchor: anchor');\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 = TEXT_ANCHORS[anchor];\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 * Literal format of the paragraph-end mark (`<a:endParaRPr>`), or `null`\n * when absent — the only format a paragraph with no `elements` carries.\n */\n readonly endFormat: TextFormat | null;\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), endFormat: readParagraphEndFormat(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 validateFormatEnums(format, 'setTableCellTextFormat');\n const txBody = ensureCellTxBody(cell);\n applyValidatedFormatToAllRuns(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 token = alignToken(align, 'setTableCellAlignment');\n const txBody = ensureCellTxBody(cell);\n applyAlignmentTokenToAllParagraphs(txBody, token);\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 as its\n * spec token (`l`, `ctr`, `r`, `just`, `dist`, `justLow`, `thaiDist`) — so\n * `setTableCellAlignment(cell, 'center')` reads back as `'ctr'`. Returns\n * `null` when the cell has no `<a:txBody>`, or its first paragraph has no\n * valid `algn` attribute (PowerPoint then defaults to `l`). For a\n * plain-English name per paragraph, use `getTableCellParagraphs`.\n */\nexport const getTableCellAlignment = (cell: TableCellData): ParagraphAlignmentToken | 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 return parseAlignmentToken(getAttrValue(pPr, qname('', 'algn', '')));\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// - A video / audio time node whose target shape is not on the slide.\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, isMediaTimingNode, mediaTimingNodeTarget } 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.media &&\n rel.type !== REL_TYPES.video &&\n rel.type !== REL_TYPES.audio &&\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 // A `<p:video>` / `<p:audio>` time node is bound to its picture by shape\n // id only; one left behind after its shape was deleted targets nothing.\n const timing = firstChildElement(slideRoot, qname('p', 'timing', NS.pml));\n const checkMediaNodes = (host: ReturnType<typeof parseXml>['root']): void => {\n for (const child of host.children) {\n if (child.kind !== 'element') continue;\n if (!isMediaTimingNode(child)) {\n checkMediaNodes(child);\n continue;\n }\n const target = mediaTimingNodeTarget(child);\n if (target !== null && !seenShapeIds.has(String(target))) {\n issues.push({\n severity: 'error',\n message: `media time node in slide ${slideName} targets missing shape id=\"${target}\"`,\n partName: slideName,\n });\n }\n }\n };\n if (timing) checkMediaNodes(timing);\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 `@office-kit/pptx/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 const transition = buildTransition(options);\n removeTransition(slide);\n insertAfterClrMapOvr(slide, transition);\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 { oneOf } from '../../internal/bounds.ts';\nimport { SLIDE_SIZE_TYPES } from '../../internal/enum-values.ts';\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 if (opts.type !== undefined) oneOf(opts.type, SLIDE_SIZE_TYPES, 'setSlideSize: type');\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","// Media time nodes (`<p:video>` / `<p:audio>`) inside a slide's `<p:timing>`.\n//\n// A clip's play button / seek bar only appears in the slide show when the\n// timing tree's root holds a media node targeting the picture, so the shape\n// and its node have to be added, copied and removed together. The animation\n// code shares the same `<p:timing>` element; these helpers touch only the\n// media nodes and leave every animation sequence as they found it.\n\nimport {\n type MediaFileKind,\n buildMediaTimingNode,\n buildTimingRoot,\n isMediaTimingNode,\n mediaTimingNodeTarget,\n} from '../../internal/presentationml/index.ts';\nimport {\n NS,\n type XmlElement,\n firstChildElement,\n getAttrValue,\n qname,\n} from '../../internal/xml/index.ts';\nimport { SLIDE_DOCUMENT, type SlideData } from '../_internal-symbols.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_EXT_LST = qname('p', 'extLst', NS.pml);\nconst ATTR_ID = qname('', 'id', '');\n\nconst findSlideTiming = (slide: SlideData): XmlElement | null =>\n firstChildElement(slide[SLIDE_DOCUMENT].root, NAME_TIMING);\n\n// `<p:timing>` sits between `<p:transition>` and `<p:extLst>` in CT_Slide;\n// everything else that may precede it is already in place on a parsed slide.\nconst insertSlideTiming = (slide: SlideData, timing: XmlElement): void => {\n const root = slide[SLIDE_DOCUMENT].root;\n const extLst = firstChildElement(root, NAME_EXT_LST);\n if (extLst === null) root.children.push(timing);\n else root.children.splice(root.children.indexOf(extLst), 0, timing);\n};\n\n/** The root time node's `<p:childTnLst>` — where media nodes and sequences live. */\nexport const rootChildTnLst = (timing: XmlElement): XmlElement | null => {\n const tnLst = firstChildElement(timing, NAME_TN_LST);\n const par = tnLst ? firstChildElement(tnLst, NAME_PAR) : null;\n const cTn = par ? firstChildElement(par, NAME_C_TN) : null;\n return cTn ? firstChildElement(cTn, NAME_CHILD_TN_LST) : null;\n};\n\n// Largest numeric `<p:cTn id=\"N\">` anywhere in the tree (0 when none).\nexport const maxCTnId = (el: XmlElement): number => {\n let max = 0;\n const walk = (e: XmlElement): void => {\n if (e.name.namespaceURI === NS.pml && e.name.localName === 'cTn') {\n const n = Number.parseInt(getAttrValue(e, ATTR_ID) ?? '', 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\n/** Adds the media time node for shape `spid`. The caller commits the slide. */\nexport const addMediaTimingNode = (slide: SlideData, kind: MediaFileKind, spid: number): void => {\n const timing = findSlideTiming(slide);\n if (timing === null) {\n // The root node takes cTn id 1, so the first media node is 2.\n insertSlideTiming(slide, buildTimingRoot([buildMediaTimingNode(kind, spid, 2)]));\n return;\n }\n const node = buildMediaTimingNode(kind, spid, maxCTnId(timing) + 1);\n const childTnLst = rootChildTnLst(timing);\n if (childTnLst !== null) {\n childTnLst.children.push(node);\n return;\n }\n // A `<p:timing>` whose root has no `<p:childTnLst>` (e.g. a bare\n // `<p:timing/>`) holds no time nodes worth keeping, so its `<p:tnLst>` is\n // replaced; `<p:bldLst>` / `<p:extLst>` stay where they are.\n const fresh = buildTimingRoot([node]);\n const rest = timing.children.filter(\n (c) =>\n !(c.kind === 'element' && c.name.namespaceURI === NS.pml && c.name.localName === 'tnLst'),\n );\n timing.children = [...fresh.children, ...rest];\n};\n\n/**\n * Removes the media nodes targeting any of `spids`, and the whole `<p:timing>`\n * when that leaves the root without children (an empty `<p:childTnLst>` is\n * schema-invalid and an empty root animates nothing). The caller commits.\n */\nexport const removeMediaTimingNodes = (slide: SlideData, spids: ReadonlySet<number>): void => {\n const timing = findSlideTiming(slide);\n const childTnLst = timing ? rootChildTnLst(timing) : null;\n if (timing === null || childTnLst === null) return;\n childTnLst.children = childTnLst.children.filter((c) => {\n if (c.kind !== 'element' || !isMediaTimingNode(c)) return true;\n const target = mediaTimingNodeTarget(c);\n return target === null || !spids.has(target);\n });\n if (!childTnLst.children.some((c) => c.kind === 'element')) {\n const root = slide[SLIDE_DOCUMENT].root;\n root.children = root.children.filter((c) => c !== timing);\n }\n};\n\n/** Media nodes at the timing root, in document order. */\nexport const mediaTimingNodes = (timing: XmlElement): XmlElement[] => {\n const childTnLst = rootChildTnLst(timing);\n if (childTnLst === null) return [];\n return childTnLst.children.filter(\n (c): c is XmlElement => c.kind === 'element' && isMediaTimingNode(c),\n );\n};\n","// Slide animations.\n\nimport {\n type AnimationEffect,\n type AnimationOptions,\n buildSingleEffectTiming,\n buildTimingRoot,\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';\nimport { maxCTnId, mediaTimingNodes, rootChildTnLst } from './_media-timing.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\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\nconst isMainSeqCTn = (e: XmlElement): boolean =>\n isPml(e, 'cTn') && getAttrValue(e, qname('', 'nodeType', '')) === 'mainSeq';\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 has no structure we know how to extend (so the caller can\n// avoid destroying it). This is what lets a second shape animate without wiping\n// a template's pre-existing animations.\nconst mergeEffectInto = (existing: XmlElement, fresh: XmlElement): boolean => {\n const freshMainSeq = findDescendant(fresh, isMainSeqCTn);\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 // 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\n const existingMainSeq = findDescendant(existing, isMainSeqCTn);\n const existingMainSeqChildTnLst = existingMainSeq\n ? firstChildElement(existingMainSeq, qname('p', 'childTnLst', NS.pml))\n : null;\n if (existingMainSeqChildTnLst) {\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 offset = maxCTnId(existing) - 2; // fresh effect ids start at 3\n if (offset > 0) shiftCTnIds(newPar, offset);\n existingMainSeqChildTnLst.children.push(newPar);\n } else {\n // A slide that holds a video / audio clip but no animation yet has a root\n // with media nodes (and possibly interactive sequences) but no mainSeq.\n // Adopt the fresh tree's whole main sequence; PowerPoint keeps it first,\n // ahead of the interactive sequences and media nodes.\n const rootList = rootChildTnLst(existing);\n const freshRootList = rootChildTnLst(fresh);\n const freshSeq = freshRootList?.children.find(\n (c): c is XmlElement => c.kind === 'element' && isPml(c, 'seq'),\n );\n if (!rootList || !freshSeq) return false;\n shiftCTnIds(freshSeq, maxCTnId(existing) - 1); // fresh mainSeq ids start at 2\n rootList.children.unshift(freshSeq);\n }\n\n if (effectCTn) setGrpId(effectCTn, newGrpId);\n setGrpId(freshBldP, newGrpId);\n const existingBldLst = findDescendant(existing, (e) => isPml(e, 'bldLst'));\n if (existingBldLst) existingBldLst.children.push(freshBldP);\n else insertBldLst(existing, elem(qname('p', 'bldLst', NS.pml), { children: [freshBldP] }));\n return true;\n};\n\n// CT_SlideTiming orders its children tnLst, bldLst, extLst.\nconst insertBldLst = (timing: XmlElement, bldLst: XmlElement): void => {\n const extLst = firstChildElement(timing, qname('p', 'extLst', NS.pml));\n if (extLst === null) timing.children.push(bldLst);\n else timing.children.splice(timing.children.indexOf(extLst), 0, bldLst);\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 // Media time nodes are what give a video / audio clip its play controls,\n // not animations — dropping them with the rest would silently break the\n // slide's clips.\n const existing = findTiming(slide);\n const mediaNodes = existing ? mediaTimingNodes(existing) : [];\n if (existing !== null && mediaNodes.length > 0) {\n const root = slide[SLIDE_DOCUMENT].root;\n root.children[root.children.indexOf(existing)] = buildTimingRoot(mediaNodes);\n } else {\n removeExistingTiming(slide);\n }\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 alignToken,\n type BulletStyle,\n type ParagraphAlignment,\n type ParagraphAlignmentToken,\n type TextFormat,\n applyBulletToParagraph,\n parseAlignmentToken,\n updateBulletIndentForLevel,\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);\nconst NAME_A_END_PARA_RPR = qname('a', 'endParaRPr', 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 * Reads the literal format of a paragraph's end mark (`<a:endParaRPr>`), or\n * `null` when the paragraph carries none. It is the only format a paragraph\n * with no runs carries. The write side is `setShapeParagraphs`' `endFormat`.\n */\nexport const getParagraphEndFormat = (\n shape: SlideShapeData,\n paragraphIndex: number,\n): TextFormat | null => readParagraphEndFormat(requireParagraph(shape, paragraphIndex));\n\n/**\n * Shared by the shape reader above and the table-cell paragraph reader.\n *\n * @internal\n */\nexport const readParagraphEndFormat = (paragraph: XmlElement): TextFormat | null => {\n const endParaRPr = firstChildElement(paragraph, NAME_A_END_PARA_RPR);\n return endParaRPr === null ? null : parseRPrLikeElement(endParaRPr);\n};\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\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 token = alignToken(align, 'setParagraphAlignment');\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, token));\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 * Indents matching the previous level's default bullet pair follow the level;\n * other indent values are preserved.\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 const previousLevel = Number.parseInt(getAttrValue(pPr, ATTR_LVL) ?? '0', 10);\n pPr.attrs = pPr.attrs.filter((a) => a.name.localName !== 'lvl');\n if (level > 0) pPr.attrs.push(attr(ATTR_LVL, String(level)));\n updateBulletIndentForLevel(pPr, Number.isFinite(previousLevel) ? previousLevel : 0, level);\n commitAndRefresh(shape);\n};\n\n/**\n * Reads the paragraph's own `algn` as its spec token (`l`, `ctr`, `r`,\n * `just`, `dist`, `justLow`, `thaiDist`) — so `setParagraphAlignment(…,\n * 'center')` reads back as `'ctr'`. Returns `null` when the attribute is\n * absent (the paragraph inherits from its layout / master) or is not a\n * valid token. For the inherited value under a plain-English name, use\n * `getParagraphPropertiesEffective`.\n */\nexport const getParagraphAlignment = (\n shape: SlideShapeData,\n paragraphIndex: number,\n): ParagraphAlignmentToken | null => {\n const paragraph = requireParagraph(shape, paragraphIndex);\n const pPr = firstChildElement(paragraph, NAME_A_PPR);\n if (pPr === null) return null;\n return parseAlignmentToken(getAttrValue(pPr, ATTR_ALGN_FN));\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 —\n // `resolveDrawingColorOpacity` surfaces them as an opacity instead.\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/**\n * Resolves the opacity a DrawingML color element carries through its\n * `<a:alpha>` / `<a:alphaMod>` / `<a:alphaOff>` children (ECMA-376\n * §20.1.2.3.1–3) to a `0`–`1` fraction, applied in document order from a\n * fully opaque base. Returns `null` when the element has no alpha\n * transform — PowerPoint paints that opaque, but callers can still tell\n * \"unspecified\" apart from an explicit `1`.\n *\n * Kept separate from `resolveDrawingColor` because alpha never changes the\n * `#RRGGBB`; OOXML encodes the two independently and renderers emit the\n * opacity next to the color (`fill-opacity` / `stroke-opacity`).\n */\nexport const resolveDrawingColorOpacity = (colorEl: XmlElement): number | null => {\n if (colorEl.name.namespaceURI !== NS.dml) return null;\n let opacity: number | null = null;\n for (const t of parseColorTransforms(colorEl)) {\n if (t.kind === 'alpha') opacity = t.val;\n else if (t.kind === 'alphaMod') opacity = (opacity ?? 1) * t.val;\n else if (t.kind === 'alphaOff') opacity = (opacity ?? 1) + t.val;\n }\n return opacity === null ? null : Math.max(0, Math.min(1, opacity));\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 const cs = firstChildElement(rPr, qname('a', 'cs', NS.dml));\n if (cs !== null) {\n const t = getAttrValue(cs, qname('', 'typeface', ''));\n if (t !== null) out.fontComplexScript = 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 setAdjustValues as writeAdjustValues,\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/**\n * Sets the shape's preset-geometry adjust values (`<a:prstGeom><a:avLst>`),\n * replacing any guides already authored. Keys are ECMA-376 guide names and\n * values are the raw guide numbers (rounded to integers). The companion\n * reader is {@link getShapeAdjustValues}.\n *\n * The common use is the corner radius of the `roundRect` preset, whose `adj`\n * guide runs `0..50000` (thousandths of a percent of the shorter side;\n * `16667` ≈ the PowerPoint default, `0` = square corners, `50000` = fully\n * rounded). For example, `setShapeAdjustValues(shape, { adj: 5000 })` gives a\n * subtle 5% rounding.\n *\n * Throws when the shape has no preset geometry (`<a:prstGeom>`) — a custom or\n * inherited geometry has no adjust list to author.\n */\nexport const setShapeAdjustValues = (\n shape: SlideShapeData,\n values: Readonly<Record<string, number>>,\n): void => {\n if (!writeAdjustValues(shape[SHAPE_ELEMENT], values)) {\n throw new Error('setShapeAdjustValues: shape has no preset geometry (<a:prstGeom>)');\n }\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, resolveDrawingColorOpacity } 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// The DrawingML color element inside `<a:solidFill>` under `container`,\n// or null when there is no solid fill there.\nconst solidFillColorElement = (container: XmlElement): XmlElement | null => {\n const solid = firstChildElement(container, 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) return inner;\n }\n return null;\n};\n\nconst fillColorElement = (shape: SlideShapeData): XmlElement | null => {\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n return spPr ? solidFillColorElement(spPr) : null;\n};\n\nconst strokeColorElement = (shape: SlideShapeData): XmlElement | null => {\n const spPr = firstChildElement(shape[SHAPE_ELEMENT], qname('p', 'spPr', NS.pml));\n const ln = spPr ? firstChildElement(spPr, qname('a', 'ln', NS.dml)) : null;\n return ln ? solidFillColorElement(ln) : null;\n};\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 color = strokeColorElement(shape);\n return color ? resolveDrawingColor(color, getPresentationTheme(pres)) : null;\n};\n\n/**\n * Returns the opacity (`0`–`1`) of the shape's own solid outline, read from\n * the `<a:alpha>` / `<a:alphaMod>` / `<a:alphaOff>` children of its color\n * element, or `null` when the outline isn't a solid color or carries no\n * alpha transform (PowerPoint draws it fully opaque). Companion to\n * `getShapeStrokeColorResolved`, which never carries the alpha channel.\n */\nexport const getShapeStrokeOpacity = (shape: SlideShapeData): number | null => {\n const color = strokeColorElement(shape);\n return color ? resolveDrawingColorOpacity(color) : 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 color = fillColorElement(shape);\n return color ? resolveDrawingColor(color, getPresentationTheme(pres)) : null;\n};\n\n/**\n * Returns the opacity (`0`–`1`) of the shape's own solid fill, read from\n * the `<a:alpha>` / `<a:alphaMod>` / `<a:alphaOff>` children of its color\n * element, or `null` when the fill isn't solid or carries no alpha\n * transform (PowerPoint paints it fully opaque). Companion to\n * `getShapeFillColorResolved`, which never carries the alpha channel —\n * OOXML encodes color and alpha independently.\n */\nexport const getShapeFillOpacity = (shape: SlideShapeData): number | null => {\n const color = fillColorElement(shape);\n return color ? resolveDrawingColorOpacity(color) : 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 { TEXT_ANCHORS, TEXT_DIRECTIONS } from '../../internal/enum-values.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 ParagraphSpec,\n type TextFormat,\n applyAlignmentToAllParagraphs,\n applyBulletToAllParagraphs,\n applyFormatToAllRuns,\n setTextBody,\n setTextBodyParagraphs,\n} from '../../internal/drawingml/index.ts';\nimport {\n oneOf,\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. The paragraph-end\n * format (`<a:endParaRPr>`) is not kept; author it with `setShapeParagraphs`.\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, options.bullets);\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 oneOf(wrap, ['none', 'square'], 'setShapeTextWrap: wrap');\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 oneOf(mode, ['none', 'normal', 'shape'], 'setShapeTextAutoFit: mode');\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 = { none: 'noAutofit', normal: 'normAutofit', shape: 'spAutoFit' }[mode];\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 if (direction !== null) oneOf(direction, TEXT_DIRECTIONS, 'setShapeTextDirection: direction');\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 oneOf(anchor, ['top', 'center', 'bottom'], 'setShapeTextAnchor: anchor');\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 = TEXT_ANCHORS[anchor];\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, 'setShapeTextFormat');\n commitAndRefresh(shape);\n};\n\n/**\n * Replaces the shape's text with explicitly structured paragraphs, each\n * carrying its own runs and per-run formats. `setShapeText` yields one run\n * per paragraph; use this when a paragraph mixes formats (a bold lead-in\n * followed by plain text, for example). Read back with\n * `getShapeParagraphElements`.\n */\nexport const setShapeParagraphs = (\n shape: SlideShapeData,\n paragraphs: ReadonlyArray<ParagraphSpec>,\n): void => {\n setTextBodyParagraphs(requireTxBody(shape), paragraphs);\n commitAndRefresh(shape);\n};\n","// Shape removal and z-order.\n\nimport { emptyRels, nextRelId } from '../../internal/opc/index.ts';\nimport { readPictureMediaRef } from '../../internal/presentationml/index.ts';\nimport {\n NS,\n type XmlElement,\n firstChildElement,\n getAttrValue,\n qname,\n} 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';\nimport { addMediaTimingNode, removeMediaTimingNodes } from './_media-timing.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 // A clip's play controls come from a media time node keyed by shape id, so\n // the copy needs its own node under the id it was just given.\n const media = cloned.name.localName === 'pic' ? readPictureMediaRef(cloned) : null;\n if (media !== null) addMediaTimingNode(targetSlide, media.kind, newId);\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 const removedIds = new Set<number>();\n spTree.children = spTree.children.filter((c) => {\n const isShape =\n c.kind === 'element' &&\n c.name.namespaceURI === NS.pml &&\n SHAPE_CHILD_LOCALS.has(c.name.localName);\n if (isShape) collectShapeIds(c, removedIds);\n return !isShape;\n });\n removeMediaTimingNodes(slide, removedIds);\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 const removedIds = new Set<number>();\n collectShapeIds(shape[SHAPE_ELEMENT], removedIds);\n removeMediaTimingNodes(slide, removedIds);\n commitSlideData(slide);\n rebuildShapesFromDocument(slide);\n};\n\n// Ids of `el` and every shape nested in it (a removed group takes its media\n// pictures with it), so no media time node is left targeting a shape id that\n// no longer exists.\nconst collectShapeIds = (el: XmlElement, into: Set<number>): void => {\n if (el.name.namespaceURI === NS.pml && el.name.localName === 'cNvPr') {\n const id = Number.parseInt(getAttrValue(el, qname('', 'id', '')) ?? '', 10);\n if (Number.isFinite(id)) into.add(id);\n return;\n }\n for (const c of el.children) {\n if (c.kind === 'element') collectShapeIds(c, into);\n }\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","import { partName, relsPartNameFor, resolveTarget, type PartName } from '../opc/index.ts';\nimport { NS, parseXml, serializeXml } from '../xml/index.ts';\nimport type { OpcPackage, Part } from './package.ts';\n\n/** Clone owned dependencies without interpreting their bodies or relationship types. */\nexport function duplicatePartGraph(\n pkg: OpcPackage,\n source: PartName,\n destination: PartName,\n sharedTypes: ReadonlySet<string>,\n): void {\n const parts = new Map(pkg.parts.map((part) => [part.name.toLowerCase(), part]));\n const occupied = new Set(parts.keys());\n const copies = new Map<string, PartName>([[source.toLowerCase(), destination]]);\n const pending = [source];\n const planned: Part[] = [];\n const encoder = new TextEncoder();\n const decoder = new TextDecoder();\n occupied.add(destination.toLowerCase());\n const counters = new Map<string, number>();\n const allocate = (name: PartName): PartName => {\n const dot = name.lastIndexOf('.');\n const split = dot > name.lastIndexOf('/') ? dot : name.length;\n const stem = name.slice(0, split);\n const extension = name.slice(split);\n let n = counters.get(name.toLowerCase()) ?? 1;\n let candidate: PartName;\n do {\n candidate = partName(`${stem}-copy${n++}${extension}`);\n } while (occupied.has(candidate.toLowerCase()));\n counters.set(name.toLowerCase(), n);\n occupied.add(candidate.toLowerCase());\n return candidate;\n };\n\n for (let index = 0; index < pending.length; index++) {\n const name = pending[index]!;\n const part = parts.get(name.toLowerCase());\n if (!part) throw new Error(`Cannot duplicate missing dependency ${name}`);\n const copy = copies.get(name.toLowerCase())!;\n planned.push({ name: copy, contentType: part.contentType, data: new Uint8Array(part.data) });\n const relsPart = parts.get(relsPartNameFor(name).toLowerCase());\n if (!relsPart) continue;\n // Retain attributes and extension XML in relationships too. Only Target changes.\n const doc = parseXml(decoder.decode(relsPart.data));\n for (const element of doc.root.children) {\n if (\n element.kind !== 'element' ||\n element.name.localName !== 'Relationship' ||\n element.name.namespaceURI !== NS.relationships\n )\n continue;\n const target = element.attrs.find(\n (attribute) => attribute.name.namespaceURI === '' && attribute.name.localName === 'Target',\n );\n const type = element.attrs.find(\n (attribute) => attribute.name.namespaceURI === '' && attribute.name.localName === 'Type',\n )?.value;\n const mode = element.attrs.find(\n (attribute) =>\n attribute.name.namespaceURI === '' && attribute.name.localName === 'TargetMode',\n )?.value;\n if (!target || !type) throw new Error(`Invalid relationship in ${relsPart.name}`);\n if (mode === 'External') continue;\n const resolved = resolveTarget(name, target.value);\n if (!parts.has(resolved.toLowerCase()))\n throw new Error(`Cannot duplicate missing dependency ${resolved}`);\n let mapped = copies.get(resolved.toLowerCase());\n if (!mapped && !sharedTypes.has(type)) {\n mapped = allocate(resolved);\n copies.set(resolved.toLowerCase(), mapped);\n pending.push(resolved);\n }\n // Absolute part names stay correct even if the dependency has another directory.\n element.attrs = element.attrs.map((attribute) =>\n attribute === target ? { ...attribute, value: mapped ?? resolved } : attribute,\n );\n }\n planned.push({\n name: relsPartNameFor(copy),\n contentType: relsPart.contentType,\n data: encoder.encode(serializeXml(doc)),\n });\n }\n // Missing dependencies must fail before changing the original package.\n const names = new Set(parts.keys());\n for (const part of planned) {\n const key = part.name.toLowerCase();\n if (names.has(key)) throw new Error(`Cannot duplicate into existing part ${part.name}`);\n names.add(key);\n }\n for (const part of planned) pkg.addPart(part.name, part.contentType, part.data);\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 { duplicatePartGraph } from '../../internal/parts/duplicate-graph.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 * Charts, embedded workbooks, notes and other owned dependencies are copied.\n * Layouts, masters, themes, media and links to other slides remain shared.\n * Unknown dependency bodies are retained without interpreting their content.\n */\nexport const duplicateSlide = (pres: PresentationData, slide: SlideData): SlideData => {\n const pkg = pres[INTERNAL_PACKAGE];\n if (slide[INTERNAL_PACKAGE] !== pkg)\n throw new Error('duplicateSlide: slide belongs to another presentation');\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 duplicatePartGraph(\n pkg,\n sourcePartName,\n newSlidePartName,\n new Set([\n REL_TYPES.slideLayout,\n REL_TYPES.slideMaster,\n REL_TYPES.notesMaster,\n REL_TYPES.handoutMaster,\n REL_TYPES.theme,\n REL_TYPES.slide,\n REL_TYPES.image,\n REL_TYPES.media,\n REL_TYPES.video,\n REL_TYPES.audio,\n ]),\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\nconst IMPORTED_MEDIA_REL_TYPES: ReadonlySet<string> = new Set([\n REL_TYPES.image,\n REL_TYPES.media,\n REL_TYPES.video,\n REL_TYPES.audio,\n]);\n\n// importSlide copies the body verbatim but only carries media + 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 / video / audio rels are copied across. Other rels (charts,\n * embedded 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 // - the image / video / audio rels (with each media part imported once)\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 // A clip is referenced by two rels (`media` + `video` / `audio`) that must\n // keep pointing at ONE part, so copies are keyed by source part name.\n const importedMedia = new Map<string, string>();\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 (IMPORTED_MEDIA_REL_TYPES.has(rel.type)) {\n // An online video's URL (or a linked image) has no part to copy.\n if (rel.targetMode === 'External') {\n newRels.items.push({ ...rel });\n continue;\n }\n const mediaName = rel.target.startsWith('/')\n ? partName(rel.target)\n : resolveTarget(sourcePartName, rel.target);\n let target = importedMedia.get(mediaName);\n if (target === undefined) {\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 // Copy the media part across with a fresh name, in PowerPoint's\n // `imageN` / `mediaN` naming.\n const stem = rel.type === REL_TYPES.image ? 'image' : 'media';\n let nextN = 1;\n const re = new RegExp(`^/ppt/media/${stem}(\\\\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/${stem}${nextN}.${extension}`);\n setOpcDefault(targetPkg, extension.toLowerCase(), mediaPart.contentType);\n targetPkg.addPart(newMediaName, mediaPart.contentType, new Uint8Array(mediaPart.data));\n target = `../media/${stem}${nextN}.${extension}`;\n importedMedia.set(mediaName, target);\n }\n newRels.items.push({ id: rel.id, type: rel.type, target, targetMode: 'Internal' });\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","// Video / audio / online-video authoring and read-back.\n\nimport type { Emu } from '../units.ts';\nimport { emuCoordinate, emuExtent } from '../../internal/bounds.ts';\nimport {\n type AudioFormat,\n type ImageFormat,\n type PartName,\n type TargetMode,\n type VideoFormat,\n contentTypeForAudioFormat,\n contentTypeForFormat,\n contentTypeForVideoFormat,\n detectAudioFormat,\n detectImageFormat,\n detectVideoFormat,\n emptyRels,\n extensionForFormat,\n nextRelId,\n partName,\n resolveTarget,\n} from '../../internal/opc/index.ts';\nimport type { OpcPackage } from '../../internal/parts/index.ts';\nimport {\n REL_TYPES,\n buildMediaPicture,\n readPictureMediaRef,\n} from '../../internal/presentationml/index.ts';\nimport {\n INTERNAL_PACKAGE,\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, nextShapeId, setOpcDefault } from './_helpers.ts';\nimport { addMediaTimingNode } from './_media-timing.ts';\n\nexport type { AudioFormat, VideoFormat };\n\n/** What `addSlideMedia` embeds or links. */\nexport type SlideMediaSource =\n | {\n kind: 'video';\n data: Uint8Array;\n /** Container of `data`. Detected from its signature when omitted. */\n format?: VideoFormat;\n }\n | {\n kind: 'audio';\n data: Uint8Array;\n /** Container of `data`. Detected from its signature when omitted. */\n format?: AudioFormat;\n }\n | {\n kind: 'online';\n /** `http(s)` URL of the video. YouTube page URLs are rewritten to the embed form. */\n url: string;\n };\n\nexport type SlideMediaOptions = SlideMediaSource & {\n x: Emu;\n y: Emu;\n w: Emu;\n h: Emu;\n name?: string;\n /** Poster frame shown until the clip plays. A neutral play-button image when omitted. */\n poster?: Uint8Array;\n /** Format of `poster`. Detected from its signature when omitted. */\n posterFormat?: ImageFormat;\n};\n\n/** A picture's media, as `getShapeMedia` reports it. */\nexport type ShapeMedia =\n | {\n readonly kind: 'video' | 'audio';\n readonly partName: string;\n readonly contentType: string;\n /** Live view into the package part — copy before mutating. */\n readonly bytes: Uint8Array;\n }\n | {\n /** Media linked by URL instead of embedded (an online video, or a linked file). */\n readonly kind: 'online';\n readonly url: string;\n };\n\n// 320×180 1-bit PNG: white play triangle on dark grey. `<a:blip>` must point at\n// a real image, so a clip added without a poster still needs one. `atob` is a\n// Web-standard global in every supported runtime (Node >= 16, browsers).\nconst DEFAULT_POSTER_BASE64 =\n 'iVBORw0KGgoAAAANSUhEUgAAAUAAAAC0AQMAAADfKmdSAAAABlBMVEUmJib///+/9FOwAAAAvUlEQVR42u3XMQ7DIBAEQOfn' +\n 'fhpP4QmUFAgiJUqdKa6xtFtPA8J36+tKkiRJkiR5RF4Mm8KucCrcCg/DpnAoXAq3wnMr7AqnwqXwMGwKu8KpcCukK//ApnAo' +\n 'XAq3QjnNF3aFU+FSeBg2hUPhVLgV/r/yH2wKRzls1YfZ5Rc+yh9F+cOd5R/XXT0AVvmQatWDlEczD3teH7yQypcmr2Fe7FoV' +\n 'uHxwneGCxJWrvBZy0eTqymU4fxhJkiRJkjwqbzMmJGbQfp8bAAAAAElFTkSuQmCC';\n\nconst defaultPoster = (): Uint8Array =>\n Uint8Array.from(atob(DEFAULT_POSTER_BASE64), (ch) => ch.charCodeAt(0));\n\nconst YOUTUBE_HOSTS = new Set(['youtube.com', 'www.youtube.com', 'm.youtube.com']);\nconst YOUTUBE_SHORT_HOST = 'youtu.be';\nconst YOUTUBE_ID = /^[A-Za-z0-9_-]+$/;\n\nconst youtubeVideoId = (url: URL): string | null => {\n const segments = url.pathname.split('/').filter((s) => s !== '');\n if (url.hostname === YOUTUBE_SHORT_HOST) return segments[0] ?? null;\n if (!YOUTUBE_HOSTS.has(url.hostname)) return null;\n if (segments[0] === 'watch') return url.searchParams.get('v');\n if (segments[0] === 'shorts' || segments[0] === 'live') return segments[1] ?? null;\n return null;\n};\n\n// PowerPoint loads the relationship target directly in its embedded player, so\n// a YouTube *page* URL (watch / youtu.be / shorts) would render the whole web\n// page instead of the clip. Rewrite those to the embed endpoint, in the exact\n// form PowerPoint's own \"Insert > Online Video\" stores. Anything else —\n// including a URL already in embed form — is kept as given.\nconst resolveOnlineVideoUrl = (input: string): string => {\n let url: URL;\n try {\n url = new URL(input);\n } catch {\n throw new Error(`addSlideMedia: url is not an absolute URL: ${JSON.stringify(input)}`);\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') {\n throw new Error(`addSlideMedia: url must be http(s), got ${JSON.stringify(input)}`);\n }\n const id = youtubeVideoId(url);\n if (id === null || !YOUTUBE_ID.test(id)) return url.href;\n return `https://www.youtube.com/embed/${id}?feature=oembed`;\n};\n\nconst MEDIA_DIR = '/ppt/media/';\n\nconst nextMediaPartName = (pkg: OpcPackage, stem: string, extension: string): PartName => {\n let nextN = 1;\n const pattern = new RegExp(`^/ppt/media/${stem}(\\\\d+)\\\\.`);\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 (n >= nextN) nextN = n + 1;\n }\n }\n return partName(`${MEDIA_DIR}${stem}${nextN}.${extension}`);\n};\n\nconst bytesEqual = (a: Uint8Array, b: Uint8Array): boolean => {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n};\n\n// Clips are large and decks often repeat one (the same jingle on every slide),\n// so identical bytes share a single part. Posters are deliberately NOT shared:\n// `setShapeImage` rewrites a picture's image part in place, which would change\n// the poster of every other clip sharing it.\nconst internClipPart = (\n pkg: OpcPackage,\n extension: string,\n contentType: string,\n bytes: Uint8Array,\n): PartName => {\n for (const p of pkg.parts) {\n if (p.name.startsWith(MEDIA_DIR) && p.contentType === contentType && bytesEqual(p.data, bytes))\n return p.name;\n }\n const name = nextMediaPartName(pkg, 'media', extension);\n setOpcDefault(pkg, extension, contentType);\n pkg.addPart(name, contentType, bytes);\n return name;\n};\n\ntype ResolvedSource =\n | { readonly url: string }\n | { readonly data: Uint8Array; readonly extension: string; readonly contentType: string };\n\nconst resolveSource = (source: SlideMediaSource): ResolvedSource => {\n switch (source.kind) {\n case 'online':\n return { url: resolveOnlineVideoUrl(source.url) };\n case 'video': {\n const format = source.format ?? detectVideoFormat(source.data);\n if (format === null) {\n throw new Error(\n 'addSlideMedia: could not detect the video format. Pass options.format explicitly.',\n );\n }\n const contentType = contentTypeForVideoFormat(format);\n return { data: source.data, extension: format, contentType };\n }\n case 'audio': {\n const format = source.format ?? detectAudioFormat(source.data);\n if (format === null) {\n throw new Error(\n 'addSlideMedia: could not detect the audio format. Pass options.format explicitly.',\n );\n }\n const contentType = contentTypeForAudioFormat(format);\n return { data: source.data, extension: format, contentType };\n }\n }\n};\n\nconst DEFAULT_NAME_PREFIX = { video: 'Video', audio: 'Audio', online: 'Online Media' } as const;\n\n/**\n * Adds a video, an audio clip or an online (URL) video to the slide. Returns\n * the new picture shape — the clip's poster frame.\n *\n * Embedded clips are stored once per package: adding the same bytes again\n * reuses the existing `/ppt/media/mediaN.<ext>` part. The container format is\n * detected from the bytes (mp4 / m4v / mov / webm / avi / wmv, mp3 / wav / m4a /\n * ogg / wma); pass `format` for anything the signature check cannot tell.\n * Whether a clip plays depends on the codecs of the viewing application.\n *\n * The shape is an ordinary picture: `getShapeImageBytes` / `setShapeImage`\n * read and replace the poster, `getShapeMedia` reads the clip.\n */\nexport const addSlideMedia = (slide: SlideData, opts: SlideMediaOptions): SlideShapeData => {\n const x = emuCoordinate(opts.x, 'addSlideMedia: x');\n const y = emuCoordinate(opts.y, 'addSlideMedia: y');\n const w = emuExtent(opts.w, 'addSlideMedia: w');\n const h = emuExtent(opts.h, 'addSlideMedia: h');\n\n // Resolve every input before touching the package so a rejected call leaves\n // no orphan part behind.\n const source = resolveSource(opts);\n const poster = opts.poster ?? defaultPoster();\n const posterFormat = opts.posterFormat ?? detectImageFormat(poster);\n if (posterFormat === null) {\n throw new Error(\n 'addSlideMedia: could not detect the poster image format. Pass options.posterFormat explicitly.',\n );\n }\n\n const pkg = slide[INTERNAL_PACKAGE];\n const slidePartName = slide[SLIDE_PART_NAME];\n const rels = pkg.getRels(slidePartName) ?? emptyRels();\n const usedIds = rels.items.map((r) => r.id);\n // Two clips on one slide that share a part (or URL) share its relationships.\n const relate = (type: string, target: string, targetMode: TargetMode): string => {\n const existing = rels.items.find(\n (r) => r.type === type && r.target === target && r.targetMode === targetMode,\n );\n if (existing) return existing.id;\n const id = nextRelId(usedIds);\n usedIds.push(id);\n rels.items.push({ id, type, target, targetMode });\n return id;\n };\n const relativeTarget = (name: PartName): string => `../media/${name.slice(MEDIA_DIR.length)}`;\n\n const kind = opts.kind === 'audio' ? 'audio' : 'video';\n const fileRelType = kind === 'audio' ? REL_TYPES.audio : REL_TYPES.video;\n let rLink: string;\n let rMedia: string | undefined;\n if ('url' in source) {\n rLink = relate(fileRelType, source.url, 'External');\n } else {\n const clipPart = internClipPart(pkg, source.extension, source.contentType, source.data);\n // PowerPoint orders the `media` rel before the `video` / `audio` one.\n rMedia = relate(REL_TYPES.media, relativeTarget(clipPart), 'Internal');\n rLink = relate(fileRelType, relativeTarget(clipPart), 'Internal');\n }\n\n const posterExtension = extensionForFormat(posterFormat);\n const posterContentType = contentTypeForFormat(posterFormat);\n const posterPart = nextMediaPartName(pkg, 'image', posterExtension);\n setOpcDefault(pkg, posterExtension, posterContentType);\n pkg.addPart(posterPart, posterContentType, poster);\n const rPoster = relate(REL_TYPES.image, relativeTarget(posterPart), 'Internal');\n pkg.setRels(slidePartName, rels);\n\n const id = nextShapeId(slide);\n const pic = buildMediaPicture({\n id,\n name: opts.name ?? `${DEFAULT_NAME_PREFIX[opts.kind]} ${id}`,\n kind,\n rLink,\n ...(rMedia !== undefined ? { rMedia } : {}),\n rEmbed: rPoster,\n x,\n y,\n w,\n h,\n });\n addMediaTimingNode(slide, kind, id);\n return appendAndReturnNewShape(slide, pic);\n};\n\n/**\n * Returns the clip behind a media picture, or `null` when the shape is not\n * one. Reads PowerPoint-, PptxGenJS- and python-pptx-authored media alike: the\n * embedded part is taken from `<p14:media r:embed>` when present and from the\n * DrawingML `r:link` otherwise; a relationship with an external target is\n * reported as `'online'`.\n */\nexport const getShapeMedia = (shape: SlideShapeData): ShapeMedia | null => {\n if (shape[SHAPE_SNAPSHOT].kind !== 'picture') return null;\n const ref = readPictureMediaRef(shape[SHAPE_ELEMENT]);\n if (ref === 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 === null) return null;\n const relsById = new Map(rels.items.map((r) => [r.id, r]));\n\n for (const rId of [ref.mediaRId, ref.fileRId]) {\n const rel = rId === null ? undefined : relsById.get(rId);\n if (rel === undefined) continue;\n if (rel.targetMode === 'External') return { kind: 'online', url: rel.target };\n const name = rel.target.startsWith('/')\n ? partName(rel.target)\n : resolveTarget(slide[SLIDE_PART_NAME], rel.target);\n const part = pkg.getPart(name);\n if (part) {\n return {\n kind: ref.kind,\n partName: part.name,\n contentType: part.contentType,\n bytes: part.data,\n };\n }\n }\n return null;\n};\n\n/** Every shape on the slide that `getShapeMedia` reports a clip for. */\nexport const findShapesWithMedia = (slide: SlideData): ReadonlyArray<SlideShapeData> =>\n slide[SLIDE_SHAPES].filter((shape) => getShapeMedia(shape) !== null);\n","// Public API surface. The only directory users are intended to import from.\n//\n// @office-kit/pptx 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 ChartDataTable,\n ChartDateAxis,\n ChartErrorBarAmount,\n ChartErrorBars,\n ChartSecondaryValueAxis,\n ChartGrouping,\n ChartKind,\n ChartDataLabelPosition,\n ChartManualLayout,\n ChartOfPie,\n ChartSeries,\n ChartSeriesAxis,\n ChartSpec,\n ChartTextStyle,\n ChartTimeUnit,\n ChartTrendline,\n ChartUpDownBars,\n ChartView3D,\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 AudioFormat,\n ShapeMedia,\n SlideMediaOptions,\n SlideMediaSource,\n VideoFormat,\n} 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 addSlideMedia,\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 findShapesWithMedia,\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 getParagraphEndFormat,\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 getShapeFillOpacity,\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 getShapeMedia,\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 getShapeStrokeOpacity,\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 resolveDrawingColorOpacity,\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 setShapeAdjustValues,\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 setShapeParagraphs,\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 setTableCellParagraphs,\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 {\n BulletStyle,\n ParagraphAlignment,\n ParagraphAlignmentToken,\n ParagraphSpec,\n RunSpec,\n TextFormat,\n} 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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A;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAGA,MAAa,cAAc;CACzB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAGA,MAAa,kBAAkB;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAGA,MAAa,sBAAsB;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAGA,MAAa,aAAa;CACxB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAGA,MAAa,UAAU;CAAC;CAAY;CAAa;AAAW;AAG5D,MAAa,mBAA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"}
|