pptx-ts 3.7.0 → 4.0.1
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/README.md +116 -269
- package/dist/autopage-odPz7zZO.js +536 -0
- package/dist/autopage-odPz7zZO.js.map +1 -0
- package/dist/binary-string-CKVAYI3M.js +24 -0
- package/dist/binary-string-CKVAYI3M.js.map +1 -0
- package/dist/body-insets-Dw_BeWD_.js +54 -0
- package/dist/body-insets-Dw_BeWD_.js.map +1 -0
- package/dist/browser.d.ts +29 -9
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +41 -14
- package/dist/browser.js.map +1 -1
- package/dist/clip-Bl01BPcN.d.ts +67 -0
- package/dist/clip-Bl01BPcN.d.ts.map +1 -0
- package/dist/diagnostics-D8ot4Ei7.d.ts +244 -0
- package/dist/diagnostics-D8ot4Ei7.d.ts.map +1 -0
- package/dist/embedded-fonts-DarT9aoa.d.ts +20 -0
- package/dist/embedded-fonts-DarT9aoa.d.ts.map +1 -0
- package/dist/entry-compose-DCnvBZz2.d.ts +1046 -0
- package/dist/entry-compose-DCnvBZz2.d.ts.map +1 -0
- package/dist/{enums-CvRYniUA.d.ts → enums-BUKTUB6V.d.ts} +21 -13
- package/dist/{enums-CvRYniUA.d.ts.map → enums-BUKTUB6V.d.ts.map} +1 -1
- package/dist/{errors-Bvln0H-7.js → errors-C4oENPcu.js} +92 -2
- package/dist/errors-C4oENPcu.js.map +1 -0
- package/dist/families.d.ts +260 -0
- package/dist/families.d.ts.map +1 -0
- package/dist/families.js +57 -0
- package/dist/families.js.map +1 -0
- package/dist/{fit-BKs0zxMI.js → fit-Cb7naFj6.js} +249 -167
- package/dist/fit-Cb7naFj6.js.map +1 -0
- package/dist/font-metrics-v5fn7s7e.d.ts +613 -0
- package/dist/font-metrics-v5fn7s7e.d.ts.map +1 -0
- package/dist/grid-DikTjFey.js +187 -0
- package/dist/grid-DikTjFey.js.map +1 -0
- package/dist/{html-dom-B0I0QSbU.js → html-dom-Iuog2wdK.js} +121 -91
- package/dist/html-dom-Iuog2wdK.js.map +1 -0
- package/dist/html.d.ts +6 -6
- package/dist/html.d.ts.map +1 -1
- package/dist/html.js +7 -6
- package/dist/html.js.map +1 -1
- package/dist/image-size-CvN2iCA4.js +1611 -0
- package/dist/image-size-CvN2iCA4.js.map +1 -0
- package/dist/index.d.ts +24 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -11
- package/dist/index.js.map +1 -1
- package/dist/inspect.d.ts +40 -31
- package/dist/inspect.d.ts.map +1 -1
- package/dist/inspect.js +40 -48
- package/dist/inspect.js.map +1 -1
- package/dist/math.d.ts +7 -5
- package/dist/math.d.ts.map +1 -1
- package/dist/math.js +16 -7
- package/dist/math.js.map +1 -1
- package/dist/measure.d.ts +12 -225
- package/dist/measure.d.ts.map +1 -1
- package/dist/measure.js +3 -3
- package/dist/node.d.ts +22 -8
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +27 -7
- package/dist/node.js.map +1 -1
- package/dist/notes-Dh12JAbn.js +3264 -0
- package/dist/notes-Dh12JAbn.js.map +1 -0
- package/dist/options-internal-WqgMf720.js +43 -0
- package/dist/options-internal-WqgMf720.js.map +1 -0
- package/dist/{package-CaOLXSNi.d.ts → package-J49Ck6S2.d.ts} +27 -12
- package/dist/package-J49Ck6S2.d.ts.map +1 -0
- package/dist/playbtn-CUqQdoDf.js +22 -0
- package/dist/playbtn-CUqQdoDf.js.map +1 -0
- package/dist/{slide-ZqAdVvHV.d.ts → pres-C6qgOFAa.d.ts} +1021 -1423
- package/dist/pres-C6qgOFAa.d.ts.map +1 -0
- package/dist/{presentation-DrJtj3-C.js → presentation-DGYlAWhl.js} +3208 -2727
- package/dist/presentation-DGYlAWhl.js.map +1 -0
- package/dist/{presentation-types-CDjScsev.d.ts → presentation-types-8jLQHI4M.d.ts} +1070 -683
- package/dist/presentation-types-8jLQHI4M.d.ts.map +1 -0
- package/dist/read.d.ts +9 -9
- package/dist/read.d.ts.map +1 -1
- package/dist/read.js +4 -4
- package/dist/script.d.ts +80 -66
- package/dist/script.d.ts.map +1 -1
- package/dist/script.js +2399 -1139
- package/dist/script.js.map +1 -1
- package/dist/{shapes-BemroU-z.js → shapes-re0KyQk_.js} +2807 -1609
- package/dist/shapes-re0KyQk_.js.map +1 -0
- package/dist/slide-Dx2ZeVZ6.d.ts +1256 -0
- package/dist/slide-Dx2ZeVZ6.d.ts.map +1 -0
- package/dist/slide-size-BalTjFuv.js +88 -0
- package/dist/slide-size-BalTjFuv.js.map +1 -0
- package/dist/{units-internal-Dg95w_YD.js → table-cell-margins-EVg0EwxT.js} +235 -273
- package/dist/table-cell-margins-EVg0EwxT.js.map +1 -0
- package/dist/table-dom-BTDP3lEP.js +21 -0
- package/dist/table-dom-BTDP3lEP.js.map +1 -0
- package/dist/text-anchor-CrYXAfUu.js +176 -0
- package/dist/text-anchor-CrYXAfUu.js.map +1 -0
- package/dist/text-sN64Otf_.js +3980 -0
- package/dist/text-sN64Otf_.js.map +1 -0
- package/dist/transition-speed-kUEWDWTx.js +14 -0
- package/dist/transition-speed-kUEWDWTx.js.map +1 -0
- package/dist/units-internal-XJlf-hOl.js +649 -0
- package/dist/units-internal-XJlf-hOl.js.map +1 -0
- package/dist/zip-C0leZZMj.d.ts +67 -0
- package/dist/zip-C0leZZMj.d.ts.map +1 -0
- package/dist/zip-CKd8ihcf.js +177 -0
- package/dist/zip-CKd8ihcf.js.map +1 -0
- package/dist/zip.d.ts +3 -68
- package/dist/zip.js +3 -163
- package/dist/zoom-DPUHh85d.js +8865 -0
- package/dist/zoom-DPUHh85d.js.map +1 -0
- package/package.json +106 -19
- package/skills/ts-pptx-upstream/SKILL.md +58 -57
- package/dist/autopage-DkjYZUFD.js +0 -423
- package/dist/autopage-DkjYZUFD.js.map +0 -1
- package/dist/diagnostics-DfBdDHre.d.ts +0 -829
- package/dist/diagnostics-DfBdDHre.d.ts.map +0 -1
- package/dist/errors-Bvln0H-7.js.map +0 -1
- package/dist/errors-PflMPWBn.d.ts +0 -182
- package/dist/errors-PflMPWBn.d.ts.map +0 -1
- package/dist/fit-BKs0zxMI.js.map +0 -1
- package/dist/html-dom-B0I0QSbU.js.map +0 -1
- package/dist/namespaces-BVnNu7sg.js +0 -666
- package/dist/namespaces-BVnNu7sg.js.map +0 -1
- package/dist/notes-CJFJaG6M.js +0 -1724
- package/dist/notes-CJFJaG6M.js.map +0 -1
- package/dist/package-CaOLXSNi.d.ts.map +0 -1
- package/dist/pres-BcBR3CSM.d.ts +0 -202
- package/dist/pres-BcBR3CSM.d.ts.map +0 -1
- package/dist/presentation-DrJtj3-C.js.map +0 -1
- package/dist/presentation-types-CDjScsev.d.ts.map +0 -1
- package/dist/shapes-BemroU-z.js.map +0 -1
- package/dist/slide-ZqAdVvHV.d.ts.map +0 -1
- package/dist/text-B8SLEaZx.js +0 -11327
- package/dist/text-B8SLEaZx.js.map +0 -1
- package/dist/units-1kRzYShk.js +0 -231
- package/dist/units-1kRzYShk.js.map +0 -1
- package/dist/units-internal-Dg95w_YD.js.map +0 -1
- package/dist/zip.d.ts.map +0 -1
- package/dist/zip.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shapes-BemroU-z.js","names":["#rPrAttr","#removeRPrAttr","#getOrAddRPr","#rPrAttrRaw","#setBoolRPrAttr","#rPr","#setSolidFill","#inheritedColorResolver","#inheritedResolver","#spacingPt","#emuAttrPt","#bulletStyle","#bulletImagePartName","#normAutofitPct","#setOffset","#setExtent","#setFill","#line","#setLine","#gradientStopsIn","#gradientFillIn","#effect","#readShadow","#applyEffectColor","#getOrAddBlip","#svgBlip","#applyFit","#connection","#chartGroups","#chart","#plotArea","#scaling","#seriesElements","#chart","#plotArea","#chartData","#root","#arms","#shapes","#prSet","#label","#root","#relationships","#drawingIndex","#cycleError","#docPrSetAttr","#relPart","#partForRelId","#docPrSetCache","#docPrSet","#drawing","#styleContext","#tblPrFlag","#setTcPrAttr","#getOrAddTcPr","#tcPr","#setFill","checkEnum","#styleFill","#fillSchemeColorOf","#graphicDataUri","#graphicData","#getOrAddGrpSpPr"],"sources":["../src/read/oxml/dom.ts","../src/read/opc/partnames.ts","../src/ooxml/sequence.ts","../src/read/oxml/fill.ts","../src/read/oxml/color-transform.ts","../src/read/oxml/preset-color.ts","../src/read/oxml/theme.ts","../src/read/oxml/slide-dom.ts","../src/read/oxml/placeholder-inherit.ts","../src/read/api/theme-context.ts","../src/read/api/gradient.ts","../src/read/api/picture-fill.ts","../src/read/api/pattern-fill.ts","../src/read/api/shapes/oxml.ts","../src/read/api/shapes/geometry.ts","../src/read/api/shapes/group-transform.ts","../src/read/api/text.ts","../src/read/api/shapes/base.ts","../src/read/api/shapes/autoshape.ts","../src/read/api/shapes/picture.ts","../src/read/api/shapes/connector.ts","../src/read/oxml/point-cache.ts","../src/read/api/chart.ts","../src/read/api/chartex.ts","../src/read/api/diagram.ts","../src/read/api/table-edit.ts","../src/read/api/table-structure.ts","../src/read/api/table-style-resolve.ts","../src/read/api/table.ts","../src/read/api/shapes/graphic-frame.ts","../src/read/api/shapes.ts"],"sourcesContent":["/**\n * Thin wrapper over `@xmldom/xmldom` — the only module in `src/read/` that\n * imports it directly.\n *\n * `@xmldom/xmldom` ships its own DOM types that are NOT assignable to the\n * lib.dom `Document`/`Element`; all of `src/read/` must import DOM types from\n * here, never from lib.dom and never from `@xmldom/xmldom` directly.\n */\nimport {\n\tDOMParser,\n\tMIME_TYPE,\n\tXMLSerializer,\n\tonErrorStopParsing,\n\ttype Document,\n\ttype Element,\n\ttype Node,\n} from '@xmldom/xmldom'\n\nexport type { Document, Element, Node } from '@xmldom/xmldom'\nimport { InternalError, InvalidOptionError } from '../../errors.js'\nimport { OOXML_NS } from '../../ooxml/namespaces.js'\n\n/** DOM `Node.ELEMENT_NODE` constant (xmldom does not expose it statically). */\nexport const ELEMENT_NODE = 1\n\n/** Parse an XML string strictly: any well-formedness error throws. */\nexport function parseXml(xml: string): Document {\n\treturn new DOMParser({ onError: onErrorStopParsing }).parseFromString(xml, MIME_TYPE.XML_TEXT)\n}\n\n/**\n * Serialize a Document to an XML string. Does not pretty-print or normalize\n * whitespace. The XML declaration is not part of the DOM; callers that need\n * it (see `Part.serialize`) must prepend it themselves.\n */\nexport function serializeXml(doc: Document): string {\n\treturn new XMLSerializer().serializeToString(doc)\n}\n\n// The registry itself lives in `ooxml/namespaces.ts`, which has no runtime imports, so the\n// write side can reach it without pulling `@xmldom/xmldom` into the write-only bundle. Re-exported\n// here so every existing `from '.../oxml/dom.js'` import keeps working. `qn` stays in this module:\n// it raises a diagnostic, and giving the import-free registry a dependency on `errors.ts` would\n// cost exactly what moving the table there bought.\nexport { OOXML_NS } from '../../ooxml/namespaces.js'\n\n/** Build a prefixed qname string, e.g. `qn('p', 'sld')` → `\"p:sld\"`. */\nexport function qn(prefix: string, local: string): string {\n\tif (!(prefix in OOXML_NS))\n\t\tthrow new InvalidOptionError('oxml/unknown-namespace-prefix', `Unknown OOXML namespace prefix: ${prefix}`)\n\treturn `${prefix}:${local}`\n}\n\nfunction splitQName(qname: string): { uri: string; local: string } {\n\tconst colon = qname.indexOf(':')\n\tif (colon < 0)\n\t\tthrow new InvalidOptionError('oxml/invalid-qname', `Expected a prefixed qname like \"p:sld\", got: ${qname}`)\n\tconst prefix = qname.slice(0, colon)\n\tconst uri = (OOXML_NS as Record<string, string>)[prefix]\n\tif (!uri) throw new InvalidOptionError('oxml/unknown-namespace-prefix', `Unknown OOXML namespace prefix: ${prefix}`)\n\treturn { uri, local: qname.slice(colon + 1) }\n}\n\n/**\n * Direct child elements of `parent` matching a qname. Matching is by\n * namespace URI + local name, so it is independent of the prefixes the\n * document happens to declare.\n */\nexport function getElements(parent: Node, qname: string): Element[] {\n\tconst { uri, local } = splitQName(qname)\n\tconst out: Element[] = []\n\tfor (let node = parent.firstChild; node; node = node.nextSibling) {\n\t\tif (node.nodeType === ELEMENT_NODE) {\n\t\t\tconst element = node as Element\n\t\t\tif (element.localName === local && element.namespaceURI === uri) out.push(element)\n\t\t}\n\t}\n\treturn out\n}\n\n/** All direct child elements in document order, regardless of qname. */\nexport function childElements(parent: Node): Element[] {\n\tconst out: Element[] = []\n\tfor (let node = parent.firstChild; node; node = node.nextSibling) {\n\t\tif (node.nodeType === ELEMENT_NODE) out.push(node as Element)\n\t}\n\treturn out\n}\n\n/**\n * All *descendant* elements of `root` matching a namespace + local name, snapshotted into an\n * array. Unlike {@link getElements} (direct children only) this searches the whole subtree, and\n * unlike the live `HTMLCollection` that `getElementsByTagNameNS` returns, the result does not\n * change as the caller mutates the tree — which is what makes it safe to iterate while replacing\n * the very elements being iterated.\n *\n * Note the DOM's own exclusion: `root` itself is never a candidate, only its descendants.\n */\nexport function descendantsByTag(root: Element, ns: string, local: string): Element[] {\n\tconst out: Element[] = []\n\tfor (const element of root.getElementsByTagNameNS(ns, local)) out.push(element)\n\treturn out\n}\n\n/** First direct child element matching a qname, or `null`. */\nexport function firstChild(parent: Node, qname: string): Element | null {\n\tconst { uri, local } = splitQName(qname)\n\tfor (let node = parent.firstChild; node; node = node.nextSibling) {\n\t\tif (node.nodeType === ELEMENT_NODE) {\n\t\t\tconst element = node as Element\n\t\t\tif (element.localName === local && element.namespaceURI === uri) return element\n\t\t}\n\t}\n\treturn null\n}\n\n/** First direct child *element* of `parent` (skipping text/comment nodes), or `null`. */\nexport function firstChildElement(parent: Node): Element | null {\n\tfor (let node = parent.firstChild; node; node = node.nextSibling) {\n\t\tif (node.nodeType === ELEMENT_NODE) return node as Element\n\t}\n\treturn null\n}\n\n/** First direct child element matching any of the given qnames, or `null`. */\nfunction firstChildMatchingAny(parent: Node, qnames: readonly string[]): Element | null {\n\tconst wanted = qnames.map(splitQName)\n\tfor (let node = parent.firstChild; node; node = node.nextSibling) {\n\t\tif (node.nodeType !== ELEMENT_NODE) continue\n\t\tconst element = node as Element\n\t\tif (wanted.some(({ uri, local }) => element.localName === local && element.namespaceURI === uri)) return element\n\t}\n\treturn null\n}\n\n// --- Mutation helpers (editing) --------------------------------------------\n//\n// `src/read/` mutates the live DOM in place; these are the only sanctioned way\n// to create elements, set attributes, and keep a parent's children in the\n// sequence OOXML requires. They never mark a part dirty — callers own that.\n\n/** Create a namespaced element from a prefixed qname (e.g. `createElement(doc, 'a:off')`). */\nexport function createElement(doc: Document, qname: string): Element {\n\tconst { uri } = splitQName(qname)\n\treturn doc.createElementNS(uri, qname)\n}\n\n/**\n * The owning document of a node. `Node.ownerDocument` is typed `Document | null`\n * (it is null only for a `Document` itself), but every element parsed from or\n * created within a package document has one; this encodes that invariant and\n * throws loudly if it is ever violated rather than deferring to a downstream NPE.\n */\nexport function ownerDocumentOf(node: Node): Document {\n\tconst doc = node.ownerDocument\n\tif (!doc) throw new InternalError('oxml/node-has-no-document', 'Node has no ownerDocument')\n\treturn doc\n}\n\n/**\n * Replace `oldNode` with `newNode` in `oldNode`'s parent. `Node.parentNode` is\n * typed `Node | null`; a node reached by walking a tree always has a parent, so\n * this captures the common replace-in-place pattern and fails clearly when the\n * node is unexpectedly detached.\n */\nexport function replaceInParent(oldNode: Node, newNode: Node): void {\n\tconst parent = oldNode.parentNode\n\tif (!parent) throw new InternalError('oxml/node-has-no-parent', 'Node has no parent to replace within')\n\tparent.replaceChild(newNode, oldNode)\n}\n\n/**\n * Set an attribute by qname. An unprefixed name (`sz`, `x`) sets a plain\n * attribute; a prefixed name (`r:id`) resolves the prefix to its namespace and\n * sets it via `setAttributeNS`. The reserved `xml:` prefix is handled by the\n * DOM itself.\n */\nexport function setAttr(element: Element, qname: string, value: string): void {\n\tconst colon = qname.indexOf(':')\n\tif (colon < 0 || qname.startsWith('xml:')) {\n\t\telement.setAttribute(qname, value)\n\t\treturn\n\t}\n\tconst { uri } = splitQName(qname)\n\telement.setAttributeNS(uri, qname, value)\n}\n\n/** Remove an attribute by qname; a no-op when the attribute is absent. */\nexport function removeAttr(element: Element, qname: string): void {\n\tconst colon = qname.indexOf(':')\n\tif (colon < 0 || qname.startsWith('xml:')) {\n\t\telement.removeAttribute(qname)\n\t\treturn\n\t}\n\tconst { uri, local } = splitQName(qname)\n\telement.removeAttributeNS(uri, local)\n}\n\n/**\n * Get the first child element matching `qname`, creating and inserting it when\n * absent. A newly created element is inserted before the first existing child\n * whose qname appears in `before` (the schema successors of the new element),\n * or appended when none are present — keeping the parent's children in the\n * sequence order OOXML mandates.\n */\nexport function getOrAddChild(parent: Element, qname: string, before: readonly string[] = []): Element {\n\tconst existing = firstChild(parent, qname)\n\tif (existing) return existing\n\tconst doc = parent.ownerDocument\n\tif (!doc)\n\t\tthrow new InternalError(\n\t\t\t'oxml/node-has-no-document',\n\t\t\t`Cannot create <${qname}>: parent element has no owner document`\n\t\t)\n\tconst child = createElement(doc, qname)\n\tconst successor = before.length ? firstChildMatchingAny(parent, before) : null\n\tparent.insertBefore(child, successor) // insertBefore(node, null) appends\n\treturn child\n}\n\n/**\n * Insert an already-built `node` into `parent` in document order: before the\n * first existing child whose qname is in `before` (the new node's schema\n * successors), or appended when none are present. Unlike {@link getOrAddChild}\n * this always inserts the given node (no get-or-create), so callers can place a\n * freshly-constructed subtree at the right position.\n */\nexport function insertInOrder(parent: Element, node: Node, before: readonly string[] = []): void {\n\tconst successor = before.length ? firstChildMatchingAny(parent, before) : null\n\tparent.insertBefore(node, successor)\n}\n\n/** Remove every direct child element matching any of the given qnames. */\nexport function removeChildrenByQName(parent: Element, qnames: readonly string[]): void {\n\tconst toRemove: Element[] = []\n\tfor (let node = parent.firstChild; node; node = node.nextSibling) {\n\t\tif (node.nodeType !== ELEMENT_NODE) continue\n\t\ttoRemove.push(node as Element)\n\t}\n\tconst wanted = qnames.map(splitQName)\n\tfor (const element of toRemove) {\n\t\tif (wanted.some(({ uri, local }) => element.localName === local && element.namespaceURI === uri)) {\n\t\t\tparent.removeChild(element)\n\t\t}\n\t}\n}\n\n/**\n * Read an attribute by qname. An unprefixed name (`sz`, `b`) reads the plain\n * attribute; a prefixed name (`r:id`, `r:embed`) resolves the prefix to its\n * namespace URI and reads via `getAttributeNS`, so it is robust to whatever\n * prefix the document declared. Returns `null` when the attribute is absent.\n */\nexport function attr(element: Element, qname: string): string | null {\n\tconst colon = qname.indexOf(':')\n\tif (colon < 0) return element.getAttribute(qname)\n\tconst { uri, local } = splitQName(qname)\n\treturn element.getAttributeNS(uri, local)\n}\n\n/** Parse an integer-valued OOXML attribute; `null`/empty/non-finite → `null`. */\nexport function intValue(value: string | null): number | null {\n\tif (value === null || value === '') return null\n\tconst number = Number(value)\n\treturn Number.isFinite(number) ? number : null\n}\n\n/** Parse an `xsd:boolean` OOXML attribute (`1`/`0`/`true`/`false`); else `null`. */\nexport function boolValue(value: string | null): boolean | null {\n\tif (value === '1' || value === 'true') return true\n\tif (value === '0' || value === 'false') return false\n\treturn null\n}\n\n/**\n * Escape a string for use inside a double-quoted XML attribute value.\n *\n * Tab/CR/LF become character references because XML 1.0 section 3.3.3 has a parser normalise the\n * literal characters to a single space before any consumer sees them. `'` needs no escaping between\n * double quotes. The write-side counterpart is `encodeXmlAttrValue` in `gen/utils.ts`.\n */\nexport function escapeXmlAttribute(value: string): string {\n\treturn value\n\t\t.replaceAll('&', '&')\n\t\t.replaceAll('<', '<')\n\t\t.replaceAll('>', '>')\n\t\t.replaceAll('\"', '"')\n\t\t.replaceAll('\\t', '	')\n\t\t.replaceAll('\\n', ' ')\n\t\t.replaceAll('\\r', ' ')\n}\n","/**\n * OPC partname helpers (ECMA-376 Part 2 pack-URI grammar).\n *\n * A partname is an absolute, `/`-separated path inside the package, e.g.\n * `/ppt/slides/slide1.xml`. Zip entry paths omit the leading slash.\n */\nimport { PackageReadError } from '../../errors.js'\nimport type { OpcPackage } from './package.js'\n\n/**\n * Resolve the single relationship of `type` owned by `partName` to its target partname, or\n * `null` when the part declares none. For the one-of-a-kind links in a deck's spine — a slide to\n * its layout, a layout to its master, a master to its theme — where a second relationship of the\n * same type would itself be malformed.\n *\n * The `OpcPackage` import is type-only, so this does not create a cycle with `package.ts` (which\n * imports this module at run time).\n */\nexport function resolveSingleRel(opc: OpcPackage, partName: string, type: string): string | null {\n\tconst rels = opc.relationshipsFor(partName)\n\tconst rel = rels.byType(type)[0]\n\treturn rel ? rels.resolveTarget(rel.id) : null\n}\n\nexport function zipPathToPartName(zipPath: string): string {\n\treturn zipPath.startsWith('/') ? zipPath : `/${zipPath}`\n}\n\nexport function partNameToZipPath(partName: string): string {\n\treturn partName.startsWith('/') ? partName.slice(1) : partName\n}\n\n/**\n * Lowercased extension without the dot, or `''` when the part has none.\n * Per OPC, the extension is everything after the last dot — so the leading\n * dot of `/_rels/.rels` still yields `rels`.\n */\nexport function partNameExtension(partName: string): string {\n\tconst lastSegment = partName.slice(partName.lastIndexOf('/') + 1)\n\tconst dot = lastSegment.lastIndexOf('.')\n\treturn dot < 0 ? '' : lastSegment.slice(dot + 1).toLowerCase()\n}\n\n/** Partname of the `.rels` part holding `sourcePartName`'s relationships ('/' = package). */\nexport function relsPartNameFor(sourcePartName: string): string {\n\tif (sourcePartName === '/') return '/_rels/.rels'\n\tconst dir = sourcePartName.slice(0, sourcePartName.lastIndexOf('/'))\n\tconst file = sourcePartName.slice(sourcePartName.lastIndexOf('/') + 1)\n\treturn `${dir}/_rels/${file}.rels`\n}\n\n/**\n * Build a relationship `Target` for `targetPartName` relative to its source\n * part's directory — the inverse of {@link resolveRelativePartName}. Both names\n * are absolute partnames. E.g. source `/ppt/slides/slide1.xml`, target\n * `/ppt/media/image1.png` → `../media/image1.png`.\n */\nexport function relativePartName(sourcePartName: string, targetPartName: string): string {\n\tconst from = sourcePartName.slice(1).split('/').slice(0, -1) // source directory segments\n\tconst to = targetPartName.slice(1).split('/') // target segments incl. filename\n\tlet common = 0\n\twhile (common < from.length && common < to.length - 1 && from[common] === to[common]) common++\n\tconst up = from.slice(common).map(() => '..')\n\tconst down = to.slice(common)\n\treturn [...up, ...down].join('/')\n}\n\n/**\n * Resolve a relationship target against its source part, per OPC pack-URI\n * resolution: relative targets resolve against the source part's directory.\n *\n * @param sourcePartName partname of the part owning the relationship ('/' for package-level)\n * @param target relationship Target attribute (relative like `../media/image1.png`, or absolute)\n */\nexport function resolveRelativePartName(sourcePartName: string, target: string): string {\n\tconst path = target.startsWith('/') ? target : sourcePartName.slice(0, sourcePartName.lastIndexOf('/') + 1) + target\n\tconst segments: string[] = []\n\tfor (const segment of path.split('/')) {\n\t\tif (segment === '' || segment === '.') continue\n\t\tif (segment === '..') {\n\t\t\tif (segments.length === 0)\n\t\t\t\tthrow new PackageReadError(\n\t\t\t\t\t'package/relationship-target-escapes-root',\n\t\t\t\t\t`Relationship target ${target} escapes the package root (source ${sourcePartName})`\n\t\t\t\t)\n\t\t\tsegments.pop()\n\t\t} else {\n\t\t\tsegments.push(segment)\n\t\t}\n\t}\n\treturn `/${segments.join('/')}`\n}\n","/**\n * Schema child-sequence order for the OOXML complexTypes both halves of the library insert into.\n *\n * **What these are for.** `getOrAddChild(parent, qname, before)` / `insertInOrder(parent, node,\n * before)` place a newly created child before the first sibling named in `before`. So `before`\n * must list exactly the children that legally *follow* the one being inserted. Get it wrong and\n * the part is schema-invalid — which PowerPoint reports as a corrupt file, not as a bad option,\n * so the failure surfaces far from its cause with no compile-time signal.\n *\n * **Why they are derived, not written out.** These successor lists used to be hand-maintained,\n * and the same four had drifted into two copies apiece (`read/api/shapes/oxml.ts` and\n * `read/oxml/theme.ts`), including one pair whose names were transposed (`SPPR_AFTER_XFRM` vs\n * `SPPR_XFRM_AFTER`) while the contents stayed identical. Declaring each complexType's sequence\n * **once** and slicing the successors out of it removes that class of bug outright: there is a\n * single ordering to be right about, and adding a child to a sequence updates every successor\n * list that follows it in one edit. This is the technique `TCPR_AFTER` already used for\n * `CT_TableCellProperties`; this module generalizes it.\n *\n * **Why this module is neither `gen/` nor `read/`.** Document order is a fact about the schema,\n * not about writing or reading it. `read/` inserts into a live DOM and `gen/` emits strings, but\n * both are bound by the same ECMA-376 sequence.\n */\n\n/**\n * One step of a schema sequence: a single element, or a choice group whose members are mutually\n * exclusive. A group is spelled as an array so {@link successorsOf} can treat every member as\n * occupying the same slot — the successors of `a:solidFill` are what follows the *whole*\n * `EG_FillProperties` group, not its sibling choices.\n */\ntype SequenceStep = string | readonly string[]\n\n/**\n * `EG_FillProperties` — the mutually exclusive fill choices, in schema order.\n * @see ECMA-376 Part 1 §20.1.8 (DrawingML fill group)\n */\nexport const FILL_CHOICES = ['a:noFill', 'a:solidFill', 'a:gradFill', 'a:blipFill', 'a:pattFill', 'a:grpFill'] as const\n\n/** `EG_EffectProperties` — the two mutually exclusive effect containers. */\nconst EFFECT_CHOICES = ['a:effectLst', 'a:effectDag'] as const\n\n/** `EG_Geometry` — the two mutually exclusive geometry choices. */\nconst GEOMETRY_CHOICES = ['a:custGeom', 'a:prstGeom'] as const\n\n/**\n * Everything that legally follows `member` in `sequence`, flattened.\n *\n * `member` may name a single element or any member of a choice group; either way the result\n * starts after the step it occupies, so a choice member never lists its own siblings. Throws on\n * an unknown name rather than returning `[]` — an empty successor list silently *appends*, which\n * is exactly the corruption these lists exist to prevent, so a typo must fail loudly and at\n * module-load time rather than produce a subtly out-of-order part at run time.\n */\nfunction successorsOf(sequence: readonly SequenceStep[], member: string): string[] {\n\tconst index = sequence.findIndex((step) => (typeof step === 'string' ? step === member : step.includes(member)))\n\tif (index < 0) throw new Error(`successorsOf: ${member} is not part of the given sequence`)\n\treturn sequence.slice(index + 1).flat()\n}\n\n/**\n * `CT_ShapeProperties` (`p:spPr`), in declaration order.\n * @see ECMA-376 Part 1 §20.1.2.2.35\n */\nconst SPPR_SEQUENCE: readonly SequenceStep[] = [\n\t'a:xfrm',\n\tGEOMETRY_CHOICES,\n\tFILL_CHOICES,\n\t'a:ln',\n\tEFFECT_CHOICES,\n\t'a:scene3d',\n\t'a:sp3d',\n\t'a:extLst',\n]\n\n/**\n * `CT_GroupShapeProperties` (`p:grpSpPr`), in declaration order. A group carries no `a:ln` and\n * no `a:sp3d` — which is exactly why it needs its own successor lists rather than borrowing the\n * shape ones.\n * @see ECMA-376 Part 1 §20.1.2.2.19\n */\nconst GRPSPPR_SEQUENCE: readonly SequenceStep[] = ['a:xfrm', FILL_CHOICES, EFFECT_CHOICES, 'a:scene3d', 'a:extLst']\n\n/**\n * `CT_LineProperties` (`a:ln`), in declaration order.\n * @see ECMA-376 Part 1 §20.1.2.2.24\n */\nconst LN_SEQUENCE: readonly SequenceStep[] = [\n\tFILL_CHOICES,\n\t['a:prstDash', 'a:custDash'],\n\t['a:round', 'a:bevel', 'a:miter'],\n\t'a:headEnd',\n\t'a:tailEnd',\n\t'a:extLst',\n]\n\n/**\n * `CT_TextCharacterProperties` (`a:rPr`/`a:defRPr`/`a:endParaRPr`), in declaration order.\n * @see ECMA-376 Part 1 §21.1.2.3.9\n */\nconst RPR_SEQUENCE: readonly SequenceStep[] = [\n\t'a:ln',\n\tFILL_CHOICES,\n\tEFFECT_CHOICES,\n\t'a:highlight',\n\t['a:uLnTx', 'a:uLn'],\n\t['a:uFillTx', 'a:uFill'],\n\t'a:latin',\n\t'a:ea',\n\t'a:cs',\n\t'a:sym',\n\t'a:hlinkClick',\n\t'a:hlinkMouseOver',\n\t'a:rtl',\n\t'a:extLst',\n]\n\n/**\n * `CT_TableCellProperties` (`a:tcPr`), in declaration order.\n * @see ECMA-376 Part 1 §21.1.3.17\n */\nexport const TCPR_SEQUENCE: readonly string[] = [\n\t'a:lnL',\n\t'a:lnR',\n\t'a:lnT',\n\t'a:lnB',\n\t'a:lnTlToBr',\n\t'a:lnBlToTr',\n\t'a:cell3D',\n\t...FILL_CHOICES,\n\t'a:headers',\n\t'a:extLst',\n]\n\n/**\n * For each `a:tcPr` child, the children that must follow it — i.e. what a new one is inserted\n * *before*. Every child gets an entry, so a caller can look one up by qname.\n */\nexport const TCPR_AFTER: Record<string, string[]> = Object.fromEntries(\n\tTCPR_SEQUENCE.map((qname, index) => [qname, TCPR_SEQUENCE.slice(index + 1)])\n)\n\n// --- p:spPr / p:grpSpPr ------------------------------------------------------\n\n/** Successors of `a:xfrm` inside `p:spPr`. */\nexport const SPPR_AFTER_XFRM = successorsOf(SPPR_SEQUENCE, 'a:xfrm')\n/** Successors of a fill choice inside `p:spPr`. */\nexport const SPPR_FILL_AFTER = successorsOf(SPPR_SEQUENCE, 'a:solidFill')\n/** Successors of `a:ln` inside `p:spPr`. */\nexport const SPPR_LN_AFTER = successorsOf(SPPR_SEQUENCE, 'a:ln')\n/** Successors of an effect container inside `p:spPr`. */\nexport const SPPR_EFFECT_AFTER = successorsOf(SPPR_SEQUENCE, 'a:effectLst')\n/** Successors of `a:scene3d` inside `p:spPr`. */\nexport const SPPR_SCENE3D_AFTER = successorsOf(SPPR_SEQUENCE, 'a:scene3d')\n/** Successors of `a:sp3d` inside `p:spPr`. */\nexport const SPPR_SP3D_AFTER = successorsOf(SPPR_SEQUENCE, 'a:sp3d')\n\n/** Successors of `a:xfrm` inside `p:grpSpPr`. */\nexport const GRPSPPR_AFTER_XFRM = successorsOf(GRPSPPR_SEQUENCE, 'a:xfrm')\n/** Successors of a fill choice inside `p:grpSpPr`. */\nexport const GRPSPPR_FILL_AFTER = successorsOf(GRPSPPR_SEQUENCE, 'a:solidFill')\n\n/**\n * Successors of `p:spPr` within `p:sp` (and before `p:style` within `p:pic` / `p:cxnSp`).\n * `p:blipFill` and the `p:nv*Pr` wrapper precede `p:spPr` and so are deliberately absent.\n */\nexport const SHAPE_AFTER_SPPR = ['p:style', 'p:txBody']\n\n// --- a:ln / a:rPr ------------------------------------------------------------\n\n/** Successors of a fill choice inside `a:ln`. */\nexport const LN_FILL_AFTER = successorsOf(LN_SEQUENCE, 'a:solidFill')\n/** Successors of a fill choice inside `a:rPr` (and `a:defRPr`/`a:endParaRPr`). */\nexport const RPR_FILL_AFTER = successorsOf(RPR_SEQUENCE, 'a:solidFill')\n","/**\n * Shared solid-fill read/mutation helpers for DrawingML colour-bearing parents:\n * a run's `a:rPr`, a shape's `p:spPr` / `p:grpSpPr`, and a line's `a:ln`.\n *\n * A parent carries at most one `EG_FillProperties` choice, so setting a solid\n * fill first clears any competing choice, then inserts `a:solidFill` in document\n * order. These helpers never mark a part dirty — callers own that.\n */\nimport { InvalidOptionError } from '../../errors.js'\nimport { FILL_CHOICES } from '../../ooxml/sequence.js'\nimport {\n\tattr,\n\tcreateElement,\n\tfirstChild,\n\tgetOrAddChild,\n\townerDocumentOf,\n\tremoveChildrenByQName,\n\tsetAttr,\n\ttype Element,\n} from './dom.js'\n\n/**\n * The mutually-exclusive fill choices (`EG_FillProperties`); a parent has at most one.\n * Declared in `src/ooxml/sequence.ts`, where the schema sequences that embed it live too.\n */\nexport { FILL_CHOICES }\n\n/** Normalize a 6-hex RGB string (optional leading `#`) to upper-case, or throw. */\nexport function normalizeHex(value: string): string {\n\tconst hex = value.startsWith('#') ? value.slice(1) : value\n\tif (!/^[0-9a-fA-F]{6}$/.test(hex))\n\t\tthrow new InvalidOptionError(\n\t\t\t'color/invalid-hex',\n\t\t\t`Expected a 6-digit hex RGB colour, got: ${JSON.stringify(value)}`\n\t\t)\n\treturn hex.toUpperCase()\n}\n\n/** The `@val` of a colour child (`qname`) under `parent/a:solidFill`, or `null`. */\nexport function solidFillColor(parent: Element | null, qname: string): string | null {\n\tconst fill = parent && firstChild(parent, 'a:solidFill')\n\tconst clr = fill && firstChild(fill, qname)\n\treturn clr ? attr(clr, 'val') : null\n}\n\n/**\n * Replace `parent`'s solid fill with a single colour element. Any competing fill\n * choice is dropped first, then `a:solidFill` is inserted before `afterOrder`\n * (its schema successors). To *clear* a fill instead, remove `a:solidFill`\n * directly via `removeChildrenByQName`, which leaves any other choice untouched.\n */\nexport function setSolidFill(parent: Element, afterOrder: string[], color: { qname: string; val: string }): void {\n\tremoveChildrenByQName(parent, FILL_CHOICES)\n\tconst fill = getOrAddChild(parent, 'a:solidFill', afterOrder)\n\tconst clr = createElement(ownerDocumentOf(parent), color.qname)\n\tsetAttr(clr, 'val', color.val)\n\tfill.appendChild(clr)\n}\n","/**\n * Apply DrawingML colour-transform modifiers (`lumMod`/`lumOff`/`shade`/`tint`/\n * `satMod`/`alpha`/…) to a base sRGB colour, returning the *effective* colour a\n * renderer would paint.\n *\n * The read model resolves a `schemeClr`/`srgbClr` reference to its **base** hex\n * and carries the transform children verbatim (so the `theme: 'preserve'` flatten\n * path can re-emit them byte-for-byte). This module is the missing step that\n * turns that base hex + transform list into the final rendered hex, so a consumer\n * never hand-computes a tint/shade again.\n *\n * Colour-space model (verified against PowerPoint output — see\n * `test/read/color-transform.test.js`): the working colour is kept canonical as\n * sRGB between transforms; each transform converts into the space its family\n * operates in, applies, and converts back to sRGB. Transforms apply in **document\n * order** (ECMA-376 §20.1.2.3).\n *\n * - `lumMod` / `lumOff` — luminance (L) in HSL: `L' = L·mod + off`. PowerPoint's\n * \"Lighter/Darker N%\" family.\n * - `satMod` / `satOff` — saturation (S) in HSL.\n * - `hueMod` / `hueOff` — hue (H) in HSL (`hueMod` scales, `hueOff` offsets by\n * degrees). Not exercised by any current source; implemented for completeness.\n * - `shade` — toward black in **linear** RGB: `c' = c·k`.\n * - `tint` — toward white in **linear** RGB: `c' = c·k + (1−k)`.\n * - `alpha` / `alphaMod` / `alphaOff` — opacity, returned alongside the hex\n * (never folded into RGB).\n * - `comp` / `inv` / `gray` / `gamma` / `invGamma` — pass-through for now (no\n * current source needs them; add when one does).\n *\n * All DrawingML percentage values are stored in thousandths of a percent\n * (`100%` → `100000`), so a modifier's fraction is `val / PERCENT_SCALE`.\n */\nimport { ANGLE_UNITS_PER_DEGREE, PERCENT_SCALE } from '../../units.js'\n\n/** A colour-transform modifier in its read-model form: tag local-name + raw `@val`. */\nexport interface ColorTransform {\n\tname: string\n\tvalue: string | null\n}\n\n/** The effective colour after applying transforms: final sRGB hex, plus opacity when an `alpha*` modifier was present. */\nexport interface EffectiveColor {\n\thex: string\n\talpha?: number\n}\n\n/**\n * DrawingML percentage → fraction, or `null` when unparseable.\n *\n * `a:ST_Percentage` is a *union* in the Transitional profile: the fixed-point integer form\n * Office writes (`100%` → `100000`) and a decimal string with a literal `%` (`-?[0-9]+(\\.[0-9]+)?%`),\n * which is the only form the Strict profile has. Both are read here — a reader that took only the\n * first dropped a schema-legal value silently, and the two are one `endsWith` apart.\n * @param value - the raw attribute value, or `null` when the attribute is absent\n */\nexport function parsePercent(value: string | null): number | null {\n\tif (value === null || value === '') return null\n\tif (value.endsWith('%')) {\n\t\tconst n = Number(value.slice(0, -1))\n\t\treturn Number.isFinite(n) ? n / 100 : null\n\t}\n\tconst n = Number(value)\n\treturn Number.isFinite(n) ? n / PERCENT_SCALE : null\n}\n\nconst clamp01 = (n: number): number => (n < 0 ? 0 : n > 1 ? 1 : n)\n\n/** Parse a 6-hex string (`RRGGBB`, optional `#`) into 0–1 sRGB channels, or `null`. */\nfunction parseHex(hex: string): { r: number; g: number; b: number } | null {\n\tconst h = hex.startsWith('#') ? hex.slice(1) : hex\n\tif (!/^[0-9a-fA-F]{6}$/.test(h)) return null\n\treturn {\n\t\tr: parseInt(h.slice(0, 2), 16) / 255,\n\t\tg: parseInt(h.slice(2, 4), 16) / 255,\n\t\tb: parseInt(h.slice(4, 6), 16) / 255,\n\t}\n}\n\n/** 0–1 sRGB channels → uppercase `RRGGBB`, rounding and clamping each channel. */\nfunction toHex(c: { r: number; g: number; b: number }): string {\n\tconst ch = (v: number): string =>\n\t\tMath.round(clamp01(v) * 255)\n\t\t\t.toString(16)\n\t\t\t.toUpperCase()\n\t\t\t.padStart(2, '0')\n\treturn `${ch(c.r)}${ch(c.g)}${ch(c.b)}`\n}\n\n/** sRGB channel (0–1) → linear-light (gamma decode). */\nfunction srgbToLinear(c: number): number {\n\treturn c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4)\n}\n\n/** Linear-light channel (0–1) → sRGB (gamma encode). */\nfunction linearToSrgb(c: number): number {\n\treturn c <= 0.0031308 ? c * 12.92 : 1.055 * Math.pow(c, 1 / 2.4) - 0.055\n}\n\n/** sRGB (0–1) → HSL with H in degrees [0,360), S/L in [0,1]. */\nfunction rgbToHsl(c: { r: number; g: number; b: number }): { h: number; s: number; l: number } {\n\tconst { r, g, b } = c\n\tconst max = Math.max(r, g, b)\n\tconst min = Math.min(r, g, b)\n\tconst l = (max + min) / 2\n\tconst d = max - min\n\tif (d === 0) return { h: 0, s: 0, l }\n\tconst s = d / (1 - Math.abs(2 * l - 1))\n\tlet h: number\n\tif (max === r) h = ((g - b) / d) % 6\n\telse if (max === g) h = (b - r) / d + 2\n\telse h = (r - g) / d + 4\n\th *= 60\n\tif (h < 0) h += 360\n\treturn { h, s, l }\n}\n\n/** HSL (H degrees, S/L 0–1) → sRGB (0–1). */\nfunction hslToRgb({ h, s, l }: { h: number; s: number; l: number }): { r: number; g: number; b: number } {\n\tconst c = (1 - Math.abs(2 * l - 1)) * s\n\tconst hp = (((h % 360) + 360) % 360) / 60\n\tconst x = c * (1 - Math.abs((hp % 2) - 1))\n\tconst [r, g, b] =\n\t\thp < 1 ? [c, x, 0] : hp < 2 ? [x, c, 0] : hp < 3 ? [0, c, x] : hp < 4 ? [0, x, c] : hp < 5 ? [x, 0, c] : [c, 0, x]\n\tconst m = l - c / 2\n\treturn { r: r + m, g: g + m, b: b + m }\n}\n\n/**\n * An `a:hslClr` triple → 6-hex sRGB, or `null` when any of the three is unparseable.\n *\n * The colour space is the one `lumMod`/`satMod` already work in — DrawingML's HSL is sRGB-HSL,\n * which is what the transform family below is verified against — so this shares that conversion\n * rather than introducing a second one. Units are the schema's: `@hue` is\n * `a:ST_PositiveFixedAngle`, i.e. 60,000ths of a degree, and `@sat`/`@lum` are `a:ST_Percentage`\n * (see {@link parsePercent}). Saturation and luminance are clamped to 0–1; hue wraps.\n * @param hue - raw `@hue`\n * @param sat - raw `@sat`\n * @param lum - raw `@lum`\n */\nexport function hslClrToHex(hue: string | null, sat: string | null, lum: string | null): string | null {\n\tconst h = hue === null || hue === '' ? null : Number(hue)\n\tconst s = parsePercent(sat)\n\tconst l = parsePercent(lum)\n\tif (h === null || !Number.isFinite(h) || s === null || l === null) return null\n\treturn toHex(hslToRgb({ h: h / ANGLE_UNITS_PER_DEGREE, s: clamp01(s), l: clamp01(l) }))\n}\n\n/**\n * Apply an ordered list of DrawingML colour transforms to a base sRGB hex,\n * returning the effective sRGB hex (and opacity, when an `alpha*` modifier set\n * it). Pure: no DOM, no theme lookup — the caller has already resolved the base\n * colour and extracted each modifier's `{ name, value }`.\n *\n * An unparseable base hex is returned unchanged (with no transforms applied); an\n * unparseable/`null` modifier value is skipped.\n */\nexport function applyColorTransforms(baseHex: string, transforms: ColorTransform[]): EffectiveColor {\n\tconst parsed = parseHex(baseHex)\n\tif (!parsed) return { hex: baseHex }\n\tlet rgb = parsed\n\tlet alpha: number | undefined\n\n\tfor (const { name, value } of transforms) {\n\t\tswitch (name) {\n\t\t\tcase 'lumMod':\n\t\t\tcase 'lumOff': {\n\t\t\t\tconst f = parsePercent(value)\n\t\t\t\tif (f === null) break\n\t\t\t\tconst hsl = rgbToHsl(rgb)\n\t\t\t\thsl.l = clamp01(name === 'lumMod' ? hsl.l * f : hsl.l + f)\n\t\t\t\trgb = hslToRgb(hsl)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'satMod':\n\t\t\tcase 'satOff': {\n\t\t\t\tconst f = parsePercent(value)\n\t\t\t\tif (f === null) break\n\t\t\t\tconst hsl = rgbToHsl(rgb)\n\t\t\t\thsl.s = clamp01(name === 'satMod' ? hsl.s * f : hsl.s + f)\n\t\t\t\trgb = hslToRgb(hsl)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'hueMod':\n\t\t\tcase 'hueOff': {\n\t\t\t\tconst hsl = rgbToHsl(rgb)\n\t\t\t\t// hueMod is a percentage scale; hueOff is an angle in 60000ths of a degree.\n\t\t\t\tif (name === 'hueMod') {\n\t\t\t\t\tconst f = parsePercent(value)\n\t\t\t\t\tif (f === null) break\n\t\t\t\t\thsl.h = (((hsl.h * f) % 360) + 360) % 360\n\t\t\t\t} else {\n\t\t\t\t\tconst n = value === null ? NaN : Number(value)\n\t\t\t\t\tif (!Number.isFinite(n)) break\n\t\t\t\t\thsl.h = (((hsl.h + n / ANGLE_UNITS_PER_DEGREE) % 360) + 360) % 360\n\t\t\t\t}\n\t\t\t\trgb = hslToRgb(hsl)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'shade':\n\t\t\tcase 'tint': {\n\t\t\t\tconst k = parsePercent(value)\n\t\t\t\tif (k === null) break\n\t\t\t\tconst lin = { r: srgbToLinear(rgb.r), g: srgbToLinear(rgb.g), b: srgbToLinear(rgb.b) }\n\t\t\t\tconst apply = (c: number): number => clamp01(name === 'shade' ? c * k : c * k + (1 - k))\n\t\t\t\trgb = { r: linearToSrgb(apply(lin.r)), g: linearToSrgb(apply(lin.g)), b: linearToSrgb(apply(lin.b)) }\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'alpha': {\n\t\t\t\tconst f = parsePercent(value)\n\t\t\t\tif (f !== null) alpha = clamp01(f)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'alphaMod': {\n\t\t\t\tconst f = parsePercent(value)\n\t\t\t\tif (f !== null) alpha = clamp01((alpha ?? 1) * f)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'alphaOff': {\n\t\t\t\tconst f = parsePercent(value)\n\t\t\t\tif (f !== null) alpha = clamp01((alpha ?? 1) + f)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\t// comp/inv/gray/gamma/invGamma: pass-through until a source needs them.\n\t\t\tdefault:\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\treturn alpha === undefined ? { hex: toHex(rgb) } : { hex: toHex(rgb), alpha }\n}\n","/**\n * The ECMA-376 preset colour table (`a:prstClr/@val` → literal RGB).\n *\n * `ST_PresetColorVal` (§20.1.10.47) enumerates 190 names, and the standard gives each one an\n * RGB triple. They are the HTML/CSS named colours: every value in the enumeration has the same\n * RGB here as the CSS colour of the same name, and the 190 names collapse to the 140 distinct\n * CSS names below through three mechanical spelling rules the enumeration adds on top —\n *\n * - abbreviated prefixes: `dk*`/`lt*`/`med*` alongside `dark*`/`light*`/`medium*`\n * (`dkSlateBlue` is `darkSlateBlue`), and only as a *prefix* — `medium…` is not `mediumium…`;\n * - both spellings of grey: `dimGrey` is `dimGray`;\n * - case: the enumeration is camelCase, the table below is folded to lower case.\n *\n * So the table holds one row per colour rather than one per spelling, and {@link presetColorHex}\n * normalizes a name into it. That is the difference between 140 hand-checked constants and 190,\n * and it makes the abbreviation rule something a reader can see rather than something spread\n * across fifty near-duplicate rows.\n *\n * This is spec data, not observed behaviour: the values come from the enumeration's own\n * documentation, and the table is asserted complete against the schema's 190-value list in\n * `test/read/preset-color.test.js` — a name the reader cannot resolve is a hole in the table,\n * and that test is what finds it.\n */\n\n/**\n * Canonical (lower-case, unabbreviated, `gray`-spelled) preset colour name → 6-hex RGB.\n * Reach it through {@link presetColorHex}, which does the normalizing.\n */\nconst PRESET_COLOR_HEX: Readonly<Record<string, string>> = {\n\taliceblue: 'F0F8FF',\n\tantiquewhite: 'FAEBD7',\n\taqua: '00FFFF',\n\taquamarine: '7FFFD4',\n\tazure: 'F0FFFF',\n\tbeige: 'F5F5DC',\n\tbisque: 'FFE4C4',\n\tblack: '000000',\n\tblanchedalmond: 'FFEBCD',\n\tblue: '0000FF',\n\tblueviolet: '8A2BE2',\n\tbrown: 'A52A2A',\n\tburlywood: 'DEB887',\n\tcadetblue: '5F9EA0',\n\tchartreuse: '7FFF00',\n\tchocolate: 'D2691E',\n\tcoral: 'FF7F50',\n\tcornflowerblue: '6495ED',\n\tcornsilk: 'FFF8DC',\n\tcrimson: 'DC143C',\n\tcyan: '00FFFF',\n\tdarkblue: '00008B',\n\tdarkcyan: '008B8B',\n\tdarkgoldenrod: 'B8860B',\n\tdarkgray: 'A9A9A9',\n\tdarkgreen: '006400',\n\tdarkkhaki: 'BDB76B',\n\tdarkmagenta: '8B008B',\n\tdarkolivegreen: '556B2F',\n\tdarkorange: 'FF8C00',\n\tdarkorchid: '9932CC',\n\tdarkred: '8B0000',\n\tdarksalmon: 'E9967A',\n\tdarkseagreen: '8FBC8F',\n\tdarkslateblue: '483D8B',\n\tdarkslategray: '2F4F4F',\n\tdarkturquoise: '00CED1',\n\tdarkviolet: '9400D3',\n\tdeeppink: 'FF1493',\n\tdeepskyblue: '00BFFF',\n\tdimgray: '696969',\n\tdodgerblue: '1E90FF',\n\tfirebrick: 'B22222',\n\tfloralwhite: 'FFFAF0',\n\tforestgreen: '228B22',\n\tfuchsia: 'FF00FF',\n\tgainsboro: 'DCDCDC',\n\tghostwhite: 'F8F8FF',\n\tgold: 'FFD700',\n\tgoldenrod: 'DAA520',\n\tgray: '808080',\n\tgreen: '008000',\n\tgreenyellow: 'ADFF2F',\n\thoneydew: 'F0FFF0',\n\thotpink: 'FF69B4',\n\tindianred: 'CD5C5C',\n\tindigo: '4B0082',\n\tivory: 'FFFFF0',\n\tkhaki: 'F0E68C',\n\tlavender: 'E6E6FA',\n\tlavenderblush: 'FFF0F5',\n\tlawngreen: '7CFC00',\n\tlemonchiffon: 'FFFACD',\n\tlightblue: 'ADD8E6',\n\tlightcoral: 'F08080',\n\tlightcyan: 'E0FFFF',\n\tlightgoldenrodyellow: 'FAFAD2',\n\tlightgray: 'D3D3D3',\n\tlightgreen: '90EE90',\n\tlightpink: 'FFB6C1',\n\tlightsalmon: 'FFA07A',\n\tlightseagreen: '20B2AA',\n\tlightskyblue: '87CEFA',\n\tlightslategray: '778899',\n\tlightsteelblue: 'B0C4DE',\n\tlightyellow: 'FFFFE0',\n\tlime: '00FF00',\n\tlimegreen: '32CD32',\n\tlinen: 'FAF0E6',\n\tmagenta: 'FF00FF',\n\tmaroon: '800000',\n\tmediumaquamarine: '66CDAA',\n\tmediumblue: '0000CD',\n\tmediumorchid: 'BA55D3',\n\tmediumpurple: '9370DB',\n\tmediumseagreen: '3CB371',\n\tmediumslateblue: '7B68EE',\n\tmediumspringgreen: '00FA9A',\n\tmediumturquoise: '48D1CC',\n\tmediumvioletred: 'C71585',\n\tmidnightblue: '191970',\n\tmintcream: 'F5FFFA',\n\tmistyrose: 'FFE4E1',\n\tmoccasin: 'FFE4B5',\n\tnavajowhite: 'FFDEAD',\n\tnavy: '000080',\n\toldlace: 'FDF5E6',\n\tolive: '808000',\n\tolivedrab: '6B8E23',\n\torange: 'FFA500',\n\torangered: 'FF4500',\n\torchid: 'DA70D6',\n\tpalegoldenrod: 'EEE8AA',\n\tpalegreen: '98FB98',\n\tpaleturquoise: 'AFEEEE',\n\tpalevioletred: 'DB7093',\n\tpapayawhip: 'FFEFD5',\n\tpeachpuff: 'FFDAB9',\n\tperu: 'CD853F',\n\tpink: 'FFC0CB',\n\tplum: 'DDA0DD',\n\tpowderblue: 'B0E0E6',\n\tpurple: '800080',\n\tred: 'FF0000',\n\trosybrown: 'BC8F8F',\n\troyalblue: '4169E1',\n\tsaddlebrown: '8B4513',\n\tsalmon: 'FA8072',\n\tsandybrown: 'F4A460',\n\tseagreen: '2E8B57',\n\tseashell: 'FFF5EE',\n\tsienna: 'A0522D',\n\tsilver: 'C0C0C0',\n\tskyblue: '87CEEB',\n\tslateblue: '6A5ACD',\n\tslategray: '708090',\n\tsnow: 'FFFAFA',\n\tspringgreen: '00FF7F',\n\tsteelblue: '4682B4',\n\ttan: 'D2B48C',\n\tteal: '008080',\n\tthistle: 'D8BFD8',\n\ttomato: 'FF6347',\n\tturquoise: '40E0D0',\n\tviolet: 'EE82EE',\n\twheat: 'F5DEB3',\n\twhite: 'FFFFFF',\n\twhitesmoke: 'F5F5F5',\n\tyellow: 'FFFF00',\n\tyellowgreen: '9ACD32',\n}\n\n/**\n * Resolve an `a:prstClr/@val` preset colour name to its 6-hex RGB, or `null` when the name is\n * not one of the 190 `ST_PresetColorVal` values.\n *\n * Lenient about case for the same reason the rest of the read path is: the input is a file\n * someone else wrote, and a producer that spelled `Black` has still said which colour it meant.\n * A name that is not in the enumeration at all resolves to `null` rather than to a guess, so the\n * caller reports \"no colour\" instead of painting an invented one.\n * @param name - the raw attribute value, or `null` when the attribute is absent\n */\nexport function presetColorHex(name: string | null): string | null {\n\tif (!name) return null\n\t// Case first, so the abbreviation rules below need one spelling each rather than two. The\n\t// `med` rule needs the guard and the other two do not: no canonical name starts with `dk` or\n\t// `lt`, but `medium*` does start with `med`, and expanding it again yields `mediumium*`.\n\tconst canonical = name\n\t\t.toLowerCase()\n\t\t.replace(/grey/g, 'gray')\n\t\t.replace(/^dk/, 'dark')\n\t\t.replace(/^lt/, 'light')\n\t\t.replace(/^med(?!ium)/, 'medium')\n\treturn PRESET_COLOR_HEX[canonical] ?? null\n}\n","/**\n * Theme colour resolution: turning a DrawingML colour reference or a style-matrix reference into\n * something literal.\n *\n * Two maps do the colour work. A scheme token (`accent1`, `bg1`, …) routes through the master's\n * `clrMap` to a `clrScheme` slot, whose literal RGB is the answer; child colour transforms\n * (`lumMod`/`shade`/`alpha`/…) are carried through untouched rather than computed, so a caller\n * that re-emits them renders identically. A style-matrix reference (`a:fillRef`/`a:lnRef`) instead\n * indexes the theme's `fmtScheme`, and resolves to a deep-cloned entry with its `phClr`\n * placeholder substituted.\n *\n * Everything here is **pure**: it reads a DOM and builds detached elements, and mutates nothing\n * the caller passes in. Two very different consumers depend on that:\n *\n * - the read model's colour getters, which resolve a colour to report it;\n * - the import-time flatten passes (`read/api/ops/flatten.ts`), which resolve the same colour in\n * order to *bake* it into a slide.\n *\n * They must agree, so they share this. The passes that write results back into a part live with\n * the other import operations, not here — this module deliberately has no mutating exports.\n * Placeholder-inheritance resolution (what a placeholder gets from its layout/master chain) is\n * its own concern and lives in `placeholder-inherit.ts`.\n */\nimport { hslClrToHex } from './color-transform.js'\nimport { presetColorHex } from './preset-color.js'\nimport {\n\tOOXML_NS,\n\tattr,\n\tchildElements,\n\tcreateElement,\n\tdescendantsByTag,\n\tfirstChild,\n\tfirstChildElement,\n\townerDocumentOf,\n\treplaceInParent,\n\tsetAttr,\n\ttype Element,\n} from './dom.js'\n\n/** The 12 `a:clrScheme` slot names, in schema order. */\nexport const SCHEME_SLOTS = [\n\t'dk1',\n\t'lt1',\n\t'dk2',\n\t'lt2',\n\t'accent1',\n\t'accent2',\n\t'accent3',\n\t'accent4',\n\t'accent5',\n\t'accent6',\n\t'hlink',\n\t'folHlink',\n]\n\n/** Scheme tokens that name a `clrScheme` slot directly, bypassing the `clrMap`. */\nconst DIRECT_SLOT_TOKENS = new Set(['dk1', 'lt1', 'dk2', 'lt2'])\n\n/**\n * The colour-resolution context: the two maps that turn a DrawingML colour\n * reference into a literal hex — the effective colour map (token → `clrScheme`\n * slot, honouring any slide `clrMapOvr`) and the resolved colour scheme (slot →\n * 6-hex RGB). Shared by the read-model colour getters and {@link ThemeContext}.\n */\nexport interface ColorContext {\n\tclrMap: Map<string, string>\n\tclrScheme: Map<string, string>\n}\n\n/**\n * The source theme subgraph a slide, notes slide, layout or master resolves against: the\n * {@link ColorContext} maps, the live `a:fmtScheme` for style-matrix resolution, and the roots\n * of the inheritance chain a placeholder reads through.\n *\n * Every root here is **read-only** — nothing in this module or in `placeholder-inherit.ts`\n * mutates one. The import-time flatten pass extends this with the one field it needs to write\n * from (see `FlattenContext` in `read/api/ops/flatten.ts`).\n */\nexport interface ThemeContext extends ColorContext {\n\tfmtScheme: Element | null\n\t/**\n\t * The source `slideLayout` root element, for resolving what a placeholder inherits.\n\t * `null`/absent disables the layout tier.\n\t */\n\tlayoutRoot?: Element | null\n\t/**\n\t * The source `slideMaster` root element, for resolving placeholder inheritance via its\n\t * placeholder `a:lstStyle` and `p:txStyles`.\n\t */\n\tmasterRoot?: Element | null\n\t/**\n\t * The theme's `a:fontScheme`, for resolving a `+mj-*`/`+mn-*` major/minor font\n\t * token (the placeholder-inherited typeface chain bottoms out in one) to a\n\t * literal face name via {@link resolveThemeFont}. `null`/absent leaves such a\n\t * token unresolved.\n\t */\n\tfontScheme?: Element | null\n\t/**\n\t * The notesMaster's `p:notesStyle` (a `CT_TextListStyle`), for resolving the\n\t * character properties a *notes-body* run inherits when it sets none of its own.\n\t * Only ever set on a notes context (see `resolveNotesColorContext`); on a slide\n\t * context it is absent, so the slide placeholder chain (layout/master\n\t * `a:lstStyle` → `p:txStyles`) is unaffected. It is the notes analogue of the\n\t * master `p:txStyles` category style, keyed by level rather than placeholder\n\t * type. Read-only — never mutated.\n\t */\n\tnotesStyle?: Element | null\n\t/**\n\t * The presentation's `p:defaultTextStyle` (a `CT_TextListStyle` from\n\t * `presentation.xml`), keyed by level — PowerPoint's lowest-priority text\n\t * fallback, applying to any run (placeholder or not) that resolves nothing\n\t * above it. Only ever set on a *slide* context (see `resolveSlideColorContext`);\n\t * absent on notes/master/layout contexts, so their chains are unaffected.\n\t * Read-only — never mutated.\n\t */\n\tdefaultTextStyle?: Element | null\n}\n\n/** Parse an `a:clrScheme` into slot → 6-hex RGB, reading `srgbClr`/`sysClr`. */\nexport function parseClrScheme(clrScheme: Element | null): Map<string, string> {\n\tconst out = new Map<string, string>()\n\tif (!clrScheme) return out\n\tfor (const slot of SCHEME_SLOTS) {\n\t\tconst slotEl = firstChild(clrScheme, `a:${slot}`)\n\t\tconst hex = slotEl && colorElementHex(firstChildElement(slotEl))\n\t\tif (hex) out.set(slot, hex)\n\t}\n\treturn out\n}\n\n/**\n * Parse the `bg1`/`tx1`/`bg2`/`tx2`/`accent*`/`hlink`/`folHlink` attributes of an\n * `a:clrMap` (or `a:overrideClrMapping`) into token → slot.\n */\nexport function parseClrMap(clrMap: Element | null): Map<string, string> {\n\tconst out = new Map<string, string>()\n\tif (!clrMap) return out\n\tfor (const token of [\n\t\t'bg1',\n\t\t'tx1',\n\t\t'bg2',\n\t\t'tx2',\n\t\t'accent1',\n\t\t'accent2',\n\t\t'accent3',\n\t\t'accent4',\n\t\t'accent5',\n\t\t'accent6',\n\t\t'hlink',\n\t\t'folHlink',\n\t]) {\n\t\tconst slot = attr(clrMap, token)\n\t\tif (slot) out.set(token, slot)\n\t}\n\treturn out\n}\n\n/** Resolve a scheme token (`accent1`, `bg1`, `dk1`, …) to a 6-hex RGB, or `null`. */\nexport function resolveSchemeToken(token: string, ctx: ColorContext): string | null {\n\tif (token === 'phClr') return null\n\tconst slot = DIRECT_SLOT_TOKENS.has(token) ? token : ctx.clrMap.get(token)\n\treturn slot ? (ctx.clrScheme.get(slot) ?? null) : null\n}\n\n/** Whether `el` is a DrawingML element with the given local name. */\nexport function isA(el: Element | null, local: string): boolean {\n\treturn !!el && el.namespaceURI === OOXML_NS.a && el.localName === local\n}\n\n/**\n * The literal RGB of a *non-scheme* colour element, or `null` for one that needs the theme\n * (`a:schemeClr`) or that this reader does not resolve.\n *\n * Four of `a:EG_ColorChoice`'s six members land here. `a:scrgbClr` is the one deliberately left\n * out: its channels are percentages of a colour space the schema does not pin down, so whether\n * `50%` is linear-light or sRGB-encoded decides the answer and neither the schema nor the\n * transform work in `color-transform.ts` settles it. Guessing would produce a colour that is\n * wrong by a gamma curve and says nothing about it, which is worse than reporting no colour.\n * Closing it needs a render oracle — a deck with an `a:scrgbClr` fill authored in PowerPoint\n * and the painted pixel read back — not a reading of the schema.\n */\nfunction colorElementHex(color: Element | null): string | null {\n\tif (!color) return null\n\tif (isA(color, 'srgbClr')) return attr(color, 'val')\n\tif (isA(color, 'sysClr')) return attr(color, 'lastClr') ?? attr(color, 'val')\n\tif (isA(color, 'prstClr')) return presetColorHex(attr(color, 'val'))\n\tif (isA(color, 'hslClr')) return hslClrToHex(attr(color, 'hue'), attr(color, 'sat'), attr(color, 'lum'))\n\treturn null\n}\n\n/** A colour reference resolved to a literal base RGB plus its transform children. */\nexport interface ResolvedColor {\n\thex: string\n\ttransforms: Element[]\n}\n\n/**\n * Resolve a DrawingML colour element to a literal `{ hex, transforms }`, routing\n * `a:schemeClr` through the context. Returns `null` when the base cannot be made\n * literal (unmapped token, or a colour model we do not flatten).\n *\n * Five of `a:EG_ColorChoice`'s six members resolve: `a:srgbClr`, `a:sysClr`, `a:schemeClr`,\n * `a:prstClr` (through the {@link presetColorHex} table) and `a:hslClr`. `a:scrgbClr` does not —\n * see {@link colorElementHex} for why that one is a `null` rather than a guess.\n */\nexport function resolveColor(color: Element | null, ctx: ColorContext): ResolvedColor | null {\n\tif (!color) return null\n\tconst transforms = childElements(color)\n\tif (isA(color, 'srgbClr')) {\n\t\tconst hex = attr(color, 'val')\n\t\treturn hex ? { hex, transforms } : null\n\t}\n\tif (isA(color, 'sysClr') || isA(color, 'prstClr') || isA(color, 'hslClr')) {\n\t\tconst hex = colorElementHex(color)\n\t\treturn hex ? { hex, transforms } : null\n\t}\n\tif (isA(color, 'schemeClr')) {\n\t\tconst token = attr(color, 'val')\n\t\tconst hex = token ? resolveSchemeToken(token, ctx) : null\n\t\treturn hex ? { hex, transforms } : null\n\t}\n\treturn null\n}\n\n/**\n * Resolve a `+mj-*`/`+mn-*` major/minor font token against a theme `a:fontScheme`\n * to a literal typeface name. A non-token `typeface` (an already-literal face) is\n * returned verbatim. `null` when `typeface` is absent, or when a token cannot be\n * resolved (no `fontScheme`, or the indexed major/minor script slot is empty).\n * The script suffix selects the scheme child: `lt`→`a:latin`, `ea`→`a:ea`,\n * `cs`→`a:cs`.\n */\nexport function resolveThemeFont(typeface: string | null, fontScheme: Element | null): string | null {\n\tif (!typeface) return null\n\tconst match = /^\\+(mj|mn)-(lt|ea|cs)$/.exec(typeface)\n\tif (!match) return typeface\n\tif (!fontScheme) return null\n\tconst font = firstChild(fontScheme, match[1] === 'mj' ? 'a:majorFont' : 'a:minorFont')\n\tconst childName = match[2] === 'lt' ? 'a:latin' : match[2] === 'ea' ? 'a:ea' : 'a:cs'\n\tconst child = font && firstChild(font, childName)\n\tconst resolved = child && attr(child, 'typeface')\n\treturn resolved || null\n}\n\n/** Replace every `phClr` under `el` with the ref colour (ref transforms first, then the `phClr`'s own). */\nexport function substitutePhClr(el: Element, ref: ResolvedColor): void {\n\tconst doc = ownerDocumentOf(el)\n\tfor (const phClr of descendantsByTag(el, OOXML_NS.a, 'schemeClr')) {\n\t\tif (attr(phClr, 'val') !== 'phClr') continue\n\t\tconst srgb = createElement(doc, 'a:srgbClr')\n\t\tsetAttr(srgb, 'val', ref.hex)\n\t\tfor (const t of ref.transforms) srgb.appendChild(t.cloneNode(true))\n\t\twhile (phClr.firstChild) srgb.appendChild(phClr.firstChild)\n\t\treplaceInParent(phClr, srgb)\n\t}\n}\n\n/** The `idx`-th entry (1-based) of a `fmtScheme` style list, deep-cloned, or `null`. */\nexport function fmtEntry(ctx: ThemeContext, listName: string, idx: number): Element | null {\n\tconst list = ctx.fmtScheme && firstChild(ctx.fmtScheme, listName)\n\tif (!list || idx < 1) return null\n\tconst entry = childElements(list)[idx - 1]\n\treturn entry ? (entry.cloneNode(true) as Element) : null\n}\n\n/**\n * Build the explicit fill element a `p:style` `a:fillRef` resolves to — the indexed\n * `fmtScheme` `fillStyleLst`/`bgFillStyleLst` entry (deep-cloned) with its `phClr`\n * replaced by the ref's resolved colour. Pure: mutates neither the ref nor the\n * theme. `null` when the ref is absent, `idx` is 0/unset, or the entry or its\n * colour cannot be resolved. Shared by the flatten path and the read-model\n * `resolveStyleFillColor` getter so both see the same fill.\n */\nexport function styleRefFill(fillRef: Element | null, ctx: ThemeContext): Element | null {\n\tif (!fillRef) return null\n\tconst idx = intAttr(fillRef, 'idx')\n\tif (idx === null || idx <= 0) return null\n\t// idx >= 1000 selects bgFillStyleLst (offset by 1000); otherwise fillStyleLst.\n\tconst fill = idx >= 1000 ? fmtEntry(ctx, 'a:bgFillStyleLst', idx - 1000) : fmtEntry(ctx, 'a:fillStyleLst', idx)\n\tconst ref = resolveColor(firstChildElement(fillRef), ctx)\n\tif (!fill || !ref) return null\n\tsubstitutePhClr(fill, ref)\n\treturn fill\n}\n\n/**\n * Build the explicit `a:ln` element a `p:style` `a:lnRef` resolves to — the indexed\n * `fmtScheme` `lnStyleLst` entry (deep-cloned) with its `phClr` replaced by the\n * ref's resolved colour. Pure; the line/read counterpart of {@link styleRefFill}.\n */\nexport function styleRefLine(lnRef: Element | null, ctx: ThemeContext): Element | null {\n\tif (!lnRef) return null\n\tconst idx = intAttr(lnRef, 'idx')\n\tif (idx === null || idx <= 0) return null\n\tconst ln = fmtEntry(ctx, 'a:lnStyleLst', idx)\n\tconst ref = resolveColor(firstChildElement(lnRef), ctx)\n\tif (!ln || !ref) return null\n\tsubstitutePhClr(ln, ref)\n\treturn ln\n}\n\n/** Read an integer attribute; `null`/empty/non-finite → `null`. */\nexport function intAttr(el: Element, name: string): number | null {\n\tconst value = attr(el, name)\n\tif (value === null || value === '') return null\n\tconst n = Number(value)\n\treturn Number.isFinite(n) ? n : null\n}\n","/**\n * Small DOM navigation helpers shared by the read-model slide/import paths.\n *\n * Each is a pure query over a live OOXML node -- no package state, no mutation -- which\n * is why they sit outside `Presentation` rather than as private methods on it.\n */\n\nimport type { Part } from '../opc/part.js'\nimport { ELEMENT_NODE, OOXML_NS, attr, firstChild, firstChildElement, type Element } from './dom.js'\n\n/**\n * The `p:cSld` of a slide/layout/master/notes part root.\n *\n * Takes a nullable root and returns a nullable element so a caller can chain from\n * `part?.dom.documentElement` without a guard of its own — which is what a dozen callers were\n * writing by hand, each in a slightly different spelling (`root && …`, `root ? … : null`).\n */\nexport function cSldOf(root: Element | null | undefined): Element | null {\n\treturn root ? firstChild(root, 'p:cSld') : null\n}\n\n/** The `p:spTree` of a slide/layout/master/notes part root, through its `p:cSld`. */\nexport function spTreeOf(root: Element | null | undefined): Element | null {\n\tconst cSld = cSldOf(root)\n\treturn cSld ? firstChild(cSld, 'p:spTree') : null\n}\n\n/**\n * The `p:nvPr` of a shape, whichever `*nvPr` wrapper its kind uses.\n *\n * The wrapper's name varies by shape kind — `p:nvSpPr` on a `p:sp`, `p:nvPicPr` on a `p:pic`,\n * `p:nvGraphicFramePr`, `p:nvCxnSpPr`, `p:nvGrpSpPr` — but it is always the shape's first child\n * element, and `p:nvPr` is always inside it. Taking the first child element rather than naming\n * the wrapper is what lets one helper serve every kind; the callers that named `p:nvSpPr`\n * silently returned null on a picture.\n */\nexport function nvPrOf(shape: Element): Element | null {\n\tconst nv = firstChildElement(shape)\n\treturn nv ? firstChild(nv, 'p:nvPr') : null\n}\n\n/** The `p:cSld@name` of a slide/layout/master part (`''` when absent). */\nexport function cSldName(part: Part | undefined): string {\n\tconst cSld = cSldOf(part?.dom.documentElement)\n\treturn (cSld && attr(cSld, 'name')) ?? ''\n}\n\n/** Whether `el` is a `p:spTree`'s own group properties (`p:nvGrpSpPr`/`p:grpSpPr`), not a shape. */\nfunction isSpTreeProperty(el: Element): boolean {\n\treturn el.namespaceURI === OOXML_NS.p && (el.localName === 'nvGrpSpPr' || el.localName === 'grpSpPr')\n}\n\n/** Whether a `p:spTree` child is a placeholder shape (its `*nvPr` carries a `p:ph`). */\nfunction isPlaceholderShape(shape: Element): boolean {\n\tconst nvPr = nvPrOf(shape)\n\treturn !!(nvPr && firstChild(nvPr, 'p:ph'))\n}\n\n/** The decorative shapes on a layout/master `p:spTree`: every shape child except placeholders. */\nexport function carriedDecorations(root: Element | null): Element[] {\n\tconst spTree = spTreeOf(root)\n\tif (!spTree) return []\n\tconst out: Element[] = []\n\tfor (let node = spTree.firstChild; node; node = node.nextSibling) {\n\t\tif (node.nodeType !== ELEMENT_NODE) continue\n\t\tconst el = node as Element\n\t\tif (isSpTreeProperty(el) || isPlaceholderShape(el)) continue\n\t\tout.push(el)\n\t}\n\treturn out\n}\n\n/**\n * The `n`-th shape child of a `p:spTree` in document (z-)order, skipping the\n * tree's own `nvGrpSpPr`/`grpSpPr` and any trailing `p:extLst`. Returns `null`\n * when `n` is past the last shape (the caller then appends).\n */\nexport function nthShapeChild(spTree: Element, n: number): Element | null {\n\tlet i = 0\n\tfor (let node = spTree.firstChild; node; node = node.nextSibling) {\n\t\tif (node.nodeType !== ELEMENT_NODE) continue\n\t\tconst el = node as Element\n\t\tif (isSpTreeProperty(el)) continue\n\t\tif (el.namespaceURI === OOXML_NS.p && el.localName === 'extLst') continue\n\t\tif (i === n) return el\n\t\ti++\n\t}\n\treturn null\n}\n\n/** The first shape child of a `p:spTree` (skipping `nvGrpSpPr`/`grpSpPr`), or `null`. */\nexport function firstShapeChild(spTree: Element): Element | null {\n\tfor (let node = spTree.firstChild; node; node = node.nextSibling) {\n\t\tif (node.nodeType !== ELEMENT_NODE) continue\n\t\tconst el = node as Element\n\t\tif (!isSpTreeProperty(el)) return el\n\t}\n\treturn null\n}\n\n/** Collect `node` and all its descendant elements (document order) into `out`. */\nexport function collectElements(node: Element, out: Element[]): void {\n\tout.push(node)\n\tfor (let child = node.firstChild; child; child = child.nextSibling) {\n\t\tif (child.nodeType === ELEMENT_NODE) collectElements(child as Element, out)\n\t}\n}\n","/**\n * Resolving what a placeholder shape *inherits* from its source layout/master chain.\n *\n * A placeholder that sets none of its own colour, size, geometry, anchor or list style takes\n * each from a chain: the layout placeholder's `a:lstStyle`, then the master placeholder's, then\n * the master's `p:txStyles` category style (and, on a notes context, the notesMaster\n * `p:notesStyle`). Every function here answers \"what would this placeholder get?\" — none of them\n * writes anything.\n *\n * **Two callers, one answer.** The read model's getters (`Run.resolvedColor`,\n * `TextFrame.resolvedAnchor`, the font getters) and the import-time flatten passes\n * (`read/api/ops/flatten.ts`, which bakes the inherited values onto a slide so they survive a\n * rebind to a different master) both ask the same questions. They must not answer them\n * differently: if the getter and the bake disagreed, a caller would see one colour before export\n * and another in the file. Sharing this module is what makes that structurally impossible.\n *\n * This module is pure — mutation lives in the flatten pass, which is also why it sits in\n * `read/oxml/` (substrate) rather than `read/api/ops/`.\n */\n\nimport { attr, descendantsByTag, firstChild, firstChildElement, OOXML_NS, type Element } from './dom.js'\nimport { FILL_CHOICES } from './fill.js'\nimport { resolveColor, type ResolvedColor, type ThemeContext } from './theme.js'\nimport { nvPrOf } from './slide-dom.js'\n\n/** The master `p:txStyles` style element name for a placeholder category. */\nconst TX_STYLE_NAME: Record<'title' | 'body' | 'other', string> = {\n\ttitle: 'p:titleStyle',\n\tbody: 'p:bodyStyle',\n\tother: 'p:otherStyle',\n}\n\n/** The ordered children of a `CT_TextListStyle` (`a:lstStyle` / a `p:txStyles` style). */\nexport const LST_STYLE_LEVELS = [\n\t'a:defPPr',\n\t'a:lvl1pPr',\n\t'a:lvl2pPr',\n\t'a:lvl3pPr',\n\t'a:lvl4pPr',\n\t'a:lvl5pPr',\n\t'a:lvl6pPr',\n\t'a:lvl7pPr',\n\t'a:lvl8pPr',\n\t'a:lvl9pPr',\n]\n\n/** Inheritable run properties baked under `preserve`: size and weight/slant (not typeface). */\nexport const RUN_PROP_NAMES = ['sz', 'b', 'i'] as const\nexport type RunProps = Record<(typeof RUN_PROP_NAMES)[number], string | null>\n\n/** The `p:ph` element of a shape (`p:sp/p:nvSpPr/p:nvPr/p:ph`), or `null`. */\nexport function placeholderOf(sp: Element): Element | null {\n\tconst nvPr = nvPrOf(sp)\n\treturn nvPr ? firstChild(nvPr, 'p:ph') : null\n}\n\n/**\n * The master text-style *category* a placeholder type resolves against\n * (absent ⇒ `obj` ⇒ body). This is a `p:txStyles` selector — it picks\n * `p:titleStyle`/`p:bodyStyle`/`p:otherStyle` (see {@link TX_STYLE_NAME}) and\n * deliberately collapses `dt`/`ftr`/`sldNum`/`hdr` (and anything else) into\n * `'other'`. It is **not** a placeholder *identity* predicate: it must not be\n * used to decide which source placeholder a slide placeholder inherits geometry\n * from, or the footer trio become mutually interchangeable — use the exact\n * `type` match in {@link findPlaceholder} for that.\n */\nexport function phCategory(type: string | null): 'title' | 'body' | 'other' {\n\tif (type === 'title' || type === 'ctrTitle') return 'title'\n\tif (type === null || type === 'body' || type === 'subTitle' || type === 'obj') return 'body'\n\treturn 'other'\n}\n\n/**\n * Placeholder types of which a layout/master holds at most one, and whose\n * identity is their `type` alone: `dt`, `ftr`, `sldNum`, `hdr`. A slide\n * placeholder of one of these types must inherit **only** from a source\n * placeholder of the *same type* — never via `idx` or the txStyles *category*,\n * both of which lump the whole trio together and would let `sldNum` borrow the\n * footer's box (and vice versa).\n */\nconst SINGLETON_PH = new Set(['dt', 'ftr', 'sldNum', 'hdr'])\n\n/**\n * The placeholder shape in `root` (a layout/master) that the given slide\n * placeholder inherits from.\n *\n * A singleton-type slide placeholder (`dt`/`ftr`/`sldNum`/`hdr`) matches only an\n * exact same-`type` source placeholder — PowerPoint gives the trio different\n * `idx` on the layout (dt=10/ftr=11/sldNum=12) than the master (dt=2/ftr=3/\n * sldNum=4), so an `idx`- or category-based fallback would silently pick the\n * wrong member of the trio. Every other type prefers a same-`idx` placeholder of\n * the same category, then any same-`idx`, then any same-category, and never\n * lands on a singleton placeholder. Returns `null` when nothing matches.\n */\nexport function findPlaceholder(root: Element, slideType: string | null, slideIdx: string): Element | null {\n\tif (slideType && SINGLETON_PH.has(slideType)) {\n\t\tfor (const sp of descendantsByTag(root, OOXML_NS.p, 'sp')) {\n\t\t\tconst ph = placeholderOf(sp)\n\t\t\tif (ph && attr(ph, 'type') === slideType) return sp\n\t\t}\n\t\treturn null\n\t}\n\tconst cat = phCategory(slideType)\n\tlet idxMatch: Element | null = null\n\tlet catMatch: Element | null = null\n\tfor (const sp of descendantsByTag(root, OOXML_NS.p, 'sp')) {\n\t\tconst ph = placeholderOf(sp)\n\t\tif (!ph) continue\n\t\tconst type = attr(ph, 'type')\n\t\tif (type && SINGLETON_PH.has(type)) continue // a non-singleton must never inherit from the footer trio\n\t\tconst i = attr(ph, 'idx') ?? '0'\n\t\tconst sameCat = phCategory(type) === cat\n\t\tif (i === slideIdx && sameCat) return sp\n\t\tif (i === slideIdx && !idxMatch) idxMatch = sp\n\t\tif (sameCat && !catMatch) catMatch = sp\n\t}\n\treturn idxMatch ?? catMatch\n}\n\n/** The `a:lstStyle` of a placeholder shape's `p:txBody`, or `null`. */\nfunction placeholderLstStyle(sp: Element): Element | null {\n\tconst txBody = firstChild(sp, 'p:txBody')\n\treturn txBody ? firstChild(txBody, 'a:lstStyle') : null\n}\n\n/**\n * The `a:defRPr` for `level` (0-based) in a `CT_TextListStyle` (`a:lstStyle` or a\n * `p:txStyles` style): the level-specific `a:lvlNpPr/a:defRPr`, else the\n * `a:defPPr/a:defRPr` fallback. The shared root for colour and size resolution.\n */\nexport function lstStyleLevelDefRPr(listStyle: Element | null, level: number): Element | null {\n\tif (!listStyle) return null\n\tconst lvl = firstChild(listStyle, `a:lvl${level + 1}pPr`) ?? firstChild(listStyle, 'a:defPPr')\n\treturn lvl ? firstChild(lvl, 'a:defRPr') : null\n}\n\n/** The `a:solidFill` of a level's `a:defRPr`, or `null` when none is defined there. */\nexport function lstStyleLevelFill(listStyle: Element | null, level: number): Element | null {\n\tconst defRPr = lstStyleLevelDefRPr(listStyle, level)\n\treturn defRPr ? firstChild(defRPr, 'a:solidFill') : null\n}\n\n/**\n * The source style tiers a placeholder resolves against, most specific first: the layout\n * placeholder's `a:lstStyle`, the master placeholder's, then the master `p:txStyles` category\n * style — and, on a notes context only, the notesMaster `p:notesStyle`.\n *\n * The one place the chain is spelled out. `placeholderInherited*` differ only in what they pull\n * from each tier, so they all walk this.\n */\nfunction styleTiers(type: string | null, idx: string, ctx: ThemeContext): Element[] {\n\tconst tiers: (Element | null)[] = []\n\tif (ctx.layoutRoot) {\n\t\tconst layoutPh = findPlaceholder(ctx.layoutRoot, type, idx)\n\t\ttiers.push(layoutPh && placeholderLstStyle(layoutPh))\n\t}\n\tif (ctx.masterRoot) {\n\t\tconst masterPh = findPlaceholder(ctx.masterRoot, type, idx)\n\t\ttiers.push(masterPh && placeholderLstStyle(masterPh))\n\t\tconst txStyles = firstChild(ctx.masterRoot, 'p:txStyles')\n\t\ttiers.push(txStyles && firstChild(txStyles, TX_STYLE_NAME[phCategory(type)]))\n\t}\n\t// Notes body runs inherit from the notesMaster's `p:notesStyle` (keyed by level, not\n\t// placeholder type); it is the bottom tier of the notes chain — see the field note on\n\t// `ThemeContext.notesStyle`. Never set on a slide context.\n\tif (ctx.notesStyle) tiers.push(ctx.notesStyle)\n\treturn tiers.filter((t): t is Element => t !== null)\n}\n\n/**\n * The colour *element* a placeholder run inherits from the source style chain. Returns the\n * first tier's colour element that resolves against `ctx` (the `a:srgbClr`/`a:schemeClr`/…\n * inside its `a:solidFill`), or `null` when nothing in the chain defines a resolvable colour.\n * The read-model `Run.resolvedColor` getter feeds this element to `resolveColorElement` for the\n * `effectiveHex`; the flatten path resolves it directly via {@link placeholderInheritedColor}.\n */\nexport function placeholderInheritedFill(\n\ttype: string | null,\n\tidx: string,\n\tlevel: number,\n\tctx: ThemeContext\n): Element | null {\n\tfor (const tier of styleTiers(type, idx, ctx)) {\n\t\tconst fill = lstStyleLevelFill(tier, level)\n\t\tconst colorEl = fill && firstChildElement(fill)\n\t\tif (colorEl && resolveColor(colorEl, ctx)) return colorEl\n\t}\n\treturn null\n}\n\n/**\n * The level `a:defRPr` elements a placeholder inherits from the source style chain, in\n * resolution order. Tiers with no `a:defRPr` for `level` are dropped. The shared root for\n * inherited run *size* and *typeface* resolution (the size/face sibling of\n * {@link placeholderInheritedFill}), read directly by the flatten path and the read-model font\n * getters.\n */\nexport function placeholderInheritedDefRPrs(\n\ttype: string | null,\n\tidx: string,\n\tlevel: number,\n\tctx: ThemeContext\n): Element[] {\n\treturn styleTiers(type, idx, ctx)\n\t\t.map((tier) => lstStyleLevelDefRPr(tier, level))\n\t\t.filter((t): t is Element => t !== null)\n}\n\n/**\n * The source list-style tiers a placeholder inherits paragraph formatting from, most specific\n * first. The paragraph-level sibling of {@link placeholderInheritedDefRPrs} — it hands back the\n * tier elements whole rather than pulling one level's properties out of each.\n *\n * The notes tier is included for consistency with the rest of the chain, though it cannot arise\n * in practice: the only caller is the list-style bake in `flattenShape`, which runs on slide and\n * shape contexts, and `ctx.notesStyle` is set only on a notes context.\n */\nexport function placeholderInheritedListStyles(type: string | null, idx: string, ctx: ThemeContext): Element[] {\n\treturn styleTiers(type, idx, ctx)\n}\n\n/**\n * The colour a placeholder run inherits from the source style chain, resolved to a\n * literal `{ hex, transforms }`. Thin wrapper over {@link placeholderInheritedFill}\n * for the flatten path, which re-emits the transforms verbatim. Returns `null`\n * when nothing in the chain defines a resolvable colour (the run then re-binds to\n * the destination).\n */\nexport function placeholderInheritedColor(\n\ttype: string | null,\n\tidx: string,\n\tlevel: number,\n\tctx: ThemeContext\n): ResolvedColor | null {\n\tconst colorEl = placeholderInheritedFill(type, idx, level, ctx)\n\treturn colorEl ? resolveColor(colorEl, ctx) : null\n}\n\n/**\n * The run size/weight a placeholder run inherits from the source style chain, per list level.\n * Each of `sz`/`b`/`i` is taken from the first tier that defines it (properties resolve\n * independently). Returns `null` when no tier defines any of them.\n */\nexport function placeholderInheritedRunProps(\n\ttype: string | null,\n\tidx: string,\n\tlevel: number,\n\tctx: ThemeContext\n): RunProps | null {\n\tconst tiers = placeholderInheritedDefRPrs(type, idx, level, ctx)\n\tconst props = {} as RunProps\n\tlet any = false\n\tfor (const name of RUN_PROP_NAMES) {\n\t\tlet value: string | null = null\n\t\tfor (const tier of tiers) {\n\t\t\tvalue = attr(tier, name)\n\t\t\tif (value != null) break\n\t\t}\n\t\tprops[name] = value\n\t\tif (value != null) any = true\n\t}\n\treturn any ? props : null\n}\n\n/**\n * The `a:xfrm` a placeholder inherits from the source layout, then master,\n * tagged with which tier it came from — `null` when neither defines one. The\n * read-model `resolveInheritedFrame` (`theme-context.ts`) sibling of\n * {@link placeholderInheritedAnchor}; also the bake source for the flatten pass'\n * `resolvePlaceholderGeometry`.\n */\nexport function placeholderInheritedXfrm(\n\ttype: string | null,\n\tidx: string,\n\tctx: ThemeContext\n): { xfrm: Element; source: 'layout' | 'master' } | null {\n\tfor (const [root, source] of [\n\t\t[ctx.layoutRoot, 'layout'],\n\t\t[ctx.masterRoot, 'master'],\n\t] as const) {\n\t\tif (!root) continue\n\t\tconst ph = findPlaceholder(root, type, idx)\n\t\tconst spPr = ph && firstChild(ph, 'p:spPr')\n\t\tconst xfrm = spPr && firstChild(spPr, 'a:xfrm')\n\t\tif (xfrm) return { xfrm, source }\n\t}\n\treturn null\n}\n\n/**\n * The vertical anchor (`a:bodyPr/@anchor`) a placeholder inherits from the source\n * layout, then master, or `null`. Resolves per-attribute: the first tier whose\n * placeholder `a:bodyPr` actually sets `@anchor` wins, so a layout `a:bodyPr`\n * present but without `@anchor` does not mask the master's. The read-model\n * `TextFrame.resolvedAnchor` sibling of {@link placeholderInheritedXfrm}.\n */\nexport function placeholderInheritedAnchor(type: string | null, idx: string, ctx: ThemeContext): string | null {\n\tfor (const root of [ctx.layoutRoot, ctx.masterRoot]) {\n\t\tif (!root) continue\n\t\tconst ph = findPlaceholder(root, type, idx)\n\t\tconst txBody = ph && firstChild(ph, 'p:txBody')\n\t\tconst bodyPr = txBody && firstChild(txBody, 'a:bodyPr')\n\t\tconst anchor = bodyPr && attr(bodyPr, 'anchor')\n\t\tif (anchor) return anchor\n\t}\n\treturn null\n}\n\n/** Whether the *slide itself* already fixes this run's colour (so a rebind cannot change it). */\nexport function slideDefinesColor(run: Element, pPr: Element | null, slideLst: Element | null, level: number): boolean {\n\tconst rPr = firstChild(run, 'a:rPr')\n\tif (rPr && FILL_CHOICES.some((q) => firstChild(rPr, q))) return true\n\tconst defRPr = pPr && firstChild(pPr, 'a:defRPr')\n\tif (defRPr && firstChild(defRPr, 'a:solidFill')) return true\n\treturn !!lstStyleLevelFill(slideLst, level)\n}\n\n/** Whether the *slide itself* already fixes a run property (so a rebind cannot change it). */\nexport function slideDefinesProp(\n\tname: string,\n\trun: Element,\n\tpPr: Element | null,\n\tslideLst: Element | null,\n\tlevel: number\n): boolean {\n\tconst rPr = firstChild(run, 'a:rPr')\n\tif (rPr && attr(rPr, name) != null) return true\n\tconst defRPr = pPr && firstChild(pPr, 'a:defRPr')\n\tif (defRPr && attr(defRPr, name) != null) return true\n\tconst slideDefRPr = lstStyleLevelDefRPr(slideLst, level)\n\treturn !!(slideDefRPr && attr(slideDefRPr, name) != null)\n}\n","/**\n * Resolve a slide's theme colour context: the slide → slideLayout → slideMaster\n * → theme walk that turns a `schemeClr` token into a literal hex, plus the\n * `a:solidFill` helper the read-model colour getters share.\n *\n * One implementation backs two callers — the read-model getters\n * (`Slide.themeContext` → `Shape.resolvedFill` / `Run.resolvedColor`) and the\n * `importSlide` `theme: 'preserve'` flatten path, which layers its `fmtScheme` /\n * background needs on top of {@link resolveSlideThemeParts} — so a token resolves\n * identically whether it is read or baked.\n */\nimport { applyColorTransforms, type ColorTransform } from '../oxml/color-transform.js'\nimport { attr, boolValue, firstChild, firstChildElement, intValue, type Element } from '../oxml/dom.js'\nimport {\n\tparseClrMap,\n\tparseClrScheme,\n\tresolveColor,\n\tresolveThemeFont,\n\tstyleRefFill,\n\tstyleRefLine,\n\ttype ColorContext,\n\ttype ThemeContext,\n} from '../oxml/theme.js'\nimport {\n\tlstStyleLevelDefRPr,\n\tlstStyleLevelFill,\n\tplaceholderInheritedAnchor,\n\tplaceholderInheritedDefRPrs,\n\tplaceholderInheritedFill,\n\tplaceholderInheritedXfrm,\n} from '../oxml/placeholder-inherit.js'\nimport type { OpcPackage } from '../opc/package.js'\nimport { resolveSingleRel } from '../opc/partnames.js'\nimport {\n\tNOTES_MASTER_REL,\n\tOFFICE_DOCUMENT_REL,\n\tSLIDE_LAYOUT_REL,\n\tSLIDE_MASTER_REL,\n\tTHEME_REL,\n} from '../../ooxml/rel-types.js'\n\n/** The resolved theme subgraph a slide depends on, plus its parsed colour maps. */\ninterface SlideThemeParts extends ColorContext {\n\tslideRoot: Element | null\n\tlayoutPartName: string | null\n\tmasterPartName: string | null\n\tlayoutRoot: Element | null\n\tmasterRoot: Element | null\n\t/**\n\t * Partname of the theme part the chain bottoms out in, or `null`. Callers that\n\t * materialize a fill out of the theme (a `p:bgRef`'s `fmtScheme` entry) need it to\n\t * resolve that fill's relationship ids against the *theme's* rels.\n\t */\n\tthemePartName: string | null\n\t/** The theme's `a:themeElements`, for callers that also need `a:fmtScheme`. */\n\tthemeElements: Element | null\n}\n\n/** The document element of a part, or `null` when the partname/part is absent. */\nfunction documentElement(opc: OpcPackage, partName: string | null): Element | null {\n\treturn partName ? (opc.part(partName)?.dom.documentElement ?? null) : null\n}\n\n/**\n * The presentation's `p:defaultTextStyle` (`presentation.xml`, reached via the\n * package `officeDocument` relationship), or `null` when absent. This is\n * PowerPoint's lowest-priority text fallback — the bottom tier of a slide run's\n * size/colour/face/bold resolution (see `ThemeContext.defaultTextStyle`).\n */\nfunction presentationDefaultTextStyle(opc: OpcPackage): Element | null {\n\tconst root = documentElement(opc, resolveSingleRel(opc, '/', OFFICE_DOCUMENT_REL))\n\treturn root ? firstChild(root, 'p:defaultTextStyle') : null\n}\n\n/**\n * Walk slide → slideLayout → slideMaster → theme, returning the resolved part\n * roots plus the parsed colour map (`clrMap`, honouring the slide's `clrMapOvr`)\n * and colour scheme (`clrScheme`). A missing link degrades to `null` roots and\n * empty maps rather than throwing.\n */\nexport function resolveSlideThemeParts(opc: OpcPackage, slidePartName: string): SlideThemeParts {\n\tconst layoutPartName = resolveSingleRel(opc, slidePartName, SLIDE_LAYOUT_REL)\n\tconst masterPartName = layoutPartName ? resolveSingleRel(opc, layoutPartName, SLIDE_MASTER_REL) : null\n\tconst themePartName = masterPartName ? resolveSingleRel(opc, masterPartName, THEME_REL) : null\n\n\tconst slideRoot = documentElement(opc, slidePartName)\n\tconst layoutRoot = documentElement(opc, layoutPartName)\n\tconst masterRoot = documentElement(opc, masterPartName)\n\tconst themeRoot = documentElement(opc, themePartName)\n\n\t// A slide's clrMapOvr/overrideClrMapping (if present) wins over the master map.\n\tconst masterClrMap = masterRoot ? firstChild(masterRoot, 'p:clrMap') : null\n\tconst clrMapOvr = slideRoot ? firstChild(slideRoot, 'p:clrMapOvr') : null\n\tconst override = clrMapOvr ? firstChild(clrMapOvr, 'a:overrideClrMapping') : null\n\tconst themeElements = themeRoot ? firstChild(themeRoot, 'a:themeElements') : null\n\n\treturn {\n\t\tslideRoot,\n\t\tlayoutPartName,\n\t\tmasterPartName,\n\t\tlayoutRoot,\n\t\tmasterRoot,\n\t\tthemePartName,\n\t\tthemeElements,\n\t\tclrMap: parseClrMap(override ?? masterClrMap),\n\t\tclrScheme: parseClrScheme(themeElements ? firstChild(themeElements, 'a:clrScheme') : null),\n\t}\n}\n\n/**\n * The colour context a slide's read-model getters resolve against: the\n * {@link ColorContext} maps plus the theme's `a:fmtScheme` (so a colour delivered\n * through a shape's `p:style` `fillRef`/`lnRef` can be resolved like the\n * `theme: 'preserve'` flatten path does). The `fmtScheme` is `null` when the\n * slide's theme is missing.\n */\nexport function resolveSlideColorContext(opc: OpcPackage, slidePartName: string): ThemeContext {\n\tconst { clrMap, clrScheme, themeElements, layoutRoot, masterRoot } = resolveSlideThemeParts(opc, slidePartName)\n\treturn {\n\t\tclrMap,\n\t\tclrScheme,\n\t\tfmtScheme: themeElements ? firstChild(themeElements, 'a:fmtScheme') : null,\n\t\t// The fontScheme lets the run font getters resolve a +mj-*/+mn-* token (the\n\t\t// placeholder-inherited typeface chain bottoms out in one) to a literal face.\n\t\tfontScheme: themeElements ? firstChild(themeElements, 'a:fontScheme') : null,\n\t\t// layout/master roots let the read-model run-colour/size/face getters resolve\n\t\t// a placeholder-inherited value the same way the flatten path does.\n\t\tlayoutRoot,\n\t\tmasterRoot,\n\t\t// The presentation's default text style — the lowest-priority tier a slide run\n\t\t// (placeholder or not) falls back to when it resolves nothing above it.\n\t\tdefaultTextStyle: presentationDefaultTextStyle(opc),\n\t}\n}\n\n/**\n * The colour context a slide's *speaker-notes* getters resolve against. A notes\n * slide inherits its theme through its notesMaster (`notesSlideN.xml.rels`\n * carries the `notesMaster` relationship), which in turn points at the notes\n * theme (`theme2.xml`). Walk notesSlide → notesMaster → theme, taking `clrMap`\n * from the notesMaster's own `p:clrMap` and `clrScheme`/`fontScheme` from that\n * theme, so a notes run's own `schemeClr` fill resolves to a literal hex the same\n * way a slide run's does (backing `Run.resolvedColor` on {@link Slide.notesTextFrame}).\n *\n * Notes runs inherit character properties from the notesMaster's `p:notesStyle`,\n * not from a slide layout/master placeholder chain, so `layoutRoot`/`masterRoot`\n * are deliberately left absent. Instead the notesMaster's `p:notesStyle` is carried\n * as `notesStyle`, and the notes body `TextFrame` is built with a placeholder\n * context (see {@link import('./notes.js').NotesPlaceholder}) so a body run's\n * effective size/face/bold (and inherited colour) resolve against it — the notes\n * analogue of the slide placeholder chain. The maps are empty when the\n * notesMaster/theme chain is incomplete, in which case tokens stay unresolved.\n */\nexport function resolveNotesColorContext(opc: OpcPackage, notesPartName: string): ThemeContext {\n\tconst masterPartName = resolveSingleRel(opc, notesPartName, NOTES_MASTER_REL)\n\tconst themePartName = masterPartName ? resolveSingleRel(opc, masterPartName, THEME_REL) : null\n\tconst masterRoot = documentElement(opc, masterPartName)\n\tconst themeRoot = documentElement(opc, themePartName)\n\tconst themeElements = themeRoot ? firstChild(themeRoot, 'a:themeElements') : null\n\treturn {\n\t\tclrMap: parseClrMap(masterRoot ? firstChild(masterRoot, 'p:clrMap') : null),\n\t\tclrScheme: parseClrScheme(themeElements ? firstChild(themeElements, 'a:clrScheme') : null),\n\t\tfmtScheme: themeElements ? firstChild(themeElements, 'a:fmtScheme') : null,\n\t\t// The fontScheme lets a notes run resolve a +mj-*/+mn-* theme-font token to a\n\t\t// literal face; the writer's notesStyle uses +mn-lt, so an authored notes run\n\t\t// that omits its own face resolves through here.\n\t\tfontScheme: themeElements ? firstChild(themeElements, 'a:fontScheme') : null,\n\t\t// The notesMaster's text style — the tier a notes-body run's inherited\n\t\t// size/face/bold/colour resolves against (see `ThemeContext.notesStyle`).\n\t\tnotesStyle: masterRoot ? firstChild(masterRoot, 'p:notesStyle') : null,\n\t}\n}\n\n/**\n * The colour context a *slide master*'s own getters resolve against: the master's\n * `p:clrMap` plus its theme's `clrScheme`/`fmtScheme`/`fontScheme` (walked master →\n * theme). Backs the text frames of {@link import('./chrome.js').SlideMaster}'s\n * placeholders — a master placeholder run's own `schemeClr` resolves to a literal\n * hex the same way a slide run's does. `masterRoot` is carried so an inherited\n * placeholder value still resolves against the master's own text styles. The maps\n * are empty when the theme is missing, in which case tokens stay unresolved.\n */\nexport function resolveMasterColorContext(opc: OpcPackage, masterPartName: string): ThemeContext {\n\tconst themePartName = resolveSingleRel(opc, masterPartName, THEME_REL)\n\tconst masterRoot = documentElement(opc, masterPartName)\n\tconst themeElements = themeElementsOf(opc, themePartName)\n\treturn {\n\t\tclrMap: parseClrMap(masterRoot ? firstChild(masterRoot, 'p:clrMap') : null),\n\t\tclrScheme: parseClrScheme(themeElements ? firstChild(themeElements, 'a:clrScheme') : null),\n\t\tfmtScheme: themeElements ? firstChild(themeElements, 'a:fmtScheme') : null,\n\t\tfontScheme: themeElements ? firstChild(themeElements, 'a:fontScheme') : null,\n\t\tmasterRoot,\n\t}\n}\n\n/**\n * The colour context a *slide layout*'s own getters resolve against: walk layout →\n * master → theme. The effective `clrMap` is the layout's own\n * `p:clrMapOvr/a:overrideClrMapping` when present (rare), else the master's\n * `p:clrMap` — the layout's usual `a:masterClrMapping` means \"inherit the master\n * map\". `clrScheme`/`fmtScheme`/`fontScheme` come from the master's theme, and both\n * `layoutRoot`/`masterRoot` are carried for inherited-placeholder resolution. Backs\n * the text frames of {@link import('./chrome.js').SlideLayout}'s placeholders.\n */\nexport function resolveLayoutColorContext(opc: OpcPackage, layoutPartName: string): ThemeContext {\n\tconst masterPartName = resolveSingleRel(opc, layoutPartName, SLIDE_MASTER_REL)\n\tconst themePartName = masterPartName ? resolveSingleRel(opc, masterPartName, THEME_REL) : null\n\tconst layoutRoot = documentElement(opc, layoutPartName)\n\tconst masterRoot = documentElement(opc, masterPartName)\n\tconst themeElements = themeElementsOf(opc, themePartName)\n\tconst masterClrMap = masterRoot ? firstChild(masterRoot, 'p:clrMap') : null\n\tconst clrMapOvr = layoutRoot ? firstChild(layoutRoot, 'p:clrMapOvr') : null\n\tconst override = clrMapOvr ? firstChild(clrMapOvr, 'a:overrideClrMapping') : null\n\treturn {\n\t\tclrMap: parseClrMap(override ?? masterClrMap),\n\t\tclrScheme: parseClrScheme(themeElements ? firstChild(themeElements, 'a:clrScheme') : null),\n\t\tfmtScheme: themeElements ? firstChild(themeElements, 'a:fmtScheme') : null,\n\t\tfontScheme: themeElements ? firstChild(themeElements, 'a:fontScheme') : null,\n\t\tlayoutRoot,\n\t\tmasterRoot,\n\t}\n}\n\n/** The `a:themeElements` of a theme part (by partname), or `null` when the part/element is absent. */\nfunction themeElementsOf(opc: OpcPackage, themePartName: string | null): Element | null {\n\tconst themeRoot = documentElement(opc, themePartName)\n\treturn themeRoot ? firstChild(themeRoot, 'a:themeElements') : null\n}\n\n/** Identifies a placeholder by its `p:ph` `type`/`idx` for inheritance lookups. */\nexport interface PlaceholderRef {\n\ttype: string | null\n\tidx: string\n}\n\n/**\n * The colour a run effectively renders when its own `a:rPr` defines none,\n * resolved to a full {@link ResolvedColor}. Walks the inheritance the way\n * PowerPoint does: the paragraph's `a:pPr/a:defRPr` colour, then the slide text\n * body's `a:lstStyle` colour for the run's `level`, then — only for a placeholder\n * run — the placeholder's layout → master → master-`p:txStyles` chain (via\n * {@link placeholderInheritedFill}), then the presentation's `p:defaultTextStyle`\n * for the run's level (`ctx.defaultTextStyle`). The first tier that defines a\n * colour wins. `ph` is `null` for a non-placeholder run, which skips the\n * placeholder chain but still reaches `p:defaultTextStyle`. `null` when nothing in\n * the chain defines a colour, or it cannot be made literal.\n */\nexport function resolveInheritedRunColor(\n\tph: PlaceholderRef | null,\n\tlevel: number,\n\tpPr: Element | null,\n\tslideLstStyle: Element | null,\n\tctx: ThemeContext\n): ResolvedColor | null {\n\tconst defRPr = pPr && firstChild(pPr, 'a:defRPr')\n\tconst paraFill = defRPr && firstChild(defRPr, 'a:solidFill')\n\tif (paraFill) return resolveColorElement(firstChildElement(paraFill), ctx)\n\tconst slideFill = lstStyleLevelFill(slideLstStyle, level)\n\tif (slideFill) return resolveColorElement(firstChildElement(slideFill), ctx)\n\tif (ph) {\n\t\tconst colorEl = placeholderInheritedFill(ph.type, ph.idx, level, ctx)\n\t\tif (colorEl) return resolveColorElement(colorEl, ctx)\n\t}\n\tconst defaultFill = lstStyleLevelFill(ctx.defaultTextStyle ?? null, level)\n\treturn defaultFill ? resolveColorElement(firstChildElement(defaultFill), ctx) : null\n}\n\n/**\n * The `a:defRPr` tiers a run resolves an inherited character property against, in\n * priority order: the paragraph's `a:pPr/a:defRPr`, then the slide text body's\n * `a:lstStyle` level `a:defRPr`, then — only for a placeholder run — the\n * placeholder's layout → master → master-`p:txStyles` chain (via\n * {@link placeholderInheritedDefRPrs}), then the presentation's\n * `p:defaultTextStyle` level `a:defRPr` (`ctx.defaultTextStyle`). The first tier\n * that defines the property wins — each property resolves independently, mirroring\n * how the colour resolver walks the same chain. `ph` is `null` for a\n * non-placeholder run, which skips the placeholder chain but still reaches\n * `p:defaultTextStyle`.\n */\nfunction inheritedRunDefRPrs(\n\tph: PlaceholderRef | null,\n\tlevel: number,\n\tpPr: Element | null,\n\tslideLstStyle: Element | null,\n\tctx: ThemeContext\n): Element[] {\n\tconst tiers: Element[] = []\n\tconst paraDefRPr = pPr && firstChild(pPr, 'a:defRPr')\n\tif (paraDefRPr) tiers.push(paraDefRPr)\n\tconst slideDefRPr = lstStyleLevelDefRPr(slideLstStyle, level)\n\tif (slideDefRPr) tiers.push(slideDefRPr)\n\tif (ph) tiers.push(...placeholderInheritedDefRPrs(ph.type, ph.idx, level, ctx))\n\tconst defaultDefRPr = lstStyleLevelDefRPr(ctx.defaultTextStyle ?? null, level)\n\tif (defaultDefRPr) tiers.push(defaultDefRPr)\n\treturn tiers\n}\n\n/**\n * The point size a run effectively renders when its own `a:rPr` sets no `@sz`,\n * walking the inheritance the way PowerPoint does (see {@link inheritedRunDefRPrs}):\n * the first `a:defRPr/@sz` (hundredths of a point) in the paragraph → slide →\n * (placeholder) layout → master → `p:txStyles` → `p:defaultTextStyle` chain,\n * converted to points. A non-placeholder run skips the placeholder tiers but still\n * reaches `p:defaultTextStyle`. `null` when nothing in the chain defines a size.\n */\nexport function resolveInheritedRunSize(\n\tph: PlaceholderRef | null,\n\tlevel: number,\n\tpPr: Element | null,\n\tslideLstStyle: Element | null,\n\tctx: ThemeContext\n): number | null {\n\tfor (const defRPr of inheritedRunDefRPrs(ph, level, pPr, slideLstStyle, ctx)) {\n\t\tconst sz = intValue(attr(defRPr, 'sz'))\n\t\tif (sz !== null) return sz / 100\n\t}\n\treturn null\n}\n\n/**\n * The typeface a run effectively renders when its own `a:rPr` sets no `a:latin`,\n * walking the same chain as {@link resolveInheritedRunSize}: the first\n * `a:defRPr/a:latin/@typeface` it finds, then resolving a `+mj-*`/`+mn-*` theme\n * font token to a literal face name through the theme `fontScheme`. A\n * non-placeholder run skips the placeholder tiers but still reaches\n * `p:defaultTextStyle` (whose level `a:latin` is `+mn-lt` in a PowerPoint-written\n * deck). `null` when nothing in the chain names a face, or the token cannot be\n * resolved.\n */\nexport function resolveInheritedRunFontFace(\n\tph: PlaceholderRef | null,\n\tlevel: number,\n\tpPr: Element | null,\n\tslideLstStyle: Element | null,\n\tctx: ThemeContext\n): string | null {\n\tfor (const defRPr of inheritedRunDefRPrs(ph, level, pPr, slideLstStyle, ctx)) {\n\t\tconst latin = firstChild(defRPr, 'a:latin')\n\t\tconst typeface = latin && attr(latin, 'typeface')\n\t\tif (typeface) return resolveThemeFont(typeface, ctx.fontScheme ?? null)\n\t}\n\treturn null\n}\n\n/**\n * Whether a run effectively renders with the boolean character property `name`\n * (`b`/`i`) when its own `a:rPr` sets none, walking the same chain as\n * {@link resolveInheritedRunSize}: the first `a:defRPr/@<name>` in the paragraph →\n * slide → (placeholder) layout → master → `p:txStyles` → `p:defaultTextStyle`\n * chain. The first tier that *states* the attribute wins, and its value is parsed\n * by {@link boolValue} — the same `xsd:boolean` parser the run's own `bold`/`italic`\n * getters use — so an unparseable value reports `null` rather than being read as\n * `false`. `null` when nothing in the chain states it.\n */\nfunction resolveInheritedRunFlag(\n\tname: string,\n\tph: PlaceholderRef | null,\n\tlevel: number,\n\tpPr: Element | null,\n\tslideLstStyle: Element | null,\n\tctx: ThemeContext\n): boolean | null {\n\tfor (const defRPr of inheritedRunDefRPrs(ph, level, pPr, slideLstStyle, ctx)) {\n\t\tconst raw = attr(defRPr, name)\n\t\tif (raw !== null) return boolValue(raw)\n\t}\n\treturn null\n}\n\n/**\n * Whether a run effectively renders bold when its own `a:rPr` sets no `@b`: the\n * first `a:defRPr/@b` in the inheritance chain (see {@link resolveInheritedRunFlag}).\n * A non-placeholder run skips the placeholder tiers but still reaches\n * `p:defaultTextStyle` (which sets no `@b` in a PowerPoint-written deck, so bold\n * stays `null` there). `null` when nothing in the chain defines bold.\n */\nexport function resolveInheritedRunBold(\n\tph: PlaceholderRef | null,\n\tlevel: number,\n\tpPr: Element | null,\n\tslideLstStyle: Element | null,\n\tctx: ThemeContext\n): boolean | null {\n\treturn resolveInheritedRunFlag('b', ph, level, pPr, slideLstStyle, ctx)\n}\n\n/**\n * Whether a run effectively renders italic when its own `a:rPr` sets no `@i`: the\n * first `a:defRPr/@i` in the inheritance chain (see {@link resolveInheritedRunFlag}).\n * `@b` and `@i` are siblings on `CT_TextCharacterProperties` and a master text\n * style states them together, so this is the exact twin of\n * {@link resolveInheritedRunBold} one attribute along. `null` when nothing in the\n * chain defines italic.\n */\nexport function resolveInheritedRunItalic(\n\tph: PlaceholderRef | null,\n\tlevel: number,\n\tpPr: Element | null,\n\tslideLstStyle: Element | null,\n\tctx: ThemeContext\n): boolean | null {\n\treturn resolveInheritedRunFlag('i', ph, level, pPr, slideLstStyle, ctx)\n}\n\n/**\n * The vertical anchor a placeholder text frame effectively renders when its own\n * `a:bodyPr` sets no `@anchor`: the value inherited from the layout → master\n * placeholder `a:bodyPr` (see {@link placeholderInheritedAnchor}). `null` when the\n * frame is not in a placeholder or nothing in the chain sets an anchor (PowerPoint\n * then defaults to top).\n */\nexport function resolveInheritedAnchor(ph: PlaceholderRef, ctx: ThemeContext): string | null {\n\treturn placeholderInheritedAnchor(ph.type, ph.idx, ctx)\n}\n\n/** Which tier of the slide → layout → master chain a {@link ResolvedFrame} resolved from. */\nexport type GeometrySource = 'own' | 'layout' | 'master'\n\n/** A shape's effective position and size in EMU, tagged with where it resolved from. */\nexport interface ResolvedFrame {\n\tleft: number\n\ttop: number\n\twidth: number\n\theight: number\n\tsource: GeometrySource\n}\n\n/**\n * The position/size a placeholder inherits when its own `a:spPr` carries no\n * `a:xfrm`: the matching layout placeholder's geometry, else the master's (see\n * {@link placeholderInheritedXfrm}). `null` when the chain has no matching\n * placeholder geometry to inherit, or the matched `a:xfrm` is missing an\n * `a:off`/`a:ext` coordinate. Callers that also need the \"own `a:xfrm` wins\"\n * check (the common case) use {@link Shape.resolvedFrame}, which layers that on\n * top of this.\n */\nexport function resolveInheritedFrame(ph: PlaceholderRef, ctx: ThemeContext): ResolvedFrame | null {\n\tconst found = placeholderInheritedXfrm(ph.type, ph.idx, ctx)\n\tif (!found) return null\n\tconst off = firstChild(found.xfrm, 'a:off')\n\tconst ext = firstChild(found.xfrm, 'a:ext')\n\tconst left = off && intValue(attr(off, 'x'))\n\tconst top = off && intValue(attr(off, 'y'))\n\tconst width = ext && intValue(attr(ext, 'cx'))\n\tconst height = ext && intValue(attr(ext, 'cy'))\n\tif (left === null || left === undefined) return null\n\tif (top === null || top === undefined) return null\n\tif (width === null || width === undefined) return null\n\tif (height === null || height === undefined) return null\n\treturn { left, top, width, height, source: found.source }\n}\n\n/**\n * A DrawingML colour reference resolved against a slide's theme to a literal hex.\n *\n * `hex` is the **base** token colour and `transforms` reports the colour-transform\n * children (`lumMod`/`lumOff`/`shade`/`tint`/`alpha`/…) in document order as\n * `{ name, value }` pairs — both kept for traceability and for the\n * `theme: 'preserve'` flatten path that re-emits the transforms verbatim.\n *\n * `effectiveHex` is the colour a renderer actually paints: `hex` with its\n * `transforms` applied (see {@link applyColorTransforms}). Read this for the final\n * rendered colour. `alpha` (0–1) is present only when an `alpha*` transform set an\n * opacity.\n */\nexport interface ResolvedColor {\n\thex: string\n\ttransforms: ColorTransform[]\n\teffectiveHex: string\n\talpha?: number\n}\n\n/**\n * Resolve a DrawingML colour *element* (every `a:EG_ColorChoice` member except\n * `a:scrgbClr` — see `read/oxml/theme.ts`) against `ctx` into a full\n * {@link ResolvedColor} — base hex, raw transform list,\n * and the `effectiveHex`/`alpha` after applying those transforms. `null` when the\n * element cannot be made literal (unmapped token, or a colour model we do not\n * resolve). Shared by the solid-fill and gradient-stop colour reads.\n */\nexport function resolveColorElement(colorEl: Element | null, ctx: ColorContext): ResolvedColor | null {\n\tconst resolved = resolveColor(colorEl, ctx)\n\tif (!resolved) return null\n\tconst transforms = resolved.transforms.map((t) => ({ name: t.localName ?? '', value: attr(t, 'val') }))\n\tconst { hex, alpha } = applyColorTransforms(resolved.hex, transforms)\n\treturn alpha === undefined\n\t\t? { hex: resolved.hex, transforms, effectiveHex: hex }\n\t\t: { hex: resolved.hex, transforms, effectiveHex: hex, alpha }\n}\n\n/**\n * Resolve the `a:solidFill` colour of a properties container (`p:spPr`,\n * `p:grpSpPr`, `a:ln`, or a run's `a:rPr`) to a literal hex through `ctx`.\n * `null` when the container has no solid fill, or the colour cannot be made\n * literal (an unmapped token, or a colour model we do not resolve).\n */\nexport function resolveSolidFillColor(container: Element | null, ctx: ColorContext): ResolvedColor | null {\n\tif (!container) return null\n\tconst solidFill = firstChild(container, 'a:solidFill')\n\tif (!solidFill) return null\n\treturn resolveColorElement(firstChildElement(solidFill), ctx)\n}\n\n/**\n * Resolve the fill colour a shape inherits from its `p:style` `a:fillRef`\n * (style-matrix fill) to a literal hex through `ctx`. Used as the fallback for\n * {@link import('./shapes.js').Shape.resolvedFill} when the shape carries no\n * explicit `spPr` fill choice. `null` when there is no `fillRef`, it cannot be\n * resolved, or the indexed style entry is not a solid fill (a gradient style fill\n * has no single colour — read it through `gradientStops` instead).\n */\nexport function resolveStyleFillColor(shape: Element, ctx: ThemeContext): ResolvedColor | null {\n\tconst style = firstChild(shape, 'p:style')\n\tconst fill = style && styleRefFill(firstChild(style, 'a:fillRef'), ctx)\n\tif (!fill || fill.localName !== 'solidFill') return null\n\treturn resolveColorElement(firstChildElement(fill), ctx)\n}\n\n/**\n * Resolve the line colour a shape inherits from its `p:style` `a:lnRef`\n * (style-matrix line) to a literal hex through `ctx`. Used as the fallback for\n * {@link import('./shapes.js').Shape.resolvedLine} when the shape carries no\n * explicit `spPr/a:ln`. `null` when there is no `lnRef` or it cannot be resolved.\n */\nexport function resolveStyleLineColor(shape: Element, ctx: ThemeContext): ResolvedColor | null {\n\tconst style = firstChild(shape, 'p:style')\n\tconst ln = style && styleRefLine(firstChild(style, 'a:lnRef'), ctx)\n\treturn ln ? resolveSolidFillColor(ln, ctx) : null\n}\n\n/** A shape's resolved `p:style/a:fontRef` text tier: its colour and theme face. */\nexport interface StyleFontRef {\n\t/** The `a:fontRef` child colour (`a:schemeClr`/`a:srgbClr`/…) resolved through the theme, or `null` when it names none / cannot be made literal. */\n\tcolor: ResolvedColor | null\n\t/** The face named by `a:fontRef/@idx` (`major`→`+mj-lt`, `minor`→`+mn-lt`) resolved through the theme `fontScheme`, or `null` for `idx=\"none\"` / an unresolvable token. */\n\tface: string | null\n}\n\n/**\n * Resolve the text colour and typeface a shape derives from its `p:style/a:fontRef`\n * (the style-matrix font reference) — the tier PowerPoint applies to a shape's runs\n * just below their own `a:rPr` and above the placeholder/`p:defaultTextStyle` chain.\n * The `a:fontRef` child colour resolves through `ctx` like any other (it can carry\n * `lumMod`/`shade` transforms); `@idx` (`major`|`minor`|`none`) maps to the theme's\n * major/minor Latin font. `null` when the shape has no `p:style/a:fontRef` at all.\n */\nexport function resolveStyleFontRef(shape: Element, ctx: ThemeContext): StyleFontRef | null {\n\tconst style = firstChild(shape, 'p:style')\n\tconst fontRef = style && firstChild(style, 'a:fontRef')\n\tif (!fontRef) return null\n\tconst color = resolveColorElement(firstChildElement(fontRef), ctx)\n\tconst idx = attr(fontRef, 'idx')\n\tconst token = idx === 'major' ? '+mj-lt' : idx === 'minor' ? '+mn-lt' : null\n\treturn { color, face: token ? resolveThemeFont(token, ctx.fontScheme ?? null) : null }\n}\n","/**\n * Shared gradient-fill reader for DrawingML colour-bearing containers: a shape's\n * `p:spPr`, a line's `a:ln`, and a slide's `p:bg/p:bgPr`. Decodes an `a:gradFill`\n * into its stops (colour + position) plus the linear/path geometry, resolving each\n * stop's colour against the slide theme.\n */\nimport { attr, firstChild, firstChildElement, getElements, intValue, type Element } from '../oxml/dom.js'\nimport type { ColorContext } from '../oxml/theme.js'\nimport { resolveColorElement, type ResolvedColor } from './theme-context.js'\nimport { ANGLE_UNITS_PER_DEGREE, PERCENT_SCALE } from '../../units.js'\n\n/** One stop of a gradient fill (`a:gsLst/a:gs`), as read from a shape. */\nexport interface GradientStop {\n\t/** Stop offset along the gradient, 0–1 (from `@pos`, thousandths of a percent), or `null` if unset. */\n\tposition: number | null\n\t/** Explicit RGB colour as 6-hex (`a:srgbClr/@val`), or `null` when the stop uses another colour model. */\n\tcolor: string | null\n\t/** Theme colour token (`a:schemeClr/@val`, e.g. `accent1`), or `null` when the stop uses another colour model. */\n\tschemeColor: string | null\n\t/**\n\t * Preset colour name (`a:prstClr/@val`, e.g. `black`/`cornflowerBlue` — the\n\t * ECMA-376 §20.1.10.47 table), or `null` when the stop uses another colour\n\t * model. The same raw/resolved split {@link import('./shapes/types.js').RecolorColor}\n\t * uses; {@link import('../oxml/preset-color.js').presetColorHex}, exported from\n\t * `ts-pptx/read`, makes one literal.\n\t *\n\t * These three raw fields name three of the five colour models the reader\n\t * resolves. A stop written as `a:sysClr` or `a:hslClr` leaves all three `null`\n\t * and is reported through {@link resolvedColor} alone, which is the only place\n\t * its colour appears; `a:scrgbClr`, which the reader deliberately does not\n\t * resolve, leaves {@link resolvedColor} `null` too.\n\t */\n\tpresetColor: string | null\n\t/**\n\t * The stop's colour as a full {@link ResolvedColor} — base `hex`, the raw\n\t * `transforms` list (`lumMod`/`shade`/…) in document order, and the\n\t * `effectiveHex`/`alpha` after applying them — exactly what a solid fill's\n\t * `resolvedFill` gives. `null` when the colour cannot be made literal (an\n\t * unmapped token, or a colour model we do not resolve).\n\t *\n\t * This is the field to read when re-authoring a stop against a *different*\n\t * theme: {@link effectiveHex} alone is one theme baked in, so carrying it\n\t * forward as a literal silently stops the stop tracking the theme it came from.\n\t * `transforms` is what says whether there was anything to track, and an empty\n\t * list here means the stop stated none — not that the reader could not see them.\n\t */\n\tresolvedColor: ResolvedColor | null\n\t/**\n\t * The stop's colour resolved against the slide theme **with its colour\n\t * transforms applied** — the final rendered hex, i.e. exactly\n\t * `resolvedColor?.effectiveHex ?? null`, kept as a flat field because painting a\n\t * gradient is what most callers want. `null` when the colour cannot be made\n\t * literal (an unmapped token, or a colour model we do not resolve).\n\t */\n\teffectiveHex: string | null\n\t/** The stop's opacity (0–1) when an `alpha*` transform set one, else `undefined`. Mirrors `resolvedColor.alpha`. */\n\talpha?: number\n}\n\n/**\n * A gradient fill (`a:gradFill`), as read from a container — the stops plus the\n * geometry that a bare stop list omits. `linear` gradients carry an\n * {@link GradientFill.angleDeg} (the `a:lin/@ang` direction); `radial`/`path`\n * gradients carry a {@link GradientFill.path} shape (`a:path/@path`, e.g.\n * `circle`). The angle is in **OOXML degrees** (clockwise from 3 o'clock), the\n * same convention the write-side `GradientFillProps.angle` expects, so it\n * round-trips directly.\n */\nexport interface GradientFill {\n\t/** `linear` (`a:lin`) or `path` (`a:path`, i.e. radial/rectangular). `null` when neither child is present. */\n\tkind: 'linear' | 'path' | null\n\t/** Linear direction in OOXML degrees (clockwise from 3 o'clock), or `null` for a path gradient / when unset. */\n\tangleDeg: number | null\n\t/** Path-gradient shape (`a:path/@path`: `circle`/`rect`/`shape`), or `null` for a linear gradient. */\n\tpath: string | null\n\t/** The gradient stops in document order. */\n\tstops: GradientStop[]\n}\n\n/**\n * Read `a:gradFill/a:gsLst` stops from a container (`p:spPr` for a fill, `a:ln`\n * for a line stroke, or `p:bgPr` for a slide background). `null` when the\n * container has no gradient; `[]` when the gradient carries no stop list.\n */\nexport function readGradientStops(container: Element, ctx: ColorContext): GradientStop[] | null {\n\tconst grad = firstChild(container, 'a:gradFill')\n\tif (!grad) return null\n\tconst gsLst = firstChild(grad, 'a:gsLst')\n\tif (!gsLst) return []\n\treturn getElements(gsLst, 'a:gs').map((gs) => {\n\t\t// `a:gs` holds exactly one `a:EG_ColorChoice` child, so the stop's colour is\n\t\t// whichever element that is. Reading it by *position* rather than by hunting\n\t\t// for two known tag names is what lets every model `resolveColorElement`\n\t\t// handles reach the resolver: a `a:prstClr`/`a:sysClr`/`a:hslClr` stop used to\n\t\t// come back blank in every field, though the reader resolves all three\n\t\t// everywhere else.\n\t\tconst colorEl = firstChildElement(gs)\n\t\tconst model = colorEl?.localName ?? null\n\t\tconst pos = intValue(attr(gs, 'pos'))\n\t\tconst resolved = resolveColorElement(colorEl, ctx)\n\t\tconst rawOf = (local: string) => (colorEl && model === local ? attr(colorEl, 'val') : null)\n\t\treturn {\n\t\t\tposition: pos === null ? null : pos / PERCENT_SCALE,\n\t\t\tcolor: rawOf('srgbClr'),\n\t\t\tschemeColor: rawOf('schemeClr'),\n\t\t\tpresetColor: rawOf('prstClr'),\n\t\t\tresolvedColor: resolved,\n\t\t\teffectiveHex: resolved ? resolved.effectiveHex : null,\n\t\t\t...(resolved?.alpha !== undefined ? { alpha: resolved.alpha } : {}),\n\t\t}\n\t})\n}\n\n/**\n * Read the full `a:gradFill` (stops + linear angle / path shape) from a container\n * (`p:spPr` for a fill, `a:ln` for a line stroke, or `p:bgPr` for a slide\n * background). `null` when the container has no gradient.\n */\nexport function readGradientFill(container: Element, ctx: ColorContext): GradientFill | null {\n\tconst grad = firstChild(container, 'a:gradFill')\n\tif (!grad) return null\n\tconst lin = firstChild(grad, 'a:lin')\n\tconst path = firstChild(grad, 'a:path')\n\tconst ang = lin ? intValue(attr(lin, 'ang')) : null\n\treturn {\n\t\tkind: lin ? 'linear' : path ? 'path' : null,\n\t\tangleDeg: ang === null ? null : ang / ANGLE_UNITS_PER_DEGREE,\n\t\tpath: path ? (attr(path, 'path') ?? null) : null,\n\t\tstops: readGradientStops(container, ctx) ?? [],\n\t}\n}\n","/**\n * Shared picture-fill reader for DrawingML fill-bearing containers: a shape's\n * `p:spPr`, a table cell's `a:tcPr`, and a slide's `p:bg/p:bgPr`. Decodes an\n * `a:blipFill` into the embedded image reference plus the geometry that decides\n * how the image covers the surface — stretch vs tile, the source crop, and the\n * tile offsets/scale.\n *\n * A picture fill is not a colour, so the solid-fill accessors\n * (`AutoShape.resolvedFill`, `TableCell.resolvedFill`) report `null` for one and\n * a surface filled with an image reads as unfilled without this.\n */\nimport { attr, firstChild, intValue, boolValue, type Element } from '../oxml/dom.js'\nimport type { Relationships } from '../opc/relationships.js'\nimport { PERCENT_SCALE } from '../../units.js'\n\n/** A rectangle expressed as per-edge fractions (`a:srcRect`/`a:fillRect`), `0.1` = 10 %. */\nexport interface FillRect {\n\tleft: number\n\ttop: number\n\tright: number\n\tbottom: number\n}\n\n/**\n * The tiling geometry of a tiled picture fill (`a:blipFill/a:tile`). Offsets stay\n * in EMU (the attribute's own unit); scales are fractions (`1` = 100 %), matching\n * the read API's convention elsewhere.\n */\nexport interface PictureFillTile {\n\t/** Horizontal tile offset in EMU (`@tx`), `0` when unset. */\n\toffsetXEmu: number\n\t/** Vertical tile offset in EMU (`@ty`), `0` when unset. */\n\toffsetYEmu: number\n\t/** Horizontal tile scale as a fraction (`@sx`, thousandths of a percent), `1` when unset. */\n\tscaleX: number\n\t/** Vertical tile scale as a fraction (`@sy`), `1` when unset. */\n\tscaleY: number\n\t/** Tile mirroring (`@flip`: `none`/`x`/`y`/`xy`), or `null` when unset. */\n\tflip: string | null\n\t/** Tile alignment within the surface (`@algn`, e.g. `tl`), or `null` when unset. */\n\talign: string | null\n}\n\n/**\n * A picture (image) fill (`a:blipFill`) read from a fill-bearing container. The\n * image itself is {@link relId} / {@link partName}; the rest is the geometry a\n * faithful replica needs — {@link mode} (`stretch` or `tile`), the source crop\n * {@link srcRect}, the destination inset {@link fillRect}, and {@link tile}.\n *\n * Rect fields follow the read API's fraction convention (see\n * {@link import('./shapes.js').Picture.crop}): the raw attributes are\n * thousandths of a percent and are divided by 100000, so `0.1` is 10 % and a\n * negative value (a `fillRect` that bleeds past the edge) stays negative.\n */\nexport interface PictureFill {\n\t/** Relationship id of the embedded image (`a:blip/@r:embed`), or `null` when the blip embeds none. */\n\trelId: string | null\n\t/** Absolute partname of the embedded image, or `null` when it has no rel id / no resolvable target. */\n\tpartName: string | null\n\t/** `stretch` (`a:stretch`) or `tile` (`a:tile`); `null` when the fill states neither. */\n\tmode: 'stretch' | 'tile' | null\n\t/** Source crop as per-edge fractions (`a:srcRect`), or `null` when absent. An explicit `<a:srcRect/>` reports zeros. */\n\tsrcRect: FillRect | null\n\t/** Stretch destination rect as per-edge fractions (`a:stretch/a:fillRect`), or `null` when absent. */\n\tfillRect: FillRect | null\n\t/** Tiling geometry (`a:tile`), or `null` when the fill is not tiled. */\n\ttile: PictureFillTile | null\n\t/** Blip opacity 0–1 (`a:blip/a:alphaModFix/@amt`), or `null` when the blip sets none. */\n\talpha: number | null\n\t/** DPI override the image is rendered at (`@dpi`), or `null` when unset. `0` means \"use the image's own\". */\n\tdpi: number | null\n\t/** Whether the fill rotates with its shape (`@rotWithShape`), or `null` when unset. */\n\trotWithShape: boolean | null\n}\n\n/** Per-edge fractions of a rect element, absent attributes reading as `0`. */\nfunction readRect(rect: Element): FillRect {\n\tconst edge = (name: string): number => {\n\t\tconst v = intValue(attr(rect, name))\n\t\treturn v === null ? 0 : v / PERCENT_SCALE\n\t}\n\treturn { left: edge('l'), top: edge('t'), right: edge('r'), bottom: edge('b') }\n}\n\n/** Decode an `a:tile`: offsets stay in EMU, scales become fractions defaulting to `1`. */\nfunction readTile(tile: Element): PictureFillTile {\n\tconst scale = (name: string): number => {\n\t\tconst v = intValue(attr(tile, name))\n\t\treturn v === null ? 1 : v / PERCENT_SCALE\n\t}\n\treturn {\n\t\toffsetXEmu: intValue(attr(tile, 'tx')) ?? 0,\n\t\toffsetYEmu: intValue(attr(tile, 'ty')) ?? 0,\n\t\tscaleX: scale('sx'),\n\t\tscaleY: scale('sy'),\n\t\tflip: attr(tile, 'flip'),\n\t\talign: attr(tile, 'algn'),\n\t}\n}\n\n/** Resolve a rel id to an absolute partname, `null` for an absent/external/dangling one. */\nfunction resolvePartName(relId: string | null, rels: Relationships | null): string | null {\n\tif (!relId || !rels) return null\n\tconst rel = rels.get(relId)\n\tif (!rel || rel.targetMode === 'External') return null\n\treturn rels.resolveTarget(relId)\n}\n\n/**\n * Read an `a:blipFill` from a container (`p:spPr`, `a:tcPr`, or `p:bgPr`) into a\n * {@link PictureFill}. `rels` — the *owning part's* relationships — resolves the\n * blip's `r:embed` to an absolute partname; pass `null` (or omit) to read the\n * geometry without resolving the image. `null` when the container's fill is not\n * a picture.\n */\nexport function readPictureFill(container: Element, rels: Relationships | null = null): PictureFill | null {\n\tconst blipFill = firstChild(container, 'a:blipFill')\n\tif (!blipFill) return null\n\n\tconst blip = firstChild(blipFill, 'a:blip')\n\tconst relId = blip ? attr(blip, 'r:embed') : null\n\tconst alphaMod = blip && firstChild(blip, 'a:alphaModFix')\n\tconst amt = alphaMod ? intValue(attr(alphaMod, 'amt')) : null\n\n\tconst srcRect = firstChild(blipFill, 'a:srcRect')\n\tconst stretch = firstChild(blipFill, 'a:stretch')\n\tconst fillRect = stretch && firstChild(stretch, 'a:fillRect')\n\tconst tile = firstChild(blipFill, 'a:tile')\n\n\treturn {\n\t\trelId,\n\t\tpartName: resolvePartName(relId, rels),\n\t\tmode: stretch ? 'stretch' : tile ? 'tile' : null,\n\t\tsrcRect: srcRect ? readRect(srcRect) : null,\n\t\tfillRect: fillRect ? readRect(fillRect) : null,\n\t\ttile: tile ? readTile(tile) : null,\n\t\t// `a:alphaModFix` omits `amt` to mean fully opaque (the schema default).\n\t\talpha: alphaMod ? (amt === null ? 1 : amt / PERCENT_SCALE) : null,\n\t\tdpi: intValue(attr(blipFill, 'dpi')),\n\t\trotWithShape: boolValue(attr(blipFill, 'rotWithShape')),\n\t}\n}\n","/**\n * Shared pattern-fill reader for DrawingML colour-bearing containers: a shape's `p:spPr`, a\n * slide's `p:bg/p:bgPr`, and a table's `a:tblPr` / cell's `a:tcPr`.\n *\n * `a:pattFill` is a preset hatch name plus two wrapped colours, and decoding it is three\n * lines — which is exactly why it had been open-coded in each place that needed it. Sharing\n * it is what keeps the three from drifting into different answers for the same element, the\n * same reason {@link import('./gradient.js').readGradientFill} and\n * {@link import('./picture-fill.js').readPictureFill} are shared.\n */\nimport { attr, firstChild, firstChildElement, type Element } from '../oxml/dom.js'\nimport type { ColorContext } from '../oxml/theme.js'\nimport { resolveColorElement, type ResolvedColor } from './theme-context.js'\n\n/**\n * A pattern fill (`a:pattFill`) — a two-colour preset hatch. The write-side\n * `fill: { type: 'pattern', pattern: { preset, fgColor, bgColor } }` emits the same element,\n * so the {@link preset} name and both colours round-trip. Colours resolve against the theme\n * (a scheme token → literal hex) the same way a solid fill does.\n */\nexport interface PatternFill {\n\t/** Preset pattern name (`@prst`, e.g. `pct50`/`diagCross`/`ltUpDiag`), or `null` when unset. */\n\tpreset: string | null\n\t/** Foreground colour (`a:fgClr`) resolved against the theme, or `null`. */\n\tforeground: ResolvedColor | null\n\t/** Background colour (`a:bgClr`) resolved against the theme, or `null`. */\n\tbackground: ResolvedColor | null\n}\n\n/**\n * Read a container's `a:pattFill`, or `null` when its fill is not a pattern.\n * @param {Element} container - the fill-bearing parent (`p:spPr`, `p:bgPr`, `a:tblPr`, `a:tcPr`, …)\n * @param {ColorContext} ctx - the theme colour context each colour resolves against\n * @returns {PatternFill | null} the decoded hatch, or `null`\n */\nexport function readPatternFill(container: Element, ctx: ColorContext): PatternFill | null {\n\tconst patt = firstChild(container, 'a:pattFill')\n\tif (!patt) return null\n\tconst wrapColor = (qname: string): ResolvedColor | null => {\n\t\tconst wrap = firstChild(patt, qname)\n\t\tconst colorEl = wrap && firstChildElement(wrap)\n\t\treturn colorEl ? resolveColorElement(colorEl, ctx) : null\n\t}\n\treturn {\n\t\tpreset: attr(patt, 'prst') ?? null,\n\t\tforeground: wrapColor('a:fgClr'),\n\t\tbackground: wrapColor('a:bgClr'),\n\t}\n}\n","/**\n * Shape-element plumbing: the small element lookups every shape kind performs, plus the\n * shape-scoped re-exports of the shared schema-successor lists.\n *\n * The successor arrays are the reason a setter can create a missing `a:xfrm` / `a:solidFill` /\n * `a:ln` without corrupting the part: `getOrAddChild` inserts before the first listed sibling it\n * finds, so each list must name exactly the children that legally *follow* the one being added.\n * They are declared once in `src/ooxml/sequence.ts` (derived from each complexType's sequence)\n * and re-exported here so the shape modules keep importing them from one place.\n */\n\nimport {\n\tELEMENT_NODE,\n\tOOXML_NS,\n\tattr,\n\tchildElements,\n\tfirstChild,\n\tgetOrAddChild,\n\tintValue,\n\ttype Element,\n} from '../../oxml/dom.js'\nimport { SHAPE_AFTER_SPPR, SPPR_AFTER_XFRM } from '../../../ooxml/sequence.js'\n\nexport {\n\tGRPSPPR_AFTER_XFRM,\n\tGRPSPPR_FILL_AFTER,\n\tLN_FILL_AFTER,\n\tSHAPE_AFTER_SPPR,\n\tSPPR_AFTER_XFRM,\n\tSPPR_FILL_AFTER,\n\tSPPR_LN_AFTER,\n} from '../../../ooxml/sequence.js'\n\n/**\n * A shape's properties element (`p:spPr` / `p:grpSpPr`) paired with the schema\n * successors for ordered insertion of its `a:solidFill` and `a:ln` children.\n * `lnAfter` is `null` for kinds with no `a:ln` (group shapes).\n */\nexport interface ShapeProperties {\n\tprops: Element\n\tfillAfter: string[]\n\tlnAfter: string[] | null\n}\n\n/** First `<p:cNvPr>` reached through the shape's non-visual properties wrapper (`p:nv*Pr`). */\nexport function nonVisualCNvPr(element: Element): Element | null {\n\tfor (let node = element.firstChild; node; node = node.nextSibling) {\n\t\tif (node.nodeType !== ELEMENT_NODE) continue\n\t\tconst child = node as Element\n\t\tif (child.namespaceURI === OOXML_NS.p && child.localName?.startsWith('nv')) {\n\t\t\treturn firstChild(child, 'p:cNvPr')\n\t\t}\n\t}\n\treturn null\n}\n\nexport function emuFrom(parent: Element | null, qname: string, attribute: string): number | null {\n\tconst element = parent && firstChild(parent, qname)\n\treturn element ? intValue(attr(element, attribute)) : null\n}\n\n/**\n * One EMU coordinate from a shape's own `p:spPr/a:xfrm`, or `null` when any link in that chain\n * is absent — which is how an inheriting placeholder (one with no `a:xfrm` of its own) reports\n * that its geometry comes from the layout/master instead. See `placeholderInheritedXfrm` for\n * resolving what it would inherit.\n */\nexport function spPrXfrmEmu(sp: Element, container: 'a:off' | 'a:ext', axis: string): number | null {\n\tconst spPr = firstChild(sp, 'p:spPr')\n\tconst xfrm = spPr && firstChild(spPr, 'a:xfrm')\n\tconst el = xfrm && firstChild(xfrm, container)\n\treturn el ? intValue(attr(el, axis)) : null\n}\n\nexport { childElements }\n\n/** Get-or-add `p:spPr/a:xfrm` for shapes whose transform lives in `p:spPr` (`p:sp`, `p:pic`, `p:cxnSp`). */\nexport function getOrAddSpPrXfrm(shapeElement: Element): Element {\n\tconst spPr = getOrAddChild(shapeElement, 'p:spPr', SHAPE_AFTER_SPPR)\n\treturn getOrAddChild(spPr, 'a:xfrm', SPPR_AFTER_XFRM)\n}\n","/**\n * Reading geometry out of a shape: transform boxes, rotation and flips, and custom-geometry paths.\n *\n * Every value here comes straight off `a:xfrm` / `a:path` attributes, so these are pure element\n * readers with no theme or relationship context.\n */\n\nimport {\n\tELEMENT_NODE,\n\tOOXML_NS,\n\tattr,\n\tboolValue,\n\tfirstChild,\n\tgetElements,\n\tintValue,\n\ttype Element,\n} from '../../oxml/dom.js'\nimport type { CustomGeometryPath, GeometryCommand } from './types.js'\nimport { InvalidOptionError } from '../../../errors.js'\nimport { ANGLE_UNITS_PER_DEGREE } from '../../../units.js'\n\n/**\n * One `a:pt` coordinate as a raw path-unit integer. A guide-name reference\n * (the `ST_AdjCoordinate` string form) is not produced by authored freeforms;\n * a non-numeric value degrades to `0` rather than crashing (documented edge).\n */\nfunction ptAxis(pt: Element | undefined, axis: 'x' | 'y'): number {\n\treturn (pt ? intValue(attr(pt, axis)) : null) ?? 0\n}\n\n/** Parse one `<a:path>` into its viewport attrs (with schema defaults) and ordered segments. */\nexport function readGeometryPath(path: Element): CustomGeometryPath {\n\tconst commands: GeometryCommand[] = []\n\tfor (let node = path.firstChild; node; node = node.nextSibling) {\n\t\tif (node.nodeType !== ELEMENT_NODE) continue\n\t\tconst seg = node as Element\n\t\tif (seg.namespaceURI !== OOXML_NS.a) continue\n\t\tconst pts = getElements(seg, 'a:pt')\n\t\tswitch (seg.localName) {\n\t\t\tcase 'moveTo':\n\t\t\t\tcommands.push({ cmd: 'moveTo', x: ptAxis(pts[0], 'x'), y: ptAxis(pts[0], 'y') })\n\t\t\t\tbreak\n\t\t\tcase 'lnTo':\n\t\t\t\tcommands.push({ cmd: 'lnTo', x: ptAxis(pts[0], 'x'), y: ptAxis(pts[0], 'y') })\n\t\t\t\tbreak\n\t\t\tcase 'cubicBezTo':\n\t\t\t\tcommands.push({\n\t\t\t\t\tcmd: 'cubicBezTo',\n\t\t\t\t\tx1: ptAxis(pts[0], 'x'),\n\t\t\t\t\ty1: ptAxis(pts[0], 'y'),\n\t\t\t\t\tx2: ptAxis(pts[1], 'x'),\n\t\t\t\t\ty2: ptAxis(pts[1], 'y'),\n\t\t\t\t\tx: ptAxis(pts[2], 'x'),\n\t\t\t\t\ty: ptAxis(pts[2], 'y'),\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\tcase 'quadBezTo':\n\t\t\t\tcommands.push({\n\t\t\t\t\tcmd: 'quadBezTo',\n\t\t\t\t\tx1: ptAxis(pts[0], 'x'),\n\t\t\t\t\ty1: ptAxis(pts[0], 'y'),\n\t\t\t\t\tx: ptAxis(pts[1], 'x'),\n\t\t\t\t\ty: ptAxis(pts[1], 'y'),\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\tcase 'arcTo':\n\t\t\t\tcommands.push({\n\t\t\t\t\tcmd: 'arcTo',\n\t\t\t\t\twR: intValue(attr(seg, 'wR')) ?? 0,\n\t\t\t\t\thR: intValue(attr(seg, 'hR')) ?? 0,\n\t\t\t\t\tstAng: (intValue(attr(seg, 'stAng')) ?? 0) / ANGLE_UNITS_PER_DEGREE,\n\t\t\t\t\tswAng: (intValue(attr(seg, 'swAng')) ?? 0) / ANGLE_UNITS_PER_DEGREE,\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\tcase 'close':\n\t\t\t\tcommands.push({ cmd: 'close' })\n\t\t\t\tbreak\n\t\t}\n\t}\n\treturn {\n\t\tw: intValue(attr(path, 'w')) ?? 0,\n\t\th: intValue(attr(path, 'h')) ?? 0,\n\t\tfill: attr(path, 'fill') ?? 'norm',\n\t\tstroke: boolValue(attr(path, 'stroke')) ?? true,\n\t\tcommands,\n\t}\n}\n\n/** Validate and round an EMU geometry value; extents (`cx`/`cy`) must be non-negative. */\nexport function toEmu(value: number, attribute: string, allowNegative: boolean): number {\n\tif (!Number.isFinite(value))\n\t\tthrow new InvalidOptionError('coord/non-finite', `${attribute} must be a finite number of EMU, got ${value}`)\n\tif (!allowNegative && value < 0)\n\t\tthrow new InvalidOptionError('coord/negative', `${attribute} must be non-negative, got ${value}`)\n\treturn Math.round(value)\n}\n\n/** A point + extent pair (`a:off`/`a:ext` or `a:chOff`/`a:chExt`) from a transform, or `null` if either is incomplete. */\nexport function readBox(\n\txfrm: Element,\n\toffName: string,\n\textName: string\n): { x: number; y: number; cx: number; cy: number } | null {\n\tconst off = firstChild(xfrm, offName)\n\tconst ext = firstChild(xfrm, extName)\n\tconst x = off && intValue(attr(off, 'x'))\n\tconst y = off && intValue(attr(off, 'y'))\n\tconst cx = ext && intValue(attr(ext, 'cx'))\n\tconst cy = ext && intValue(attr(ext, 'cy'))\n\tif (x === null || y === null || cx === null || cy === null) return null\n\treturn { x, y, cx, cy }\n}\n\nexport function rotationDegrees(xfrm: Element): number {\n\tconst rot = intValue(attr(xfrm, 'rot'))\n\treturn rot === null ? 0 : rot / ANGLE_UNITS_PER_DEGREE\n}\n\nexport function transformFlipH(xfrm: Element): boolean {\n\treturn boolValue(attr(xfrm, 'flipH')) === true\n}\n\nexport function transformFlipV(xfrm: Element): boolean {\n\treturn boolValue(attr(xfrm, 'flipV')) === true\n}\n","/**\n * Group-shape transform composition — the `p:grpSp` child-space mapping, shared\n * by every surface that needs slide-absolute geometry.\n *\n * A `p:grpSp` declares two frames on its `a:xfrm`: where it sits on the slide\n * (`a:off`/`a:ext`) and the coordinate space its children are authored in\n * (`a:chOff`/`a:chExt`). A child's own `a:off`/`a:ext` is expressed in that child\n * space, so it is not directly placeable on the slide — it must be mapped through\n * `off + (p - chOff) * (ext / chExt)` for every enclosing group, with the group's\n * `@rot`/`@flipH`/`@flipV` composed on top.\n *\n * This module is deliberately **pure**: it takes decoded numbers, not XML, so the\n * mapping stays one implementation no matter how many surfaces need it. It was\n * shared between two independent readers before the inspect surface became a\n * projection over the read model; today `Shape.absoluteFrame` is the only caller,\n * and the separation still earns its keep by keeping the arithmetic testable\n * without a package to parse.\n */\n\n/** A position + extent pair in EMU (`a:off`/`a:ext`, or `a:chOff`/`a:chExt`). */\ninterface TransformBox {\n\tx: number\n\ty: number\n\tcx: number\n\tcy: number\n}\n\n/** A shape's own `a:xfrm`, decoded. `rotation` is in degrees (the raw `@rot` / 60000). */\ninterface ShapeTransform {\n\tbox: TransformBox\n\trotation: number\n\tflipH: boolean\n\tflipV: boolean\n}\n\n/**\n * An enclosing `p:grpSp`'s `a:xfrm`, decoded: `outer` is the group's own frame on\n * the slide (`a:off`/`a:ext`), `child` the space its children are authored in\n * (`a:chOff`/`a:chExt`).\n */\nexport interface GroupTransform {\n\touter: TransformBox\n\tchild: TransformBox\n\trotation: number\n\tflipH: boolean\n\tflipV: boolean\n}\n\n/** A slide-absolute frame: the unrotated placement box plus effective orientation. */\ninterface ComposedFrame {\n\tbox: TransformBox\n\t/** Effective clockwise rotation in degrees, normalised to [0, 360). */\n\trotation: number\n\t/** Effective horizontal flip, XOR-composed across the group chain. */\n\tflipH: boolean\n\t/** Effective vertical flip, XOR-composed across the group chain. */\n\tflipV: boolean\n}\n\n/** Normalise a degree value into [0, 360). */\nfunction normalizeDegrees(value: number): number {\n\treturn ((value % 360) + 360) % 360\n}\n\n/** Rotate `point` clockwise about `center` by `degrees`. */\nfunction rotatePoint(\n\tpoint: { x: number; y: number },\n\tcenter: { x: number; y: number },\n\tdegrees: number\n): { x: number; y: number } {\n\tif (degrees === 0) return point\n\tconst angle = (degrees * Math.PI) / 180\n\tconst cos = Math.cos(angle)\n\tconst sin = Math.sin(angle)\n\tconst dx = point.x - center.x\n\tconst dy = point.y - center.y\n\treturn {\n\t\tx: center.x + cos * dx - sin * dy,\n\t\ty: center.y + sin * dx + cos * dy,\n\t}\n}\n\n/**\n * Compose a shape's own transform with every enclosing group transform into a\n * slide-absolute frame.\n *\n * `groups` runs **innermost first** (the shape's immediate `p:grpSp` parent, then\n * outward). An empty list returns the shape's own box and orientation unchanged.\n *\n * The returned `box` is the *unrotated* placement box — the same box PowerPoint\n * writes when you Ungroup — with the effective rotation reported separately.\n * Values are exact; callers round or convert units as they see fit.\n *\n * Returns `null` when a group's `a:chExt` is degenerate (zero on either axis):\n * the child-space ratio is then undefined and there is no resolvable frame.\n */\nexport function composeGroupFrame(shape: ShapeTransform, groups: GroupTransform[]): ComposedFrame | null {\n\tlet center = { x: shape.box.x + shape.box.cx / 2, y: shape.box.y + shape.box.cy / 2 }\n\tlet width = shape.box.cx\n\tlet height = shape.box.cy\n\tlet flipH = shape.flipH\n\tlet flipV = shape.flipV\n\n\t// Group centres are collected on the way out, then rotated on the way back in:\n\t// an outer group rotates the centres of the inner groups nested inside it, so\n\t// the two passes cannot be merged.\n\tconst chain: { center: { x: number; y: number }; rotation: number; flipH: boolean; flipV: boolean }[] = []\n\n\tfor (const group of groups) {\n\t\tif (group.child.cx === 0 || group.child.cy === 0) return null // degenerate child frame — no resolvable mapping\n\t\tconst ratioX = group.outer.cx / group.child.cx\n\t\tconst ratioY = group.outer.cy / group.child.cy\n\n\t\tconst mapPoint = (point: { x: number; y: number }): { x: number; y: number } => {\n\t\t\tlet x = group.outer.x + (point.x - group.child.x) * ratioX\n\t\t\tlet y = group.outer.y + (point.y - group.child.y) * ratioY\n\t\t\tif (group.flipH) x = group.outer.x + group.outer.cx - (x - group.outer.x)\n\t\t\tif (group.flipV) y = group.outer.y + group.outer.cy - (y - group.outer.y)\n\t\t\treturn { x, y }\n\t\t}\n\t\tcenter = mapPoint(center)\n\t\tfor (const entry of chain) entry.center = mapPoint(entry.center)\n\t\twidth *= Math.abs(ratioX)\n\t\theight *= Math.abs(ratioY)\n\t\tchain.push({\n\t\t\tcenter: { x: group.outer.x + group.outer.cx / 2, y: group.outer.y + group.outer.cy / 2 },\n\t\t\trotation: group.rotation,\n\t\t\tflipH: group.flipH,\n\t\t\tflipV: group.flipV,\n\t\t})\n\t\tflipH = flipH !== group.flipH\n\t\tflipV = flipV !== group.flipV\n\t}\n\n\tlet rotation = 0\n\t// A group flipped on exactly one axis mirrors the sense of every rotation\n\t// nested inside it, so track orientation as the chain is walked back inward.\n\tlet orientation = 1\n\tfor (let index = chain.length - 1; index >= 0; index--) {\n\t\tconst group = chain[index]\n\t\tif (!group) continue\n\t\tconst groupRotation = group.rotation * orientation\n\t\tcenter = rotatePoint(center, group.center, groupRotation)\n\t\tfor (let innerIndex = 0; innerIndex < index; innerIndex++) {\n\t\t\tconst inner = chain[innerIndex]\n\t\t\tif (inner) inner.center = rotatePoint(inner.center, group.center, groupRotation)\n\t\t}\n\t\trotation += groupRotation\n\t\tif (group.flipH !== group.flipV) orientation *= -1\n\t}\n\n\treturn {\n\t\tbox: { x: center.x - width / 2, y: center.y - height / 2, cx: width, cy: height },\n\t\trotation: normalizeDegrees(rotation + shape.rotation * orientation),\n\t\tflipH,\n\t\tflipV,\n\t}\n}\n","/**\n * Read/write proxies for a shape's text: `TextFrame → Paragraph[] → Run[]`.\n *\n * Each proxy wraps a live DOM element (`a:txBody`, `a:p`, `a:r`) and holds the\n * owning `Part`, so a setter can mutate the node in place and call\n * `part.markDirty()` — that single flag is what makes `save()` reserialize the\n * part. Getters compute from the DOM on each access rather than caching.\n */\nimport type { Part } from '../opc/part.js'\nimport type { Relationships } from '../opc/relationships.js'\nimport {\n\tELEMENT_NODE,\n\tattr,\n\tboolValue,\n\tchildElements,\n\tcreateElement,\n\tfirstChild,\n\tfirstChildElement,\n\tgetElements,\n\tgetOrAddChild,\n\tintValue,\n\tremoveAttr,\n\tremoveChildrenByQName,\n\tsetAttr,\n\ttype Element,\n} from '../oxml/dom.js'\nimport { normalizeHex, setSolidFill, solidFillColor } from '../oxml/fill.js'\nimport { resolveThemeFont, type ThemeContext } from '../oxml/theme.js'\nimport {\n\tresolveColorElement,\n\tresolveInheritedAnchor,\n\tresolveInheritedRunBold,\n\tresolveInheritedRunItalic,\n\tresolveInheritedRunColor,\n\tresolveInheritedRunFontFace,\n\tresolveInheritedRunSize,\n\tresolveSolidFillColor,\n\ttype PlaceholderRef,\n\ttype ResolvedColor,\n\ttype StyleFontRef,\n} from './theme-context.js'\nimport { InternalError, InvalidOptionError } from '../../errors.js'\nimport { EMU_PER_POINT } from '../../units.js'\n\n/**\n * What a {@link Run}'s text body needs to resolve an *inherited* run\n * colour/size/face/bold: which placeholder the text lives in (or `null` for a\n * non-placeholder shape, which still resolves its `p:style/a:fontRef` and the\n * presentation `p:defaultTextStyle`), the slide theme context (with the\n * layout/master roots) to resolve against, and the shape's resolved\n * `p:style/a:fontRef` text tier. The owning slide's text body `a:lstStyle` is added\n * per text frame. Absent only for text reached without a theme context (table cells).\n */\ninterface PlaceholderTextContext {\n\tph: PlaceholderRef | null\n\tflatten: ThemeContext\n\t/** The shape's resolved `p:style/a:fontRef` colour + face tier, or `null` when it has none. */\n\tfontRef?: StyleFontRef | null\n}\n\n/**\n * A run's click hyperlink (`a:rPr/a:hlinkClick`): a link on a span of text. A URL\n * link carries an external {@link url}; a slide jump carries the internal\n * {@link targetPartName} (the linked slide's part) alongside its `hlinksldjump`\n * {@link action}. `tooltip` and `relId` are surfaced when present.\n */\nexport interface RunHyperlink {\n\t/** External URL target (its `@r:id` resolves to a `TargetMode=\"External\"` rel), or `null` for an internal/action-only link. */\n\turl: string | null\n\t/** Absolute partname of an internal target (e.g. the slide a jump points at), or `null`. */\n\ttargetPartName: string | null\n\t/** Navigation action token (`@action`, e.g. `ppaction://hlinksldjump`), or `null` when absent/empty. */\n\taction: string | null\n\t/** Tooltip text (`@tooltip`), or `null` when absent/empty. */\n\ttooltip: string | null\n\t/** The relationship id (`@r:id`) backing the link, or `null` when the link is action-only. */\n\trelId: string | null\n}\n\n/**\n * A paragraph's line spacing (`a:pPr/a:lnSpc`), in whichever of the two OOXML\n * forms the file uses: an exact point height (`a:spcPts`) or a percentage of the\n * single-line height (`a:spcPct` — e.g. `percent: 150` for 1.5× spacing).\n */\nexport type LineSpacing = { type: 'points'; valuePt: number } | { type: 'percent'; percent: number }\n\n/**\n * The bullet's own font, size and colour (`a:buFont` / `a:buSzPct` / `a:buSzPts` /\n * `a:buClr`) — the properties that style the glyph or number itself rather than\n * the text after it. Every field is `null` when the paragraph leaves it to be\n * inherited from the list style.\n *\n * These are siblings of the bullet kind in `a:pPr`, not children of it, so they\n * are carried alongside each kind rather than inside it.\n */\nexport interface BulletStyle {\n\t/** `a:buFont/@typeface` — the face the glyph is drawn in (a symbol font such as `Wingdings`), or `null`. */\n\tfont: string | null\n\t/** `a:buSzPct/@val` as a percentage of the run size (e.g. `80`; the raw attribute is thousandths of a percent), or `null`. */\n\tsizePct: number | null\n\t/** `a:buSzPts/@val` as an absolute point size (the raw attribute is hundredths of a point), or `null`. The alternative to {@link sizePct}; at most one is set. */\n\tsizePt: number | null\n\t/** Explicit RGB bullet colour as 6-hex (`a:buClr/a:srgbClr/@val`), or `null`. */\n\tcolor: string | null\n\t/** Theme colour token when the bullet colour is a scheme colour (`a:buClr/a:schemeClr/@val`), or `null`. */\n\tschemeColor: string | null\n\t/** The bullet colour resolved against the slide theme with its transforms applied, or `null` when unset or not resolvable to a literal. */\n\tresolvedColor: ResolvedColor | null\n}\n\n/**\n * A paragraph's bullet, as the structured counterpart of the `a:pPr` bullet\n * children. Discriminated on {@link kind}, which is one of the four mutually\n * exclusive choices the schema allows:\n *\n * - `'none'` — `a:buNone`, the bullet explicitly suppressed. Carries no style,\n * because there is no glyph to style.\n * - `'char'` — `a:buChar`, a literal glyph.\n * - `'autoNum'` — `a:buAutoNum`, an auto-numbered list.\n * - `'picture'` — `a:buBlip`, an image used as the glyph.\n *\n * A paragraph that names none of them inherits its bullet from the list style and\n * reports `null` rather than a member of this union.\n */\nexport type BulletDetail =\n\t| { kind: 'none' }\n\t| ({\n\t\t\tkind: 'char'\n\t\t\t/** The glyph itself (`a:buChar/@char`) — a bare character, never a tagged string. */\n\t\t\tchar: string\n\t } & BulletStyle)\n\t| ({\n\t\t\tkind: 'autoNum'\n\t\t\t/** The numbering scheme (`a:buAutoNum/@type`, e.g. `arabicPeriod`). */\n\t\t\tscheme: string\n\t\t\t/**\n\t\t\t * The number this list starts at (`a:buAutoNum/@startAt`), or `null` when\n\t\t\t * unset (the schema default is 1). Content rather than styling: a list\n\t\t\t * continuing \"5. Deploy\" that restarts at 1 is a different slide.\n\t\t\t */\n\t\t\tstartAt: number | null\n\t } & BulletStyle)\n\t| ({\n\t\t\tkind: 'picture'\n\t\t\t/**\n\t\t\t * Absolute partname of the image used as the glyph (`a:buBlip/a:blip/@r:embed`,\n\t\t\t * resolved through the owning part's relationships), or `null` when the\n\t\t\t * paragraph was reached without them or the blip carries no `r:embed`.\n\t\t\t */\n\t\t\timagePartName: string | null\n\t } & BulletStyle)\n\n// Schema successors used to keep `a:rPr` children in document order when a\n// setter has to create one (CT_TextCharacterProperties sequence).\nconst RPR_AFTER_FILL = [\n\t'a:effectLst',\n\t'a:effectDag',\n\t'a:highlight',\n\t'a:uLnTx',\n\t'a:uLn',\n\t'a:uFillTx',\n\t'a:uFill',\n\t'a:latin',\n\t'a:ea',\n\t'a:cs',\n\t'a:sym',\n\t'a:hlinkClick',\n\t'a:hlinkMouseOver',\n\t'a:rtl',\n\t'a:extLst',\n]\nconst RPR_AFTER_LATIN = ['a:ea', 'a:cs', 'a:sym', 'a:hlinkClick', 'a:hlinkMouseOver', 'a:rtl', 'a:extLst']\n\n/** One text run (`a:r`): a span of text with uniform character formatting. */\nexport class Run {\n\tconstructor(\n\t\tprivate readonly element: Element,\n\t\tprivate readonly part: Part,\n\t\t/** The owning slide's theme context (colour maps + `fontScheme`), for the `resolved*` getters; absent when the run was reached without one. */\n\t\tprivate readonly themeContext?: ThemeContext,\n\t\t/**\n\t\t * Resolves the colour this run inherits from its placeholder/list-style chain\n\t\t * when it sets none of its own (item A). Built by the owning {@link Paragraph}\n\t\t * for placeholder text; absent for non-placeholder runs. Called lazily.\n\t\t */\n\t\tprivate readonly inheritedColor?: () => ResolvedColor | null,\n\t\t/**\n\t\t * Resolves the point size this run inherits from the same chain when it sets no\n\t\t * own `@sz`. Built by the owning {@link Paragraph} for placeholder text; absent\n\t\t * for non-placeholder runs. Called lazily.\n\t\t */\n\t\tprivate readonly inheritedSize?: () => number | null,\n\t\t/**\n\t\t * Resolves the typeface this run inherits from the same chain (a `+mj-*`/`+mn-*`\n\t\t * theme token already resolved to a literal face) when it sets no own `a:latin`.\n\t\t * Built by the owning {@link Paragraph} for placeholder text; absent otherwise.\n\t\t * Called lazily.\n\t\t */\n\t\tprivate readonly inheritedFace?: () => string | null,\n\t\t/**\n\t\t * Resolves whether this run inherits bold from the same chain when it sets no\n\t\t * own `@b`. Built by the owning {@link Paragraph} for placeholder text; absent\n\t\t * for non-placeholder runs. Called lazily.\n\t\t */\n\t\tprivate readonly inheritedBold?: () => boolean | null,\n\t\t/**\n\t\t * Resolves whether this run inherits italic from the same chain when it sets no\n\t\t * own `@i`. Built by the owning {@link Paragraph} for placeholder text; absent\n\t\t * for non-placeholder runs. Called lazily.\n\t\t */\n\t\tprivate readonly inheritedItalic?: () => boolean | null,\n\t\t/**\n\t\t * The owning part's relationships, used to resolve a run hyperlink's `@r:id`\n\t\t * to its external URL or internal target partname. Absent when the run was\n\t\t * reached without them (e.g. table-cell or notes text), in which case\n\t\t * {@link hyperlink} still reports the raw `@r:id`/`@action`/`@tooltip`.\n\t\t */\n\t\tprivate readonly relationships?: Relationships,\n\t\t/**\n\t\t * The owning shape's resolved `p:style/a:fontRef` colour + face tier — the\n\t\t * fallback consulted for {@link resolvedColor}/{@link resolvedFontFace} just\n\t\t * below the run's own `a:rPr` and above the placeholder/`p:defaultTextStyle`\n\t\t * chain. Absent when the shape has no `p:style/a:fontRef`.\n\t\t */\n\t\tprivate readonly fontRef?: StyleFontRef | null\n\t) {}\n\n\t/** The run's text (`a:t`), verbatim — whitespace is not normalized. */\n\tget text(): string {\n\t\treturn firstChild(this.element, 'a:t')?.textContent ?? ''\n\t}\n\n\tset text(value: string) {\n\t\tconst t = getOrAddChild(this.element, 'a:t')\n\t\tt.textContent = value\n\t\t// Preserve significant leading/trailing whitespace per the XML spec.\n\t\tif (value !== value.trim()) setAttr(t, 'xml:space', 'preserve')\n\t\telse removeAttr(t, 'xml:space')\n\t\tthis.part.markDirty()\n\t}\n\n\t/** Font size in points (`a:rPr/@sz` is hundredths of a point), or `null` if unset. */\n\tget fontSizePt(): number | null {\n\t\tconst size = this.#rPrAttr('sz')\n\t\treturn size === null ? null : size / 100\n\t}\n\n\tset fontSizePt(value: number | null) {\n\t\tif (value === null) {\n\t\t\tthis.#removeRPrAttr('sz')\n\t\t\treturn\n\t\t}\n\t\tif (!Number.isFinite(value) || value <= 0)\n\t\t\tthrow new InvalidOptionError('font/size-not-positive', `fontSizePt must be a positive number, got ${value}`)\n\t\tsetAttr(this.#getOrAddRPr(), 'sz', String(Math.round(value * 100)))\n\t\tthis.part.markDirty()\n\t}\n\n\t/** Bold (`a:rPr/@b`), or `null` when unset (inherited from style). */\n\tget bold(): boolean | null {\n\t\treturn boolValue(this.#rPrAttrRaw('b'))\n\t}\n\n\tset bold(value: boolean | null) {\n\t\tthis.#setBoolRPrAttr('b', value)\n\t}\n\n\t/** Italic (`a:rPr/@i`), or `null` when unset (inherited from style). */\n\tget italic(): boolean | null {\n\t\treturn boolValue(this.#rPrAttrRaw('i'))\n\t}\n\n\tset italic(value: boolean | null) {\n\t\tthis.#setBoolRPrAttr('i', value)\n\t}\n\n\t/** Underline style token (`a:rPr/@u`, e.g. `sng`), or `null` when unset. */\n\tget underline(): string | null {\n\t\treturn this.#rPrAttrRaw('u')\n\t}\n\n\tset underline(value: string | null) {\n\t\tif (value === null) {\n\t\t\tthis.#removeRPrAttr('u')\n\t\t\treturn\n\t\t}\n\t\tsetAttr(this.#getOrAddRPr(), 'u', value)\n\t\tthis.part.markDirty()\n\t}\n\n\t/**\n\t * Strikethrough token (`a:rPr/@strike`: `noStrike` | `sngStrike` |\n\t * `dblStrike`), or `null` when unset (inherited from the style). Surfaced as\n\t * the raw token — `sngStrike` is the writer's single-strike value.\n\t */\n\tget strike(): string | null {\n\t\treturn this.#rPrAttrRaw('strike')\n\t}\n\n\t/**\n\t * Capitalization token (`a:rPr/@cap`: `none` | `small` | `all`), or `null`\n\t * when unset. `small` renders small-caps, `all` renders all-caps.\n\t */\n\tget caps(): string | null {\n\t\treturn this.#rPrAttrRaw('cap')\n\t}\n\n\t/**\n\t * Baseline shift as a percentage of the font size (`a:rPr/@baseline`, stored\n\t * in 1000ths of a percent): positive for superscript (the writer's default is\n\t * `30`), negative for subscript (`-40`), or `null` when unset. Reported as the\n\t * percentage (`@baseline` ÷ 1000).\n\t */\n\tget baselinePct(): number | null {\n\t\tconst raw = this.#rPrAttr('baseline')\n\t\treturn raw === null ? null : raw / 1000\n\t}\n\n\t/**\n\t * Character spacing (tracking) in points (`a:rPr/@spc`, authored in hundredths\n\t * of a point), or `null` when unset. Negative tightens. The read counterpart of\n\t * the write-side `charSpacing` option.\n\t */\n\tget charSpacingPt(): number | null {\n\t\tconst raw = this.#rPrAttr('spc')\n\t\treturn raw === null ? null : raw / 100\n\t}\n\n\t/**\n\t * The run's highlight colour (`a:rPr/a:highlight`), resolved to a literal hex\n\t * through the owning slide's theme, or `null` when the run has no highlight\n\t * (or a token colour cannot be made literal without a theme context). The\n\t * writer authors highlights from a hex colour, so `effectiveHex` is that\n\t * colour; imported decks may carry a theme token, resolved here when possible.\n\t */\n\tget highlight(): ResolvedColor | null {\n\t\tconst rPr = this.#rPr()\n\t\tconst hl = rPr && firstChild(rPr, 'a:highlight')\n\t\tif (!hl) return null\n\t\tconst colorEl = firstChildElement(hl)\n\t\tif (!colorEl) return null\n\t\tif (this.themeContext) return resolveColorElement(colorEl, this.themeContext)\n\t\t// Without a theme context only a literal srgbClr can be made concrete.\n\t\tconst hex = colorEl.localName === 'srgbClr' ? attr(colorEl, 'val') : null\n\t\treturn hex ? { hex, transforms: [], effectiveHex: hex } : null\n\t}\n\n\t/**\n\t * The run's click hyperlink (`a:rPr/a:hlinkClick`), or `null` when the run\n\t * carries none. A URL link resolves its `@r:id` to the external target\n\t * ({@link RunHyperlink.url}); a slide jump resolves it to the linked slide's\n\t * partname ({@link RunHyperlink.targetPartName}). When the run was reached\n\t * without the owning part's relationships, only the raw `@r:id`/`@action`/\n\t * `@tooltip` are reported (the target stays `null`).\n\t */\n\tget hyperlink(): RunHyperlink | null {\n\t\tconst rPr = this.#rPr()\n\t\tconst hlink = rPr && firstChild(rPr, 'a:hlinkClick')\n\t\tif (!hlink) return null\n\t\tconst relId = attr(hlink, 'r:id') || null\n\t\tconst action = attr(hlink, 'action') || null\n\t\tconst tooltip = attr(hlink, 'tooltip') || null\n\t\tlet url: string | null = null\n\t\tlet targetPartName: string | null = null\n\t\tif (relId && this.relationships) {\n\t\t\tconst rel = this.relationships.get(relId)\n\t\t\tif (rel?.targetMode === 'External') url = rel.target\n\t\t\telse if (rel) targetPartName = this.relationships.resolveTarget(relId)\n\t\t}\n\t\treturn { url, targetPartName, action, tooltip, relId }\n\t}\n\n\t/** Latin typeface name (`a:rPr/a:latin/@typeface`), or `null` when unset. */\n\tget fontName(): string | null {\n\t\tconst rPr = this.#rPr()\n\t\tconst latin = rPr && firstChild(rPr, 'a:latin')\n\t\treturn latin ? attr(latin, 'typeface') : null\n\t}\n\n\tset fontName(value: string | null) {\n\t\tif (value === null) {\n\t\t\tconst rPr = this.#rPr()\n\t\t\tif (rPr) removeChildrenByQName(rPr, ['a:latin'])\n\t\t\tif (rPr) this.part.markDirty()\n\t\t\treturn\n\t\t}\n\t\tconst latin = getOrAddChild(this.#getOrAddRPr(), 'a:latin', RPR_AFTER_LATIN)\n\t\tsetAttr(latin, 'typeface', value)\n\t\tthis.part.markDirty()\n\t}\n\n\t/** Explicit RGB fill colour as a 6-hex string (`a:solidFill/a:srgbClr/@val`), or `null`. */\n\tget color(): string | null {\n\t\treturn solidFillColor(this.#rPr(), 'a:srgbClr')\n\t}\n\n\tset color(value: string | null) {\n\t\tthis.#setSolidFill(value === null ? null : { qname: 'a:srgbClr', val: normalizeHex(value) })\n\t}\n\n\t/** Theme colour token when the fill is a scheme colour (`a:schemeClr/@val`, e.g. `accent2`), or `null`. */\n\tget schemeColor(): string | null {\n\t\treturn solidFillColor(this.#rPr(), 'a:schemeClr')\n\t}\n\n\tset schemeColor(value: string | null) {\n\t\tthis.#setSolidFill(value === null ? null : { qname: 'a:schemeClr', val: value })\n\t}\n\n\t/**\n\t * The colour this run effectively renders, resolved against the owning slide's\n\t * theme to a literal hex. It is the run's own solid fill\n\t * ({@link color}/{@link schemeColor}) when set; otherwise the shape's\n\t * `p:style/a:fontRef` colour, then — for a run inside a placeholder — the colour\n\t * it inherits from the placeholder/list-style chain (layout → master placeholder\n\t * `a:lstStyle` → master `p:txStyles`), then the presentation's\n\t * `p:defaultTextStyle`. `null` when the run sets no colour and inherits none, the\n\t * colour cannot be made literal, or the run was reached without a theme context.\n\t * The returned {@link ResolvedColor} carries `effectiveHex` — the base colour with\n\t * its child transforms (`lumMod`/`shade`/…) applied — for the final rendered colour.\n\t */\n\tget resolvedColor(): ResolvedColor | null {\n\t\tif (!this.themeContext) return null\n\t\treturn (\n\t\t\tresolveSolidFillColor(this.#rPr(), this.themeContext) ?? this.fontRef?.color ?? this.inheritedColor?.() ?? null\n\t\t)\n\t}\n\n\t/**\n\t * The point size this run effectively renders. It is the run's own `@sz`\n\t * ({@link fontSizePt}) when set; otherwise, for a run inside a placeholder, the\n\t * size it inherits from the placeholder/list-style chain (paragraph `a:defRPr` →\n\t * slide `a:lstStyle` → layout → master placeholder `a:lstStyle` → master\n\t * `p:txStyles`). `null` when the run sets no size and inherits none — the\n\t * resolved counterpart of {@link fontSizePt}, which reports only the run's own value.\n\t */\n\tget resolvedSizePt(): number | null {\n\t\treturn this.fontSizePt ?? this.inheritedSize?.() ?? null\n\t}\n\n\t/**\n\t * The typeface this run effectively renders, resolved to a literal face name. It\n\t * is the run's own `a:latin` ({@link fontName}) when set; otherwise the face named\n\t * by the shape's `p:style/a:fontRef` (`idx` → theme major/minor font), then — for a\n\t * run inside a placeholder — the face it inherits from the placeholder/list-style\n\t * chain, then the presentation's `p:defaultTextStyle`. A `+mj-*`/`+mn-*`\n\t * major/minor theme-font token — on the run itself or reached through the chain —\n\t * is resolved through the theme `fontScheme` to its concrete face. `null` when the\n\t * run names no face and inherits none, or a token cannot be resolved — the resolved\n\t * counterpart of {@link fontName}, which reports the raw `@typeface` (possibly a token).\n\t */\n\tget resolvedFontFace(): string | null {\n\t\tconst own = this.fontName\n\t\tif (own !== null) return resolveThemeFont(own, this.themeContext?.fontScheme ?? null)\n\t\treturn this.fontRef?.face ?? this.inheritedFace?.() ?? null\n\t}\n\n\t/**\n\t * Whether this run effectively renders bold. It is the run's own `@b`\n\t * ({@link bold}) when set; otherwise, for a run inside a placeholder, the bold\n\t * state it inherits from the placeholder/list-style chain (paragraph `a:defRPr` →\n\t * slide `a:lstStyle` → layout → master placeholder `a:lstStyle` → master\n\t * `p:txStyles`). `null` when the run sets no `@b` and inherits none — the\n\t * resolved counterpart of {@link bold}, which reports only the run's own value.\n\t */\n\tget resolvedBold(): boolean | null {\n\t\treturn this.bold ?? this.inheritedBold?.() ?? null\n\t}\n\n\t/**\n\t * Whether this run effectively renders italic. It is the run's own `@i`\n\t * ({@link italic}) when set; otherwise, for a run inside a placeholder, the italic\n\t * state it inherits from the placeholder/list-style chain (paragraph `a:defRPr` →\n\t * slide `a:lstStyle` → layout → master placeholder `a:lstStyle` → master\n\t * `p:txStyles`). `null` when the run sets no `@i` and inherits none — the\n\t * resolved counterpart of {@link italic}, and the twin of {@link resolvedBold}:\n\t * `@b` and `@i` are siblings a master text style states together, so a deck that\n\t * can be authored with an inherited italic can be read back with one.\n\t */\n\tget resolvedItalic(): boolean | null {\n\t\treturn this.italic ?? this.inheritedItalic?.() ?? null\n\t}\n\n\t/** Escape hatch: the underlying `a:r` element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */\n\tget element_(): Element {\n\t\treturn this.element\n\t}\n\n\t/** Mark the owning part dirty so `save()` reserializes it. Call after mutating {@link element_}. */\n\tmarkDirty(): void {\n\t\tthis.part.markDirty()\n\t}\n\n\t#rPr(): Element | null {\n\t\treturn firstChild(this.element, 'a:rPr')\n\t}\n\n\t#getOrAddRPr(): Element {\n\t\treturn getOrAddChild(this.element, 'a:rPr', ['a:t'])\n\t}\n\n\t#rPrAttrRaw(name: string): string | null {\n\t\tconst rPr = this.#rPr()\n\t\treturn rPr ? attr(rPr, name) : null\n\t}\n\n\t#rPrAttr(name: string): number | null {\n\t\treturn intValue(this.#rPrAttrRaw(name))\n\t}\n\n\t#removeRPrAttr(name: string): void {\n\t\tconst rPr = this.#rPr()\n\t\tif (!rPr) return\n\t\tremoveAttr(rPr, name)\n\t\tthis.part.markDirty()\n\t}\n\n\t#setBoolRPrAttr(name: string, value: boolean | null): void {\n\t\tif (value === null) {\n\t\t\tthis.#removeRPrAttr(name)\n\t\t\treturn\n\t\t}\n\t\tsetAttr(this.#getOrAddRPr(), name, value ? '1' : '0')\n\t\tthis.part.markDirty()\n\t}\n\n\t/** Replace the run's solid fill with a single colour element, or clear it when `null`. */\n\t#setSolidFill(color: { qname: string; val: string } | null): void {\n\t\tif (color === null) {\n\t\t\tconst rPr = this.#rPr()\n\t\t\tif (!rPr) return\n\t\t\tremoveChildrenByQName(rPr, ['a:solidFill'])\n\t\t\tthis.part.markDirty()\n\t\t\treturn\n\t\t}\n\t\tsetSolidFill(this.#getOrAddRPr(), RPR_AFTER_FILL, color)\n\t\tthis.part.markDirty()\n\t}\n}\n\n/** One paragraph (`a:p`) of a text frame. */\nexport class Paragraph {\n\tconstructor(\n\t\tprivate readonly element: Element,\n\t\tprivate readonly part: Part,\n\t\t/** The owning slide's theme context (colour maps + `fontScheme`), threaded to each {@link Run} for the `resolved*` getters. */\n\t\tprivate readonly themeContext?: ThemeContext,\n\t\t/**\n\t\t * Placeholder + slide-list-style context for resolving a placeholder-inherited\n\t\t * run colour/size/face; absent for non-placeholder text. The owning\n\t\t * {@link TextFrame} supplies the placeholder identity and the text body's\n\t\t * `a:lstStyle`.\n\t\t */\n\t\tprivate readonly inherit?: { placeholder: PlaceholderTextContext; slideLstStyle: Element | null },\n\t\t/** The owning part's relationships, threaded to each {@link Run} for hyperlink `@r:id` resolution; absent when reached without them. */\n\t\tprivate readonly relationships?: Relationships\n\t) {}\n\n\t/** The runs (`a:r`) in document order. Fields (`a:fld`) and breaks are not runs; see `text`. */\n\tget runs(): Run[] {\n\t\tconst inheritedColor = this.#inheritedColorResolver()\n\t\tconst inheritedSize = this.#inheritedResolver((ph, level, pPr, slideLst, ctx) =>\n\t\t\tresolveInheritedRunSize(ph, level, pPr, slideLst, ctx)\n\t\t)\n\t\tconst inheritedFace = this.#inheritedResolver((ph, level, pPr, slideLst, ctx) =>\n\t\t\tresolveInheritedRunFontFace(ph, level, pPr, slideLst, ctx)\n\t\t)\n\t\tconst inheritedBold = this.#inheritedResolver((ph, level, pPr, slideLst, ctx) =>\n\t\t\tresolveInheritedRunBold(ph, level, pPr, slideLst, ctx)\n\t\t)\n\t\tconst inheritedItalic = this.#inheritedResolver((ph, level, pPr, slideLst, ctx) =>\n\t\t\tresolveInheritedRunItalic(ph, level, pPr, slideLst, ctx)\n\t\t)\n\t\tconst fontRef = this.inherit?.placeholder.fontRef ?? null\n\t\treturn getElements(this.element, 'a:r').map(\n\t\t\t(element) =>\n\t\t\t\tnew Run(\n\t\t\t\t\telement,\n\t\t\t\t\tthis.part,\n\t\t\t\t\tthis.themeContext,\n\t\t\t\t\tinheritedColor,\n\t\t\t\t\tinheritedSize,\n\t\t\t\t\tinheritedFace,\n\t\t\t\t\tinheritedBold,\n\t\t\t\t\tinheritedItalic,\n\t\t\t\t\tthis.relationships,\n\t\t\t\t\tfontRef\n\t\t\t\t)\n\t\t)\n\t}\n\n\t/**\n\t * A memoized thunk resolving the colour every run in this paragraph inherits\n\t * when it sets none of its own, or `undefined` for non-placeholder paragraphs.\n\t * Runs in one paragraph share a level and `a:pPr`, so the lookup runs at most\n\t * once per paragraph and only when a colourless run actually asks for it.\n\t */\n\t#inheritedColorResolver(): (() => ResolvedColor | null) | undefined {\n\t\treturn this.#inheritedResolver((ph, level, pPr, slideLst, ctx) =>\n\t\t\tresolveInheritedRunColor(ph, level, pPr, slideLst, ctx)\n\t\t)\n\t}\n\n\t/**\n\t * Build a memoized per-paragraph thunk for one inherited run property\n\t * (colour/size/face/bold/italic), or `undefined` for non-placeholder paragraphs. All runs in\n\t * a paragraph share its level and `a:pPr`, so each `resolve` runs at most once\n\t * and only when a run actually lacks its own value and asks.\n\t */\n\t#inheritedResolver<T>(\n\t\tresolve: (\n\t\t\tph: PlaceholderRef | null,\n\t\t\tlevel: number,\n\t\t\tpPr: Element | null,\n\t\t\tslideLstStyle: Element | null,\n\t\t\tctx: ThemeContext\n\t\t) => T | null\n\t): (() => T | null) | undefined {\n\t\tif (!this.inherit) return undefined\n\t\tconst { placeholder, slideLstStyle } = this.inherit\n\t\tconst pPr = firstChild(this.element, 'a:pPr')\n\t\tconst level = this.level\n\t\tlet cached: T | null | undefined\n\t\treturn () =>\n\t\t\tcached === undefined ? (cached = resolve(placeholder.ph, level, pPr, slideLstStyle, placeholder.flatten)) : cached\n\t}\n\n\t/** Indent level (`a:pPr/@lvl`), 0 when unset. */\n\tget level(): number {\n\t\tconst pPr = firstChild(this.element, 'a:pPr')\n\t\treturn (pPr && intValue(attr(pPr, 'lvl'))) ?? 0\n\t}\n\n\t/**\n\t * Horizontal alignment token (`a:pPr/@algn`: `l` | `ctr` | `r` | `just` |\n\t * `dist` | `thaiDist`), or `null` when unset (inherited from the list style).\n\t */\n\tget align(): string | null {\n\t\tconst pPr = firstChild(this.element, 'a:pPr')\n\t\treturn pPr ? attr(pPr, 'algn') : null\n\t}\n\n\t/**\n\t * Space before the paragraph in points (`a:pPr/a:spcBef/a:spcPts/@val` is\n\t * hundredths of a point), or `null` when unset or expressed as a percentage\n\t * (`a:spcPct`, which has no fixed point value).\n\t */\n\tget spaceBeforePt(): number | null {\n\t\treturn this.#spacingPt('a:spcBef')\n\t}\n\n\t/** Space after the paragraph in points; see {@link spaceBeforePt} for the percentage caveat. */\n\tget spaceAfterPt(): number | null {\n\t\treturn this.#spacingPt('a:spcAft')\n\t}\n\n\t/**\n\t * The paragraph's line spacing (`a:pPr/a:lnSpc`), as an exact point height\n\t * (`a:spcPts`) or a percentage of the single-line height (`a:spcPct`), or\n\t * `null` when unset (inherited from the list style). See {@link LineSpacing}.\n\t */\n\tget lineSpacing(): LineSpacing | null {\n\t\tconst pPr = firstChild(this.element, 'a:pPr')\n\t\tconst lnSpc = pPr && firstChild(pPr, 'a:lnSpc')\n\t\tif (!lnSpc) return null\n\t\tconst pts = firstChild(lnSpc, 'a:spcPts')\n\t\tif (pts) {\n\t\t\tconst val = intValue(attr(pts, 'val'))\n\t\t\treturn val === null ? null : { type: 'points', valuePt: val / 100 }\n\t\t}\n\t\tconst pct = firstChild(lnSpc, 'a:spcPct')\n\t\tif (pct) {\n\t\t\tconst val = intValue(attr(pct, 'val'))\n\t\t\treturn val === null ? null : { type: 'percent', percent: val / 1000 }\n\t\t}\n\t\treturn null\n\t}\n\n\t/** Left margin of the paragraph in points (`a:pPr/@marL` is EMU; 12700 EMU = 1pt), or `null` when unset. */\n\tget marginLeftPt(): number | null {\n\t\treturn this.#emuAttrPt('marL')\n\t}\n\n\t/** First-line indent in points (`a:pPr/@indent` is EMU; negative for a hanging indent), or `null` when unset. */\n\tget indentPt(): number | null {\n\t\treturn this.#emuAttrPt('indent')\n\t}\n\n\t/**\n\t * This paragraph's bullet — its kind, and for a drawn bullet the glyph, the\n\t * numbering start, and the bullet's own font/size/colour. `null` when the\n\t * paragraph names no bullet at all and inherits one from the list style.\n\t *\n\t * Structured rather than a tagged string, which is not merely tidier. The\n\t * previous `bullet` accessor reported `'none'` / `'char:•'` /\n\t * `'autoNum:arabicPeriod'`, and that shape is ambiguous when the glyph is\n\t * itself a colon; worse, it reads as a bare glyph, which is exactly how the\n\t * script converter first consumed it — `'none'.codePointAt(0)` put a literal\n\t * `n` bullet on every converted deck, silently. See {@link BulletDetail}.\n\t */\n\tget bulletDetail(): BulletDetail | null {\n\t\tconst pPr = firstChild(this.element, 'a:pPr')\n\t\tif (!pPr) return null\n\t\tif (firstChild(pPr, 'a:buNone')) return { kind: 'none' }\n\n\t\tconst style = this.#bulletStyle(pPr)\n\t\tconst buChar = firstChild(pPr, 'a:buChar')\n\t\tif (buChar) return { kind: 'char', char: attr(buChar, 'char') ?? '', ...style }\n\n\t\tconst buAutoNum = firstChild(pPr, 'a:buAutoNum')\n\t\tif (buAutoNum) {\n\t\t\treturn {\n\t\t\t\tkind: 'autoNum',\n\t\t\t\tscheme: attr(buAutoNum, 'type') ?? '',\n\t\t\t\tstartAt: intValue(attr(buAutoNum, 'startAt')),\n\t\t\t\t...style,\n\t\t\t}\n\t\t}\n\n\t\tconst buBlip = firstChild(pPr, 'a:buBlip')\n\t\tif (buBlip) return { kind: 'picture', imagePartName: this.#bulletImagePartName(buBlip), ...style }\n\n\t\treturn null\n\t}\n\n\t/** The `a:buFont` / `a:buSz*` / `a:buClr` siblings of a `a:pPr` bullet choice. */\n\t#bulletStyle(pPr: Element): BulletStyle {\n\t\tconst buFont = firstChild(pPr, 'a:buFont')\n\t\tconst buSzPct = firstChild(pPr, 'a:buSzPct')\n\t\tconst buSzPts = firstChild(pPr, 'a:buSzPts')\n\t\tconst buClr = firstChild(pPr, 'a:buClr')\n\t\t// `a:buClr` holds the colour element directly (CT_Color), not wrapped in an\n\t\t// `a:solidFill` the way a run or a shape fill does.\n\t\tconst colorEl = buClr ? firstChildElement(buClr) : null\n\t\tconst pctVal = buSzPct ? intValue(attr(buSzPct, 'val')) : null\n\t\tconst ptVal = buSzPts ? intValue(attr(buSzPts, 'val')) : null\n\t\treturn {\n\t\t\tfont: buFont ? (attr(buFont, 'typeface') ?? null) : null,\n\t\t\tsizePct: pctVal === null ? null : pctVal / 1000,\n\t\t\tsizePt: ptVal === null ? null : ptVal / 100,\n\t\t\tcolor: colorEl?.localName === 'srgbClr' ? (attr(colorEl, 'val') ?? null) : null,\n\t\t\tschemeColor: colorEl?.localName === 'schemeClr' ? (attr(colorEl, 'val') ?? null) : null,\n\t\t\tresolvedColor: this.themeContext ? resolveColorElement(colorEl, this.themeContext) : null,\n\t\t}\n\t}\n\n\t/** Resolve a picture bullet's `a:buBlip/a:blip/@r:embed` to an absolute partname. */\n\t#bulletImagePartName(buBlip: Element): string | null {\n\t\tconst blip = firstChild(buBlip, 'a:blip')\n\t\tconst relId = blip && attr(blip, 'r:embed')\n\t\tif (!relId || !this.relationships) return null\n\t\treturn this.relationships.resolveTarget(relId)\n\t}\n\n\t/** Points from a spacing child's `a:spcPts/@val` (hundredths of a point), or `null`. */\n\t#spacingPt(qname: string): number | null {\n\t\tconst pPr = firstChild(this.element, 'a:pPr')\n\t\tconst spc = pPr && firstChild(pPr, qname)\n\t\tconst pts = spc && firstChild(spc, 'a:spcPts')\n\t\tconst val = pts ? intValue(attr(pts, 'val')) : null\n\t\treturn val === null ? null : val / 100\n\t}\n\n\t/** Points from an EMU-valued `a:pPr` attribute (`marL` / `indent`), or `null`. */\n\t#emuAttrPt(name: string): number | null {\n\t\tconst pPr = firstChild(this.element, 'a:pPr')\n\t\tconst emu = pPr ? intValue(attr(pPr, name)) : null\n\t\treturn emu === null ? null : emu / EMU_PER_POINT\n\t}\n\n\t/**\n\t * The paragraph's text: run (`a:r`) and field (`a:fld`) text concatenated in\n\t * document order, with each line break (`a:br`) rendered as `\\n`.\n\t */\n\tget text(): string {\n\t\tlet out = ''\n\t\tfor (let node = this.element.firstChild; node; node = node.nextSibling) {\n\t\t\tif (node.nodeType !== ELEMENT_NODE) continue\n\t\t\tconst element = node as Element\n\t\t\tif (element.localName === 'r' || element.localName === 'fld') {\n\t\t\t\tout += firstChild(element, 'a:t')?.textContent ?? ''\n\t\t\t} else if (element.localName === 'br') {\n\t\t\t\tout += '\\n'\n\t\t\t}\n\t\t}\n\t\treturn out\n\t}\n\n\t/**\n\t * Replace **this paragraph's** content with a single run, preserving the character\n\t * formatting (`a:rPr`) of its first existing run and leaving its `a:pPr` (level,\n\t * alignment, bullet) alone. Sibling paragraphs are untouched — the difference from\n\t * {@link TextFrame.text}, which collapses the whole body to one paragraph.\n\t */\n\tset text(value: string) {\n\t\tsetParagraphText(this.element, value)\n\t\tthis.part.markDirty()\n\t}\n\n\t/** Escape hatch: the underlying `a:p` element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */\n\tget element_(): Element {\n\t\treturn this.element\n\t}\n\n\t/** Mark the owning part dirty so `save()` reserializes it. Call after mutating {@link element_}. */\n\tmarkDirty(): void {\n\t\tthis.part.markDirty()\n\t}\n}\n\n/** A shape's text frame (`p:txBody`): an ordered list of paragraphs. */\n/**\n * A text frame's body properties (`a:bodyPr`), as read from a shape. Carries the\n * inset/anchor/vertical-text settings that govern where text sits inside its box\n * — the difference between a label that clears a left rail and one that overlaps\n * it. Only **explicitly set** attributes are reported; an absent inset means the\n * PowerPoint default (`lIns`/`rIns` = 0.1\", `tIns`/`bIns` = 0.05\").\n */\nexport interface BodyProperties {\n\t/** Text direction (`@vert`: `horz`/`vert`/`vert270`/`eaVert`/`wordArtVert`…), or `null` when horizontal/unset. */\n\tvert: string | null\n\t/** Vertical anchor (`@anchor`: `t`/`ctr`/`b`), or `null` when unset (defaults to top). */\n\tanchor: string | null\n\t/** Wrap mode (`@wrap`: `square`/`none`), or `null` when unset. */\n\twrap: string | null\n\t/** Explicitly-set text insets in points (`@lIns`/`@rIns`/`@tIns`/`@bIns` ÷ 12700); a missing side uses the PowerPoint default. */\n\tinsetsPt: { left?: number; right?: number; top?: number; bottom?: number }\n}\n\n/**\n * A text frame's vertical-autofit mode, read from its `a:bodyPr` autofit child:\n * - `'none'` — `a:noAutofit`, or no autofit child at all (the box has a fixed\n * size and text can overflow); write-side `fit: 'none'`.\n * - `'normAutofit'`— `a:normAutofit` (shrink text to fit); write-side `fit: 'shrink'`.\n * - `'spAutoFit'` — `a:spAutoFit` (resize the shape to fit text); write-side `fit: 'resize'`.\n */\nexport type AutofitMode = 'none' | 'normAutofit' | 'spAutoFit'\n\nexport class TextFrame {\n\tconstructor(\n\t\tprivate readonly txBody: Element,\n\t\tprivate readonly part: Part,\n\t\t/** The owning slide's theme context (colour maps + `fontScheme`), threaded to each {@link Paragraph}/{@link Run} for the `resolved*` getters. */\n\t\tprivate readonly themeContext?: ThemeContext,\n\t\t/**\n\t\t * The placeholder this text body lives in, when any — enables\n\t\t * placeholder-inherited run colour/size/face resolution. Absent for ordinary\n\t\t * text boxes and table cells.\n\t\t */\n\t\tprivate readonly placeholder?: PlaceholderTextContext,\n\t\t/** The owning part's relationships, threaded to each {@link Paragraph}/{@link Run} for hyperlink `@r:id` resolution; absent when reached without them. */\n\t\tprivate readonly relationships?: Relationships\n\t) {}\n\n\t/** Paragraphs (`a:p`) in document order. */\n\tget paragraphs(): Paragraph[] {\n\t\t// The slide text body's own list style is the tier just below the run/paragraph\n\t\t// in the placeholder inheritance chain; resolve it once and share it.\n\t\tconst inherit = this.placeholder\n\t\t\t? { placeholder: this.placeholder, slideLstStyle: firstChild(this.txBody, 'a:lstStyle') }\n\t\t\t: undefined\n\t\treturn getElements(this.txBody, 'a:p').map(\n\t\t\t(element) => new Paragraph(element, this.part, this.themeContext, inherit, this.relationships)\n\t\t)\n\t}\n\n\t/**\n\t * The frame's body properties (`a:bodyPr`: insets, anchor, vertical text), or\n\t * `null` when there is no `a:bodyPr`. Only explicitly-set insets are reported\n\t * (a missing side is the PowerPoint default — see {@link BodyProperties}).\n\t */\n\tget bodyProperties(): BodyProperties | null {\n\t\tconst bodyPr = firstChild(this.txBody, 'a:bodyPr')\n\t\tif (!bodyPr) return null\n\t\tconst insetsPt: BodyProperties['insetsPt'] = {}\n\t\tconst inset = (qn: string, key: keyof BodyProperties['insetsPt']): void => {\n\t\t\tconst v = intValue(attr(bodyPr, qn))\n\t\t\tif (v !== null) insetsPt[key] = v / EMU_PER_POINT\n\t\t}\n\t\tinset('lIns', 'left')\n\t\tinset('rIns', 'right')\n\t\tinset('tIns', 'top')\n\t\tinset('bIns', 'bottom')\n\t\treturn {\n\t\t\tvert: attr(bodyPr, 'vert') ?? null,\n\t\t\tanchor: attr(bodyPr, 'anchor') ?? null,\n\t\t\twrap: attr(bodyPr, 'wrap') ?? null,\n\t\t\tinsetsPt,\n\t\t}\n\t}\n\n\t/**\n\t * The effective vertical anchor (`t`/`ctr`/`b`): the frame's own\n\t * `a:bodyPr/@anchor` when set, else the anchor it inherits from its\n\t * layout → master placeholder `a:bodyPr`. `null` when nothing in the chain sets\n\t * one (PowerPoint then defaults to top). Unlike {@link bodyProperties}'s\n\t * `anchor` (own attribute only), this surfaces the inherited anchor a\n\t * placeholder title relies on — the difference between a top- and\n\t * centre-anchored title that own-attribute reads alone cannot see.\n\t */\n\tget resolvedAnchor(): string | null {\n\t\tconst own = this.bodyProperties?.anchor\n\t\tif (own) return own\n\t\t// Anchor inheritance is placeholder-only; a non-placeholder frame (ph null) has none.\n\t\tconst ph = this.placeholder?.ph\n\t\tif (!ph) return null\n\t\treturn resolveInheritedAnchor(ph, this.placeholder.flatten)\n\t}\n\n\t/**\n\t * The frame's vertical-autofit mode (`a:bodyPr` autofit child), or `null` when\n\t * there is no `a:bodyPr`. A `bodyPr` with no autofit child — or an explicit\n\t * `a:noAutofit` — reads `'none'`. See {@link AutofitMode}. This is the deep-model\n\t * counterpart of `inspectPptx`'s per-shape `autofit`; unlike the shallow surface\n\t * it hangs off the navigable text frame.\n\t */\n\tget autofit(): AutofitMode | null {\n\t\tconst bodyPr = firstChild(this.txBody, 'a:bodyPr')\n\t\tif (!bodyPr) return null\n\t\tif (firstChild(bodyPr, 'a:spAutoFit')) return 'spAutoFit'\n\t\tif (firstChild(bodyPr, 'a:normAutofit')) return 'normAutofit'\n\t\treturn 'none'\n\t}\n\n\t/**\n\t * The baked shrink scale of a `normAutofit` frame as a percent (62.5 = 62.5%),\n\t * or `null` when the frame has no `a:normAutofit` or bakes no scale. A bare\n\t * `<a:normAutofit/>` (write-side `fit: 'shrink'`) carries no scale — PowerPoint\n\t * computes it on edit and draws at 100% until then — so it too reads `null`; an\n\t * explicit scale comes from `fit: { type: 'shrink', fontScale }`.\n\t */\n\tget autofitFontScale(): number | null {\n\t\treturn this.#normAutofitPct('fontScale')\n\t}\n\n\t/**\n\t * The baked line-spacing reduction of a `normAutofit` frame as a percent\n\t * (`a:normAutofit/@lnSpcReduction` ÷ 1000), or `null` when unset. The companion\n\t * to {@link autofitFontScale} (write-side `fit: { type: 'shrink', lnSpcReduction }`).\n\t */\n\tget autofitLineSpaceReduction(): number | null {\n\t\treturn this.#normAutofitPct('lnSpcReduction')\n\t}\n\n\t/** A `a:normAutofit` percentage attribute (stored in 1000ths of a percent → percent), or `null`. */\n\t#normAutofitPct(name: string): number | null {\n\t\tconst bodyPr = firstChild(this.txBody, 'a:bodyPr')\n\t\tconst norm = bodyPr && firstChild(bodyPr, 'a:normAutofit')\n\t\tconst raw = norm ? intValue(attr(norm, name)) : null\n\t\treturn raw === null ? null : raw / 1000\n\t}\n\n\t/** All paragraph text joined by `\\n` (mirrors python-pptx `TextFrame.text`). */\n\tget text(): string {\n\t\treturn this.paragraphs.map((paragraph) => paragraph.text).join('\\n')\n\t}\n\n\t/**\n\t * Replace the frame's text with a single paragraph and run, preserving the\n\t * character formatting (`a:rPr`) of the frame's first existing run when there\n\t * is one. For multiple runs or per-run formatting, edit\n\t * `paragraphs[].runs[]` directly.\n\t */\n\tset text(value: string) {\n\t\tsetTextBodyText(this.txBody, value)\n\t\tthis.part.markDirty()\n\t}\n\n\t/** Escape hatch: the underlying `p:txBody` element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */\n\tget element_(): Element {\n\t\treturn this.txBody\n\t}\n\n\t/** Mark the owning part dirty so `save()` reserializes it. Call after mutating {@link element_}. */\n\tmarkDirty(): void {\n\t\tthis.part.markDirty()\n\t}\n}\n\n/**\n * Replace a text body's content (`a:txBody` or `a:txBody`-shaped element) with a\n * single paragraph and run, preserving the `a:rPr` of the body's first existing\n * run when there is one. Shared by {@link TextFrame.text} and `TableCell.text`.\n * Does **not** mark any part dirty — the caller owns the `Part` and must call\n * `markDirty()` after.\n */\nexport function setTextBodyText(txBody: Element, value: string): void {\n\tconst doc = txBody.ownerDocument\n\tif (!doc) throw new InternalError('oxml/node-has-no-document', 'Cannot set text: text body has no owner document')\n\n\t// Collapse to a single paragraph, dropping any extras, then let the paragraph-level\n\t// setter do the rest — the run rule is the same one, stated once.\n\tconst paragraphs = getElements(txBody, 'a:p')\n\tfor (let i = paragraphs.length - 1; i >= 1; i--) {\n\t\tconst extra = paragraphs[i]\n\t\tif (extra) txBody.removeChild(extra)\n\t}\n\tlet p = paragraphs[0]\n\tif (!p) {\n\t\tp = createElement(doc, 'a:p')\n\t\ttxBody.appendChild(p)\n\t}\n\tsetParagraphText(p, value)\n}\n\n/**\n * Replace **one paragraph's** content with a single run, preserving the `a:rPr` of that\n * paragraph's first existing run and leaving its `a:pPr` (level, alignment, bullet) alone.\n * Sibling paragraphs are untouched, which is the whole difference from\n * {@link setTextBodyText} and the reason this exists: a SmartArt drawing cache packs several\n * nodes' text into one `dsp:txBody`, so collapsing the body there would delete the other\n * nodes' strings. Does **not** mark any part dirty — the caller owns the `Part`.\n */\nexport function setParagraphText(p: Element, value: string): void {\n\tconst doc = p.ownerDocument\n\tif (!doc) throw new InternalError('oxml/node-has-no-document', 'Cannot set text: paragraph has no owner document')\n\n\t// Capture the first run's character formatting before we discard runs.\n\tconst firstRun = firstChild(p, 'a:r')\n\tconst rPrTemplate = firstRun && firstChild(firstRun, 'a:rPr')\n\n\t// Remove every run-level child (runs, breaks, fields); keep a:pPr / a:endParaRPr.\n\tfor (const child of childElements(p)) {\n\t\tif (child.localName === 'r' || child.localName === 'br' || child.localName === 'fld') p.removeChild(child)\n\t}\n\n\t// Build a single run, carrying over the captured formatting if present.\n\tconst run = createElement(doc, 'a:r')\n\tif (rPrTemplate) run.appendChild(rPrTemplate.cloneNode(true))\n\tconst t = createElement(doc, 'a:t')\n\tt.textContent = value\n\tif (value !== value.trim()) setAttr(t, 'xml:space', 'preserve')\n\telse removeAttr(t, 'xml:space')\n\trun.appendChild(t)\n\n\t// Insert before a:endParaRPr if present (it must stay last), else append.\n\tconst endParaRPr = firstChild(p, 'a:endParaRPr')\n\tp.insertBefore(run, endParaRPr)\n}\n","/**\n * The abstract base every shape kind extends.\n *\n * It owns everything a shape has regardless of kind: non-visual identity (id / name / hidden /\n * description / decorative), geometry through the subclass-supplied `a:xfrm`, and the `p:spPr`\n * surface — fill, line, gradient, effects — resolved against the host's theme. Kind-specific\n * reads live on the subclasses in the sibling modules.\n *\n * A proxy holds a back-reference to its owning {@link ShapeHost} — a `Slide`, a `SlideLayout` or a\n * `SlideMaster` — so it can resolve relationships and theme colours, and so a mutation can mark\n * that host's part dirty.\n */\n\nimport {\n\tELEMENT_NODE,\n\tOOXML_NS,\n\tattr,\n\tboolValue,\n\tfirstChild,\n\tfirstChildElement,\n\tgetElements,\n\tgetOrAddChild,\n\tintValue,\n\tremoveAttr,\n\tremoveChildrenByQName,\n\tsetAttr,\n\ttype Element,\n} from '../../oxml/dom.js'\nimport { composeGroupFrame, type GroupTransform } from './group-transform.js'\nimport { FILL_CHOICES, normalizeHex, setSolidFill, solidFillColor } from '../../oxml/fill.js'\nimport {\n\tresolveColorElement,\n\tresolveInheritedFrame,\n\tresolveSolidFillColor,\n\tresolveStyleFillColor,\n\tresolveStyleLineColor,\n\ttype PlaceholderRef,\n\ttype ResolvedColor,\n\ttype ResolvedFrame,\n} from '../theme-context.js'\nimport { readGradientFill, readGradientStops, type GradientFill, type GradientStop } from '../gradient.js'\nimport { readPictureFill, type PictureFill } from '../picture-fill.js'\nimport { readPatternFill } from '../pattern-fill.js'\nimport { TextFrame } from '../text.js'\nimport type { ShapeHost } from './host.js'\nimport {\n\tchildElements,\n\temuFrom,\n\tgetOrAddSpPrXfrm,\n\tnonVisualCNvPr,\n\tLN_FILL_AFTER,\n\tSHAPE_AFTER_SPPR,\n\tSPPR_FILL_AFTER,\n\tSPPR_LN_AFTER,\n\ttype ShapeProperties,\n} from './oxml.js'\nimport { readBox, rotationDegrees, toEmu, transformFlipH, transformFlipV } from './geometry.js'\nimport type {\n\tAbsoluteFrame,\n\tGlow,\n\tInnerShadow,\n\tLineEnd,\n\tLineEnds,\n\tOuterShadow,\n\tPatternFill,\n\tReflection,\n\tShapeType,\n\tSoftEdge,\n} from './types.js'\nimport { InternalError, PackageReadError, UnsupportedFeatureError } from '../../../errors.js'\nimport { ANGLE_UNITS_PER_DEGREE, EMU_PER_POINT, PERCENT_SCALE } from '../../../units.js'\n\n// Microsoft's \"decorative\" accessibility extension: p:cNvPr/a:extLst/a:ext\n// (uri {C183D7F6-B498-43B3-948B-1728B52AA6E4}) / adec:decorative. Confirmed\n// against real PowerPoint output (\"Mark as decorative\").\nconst ADEC_NS = 'http://schemas.microsoft.com/office/drawing/2017/decorative'\n\n/** Common base for every shape in a shape tree — a slide's, a layout's, or a master's. */\nexport abstract class Shape {\n\tconstructor(\n\t\tprotected readonly element: Element,\n\t\t/**\n\t\t * The part that owns this shape's tree — a `Slide`, a `SlideLayout`, or a\n\t\t * `SlideMaster`. Narrow it with `instanceof` when you need the concrete class;\n\t\t * {@link ShapeHost.partName} tells the tiers apart without one.\n\t\t */\n\t\treadonly host: ShapeHost\n\t) {}\n\n\t/** Which concrete shape kind this is. */\n\tabstract readonly shapeType: ShapeType\n\n\t/**\n\t * The transform element carrying this shape's geometry, or `null` if inherited.\n\t *\n\t * Defaults to `p:spPr/a:xfrm`, which is where three of the four shape kinds keep it\n\t * (`p:sp`, `p:pic`, `p:cxnSp`). {@link GraphicFrame} overrides it: a `p:graphicFrame`\n\t * has no `p:spPr` and carries a `p:xfrm` of its own directly.\n\t */\n\tprotected xfrm(): Element | null {\n\t\tconst spPr = firstChild(this.element, 'p:spPr')\n\t\treturn spPr ? firstChild(spPr, 'a:xfrm') : null\n\t}\n\n\t/** The transform element, creating it (and its container) in document order if absent. */\n\tprotected getOrAddXfrm(): Element {\n\t\treturn getOrAddSpPrXfrm(this.element)\n\t}\n\n\t/**\n\t * Mark the owning host's part dirty so `save()` reserializes it. Public\n\t * because {@link element_} hands out the live DOM node: the hatch and the\n\t * obligation that comes with it belong on the same object.\n\t */\n\tmarkDirty(): void {\n\t\tthis.host.part.markDirty()\n\t}\n\n\t/** Drawing id (`p:cNvPr/@id`), or `null` if absent. */\n\tget id(): number | null {\n\t\tconst cNvPr = nonVisualCNvPr(this.element)\n\t\treturn cNvPr ? intValue(attr(cNvPr, 'id')) : null\n\t}\n\n\t/** Shape name (`p:cNvPr/@name`), or `''` if unnamed. */\n\tget name(): string {\n\t\tconst cNvPr = nonVisualCNvPr(this.element)\n\t\treturn (cNvPr && attr(cNvPr, 'name')) ?? ''\n\t}\n\n\t/**\n\t * Whether the shape is explicitly hidden (`p:cNvPr/@hidden=\"1\"`); `false` when\n\t * the attribute is unset. A hidden shape stays in the slide XML but is not\n\t * rendered — decks use it as a fallback layer (e.g. a duotone-recolour source\n\t * sitting behind the visible icon), so a faithful reader must distinguish it\n\t * from the drawn shapes.\n\t */\n\tget hidden(): boolean {\n\t\tconst cNvPr = nonVisualCNvPr(this.element)\n\t\treturn boolValue(cNvPr && attr(cNvPr, 'hidden')) === true\n\t}\n\n\t/**\n\t * The shape's alt-text description (`p:cNvPr/@descr`), or `null` when unset.\n\t * This is the accessibility primitive a screen reader announces; an audit or\n\t * accessible-export tool reads it here. Distinct from {@link name}, which is\n\t * the authoring-time shape name and is never surfaced to assistive tech.\n\t */\n\tget description(): string | null {\n\t\tconst cNvPr = nonVisualCNvPr(this.element)\n\t\tconst v = cNvPr && attr(cNvPr, 'descr')\n\t\treturn v ?? null\n\t}\n\n\t/**\n\t * Set (or clear, with `''`) the alt-text description. Requires the shape's\n\t * `p:cNvPr` to exist, which every well-formed shape carries.\n\t */\n\tset description(value: string) {\n\t\tconst cNvPr = nonVisualCNvPr(this.element)\n\t\tif (!cNvPr)\n\t\t\tthrow new PackageReadError('shape/no-non-visual-properties', 'cannot set description: shape has no p:cNvPr')\n\t\tif (value === '') removeAttr(cNvPr, 'descr')\n\t\telse setAttr(cNvPr, 'descr', value)\n\t\tthis.markDirty()\n\t}\n\n\t/**\n\t * The shape's alt-text title (`p:cNvPr/@title`), or `null` when unset. Modern\n\t * PowerPoint no longer exposes a separate title field (only description +\n\t * \"mark as decorative\"), so this is usually `null`; it survives on decks\n\t * authored by older PowerPoint or other producers that still write it.\n\t */\n\tget title(): string | null {\n\t\tconst cNvPr = nonVisualCNvPr(this.element)\n\t\tconst v = cNvPr && attr(cNvPr, 'title')\n\t\treturn v ?? null\n\t}\n\n\t/**\n\t * Whether the shape is flagged **decorative** (`p:cNvPr/a:extLst/a:ext`\n\t * uri `{C183D7F6-…}` / `adec:decorative@val`), PowerPoint's \"Mark as\n\t * decorative\" — a purely visual element assistive tech should skip. `false`\n\t * when the extension is absent. A decorative shape typically has no\n\t * {@link description}; the two are alternatives, not companions.\n\t */\n\tget isDecorative(): boolean {\n\t\tconst cNvPr = nonVisualCNvPr(this.element)\n\t\tconst extLst = cNvPr && firstChild(cNvPr, 'a:extLst')\n\t\tif (!extLst) return false\n\t\tfor (const ext of getElements(extLst, 'a:ext')) {\n\t\t\tfor (const child of childElements(ext)) {\n\t\t\t\tif (child.localName === 'decorative' && child.namespaceURI === ADEC_NS) {\n\t\t\t\t\treturn boolValue(attr(child, 'val')) === true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n\n\t/** Left edge in EMU (`a:off/@x`), or `null` when the shape has no own transform. */\n\tget left(): number | null {\n\t\treturn emuFrom(this.xfrm(), 'a:off', 'x')\n\t}\n\n\tset left(value: number) {\n\t\tthis.#setOffset('x', value, true)\n\t}\n\n\t/** Top edge in EMU (`a:off/@y`), or `null` when the shape has no own transform. */\n\tget top(): number | null {\n\t\treturn emuFrom(this.xfrm(), 'a:off', 'y')\n\t}\n\n\tset top(value: number) {\n\t\tthis.#setOffset('y', value, true)\n\t}\n\n\t/** Width in EMU (`a:ext/@cx`), or `null` when the shape has no own transform. */\n\tget width(): number | null {\n\t\treturn emuFrom(this.xfrm(), 'a:ext', 'cx')\n\t}\n\n\tset width(value: number) {\n\t\tthis.#setExtent('cx', value)\n\t}\n\n\t/** Height in EMU (`a:ext/@cy`), or `null` when the shape has no own transform. */\n\tget height(): number | null {\n\t\treturn emuFrom(this.xfrm(), 'a:ext', 'cy')\n\t}\n\n\tset height(value: number) {\n\t\tthis.#setExtent('cy', value)\n\t}\n\n\t/**\n\t * This shape's effective position and size in EMU: its own `a:xfrm` when it has\n\t * one ({@link left}/{@link top}/{@link width}/{@link height}, tagged\n\t * `source: 'own'`); otherwise, for a placeholder, the geometry it inherits from\n\t * the matching layout placeholder, else the master's (tagged accordingly). A\n\t * non-placeholder shape with no own transform has nothing to inherit from and\n\t * reads `null`, as does a placeholder whose layout/master chain defines no\n\t * matching geometry either.\n\t *\n\t * The writer always emits an explicit `a:xfrm` on every placeholder it authors,\n\t * so `source` reads `'own'` for every authored deck; `'layout'`/`'master'` is\n\t * the case an *imported* deck exercises, when PowerPoint itself leaves a\n\t * placeholder's geometry to inherit.\n\t */\n\tget resolvedFrame(): ResolvedFrame | null {\n\t\tconst left = this.left\n\t\tconst top = this.top\n\t\tconst width = this.width\n\t\tconst height = this.height\n\t\tif (left !== null && top !== null && width !== null && height !== null) {\n\t\t\treturn { left, top, width, height, source: 'own' }\n\t\t}\n\t\tconst ph = this.placeholder\n\t\tif (!ph) return null\n\t\treturn resolveInheritedFrame(ph, this.host.themeContext())\n\t}\n\n\t/**\n\t * Clockwise rotation in degrees (`a:xfrm/@rot` ÷ 60000), or `null` when the\n\t * shape has no own transform. A present xfrm with no `@rot` reads as `0`, so\n\t * — mirroring {@link left}/{@link top}/{@link width}/{@link height} — `null`\n\t * (\"inherits layout geometry\") stays distinct from `0` (\"has a transform, not\n\t * rotated\"). The value is faithful to the XML and not normalised to a signed\n\t * range, so a `@rot` past 360° (e.g. a negative angle stored as `19216344`)\n\t * reads back greater than 360. This is the shape's own orientation; use\n\t * {@link absoluteFrame} when you need the effective orientation after\n\t * enclosing group transforms are composed.\n\t */\n\tget rotation(): number | null {\n\t\tconst xfrm = this.xfrm()\n\t\tif (!xfrm) return null\n\t\treturn rotationDegrees(xfrm)\n\t}\n\n\t/**\n\t * Whether the shape is flipped horizontally (`a:xfrm/@flipH`); `false` when\n\t * unset or when the shape has no own transform. This is the shape's own\n\t * horizontal flip; use {@link absoluteFrame} for the effective value after\n\t * enclosing group transforms are composed.\n\t */\n\tget flipH(): boolean {\n\t\tconst xfrm = this.xfrm()\n\t\treturn xfrm !== null && transformFlipH(xfrm)\n\t}\n\n\t/**\n\t * Whether the shape is flipped vertically (`a:xfrm/@flipV`); `false` when\n\t * unset or when the shape has no own transform. This is the shape's own\n\t * vertical flip; use {@link absoluteFrame} for the effective value after\n\t * enclosing group transforms are composed.\n\t */\n\tget flipV(): boolean {\n\t\tconst xfrm = this.xfrm()\n\t\treturn xfrm !== null && transformFlipV(xfrm)\n\t}\n\n\t/**\n\t * This shape's position, size, and effective orientation in **slide-absolute**\n\t * EMU/degrees, composing every enclosing group transform.\n\t *\n\t * {@link left}/{@link top}/{@link width}/{@link height} report a group child's\n\t * geometry in its group's child coordinate space (`a:chOff`/`a:chExt`), which is\n\t * not directly placeable on the slide. This getter walks the `p:grpSp` ancestor\n\t * chain outward, mapping the box through each group's\n\t * `off + (p - chOff) * (ext / chExt)` transform, then composing group flips and\n\t * rotations about the group centre. For a shape already at slide level the box\n\t * equals its own `{ left, top, width, height }`, while `rotation`/`flipH`/`flipV`\n\t * equal the shape's own transform values.\n\t *\n\t * `null` when the shape (or any enclosing group) has no own transform, or a\n\t * group's `a:chExt` is degenerate (zero) — there is then no resolvable frame.\n\t *\n\t * A rotated shape's returned `left`/`top` remain PowerPoint's unrotated\n\t * placement box (the same box PowerPoint writes after Ungroup), with the\n\t * effective rotation exposed separately.\n\t */\n\tget absoluteFrame(): AbsoluteFrame | null {\n\t\tconst xfrm = this.xfrm()\n\t\tif (!xfrm) return null\n\t\tconst box = readBox(xfrm, 'a:off', 'a:ext')\n\t\tif (!box) return null\n\n\t\tconst groups: GroupTransform[] = []\n\t\tfor (let node = this.element.parentNode; node && node.nodeType === ELEMENT_NODE; node = node.parentNode) {\n\t\t\tconst parent = node as Element\n\t\t\tif (parent.namespaceURI !== OOXML_NS.p || parent.localName !== 'grpSp') break // reached the shape tree (or a non-group)\n\t\t\tconst grpSpPr = firstChild(parent, 'p:grpSpPr')\n\t\t\tconst groupXfrm = grpSpPr && firstChild(grpSpPr, 'a:xfrm')\n\t\t\tconst outer = groupXfrm && readBox(groupXfrm, 'a:off', 'a:ext')\n\t\t\tconst child = groupXfrm && readBox(groupXfrm, 'a:chOff', 'a:chExt')\n\t\t\tif (!groupXfrm || !outer || !child) return null\n\t\t\tgroups.push({\n\t\t\t\touter,\n\t\t\t\tchild,\n\t\t\t\trotation: rotationDegrees(groupXfrm),\n\t\t\t\tflipH: transformFlipH(groupXfrm),\n\t\t\t\tflipV: transformFlipV(groupXfrm),\n\t\t\t})\n\t\t}\n\n\t\tconst frame = composeGroupFrame(\n\t\t\t{ box, rotation: rotationDegrees(xfrm), flipH: transformFlipH(xfrm), flipV: transformFlipV(xfrm) },\n\t\t\tgroups\n\t\t)\n\t\tif (!frame) return null\n\t\treturn {\n\t\t\tleft: Math.round(frame.box.x),\n\t\t\ttop: Math.round(frame.box.y),\n\t\t\twidth: Math.round(frame.box.cx),\n\t\t\theight: Math.round(frame.box.cy),\n\t\t\trotation: frame.rotation,\n\t\t\tflipH: frame.flipH,\n\t\t\tflipV: frame.flipV,\n\t\t}\n\t}\n\n\t#setOffset(axis: 'x' | 'y', value: number, allowNegative: boolean): void {\n\t\tconst emu = toEmu(value, axis, allowNegative)\n\t\tconst off = getOrAddChild(this.getOrAddXfrm(), 'a:off', ['a:ext'])\n\t\tsetAttr(off, axis, String(emu))\n\t\tthis.markDirty()\n\t}\n\n\t#setExtent(axis: 'cx' | 'cy', value: number): void {\n\t\tconst emu = toEmu(value, axis, false)\n\t\tconst ext = getOrAddChild(this.getOrAddXfrm(), 'a:ext')\n\t\tsetAttr(ext, axis, String(emu))\n\t\tthis.markDirty()\n\t}\n\n\t/** The shape's properties element (`p:spPr` / `p:grpSpPr`), or `null` when absent. */\n\tprotected properties(): Element | null {\n\t\treturn firstChild(this.element, 'p:spPr')\n\t}\n\n\t/** Get-or-add the properties element in document order, with the successor\n\t * arrays for inserting its fill / line children. Subclasses override this\n\t * to point at `p:grpSpPr`, or to reject kinds with no properties element. */\n\tprotected getOrAddProperties(): ShapeProperties {\n\t\tconst props = getOrAddChild(this.element, 'p:spPr', SHAPE_AFTER_SPPR)\n\t\treturn { props, fillAfter: SPPR_FILL_AFTER, lnAfter: SPPR_LN_AFTER }\n\t}\n\n\t/** Whether a solid fill can be set on this shape kind. Pictures and graphic\n\t * frames opt out (they carry their own image / table-cell fill model). */\n\tprotected get supportsFill(): boolean {\n\t\treturn true\n\t}\n\n\t/** Explicit RGB fill colour as a 6-hex string (`spPr/a:solidFill/a:srgbClr/@val`), or `null`. */\n\tget fillColor(): string | null {\n\t\treturn solidFillColor(this.properties(), 'a:srgbClr')\n\t}\n\n\tset fillColor(value: string | null) {\n\t\tthis.#setFill(value === null ? null : { qname: 'a:srgbClr', val: normalizeHex(value) })\n\t}\n\n\t/** Theme colour token when the fill is a scheme colour (`a:solidFill/a:schemeClr/@val`, e.g. `accent2`), or `null`. */\n\tget fillSchemeColor(): string | null {\n\t\treturn solidFillColor(this.properties(), 'a:schemeClr')\n\t}\n\n\tset fillSchemeColor(value: string | null) {\n\t\tthis.#setFill(value === null ? null : { qname: 'a:schemeClr', val: value })\n\t}\n\n\t/**\n\t * `true` when the shape sets an explicit no-fill (`spPr/a:noFill`) — a\n\t * deliberately transparent surface. The fill-side counterpart of\n\t * {@link lineNoFill}, and the only accessor that separates it from a shape\n\t * carrying no fill child at all (one inheriting through `p:style/a:fillRef`):\n\t * every other fill accessor — {@link fillColor}, {@link fillSchemeColor},\n\t * {@link resolvedFill}, {@link gradientFill}, {@link patternFill},\n\t * {@link pictureFill} — reports `null` for both. The two paint completely\n\t * differently, so a consumer that cannot tell them apart paints a transparent\n\t * shape in the theme's accent colour.\n\t */\n\tget fillNoFill(): boolean {\n\t\tconst props = this.properties()\n\t\treturn !!(props && firstChild(props, 'a:noFill'))\n\t}\n\n\t/**\n\t * Set an explicit `<a:noFill/>` on the shape — a transparent surface. This is\n\t * distinct from clearing the fill (`fillColor = null`), which removes the\n\t * `a:solidFill` and lets the fill inherit from the shape's style/placeholder.\n\t * Read it back with {@link fillNoFill}.\n\t */\n\tnoFill(): void {\n\t\tif (!this.supportsFill)\n\t\t\tthrow new UnsupportedFeatureError(\n\t\t\t\t'shape/fill-unsupported',\n\t\t\t\t`${this.shapeType} shapes do not support a solid fill`\n\t\t\t)\n\t\tconst { props, fillAfter } = this.getOrAddProperties()\n\t\tremoveChildrenByQName(props, FILL_CHOICES)\n\t\tgetOrAddChild(props, 'a:noFill', fillAfter)\n\t\tthis.markDirty()\n\t}\n\n\t/** Explicit RGB line/border colour (`spPr/a:ln/a:solidFill/a:srgbClr/@val`), or `null`. */\n\tget lineColor(): string | null {\n\t\treturn solidFillColor(this.#line(), 'a:srgbClr')\n\t}\n\n\tset lineColor(value: string | null) {\n\t\tthis.#setLine(value === null ? null : { qname: 'a:srgbClr', val: normalizeHex(value) })\n\t}\n\n\t/** Theme colour token when the line is a scheme colour (`a:ln/a:solidFill/a:schemeClr/@val`), or `null`. */\n\tget lineSchemeColor(): string | null {\n\t\treturn solidFillColor(this.#line(), 'a:schemeClr')\n\t}\n\n\tset lineSchemeColor(value: string | null) {\n\t\tthis.#setLine(value === null ? null : { qname: 'a:schemeClr', val: value })\n\t}\n\n\t/** Line/border width in points (`spPr/a:ln/@w` is EMU; 12700 EMU = 1pt), or `null` when unset. */\n\tget lineWidthPt(): number | null {\n\t\tconst ln = this.#line()\n\t\tconst w = ln ? intValue(attr(ln, 'w')) : null\n\t\treturn w === null ? null : w / EMU_PER_POINT\n\t}\n\n\t/**\n\t * The line/border dash style (`spPr/a:ln/a:prstDash/@val`), e.g. `'dash'`,\n\t * `'lgDashDot'`, `'sysDot'`, or `null` when the line is solid/unset. A faithful\n\t * replica of dashed dividers and dashed card borders needs this — it is\n\t * otherwise invisible in {@link lineColor}/{@link lineWidthPt} alone.\n\t */\n\tget lineDash(): string | null {\n\t\tconst ln = this.#line()\n\t\tconst dash = ln && firstChild(ln, 'a:prstDash')\n\t\treturn dash ? (attr(dash, 'val') ?? null) : null\n\t}\n\n\t/**\n\t * `true` when the shape sets an explicit no-line (`spPr/a:ln/a:noFill`) — a\n\t * deliberately border-less shape. Distinct from simply having no `a:ln`\n\t * (an inherited line), which {@link resolvedLine} cannot tell apart: both\n\t * report `null`. A replica that relies on a shadow instead of a border needs\n\t * to know the border was explicitly suppressed.\n\t */\n\tget lineNoFill(): boolean {\n\t\tconst ln = this.#line()\n\t\treturn !!(ln && firstChild(ln, 'a:noFill'))\n\t}\n\n\t/**\n\t * The line end cap (`spPr/a:ln/@cap`) as the raw OOXML token — `'flat'`,\n\t * `'rnd'` (round) or `'sq'` (square) — or `null` when unset (PowerPoint's\n\t * default is `flat`). The write API authors this attribute through\n\t * `ShapeLineProps.cap`, so without the accessor a deck this library produced\n\t * could not be read back without losing it.\n\t *\n\t * Not cosmetic on a thick dashed rule: the cap decides whether each dash reads\n\t * as a rectangle or a lozenge, and it extends every dash by the stroke width.\n\t * SVG's `stroke-linecap` is the exact equivalent (`flat`→`butt`, `rnd`→`round`,\n\t * `sq`→`square`).\n\t */\n\tget lineCap(): string | null {\n\t\tconst ln = this.#line()\n\t\treturn ln ? (attr(ln, 'cap') ?? null) : null\n\t}\n\n\t/**\n\t * The line alignment (`spPr/a:ln/@algn`) as the raw OOXML token — `'ctr'`\n\t * (centred on the shape's outline) or `'in'` (inset, drawn wholly inside it) —\n\t * or `null` when unset. It shifts a thick outline by half its width, so it\n\t * changes where the border sits relative to the fill.\n\t */\n\tget lineAlign(): string | null {\n\t\tconst ln = this.#line()\n\t\treturn ln ? (attr(ln, 'algn') ?? null) : null\n\t}\n\n\t/**\n\t * Preset geometry name (`spPr/a:prstGeom/@prst`, e.g. `rect`), or `null` for\n\t * custom geometry or none. Not an auto-shape-only property: PowerPoint gives a\n\t * picture and a connector a preset geometry too (a `p:pic` is `rect` unless it\n\t * has been cropped to a shape), so it reads off whichever properties element\n\t * this kind carries. A group has no geometry of its own and reads `null`.\n\t */\n\tget presetGeometry(): string | null {\n\t\tconst props = this.properties()\n\t\tconst prstGeom = props && firstChild(props, 'a:prstGeom')\n\t\treturn prstGeom ? attr(prstGeom, 'prst') : null\n\t}\n\n\t/**\n\t * Preset-geometry adjustment values (`spPr/a:prstGeom/a:avLst/a:gd`) as a\n\t * name → formula map, e.g. `{ adj: 'val 16667' }`. Empty when the shape has no\n\t * adjust handles (or uses custom geometry). Pair with {@link presetGeometry}.\n\t */\n\tget adjustValues(): Record<string, string> {\n\t\tconst props = this.properties()\n\t\tconst prstGeom = props && firstChild(props, 'a:prstGeom')\n\t\tconst avLst = prstGeom && firstChild(prstGeom, 'a:avLst')\n\t\tconst out: Record<string, string> = {}\n\t\tif (avLst) {\n\t\t\tfor (const gd of getElements(avLst, 'a:gd')) {\n\t\t\t\tconst name = attr(gd, 'name')\n\t\t\t\tif (name) out[name] = attr(gd, 'fmla') ?? ''\n\t\t\t}\n\t\t}\n\t\treturn out\n\t}\n\n\t/**\n\t * Gradient fill stops (`spPr/a:gradFill/a:gsLst/a:gs`) in document order, or\n\t * `null` when the shape's fill is not a gradient. Each stop carries its\n\t * position (0–1, from `@pos` in thousandths of a percent) and either an\n\t * explicit `color` (hex) or a `schemeColor` token, mirroring the\n\t * {@link fillColor} / {@link fillSchemeColor} split for solid fills.\n\t */\n\tget gradientStops(): GradientStop[] | null {\n\t\tconst props = this.properties()\n\t\treturn props ? this.#gradientStopsIn(props) : null\n\t}\n\n\t/**\n\t * Read `a:gradFill/a:gsLst` stops from a container (either `spPr` for a fill or\n\t * `a:ln` for a line stroke). `null` when the container has no gradient; `[]`\n\t * when the gradient carries no stop list.\n\t */\n\t#gradientStopsIn(container: Element): GradientStop[] | null {\n\t\treturn readGradientStops(container, this.host.themeContext())\n\t}\n\n\t/**\n\t * Read the full `a:gradFill` (stops + linear angle / path shape) from a\n\t * container (`spPr` for a fill or `a:ln` for a line stroke). `null` when the\n\t * container has no gradient.\n\t */\n\t#gradientFillIn(container: Element): GradientFill | null {\n\t\treturn readGradientFill(container, this.host.themeContext())\n\t}\n\n\t/**\n\t * The shape's gradient fill with its geometry (`spPr/a:gradFill`), or `null`\n\t * when the fill is not a gradient. Unlike {@link gradientStops} (stops only),\n\t * this also carries the linear {@link GradientFill.angleDeg} or the\n\t * {@link GradientFill.path} shape — the geometry a faithful replica needs and\n\t * which the bare stop list omits.\n\t */\n\tget gradientFill(): GradientFill | null {\n\t\tconst props = this.properties()\n\t\treturn props ? this.#gradientFillIn(props) : null\n\t}\n\n\t/**\n\t * The shape's line/border **gradient** stroke (`spPr/a:ln/a:gradFill`), or\n\t * `null` when the line is a solid, absent, or inherited border (see\n\t * {@link resolvedLine}). The line counterpart of {@link gradientFill}: a\n\t * gradient-stroked connector — common for faded process arrows in styled decks\n\t * — otherwise surfaces only its {@link lineWidthPt}, dropping the colour\n\t * entirely, so a replica cannot reproduce the stroke.\n\t */\n\tget lineGradient(): GradientFill | null {\n\t\tconst ln = this.#line()\n\t\treturn ln ? this.#gradientFillIn(ln) : null\n\t}\n\n\t/**\n\t * The shape's line/connector arrowheads (`a:ln/a:headEnd` + `a:tailEnd`), or\n\t * `null` when neither end carries one. Essential for replicating connectors,\n\t * whose dot/arrow ends are otherwise invisible in the geometry.\n\t */\n\tget lineEnds(): LineEnds | null {\n\t\tconst ln = this.#line()\n\t\tif (!ln) return null\n\t\tconst read = (qn: string): LineEnd | null => {\n\t\t\tconst el = firstChild(ln, qn)\n\t\t\tif (!el) return null\n\t\t\treturn { type: attr(el, 'type') ?? 'none', width: attr(el, 'w') ?? null, length: attr(el, 'len') ?? null }\n\t\t}\n\t\tconst head = read('a:headEnd')\n\t\tconst tail = read('a:tailEnd')\n\t\treturn head || tail ? { head, tail } : null\n\t}\n\n\t/**\n\t * The shape's outer drop shadow (`spPr/a:effectLst/a:outerShdw`), resolved\n\t * against the host's theme, or `null` when the shape has no outer shadow. The\n\t * soft brand shadows the eye reads as \"floating\" panels live here and are\n\t * invisible in geometry/fill alone.\n\t */\n\tget shadow(): OuterShadow | null {\n\t\tconst shdw = this.#effect('a:outerShdw')\n\t\treturn shdw ? this.#readShadow(shdw) : null\n\t}\n\n\t/**\n\t * The shape's **inner** shadow (`spPr/a:effectLst/a:innerShdw`), resolved against\n\t * the host's theme, or `null` when the shape has no inner shadow. The inset\n\t * counterpart of {@link shadow}: the write-side `shadow: { type: 'inner' }`\n\t * emits it, and it is invisible in geometry/fill alone.\n\t */\n\tget innerShadow(): InnerShadow | null {\n\t\tconst shdw = this.#effect('a:innerShdw')\n\t\treturn shdw ? this.#readShadow(shdw) : null\n\t}\n\n\t/**\n\t * The shape's glow halo (`spPr/a:effectLst/a:glow`), resolved against the host's\n\t * theme, or `null` when the shape has no glow. Same element the write-side text\n\t * glow emits, so its {@link Glow.radiusPt} and colour round-trip.\n\t */\n\tget glow(): Glow | null {\n\t\tconst glow = this.#effect('a:glow')\n\t\tif (!glow) return null\n\t\tconst out: Glow = { color: null }\n\t\tthis.#applyEffectColor(out, firstChildElement(glow))\n\t\tconst rad = intValue(attr(glow, 'rad'))\n\t\tif (rad !== null) out.radiusPt = rad / EMU_PER_POINT\n\t\treturn out\n\t}\n\n\t/**\n\t * The shape's reflection (`spPr/a:effectLst/a:reflection`), or `null` when it has\n\t * none. Read-only: this library authors no reflection, so a replica should carry\n\t * the part rather than regenerate it — see {@link Reflection}.\n\t */\n\tget reflection(): Reflection | null {\n\t\tconst refl = this.#effect('a:reflection')\n\t\tif (!refl) return null\n\t\tconst out: Reflection = {}\n\t\tconst put = (target: keyof Reflection, name: string, div: number): void => {\n\t\t\tconst v = intValue(attr(refl, name))\n\t\t\tif (v !== null) out[target] = v / div\n\t\t}\n\t\tput('blurPt', 'blurRad', EMU_PER_POINT)\n\t\tput('offsetPt', 'dist', EMU_PER_POINT)\n\t\tput('angleDeg', 'dir', ANGLE_UNITS_PER_DEGREE)\n\t\tput('fadeAngleDeg', 'fadeDir', ANGLE_UNITS_PER_DEGREE)\n\t\tput('startAlpha', 'stA', PERCENT_SCALE)\n\t\tput('startPos', 'stPos', PERCENT_SCALE)\n\t\tput('endAlpha', 'endA', PERCENT_SCALE)\n\t\tput('endPos', 'endPos', PERCENT_SCALE)\n\t\treturn out\n\t}\n\n\t/**\n\t * The shape's soft (feathered) edge (`spPr/a:effectLst/a:softEdge`), or `null`\n\t * when it has none. Read-only like {@link reflection}: carry, don't regenerate.\n\t */\n\tget softEdge(): SoftEdge | null {\n\t\tconst soft = this.#effect('a:softEdge')\n\t\tif (!soft) return null\n\t\tconst rad = intValue(attr(soft, 'rad'))\n\t\treturn { radiusPt: rad === null ? 0 : rad / EMU_PER_POINT }\n\t}\n\n\t/**\n\t * The shape's pattern (hatch) fill (`spPr/a:pattFill`), or `null` when the fill\n\t * is not a pattern. Surfaces the {@link PatternFill.preset} name and both\n\t * colours resolved against the host's theme — the pattern counterpart of\n\t * {@link resolvedFill}, which reports `null` for a non-solid fill and so drops a\n\t * hatched surface entirely.\n\t */\n\tget patternFill(): PatternFill | null {\n\t\tconst props = this.properties()\n\t\treturn props ? readPatternFill(props, this.host.themeContext()) : null\n\t}\n\n\t/**\n\t * The shape's picture (image) fill (`spPr/a:blipFill`), or `null` when the fill\n\t * is not a picture. The image-fill counterpart of {@link patternFill}: a shape\n\t * whose *surface* is an image is not a {@link Picture} — it is an autoShape with\n\t * a blip fill — and {@link resolvedFill} reports `null` for one, so without this\n\t * an image-filled shape reads as unfilled. Carries the embedded image\n\t * ({@link PictureFill.relId}/{@link PictureFill.partName}) plus the stretch/tile\n\t * geometry.\n\t */\n\tget pictureFill(): PictureFill | null {\n\t\tconst props = this.properties()\n\t\treturn props ? readPictureFill(props, this.host.relationships) : null\n\t}\n\n\t/** A named child of the shape's effect list (`spPr/a:effectLst/<qname>`), or `null`. */\n\t#effect(qname: string): Element | null {\n\t\tconst props = this.properties()\n\t\tconst effectLst = props && firstChild(props, 'a:effectLst')\n\t\treturn effectLst ? firstChild(effectLst, qname) : null\n\t}\n\n\t/** Resolve `colorEl` against the theme and stamp `color`/`colorToken`/`alpha` onto an effect result. */\n\t#applyEffectColor(out: { color: string | null; colorToken?: string; alpha?: number }, colorEl: Element | null): void {\n\t\tconst resolved = resolveColorElement(colorEl, this.host.themeContext())\n\t\tif (resolved) {\n\t\t\tout.color = resolved.effectiveHex\n\t\t\tif (resolved.alpha !== undefined) out.alpha = resolved.alpha\n\t\t}\n\t\tif (colorEl && colorEl.localName === 'schemeClr') out.colorToken = attr(colorEl, 'val') ?? undefined\n\t}\n\n\t/** Decode a shadow element (`a:outerShdw`/`a:innerShdw` share the fields), resolving its colour. */\n\t#readShadow(shdw: Element): OuterShadow {\n\t\tconst out: OuterShadow = { color: null }\n\t\t// `a:EG_ColorChoice` is a required, single-member group, so the colour element is the shadow's\n\t\t// only child and taking the first one is both correct and total — the same thing `glow` above\n\t\t// does. Naming `a:srgbClr` and `a:schemeClr` explicitly dropped the other four models on the\n\t\t// floor: `a:sysClr` resolves everywhere else in the read model, and this library emits\n\t\t// `a:prstClr` itself (`gen/slide/notes.ts`). `resolveColor` now answers for five of the six\n\t\t// (`a:scrgbClr` is the exception, and reports no colour rather than a guessed one).\n\t\tthis.#applyEffectColor(out, firstChildElement(shdw))\n\t\tconst blur = intValue(attr(shdw, 'blurRad'))\n\t\tconst dist = intValue(attr(shdw, 'dist'))\n\t\tconst dir = intValue(attr(shdw, 'dir'))\n\t\tif (blur !== null) out.blurPt = blur / EMU_PER_POINT\n\t\tif (dist !== null) out.offsetPt = dist / EMU_PER_POINT\n\t\tif (dir !== null) out.angleDeg = dir / ANGLE_UNITS_PER_DEGREE\n\t\treturn out\n\t}\n\n\t/**\n\t * The shape's solid fill resolved against the host's theme\n\t * ({@link Slide.themeContext}) to a literal hex — the resolved counterpart of\n\t * {@link fillColor}/{@link fillSchemeColor}, which report the raw reference.\n\t * `null` when the shape has no `a:solidFill` (a gradient/none/inherited fill)\n\t * or the colour cannot be made literal. The returned {@link ResolvedColor}\n\t * carries the base `hex` and raw transforms, and `effectiveHex` — the base with\n\t * its colour transforms (`lumMod`/`shade`/…) applied (read that for the final\n\t * rendered colour).\n\t *\n\t * When the shape carries no explicit `spPr` fill choice, this falls back to the\n\t * fill the shape inherits from its `p:style` `a:fillRef` (the theme style\n\t * matrix), resolved the same way the `theme: 'preserve'` flatten path bakes it.\n\t */\n\tget resolvedFill(): ResolvedColor | null {\n\t\tconst ctx = this.host.themeContext()\n\t\tconst props = this.properties()\n\t\tif (props && FILL_CHOICES.some((q) => firstChild(props, q))) return resolveSolidFillColor(props, ctx)\n\t\treturn resolveStyleFillColor(this.element, ctx)\n\t}\n\n\t/**\n\t * The shape's line/border solid fill resolved against the host's theme to a\n\t * literal hex — the resolved counterpart of {@link lineColor}/{@link lineSchemeColor}.\n\t * `null` when the shape has no `a:ln/a:solidFill` or it cannot be made literal.\n\t * Like {@link resolvedFill}, the result carries `effectiveHex` (the base colour\n\t * with its transforms applied) for the final rendered colour.\n\t *\n\t * When the shape carries no explicit `spPr/a:ln`, this falls back to the line\n\t * the shape inherits from its `p:style` `a:lnRef` (the theme style matrix).\n\t */\n\tget resolvedLine(): ResolvedColor | null {\n\t\tconst ctx = this.host.themeContext()\n\t\tconst ln = this.#line()\n\t\treturn ln ? resolveSolidFillColor(ln, ctx) : resolveStyleLineColor(this.element, ctx)\n\t}\n\n\t/** The line element (`spPr/a:ln`), or `null` when absent. */\n\t#line(): Element | null {\n\t\tconst props = this.properties()\n\t\treturn props ? firstChild(props, 'a:ln') : null\n\t}\n\n\t#setFill(color: { qname: string; val: string } | null): void {\n\t\tif (color === null) {\n\t\t\tconst props = this.properties()\n\t\t\tif (!props || !firstChild(props, 'a:solidFill')) return\n\t\t\tremoveChildrenByQName(props, ['a:solidFill'])\n\t\t\tthis.markDirty()\n\t\t\treturn\n\t\t}\n\t\tif (!this.supportsFill)\n\t\t\tthrow new UnsupportedFeatureError(\n\t\t\t\t'shape/fill-unsupported',\n\t\t\t\t`${this.shapeType} shapes do not support a solid fill`\n\t\t\t)\n\t\tconst { props, fillAfter } = this.getOrAddProperties()\n\t\tsetSolidFill(props, fillAfter, color)\n\t\tthis.markDirty()\n\t}\n\n\t#setLine(color: { qname: string; val: string } | null): void {\n\t\tif (color === null) {\n\t\t\tconst ln = this.#line()\n\t\t\tif (!ln || !firstChild(ln, 'a:solidFill')) return\n\t\t\tremoveChildrenByQName(ln, ['a:solidFill'])\n\t\t\tthis.markDirty()\n\t\t\treturn\n\t\t}\n\t\tconst { props, lnAfter } = this.getOrAddProperties()\n\t\tif (lnAfter === null)\n\t\t\tthrow new UnsupportedFeatureError(\n\t\t\t\t'shape/line-unsupported',\n\t\t\t\t`${this.shapeType} shapes do not support a line colour`\n\t\t\t)\n\t\tconst ln = getOrAddChild(props, 'a:ln', lnAfter)\n\t\tsetSolidFill(ln, LN_FILL_AFTER, color)\n\t\tthis.markDirty()\n\t}\n\n\t/** Whether this shape can hold text (only `p:sp` does in this read model). */\n\tget hasTextFrame(): boolean {\n\t\treturn false\n\t}\n\n\t/** The shape's text frame, or `null` when it cannot hold text. */\n\tget textFrame(): TextFrame | null {\n\t\treturn null\n\t}\n\n\t/** Convenience: the shape's full text, or `''` if it has none. */\n\tget text(): string {\n\t\treturn this.textFrame?.text ?? ''\n\t}\n\n\t/**\n\t * Convenience: replace the shape's text with a single run, preserving the\n\t * first existing run's formatting (see {@link TextFrame.text}). Throws when the\n\t * shape has no text frame. For multiple runs or per-run formatting, edit\n\t * `textFrame.paragraphs[].runs[]` directly.\n\t */\n\tset text(value: string) {\n\t\tconst frame = this.textFrame\n\t\tif (!frame) throw new UnsupportedFeatureError('shape/no-text-frame', 'Shape has no text frame to set text on')\n\t\tframe.text = value\n\t}\n\n\t/**\n\t * This shape's placeholder identity (`p:ph` `type`/`idx`), or `null` when it is\n\t * not a placeholder. Only `p:sp` shapes can be placeholders, so the base\n\t * implementation always returns `null`; {@link AutoShape} overrides it.\n\t */\n\tget placeholder(): PlaceholderRef | null {\n\t\treturn null\n\t}\n\n\t/**\n\t * Remove this shape from its parent (the host's shape tree, or an enclosing\n\t * group) and mark the owning host's part dirty. The proxy is dead afterwards.\n\t */\n\tdelete(): void {\n\t\tconst parent = this.element.parentNode\n\t\tif (!parent)\n\t\t\tthrow new InternalError('oxml/node-has-no-parent', 'Shape is not attached to a parent and cannot be deleted')\n\t\tparent.removeChild(this.element)\n\t\tthis.markDirty()\n\t}\n\n\t/** Escape hatch: the underlying shape element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */\n\tget element_(): Element {\n\t\treturn this.element\n\t}\n}\n","/**\n * An auto shape, text box, or placeholder (`p:sp`) — the only shape kind that holds text.\n */\n\nimport { attr, firstChild, getElements } from '../../oxml/dom.js'\nimport { resolveStyleFontRef, type PlaceholderRef } from '../theme-context.js'\nimport { TextFrame } from '../text.js'\nimport { Shape } from './base.js'\nimport { readGeometryPath } from './geometry.js'\nimport type { CustomGeometry } from './types.js'\nimport { nvPrOf } from '../../oxml/slide-dom.js'\n\n/** An auto shape, text box, or placeholder (`p:sp`). The only kind that holds text. */\nexport class AutoShape extends Shape {\n\treadonly shapeType = 'autoShape' as const\n\n\toverride get hasTextFrame(): boolean {\n\t\treturn firstChild(this.element, 'p:txBody') !== null\n\t}\n\n\toverride get textFrame(): TextFrame | null {\n\t\tconst txBody = firstChild(this.element, 'p:txBody')\n\t\tif (!txBody) return null\n\t\tconst flatten = this.host.themeContext()\n\t\t// Every shape resolves its `p:style/a:fontRef` and the presentation's\n\t\t// `p:defaultTextStyle`, so a context is always supplied; `ph` is null for a\n\t\t// non-placeholder shape, which then skips only the layout/master placeholder tiers.\n\t\tconst ph = this.placeholder\n\t\tconst fontRef = resolveStyleFontRef(this.element, flatten)\n\t\treturn new TextFrame(txBody, this.host.part, flatten, { ph, flatten, fontRef }, this.host.relationships)\n\t}\n\n\t/**\n\t * This shape's placeholder identity (`p:ph` `type`/`idx`), or `null` when it is\n\t * not a placeholder. `idx` defaults to `'0'` when the attribute is absent, as\n\t * PowerPoint does. Use {@link Slide.placeholder} to find a placeholder by type.\n\t */\n\toverride get placeholder(): PlaceholderRef | null {\n\t\tconst nvPr = nvPrOf(this.element)\n\t\tconst ph = nvPr && firstChild(nvPr, 'p:ph')\n\t\treturn ph ? { type: attr(ph, 'type'), idx: attr(ph, 'idx') ?? '0' } : null\n\t}\n\n\t/**\n\t * Custom freeform geometry (`spPr/a:custGeom/a:pathLst`), or `null` when the\n\t * shape uses preset geometry / none. The faithful, multi-path counterpart of\n\t * {@link presetGeometry}: each `a:path` keeps its own path-unit viewport\n\t * (`w`/`h`) and ordered {@link GeometryCommand}s. Coordinates are raw path-unit\n\t * integers, not EMU — pair the path `w`/`h` with the shape's box size to map\n\t * them into slide space.\n\t */\n\tget customGeometry(): CustomGeometry | null {\n\t\tconst props = this.properties()\n\t\tconst custGeom = props && firstChild(props, 'a:custGeom')\n\t\tif (!custGeom) return null\n\t\tconst pathLst = firstChild(custGeom, 'a:pathLst')\n\t\tconst paths = pathLst ? getElements(pathLst, 'a:path').map((p) => readGeometryPath(p)) : []\n\t\treturn { paths }\n\t}\n}\n","/**\n * A picture (`p:pic`).\n *\n * A picture's drawn data is its sibling `p:blipFill`, not a fill of `p:spPr`, which is why the\n * blip plumbing (content-type → extension, the SVG extension blip, the recolour effects) lives\n * here rather than on the base: no other shape kind carries it.\n */\n\nimport {\n\tELEMENT_NODE,\n\tattr,\n\tfirstChild,\n\tfirstChildElement,\n\tgetElements,\n\tgetOrAddChild,\n\tintValue,\n\tremoveChildrenByQName,\n\tsetAttr,\n\tOOXML_NS,\n\ttype Element,\n} from '../../oxml/dom.js'\nimport { fitSrcRectPercents, getImageSizeFromBytes } from '../../../media/image-size.js'\nimport { warn } from '../../../diagnostics.js'\nimport { relativePartName } from '../../opc/partnames.js'\nimport { Shape } from './base.js'\nimport { childElements } from './oxml.js'\nimport type { Recolor, RecolorColor } from './types.js'\nimport { IMAGE_REL } from '../../../ooxml/rel-types.js'\nimport { InvalidOptionError } from '../../../errors.js'\nimport { PERCENT_SCALE } from '../../../units.js'\n\n// Microsoft's SVG blip extension namespace (a:blip/a:extLst/a:ext/asvg:svgBlip).\nconst ASVG_NS = 'http://schemas.microsoft.com/office/drawing/2016/SVG/main'\n\n// Schema successors within p:pic (CT_Picture: nvPicPr, blipFill, spPr, style?)\n// and within a:blipFill (blip?, srcRect?, (tile|stretch)?), used to keep a\n// get-or-added p:blipFill / a:blip in document order.\nconst PIC_AFTER_BLIPFILL = ['p:spPr', 'p:style']\nconst BLIPFILL_AFTER_BLIP = ['a:srcRect', 'a:tile', 'a:stretch']\n\n/** Known content-type → file-extension map for image media parts. */\nconst IMAGE_EXTENSION_BY_CONTENT_TYPE: Readonly<Record<string, string>> = Object.freeze({\n\t'image/png': 'png',\n\t'image/jpeg': 'jpeg',\n\t'image/gif': 'gif',\n\t'image/bmp': 'bmp',\n\t'image/tiff': 'tiff',\n\t'image/webp': 'webp',\n\t'image/svg+xml': 'svg',\n\t'image/x-emf': 'emf',\n\t'image/x-wmf': 'wmf',\n})\n\n/**\n * Default a media-part file extension from a content type. Known image types use\n * an explicit map; otherwise fall back to the content-type subtype (before any\n * `+suffix`, with a leading `x-` stripped), e.g. `image/x-foo` → `foo`.\n */\nfunction extFromContentType(contentType: string): string {\n\tconst known = IMAGE_EXTENSION_BY_CONTENT_TYPE[contentType.toLowerCase()]\n\tif (known) return known\n\tconst subtype = contentType.toLowerCase().split('/')[1] ?? ''\n\tconst ext = (subtype.split('+')[0] ?? '').replace(/^x-/, '')\n\tif (!ext)\n\t\tthrow new InvalidOptionError(\n\t\t\t'image/undeterminable-extension',\n\t\t\t`Cannot derive a file extension from content type \"${contentType}\"; pass { extension }`\n\t\t)\n\treturn ext\n}\n\n/** Convert a DrawingML colour element to a {@link RecolorColor}, or `null` when it is not an `a:` colour element. */\nfunction recolorColorOf(color: Element | null): RecolorColor | null {\n\tif (!color || color.namespaceURI !== OOXML_NS.a) return null\n\treturn {\n\t\tcolor: color.localName === 'srgbClr' ? attr(color, 'val') : null,\n\t\tschemeColor: color.localName === 'schemeClr' ? attr(color, 'val') : null,\n\t\tpresetColor: color.localName === 'prstClr' ? attr(color, 'val') : null,\n\t}\n}\n\n/** A picture (`p:pic`). */\nexport class Picture extends Shape {\n\treadonly shapeType = 'picture' as const\n\n\t// A picture's image is its sibling `p:blipFill`, not a fill of `p:spPr`, so a\n\t// solid `spPr` fill would not clobber the image. v1 still omits fill setters\n\t// here — recolouring a picture surface is rarely what a caller means — and\n\t// exposes only the border via `lineColor`. Reads of `fillColor` stay valid.\n\tprotected override get supportsFill(): boolean {\n\t\treturn false\n\t}\n\n\t/** Relationship id of the embedded image (`p:blipFill/a:blip/@r:embed`), or `null`. */\n\tget imageRelId(): string | null {\n\t\tconst blipFill = firstChild(this.element, 'p:blipFill')\n\t\tconst blip = blipFill && firstChild(blipFill, 'a:blip')\n\t\treturn blip ? attr(blip, 'r:embed') : null\n\t}\n\n\t/**\n\t * Repoint the blip at a relationship id already present in the owning part's\n\t * relationships, without minting a new media part. The caller owns ensuring\n\t * the id exists and targets an image; use {@link setImage} to add fresh bytes.\n\t */\n\tset imageRelId(value: string) {\n\t\tsetAttr(this.#getOrAddBlip(), 'r:embed', value)\n\t\tthis.markDirty()\n\t}\n\n\t/** Absolute partname of the embedded image, resolved via the owning part's relationships, or `null`. */\n\tget imagePartName(): string | null {\n\t\tconst relId = this.imageRelId\n\t\treturn relId ? this.host.relationships.resolveTarget(relId) : null\n\t}\n\n\t/**\n\t * Relationship id of the embedded **vector (SVG)** image, read from the\n\t * Microsoft SVG blip extension (`a:blip/a:extLst/a:ext/asvg:svgBlip/@r:embed`),\n\t * or `null` when the picture has no SVG. PowerPoint usually pairs this with a\n\t * raster fallback in `a:blip/@r:embed` ({@link imageRelId}), but some exporters\n\t * emit an SVG-only blip where `imageRelId` is absent and only this resolves —\n\t * so a reader that wants the real drawn art must consult both.\n\t */\n\tget svgRelId(): string | null {\n\t\tconst svg = this.#svgBlip()\n\t\treturn svg ? attr(svg, 'r:embed') : null\n\t}\n\n\t/** Absolute partname of the embedded SVG image, resolved via the owning part's relationships, or `null`. */\n\tget svgPartName(): string | null {\n\t\tconst relId = this.svgRelId\n\t\treturn relId ? this.host.relationships.resolveTarget(relId) : null\n\t}\n\n\t/**\n\t * Which drawable media this picture carries:\n\t * - `'raster'` — only a raster blip (`a:blip/@r:embed`);\n\t * - `'svg'` — only a vector blip (`asvg:svgBlip/@r:embed`, no raster). This\n\t * is what PowerPoint's *Insert → Icons* and a plain SVG insert produce;\n\t * - `'both'` — a raster fallback *and* an SVG (PowerPoint's usual pairing);\n\t * - `'none'` — a `p:pic` with no embedded blip at all (e.g. a linked image).\n\t *\n\t * Lets a caller distinguish an SVG-only picture — where {@link imagePartName}\n\t * is legitimately `null` — from a genuinely empty one, without two null checks.\n\t */\n\tget mediaKind(): 'raster' | 'svg' | 'both' | 'none' {\n\t\tconst hasRaster = this.imageRelId != null\n\t\tconst hasSvg = this.svgRelId != null\n\t\tif (hasRaster && hasSvg) return 'both'\n\t\tif (hasRaster) return 'raster'\n\t\tif (hasSvg) return 'svg'\n\t\treturn 'none'\n\t}\n\n\t/**\n\t * Absolute partname of whichever part actually carries this picture's drawn\n\t * data — the raster part when present, otherwise the SVG part — or `null`\n\t * when the picture embeds neither. Use this when you just want \"the bytes\n\t * this picture shows\"; prefer {@link imagePartName} / {@link svgPartName}\n\t * (and {@link mediaKind}) when you need to know *which* kind it is. An\n\t * SVG-only picture returns its SVG part here even though `imagePartName` is\n\t * `null`.\n\t */\n\tget mediaPartName(): string | null {\n\t\treturn this.imagePartName ?? this.svgPartName\n\t}\n\n\t/**\n\t * The picture's crop as fractions of the *source image*, read from\n\t * `p:blipFill/a:srcRect` — `{ left, top, right, bottom }`, each the amount\n\t * trimmed off that edge (so `0.1` = 10 % cropped away, an uncropped edge is\n\t * `0`). `null` when there is no `a:srcRect` at all; an explicit\n\t * `{0,0,0,0}` crop still reports zeros, since its presence is meaningful.\n\t * The raw attributes are thousandths of a percent; this divides by 100000 to\n\t * match the fraction convention used elsewhere in the read API (see\n\t * {@link recolor}).\n\t */\n\tget crop(): { left: number; top: number; right: number; bottom: number } | null {\n\t\tconst blipFill = firstChild(this.element, 'p:blipFill')\n\t\tconst srcRect = blipFill && firstChild(blipFill, 'a:srcRect')\n\t\tif (!srcRect) return null\n\t\tconst edge = (name: string): number => {\n\t\t\tconst v = intValue(attr(srcRect, name))\n\t\t\treturn v === null ? 0 : v / PERCENT_SCALE\n\t\t}\n\t\treturn { left: edge('l'), top: edge('t'), right: edge('r'), bottom: edge('b') }\n\t}\n\n\t/**\n\t * The picture's blip recolour effect (`p:blipFill/a:blip` recolour child), or\n\t * `null` when the blip carries none. Recognises the effects a faithful reader\n\t * needs to reproduce a recoloured image: `a:duotone` (the two-stop icon-tint\n\t * trick), `a:clrChange`, `a:grayscl`, `a:biLevel`, and `a:alphaModFix`; the\n\t * first such effect in document order wins. Colours mirror the\n\t * {@link GradientStop} split (`color`/`schemeColor`/`presetColor`) so theme\n\t * tokens resolve through {@link Slide.themeContext}. `threshold`/`amount` are\n\t * 0–1 fractions. {@link hidden} (the duotone fallback-layer trick) reports the\n\t * *visibility* of a recolour source; this reports the *tint* itself.\n\t */\n\tget recolor(): Recolor | null {\n\t\tconst blipFill = firstChild(this.element, 'p:blipFill')\n\t\tconst blip = blipFill && firstChild(blipFill, 'a:blip')\n\t\tif (!blip) return null\n\t\tfor (const child of childElements(blip)) {\n\t\t\tif (child.namespaceURI !== OOXML_NS.a) continue\n\t\t\tswitch (child.localName) {\n\t\t\t\tcase 'duotone':\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: 'duotone',\n\t\t\t\t\t\tstops: childElements(child)\n\t\t\t\t\t\t\t.map(recolorColorOf)\n\t\t\t\t\t\t\t.filter((c): c is RecolorColor => c !== null),\n\t\t\t\t\t}\n\t\t\t\tcase 'clrChange': {\n\t\t\t\t\tconst from = firstChild(child, 'a:clrFrom')\n\t\t\t\t\tconst to = firstChild(child, 'a:clrTo')\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: 'clrChange',\n\t\t\t\t\t\tfrom: from ? recolorColorOf(firstChildElement(from)) : null,\n\t\t\t\t\t\tto: to ? recolorColorOf(firstChildElement(to)) : null,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcase 'grayscl':\n\t\t\t\t\treturn { kind: 'grayscale' }\n\t\t\t\tcase 'biLevel': {\n\t\t\t\t\tconst thresh = intValue(attr(child, 'thresh'))\n\t\t\t\t\treturn { kind: 'biLevel', threshold: thresh === null ? null : thresh / PERCENT_SCALE }\n\t\t\t\t}\n\t\t\t\tcase 'alphaModFix': {\n\t\t\t\t\tconst amt = intValue(attr(child, 'amt'))\n\t\t\t\t\treturn { kind: 'alphaModFix', amount: amt === null ? 1 : amt / PERCENT_SCALE }\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\t/** The `<asvg:svgBlip>` element inside the blip's extLst, or `null` when the picture carries no SVG. */\n\t#svgBlip(): Element | null {\n\t\tconst blipFill = firstChild(this.element, 'p:blipFill')\n\t\tconst blip = blipFill && firstChild(blipFill, 'a:blip')\n\t\tconst extLst = blip && firstChild(blip, 'a:extLst')\n\t\tif (!extLst) return null\n\t\tfor (const ext of getElements(extLst, 'a:ext')) {\n\t\t\tfor (let node = ext.firstChild; node; node = node.nextSibling) {\n\t\t\t\tif (node.nodeType !== ELEMENT_NODE) continue\n\t\t\t\tconst el = node as Element\n\t\t\t\tif (el.localName === 'svgBlip' && el.namespaceURI === ASVG_NS) return el\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\t/**\n\t * Replace this picture's image with new bytes. Mints a fresh media part under\n\t * `/ppt/media/`, registers its content type, wires an `image` relationship\n\t * from the owning part, and repoints the blip's `@r:embed` at it.\n\t *\n\t * Copy-on-write: the previous media part is never mutated or removed, so any\n\t * other picture sharing it (common after `importSlide`/dedup) is unaffected;\n\t * an orphaned old part is left in place for a later GC pass to prune.\n\t *\n\t * `contentType` is required (e.g. `image/png`); the bytes are not sniffed.\n\t * `extension` defaults from the content type.\n\t *\n\t * `fit` controls the picture's `a:srcRect` crop against its current frame\n\t * extent (`a:xfrm/a:ext`):\n\t * - omitted (default): geometry and crop are left untouched — the caller owns\n\t * sizing. Note an inherited `a:srcRect` was tuned to the *previous* image's\n\t * aspect ratio, so swapping in an image of a different ratio reuses a crop\n\t * that no longer fits and the result looks stretched; pass `fit` to refit.\n\t * - `'cover'`: fill the frame, cropping the overflowing axis (no distortion).\n\t * - `'contain'`: fit the whole image inside the frame, letterboxing the short\n\t * axis (no distortion).\n\t * - `'stretch'`: drop any crop so the full image is stretched to the frame.\n\t *\n\t * `'cover'`/`'contain'` measure the new bytes' natural size; if unmeasurable\n\t * (e.g. an unknown format) the crop is left as-is and a warning is emitted.\n\t */\n\tsetImage(\n\t\tbytes: Uint8Array,\n\t\toptions: { contentType: string; extension?: string; fit?: 'cover' | 'contain' | 'stretch' }\n\t): void {\n\t\tconst { contentType } = options\n\t\tif (!contentType)\n\t\t\tthrow new InvalidOptionError('image/missing-content-type', 'setImage requires a contentType (e.g. \"image/png\")')\n\t\tconst extension = (options.extension ?? extFromContentType(contentType)).toLowerCase().replace(/^\\./, '')\n\n\t\tconst opc = this.host.opc\n\t\tconst mediaPartName = opc.reserveMediaPartName(extension)\n\t\topc.addPart(mediaPartName, contentType, bytes)\n\t\tconst relId = this.host.relationships.add(IMAGE_REL, relativePartName(this.host.partName, mediaPartName)).id\n\n\t\tsetAttr(this.#getOrAddBlip(), 'r:embed', relId)\n\t\tif (options.fit) this.#applyFit(options.fit, bytes)\n\t\tthis.markDirty()\n\t}\n\n\t/**\n\t * Refit the blip crop after a {@link setImage} swap. `stretch` removes any\n\t * `a:srcRect`; `cover`/`contain` recompute it from the new image's natural\n\t * size against the frame extent so the swap is aspect-correct.\n\t */\n\t#applyFit(fit: 'cover' | 'contain' | 'stretch', bytes: Uint8Array): void {\n\t\tconst blipFill = getOrAddChild(this.element, 'p:blipFill', PIC_AFTER_BLIPFILL)\n\t\tif (fit === 'stretch') {\n\t\t\tremoveChildrenByQName(blipFill, ['a:srcRect'])\n\t\t\treturn\n\t\t}\n\t\tconst natural = getImageSizeFromBytes(bytes)\n\t\tif (!natural) {\n\t\t\twarn(\n\t\t\t\t'image/unmeasurable-natural-size',\n\t\t\t\t`setImage fit '${fit}': could not measure the new image's natural size; leaving the crop unchanged (it may look stretched). Provide a raster (PNG/JPEG/GIF/BMP/WebP) or an SVG with width/height or a viewBox.`\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t\tconst cx = this.width\n\t\tconst cy = this.height\n\t\tif (cx == null || cy == null) {\n\t\t\tthrow new InvalidOptionError(\n\t\t\t\t'image/fit-needs-extent',\n\t\t\t\t`setImage fit '${fit}' needs a frame extent (a:xfrm/a:ext); this picture has no transform`\n\t\t\t)\n\t\t}\n\t\tconst { l, r, t, b } = fitSrcRectPercents(fit, { w: natural.w, h: natural.h }, { w: cx, h: cy })\n\t\tconst srcRect = getOrAddChild(blipFill, 'a:srcRect', ['a:tile', 'a:stretch'])\n\t\tsetAttr(srcRect, 'l', String(l))\n\t\tsetAttr(srcRect, 'r', String(r))\n\t\tsetAttr(srcRect, 't', String(t))\n\t\tsetAttr(srcRect, 'b', String(b))\n\t}\n\n\t/** Get-or-add `p:blipFill/a:blip`, keeping both in document order. */\n\t#getOrAddBlip(): Element {\n\t\tconst blipFill = getOrAddChild(this.element, 'p:blipFill', PIC_AFTER_BLIPFILL)\n\t\treturn getOrAddChild(blipFill, 'a:blip', BLIPFILL_AFTER_BLIP)\n\t}\n}\n","/**\n * A connector / line (`p:cxnSp`).\n */\n\nimport { attr, firstChild, intValue } from '../../oxml/dom.js'\nimport { Shape } from './base.js'\nimport type { ConnectionSite } from './types.js'\n\n/** A connector / line (`p:cxnSp`). */\nexport class Connector extends Shape {\n\treadonly shapeType = 'connector' as const\n\n\t/**\n\t * The connector's **start**-point shape binding (`p:nvCxnSpPr/p:cNvCxnSpPr/a:stCxn`),\n\t * or `null` when the start point is unbound (a bare `p:cNvCxnSpPr`, i.e. a\n\t * connector placed by static endpoint geometry). Mirrors the write API's\n\t * `startShape`/`startShapeIdx` split; see {@link endConnection} for the other end.\n\t */\n\tget startConnection(): ConnectionSite | null {\n\t\treturn this.#connection('a:stCxn')\n\t}\n\n\t/**\n\t * The connector's **end**-point shape binding (`p:nvCxnSpPr/p:cNvCxnSpPr/a:endCxn`),\n\t * or `null` when the end point is unbound. See {@link startConnection}.\n\t */\n\tget endConnection(): ConnectionSite | null {\n\t\treturn this.#connection('a:endCxn')\n\t}\n\n\t/** Decode one `a:stCxn` / `a:endCxn` binding, resolving its `@id` to a shape in the same tree. */\n\t#connection(qname: string): ConnectionSite | null {\n\t\tconst nvCxnSpPr = firstChild(this.element, 'p:nvCxnSpPr')\n\t\tconst cNvCxnSpPr = nvCxnSpPr && firstChild(nvCxnSpPr, 'p:cNvCxnSpPr')\n\t\tconst cxn = cNvCxnSpPr && firstChild(cNvCxnSpPr, qname)\n\t\tif (!cxn) return null\n\t\tconst shapeId = intValue(attr(cxn, 'id'))\n\t\tconst siteIndex = intValue(attr(cxn, 'idx'))\n\t\t// CT_Connection requires both @id and @idx; an unparseable pair degrades to null\n\t\t// rather than a half-populated site.\n\t\tif (shapeId === null || siteIndex === null) return null\n\t\treturn { shapeId, siteIndex, boundShape: this.host.shapeByIdDeep(shapeId) ?? null }\n\t}\n}\n","/**\n * The one place a chart point cache is turned into an idx-ordered array.\n *\n * Both chart families cache their category/value data the same way: a run of indexed point\n * elements plus a declared count, which the reader widens back into a dense array so\n * `series.values[3]` means the point at `idx=\"3\"` and a gap reads as `null`. Classic `c:`\n * charts and 2016 `cx:` charts spell it differently — `c:ptCount/@val` and a `c:v` child\n * against `cx:lvl/@ptCount` and the point's own text — and nothing else about the two decodes\n * differs, so the shape parameterizes over exactly those two differences.\n *\n * **Why neither number out of the file is trusted.** `@ptCount` is `xsd:unsignedInt`, so\n * `4294967295` is schema-valid, and `new Array(n).fill(null)` at that size is not a slow path\n * but a process kill: V8 answers `FATAL ERROR: invalid table size` and the host dies with no\n * exception to catch. That was reachable through the public read API — `Presentation.load()`\n * on a deck with an edited `c:ptCount` returned normally and the first `chart.series` access\n * killed the process. A single `<c:pt idx=\"900000000\"/>` does the same thing on its own.\n * Reading a deck is the one part of this library whose input comes from somewhere other than\n * the calling program, so both numbers are bounded here.\n *\n * The array is sized by the points that are really there, not by the declared count. The cost\n * of that is a *trailing* gap: a cache declaring four points but carrying three (the fourth\n * cell blank) reads three long rather than four. No value is lost — the dropped slots are the\n * ones that would have been `null` — and the disagreement is warned about either way.\n */\nimport { attr, intValue, type Element } from './dom.js'\nimport { warn } from '../../diagnostics.js'\n\n/**\n * The highest point index this reader will honour.\n *\n * A cache references a range in the embedded workbook, and a worksheet has 1,048,576 rows, so\n * a point index at or above that cannot describe data any producer could have charted. Using\n * the sheet bound rather than a round number keeps the ceiling something a reader can check:\n * below it every real cache fits, above it the file is wrong by construction. It also caps the\n * worst-case allocation at about 8 MB of `null` — survivable, and reported — instead of an\n * unbounded one that takes the process with it.\n */\nconst MAX_POINT_INDEX = 1048576\n\n/**\n * Read indexed cache points into a dense, idx-ordered array.\n *\n * The result is as long as the highest `@idx` actually present, and holds `null` at every\n * index no point claimed. A declared count that disagrees is warned about and not obeyed; a\n * point indexed past {@link MAX_POINT_INDEX} is warned about and dropped.\n * @param pts - the point elements, in document order\n * @param declaredCount - the cache's own count attribute, or `null` when absent\n * @param valueOf - reads one point's value; the two chart families differ only here\n * @param label - what to call the count in a diagnostic, e.g. `c:ptCount`\n */\nexport function readIndexedPoints(\n\tpts: Element[],\n\tdeclaredCount: number | null,\n\tvalueOf: (pt: Element) => string | null,\n\tlabel: string\n): (string | null)[] {\n\t// One pass to find the real extent — one past the highest index a point actually claims,\n\t// ignoring the ones that claim an impossible index. A cache carrying no points has no\n\t// extent at all, whatever it declares.\n\tlet count = 0\n\tlet dropped = 0\n\tfor (const pt of pts) {\n\t\tconst idx = intValue(attr(pt, 'idx')) ?? 0\n\t\tif (idx < 0 || idx >= MAX_POINT_INDEX) {\n\t\t\tdropped++\n\t\t\tcontinue\n\t\t}\n\t\tif (idx + 1 > count) count = idx + 1\n\t}\n\tif (dropped > 0) {\n\t\twarn(\n\t\t\t'chart/point-index-out-of-range',\n\t\t\t`${label}: ${dropped} cache point(s) are indexed outside 0..${MAX_POINT_INDEX - 1}, which no worksheet-backed chart can reference; they were dropped`\n\t\t)\n\t}\n\tif (declaredCount !== null && declaredCount !== count) {\n\t\twarn(\n\t\t\t'chart/point-count-mismatch',\n\t\t\t`${label} declares ${declaredCount} point(s) but the cache carries ${pts.length}; reading ${count} rather than allocating the declared size`\n\t\t)\n\t}\n\tconst points: (string | null)[] = new Array<string | null>(count).fill(null)\n\tfor (const pt of pts) {\n\t\tconst idx = intValue(attr(pt, 'idx')) ?? 0\n\t\tif (idx < 0 || idx >= count) continue\n\t\tpoints[idx] = valueOf(pt)\n\t}\n\treturn points\n}\n","/**\n * Read-only proxies for a chart (`c:chart`) hosted in a `p:graphicFrame`.\n *\n * A chart lives in its own part (`/ppt/charts/chartN.xml`), referenced from the\n * graphic frame by relationship id. `Chart` reads the chart type, title, series,\n * and the **cached** category/value data (`c:numCache` / `c:strCache`) that\n * PowerPoint stores alongside the embedded workbook. Editing the underlying\n * workbook is out of scope; this surface is read-only.\n */\nimport type { Part } from '../opc/part.js'\nimport {\n\tELEMENT_NODE,\n\tOOXML_NS,\n\tattr,\n\tboolValue,\n\tfirstChild,\n\tgetElements,\n\tintValue,\n\ttype Element,\n} from '../oxml/dom.js'\nimport { readIndexedPoints } from '../oxml/point-cache.js'\nimport { EMU_PER_POINT } from '../../units.js'\n\n/** A chart axis number format (`c:numFmt`). */\nexport interface AxisNumberFormat {\n\t/** The format mask (`@formatCode`), e.g. `\"General\"`, `\"0.0%\"`. */\n\tformatCode: string | null\n\t/** Whether the mask is linked to the source cell format (`@sourceLinked`). */\n\tsourceLinked: boolean | null\n}\n\n/** A chart legend (`c:legend`). */\nexport interface ChartLegend {\n\t/** Legend position (`c:legendPos/@val`): `r`/`l`/`t`/`b`/`tr`. */\n\tposition: string | null\n\t/** Whether the legend overlays the plot area (`c:overlay/@val`). */\n\toverlay: boolean | null\n}\n\n/** A chart's data-label settings (`c:dLbls`), read from the first plot group. */\nexport interface ChartDataLabels {\n\t/** Show the point value (`c:showVal`). */\n\tshowValue: boolean | null\n\t/** Show the series name (`c:showSerName`). */\n\tshowSeriesName: boolean | null\n\t/** Show the category name (`c:showCatName`). */\n\tshowCategoryName: boolean | null\n\t/** Show the percentage (`c:showPercent`). */\n\tshowPercent: boolean | null\n\t/** Show the legend key swatch (`c:showLegendKey`). */\n\tshowLegendKey: boolean | null\n\t/** Show the bubble size (`c:showBubbleSize`). */\n\tshowBubbleSize: boolean | null\n\t/** Show leader lines (`c:showLeaderLines`). */\n\tshowLeaderLines: boolean | null\n\t/** Label position (`c:dLblPos/@val`), or `null` when auto. */\n\tposition: string | null\n\t/** Label number format (`c:numFmt`), or `null` when absent. */\n\tnumberFormat: AxisNumberFormat | null\n}\n\n/** A series' solid fill (`c:ser/c:spPr`). */\nexport interface ChartFill {\n\t/** Literal fill colour (`a:srgbClr/@val`), or `null` for a scheme/no fill. */\n\tcolor: string | null\n\t/** Raw scheme-colour token (`a:schemeClr/@val`), unresolved. */\n\tschemeColor: string | null\n\t/** Whether the fill is explicitly suppressed (`a:noFill`). */\n\tnoFill: boolean\n}\n\n/** A series' line/stroke (`c:ser/c:spPr/a:ln`). */\nexport interface ChartLine {\n\t/** Stroke width in points (`@w`/12700), or `null` when unset. */\n\twidthPt: number | null\n\t/** Dash style (`a:prstDash/@val`), or `null` when solid/unset. */\n\tdash: string | null\n\t/** Literal stroke colour (`a:srgbClr/@val`), or `null`. */\n\tcolor: string | null\n\t/** Raw scheme-colour token (`a:schemeClr/@val`), unresolved. */\n\tschemeColor: string | null\n\t/** Whether the line is explicitly suppressed (`a:noFill`). */\n\tnoFill: boolean\n}\n\n/** A chart graphic-frame's chart, backed by its chart part. */\nexport class Chart {\n\tconstructor(\n\t\t/** The chart's OPC part (`/ppt/charts/chartN.xml`). */\n\t\treadonly part: Part\n\t) {}\n\n\t/** Partname of the chart part. */\n\tget partName(): string {\n\t\treturn this.part.partName\n\t}\n\n\t/**\n\t * The chart-group type tokens present in the plot area, in document order\n\t * (e.g. `['line']`, `['bar']`, `['bar', 'line']` for a combo chart). Derived\n\t * from the plot-area element local names (`lineChart` → `line`).\n\t */\n\tget chartTypes(): string[] {\n\t\treturn this.#chartGroups().map((group) => (group.localName ?? '').replace(/Chart$/, ''))\n\t}\n\n\t/** The first chart-group type, or `null` for an empty plot area. */\n\tget chartType(): string | null {\n\t\treturn this.chartTypes[0] ?? null\n\t}\n\n\t/** The chart title (`c:chart/c:title` rich text), or `null` when absent/auto. */\n\tget title(): string | null {\n\t\tconst chart = this.#chart()\n\t\treturn readTitleText(chart && firstChild(chart, 'c:title'))\n\t}\n\n\t/**\n\t * The category/value/series axes (`c:catAx`/`c:valAx`/`c:dateAx`/`c:serAx`)\n\t * in plot-area document order. Empty for pie/doughnut charts (no axes).\n\t */\n\tget axes(): ChartAxis[] {\n\t\tconst plotArea = this.#plotArea()\n\t\tif (!plotArea) return []\n\t\tconst out: ChartAxis[] = []\n\t\tfor (let node = plotArea.firstChild; node; node = node.nextSibling) {\n\t\t\tif (node.nodeType !== ELEMENT_NODE) continue\n\t\t\tconst element = node as Element\n\t\t\tif (element.namespaceURI === OOXML_NS.c && (element.localName ?? '').endsWith('Ax'))\n\t\t\t\tout.push(new ChartAxis(element, this.part))\n\t\t}\n\t\treturn out\n\t}\n\n\t/** The category axis (`c:catAx`/`c:dateAx`), or `null` when the chart has none. */\n\tget categoryAxis(): ChartAxis | null {\n\t\treturn this.axes.find((axis) => axis.kind === 'cat' || axis.kind === 'date') ?? null\n\t}\n\n\t/** The (primary) value axis (`c:valAx`), or `null` when the chart has none. */\n\tget valueAxis(): ChartAxis | null {\n\t\treturn this.axes.find((axis) => axis.kind === 'val') ?? null\n\t}\n\n\t/** The legend (`c:chart/c:legend`) position + overlay, or `null` when hidden. */\n\tget legend(): ChartLegend | null {\n\t\tconst chart = this.#chart()\n\t\tconst legend = chart && firstChild(chart, 'c:legend')\n\t\tif (!legend) return null\n\t\tconst pos = firstChild(legend, 'c:legendPos')\n\t\tconst overlay = firstChild(legend, 'c:overlay')\n\t\treturn {\n\t\t\tposition: pos ? attr(pos, 'val') : null,\n\t\t\toverlay: overlay ? boolValue(attr(overlay, 'val')) : null,\n\t\t}\n\t}\n\n\t/**\n\t * The chart-level data-label settings, read from the first plot group's\n\t * aggregate `c:dLbls` (the group-wide block after the series). `null` when the\n\t * plot group carries no data-label block (e.g. pie via a different builder).\n\t */\n\tget dataLabels(): ChartDataLabels | null {\n\t\tconst group = this.#chartGroups()[0]\n\t\tconst dLbls = group && firstChild(group, 'c:dLbls')\n\t\tif (!dLbls) return null\n\t\tconst flag = (qname: string): boolean | null => {\n\t\t\tconst el = firstChild(dLbls, qname)\n\t\t\treturn el ? boolValue(attr(el, 'val')) : null\n\t\t}\n\t\tconst pos = firstChild(dLbls, 'c:dLblPos')\n\t\treturn {\n\t\t\tshowValue: flag('c:showVal'),\n\t\t\tshowSeriesName: flag('c:showSerName'),\n\t\t\tshowCategoryName: flag('c:showCatName'),\n\t\t\tshowPercent: flag('c:showPercent'),\n\t\t\tshowLegendKey: flag('c:showLegendKey'),\n\t\t\tshowBubbleSize: flag('c:showBubbleSize'),\n\t\t\tshowLeaderLines: flag('c:showLeaderLines'),\n\t\t\tposition: pos ? attr(pos, 'val') : null,\n\t\t\tnumberFormat: readNumberFormat(dLbls),\n\t\t}\n\t}\n\n\t/** The data series (`c:ser`) across all chart groups, in document order. */\n\tget series(): ChartSeries[] {\n\t\treturn this.#chartGroups()\n\t\t\t.flatMap((group) => getElements(group, 'c:ser'))\n\t\t\t.map((ser) => new ChartSeries(ser, this.part))\n\t}\n\n\t/**\n\t * Category labels, read from the first series' cached categories\n\t * (`c:cat`), as written. Empty when the chart has no category axis.\n\t */\n\tget categories(): (string | null)[] {\n\t\tconst firstSer = this.series[0]\n\t\treturn firstSer ? firstSer.categories : []\n\t}\n\n\t/** Escape hatch: the underlying `c:chartSpace` element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */\n\tget element_(): Element | null {\n\t\treturn this.part.dom.documentElement\n\t}\n\n\t/** Mark the chart part dirty so `save()` reserializes it. Call after mutating {@link element_}. */\n\tmarkDirty(): void {\n\t\tthis.part.markDirty()\n\t}\n\n\t#chart(): Element | null {\n\t\tconst root = this.part.dom.documentElement\n\t\treturn root ? firstChild(root, 'c:chart') : null\n\t}\n\n\t#plotArea(): Element | null {\n\t\tconst chart = this.#chart()\n\t\treturn chart ? firstChild(chart, 'c:plotArea') : null\n\t}\n\n\t/** Plot-area children that are chart groups (local name ends with `Chart`). */\n\t#chartGroups(): Element[] {\n\t\tconst plotArea = this.#plotArea()\n\t\tif (!plotArea) return []\n\t\tconst groups: Element[] = []\n\t\tfor (let node = plotArea.firstChild; node; node = node.nextSibling) {\n\t\t\tif (node.nodeType !== 1) continue\n\t\t\tconst element = node as Element\n\t\t\tif (element.namespaceURI === OOXML_NS.c && element.localName?.endsWith('Chart')) groups.push(element)\n\t\t}\n\t\treturn groups\n\t}\n}\n\n/**\n * One axis (`c:catAx`/`c:valAx`/`c:dateAx`/`c:serAx`) of a chart's plot area.\n * All four share the scaling/delete/position/tickmark structure; `kind`\n * distinguishes them.\n */\nexport class ChartAxis {\n\tconstructor(\n\t\tprivate readonly ax: Element,\n\t\t/** The owning chart's OPC part, so {@link markDirty} can reach it from {@link element_}. */\n\t\tprivate readonly part: Part\n\t) {}\n\n\t/** Axis kind derived from the element name: `cat`/`val`/`date`/`ser`. */\n\tget kind(): 'cat' | 'val' | 'date' | 'ser' | null {\n\t\tswitch (this.ax.localName) {\n\t\t\tcase 'catAx':\n\t\t\t\treturn 'cat'\n\t\t\tcase 'valAx':\n\t\t\t\treturn 'val'\n\t\t\tcase 'dateAx':\n\t\t\t\treturn 'date'\n\t\t\tcase 'serAx':\n\t\t\t\treturn 'ser'\n\t\t\tdefault:\n\t\t\t\treturn null\n\t\t}\n\t}\n\n\t/** Axis id (`c:axId/@val`). */\n\tget id(): number | null {\n\t\tconst el = firstChild(this.ax, 'c:axId')\n\t\treturn el ? intValue(attr(el, 'val')) : null\n\t}\n\n\t/** Scaling orientation (`c:scaling/c:orientation/@val`): `minMax`/`maxMin`. */\n\tget orientation(): string | null {\n\t\tconst orient = this.#scaling('c:orientation')\n\t\treturn orient ? attr(orient, 'val') : null\n\t}\n\n\t/** Scale minimum (`c:scaling/c:min/@val`), or `null` when auto. */\n\tget min(): number | null {\n\t\tconst el = this.#scaling('c:min')\n\t\treturn el ? intValue(attr(el, 'val')) : null\n\t}\n\n\t/** Scale maximum (`c:scaling/c:max/@val`), or `null` when auto. */\n\tget max(): number | null {\n\t\tconst el = this.#scaling('c:max')\n\t\treturn el ? intValue(attr(el, 'val')) : null\n\t}\n\n\t/** Logarithmic scale base (`c:scaling/c:logBase/@val`), or `null` when linear. */\n\tget logBase(): number | null {\n\t\tconst el = this.#scaling('c:logBase')\n\t\treturn el ? intValue(attr(el, 'val')) : null\n\t}\n\n\t/** Whether the axis is hidden (`c:delete/@val` = 1). */\n\tget hidden(): boolean {\n\t\tconst el = firstChild(this.ax, 'c:delete')\n\t\treturn el ? boolValue(attr(el, 'val')) === true : false\n\t}\n\n\t/** Axis position (`c:axPos/@val`): `b`/`l`/`r`/`t`. */\n\tget position(): string | null {\n\t\tconst el = firstChild(this.ax, 'c:axPos')\n\t\treturn el ? attr(el, 'val') : null\n\t}\n\n\t/** Whether the axis draws major gridlines (`c:majorGridlines`). */\n\tget majorGridlines(): boolean {\n\t\treturn !!firstChild(this.ax, 'c:majorGridlines')\n\t}\n\n\t/** Whether the axis draws minor gridlines (`c:minorGridlines`). */\n\tget minorGridlines(): boolean {\n\t\treturn !!firstChild(this.ax, 'c:minorGridlines')\n\t}\n\n\t/** Axis title text (`c:title` rich text), or `null` when absent. */\n\tget title(): string | null {\n\t\treturn readTitleText(firstChild(this.ax, 'c:title'))\n\t}\n\n\t/** Axis number format (`c:numFmt`), or `null` when absent. */\n\tget numberFormat(): AxisNumberFormat | null {\n\t\treturn readNumberFormat(this.ax)\n\t}\n\n\t/** Major tick-mark style (`c:majorTickMark/@val`): `out`/`in`/`cross`/`none`. */\n\tget majorTickMark(): string | null {\n\t\tconst el = firstChild(this.ax, 'c:majorTickMark')\n\t\treturn el ? attr(el, 'val') : null\n\t}\n\n\t/** Minor tick-mark style (`c:minorTickMark/@val`). */\n\tget minorTickMark(): string | null {\n\t\tconst el = firstChild(this.ax, 'c:minorTickMark')\n\t\treturn el ? attr(el, 'val') : null\n\t}\n\n\t/** Tick-label position (`c:tickLblPos/@val`): `nextTo`/`high`/`low`/`none`. */\n\tget tickLabelPosition(): string | null {\n\t\tconst el = firstChild(this.ax, 'c:tickLblPos')\n\t\treturn el ? attr(el, 'val') : null\n\t}\n\n\t/** Major unit (`c:majorUnit/@val`), or `null` when auto. */\n\tget majorUnit(): number | null {\n\t\tconst el = firstChild(this.ax, 'c:majorUnit')\n\t\treturn el ? intValue(attr(el, 'val')) : null\n\t}\n\n\t/** Minor unit (`c:minorUnit/@val`), or `null` when auto. */\n\tget minorUnit(): number | null {\n\t\tconst el = firstChild(this.ax, 'c:minorUnit')\n\t\treturn el ? intValue(attr(el, 'val')) : null\n\t}\n\n\t/** Escape hatch: the underlying axis element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */\n\tget element_(): Element {\n\t\treturn this.ax\n\t}\n\n\t/** Mark the owning chart part dirty so `save()` reserializes it. Call after mutating {@link element_}. */\n\tmarkDirty(): void {\n\t\tthis.part.markDirty()\n\t}\n\n\t/** A named child of `c:scaling`. */\n\t#scaling(qname: string): Element | null {\n\t\tconst scaling = firstChild(this.ax, 'c:scaling')\n\t\treturn scaling ? firstChild(scaling, qname) : null\n\t}\n}\n\n/** One data series (`c:ser`) of a chart. */\nexport class ChartSeries {\n\tconstructor(\n\t\tprivate readonly ser: Element,\n\t\t/** The owning chart's OPC part, so {@link markDirty} can reach it from {@link element_}. */\n\t\tprivate readonly part: Part\n\t) {}\n\n\t/**\n\t * Series fill (`c:spPr` solid fill / no-fill). `null` when the series carries\n\t * no `c:spPr` or its `c:spPr` declares no fill choice (inherits the theme).\n\t */\n\tget fill(): ChartFill | null {\n\t\tconst spPr = firstChild(this.ser, 'c:spPr')\n\t\tif (!spPr) return null\n\t\tconst solid = readSolid(spPr)\n\t\tif (solid.color === null && solid.schemeColor === null && !solid.noFill) return null\n\t\treturn solid\n\t}\n\n\t/**\n\t * Series line/stroke (`c:spPr/a:ln`) — width, dash, colour. `null` when the\n\t * series `c:spPr` has no `a:ln` (bar/area fills carry no line by default).\n\t */\n\tget line(): ChartLine | null {\n\t\tconst spPr = firstChild(this.ser, 'c:spPr')\n\t\tconst ln = spPr && firstChild(spPr, 'a:ln')\n\t\tif (!ln) return null\n\t\tconst w = intValue(attr(ln, 'w'))\n\t\tconst dash = firstChild(ln, 'a:prstDash')\n\t\tconst solid = readSolid(ln)\n\t\treturn {\n\t\t\twidthPt: w === null ? null : w / EMU_PER_POINT,\n\t\t\tdash: dash ? (attr(dash, 'val') ?? null) : null,\n\t\t\tcolor: solid.color,\n\t\t\tschemeColor: solid.schemeColor,\n\t\t\tnoFill: solid.noFill,\n\t\t}\n\t}\n\n\t/** Series index (`c:idx/@val`), or `null` if absent. */\n\tget index(): number | null {\n\t\tconst idx = firstChild(this.ser, 'c:idx')\n\t\treturn idx ? intValue(attr(idx, 'val')) : null\n\t}\n\n\t/** Series name from the cached `c:tx`, or `null` when unnamed. */\n\tget name(): string | null {\n\t\tconst tx = firstChild(this.ser, 'c:tx')\n\t\tif (!tx) return null\n\t\tconst direct = firstChild(tx, 'c:v')\n\t\tif (direct) return direct.textContent ?? null\n\t\tconst points = readPoints(findCache(tx))\n\t\treturn points[0] ?? null\n\t}\n\n\t/** Cached numeric values (`c:val`); non-numeric or missing points are `null`. */\n\tget values(): (number | null)[] {\n\t\tconst val = firstChild(this.ser, 'c:val')\n\t\treturn readPoints(val && findCache(val)).map(intValue)\n\t}\n\n\t/** Cached category labels for this series (`c:cat`), as written. */\n\tget categories(): (string | null)[] {\n\t\tconst cat = firstChild(this.ser, 'c:cat')\n\t\treturn readPoints(cat && findCache(cat))\n\t}\n\n\t/** Escape hatch: the underlying `c:ser` element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */\n\tget element_(): Element {\n\t\treturn this.ser\n\t}\n\n\t/** Mark the owning chart part dirty so `save()` reserializes it. Call after mutating {@link element_}. */\n\tmarkDirty(): void {\n\t\tthis.part.markDirty()\n\t}\n}\n\n/** Concatenate the rich-text runs of a `c:title` element, or `null` when absent/empty. */\nfunction readTitleText(titleEl: Element | null): string | null {\n\tif (!titleEl) return null\n\tconst tx = firstChild(titleEl, 'c:tx')\n\tconst rich = tx && firstChild(tx, 'c:rich')\n\tif (!rich) return null\n\tlet out = ''\n\tfor (const t of rich.getElementsByTagNameNS(OOXML_NS.a, 't')) out += t.textContent ?? ''\n\treturn out === '' ? null : out\n}\n\n/** Read a `c:numFmt` child of `parent` into `{ formatCode, sourceLinked }`, or `null` when absent. */\nfunction readNumberFormat(parent: Element): AxisNumberFormat | null {\n\tconst nf = firstChild(parent, 'c:numFmt')\n\tif (!nf) return null\n\treturn { formatCode: attr(nf, 'formatCode'), sourceLinked: boolValue(attr(nf, 'sourceLinked')) }\n}\n\n/**\n * Decode the solid colour of a properties container (`c:spPr` or `a:ln`): the\n * literal `a:srgbClr` hex, the raw `a:schemeClr` token, and whether the fill is\n * explicitly suppressed via `a:noFill`. The chart part carries no theme context,\n * so scheme tokens are surfaced raw (unresolved) rather than flattened to hex.\n */\nfunction readSolid(container: Element): { color: string | null; schemeColor: string | null; noFill: boolean } {\n\tconst solidFill = firstChild(container, 'a:solidFill')\n\tconst srgb = solidFill && firstChild(solidFill, 'a:srgbClr')\n\tconst scheme = solidFill && firstChild(solidFill, 'a:schemeClr')\n\treturn {\n\t\tcolor: srgb ? (attr(srgb, 'val') ?? null) : null,\n\t\tschemeColor: scheme ? (attr(scheme, 'val') ?? null) : null,\n\t\tnoFill: !!firstChild(container, 'a:noFill'),\n\t}\n}\n\n/** Resolve a `c:cat`/`c:val`/`c:tx` container to its cache element (`c:numCache`/`c:strCache`/literal). */\nfunction findCache(container: Element | null): Element | null {\n\tif (!container) return null\n\tfor (const refName of ['c:numRef', 'c:strRef', 'c:multiLvlStrRef']) {\n\t\tconst ref = firstChild(container, refName)\n\t\tif (ref) {\n\t\t\tfor (const cacheName of ['c:numCache', 'c:strCache', 'c:multiLvlStrCache']) {\n\t\t\t\tconst cache = firstChild(ref, cacheName)\n\t\t\t\tif (cache) return cache\n\t\t\t}\n\t\t}\n\t}\n\t// Inline literals (no workbook reference).\n\treturn firstChild(container, 'c:numLit') ?? firstChild(container, 'c:strLit')\n}\n\n/** Read a cache's points (`c:pt[@idx]/c:v`) into an idx-ordered array; `c:ptCount` is the declared count. */\nfunction readPoints(cache: Element | null): (string | null)[] {\n\tif (!cache) return []\n\tconst ptCount = firstChild(cache, 'c:ptCount')\n\treturn readIndexedPoints(\n\t\tgetElements(cache, 'c:pt'),\n\t\tptCount ? intValue(attr(ptCount, 'val')) : null,\n\t\t(pt) => firstChild(pt, 'c:v')?.textContent ?? null,\n\t\t'c:ptCount'\n\t)\n}\n","/**\n * Read-only proxies for a chartEx (`cx:chartSpace`) chart hosted in a\n * `p:graphicFrame`. chartEx is the Office-2016 chart family — waterfall, funnel,\n * treemap, sunburst, histogram, pareto, box-and-whisker, region map — a separate\n * subsystem from the classic `c:chart` (see {@link ./chart.js `Chart`}).\n *\n * A chartEx chart lives in its own part (`/ppt/charts/chartEx{N}.xml`) whose root\n * is `cx:chartSpace`, referenced from the graphic frame by relationship id (the MS\n * `chartEx` rel, not the ECMA `chart` rel). The frame itself is wrapped in an\n * `mc:AlternateContent` — the reader unwraps the `mc:Choice` to reach it.\n *\n * Unlike the classic side, the layout geometry is keyed on `cx:series/@layoutId`\n * (`waterfall`, `funnel`, `treemap`, `clusteredColumn` for histogram/pareto, …)\n * rather than the plot-group element name, and category/value data lives in a\n * top-level `cx:chartData/cx:data` block the series point at by `cx:dataId`. This\n * surface reads the layout, title, legend, series, and the cached data; the\n * embedded workbook, the style/colors sidecars, and (for a region map) the online\n * geo-cache are out of scope.\n */\nimport type { Part } from '../opc/part.js'\nimport { OOXML_NS, attr, firstChild, getElements, intValue, type Element } from '../oxml/dom.js'\nimport { readIndexedPoints } from '../oxml/point-cache.js'\n\n/** A chartEx legend (`cx:legend`) — a leaf element carrying position/alignment attributes. */\nexport interface ChartExLegend {\n\t/** Legend position (`@pos`): `t`/`b`/`l`/`r`. */\n\tposition: string | null\n\t/** Legend alignment along its edge (`@align`), e.g. `ctr`. */\n\talign: string | null\n\t/** Whether the legend overlays the plot area (`@overlay`). */\n\toverlay: boolean | null\n}\n\n/** A chartEx series' data-label toggles (`cx:dataLabels` + its `cx:visibility` child). */\nexport interface ChartExDataLabels {\n\t/** Label position (`@pos`), e.g. `outEnd`, or `null` when unset. */\n\tposition: string | null\n\t/** Show the point value (`cx:visibility/@value`). */\n\tvalue: boolean | null\n\t/** Show the series name (`cx:visibility/@seriesName`). */\n\tseriesName: boolean | null\n\t/** Show the category name (`cx:visibility/@categoryName`). */\n\tcategoryName: boolean | null\n}\n\n/** A chartEx graphic-frame's chart, backed by its `cx:chartSpace` part. */\nexport class ChartEx {\n\tconstructor(\n\t\t/** The chartEx chart's OPC part (`/ppt/charts/chartEx{N}.xml`). */\n\t\treadonly part: Part\n\t) {}\n\n\t/** Partname of the chartEx chart part. */\n\tget partName(): string {\n\t\treturn this.part.partName\n\t}\n\n\t/**\n\t * The `cx:series/@layoutId` tokens in plot-area document order — the raw chartEx\n\t * layout names (`waterfall`, `funnel`, `treemap`, `sunburst`, `boxWhisker`,\n\t * `regionMap`, or `clusteredColumn`/`paretoLine` for histogram & pareto). This is\n\t * the OOXML truth: a histogram and a pareto both surface as `clusteredColumn`, so\n\t * the token does not always round-trip to the write-side `ChartType`.\n\t */\n\tget layoutIds(): string[] {\n\t\treturn this.#seriesElements()\n\t\t\t.map((ser) => attr(ser, 'layoutId'))\n\t\t\t.filter((id): id is string => id !== null && id !== '')\n\t}\n\n\t/** The first series' `@layoutId`, or `null` for an empty plot area. */\n\tget layoutId(): string | null {\n\t\treturn this.layoutIds[0] ?? null\n\t}\n\n\t/** The chart title (`cx:chart/cx:title` rich text), or `null` when absent. */\n\tget title(): string | null {\n\t\tconst chart = this.#chart()\n\t\tconst title = chart && firstChild(chart, 'cx:title')\n\t\tif (!title) return null\n\t\tconst tx = firstChild(title, 'cx:tx')\n\t\tconst rich = tx && firstChild(tx, 'cx:rich')\n\t\tif (!rich) return null\n\t\tlet out = ''\n\t\tfor (const t of rich.getElementsByTagNameNS(OOXML_NS.a, 't')) out += t.textContent ?? ''\n\t\treturn out === '' ? null : out\n\t}\n\n\t/** The legend (`cx:chart/cx:legend`) position/alignment, or `null` when hidden. */\n\tget legend(): ChartExLegend | null {\n\t\tconst chart = this.#chart()\n\t\tconst legend = chart && firstChild(chart, 'cx:legend')\n\t\tif (!legend) return null\n\t\treturn {\n\t\t\tposition: attr(legend, 'pos'),\n\t\t\talign: attr(legend, 'align'),\n\t\t\toverlay: boolAttr(legend, 'overlay'),\n\t\t}\n\t}\n\n\t/** The data series (`cx:plotAreaRegion/cx:series`) in document order. */\n\tget series(): ChartExSeries[] {\n\t\treturn this.#seriesElements().map((ser) => new ChartExSeries(ser, this))\n\t}\n\n\t/** The plot-area axes (`cx:plotArea/cx:axis`) in document order. */\n\tget axes(): ChartExAxis[] {\n\t\tconst plotArea = this.#plotArea()\n\t\treturn plotArea ? getElements(plotArea, 'cx:axis').map((ax) => new ChartExAxis(ax, this)) : []\n\t}\n\n\t/**\n\t * Category labels from the first series' cached leaf level (`cx:strDim`'s first\n\t * `cx:lvl`). Empty for a category-less layout (a histogram bins raw observations).\n\t */\n\tget categories(): (string | null)[] {\n\t\treturn this.series[0]?.categories ?? []\n\t}\n\n\t/** Escape hatch: the underlying `cx:chartSpace` element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */\n\tget element_(): Element | null {\n\t\treturn this.part.dom.documentElement\n\t}\n\n\t/** Mark the chartEx part dirty so `save()` reserializes it. Call after mutating {@link element_}. */\n\tmarkDirty(): void {\n\t\tthis.part.markDirty()\n\t}\n\n\t/**\n\t * The `cx:data` block a series' `cx:dataId` points at (`cx:chartData/cx:data[@id]`),\n\t * or `null` when the id is unset or unmatched.\n\t */\n\tdataElementById(id: number | null): Element | null {\n\t\tif (id === null) return null\n\t\tconst chartData = this.#chartData()\n\t\tif (!chartData) return null\n\t\treturn getElements(chartData, 'cx:data').find((data) => intValue(attr(data, 'id')) === id) ?? null\n\t}\n\n\t#root(): Element | null {\n\t\treturn this.part.dom.documentElement\n\t}\n\n\t#chartData(): Element | null {\n\t\tconst root = this.#root()\n\t\treturn root ? firstChild(root, 'cx:chartData') : null\n\t}\n\n\t#chart(): Element | null {\n\t\tconst root = this.#root()\n\t\treturn root ? firstChild(root, 'cx:chart') : null\n\t}\n\n\t#plotArea(): Element | null {\n\t\tconst chart = this.#chart()\n\t\treturn chart ? firstChild(chart, 'cx:plotArea') : null\n\t}\n\n\t#seriesElements(): Element[] {\n\t\tconst plotArea = this.#plotArea()\n\t\tconst region = plotArea && firstChild(plotArea, 'cx:plotAreaRegion')\n\t\treturn region ? getElements(region, 'cx:series') : []\n\t}\n}\n\n/** One data series (`cx:series`) of a chartEx chart. */\nexport class ChartExSeries {\n\tconstructor(\n\t\tprivate readonly ser: Element,\n\t\tprivate readonly chart: ChartEx\n\t) {}\n\n\t/** The layout token (`@layoutId`) that keys this series' geometry, e.g. `waterfall`. */\n\tget layoutId(): string | null {\n\t\treturn attr(this.ser, 'layoutId')\n\t}\n\n\t/** The deterministic series GUID (`@uniqueId`), or `null`. */\n\tget uniqueId(): string | null {\n\t\treturn attr(this.ser, 'uniqueId')\n\t}\n\n\t/**\n\t * The owner series index (`@ownerIdx`) for a derived series (a `paretoLine`\n\t * derives its data from series 0), or `null` for a self-contained series.\n\t */\n\tget ownerIndex(): number | null {\n\t\treturn intValue(attr(this.ser, 'ownerIdx'))\n\t}\n\n\t/** Series name from the cached `cx:tx/cx:txData/cx:v`, or `null` when unnamed. */\n\tget name(): string | null {\n\t\tconst tx = firstChild(this.ser, 'cx:tx')\n\t\tconst txData = tx && firstChild(tx, 'cx:txData')\n\t\tconst v = txData && firstChild(txData, 'cx:v')\n\t\treturn v ? (v.textContent ?? null) : null\n\t}\n\n\t/** The data-block id this series plots (`cx:dataId/@val`), or `null`. */\n\tget dataId(): number | null {\n\t\tconst dataId = firstChild(this.ser, 'cx:dataId')\n\t\treturn dataId ? intValue(attr(dataId, 'val')) : null\n\t}\n\n\t/** Cached numeric values (`cx:numDim`); non-numeric or missing points are `null`. */\n\tget values(): (number | null)[] {\n\t\tconst data = this.chart.dataElementById(this.dataId)\n\t\tconst numDim = data && firstChild(data, 'cx:numDim')\n\t\treturn readLevelPoints(numDim && firstChild(numDim, 'cx:lvl')).map(intValue)\n\t}\n\n\t/**\n\t * Cached category labels (`cx:strDim`'s leaf `cx:lvl` — the first level, which\n\t * the writer emits leaf-first). Empty when the data block carries no `cx:strDim`.\n\t */\n\tget categories(): (string | null)[] {\n\t\tconst data = this.chart.dataElementById(this.dataId)\n\t\tconst strDim = data && firstChild(data, 'cx:strDim')\n\t\treturn readLevelPoints(strDim && firstChild(strDim, 'cx:lvl'))\n\t}\n\n\t/** The data-label toggles (`cx:dataLabels`), or `null` when the series shows none. */\n\tget dataLabels(): ChartExDataLabels | null {\n\t\tconst dLbls = firstChild(this.ser, 'cx:dataLabels')\n\t\tif (!dLbls) return null\n\t\tconst vis = firstChild(dLbls, 'cx:visibility')\n\t\treturn {\n\t\t\tposition: attr(dLbls, 'pos'),\n\t\t\tvalue: vis ? boolAttr(vis, 'value') : null,\n\t\t\tseriesName: vis ? boolAttr(vis, 'seriesName') : null,\n\t\t\tcategoryName: vis ? boolAttr(vis, 'categoryName') : null,\n\t\t}\n\t}\n\n\t/** Escape hatch: the underlying `cx:series` element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */\n\tget element_(): Element {\n\t\treturn this.ser\n\t}\n\n\t/** Mark the owning chartEx part dirty so `save()` reserializes it. Call after mutating {@link element_}. */\n\tmarkDirty(): void {\n\t\tthis.chart.part.markDirty()\n\t}\n}\n\n/**\n * One axis (`cx:axis`) of a chartEx plot area. chartEx axes carry no `catAx`/`valAx`\n * element-name distinction; the kind is read from the scaling child\n * (`cx:catScaling` vs `cx:valScaling`).\n */\nexport class ChartExAxis {\n\tconstructor(\n\t\tprivate readonly ax: Element,\n\t\t/** The owning chartEx chart, so {@link markDirty} can reach its part from {@link element_}. */\n\t\tprivate readonly chart: ChartEx\n\t) {}\n\n\t/** Axis id (`@id`), the value a series' `cx:axisId` binds to. */\n\tget id(): number | null {\n\t\treturn intValue(attr(this.ax, 'id'))\n\t}\n\n\t/** Axis kind from its scaling child: `cat` (`cx:catScaling`) / `val` (`cx:valScaling`). */\n\tget kind(): 'cat' | 'val' | null {\n\t\tif (firstChild(this.ax, 'cx:catScaling')) return 'cat'\n\t\tif (firstChild(this.ax, 'cx:valScaling')) return 'val'\n\t\treturn null\n\t}\n\n\t/**\n\t * Category-axis gap width (`cx:catScaling/@gapWidth`) as a fraction (1.0 = 100%,\n\t * the chartEx convention, unlike the classic integer percent), or `null`.\n\t */\n\tget gapWidth(): number | null {\n\t\tconst cat = firstChild(this.ax, 'cx:catScaling')\n\t\treturn cat ? floatValue(attr(cat, 'gapWidth')) : null\n\t}\n\n\t/** Value-axis scale minimum (`cx:valScaling/@min`), or `null` when auto. */\n\tget min(): number | null {\n\t\tconst val = firstChild(this.ax, 'cx:valScaling')\n\t\treturn val ? floatValue(attr(val, 'min')) : null\n\t}\n\n\t/** Value-axis scale maximum (`cx:valScaling/@max`), or `null` when auto. */\n\tget max(): number | null {\n\t\tconst val = firstChild(this.ax, 'cx:valScaling')\n\t\treturn val ? floatValue(attr(val, 'max')) : null\n\t}\n\n\t/** Whether the axis draws major gridlines (`cx:majorGridlines`). */\n\tget majorGridlines(): boolean {\n\t\treturn !!firstChild(this.ax, 'cx:majorGridlines')\n\t}\n\n\t/** Whether the axis draws tick labels (`cx:tickLabels`). */\n\tget tickLabels(): boolean {\n\t\treturn !!firstChild(this.ax, 'cx:tickLabels')\n\t}\n\n\t/** Escape hatch: the underlying `cx:axis` element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */\n\tget element_(): Element {\n\t\treturn this.ax\n\t}\n\n\t/** Mark the owning chartEx part dirty so `save()` reserializes it. Call after mutating {@link element_}. */\n\tmarkDirty(): void {\n\t\tthis.chart.part.markDirty()\n\t}\n}\n\n/** Read a `cx:lvl`'s points (`cx:pt[@idx]` text) into an idx-ordered array; `@ptCount` is the declared count. */\nfunction readLevelPoints(lvl: Element | null): (string | null)[] {\n\tif (!lvl) return []\n\treturn readIndexedPoints(\n\t\tgetElements(lvl, 'cx:pt'),\n\t\tintValue(attr(lvl, 'ptCount')),\n\t\t(pt) => pt.textContent ?? null,\n\t\t'cx:lvl/@ptCount'\n\t)\n}\n\n/** Parse an attribute as a boolean (`1`/`true` → true, `0`/`false` → false), or `null` when absent. */\nfunction boolAttr(element: Element, name: string): boolean | null {\n\tconst value = attr(element, name)\n\tif (value === null) return null\n\treturn value === '1' || value === 'true'\n}\n\n/** Parse an attribute as a float (chartEx uses fractional `gapWidth`/scale values), or `null`. */\nfunction floatValue(value: string | null): number | null {\n\tif (value === null || value === '') return null\n\tconst number = Number(value)\n\treturn Number.isFinite(number) ? number : null\n}\n","/**\n * Read proxies for a SmartArt diagram (`dgm:dataModel`) hosted in a `p:graphicFrame`.\n *\n * SmartArt is a four-part construct, and the frame itself holds none of it: the\n * `a:graphicData` carries only a `dgm:relIds` with four relationship ids pointing at the\n * data, layout, quick-style and colours parts under `/ppt/diagrams/`. The **data** part is\n * the one with content in it — a flat `dgm:ptLst` of points plus a `dgm:cxnLst` of\n * connections that give the points their tree — and it is what this surface decodes. The\n * other three are generated presets (`urn:microsoft.com/office/officeart/…`) describing how\n * PowerPoint *draws* the graph rather than what it says; they surface as parts, not getters.\n *\n * The text is ordinary DrawingML: `dgm:pt/dgm:t` is an `a:CT_TextBody`, the same type a\n * shape's `p:txBody` is, so a point's text reads back through the same\n * {@link TextFrame}/`Paragraph`/`Run` proxies as any other text on the slide, run formatting\n * included.\n *\n * **Not every point is content.** A saved data model interleaves the user's nodes with\n * points the layout engine generated (`pres`), the diagram root (`doc`), and the transition\n * points sitting on each edge (`parTrans`/`sibTrans`, which carry text only where a layout\n * labels its arrows). {@link Diagram.text} applies exactly that filter; {@link Diagram.points}\n * applies none, so a consumer that needs the raw graph gets it.\n *\n * **The structure is in the connections, and {@link Diagram.nodes} is the view of it.** A\n * `parOf` edge names the parent in `@srcId`, the child in `@destId` and the child's sibling\n * position in `@srcOrd`; `points` order is document order and says nothing about depth. Three\n * decisions that tree makes, each of which could defensibly have gone the other way:\n *\n * - **`asst` points are in it.** An assistant is user content, and an org chart merely draws\n * it off the main branch rather than under it. {@link DiagramPoint.type} carries the\n * distinction, so folding it silently in with `node` would hide something a consumer can\n * act on while omitting it would lose authored text.\n * - **Transition points are not.** A `parTrans`/`sibTrans` labels an *edge*, not a node, and\n * reaches its edge through {@link DiagramConnection.parentTransitionId} /\n * `siblingTransitionId`. Hanging one off `children` would make the tree disagree with what\n * PowerPoint's own text pane shows.\n * - **A cycle in `parOf` throws.** It is a corrupt model rather than a shape the format can\n * express, and the walk would not terminate; see `diagram/parent-edge-cycle`.\n *\n * **A point's text is stored twice.** The data model is what PowerPoint reads, but a deck\n * also carries a *drawing* part (`dsp:drawing`) holding a copy of every drawn string, and\n * every renderer without a SmartArt layout engine — LibreOffice, Google Slides, thumbnailers\n * — paints that copy and nothing else. {@link DiagramPoint.drawnShape} is the link between\n * the two, and {@link DiagramPoint.text}'s setter is what keeps them in step.\n *\n * Authoring a SmartArt graphic from nothing is out of scope: the layout part is a\n * constraint-solver program PowerPoint executes, and the presentation tree it generates is\n * not derivable from the user's content. Editing the text of one that already exists is\n * supported — see {@link DiagramPoint.text}.\n */\nimport { warn } from '../../diagnostics.js'\nimport { PackageReadError } from '../../errors.js'\nimport type { OpcPackage } from '../opc/package.js'\nimport type { Part } from '../opc/part.js'\nimport type { Relationships } from '../opc/relationships.js'\nimport {\n\tOOXML_NS,\n\tattr,\n\tboolValue,\n\tdescendantsByTag,\n\tfirstChild,\n\tfirstChildElement,\n\tgetElements,\n\tintValue,\n\ttype Element,\n} from '../oxml/dom.js'\nimport type { ThemeContext } from '../oxml/theme.js'\nimport { setParagraphText, TextFrame } from './text.js'\n\n/**\n * `ST_PtType` — what a `dgm:pt` is.\n *\n * - `node` — a user-authored node, and the default when `@type` is absent.\n * - `asst` — an assistant node (an org chart's off-branch box); user content too.\n * - `doc` — the data model's single root; carries the layout/style/colour preset ids.\n * - `pres` — generated by the layout engine to position a node; never user content.\n * - `parTrans` / `sibTrans` — the two transition points of an edge, which a few layouts\n * (arrow processes, org-chart branches) let the user type a label into.\n */\nexport type DiagramPointType = 'node' | 'asst' | 'doc' | 'pres' | 'parTrans' | 'sibTrans'\n\nconst POINT_TYPES: readonly string[] = ['node', 'asst', 'doc', 'pres', 'parTrans', 'sibTrans']\n\n/**\n * `ST_CxnType` — what a `dgm:cxn` asserts. `parOf` (the default) is the parent/child edge of\n * the user's tree; `presOf` and `presParOf` bind a node to the generated `pres` point that\n * draws it, and are the layout engine's bookkeeping rather than structure.\n */\nexport type DiagramConnectionType = 'parOf' | 'presOf' | 'presParOf' | 'unknownRelationship'\n\nconst CONNECTION_TYPES: readonly string[] = ['parOf', 'presOf', 'presParOf', 'unknownRelationship']\n\n/** The MS extension (`dgm:extLst/a:ext`) whose `@relId` names the fallback drawing part. */\nconst DRAWING_EXT_URI = 'http://schemas.microsoft.com/office/drawing/2008/diagram'\n\n/**\n * One edge of a diagram's data model (`dgm:cxn`) — an attribute-only element, so it reads as\n * plain data rather than as a proxy.\n *\n * The ids are `ST_ModelId` GUIDs matching a {@link DiagramPoint.modelId}. `parOf` edges are\n * the tree a reader cares about: `sourceId` is the parent, `destinationId` the child, and\n * `sourceOrder` the child's position among its siblings.\n */\nexport interface DiagramConnection {\n\t/** This edge's own id (`@modelId`). */\n\tmodelId: string | null\n\t/** What the edge asserts (`@type`); `parOf` when absent, its schema default. */\n\ttype: DiagramConnectionType\n\t/** The `@srcId` end — the parent, for a `parOf` edge. */\n\tsourceId: string | null\n\t/** The `@destId` end — the child, for a `parOf` edge. */\n\tdestinationId: string | null\n\t/** The child's index among its siblings (`@srcOrd`). */\n\tsourceOrder: number | null\n\t/** The parent's index as seen from the child (`@destOrd`). */\n\tdestinationOrder: number | null\n\t/** The `parTrans` point labelling this edge (`@parTransId`), or `null` when unset. */\n\tparentTransitionId: string | null\n\t/** The `sibTrans` point labelling this edge (`@sibTransId`), or `null` when unset. */\n\tsiblingTransitionId: string | null\n\t/** The layout preset this edge belongs to (`@presId`), set on generated edges only. */\n\tpresentationId: string | null\n}\n\n/**\n * Where a point's text is drawn in the fallback drawing part — the second copy of every\n * string a diagram carries, and the only one a renderer without a SmartArt layout engine\n * paints. See {@link DiagramPoint.drawnShape} for how a point reaches it.\n */\nexport interface DiagramDrawnShape {\n\t/** The drawing part (`/ppt/diagrams/drawing{N}.xml`) the shape lives in. */\n\treadonly part: Part\n\t/** The `pres` point this shape draws (`dsp:sp/@modelId`) — never the authored point's own id. */\n\treadonly modelId: string\n\t/** Which paragraph of {@link textFrame} carries this point's text (the `presOf` edge's `@destOrd`). */\n\treadonly paragraphIndex: number\n\t/**\n\t * The shape's `dsp:txBody`, bound to the **drawing** part rather than the data part, so\n\t * an edit made through it marks the part that actually changed.\n\t *\n\t * One shape commonly draws several points — three of them in `mixed.pptx` — so writing\n\t * `textFrame.text` here would delete the siblings' text. Replace paragraph\n\t * {@link paragraphIndex} instead, which is what {@link DiagramPoint.text}'s setter does.\n\t */\n\treadonly textFrame: TextFrame\n\t/** Escape hatch: the underlying `dsp:sp`. After mutating it call `part.markDirty()`. */\n\treadonly element_: Element\n}\n\n/** One `presOf` edge out of a point, as the index keeps it. */\ninterface PresentationArm {\n\treadonly destId: string\n\t/** `@destOrd` — the paragraph index this point occupies inside the drawn shape. */\n\treadonly destinationOrder: number\n\t/** `@srcOrd` — which of the point's several presentations this is. */\n\treadonly sourceOrder: number\n}\n\n/**\n * The node → drawn-shape index of one diagram: the `presOf` edges of the data model and the\n * `dsp:sp` elements of the drawing part, both keyed for lookup.\n *\n * Built once per {@link Diagram}, and only when a point is actually asked what draws it — the\n * drawing part is a second XML DOM and a consumer reading node text should not pay to parse\n * it. The consequence of that memo: a consumer who *adds* or *removes* shapes in the drawing\n * part through the escape hatches must re-reach the diagram to see them here.\n */\nclass DrawingIndex {\n\t/** `presOf` arms out of each source point, in `@srcOrd` order. */\n\treadonly #arms = new Map<string, PresentationArm[]>()\n\t/** Each `dsp:sp` by the `pres` modelId it draws. */\n\treadonly #shapes = new Map<string, Element>()\n\n\tconstructor(\n\t\troot: Element | null,\n\t\tprivate readonly drawingPart: Part | null,\n\t\tprivate readonly themeContext?: ThemeContext\n\t) {\n\t\tconst cxnLst = root && firstChild(root, 'dgm:cxnLst')\n\t\tfor (const cxn of cxnLst ? getElements(cxnLst, 'dgm:cxn') : []) {\n\t\t\tif (attr(cxn, 'type') !== 'presOf') continue\n\t\t\tconst srcId = attr(cxn, 'srcId')\n\t\t\tconst destId = attr(cxn, 'destId')\n\t\t\tif (!srcId || !destId) continue\n\t\t\tconst arm: PresentationArm = {\n\t\t\t\tdestId,\n\t\t\t\tdestinationOrder: intValue(attr(cxn, 'destOrd')) ?? 0,\n\t\t\t\tsourceOrder: intValue(attr(cxn, 'srcOrd')) ?? 0,\n\t\t\t}\n\t\t\tconst list = this.#arms.get(srcId)\n\t\t\tif (list) list.push(arm)\n\t\t\telse this.#arms.set(srcId, [arm])\n\t\t}\n\t\tfor (const list of this.#arms.values()) list.sort((a, b) => a.sourceOrder - b.sourceOrder)\n\n\t\t// `dsp:spTree` nests, so this is a descendant scan rather than a child one. Matched on\n\t\t// the `dsp` namespace rather than on local name alone: `sp` and `txBody` are among the\n\t\t// most-reused local names in DrawingML, and unlike `dataModelExt` (which `drawingPart`\n\t\t// still matches loosely, because nothing else can appear in that extension) they carry\n\t\t// no uri to disambiguate them.\n\t\tconst drawingRoot = drawingPart?.dom.documentElement ?? null\n\t\tfor (const sp of drawingRoot ? descendantsByTag(drawingRoot, OOXML_NS.dsp, 'sp') : []) {\n\t\t\tconst modelId = attr(sp, 'modelId')\n\t\t\tif (modelId !== null && !this.#shapes.has(modelId)) this.#shapes.set(modelId, sp)\n\t\t}\n\t}\n\n\t/**\n\t * Resolve one authored point to the `pres` point that presents it and to the drawn\n\t * paragraph carrying its text.\n\t *\n\t * A point commonly has **several** `presOf` arms — an org-chart node's box and the\n\t * connector beneath it are two presentations of one node — so the arm is chosen by what it\n\t * reaches rather than by its `@srcOrd`: the first, in `@srcOrd` order, whose `pres` point\n\t * draws a `dsp:sp` that has a `dsp:txBody`. That selector produced a unique hit for all 90\n\t * authored points measured across five layout families, and it degrades to \"no arm\" rather\n\t * than to \"the wrong arm\" on a layout that was not.\n\t */\n\tresolve(modelId: string | null): { presentationId: string | null; drawnShape: DiagramDrawnShape | null } {\n\t\tconst arms = (modelId === null ? undefined : this.#arms.get(modelId)) ?? []\n\t\tconst first = arms[0]\n\t\tif (!first) return { presentationId: null, drawnShape: null }\n\t\tfor (const arm of arms) {\n\t\t\tconst sp = this.#shapes.get(arm.destId)\n\t\t\tconst txBody = sp && firstChild(sp, 'dsp:txBody')\n\t\t\tif (!sp || !txBody || !this.drawingPart) continue\n\t\t\t// A `@destOrd` past the end of the body is a drawing cache that disagrees with the\n\t\t\t// data model — no paragraph to point at, so the same \"nothing is drawn\" answer.\n\t\t\tconst paragraph = getElements(txBody, 'a:p')[arm.destinationOrder]\n\t\t\treturn {\n\t\t\t\tpresentationId: arm.destId,\n\t\t\t\tdrawnShape: paragraph\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tpart: this.drawingPart,\n\t\t\t\t\t\t\tmodelId: arm.destId,\n\t\t\t\t\t\t\tparagraphIndex: arm.destinationOrder,\n\t\t\t\t\t\t\ttextFrame: new TextFrame(txBody, this.drawingPart, this.themeContext),\n\t\t\t\t\t\t\telement_: sp,\n\t\t\t\t\t\t}\n\t\t\t\t\t: null,\n\t\t\t}\n\t\t}\n\t\treturn { presentationId: first.destId, drawnShape: null }\n\t}\n}\n\n/** One point (`dgm:pt`) of a diagram's data model. */\nexport class DiagramPoint {\n\tconstructor(\n\t\tprivate readonly pt: Element,\n\t\t/** The diagram data part, so a text edit marks the right part dirty. */\n\t\tprivate readonly part: Part,\n\t\tprivate readonly themeContext?: ThemeContext,\n\t\tprivate readonly relationships?: Relationships,\n\t\t/** The owning diagram's drawing index, built on first use; absent when reached without one. */\n\t\tprivate readonly drawing?: () => DrawingIndex\n\t) {}\n\n\t/** This point's id (`@modelId`), which connections reference. */\n\tget modelId(): string | null {\n\t\treturn attr(this.pt, 'modelId')\n\t}\n\n\t/** What kind of point this is (`@type`); `node` when absent, its schema default. */\n\tget type(): DiagramPointType {\n\t\tconst raw = attr(this.pt, 'type')\n\t\treturn raw !== null && POINT_TYPES.includes(raw) ? (raw as DiagramPointType) : 'node'\n\t}\n\n\t/**\n\t * For a transition point, the edge it labels (`@cxnId`), or `null`. The schema's default\n\t * is the literal `0`, which means \"none\" rather than naming a point, so it reads `null`.\n\t */\n\tget connectionId(): string | null {\n\t\treturn idAttr(this.pt, 'cxnId')\n\t}\n\n\t/**\n\t * Whether this point is an unfilled prompt (`dgm:prSet/@phldr`) — a node PowerPoint draws\n\t * with a grey placeholder string and treats as empty. Excluded from {@link Diagram.text}:\n\t * a layout that stores its prompt in `dgm:t` would otherwise extract as content.\n\t */\n\tget isPlaceholder(): boolean {\n\t\tconst prSet = this.#prSet()\n\t\treturn prSet ? boolValue(attr(prSet, 'phldr')) === true : false\n\t}\n\n\t/** The prompt string a placeholder point displays (`dgm:prSet/@phldrT`), or `null`. */\n\tget placeholderText(): string | null {\n\t\tconst prSet = this.#prSet()\n\t\treturn prSet ? attr(prSet, 'phldrT') : null\n\t}\n\n\t/**\n\t * This point's text body (`dgm:t`) as a {@link TextFrame}, or `null` when the point\n\t * carries none. It is an `a:CT_TextBody` like any other, so `paragraphs`, `runs` and the\n\t * `resolved*` getters all apply.\n\t *\n\t * **Writing through this edits the data model only**, and leaves the drawing cache\n\t * holding the old string — which is what PowerPoint-less renderers draw. It is the escape\n\t * hatch for run-level formatting, so it does exactly what it is told and nothing more;\n\t * {@link text}'s setter is the path that mirrors.\n\t */\n\tget textFrame(): TextFrame | null {\n\t\tconst t = firstChild(this.pt, 'dgm:t')\n\t\treturn t ? new TextFrame(t, this.part, this.themeContext, undefined, this.relationships) : null\n\t}\n\n\t/**\n\t * The generated `pres` point that presents this one (`dgm:cxn[@type=\"presOf\"]/@destId`),\n\t * or `null` when nothing presents it — the normal state of an unlabelled transition point.\n\t *\n\t * Where a point has several `presOf` arms the one named here is the arm that draws text;\n\t * see {@link drawnShape}, which resolves both.\n\t */\n\tget presentationId(): string | null {\n\t\treturn this.drawing?.().resolve(this.modelId).presentationId ?? null\n\t}\n\n\t/**\n\t * The paragraph of the fallback drawing part (`dsp:drawing`) that carries this point's\n\t * text, or `null` when nothing draws it.\n\t *\n\t * The mapping runs through the `pres` point rather than directly: a `dsp:sp/@modelId` is\n\t * always a `pres` point's id, so a lookup keyed on the authored point's own id finds\n\t * nothing at all. It is many-to-one in both directions — one shape draws several points\n\t * (`@destOrd` says which paragraph is whose, and it can contradict document order), and\n\t * one point has several presentations, of which at most one holds text.\n\t *\n\t * `null` is a defined outcome, not a failure, and covers four real cases: the package\n\t * carries no drawing part; the point has no `presOf` edge (every unlabelled\n\t * `parTrans`/`sibTrans`); the `pres` point draws no `dsp:sp`; and the shape it draws has\n\t * no `dsp:txBody` (a connector, or a picture node's filled rectangle).\n\t */\n\tget drawnShape(): DiagramDrawnShape | null {\n\t\treturn this.drawing?.().resolve(this.modelId).drawnShape ?? null\n\t}\n\n\t/** This point's text, paragraphs joined by `\\n`; `''` when it carries none. */\n\tget text(): string {\n\t\treturn this.textFrame?.text ?? ''\n\t}\n\n\t/**\n\t * Replace this point's text, in the data model **and** in the drawing cache.\n\t *\n\t * A diagram stores every string twice. `dgm:t` is what PowerPoint reads, and it recomputes\n\t * the drawing from the data model on open; the `dsp:drawing` part is what every other\n\t * renderer paints, and none of them recompute anything. Writing only the first is an edit\n\t * that is invisible in LibreOffice, Google Slides, thumbnailers and web previews until\n\t * someone opens the deck in PowerPoint and saves it.\n\t *\n\t * The data-model write always happens. The mirror is best-effort: when the point resolves\n\t * to no drawn paragraph (see {@link drawnShape} for the four ways that occurs) the cache\n\t * keeps the old string and a `diagram/drawing-cache-not-updated` diagnostic says so.\n\t * Throwing instead would make the common case unusable in order to report the rare one,\n\t * and returning a status would be a shape no other text setter here has.\n\t *\n\t * Two things it deliberately does not do. It does **not** recompute geometry: the drawn\n\t * shape keeps its cached position and size, so a much longer string overflows its box in\n\t * those same renderers until PowerPoint re-lays the diagram out. And it does not *create*\n\t * a place to draw text — a transition point whose layout has no label slot has no\n\t * `dsp:sp`, and PowerPoint strips text put on one, so the honest outcome is the\n\t * diagnostic. Like every other `text` setter here it collapses the point to one run,\n\t * keeping the first run's `a:rPr`; use {@link textFrame} for run-level work.\n\t */\n\tset text(value: string) {\n\t\tconst frame = this.textFrame\n\t\tif (!frame) {\n\t\t\t// No `dgm:t` at all. Synthesizing one is the case measurement says not to take: a\n\t\t\t// transition point whose layout has no label slot is stored exactly like this, and\n\t\t\t// PowerPoint strips text put on one at the next save. So the point is left alone.\n\t\t\twarn(\n\t\t\t\t'diagram/point-has-no-text-body',\n\t\t\t\t`SmartArt point ${this.#label()} (type ${this.type}) has no dgm:t, so it is not a point text can be written to; nothing was changed`\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t\tframe.text = value\n\n\t\tconst drawn = this.drawnShape\n\t\tconst paragraph = drawn?.textFrame.paragraphs[drawn.paragraphIndex]\n\t\tif (!drawn || !paragraph) {\n\t\t\twarn(\n\t\t\t\t'diagram/drawing-cache-not-updated',\n\t\t\t\t`SmartArt point ${this.#label()} resolves to no drawn paragraph, so ${this.part.partName} now holds the new text but the drawing cache still holds the old one; PowerPoint redraws it on open, other renderers do not`\n\t\t\t)\n\t\t\treturn\n\t\t}\n\t\tsetParagraphText(paragraph.element_, value)\n\t\t// The drawing is a different `Part` from the data model, and only a marked part is\n\t\t// reserialized — missing this one is silent, not loud.\n\t\tdrawn.part.markDirty()\n\t}\n\n\t/** Escape hatch: the underlying `dgm:pt` element. After mutating it call {@link Diagram.markDirty}. */\n\tget element_(): Element {\n\t\treturn this.pt\n\t}\n\n\t#prSet(): Element | null {\n\t\treturn firstChild(this.pt, 'dgm:prSet')\n\t}\n\n\t/** How a diagnostic names this point: its `@modelId`, which is all a corrupt point may have. */\n\t#label(): string {\n\t\treturn this.modelId ?? '(no modelId)'\n\t}\n}\n\n/**\n * One user-authored point in its place in the diagram's tree — a `node` or an `asst`, never a\n * generated `pres` point or a transition label. See {@link Diagram.nodes}.\n */\nexport class DiagramNode {\n\t/** Child nodes, ordered by their `parOf` edge's `@srcOrd`. Empty for a leaf. */\n\treadonly children: DiagramNode[] = []\n\n\tconstructor(\n\t\t/** The point itself: its text, its type, and its link to what is drawn for it. */\n\t\treadonly point: DiagramPoint,\n\t\t/** The parent node, or `null` for a root. */\n\t\treadonly parent: DiagramNode | null,\n\t\t/** Depth below the root, `0` for a root. */\n\t\treadonly level: number\n\t) {}\n}\n\n/** A `parOf` edge, reduced to what building the tree needs. */\ninterface ParentEdge {\n\treadonly parentId: string\n\treadonly childId: string\n\treadonly order: number\n}\n\n/** Sort key for a root with no `parOf` edge at all, so it lands after the ordered ones. */\nconst MAX_ORDER = Number.MAX_SAFE_INTEGER\n\n/** A SmartArt graphic frame's diagram, backed by its `dgm:dataModel` part. */\nexport class Diagram {\n\t#relationships: Relationships | undefined\n\t#docPrSetCache: Element | null | undefined\n\t#drawing: DrawingIndex | undefined\n\n\tconstructor(\n\t\t/** The diagram's data part (`/ppt/diagrams/data{N}.xml`), whose root is `dgm:dataModel`. */\n\t\treadonly part: Part,\n\t\t/** The frame's `dgm:relIds`, which names the other three parts by relationship id. */\n\t\tprivate readonly relIds: Element,\n\t\tprivate readonly opc: OpcPackage,\n\t\t/** Relationships of the part holding the frame — what `dgm:relIds` resolves against. */\n\t\tprivate readonly frameRelationships: Relationships,\n\t\tprivate readonly themeContext?: ThemeContext\n\t) {}\n\n\t/** Partname of the diagram data part. */\n\tget partName(): string {\n\t\treturn this.part.partName\n\t}\n\n\t/**\n\t * Every point (`dgm:ptLst/dgm:pt`) in document order, unfiltered — generated `pres`\n\t * points and the `doc` root included. Filter on {@link DiagramPoint.type} for the user's\n\t * nodes; {@link text} is the shortcut for the common case, {@link nodes} the structured one.\n\t *\n\t * Built per access like every other read proxy (`docs/reference/pptx-read.md`, \"Object\n\t * model\"), so `points[0] !== points[0]` while both wrap the same `dgm:pt`. Key a `Map`\n\t * on {@link DiagramPoint.modelId}, not on the point.\n\t */\n\tget points(): DiagramPoint[] {\n\t\tconst root = this.#root()\n\t\tconst ptLst = root && firstChild(root, 'dgm:ptLst')\n\t\tif (!ptLst) return []\n\t\tconst relationships = (this.#relationships ??= this.opc.relationshipsFor(this.part.partName))\n\t\tconst drawing = (): DrawingIndex => this.#drawingIndex()\n\t\treturn getElements(ptLst, 'dgm:pt').map(\n\t\t\t(pt) => new DiagramPoint(pt, this.part, this.themeContext, relationships, drawing)\n\t\t)\n\t}\n\n\t/**\n\t * The authored tree — every `node` and `asst` point in its place, roots in `@srcOrd`\n\t * order — as a view over {@link points} and {@link connections} rather than a replacement\n\t * for either.\n\t *\n\t * A root is a content point whose `parOf` parent is not itself content, which in a\n\t * PowerPoint-authored model means the `doc` point. Transition points are not members; see\n\t * this module's header for that decision and the two beside it.\n\t *\n\t * @throws PackageReadError `diagram/parent-edge-cycle` when the `parOf` edges make a\n\t * point its own ancestor, which is a corrupt model rather than a diagram shape.\n\t */\n\tget nodes(): DiagramNode[] {\n\t\tconst content = new Map<string, DiagramPoint>()\n\t\tfor (const point of this.points) {\n\t\t\tconst modelId = point.modelId\n\t\t\tif (modelId !== null && (point.type === 'node' || point.type === 'asst')) content.set(modelId, point)\n\t\t}\n\n\t\tconst childrenOf = new Map<string, ParentEdge[]>()\n\t\tconst edgeTo = new Map<string, ParentEdge>()\n\t\tfor (const connection of this.connections) {\n\t\t\tconst { sourceId, destinationId } = connection\n\t\t\tif (connection.type !== 'parOf' || sourceId === null || destinationId === null) continue\n\t\t\tif (!content.has(destinationId)) continue\n\t\t\tconst edge: ParentEdge = { parentId: sourceId, childId: destinationId, order: connection.sourceOrder ?? 0 }\n\t\t\tconst list = childrenOf.get(sourceId)\n\t\t\tif (list) list.push(edge)\n\t\t\telse childrenOf.set(sourceId, [edge])\n\t\t\tedgeTo.set(destinationId, edge)\n\t\t}\n\t\tfor (const list of childrenOf.values()) list.sort((a, b) => a.order - b.order)\n\n\t\t// `content` is in document order and `sort` is stable, so a point with no `parOf` edge\n\t\t// at all — a hand-built model, not something PowerPoint writes — keeps its place at the\n\t\t// end rather than being dropped.\n\t\tconst roots = [...content].filter(([modelId]) => {\n\t\t\tconst parentId = edgeTo.get(modelId)?.parentId\n\t\t\treturn parentId === undefined || !content.has(parentId)\n\t\t})\n\t\troots.sort(([a], [b]) => (edgeTo.get(a)?.order ?? MAX_ORDER) - (edgeTo.get(b)?.order ?? MAX_ORDER))\n\n\t\tconst placed = new Set<string>()\n\t\tconst build = (point: DiagramPoint, parent: DiagramNode | null, level: number, path: Set<string>): DiagramNode => {\n\t\t\tconst modelId = point.modelId\n\t\t\tif (modelId !== null && path.has(modelId)) throw this.#cycleError(modelId)\n\t\t\tconst node = new DiagramNode(point, parent, level)\n\t\t\tif (modelId === null) return node\n\t\t\tplaced.add(modelId)\n\t\t\tpath.add(modelId)\n\t\t\tfor (const edge of childrenOf.get(modelId) ?? []) {\n\t\t\t\tconst child = content.get(edge.childId)\n\t\t\t\tif (child) node.children.push(build(child, node, level + 1, path))\n\t\t\t}\n\t\t\tpath.delete(modelId)\n\t\t\treturn node\n\t\t}\n\t\tconst tree = roots.map(([, point]) => build(point, null, 0, new Set()))\n\n\t\t// A cycle that no root reaches would otherwise drop its members from the tree in\n\t\t// silence, since the walk never enters it. Every content point has at most one recorded\n\t\t// parent, so following parents from an unplaced point must repeat: unreachable and\n\t\t// cyclic are the same condition, and it gets the same answer as the reachable form.\n\t\tif (placed.size !== content.size) {\n\t\t\tconst orphan = [...content.keys()].find((modelId) => !placed.has(modelId))\n\t\t\tthrow this.#cycleError(orphan ?? '(unidentified)')\n\t\t}\n\t\treturn tree\n\t}\n\n\t/**\n\t * The point with this `@modelId`, or `null` — the lookup every connection getter implies,\n\t * since a `DiagramConnection` names its ends by id and nothing else resolves them.\n\t */\n\tpoint(modelId: string): DiagramPoint | null {\n\t\treturn this.points.find((candidate) => candidate.modelId === modelId) ?? null\n\t}\n\n\t/** Every edge (`dgm:cxnLst/dgm:cxn`) in document order. */\n\tget connections(): DiagramConnection[] {\n\t\tconst root = this.#root()\n\t\tconst cxnLst = root && firstChild(root, 'dgm:cxnLst')\n\t\tif (!cxnLst) return []\n\t\treturn getElements(cxnLst, 'dgm:cxn').map((cxn) => {\n\t\t\tconst rawType = attr(cxn, 'type')\n\t\t\treturn {\n\t\t\t\tmodelId: attr(cxn, 'modelId'),\n\t\t\t\ttype: rawType !== null && CONNECTION_TYPES.includes(rawType) ? (rawType as DiagramConnectionType) : 'parOf',\n\t\t\t\tsourceId: attr(cxn, 'srcId'),\n\t\t\t\tdestinationId: attr(cxn, 'destId'),\n\t\t\t\tsourceOrder: intValue(attr(cxn, 'srcOrd')),\n\t\t\t\tdestinationOrder: intValue(attr(cxn, 'destOrd')),\n\t\t\t\tparentTransitionId: idAttr(cxn, 'parTransId'),\n\t\t\t\tsiblingTransitionId: idAttr(cxn, 'sibTransId'),\n\t\t\t\tpresentationId: attr(cxn, 'presId') || null,\n\t\t\t}\n\t\t})\n\t}\n\n\t/**\n\t * The diagram's text in document order, blocks joined by `\\n` — the counterpart to\n\t * `TextFrame.text` for a construct that has no single text body.\n\t *\n\t * Contributing points are the ones a user can type into: everything except the generated\n\t * `pres` points, the `doc` root, and any point flagged as an unfilled placeholder. A\n\t * point with no text contributes no blank line. Transition labels (`parTrans`/`sibTrans`)\n\t * are included where a layout has them, which is why this is not simply the node list.\n\t */\n\tget text(): string {\n\t\treturn this.points\n\t\t\t.filter((point) => point.type !== 'pres' && point.type !== 'doc' && !point.isPlaceholder)\n\t\t\t.map((point) => point.text)\n\t\t\t.filter((text) => text.length > 0)\n\t\t\t.join('\\n')\n\t}\n\n\t/**\n\t * The layout preset the diagram is drawn with (the `doc` point's `dgm:prSet/@loTypeId`),\n\t * e.g. `urn:microsoft.com/office/officeart/2005/8/layout/hList1`. This is what names the\n\t * SmartArt *kind*; {@link layoutPart} is that preset's definition.\n\t */\n\tget layoutTypeId(): string | null {\n\t\treturn this.#docPrSetAttr('loTypeId')\n\t}\n\n\t/** The quick-style preset (the `doc` point's `dgm:prSet/@qsTypeId`). */\n\tget quickStyleTypeId(): string | null {\n\t\treturn this.#docPrSetAttr('qsTypeId')\n\t}\n\n\t/** The colour preset (the `doc` point's `dgm:prSet/@csTypeId`). */\n\tget colorsTypeId(): string | null {\n\t\treturn this.#docPrSetAttr('csTypeId')\n\t}\n\n\t/** The layout definition part (`dgm:relIds/@r:lo`), or `null` when missing from the package. */\n\tget layoutPart(): Part | null {\n\t\treturn this.#relPart('r:lo')\n\t}\n\n\t/** The quick-style part (`dgm:relIds/@r:qs`), or `null` when missing from the package. */\n\tget quickStylePart(): Part | null {\n\t\treturn this.#relPart('r:qs')\n\t}\n\n\t/** The colours part (`dgm:relIds/@r:cs`), or `null` when missing from the package. */\n\tget colorsPart(): Part | null {\n\t\treturn this.#relPart('r:cs')\n\t}\n\n\t/**\n\t * The fallback drawing part (`dsp:drawing`) that renders the diagram for a consumer with\n\t * no SmartArt layout engine, or `null` when the deck carries none. It is named by an MS\n\t * extension on the data model rather than by `dgm:relIds`, so a slide holding two\n\t * diagrams still resolves each to its own drawing.\n\t */\n\tget drawingPart(): Part | null {\n\t\tconst root = this.#root()\n\t\tconst extLst = root && firstChild(root, 'dgm:extLst')\n\t\tif (!extLst) return null\n\t\tfor (const ext of getElements(extLst, 'a:ext')) {\n\t\t\tif (attr(ext, 'uri') !== DRAWING_EXT_URI) continue\n\t\t\t// Matched on local name alone: the `dsp` namespace appears nowhere else in the read\n\t\t\t// path, and registering a prefix for one attribute lookup buys nothing.\n\t\t\tconst dataModelExt = firstChildElement(ext)\n\t\t\tif (!dataModelExt || dataModelExt.localName !== 'dataModelExt') continue\n\t\t\treturn this.#partForRelId(attr(dataModelExt, 'relId'))\n\t\t}\n\t\treturn null\n\t}\n\n\t/** Escape hatch: the underlying `dgm:dataModel` element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */\n\tget element_(): Element | null {\n\t\treturn this.part.dom.documentElement\n\t}\n\n\t/** Mark the diagram data part dirty so `save()` reserializes it. Call after mutating {@link element_}. */\n\tmarkDirty(): void {\n\t\tthis.part.markDirty()\n\t}\n\n\t#root(): Element | null {\n\t\treturn this.part.dom.documentElement\n\t}\n\n\t#cycleError(modelId: string): PackageReadError {\n\t\treturn new PackageReadError(\n\t\t\t'diagram/parent-edge-cycle',\n\t\t\t`Diagram ${this.part.partName} has a parOf cycle reaching point ${modelId}, so its points do not form a tree`\n\t\t)\n\t}\n\n\t/**\n\t * The `doc` point's `dgm:prSet`, which carries all three preset ids — resolved once\n\t * rather than once per getter, since each lookup is a scan of the whole `ptLst`.\n\t * `undefined` means \"not looked up yet\"; `null` means \"looked up, not there\".\n\t */\n\t#docPrSet(): Element | null {\n\t\tif (this.#docPrSetCache !== undefined) return this.#docPrSetCache\n\t\tconst root = this.#root()\n\t\tconst ptLst = root && firstChild(root, 'dgm:ptLst')\n\t\tconst doc = ptLst && getElements(ptLst, 'dgm:pt').find((pt) => attr(pt, 'type') === 'doc')\n\t\treturn (this.#docPrSetCache = (doc && firstChild(doc, 'dgm:prSet')) || null)\n\t}\n\n\t#docPrSetAttr(name: string): string | null {\n\t\tconst prSet = this.#docPrSet()\n\t\treturn prSet ? attr(prSet, name) : null\n\t}\n\n\t/**\n\t * The drawing index, built on first use and kept — see {@link DrawingIndex} for what that\n\t * memo costs a consumer who mutates the drawing part's shape tree by hand.\n\t */\n\t#drawingIndex(): DrawingIndex {\n\t\treturn (this.#drawing ??= new DrawingIndex(this.#root(), this.drawingPart, this.themeContext))\n\t}\n\n\t#relPart(qname: string): Part | null {\n\t\treturn this.#partForRelId(attr(this.relIds, qname))\n\t}\n\n\t#partForRelId(relId: string | null): Part | null {\n\t\tif (!relId) return null\n\t\t// A `dgm:relIds` id naming no relationship is a corrupt package rather than a missing\n\t\t// feature, so letting `resolveTarget` throw is the right outcome — the same contract\n\t\t// the chart and chartEx getters keep.\n\t\treturn this.opc.part(this.frameRelationships.resolveTarget(relId)) ?? null\n\t}\n}\n\n/** An `ST_ModelId` attribute whose schema default `0` means \"unset\" rather than naming a point. */\nfunction idAttr(element: Element, name: string): string | null {\n\tconst raw = attr(element, name)\n\treturn raw === null || raw === '' || raw === '0' ? null : raw\n}\n","/**\n * Ordered mutation of a table cell's `a:tcPr`, and the cell-scoped schema facts every such\n * edit needs.\n *\n * `CT_TableCellProperties` declares its children as a **sequence**, so an append-only\n * implementation produces an out-of-order `a:tcPr` — which PowerPoint reports as a corrupt\n * file rather than as a bad edit. Every insertion therefore goes through\n * {@link getOrAddChild} / {@link insertInOrder} with the new element's *successors*, which is\n * what `TCPR_AFTER` tabulates; it and the sequence it derives from live in\n * `src/ooxml/sequence.ts` alongside the other complexType orderings.\n *\n * The attribute values are the other half. A value outside its `ST_` union is equally fatal\n * and equally silent, so each is checked against the enum before it is written — the same\n * validate-at-the-boundary rule the write path follows, with the difference that here there\n * is a caller to throw at rather than a deck to degrade (see `ooxml/check-enum.ts`).\n */\nimport { InvalidOptionError } from '../../errors.js'\nimport type { InvalidOptionErrorCode } from '../../codes.js'\nimport { getOrAddChild, insertInOrder, type Element } from '../oxml/dom.js'\nimport { TCPR_AFTER } from '../../ooxml/sequence.js'\nimport { TEXT_ANCHORS, TEXT_HORZ_OVERFLOW, TEXT_VERTICAL } from '../../ooxml/st-enums.js'\n\nexport { TCPR_AFTER, TCPR_SEQUENCE } from '../../ooxml/sequence.js'\nexport { checkEnumOrThrow as checkEnum } from '../../ooxml/check-enum.js'\n\n/** `ST_TextAnchoringType` — `a:tcPr/@anchor`. */\nexport const ANCHOR_VALUES = TEXT_ANCHORS\n/** `ST_TextVerticalType` — `a:tcPr/@vert`. */\nexport const VERT_VALUES = TEXT_VERTICAL\n/** `ST_TextHorzOverflowType` — `a:tcPr/@horzOverflow`. */\nexport const HORZ_OVERFLOW_VALUES = TEXT_HORZ_OVERFLOW\n\n/** The four edges plus the two diagonals, keyed as {@link TableCellEdge} names them. */\nexport const EDGE_QNAMES = {\n\tleft: 'a:lnL',\n\tright: 'a:lnR',\n\ttop: 'a:lnT',\n\tbottom: 'a:lnB',\n\ttlToBr: 'a:lnTlToBr',\n\tblToTr: 'a:lnBlToTr',\n} as const\n\n/** Which border of a cell an edit addresses. */\nexport type TableCellEdge = keyof typeof EDGE_QNAMES\n\n/**\n * Get or create a child of `a:tcPr` at its schema position.\n * @param {Element} tcPr - the cell's properties element\n * @param {string} qname - the child to get or create\n * @returns {Element} the existing or newly-inserted child\n */\nexport function tcPrChild(tcPr: Element, qname: string): Element {\n\treturn getOrAddChild(tcPr, qname, TCPR_AFTER[qname] ?? [])\n}\n\n/**\n * Insert an already-built subtree into `a:tcPr` at its schema position.\n * @param {Element} tcPr - the cell's properties element\n * @param {string} qname - the qname of the node being inserted (decides where it goes)\n * @param {Element} node - the subtree to insert\n */\nexport function insertTcPrChild(tcPr: Element, qname: string, node: Element): void {\n\tinsertInOrder(tcPr, node, TCPR_AFTER[qname] ?? [])\n}\n\n/**\n * Round a measurement to whole EMU, rejecting a value that cannot be written.\n * `NaN`/`Infinity` would reach the attribute verbatim and make the part invalid, which is\n * exactly the \"silent coercion of invalid input\" the project's policy rules out.\n */\nexport function checkFiniteEmu(value: number, field: string, code: InvalidOptionErrorCode): number {\n\tif (!Number.isFinite(value))\n\t\tthrow new InvalidOptionError(code, `${field} must be a finite number of EMU, got: ${String(value)}`)\n\treturn Math.round(value)\n}\n","/**\n * Structural edits to an existing `a:tbl`: adding and removing rows and columns, and\n * merging and unmerging cells.\n *\n * The one fact that makes this tractable is that a stored table's grid is already\n * **rectangular**. Unlike the write path — which receives lopsided row arrays and has to\n * build the merge grid itself (`gen/slide/objects/table.ts` STEP 3) — every `a:tr` in a\n * conformant `a:tbl` holds exactly one `a:tc` per grid column, with the covered half of each\n * span present and flagged. So \"the cell at (r, c)\" is simply the c-th `a:tc` of the r-th\n * `a:tr`, and an edit's whole job is keeping that rectangle true.\n *\n * Three things have to stay in step, and every function here is written around them:\n *\n * 1. `a:tblGrid/a:gridCol` count == each row's `a:tc` count.\n * 2. A cell with `@gridSpan=\"n\"` is followed by exactly `n-1` cells carrying `@hMerge=\"1\"`,\n * and a cell with `@rowSpan=\"n\"` is under-hung by `n-1` cells carrying `@vMerge=\"1\"`, in\n * the same columns.\n * 3. A covered cell carries no span attributes of its own — its extent is the origin's.\n *\n * Breaking any of them produces a table PowerPoint reports as a corrupt file rather than as\n * a bad edit, which is why the span bookkeeping here is explicit rather than incidental.\n */\nimport { InvalidOptionError } from '../../errors.js'\nimport {\n\tattr,\n\tcreateElement,\n\tfirstChild,\n\tgetElements,\n\tintValue,\n\townerDocumentOf,\n\tremoveAttr,\n\tsetAttr,\n\ttype Document,\n\ttype Element,\n} from '../oxml/dom.js'\n\n/** Every `a:tr` of a table, in document order. */\nexport function rowsOf(tbl: Element): Element[] {\n\treturn getElements(tbl, 'a:tr')\n}\n\n/** Every `a:tc` of a row, in document (left-to-right) order. */\nfunction cellsOf(tr: Element): Element[] {\n\treturn getElements(tr, 'a:tc')\n}\n\n/** The table's `a:tblGrid`, or a thrown error — `CT_Table` requires one. */\nfunction gridOf(tbl: Element): Element {\n\tconst grid = firstChild(tbl, 'a:tblGrid')\n\tif (!grid)\n\t\tthrow new InvalidOptionError(\n\t\t\t'table/column-index-out-of-range',\n\t\t\t'This table has no a:tblGrid, so its columns cannot be edited'\n\t\t)\n\treturn grid\n}\n\n/** A cell's `@gridSpan`, defaulting to 1. */\nfunction gridSpanOf(tc: Element): number {\n\treturn intValue(attr(tc, 'gridSpan')) ?? 1\n}\n\n/** A cell's `@rowSpan`, defaulting to 1. */\nfunction rowSpanOf(tc: Element): number {\n\treturn intValue(attr(tc, 'rowSpan')) ?? 1\n}\n\n/** Whether a cell is the covered half of a horizontal merge. */\nfunction isHMerge(tc: Element): boolean {\n\treturn attr(tc, 'hMerge') === '1' || attr(tc, 'hMerge') === 'true'\n}\n\n/** Whether a cell is the covered half of a vertical merge. */\nfunction isVMerge(tc: Element): boolean {\n\treturn attr(tc, 'vMerge') === '1' || attr(tc, 'vMerge') === 'true'\n}\n\n/**\n * Set a span attribute, removing it when the span collapses to 1 — the schema default, and\n * what PowerPoint itself writes for an unmerged cell.\n */\nfunction setSpan(tc: Element, name: 'gridSpan' | 'rowSpan', value: number): void {\n\tif (value <= 1) removeAttr(tc, name)\n\telse setAttr(tc, name, String(value))\n}\n\n/**\n * Walk left from `col` to the origin of the horizontal run containing it.\n * A run is an origin followed by its `hMerge` continuations, so the origin is the first\n * cell at or left of `col` that is not one.\n * @returns the origin's column index, or `col` itself when the cell stands alone\n */\nfunction hRunOrigin(cells: Element[], col: number): number {\n\tlet idx = col\n\twhile (idx > 0) {\n\t\tconst cell = cells[idx]\n\t\tif (!cell || !isHMerge(cell)) break\n\t\tidx -= 1\n\t}\n\treturn idx\n}\n\n/**\n * Walk up from `row` to the origin of the vertical run containing `(row, col)`.\n * @returns the origin's row index, or `row` itself when the cell stands alone\n */\nfunction vRunOrigin(rows: Element[][], row: number, col: number): number {\n\tlet idx = row\n\twhile (idx > 0) {\n\t\tconst cell = rows[idx]?.[col]\n\t\tif (!cell || !isVMerge(cell)) break\n\t\tidx -= 1\n\t}\n\treturn idx\n}\n\n/** A fresh, empty `a:tc`, shaped the way PowerPoint writes one. */\nfunction makeCell(doc: Document): Element {\n\tconst tc = createElement(doc, 'a:tc')\n\tconst txBody = createElement(doc, 'a:txBody')\n\ttxBody.appendChild(createElement(doc, 'a:bodyPr'))\n\ttxBody.appendChild(createElement(doc, 'a:lstStyle'))\n\ttxBody.appendChild(createElement(doc, 'a:p'))\n\ttc.appendChild(txBody)\n\ttc.appendChild(createElement(doc, 'a:tcPr'))\n\treturn tc\n}\n\n/** The grid as a row-major array of `a:tc` elements. */\nfunction gridOfCells(tbl: Element): Element[][] {\n\treturn rowsOf(tbl).map((tr) => cellsOf(tr))\n}\n\n/** Guard an index against `[0, limit]` (inclusive upper bound, for insertion points). */\nfunction checkIndex(index: number, limit: number, what: 'row' | 'column', inclusive: boolean): number {\n\tconst max = inclusive ? limit : limit - 1\n\tif (!Number.isInteger(index) || index < 0 || index > max) {\n\t\tthrow new InvalidOptionError(\n\t\t\twhat === 'row' ? 'table/row-index-out-of-range' : 'table/column-index-out-of-range',\n\t\t\t`${what} index ${String(index)} is out of range (expected 0..${max})`\n\t\t)\n\t}\n\treturn index\n}\n\n/**\n * Insert a row at `index` (default: append).\n *\n * The subtle case is inserting **through** a vertical merge. If the row currently at `index`\n * holds a `vMerge` continuation in some column, the span it belongs to straddles the\n * insertion point — so the new row must continue that span rather than interrupt it: the\n * origin's `@rowSpan` grows by one and the new cell is another continuation. Interrupting it\n * instead would leave an origin claiming more rows than it has continuations, which is the\n * corrupt-file case.\n */\nexport function insertRow(tbl: Element, index?: number): Element {\n\tconst rows = rowsOf(tbl)\n\tconst at = index === undefined ? rows.length : checkIndex(index, rows.length, 'row', true)\n\tconst grid = gridOfCells(tbl)\n\tconst colCount = getElements(gridOf(tbl), 'a:gridCol').length\n\tconst doc = ownerDocumentOf(tbl)\n\n\tconst tr = createElement(doc, 'a:tr')\n\t// `@h` is required on CT_TableRow. Zero means \"auto — as tall as the content needs\",\n\t// which is the right default for a row nobody has sized.\n\tsetAttr(tr, 'h', '0')\n\n\tfor (let col = 0; col < colCount; col++) {\n\t\tconst tc = makeCell(doc)\n\t\t// A span crosses this insertion point only when the row being pushed down is itself a\n\t\t// continuation; if `at` is past the end, or the cell there starts its own span, nothing\n\t\t// is being split.\n\t\tconst displaced = grid[at]?.[col]\n\t\tif (displaced && isVMerge(displaced)) {\n\t\t\tconst originRow = vRunOrigin(grid, at, col)\n\t\t\tconst origin = grid[originRow]?.[col]\n\t\t\tif (origin) setSpan(origin, 'rowSpan', rowSpanOf(origin) + 1)\n\t\t\tsetAttr(tc, 'vMerge', '1')\n\t\t\t// The continuation must match the origin's horizontal extent too, or the row's cells\n\t\t\t// stop lining up with the grid columns.\n\t\t\tif (isHMerge(displaced)) setAttr(tc, 'hMerge', '1')\n\t\t\tconst span = gridSpanOf(displaced)\n\t\t\tif (span > 1) setSpan(tc, 'gridSpan', span)\n\t\t}\n\t\ttr.appendChild(tc)\n\t}\n\n\t// `CT_Table` sequences tblPr, tblGrid, then the rows, so an insert is always relative to\n\t// an existing `a:tr` (or appended, which lands after tblGrid either way).\n\tconst before = rows[at] ?? null\n\ttbl.insertBefore(tr, before)\n\treturn tr\n}\n\n/**\n * Remove the row at `index`.\n *\n * Two span cases, and they pull in opposite directions. A cell in this row that *continues*\n * a span from above shortens that span by one. A cell in this row that *starts* one cannot\n * simply take its span away — the rows below still hold its continuations — so the first\n * continuation is promoted to origin and inherits the remaining extent. Its content is gone\n * with the row, which is inherent to removing a row rather than a choice made here.\n */\nexport function removeRow(tbl: Element, index: number): void {\n\tconst rows = rowsOf(tbl)\n\tconst at = checkIndex(index, rows.length, 'row', false)\n\tconst grid = gridOfCells(tbl)\n\tconst row = grid[at] ?? []\n\n\tfor (let col = 0; col < row.length; col++) {\n\t\tconst tc = row[col]\n\t\tif (!tc) continue\n\t\tif (isVMerge(tc)) {\n\t\t\tconst origin = grid[vRunOrigin(grid, at, col)]?.[col]\n\t\t\tif (origin) setSpan(origin, 'rowSpan', rowSpanOf(origin) - 1)\n\t\t\tcontinue\n\t\t}\n\t\tconst span = rowSpanOf(tc)\n\t\tif (span > 1) {\n\t\t\tconst heir = grid[at + 1]?.[col]\n\t\t\tif (heir) {\n\t\t\t\tremoveAttr(heir, 'vMerge')\n\t\t\t\tsetSpan(heir, 'rowSpan', span - 1)\n\t\t\t\t// The promoted cell keeps whatever horizontal extent the origin had, so the row it\n\t\t\t\t// now leads still matches the grid.\n\t\t\t\tsetSpan(heir, 'gridSpan', gridSpanOf(tc))\n\t\t\t}\n\t\t}\n\t}\n\n\tconst tr = rows[at]\n\tif (tr) tbl.removeChild(tr)\n}\n\n/**\n * Insert a column at `index` (default: append), `widthEmu` wide.\n *\n * Mirrors {@link insertRow}'s split case on the other axis: when the cell currently at\n * `index` is an `hMerge` continuation, the insertion point falls inside a horizontal span,\n * so the span widens by one and the new cell joins it as another continuation.\n */\nexport function insertColumn(tbl: Element, index?: number, widthEmu = 914400): Element {\n\tconst grid = gridOf(tbl)\n\tconst cols = getElements(grid, 'a:gridCol')\n\tconst at = index === undefined ? cols.length : checkIndex(index, cols.length, 'column', true)\n\tconst doc = ownerDocumentOf(tbl)\n\n\tconst gridCol = createElement(doc, 'a:gridCol')\n\tsetAttr(gridCol, 'w', String(Math.round(widthEmu)))\n\tgrid.insertBefore(gridCol, cols[at] ?? null)\n\n\tfor (const tr of rowsOf(tbl)) {\n\t\tconst cells = cellsOf(tr)\n\t\tconst tc = makeCell(doc)\n\t\tconst displaced = cells[at]\n\t\tif (displaced && isHMerge(displaced)) {\n\t\t\tconst origin = cells[hRunOrigin(cells, at)]\n\t\t\tif (origin) setSpan(origin, 'gridSpan', gridSpanOf(origin) + 1)\n\t\t\tsetAttr(tc, 'hMerge', '1')\n\t\t\t// Same reasoning as the row case: match the vertical extent so the column still\n\t\t\t// lines up down the table.\n\t\t\tif (isVMerge(displaced)) setAttr(tc, 'vMerge', '1')\n\t\t\tconst span = rowSpanOf(displaced)\n\t\t\tif (span > 1) setSpan(tc, 'rowSpan', span)\n\t\t}\n\t\ttr.insertBefore(tc, cells[at] ?? firstChild(tr, 'a:extLst'))\n\t}\n\treturn gridCol\n}\n\n/**\n * Remove the column at `index`.\n *\n * When the column falls inside a horizontal span, the span shrinks by one and a\n * *continuation* is removed rather than the origin — so the merged region narrows but keeps\n * its content. Only a column whose cell stands alone loses that cell outright.\n */\nexport function removeColumn(tbl: Element, index: number): void {\n\tconst grid = gridOf(tbl)\n\tconst cols = getElements(grid, 'a:gridCol')\n\tconst at = checkIndex(index, cols.length, 'column', false)\n\tconst col = cols[at]\n\tif (col) grid.removeChild(col)\n\n\tfor (const tr of rowsOf(tbl)) {\n\t\tconst cells = cellsOf(tr)\n\t\tconst originIdx = hRunOrigin(cells, at)\n\t\tconst origin = cells[originIdx]\n\t\tif (!origin) continue\n\t\tconst span = gridSpanOf(origin)\n\t\tif (span > 1) {\n\t\t\tsetSpan(origin, 'gridSpan', span - 1)\n\t\t\t// Drop the run's last continuation: it carries no content, so removing it costs\n\t\t\t// nothing, while removing the origin would take the region's text with it.\n\t\t\tconst victim = cells[originIdx + span - 1]\n\t\t\tif (victim) tr.removeChild(victim)\n\t\t\tcontinue\n\t\t}\n\t\tconst tc = cells[at]\n\t\tif (tc) tr.removeChild(tc)\n\t}\n}\n\n/**\n * Merge the rectangle `(row1, col1)`–`(row2, col2)` into one cell.\n *\n * The top-left cell becomes the origin and keeps its content; every other cell in the\n * rectangle becomes a covered cell — flagged, stripped of its own span attributes, and\n * emptied, since a covered cell is never rendered.\n *\n * A rectangle whose boundary **cuts through** an existing merge is rejected rather than\n * silently widened. Widening would be the friendlier-looking choice and the wrong one: the\n * caller asked for a specific region, and quietly returning a different one is how a layout\n * ends up subtly wrong with nothing to point at.\n */\nexport function mergeCells(tbl: Element, row1: number, col1: number, row2: number, col2: number): void {\n\tconst grid = gridOfCells(tbl)\n\tconst rowCount = grid.length\n\tconst colCount = getElements(gridOf(tbl), 'a:gridCol').length\n\tconst r1 = Math.min(row1, row2)\n\tconst r2 = Math.max(row1, row2)\n\tconst c1 = Math.min(col1, col2)\n\tconst c2 = Math.max(col1, col2)\n\tcheckIndex(r1, rowCount, 'row', false)\n\tcheckIndex(r2, rowCount, 'row', false)\n\tcheckIndex(c1, colCount, 'column', false)\n\tcheckIndex(c2, colCount, 'column', false)\n\tif (r1 === r2 && c1 === c2) {\n\t\tthrow new InvalidOptionError(\n\t\t\t'table/merge-range-invalid',\n\t\t\t'A merge needs at least two cells; the given range covers one'\n\t\t)\n\t}\n\n\t// Every span touching the rectangle must lie entirely inside it.\n\tfor (let r = r1; r <= r2; r++) {\n\t\tfor (let c = c1; c <= c2; c++) {\n\t\t\tconst tc = grid[r]?.[c]\n\t\t\tif (!tc) continue\n\t\t\tconst originRow = vRunOrigin(grid, r, c)\n\t\t\tconst originCol = hRunOrigin(grid[r] ?? [], c)\n\t\t\tconst origin = grid[originRow]?.[originCol]\n\t\t\tif (!origin) continue\n\t\t\tif (originRow < r1 || originCol < c1) {\n\t\t\t\tthrow new InvalidOptionError(\n\t\t\t\t\t'table/merge-range-invalid',\n\t\t\t\t\t`The range (${r1},${c1})-(${r2},${c2}) starts inside an existing merged cell at (${originRow},${originCol}); unmerge it first`\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (originRow + rowSpanOf(origin) - 1 > r2 || originCol + gridSpanOf(origin) - 1 > c2) {\n\t\t\t\tthrow new InvalidOptionError(\n\t\t\t\t\t'table/merge-range-invalid',\n\t\t\t\t\t`The range (${r1},${c1})-(${r2},${c2}) cuts through an existing merged cell at (${originRow},${originCol}); unmerge it first`\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\n\tconst origin = grid[r1]?.[c1]\n\tif (!origin) return\n\tsetSpan(origin, 'gridSpan', c2 - c1 + 1)\n\tsetSpan(origin, 'rowSpan', r2 - r1 + 1)\n\tremoveAttr(origin, 'hMerge')\n\tremoveAttr(origin, 'vMerge')\n\n\tfor (let r = r1; r <= r2; r++) {\n\t\tfor (let c = c1; c <= c2; c++) {\n\t\t\tif (r === r1 && c === c1) continue\n\t\t\tconst tc = grid[r]?.[c]\n\t\t\tif (!tc) continue\n\t\t\tremoveAttr(tc, 'gridSpan')\n\t\t\tremoveAttr(tc, 'rowSpan')\n\t\t\tif (c > c1) setAttr(tc, 'hMerge', '1')\n\t\t\telse removeAttr(tc, 'hMerge')\n\t\t\tif (r > r1) setAttr(tc, 'vMerge', '1')\n\t\t\telse removeAttr(tc, 'vMerge')\n\t\t\temptyCellText(tc)\n\t\t}\n\t}\n}\n\n/**\n * Split the merged cell whose origin is `(row, col)` back into individual cells.\n * The origin keeps its content; the cells it covered come back empty, which is what they\n * already were.\n */\nexport function unmergeCell(tbl: Element, row: number, col: number): void {\n\tconst grid = gridOfCells(tbl)\n\tcheckIndex(row, grid.length, 'row', false)\n\tcheckIndex(col, getElements(gridOf(tbl), 'a:gridCol').length, 'column', false)\n\tconst origin = grid[row]?.[col]\n\tif (!origin) return\n\tif (isHMerge(origin) || isVMerge(origin)) {\n\t\tthrow new InvalidOptionError(\n\t\t\t'table/merge-range-invalid',\n\t\t\t`The cell at (${row},${col}) is a covered cell, not a merge origin; unmerge the origin at (${vRunOrigin(grid, row, col)},${hRunOrigin(grid[row] ?? [], col)}) instead`\n\t\t)\n\t}\n\tconst rowSpan = rowSpanOf(origin)\n\tconst gridSpan = gridSpanOf(origin)\n\tif (rowSpan === 1 && gridSpan === 1) return\n\n\tremoveAttr(origin, 'gridSpan')\n\tremoveAttr(origin, 'rowSpan')\n\tfor (let r = row; r < row + rowSpan; r++) {\n\t\tfor (let c = col; c < col + gridSpan; c++) {\n\t\t\tif (r === row && c === col) continue\n\t\t\tconst tc = grid[r]?.[c]\n\t\t\tif (!tc) continue\n\t\t\tremoveAttr(tc, 'hMerge')\n\t\t\tremoveAttr(tc, 'vMerge')\n\t\t}\n\t}\n}\n\n/** Reduce a cell's text body to a single empty paragraph. */\nfunction emptyCellText(tc: Element): void {\n\tconst txBody = firstChild(tc, 'a:txBody')\n\tif (!txBody) return\n\tfor (const p of getElements(txBody, 'a:p')) txBody.removeChild(p)\n\ttxBody.appendChild(createElement(ownerDocumentOf(txBody), 'a:p'))\n}\n","/**\n * Resolve a table's `a:tableStyleId` against the deck-wide `tableStyles.xml` and\n * compose the style graph into a per-cell fill.\n *\n * A table cell that defines no own `a:tcPr` fill still renders shaded, because the\n * referenced `a:tblStyle` supplies conditional formatting: `wholeTbl` under\n * `band1H`/`band2H` (row banding), `band1V`/`band2V` (column banding),\n * `firstRow`/`lastRow`, `firstCol`/`lastCol`, and the four corner cells. Resolving\n * a cell means picking, in ECMA-376 precedence order, the highest-priority part\n * that actually defines a fill, then resolving that fill through the slide theme.\n *\n * This is read-only; it does not touch the import/copy path in `table-styles.ts`.\n */\n\nimport type { OpcPackage } from '../opc/package.js'\nimport { attr, firstChild, firstChildElement, getElements, type Element } from '../oxml/dom.js'\nimport { styleRefFill, type ThemeContext } from '../oxml/theme.js'\nimport { resolveColorElement, type ResolvedColor } from './theme-context.js'\n\nconst TABLE_STYLES_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.presentationml.tableStyles+xml'\n\n/**\n * The `a:tblPr` condition flags that gate which style parts apply to a table.\n * `firstRow`/`bandRow` are the ones PowerPoint turns on by default; the rest are\n * off unless the author enabled the corresponding \"Header Column\" / \"Total Row\" /\n * \"Banded Columns\" toggle.\n */\nexport interface TableConditionFlags {\n\tfirstRow: boolean\n\tlastRow: boolean\n\tfirstCol: boolean\n\tlastCol: boolean\n\tbandRow: boolean\n\tbandCol: boolean\n}\n\n/** A table's resolved entry in `tableStyles.xml`: its GUID, display name, and raw element. */\nexport interface ResolvedTableStyle {\n\t/** The matched `@styleId` GUID (e.g. `{5C22544A-…}`). */\n\tstyleId: string\n\t/** The style's display name (`@styleName`, e.g. `Medium Style 2 - Accent 1`), or `null`. */\n\tname: string | null\n\t/** Escape hatch: the underlying `a:tblStyle` element. After mutating it call {@link ResolvedTableStyle.markDirty}, or `save()` writes the original bytes. */\n\telement_: Element\n\t/**\n\t * Mark `tableStyles.xml` dirty so `save()` reserializes it. Call after mutating\n\t * {@link ResolvedTableStyle.element_}. Note the part is deck-wide: an edit here\n\t * reaches every table bound to this style.\n\t */\n\tmarkDirty(): void\n}\n\n/**\n * Look up the `a:tblStyle` whose `@styleId` equals `styleId` in the deck's single\n * `tableStyles.xml`, or `null` when there is no such part or no matching style\n * (a built-in `[MS-OE376]` style the deck does not materialise resolves to `null`).\n */\nexport function resolveTableStyle(opc: OpcPackage, styleId: string | null): ResolvedTableStyle | null {\n\tif (!styleId) return null\n\tconst part = opc.partsByContentType(TABLE_STYLES_CONTENT_TYPE)[0]\n\tconst list = part?.dom.documentElement\n\tif (!part || !list) return null\n\tfor (const st of getElements(list, 'a:tblStyle')) {\n\t\tif (attr(st, 'styleId') === styleId) {\n\t\t\treturn {\n\t\t\t\tstyleId,\n\t\t\t\tname: attr(st, 'styleName'),\n\t\t\t\telement_: st,\n\t\t\t\tmarkDirty: () => {\n\t\t\t\t\tpart.markDirty()\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\t}\n\treturn null\n}\n\n/**\n * The style-part qnames that apply to the cell at `(row, col)`, highest precedence\n * first. Corner cells beat the row/column edge conditions, which beat banding,\n * which beats `wholeTbl`. Banding is suppressed on the header/footer rows and the\n * first/last columns, and its band ordinal is counted from the first body cell\n * (i.e. after a `firstRow` header), so the first body row is `band1H`.\n *\n * Only the `firstRow` / `band1H` / `band2H` / `wholeTbl` path is exercised by a\n * fixture today; the column/corner ordering follows the ECMA-376 conditional-format\n * precedence but is not render-verified.\n */\nfunction cellStyleParts(\n\tflags: TableConditionFlags,\n\trow: number,\n\tcol: number,\n\trowCount: number,\n\tcolCount: number\n): string[] {\n\tconst isFirstRow = flags.firstRow && row === 0\n\tconst isLastRow = flags.lastRow && row === rowCount - 1\n\tconst isFirstCol = flags.firstCol && col === 0\n\tconst isLastCol = flags.lastCol && col === colCount - 1\n\tconst parts: string[] = []\n\tif (isFirstRow && isFirstCol) parts.push('a:nwCell')\n\tif (isFirstRow && isLastCol) parts.push('a:neCell')\n\tif (isLastRow && isFirstCol) parts.push('a:swCell')\n\tif (isLastRow && isLastCol) parts.push('a:seCell')\n\tif (isFirstRow) parts.push('a:firstRow')\n\tif (isLastRow) parts.push('a:lastRow')\n\tif (isFirstCol) parts.push('a:firstCol')\n\tif (isLastCol) parts.push('a:lastCol')\n\tif (flags.bandRow && !isFirstRow && !isLastRow) {\n\t\tconst ordinal = row - (flags.firstRow ? 1 : 0)\n\t\tparts.push(ordinal % 2 === 0 ? 'a:band1H' : 'a:band2H')\n\t}\n\tif (flags.bandCol && !isFirstCol && !isLastCol) {\n\t\tconst ordinal = col - (flags.firstCol ? 1 : 0)\n\t\tparts.push(ordinal % 2 === 0 ? 'a:band1V' : 'a:band2V')\n\t}\n\tparts.push('a:wholeTbl')\n\treturn parts\n}\n\n/**\n * The fill a single `a:tcStyle` contributes. `fall` means the part defines no fill\n * (only borders, or nothing) so resolution continues to the next-lower part;\n * `stop` means the part settles the fill — either a resolved solid colour or `null`\n * for an explicit `a:noFill` / a non-solid style fill (a gradient has no single hex).\n */\nfunction tcStyleFill(\n\ttcStyle: Element,\n\tctx: ThemeContext\n): { stop: true; color: ResolvedColor | null } | { stop: false } {\n\tconst fillRef = firstChild(tcStyle, 'a:fillRef')\n\tif (fillRef) {\n\t\tconst fill = styleRefFill(fillRef, ctx)\n\t\tconst color = fill && fill.localName === 'solidFill' ? resolveColorElement(firstChildElement(fill), ctx) : null\n\t\treturn { stop: true, color }\n\t}\n\tconst fill = firstChild(tcStyle, 'a:fill')\n\tif (!fill) return { stop: false }\n\tconst solid = firstChild(fill, 'a:solidFill')\n\treturn { stop: true, color: solid ? resolveColorElement(firstChildElement(solid), ctx) : null }\n}\n\n/**\n * The fill the table style contributes to the cell at `(row, col)`, resolved to a\n * literal hex through the slide theme, or `null` when the applicable style parts\n * define no solid fill (an explicit `a:noFill`, e.g. a \"Light Style\" body cell,\n * also reads `null`). The caller supplies the resolved `a:tblStyle`, the table's\n * condition flags, and the grid dimensions.\n */\nexport function resolveTableCellStyleFill(\n\tstyle: Element,\n\tflags: TableConditionFlags,\n\trow: number,\n\tcol: number,\n\trowCount: number,\n\tcolCount: number,\n\tctx: ThemeContext\n): ResolvedColor | null {\n\tfor (const partName of cellStyleParts(flags, row, col, rowCount, colCount)) {\n\t\tconst part = firstChild(style, partName)\n\t\tconst tcStyle = part && firstChild(part, 'a:tcStyle')\n\t\tif (!tcStyle) continue\n\t\tconst outcome = tcStyleFill(tcStyle, ctx)\n\t\tif (outcome.stop) return outcome.color\n\t}\n\treturn null\n}\n","/**\n * Read/edit proxies for a table (`a:tbl`) hosted in a `p:graphicFrame`.\n *\n * `Table → TableRow[] → TableCell[]`, each wrapping a live DOM element and\n * holding the owning slide `Part` so edits mutate the node in place and call\n * `part.markDirty()`. Cell text reuses the `TextFrame`/`Paragraph`/`Run`\n * proxies, so per-run formatting edits work exactly as on a shape's text.\n */\nimport type { OpcPackage } from '../opc/package.js'\nimport type { Part } from '../opc/part.js'\nimport type { Relationships } from '../opc/relationships.js'\nimport {\n\tattr,\n\tcreateElement,\n\tfirstChild,\n\tgetElements,\n\tgetOrAddChild,\n\tintValue,\n\townerDocumentOf,\n\tremoveAttr,\n\tremoveChildrenByQName,\n\tsetAttr,\n\ttype Element,\n} from '../oxml/dom.js'\nimport { FILL_CHOICES, normalizeHex, setSolidFill } from '../oxml/fill.js'\nimport {\n\tANCHOR_VALUES,\n\tcheckEnum,\n\tcheckFiniteEmu,\n\tEDGE_QNAMES,\n\tHORZ_OVERFLOW_VALUES,\n\tinsertTcPrChild,\n\tTCPR_AFTER,\n\ttcPrChild,\n\tVERT_VALUES,\n\ttype TableCellEdge,\n} from './table-edit.js'\nimport { insertColumn, insertRow, mergeCells, removeColumn, removeRow, rowsOf, unmergeCell } from './table-structure.js'\nimport type { InvalidOptionErrorCode } from '../../codes.js'\nimport type { ThemeContext } from '../oxml/theme.js'\nimport { readPictureFill, type PictureFill } from './picture-fill.js'\nimport { readGradientFill, type GradientFill } from './gradient.js'\nimport { readPatternFill, type PatternFill } from './pattern-fill.js'\nimport {\n\tresolveTableCellStyleFill,\n\tresolveTableStyle,\n\ttype ResolvedTableStyle,\n\ttype TableConditionFlags,\n} from './table-style-resolve.js'\nimport { resolveSolidFillColor, type ResolvedColor } from './theme-context.js'\nimport { setTextBodyText, TextFrame } from './text.js'\nimport { InvalidOptionError, PackageReadError } from '../../errors.js'\nimport { EMU_PER_POINT } from '../../units.js'\n\n/**\n * One border as {@link TableCell.setBorder} takes it — the write-side mirror of\n * {@link CellBorder}, which is what reading one gives back.\n *\n * Deliberately not `CellBorder` itself: that type reports every field, `null` included, so\n * passing one back would make \"leave this alone\" unsayable. Here an omitted field is simply\n * not written, which is what an edit usually means.\n */\nexport interface TableCellBorderEdit {\n\t/** Border width in points; omitted leaves `@w` unset, which renders as a hairline. */\n\twidthPt?: number | null\n\t/** Dash preset (`a:prstDash/@val`, e.g. `sysDash`); omitted leaves the border solid. */\n\tdash?: string\n\t/** Explicit colour as 6-hex (`#` optional). Ignored when {@link schemeColor} is given. */\n\tcolor?: string\n\t/** Theme colour token (e.g. `accent1`); preferred over {@link color} when both are set. */\n\tschemeColor?: string\n\t/** Write an explicit `a:noFill` — a deliberately suppressed edge, not an absent one. */\n\tnoFill?: boolean\n}\n\n/**\n * The context a cell needs to resolve its style-graph fill: the table's resolved\n * `a:tblStyle`, its condition flags, and the grid dimensions. Threaded from\n * {@link Table} down to each {@link TableCell} alongside the cell's own position.\n * `null` when the table references no resolvable style.\n */\ninterface TableCellStyleContext {\n\tstyle: ResolvedTableStyle\n\tflags: TableConditionFlags\n\trowCount: number\n\tcolCount: number\n\tctx: ThemeContext\n}\n\n/**\n * One edge border of a table cell (`a:tcPr/a:lnL|lnR|lnT|lnB|lnTlToBr|lnBlToTr`).\n * Mirrors the `a:ln`-style decode used for shape strokes: {@link widthPt} from\n * `@w` (EMU → points), {@link dash} from `a:prstDash/@val`, and the stroke colour\n * split into a resolved {@link color} (literal hex) and the raw {@link schemeColor}\n * token — the cell-border counterpart of a shape's line accessors.\n */\nexport interface CellBorder {\n\t/** Border width in points (`@w` is EMU; 12700 EMU = 1pt), or `null` when unset. */\n\twidthPt: number | null\n\t/** Dash style (`a:prstDash/@val`, e.g. `solid`/`sysDash`), or `null` when unset. */\n\tdash: string | null\n\t/**\n\t * The stroke colour as a full {@link ResolvedColor} — base `hex`, the raw\n\t * `transforms` list (`lumMod`/`shade`/…) in document order, and the\n\t * `effectiveHex`/`alpha` after applying them — the same object a shape's\n\t * `resolvedLine` gives. `null` when the edge carries no solid fill, or the\n\t * colour cannot be made literal.\n\t *\n\t * This is the field to read when re-authoring a border against a *different*\n\t * theme: {@link color} alone is one theme baked in, so a `lumMod`-darkened\n\t * accent carried forward as a literal hex silently stops tracking the theme it\n\t * came from. `transforms` is what says whether there was anything to track, and\n\t * an empty list here means the edge stated none — not that the reader could not\n\t * see them.\n\t */\n\tresolvedColor: ResolvedColor | null\n\t/**\n\t * The stroke colour resolved against the table theme to a literal hex — exactly\n\t * `resolvedColor?.effectiveHex ?? null`, kept as a flat field because painting a\n\t * rule is what most callers want. `null` when the edge has no resolvable colour.\n\t */\n\tcolor: string | null\n\t/** Raw `schemeClr` token of the stroke (`a:solidFill/a:schemeClr/@val`), or `null` for an srgb/absent colour. */\n\tschemeColor: string | null\n\t/** `true` when the edge is an explicit no-border (`a:noFill`) — a deliberately suppressed side. */\n\tnoFill: boolean\n}\n\n/**\n * A table cell's six possible borders, keyed by edge. Each side is `null` when the\n * cell defines no line for it; the diagonals ({@link tlToBr} `╲`, {@link blToTr} `╱`)\n * are rarely authored. The whole object is `null` when the cell carries no border\n * element at all (see {@link TableCell.borders}).\n */\nexport interface CellBorders {\n\tleft: CellBorder | null\n\tright: CellBorder | null\n\ttop: CellBorder | null\n\tbottom: CellBorder | null\n\ttlToBr: CellBorder | null\n\tblToTr: CellBorder | null\n}\n\n/**\n * A table cell's 3-D bevel (`a:tcPr/a:cell3D`), as read back. Every field is `null` when the\n * source leaves it to the schema default, so a reader can tell \"PowerPoint wrote `circle`\"\n * from \"PowerPoint wrote nothing and `circle` is what it means\".\n */\nexport interface CellThreeD {\n\t/** `a:cell3D/@prstMaterial` (`ST_PresetMaterialType`), or `null` when unset. */\n\tmaterial: string | null\n\t/** The required `a:bevel`. Present whenever the cell has a `a:cell3D` at all. */\n\tbevel: {\n\t\t/** `a:bevel/@prst` (`ST_BevelPresetType`), or `null` when unset. */\n\t\tpreset: string | null\n\t\t/** `a:bevel/@w` converted from EMU to points, or `null` when unset. */\n\t\twidthPt: number | null\n\t\t/** `a:bevel/@h` converted from EMU to points, or `null` when unset. */\n\t\theightPt: number | null\n\t}\n\t/** `a:cell3D/a:lightRig`, or `null` when the cell leaves lighting to the renderer. */\n\tlightRig: { rig: string | null; dir: string | null } | null\n}\n\n/** A table: a grid of rows and cells inside a graphic frame. */\nexport class Table {\n\tconstructor(\n\t\tprivate readonly tbl: Element,\n\t\tprivate readonly part: Part,\n\t\t/** The owning slide's theme colour context, threaded to each cell's text for `Run.resolvedColor`. */\n\t\tprivate readonly themeColors?: ThemeContext,\n\t\t/** The deck package, for resolving `a:tableStyleId` against `tableStyles.xml` (style-graph cell fills). */\n\t\tprivate readonly opc?: OpcPackage,\n\t\t/** The owning slide's relationships, for resolving a cell picture fill's `r:embed` to a partname. */\n\t\tprivate readonly rels?: Relationships\n\t) {}\n\n\t/** The table's rows (`a:tr`) in document (top-to-bottom) order. */\n\tget rows(): TableRow[] {\n\t\tconst style = this.#styleContext()\n\t\treturn getElements(this.tbl, 'a:tr').map(\n\t\t\t(tr, rowIndex) => new TableRow(tr, this.part, this.themeColors, style, rowIndex, this.rels)\n\t\t)\n\t}\n\n\t/**\n\t * The table's style graph entry (`styleId`, `name`, raw `a:tblStyle`) resolved\n\t * from the deck's `tableStyles.xml`, or `null` when the table names no\n\t * `a:tableStyleId`, the deck has no `tableStyles.xml`, or the id is a built-in\n\t * `[MS-OE376]` style the deck does not materialise. This is what supplies the\n\t * banded-row / header shading a cell with no own fill inherits — read the\n\t * resolved per-cell colour off {@link TableCell.resolvedFill}.\n\t */\n\tget resolvedStyle(): ResolvedTableStyle | null {\n\t\treturn this.opc ? resolveTableStyle(this.opc, this.styleId) : null\n\t}\n\n\t/** The per-cell style-resolution context, or `null` when no style resolves or there is no theme context. */\n\t#styleContext(): TableCellStyleContext | null {\n\t\tif (!this.opc || !this.themeColors) return null\n\t\tconst style = resolveTableStyle(this.opc, this.styleId)\n\t\tif (!style) return null\n\t\treturn {\n\t\t\tstyle,\n\t\t\tflags: {\n\t\t\t\tfirstRow: this.#tblPrFlag('firstRow'),\n\t\t\t\tlastRow: this.#tblPrFlag('lastRow'),\n\t\t\t\tfirstCol: this.#tblPrFlag('firstCol'),\n\t\t\t\tlastCol: this.#tblPrFlag('lastCol'),\n\t\t\t\tbandRow: this.#tblPrFlag('bandRow'),\n\t\t\t\tbandCol: this.#tblPrFlag('bandCol'),\n\t\t\t},\n\t\t\trowCount: this.rowCount,\n\t\t\tcolCount: this.columnCount,\n\t\t\tctx: this.themeColors,\n\t\t}\n\t}\n\n\t/** Number of rows (`a:tr`). */\n\tget rowCount(): number {\n\t\treturn getElements(this.tbl, 'a:tr').length\n\t}\n\n\t/** Number of grid columns (`a:tblGrid/a:gridCol`). */\n\tget columnCount(): number {\n\t\tconst grid = firstChild(this.tbl, 'a:tblGrid')\n\t\treturn grid ? getElements(grid, 'a:gridCol').length : 0\n\t}\n\n\t/** Column widths in EMU (`a:gridCol/@w`), one per grid column. */\n\tget columnWidths(): (number | null)[] {\n\t\tconst grid = firstChild(this.tbl, 'a:tblGrid')\n\t\tif (!grid) return []\n\t\treturn getElements(grid, 'a:gridCol').map((col) => intValue(attr(col, 'w')))\n\t}\n\n\t/**\n\t * The table's style GUID (`a:tblPr/a:tableStyleId` text), e.g.\n\t * `{5940675A-B579-460E-94D1-54222C63F5DA}`, or `null` when the table carries no\n\t * `a:tableStyleId`. This is the reference into `ppt/tableStyles.xml` (or a\n\t * built-in `[MS-OE376]` style) that supplies the banded-row / header shading the\n\t * `firstRow`/`bandRow` flags activate — without it a replica loses the whole\n\t * table style, so it is the read counterpart of the writer's `tableStyle` option.\n\t */\n\tget styleId(): string | null {\n\t\tconst tblPr = firstChild(this.tbl, 'a:tblPr')\n\t\tconst idEl = tblPr && firstChild(tblPr, 'a:tableStyleId')\n\t\tconst id = idEl?.textContent?.trim()\n\t\treturn id ? id : null\n\t}\n\n\t/**\n\t * The table's own background (`a:tblPr` fill) resolved against the slide's theme colour\n\t * context to a literal hex, or `null` when the table carries no solid background.\n\t *\n\t * This is the table-level counterpart of {@link TableCell.resolvedFill}, and it is a\n\t * genuinely different thing from a cell fill: a `a:tblPr` fill sits *behind* the grid, so\n\t * a cell with no fill of its own shows it through. Reports `null` for a non-solid choice\n\t * (`a:blipFill`/`a:gradFill`/`a:pattFill`/`a:noFill`) — read {@link pictureFill} for an\n\t * image background — and `null` with no theme context.\n\t */\n\tget resolvedFill(): ResolvedColor | null {\n\t\tif (!this.themeColors) return null\n\t\tconst tblPr = firstChild(this.tbl, 'a:tblPr')\n\t\tif (!tblPr || !FILL_CHOICES.some((q) => firstChild(tblPr, q))) return null\n\t\treturn resolveSolidFillColor(tblPr, this.themeColors)\n\t}\n\n\t/**\n\t * The table's picture background (`a:tblPr/a:blipFill`), or `null` when the table is not\n\t * image-backed. The table-level twin of {@link TableCell.pictureFill}, and needed for the\n\t * same reason: {@link resolvedFill} decodes only solid colours, so without this an\n\t * image-backed table is indistinguishable from an unfilled one.\n\t */\n\tget pictureFill(): PictureFill | null {\n\t\tconst tblPr = firstChild(this.tbl, 'a:tblPr')\n\t\treturn tblPr ? readPictureFill(tblPr, this.rels ?? null) : null\n\t}\n\n\t/**\n\t * The table's gradient background (`a:tblPr/a:gradFill`), or `null` when it is not\n\t * gradient-filled. Needed for the same reason {@link pictureFill} is:\n\t * {@link resolvedFill} decodes only solid colours.\n\t */\n\tget gradientFill(): GradientFill | null {\n\t\tif (!this.themeColors) return null\n\t\tconst tblPr = firstChild(this.tbl, 'a:tblPr')\n\t\treturn tblPr ? readGradientFill(tblPr, this.themeColors) : null\n\t}\n\n\t/**\n\t * The table's pattern (hatch) background (`a:tblPr/a:pattFill`), or `null` when it is not\n\t * pattern-filled.\n\t */\n\tget patternFill(): PatternFill | null {\n\t\tif (!this.themeColors) return null\n\t\tconst tblPr = firstChild(this.tbl, 'a:tblPr')\n\t\treturn tblPr ? readPatternFill(tblPr, this.themeColors) : null\n\t}\n\n\t/**\n\t * The raw `schemeClr` token of the table's own background\n\t * (`a:tblPr/a:solidFill/a:schemeClr/@val`), or `null` for an absent or `srgbClr` fill.\n\t * {@link resolvedFill} is the literal it resolves to; this is the unresolved reference,\n\t * which is what a replica should carry so the copy still tracks its theme.\n\t */\n\tget fillSchemeColor(): string | null {\n\t\tconst tblPr = firstChild(this.tbl, 'a:tblPr')\n\t\tconst fill = tblPr && firstChild(tblPr, 'a:solidFill')\n\t\tconst scheme = fill && firstChild(fill, 'a:schemeClr')\n\t\treturn scheme ? attr(scheme, 'val') : null\n\t}\n\n\t/** Whether the first row is styled as a header (`a:tblPr/@firstRow`). */\n\tget firstRowHeader(): boolean {\n\t\treturn this.#tblPrFlag('firstRow')\n\t}\n\n\t/** Whether rows are banded (`a:tblPr/@bandRow`). */\n\tget bandedRows(): boolean {\n\t\treturn this.#tblPrFlag('bandRow')\n\t}\n\n\t/**\n\t * The cell at `(rowIndex, columnIndex)` (both zero-based), or `null` when out\n\t * of range. Column index counts `a:tc` elements in the row, so a cell that\n\t * spans columns (`gridSpan`) occupies a single index here.\n\t */\n\tcell(rowIndex: number, columnIndex: number): TableCell | null {\n\t\treturn this.rows[rowIndex]?.cells[columnIndex] ?? null\n\t}\n\n\t/**\n\t * Insert a row, defaulting to the bottom of the table. Returns the new {@link TableRow}.\n\t *\n\t * The new row is auto-height (`a:tr/@h=\"0\"`) and its cells are empty. Inserting *through*\n\t * a vertical merge extends that merge rather than interrupting it: the span's origin\n\t * grows by a row and the new cell joins as a continuation, because an origin claiming\n\t * more rows than it has continuations is a table PowerPoint reports as corrupt.\n\t * @param {number} [index] - where to insert, `0`..`rowCount`; appended when omitted\n\t * @throws {InvalidOptionError} when `index` is outside that range\n\t */\n\taddRow(index?: number): TableRow {\n\t\tconst tr = insertRow(this.tbl, index)\n\t\tthis.part.markDirty()\n\t\treturn new TableRow(tr, this.part, this.themeColors, this.#styleContext(), rowsOf(this.tbl).indexOf(tr), this.rels)\n\t}\n\n\t/**\n\t * Remove the row at `index`, with its content.\n\t *\n\t * A cell in the row that *continues* a vertical merge shortens that merge. A cell that\n\t * *starts* one hands the region to its first continuation, which becomes the new origin —\n\t * the merged region survives one row shorter, and only the removed row's own text is lost.\n\t * @throws {InvalidOptionError} when `index` is out of range\n\t */\n\tremoveRow(index: number): void {\n\t\tremoveRow(this.tbl, index)\n\t\tthis.part.markDirty()\n\t}\n\n\t/**\n\t * Insert a column, defaulting to the right-hand end. Updates `a:tblGrid` **and** every\n\t * row, which is the pair that has to stay in step.\n\t *\n\t * The mirror of {@link addRow}'s merge case: inserting inside a horizontal merge widens\n\t * it instead of splitting it.\n\t * @param {number} [index] - where to insert, `0`..`columnCount`; appended when omitted\n\t * @param {number} [widthEmu] - the new column's width; defaults to 1 inch\n\t * @throws {InvalidOptionError} when `index` is outside that range\n\t */\n\taddColumn(index?: number, widthEmu?: number): void {\n\t\tinsertColumn(this.tbl, index, widthEmu)\n\t\tthis.part.markDirty()\n\t}\n\n\t/**\n\t * Remove the column at `index`, from `a:tblGrid` and from every row.\n\t *\n\t * Inside a horizontal merge the region narrows by one and keeps its content: a covered\n\t * cell is dropped rather than the origin. Elsewhere the column's cells go with it.\n\t * @throws {InvalidOptionError} when `index` is out of range\n\t */\n\tremoveColumn(index: number): void {\n\t\tremoveColumn(this.tbl, index)\n\t\tthis.part.markDirty()\n\t}\n\n\t/**\n\t * Merge the rectangle between two cell positions into one cell. The top-left cell keeps\n\t * its content; the rest become covered cells and are emptied, since a covered cell is\n\t * never rendered.\n\t *\n\t * A rectangle that cuts through an existing merge is **rejected**, not silently widened\n\t * to fit — the caller asked for a specific region, and quietly producing a different one\n\t * is how a layout ends up wrong with nothing to point at. Unmerge first.\n\t * @throws {InvalidOptionError} when an index is out of range, the range covers one cell,\n\t * or it partially overlaps an existing merge\n\t */\n\tmergeCells(row1: number, col1: number, row2: number, col2: number): void {\n\t\tmergeCells(this.tbl, row1, col1, row2, col2)\n\t\tthis.part.markDirty()\n\t}\n\n\t/**\n\t * Split the merged cell whose **origin** is `(row, col)` back into individual cells.\n\t * A no-op on a cell that is not merged; addressing a covered cell instead of the origin\n\t * throws, and the message names the origin to use.\n\t * @throws {InvalidOptionError} when an index is out of range or the cell is a covered cell\n\t */\n\tunmergeCell(row: number, col: number): void {\n\t\tunmergeCell(this.tbl, row, col)\n\t\tthis.part.markDirty()\n\t}\n\n\t/** Escape hatch: the underlying `a:tbl` element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */\n\tget element_(): Element {\n\t\treturn this.tbl\n\t}\n\n\t/** Mark the owning part dirty so `save()` reserializes it. Call after mutating {@link element_}. */\n\tmarkDirty(): void {\n\t\tthis.part.markDirty()\n\t}\n\n\t#tblPrFlag(name: string): boolean {\n\t\tconst tblPr = firstChild(this.tbl, 'a:tblPr')\n\t\treturn tblPr ? attr(tblPr, name) === '1' : false\n\t}\n}\n\n/** One table row (`a:tr`). */\nexport class TableRow {\n\tconstructor(\n\t\tprivate readonly tr: Element,\n\t\tprivate readonly part: Part,\n\t\t/** The owning slide's theme colour context, threaded to each {@link TableCell}. */\n\t\tprivate readonly themeColors?: ThemeContext,\n\t\t/** The table's style-resolution context, threaded to each cell for {@link TableCell.resolvedFill}. */\n\t\tprivate readonly style?: TableCellStyleContext | null,\n\t\t/** This row's zero-based index in the table, for style-graph banding/edge conditions. */\n\t\tprivate readonly rowIndex = 0,\n\t\t/** The owning slide's relationships, threaded to each cell for {@link TableCell.pictureFill}. */\n\t\tprivate readonly rels?: Relationships\n\t) {}\n\n\t/** The row's cells (`a:tc`) in left-to-right order. */\n\tget cells(): TableCell[] {\n\t\treturn getElements(this.tr, 'a:tc').map(\n\t\t\t(tc, colIndex) => new TableCell(tc, this.part, this.themeColors, this.style, this.rowIndex, colIndex, this.rels)\n\t\t)\n\t}\n\n\t/** Row height in EMU (`a:tr/@h`), or `null` if unset. */\n\tget heightEmu(): number | null {\n\t\treturn intValue(attr(this.tr, 'h'))\n\t}\n\n\t/** Escape hatch: the underlying `a:tr` element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */\n\tget element_(): Element {\n\t\treturn this.tr\n\t}\n\n\t/** Mark the owning part dirty so `save()` reserializes it. Call after mutating {@link element_}. */\n\tmarkDirty(): void {\n\t\tthis.part.markDirty()\n\t}\n}\n\n/** One table cell (`a:tc`). */\nexport class TableCell {\n\tconstructor(\n\t\tprivate readonly tc: Element,\n\t\tprivate readonly part: Part,\n\t\t/** The owning slide's theme colour context, threaded to the cell's text for `Run.resolvedColor`. */\n\t\tprivate readonly themeColors?: ThemeContext,\n\t\t/** The table's style-resolution context, for the {@link resolvedFill} style-graph fallback. */\n\t\tprivate readonly style?: TableCellStyleContext | null,\n\t\t/** This cell's zero-based row index in the table. */\n\t\tprivate readonly rowIndex = 0,\n\t\t/** This cell's zero-based column index in its row. */\n\t\tprivate readonly colIndex = 0,\n\t\t/** The owning slide's relationships, for resolving {@link pictureFill}'s `r:embed` to a partname. */\n\t\tprivate readonly rels?: Relationships\n\t) {}\n\n\t/** The cell's text frame (`a:txBody`); `null` only if the cell has none (non-conformant). */\n\tget textFrame(): TextFrame | null {\n\t\tconst txBody = firstChild(this.tc, 'a:txBody')\n\t\treturn txBody ? new TextFrame(txBody, this.part, this.themeColors) : null\n\t}\n\n\t/** The cell's text, paragraphs joined by `\\n`. */\n\tget text(): string {\n\t\treturn this.textFrame?.text ?? ''\n\t}\n\n\t/**\n\t * Replace the cell's text with a single paragraph and run, preserving the\n\t * formatting (`a:rPr`) of the cell's first existing run when there is one.\n\t * For finer control (multiple runs, per-run formatting), edit\n\t * `textFrame.paragraphs[].runs[]` directly.\n\t */\n\tset text(value: string) {\n\t\tconst txBody = firstChild(this.tc, 'a:txBody')\n\t\tif (!txBody) throw new PackageReadError('table/cell-has-no-text-body', 'Table cell has no a:txBody to set text on')\n\t\tsetTextBodyText(txBody, value)\n\t\tthis.part.markDirty()\n\t}\n\n\t/** The cell's properties element (`a:tcPr`), or `null` when the cell defines none. */\n\t#tcPr(): Element | null {\n\t\treturn firstChild(this.tc, 'a:tcPr')\n\t}\n\n\t/**\n\t * The cell's `a:tcPr`, creating it when absent.\n\t *\n\t * `CT_TableCell` sequences `a:txBody` then `a:tcPr` then `a:extLst`, so a newly created\n\t * one is inserted before `a:extLst` — appending it blindly would put it after and make\n\t * the part invalid. Every setter below goes through here for that reason.\n\t */\n\t#getOrAddTcPr(): Element {\n\t\treturn getOrAddChild(this.tc, 'a:tcPr', ['a:extLst'])\n\t}\n\n\t/**\n\t * Set (or clear) the cell's vertical text anchor (`a:tcPr/@anchor`).\n\t * `null` removes the attribute, leaving PowerPoint's default of top.\n\t * @throws {InvalidOptionError} when the value is outside `ST_TextAnchoringType`\n\t */\n\tsetAnchor(value: string | null): void {\n\t\tthis.#setTcPrAttr('anchor', value, ANCHOR_VALUES, 'table/invalid-cell-anchor')\n\t}\n\n\t/**\n\t * Set (or clear) the cell's text direction (`a:tcPr/@vert`), e.g. `'vert270'`.\n\t * `null` removes the attribute, leaving the default horizontal text.\n\t * @throws {InvalidOptionError} when the value is outside `ST_TextVerticalType`\n\t */\n\tsetVerticalText(value: string | null): void {\n\t\tthis.#setTcPrAttr('vert', value, VERT_VALUES, 'table/invalid-cell-vert')\n\t}\n\n\t/**\n\t * Set (or clear) `a:tcPr/@horzOverflow` — what a single glyph too wide for the cell does.\n\t * `null` removes the attribute; so does `'clip'` in effect, since it is the schema\n\t * default, but the attribute is still written as asked.\n\t * @throws {InvalidOptionError} when the value is outside `ST_TextHorzOverflowType`\n\t */\n\tsetHorzOverflow(value: string | null): void {\n\t\tthis.#setTcPrAttr('horzOverflow', value, HORZ_OVERFLOW_VALUES, 'table/invalid-cell-overflow')\n\t}\n\n\t/**\n\t * Centre the cell's text block horizontally, or stop doing so (`a:tcPr/@anchorCtr`).\n\t * `false` removes the attribute rather than writing `\"0\"`, since `false` is the schema\n\t * default and the two are indistinguishable to a renderer.\n\t */\n\tsetAnchorCtr(value: boolean): void {\n\t\tconst tcPr = this.#getOrAddTcPr()\n\t\tif (value) setAttr(tcPr, 'anchorCtr', '1')\n\t\telse removeAttr(tcPr, 'anchorCtr')\n\t\tthis.part.markDirty()\n\t}\n\n\t/**\n\t * Set the cell's text insets in EMU (`a:tcPr/@marL`/`@marR`/`@marT`/`@marB`).\n\t *\n\t * Partial: only the sides named are touched, so `{ left: 0 }` flushes the text left and\n\t * leaves the other three alone. A side given as `null` has its attribute removed, which\n\t * returns it to the schema default (91440 EMU left/right, 45720 top/bottom) — not to\n\t * zero. Pass `{}` to change nothing.\n\t * @throws {InvalidOptionError} when a value is not a finite number\n\t */\n\tsetMarginsEmu(margins: {\n\t\tleft?: number | null\n\t\tright?: number | null\n\t\ttop?: number | null\n\t\tbottom?: number | null\n\t}): void {\n\t\tconst tcPr = this.#getOrAddTcPr()\n\t\tconst sides = [\n\t\t\t['marL', margins.left],\n\t\t\t['marR', margins.right],\n\t\t\t['marT', margins.top],\n\t\t\t['marB', margins.bottom],\n\t\t] as const\n\t\tfor (const [name, value] of sides) {\n\t\t\tif (value === undefined) continue\n\t\t\tif (value === null) removeAttr(tcPr, name)\n\t\t\telse setAttr(tcPr, name, String(checkFiniteEmu(value, name, 'table/invalid-cell-margin')))\n\t\t}\n\t\tthis.part.markDirty()\n\t}\n\n\t/**\n\t * Set (or clear) one of the cell's six borders — the four edges and the two diagonals.\n\t *\n\t * `null` removes the element entirely, which is \"inherit\", and is a different thing from\n\t * `{ noFill: true }`, which writes an explicit no-border and suppresses whatever would\n\t * otherwise be inherited. The element is inserted at its schema position rather than\n\t * appended: `CT_TableCellProperties` is a sequence, and an out-of-order `a:tcPr` is\n\t * reported by PowerPoint as a corrupt file rather than as a bad edit.\n\t *\n\t * Colour is either `color` (6-hex, `#` optional) or `schemeColor` (a theme token); giving\n\t * both prefers the token, matching how the read side reports them.\n\t * @throws {InvalidOptionError} when the width or colour cannot be written\n\t */\n\tsetBorder(edge: TableCellEdge, border: TableCellBorderEdit | null): void {\n\t\tconst qname = EDGE_QNAMES[edge]\n\t\tif (!qname) {\n\t\t\tthrow new InvalidOptionError(\n\t\t\t\t'table/invalid-cell-border',\n\t\t\t\t`Unknown table cell edge: ${JSON.stringify(edge)}. Expected one of: ${Object.keys(EDGE_QNAMES).join(', ')}.`\n\t\t\t)\n\t\t}\n\t\tif (border === null) {\n\t\t\tconst tcPr = this.#tcPr()\n\t\t\tif (!tcPr || !firstChild(tcPr, qname)) return\n\t\t\tremoveChildrenByQName(tcPr, [qname])\n\t\t\tthis.part.markDirty()\n\t\t\treturn\n\t\t}\n\n\t\tconst tcPr = this.#getOrAddTcPr()\n\t\t// Rebuilt rather than patched in place: a half-edited `a:ln` (say, a new colour left\n\t\t// beside a stale `a:noFill`) is a state neither the reader nor PowerPoint expects, and\n\t\t// the element is small enough that replacing it is simpler than reconciling it.\n\t\tremoveChildrenByQName(tcPr, [qname])\n\t\tconst doc = ownerDocumentOf(tcPr)\n\t\tconst ln = createElement(doc, qname)\n\t\tif (border.widthPt !== undefined && border.widthPt !== null) {\n\t\t\tsetAttr(ln, 'w', String(checkFiniteEmu(border.widthPt * EMU_PER_POINT, 'widthPt', 'table/invalid-cell-border')))\n\t\t}\n\t\tif (border.noFill) {\n\t\t\tln.appendChild(createElement(doc, 'a:noFill'))\n\t\t} else if (border.schemeColor || border.color) {\n\t\t\tconst fill = createElement(doc, 'a:solidFill')\n\t\t\tconst scheme = border.schemeColor\n\t\t\tconst clr = createElement(doc, scheme ? 'a:schemeClr' : 'a:srgbClr')\n\t\t\tsetAttr(clr, 'val', scheme ? scheme : normalizeHex(border.color as string))\n\t\t\tfill.appendChild(clr)\n\t\t\tln.appendChild(fill)\n\t\t}\n\t\t// `a:prstDash` follows the fill group in CT_LineProperties, so it is appended after.\n\t\tif (border.dash) {\n\t\t\tconst dash = createElement(doc, 'a:prstDash')\n\t\t\tsetAttr(dash, 'val', border.dash)\n\t\t\tln.appendChild(dash)\n\t\t}\n\t\tinsertTcPrChild(tcPr, qname, ln)\n\t\tthis.part.markDirty()\n\t}\n\n\t/**\n\t * Replace the cell's fill with a solid colour (`a:tcPr/a:solidFill`), or clear it.\n\t *\n\t * `null` removes the `a:solidFill` and lets the cell inherit from the table style again.\n\t * That is not the same as {@link noFill}, which writes an explicit `a:noFill` and so\n\t * suppresses the inherited shading. Any competing fill choice (`a:gradFill`,\n\t * `a:blipFill`, …) is dropped first — `EG_FillProperties` admits one.\n\t * @throws {InvalidOptionError} when `color` is not a 6-digit hex string\n\t */\n\tsetFillColor(color: string | null): void {\n\t\tthis.#setFill(color === null ? null : { qname: 'a:srgbClr', val: normalizeHex(color) })\n\t}\n\n\t/**\n\t * Replace the cell's fill with a theme colour token (`a:solidFill/a:schemeClr/@val`), or\n\t * clear it. Preferred over {@link setFillColor} when the deck's theme should keep\n\t * driving the colour.\n\t */\n\tsetFillSchemeColor(token: string | null): void {\n\t\tthis.#setFill(token === null ? null : { qname: 'a:schemeClr', val: token })\n\t}\n\n\t/**\n\t * Write an explicit `<a:noFill/>` on the cell — a transparent cell that shows the table\n\t * background (or the slide) through. Distinct from `setFillColor(null)`, which removes\n\t * the fill and lets the table style's shading apply again.\n\t */\n\tnoFill(): void {\n\t\tconst tcPr = this.#getOrAddTcPr()\n\t\tremoveChildrenByQName(tcPr, FILL_CHOICES)\n\t\ttcPrChild(tcPr, 'a:noFill')\n\t\tthis.part.markDirty()\n\t}\n\n\t/** Set or clear one `a:tcPr` attribute, vetting it against its schema enum first. */\n\t#setTcPrAttr(name: string, value: string | null, valid: readonly string[], code: InvalidOptionErrorCode): void {\n\t\tif (value === null) {\n\t\t\tconst tcPr = this.#tcPr()\n\t\t\tif (!tcPr) return\n\t\t\tremoveAttr(tcPr, name)\n\t\t\tthis.part.markDirty()\n\t\t\treturn\n\t\t}\n\t\tconst checked = checkEnum(value, valid, name, code)\n\t\tsetAttr(this.#getOrAddTcPr(), name, checked)\n\t\tthis.part.markDirty()\n\t}\n\n\t/** Replace (or remove) the cell's solid fill, keeping `EG_FillProperties` single-valued. */\n\t#setFill(color: { qname: string; val: string } | null): void {\n\t\tif (color === null) {\n\t\t\tconst tcPr = this.#tcPr()\n\t\t\tif (!tcPr || !firstChild(tcPr, 'a:solidFill')) return\n\t\t\tremoveChildrenByQName(tcPr, ['a:solidFill'])\n\t\t\tthis.part.markDirty()\n\t\t\treturn\n\t\t}\n\t\tsetSolidFill(this.#getOrAddTcPr(), TCPR_AFTER['a:solidFill'] ?? [], color)\n\t\tthis.part.markDirty()\n\t}\n\n\t/**\n\t * The cell's solid fill resolved against the table's theme colour context to a\n\t * literal hex — the table-cell counterpart of\n\t * {@link import('./shapes.js').AutoShape.resolvedFill}. The cell's own\n\t * `a:tcPr/a:solidFill` wins; when the cell defines none, this falls back to the\n\t * table **style** graph (the `firstRow`/banded/`wholeTbl` shading the\n\t * `a:tableStyleId` supplies — see {@link Table.resolvedStyle}), so a styled cell\n\t * with an empty `a:tcPr` reports the colour PowerPoint actually renders rather\n\t * than `null`.\n\t *\n\t * A cell that carries *some other* fill choice (`a:blipFill`/`a:gradFill`/\n\t * `a:pattFill`/`a:noFill`) overrides the style graph in PowerPoint, so this\n\t * reports `null` for one rather than falling through to the inherited shading —\n\t * the same guard {@link import('./shapes.js').AutoShape.resolvedFill} applies to\n\t * the style matrix. Read {@link pictureFill} for an image-filled cell. Also\n\t * `null` with no theme context, or when neither source yields a solid colour (an\n\t * unmapped token, an explicit style `a:noFill`). The returned\n\t * {@link ResolvedColor} carries `effectiveHex` (the base colour with its\n\t * `lumMod`/`lumOff`/… transforms applied) — read that for the final colour.\n\t */\n\tget resolvedFill(): ResolvedColor | null {\n\t\tif (!this.themeColors) return null\n\t\tif (this.hasOwnFill) return resolveSolidFillColor(this.#tcPr(), this.themeColors)\n\t\treturn this.style ? this.#styleFill() : null\n\t}\n\n\t/**\n\t * Whether the cell carries a fill of its **own** (`a:tcPr` holds an `EG_FillProperties`\n\t * child), as opposed to inheriting one from the table style's header/banding rules.\n\t *\n\t * This is the flag that disambiguates {@link resolvedFill}, which deliberately reports\n\t * either — it answers \"what colour does this cell render as\", and both sources are valid\n\t * answers to that. Anything that has to reproduce the cell rather than describe it needs\n\t * to know which: baking an inherited banding colour into a copy makes the copy look right\n\t * until someone changes its table style, and then nothing moves. `false` for a cell whose\n\t * `a:tcPr` is empty or absent, whatever the style graph would render it as.\n\t */\n\tget hasOwnFill(): boolean {\n\t\tconst tcPr = this.#tcPr()\n\t\treturn !!tcPr && FILL_CHOICES.some((q) => firstChild(tcPr, q))\n\t}\n\n\t/**\n\t * `true` when the cell sets an explicit no-fill (`a:tcPr/a:noFill`) — a deliberately\n\t * transparent cell showing the table background (or the slide) through. The cell-side\n\t * counterpart of {@link import('./shapes.js').AutoShape.fillNoFill}, and what\n\t * {@link noFill} writes.\n\t *\n\t * {@link hasOwnFill} is not this question: it is `true` for *any* `EG_FillProperties`\n\t * child, so on its own it cannot separate a suppressed fill from a gradient or an image\n\t * one — and every colour accessor ({@link resolvedFill}, {@link fillColor},\n\t * {@link fillSchemeColor}) reports `null` for a no-fill cell exactly as it does for a\n\t * cell that inherits its shading from the table style. Deriving it as \"has a fill of its\n\t * own, and no accessor recognises it\" instead of reading it has two failure modes: it\n\t * folds `a:grpFill` in with `a:noFill`, and its meaning changes silently the day a\n\t * further fill kind gets an accessor. The two paint completely differently — an\n\t * inherited banding colour versus nothing at all — so a consumer that cannot tell them\n\t * apart paints a transparent cell in the style's shading.\n\t */\n\tget fillNoFill(): boolean {\n\t\tconst tcPr = this.#tcPr()\n\t\treturn !!tcPr && !!firstChild(tcPr, 'a:noFill')\n\t}\n\n\t/**\n\t * The cell's picture (image) fill (`a:tcPr/a:blipFill`), or `null` when the cell\n\t * is not image-filled. The cell counterpart of\n\t * {@link import('./shapes.js').AutoShape.pictureFill}: {@link resolvedFill}\n\t * decodes only solid colours, so without this an image-filled cell is\n\t * indistinguishable from an empty one. Carries the embedded image\n\t * ({@link PictureFill.relId}/{@link PictureFill.partName}) plus the stretch/tile\n\t * geometry; {@link PictureFill.partName} needs the owning slide's relationships,\n\t * which a {@link Table} built without them cannot supply.\n\t */\n\tget pictureFill(): PictureFill | null {\n\t\tconst tcPr = this.#tcPr()\n\t\treturn tcPr ? readPictureFill(tcPr, this.rels ?? null) : null\n\t}\n\n\t/** The fill this cell inherits from the table style graph, or `null` when the style defines none for it. */\n\t#styleFill(): ResolvedColor | null {\n\t\tconst s = this.style\n\t\tif (!s) return null\n\t\treturn resolveTableCellStyleFill(\n\t\t\ts.style.element_,\n\t\t\ts.flags,\n\t\t\tthis.rowIndex,\n\t\t\tthis.colIndex,\n\t\t\ts.rowCount,\n\t\t\ts.colCount,\n\t\t\ts.ctx\n\t\t)\n\t}\n\n\t/**\n\t * The cell's gradient fill (`a:tcPr/a:gradFill`), or `null` when the cell is not\n\t * gradient-filled. The cell twin of {@link Table.gradientFill}, and needed for the same\n\t * reason {@link pictureFill} is: {@link resolvedFill} reports `null` for every non-solid\n\t * choice, so without this a gradient cell is indistinguishable from an unfilled one.\n\t */\n\tget gradientFill(): GradientFill | null {\n\t\tconst tcPr = this.#tcPr()\n\t\treturn tcPr && this.themeColors ? readGradientFill(tcPr, this.themeColors) : null\n\t}\n\n\t/**\n\t * The cell's pattern (hatch) fill (`a:tcPr/a:pattFill`), or `null` when the cell is not\n\t * pattern-filled.\n\t */\n\tget patternFill(): PatternFill | null {\n\t\tconst tcPr = this.#tcPr()\n\t\treturn tcPr && this.themeColors ? readPatternFill(tcPr, this.themeColors) : null\n\t}\n\n\t/**\n\t * The raw `schemeClr` token of the cell's solid fill (`a:tcPr/a:solidFill/a:schemeClr/@val`),\n\t * e.g. `accent1`/`bg1`, or `null` when the fill is absent or an explicit `srgbClr`.\n\t * The resolved literal is {@link resolvedFill}; this is the unresolved reference.\n\t */\n\tget fillSchemeColor(): string | null {\n\t\treturn this.#fillSchemeColorOf(this.#tcPr() ?? this.tc)\n\t}\n\n\t/**\n\t * The cell's edge borders (`a:tcPr/a:lnL|lnR|lnT|lnB|lnTlToBr|lnBlToTr`), or\n\t * `null` when the cell defines none. Each present edge decodes to a\n\t * {@link CellBorder} (width / dash / resolved colour + its raw token and transform\n\t * list / suppressed flag);\n\t * absent edges are `null`. Cell borders are the biggest visible table gap — a\n\t * replica built only from geometry and fill draws every cell edge-to-edge with\n\t * no rule, so this surfaces the per-side stroke the writer's `border` option emits.\n\t */\n\tget borders(): CellBorders | null {\n\t\tconst tcPr = this.#tcPr()\n\t\tif (!tcPr) return null\n\t\tconst decode = (qname: string): CellBorder | null => {\n\t\t\tconst ln = firstChild(tcPr, qname)\n\t\t\tif (!ln) return null\n\t\t\tconst w = intValue(attr(ln, 'w'))\n\t\t\tconst dash = firstChild(ln, 'a:prstDash')\n\t\t\tconst scheme = this.#fillSchemeColorOf(ln)\n\t\t\tconst resolved = this.themeColors ? resolveSolidFillColor(ln, this.themeColors) : null\n\t\t\treturn {\n\t\t\t\twidthPt: w === null ? null : w / EMU_PER_POINT,\n\t\t\t\tdash: dash ? (attr(dash, 'val') ?? null) : null,\n\t\t\t\tresolvedColor: resolved,\n\t\t\t\tcolor: resolved ? resolved.effectiveHex : null,\n\t\t\t\tschemeColor: scheme,\n\t\t\t\tnoFill: !!firstChild(ln, 'a:noFill'),\n\t\t\t}\n\t\t}\n\t\tconst borders: CellBorders = {\n\t\t\tleft: decode('a:lnL'),\n\t\t\tright: decode('a:lnR'),\n\t\t\ttop: decode('a:lnT'),\n\t\t\tbottom: decode('a:lnB'),\n\t\t\ttlToBr: decode('a:lnTlToBr'),\n\t\t\tblToTr: decode('a:lnBlToTr'),\n\t\t}\n\t\treturn Object.values(borders).some((b) => b !== null) ? borders : null\n\t}\n\n\t/** The `schemeClr` token of a container's solid fill (`a:solidFill/a:schemeClr/@val`), or `null`. */\n\t#fillSchemeColorOf(container: Element): string | null {\n\t\tconst fill = firstChild(container, 'a:solidFill')\n\t\tconst scheme = fill && firstChild(fill, 'a:schemeClr')\n\t\treturn scheme ? attr(scheme, 'val') : null\n\t}\n\n\t/**\n\t * The cell's text direction (`a:tcPr/@vert`), e.g. `vert270` for a bottom-to-top\n\t * vertical label, or `null` for default horizontal text.\n\t */\n\tget verticalText(): string | null {\n\t\tconst tcPr = this.#tcPr()\n\t\treturn (tcPr && attr(tcPr, 'vert')) ?? null\n\t}\n\n\t/**\n\t * The cell's vertical text anchor (`a:tcPr/@anchor`): `t`/`ctr`/`b` (top/middle/\n\t * bottom), or `null` when unset (PowerPoint defaults to top).\n\t */\n\tget anchor(): string | null {\n\t\tconst tcPr = this.#tcPr()\n\t\treturn (tcPr && attr(tcPr, 'anchor')) ?? null\n\t}\n\n\t/**\n\t * Whether the cell's whole text **block** is centred horizontally within it\n\t * (`a:tcPr/@anchorCtr`). `false` when unset — that is the schema default, and it is\n\t * what PowerPoint writes nothing for.\n\t *\n\t * Distinct from a paragraph's `align`, which decides where each *line* sits inside the\n\t * text block; this decides where the block sits inside the cell.\n\t */\n\tget anchorCtr(): boolean {\n\t\tconst tcPr = this.#tcPr()\n\t\treturn tcPr ? attr(tcPr, 'anchorCtr') === '1' || attr(tcPr, 'anchorCtr') === 'true' : false\n\t}\n\n\t/**\n\t * The cell's 3-D bevel (`a:tcPr/a:cell3D`), or `null` when it has none.\n\t *\n\t * `CT_Cell3D` requires an `a:bevel`, so a present `cell3D` always reports a bevel;\n\t * `lightRig` is `null` when the cell leaves the scene lighting to the renderer. Sizes are\n\t * reported in **points** (the attributes are EMU), matching how the write option takes them.\n\t */\n\tget cell3D(): CellThreeD | null {\n\t\tconst tcPr = this.#tcPr()\n\t\tconst cell3D = tcPr && firstChild(tcPr, 'a:cell3D')\n\t\tif (!cell3D) return null\n\t\tconst bevel = firstChild(cell3D, 'a:bevel')\n\t\tconst rig = firstChild(cell3D, 'a:lightRig')\n\t\tconst pts = (value: string | null): number | null => {\n\t\t\tconst emu = intValue(value)\n\t\t\treturn emu === null ? null : emu / EMU_PER_POINT\n\t\t}\n\t\treturn {\n\t\t\tmaterial: attr(cell3D, 'prstMaterial') ?? null,\n\t\t\tbevel: {\n\t\t\t\tpreset: bevel ? (attr(bevel, 'prst') ?? null) : null,\n\t\t\t\twidthPt: bevel ? pts(attr(bevel, 'w')) : null,\n\t\t\t\theightPt: bevel ? pts(attr(bevel, 'h')) : null,\n\t\t\t},\n\t\t\tlightRig: rig ? { rig: attr(rig, 'rig') ?? null, dir: attr(rig, 'dir') ?? null } : null,\n\t\t}\n\t}\n\n\t/**\n\t * The cell's unique identifier (`a:tc/@id`), or `null` when it has none.\n\t *\n\t * This is what {@link headerIds} references: a data cell names the header cells that\n\t * govern it by their `@id`, which is how a complex table tells a screen reader what a\n\t * value means. Unrelated to the shape-level `p:cNvPr/@id` — it is an `xs:string` scoped\n\t * to the table, not a slide-wide numeric id.\n\t *\n\t * **PowerPoint does not write this and strips it on save**, so it will read `null` on\n\t * any deck PowerPoint has saved, however it was produced. It is surfaced for decks from\n\t * other producers. There is deliberately no write-API counterpart — see\n\t * `test/read/fixtures/authoring/probe-table-cell-a11y-and-3d.ps1` for the measurement.\n\t */\n\tget id(): string | null {\n\t\treturn attr(this.tc, 'id') ?? null\n\t}\n\n\t/**\n\t * The `@id`s of the header cells that govern this cell\n\t * (`a:tcPr/a:headers/a:header/@val`), in document order. Empty when the cell declares no\n\t * header association — which is the common case, since only a complex table needs one.\n\t *\n\t * Carries the same caveat as {@link id}: PowerPoint strips `a:headers` on save, so this\n\t * is empty on any PowerPoint-saved deck. `Table.firstRowHeader` (`a:tblPr/@firstRow`) is\n\t * the header marker PowerPoint does keep.\n\t */\n\tget headerIds(): string[] {\n\t\tconst tcPr = this.#tcPr()\n\t\tconst headers = tcPr && firstChild(tcPr, 'a:headers')\n\t\tif (!headers) return []\n\t\treturn getElements(headers, 'a:header')\n\t\t\t.map((header) => attr(header, 'val'))\n\t\t\t.filter((val): val is string => val !== null && val !== '')\n\t}\n\n\t/**\n\t * How the cell treats a glyph too wide for its text width (`a:tcPr/@horzOverflow`):\n\t * `'clip'` cuts it at the cell edge, `'overflow'` lets it draw past. `null` when unset\n\t * (PowerPoint clips). Not a wrap flag — cell text always wraps to the column width.\n\t */\n\tget horzOverflow(): string | null {\n\t\tconst tcPr = this.#tcPr()\n\t\treturn (tcPr && attr(tcPr, 'horzOverflow')) ?? null\n\t}\n\n\t/**\n\t * The cell's text insets in EMU (`a:tcPr/@marL`/`@marR`/`@marT`/`@marB`), or\n\t * `null` when the cell sets none. Each side is `null` when only some are set.\n\t */\n\tget marginsEmu(): { left: number | null; right: number | null; top: number | null; bottom: number | null } | null {\n\t\tconst tcPr = this.#tcPr()\n\t\tif (!tcPr) return null\n\t\tconst left = intValue(attr(tcPr, 'marL'))\n\t\tconst right = intValue(attr(tcPr, 'marR'))\n\t\tconst top = intValue(attr(tcPr, 'marT'))\n\t\tconst bottom = intValue(attr(tcPr, 'marB'))\n\t\tif (left === null && right === null && top === null && bottom === null) return null\n\t\treturn { left, right, top, bottom }\n\t}\n\n\t/** Number of grid columns this cell spans (`a:tc/@gridSpan`), default 1. */\n\tget gridSpan(): number {\n\t\treturn intValue(attr(this.tc, 'gridSpan')) ?? 1\n\t}\n\n\t/** Number of rows this cell spans (`a:tc/@rowSpan`), default 1. */\n\tget rowSpan(): number {\n\t\treturn intValue(attr(this.tc, 'rowSpan')) ?? 1\n\t}\n\n\t/** Whether this cell is a continuation of a merge (`@hMerge` or `@vMerge`), i.e. not the merge origin. */\n\tget isMergeContinuation(): boolean {\n\t\treturn attr(this.tc, 'hMerge') === '1' || attr(this.tc, 'vMerge') === '1'\n\t}\n\n\t/** Escape hatch: the underlying `a:tc` element. After mutating it call {@link markDirty}, or `save()` writes the original bytes. */\n\tget element_(): Element {\n\t\treturn this.tc\n\t}\n\n\t/** Mark the owning part dirty so `save()` reserializes it. Call after mutating {@link element_}. */\n\tmarkDirty(): void {\n\t\tthis.part.markDirty()\n\t}\n}\n","/**\n * A graphic frame (`p:graphicFrame`) — the host element for a table, a chart, a chartEx\n * chart, or a SmartArt diagram.\n *\n * Which one it holds is told by the `a:graphicData/@uri`, so the accessors below each check\n * that URI before wrapping the payload. {@link GraphicFrame.graphicDataUri} reports it raw,\n * which is the only signal for the frames this library still does not model (OLE, ink):\n * without it a consumer cannot tell \"this frame holds content I cannot reach\" from \"this\n * frame holds a chart with nothing in it\", since every predicate answers `false` for both.\n */\n\nimport { attr, firstChild, getOrAddChild, type Element } from '../../oxml/dom.js'\nimport { Chart } from '../chart.js'\nimport { ChartEx } from '../chartex.js'\nimport { Diagram } from '../diagram.js'\nimport { Table } from '../table.js'\nimport { Shape } from './base.js'\nimport type { ShapeProperties } from './oxml.js'\nimport { UnsupportedFeatureError } from '../../../errors.js'\n\nconst A_TABLE_URI = 'http://schemas.openxmlformats.org/drawingml/2006/table'\nconst A_CHART_URI = 'http://schemas.openxmlformats.org/drawingml/2006/chart'\n// chartEx (Office-2016 chart family) graphicData URI + `cx:chart` reference child namespace.\nconst A_CHARTEX_URI = 'http://schemas.microsoft.com/office/drawing/2014/chartex'\n// SmartArt: the DrawingML diagram namespace, whose payload is a `dgm:relIds` reference.\nconst A_DIAGRAM_URI = 'http://schemas.openxmlformats.org/drawingml/2006/diagram'\n\n/** A graphic frame (`p:graphicFrame`) — host for tables, charts and SmartArt diagrams. */\nexport class GraphicFrame extends Shape {\n\treadonly shapeType = 'graphicFrame' as const\n\n\tprotected override xfrm(): Element | null {\n\t\t// graphicFrame carries its own `p:xfrm` directly, not inside `p:spPr`.\n\t\treturn firstChild(this.element, 'p:xfrm')\n\t}\n\n\tprotected override getOrAddXfrm(): Element {\n\t\t// p:xfrm sits between p:nvGraphicFramePr and a:graphic.\n\t\treturn getOrAddChild(this.element, 'p:xfrm', ['a:graphic', 'p:extLst'])\n\t}\n\n\t// A graphicFrame has no p:spPr; its hosted table/chart carries its own fill\n\t// model. There is nothing to get-or-add, so fill and line setters reject it.\n\tprotected override getOrAddProperties(): ShapeProperties {\n\t\tthrow new UnsupportedFeatureError(\n\t\t\t'shape/shape-properties-unsupported',\n\t\t\t'graphicFrame shapes have no shape properties; fill and line colours are not supported'\n\t\t)\n\t}\n\n\t/** Whether this frame hosts a table (`a:graphicData/@uri` is the table URI). */\n\tget hasTable(): boolean {\n\t\treturn this.#graphicDataUri() === A_TABLE_URI\n\t}\n\n\t/** Whether this frame hosts a classic chart (`a:graphicData/@uri` is the chart URI). */\n\tget hasChart(): boolean {\n\t\treturn this.#graphicDataUri() === A_CHART_URI\n\t}\n\n\t/** Whether this frame hosts a chartEx chart (`a:graphicData/@uri` is the chartEx URI). */\n\tget hasChartEx(): boolean {\n\t\treturn this.#graphicDataUri() === A_CHARTEX_URI\n\t}\n\n\t/** Whether this frame hosts a SmartArt diagram (`a:graphicData/@uri` is the diagram URI). */\n\tget hasDiagram(): boolean {\n\t\treturn this.#graphicDataUri() === A_DIAGRAM_URI\n\t}\n\n\t/**\n\t * The `a:graphicData/@uri` verbatim — the namespace naming what this frame hosts, or\n\t * `null` when the frame carries no `a:graphicData`.\n\t *\n\t * Every `has*` predicate is a comparison against this, so a frame whose URI matches none\n\t * of them is one the read model does not decode (an OLE object, an ink `p:contentPart`).\n\t * Reading the URI is what lets a consumer say *which* construct it could not reach\n\t * instead of inferring loss from four `false`s.\n\t */\n\tget graphicDataUri(): string | null {\n\t\treturn this.#graphicDataUri()\n\t}\n\n\t/** The hosted table, or `null` when this frame is not a table. */\n\tget table(): Table | null {\n\t\tif (!this.hasTable) return null\n\t\tconst graphicData = this.#graphicData()\n\t\tconst tbl = graphicData && firstChild(graphicData, 'a:tbl')\n\t\tif (!tbl) return null\n\t\treturn new Table(tbl, this.host.part, this.host.themeContext(), this.host.opc, this.host.relationships)\n\t}\n\n\t/** The hosted chart, or `null` when this frame is not a chart or its part is missing. */\n\tget chart(): Chart | null {\n\t\tif (!this.hasChart) return null\n\t\tconst graphicData = this.#graphicData()\n\t\tconst chartRef = graphicData && firstChild(graphicData, 'c:chart')\n\t\tconst relId = chartRef && attr(chartRef, 'r:id')\n\t\tif (!relId) return null\n\t\tconst partName = this.host.relationships.resolveTarget(relId)\n\t\tconst part = this.host.opc.part(partName)\n\t\treturn part ? new Chart(part) : null\n\t}\n\n\t/**\n\t * The hosted chartEx chart (waterfall/funnel/treemap/…), or `null` when this\n\t * frame is not a chartEx chart or its part is missing. The reference child is\n\t * `cx:chart` (not the classic `c:chart`), carrying the MS `chartEx` rel id.\n\t */\n\tget chartEx(): ChartEx | null {\n\t\tif (!this.hasChartEx) return null\n\t\tconst graphicData = this.#graphicData()\n\t\tconst chartRef = graphicData && firstChild(graphicData, 'cx:chart')\n\t\tconst relId = chartRef && attr(chartRef, 'r:id')\n\t\tif (!relId) return null\n\t\tconst partName = this.host.relationships.resolveTarget(relId)\n\t\tconst part = this.host.opc.part(partName)\n\t\treturn part ? new ChartEx(part) : null\n\t}\n\n\t/**\n\t * The hosted SmartArt diagram, or `null` when this frame is not a diagram or its data\n\t * part is missing. The payload child is `dgm:relIds`, which names four parts by\n\t * relationship id; the `@r:dm` one is the data model this resolves.\n\t */\n\tget diagram(): Diagram | null {\n\t\tif (!this.hasDiagram) return null\n\t\tconst graphicData = this.#graphicData()\n\t\tconst relIds = graphicData && firstChild(graphicData, 'dgm:relIds')\n\t\tif (!relIds) return null\n\t\tconst relId = attr(relIds, 'r:dm')\n\t\tif (!relId) return null\n\t\tconst partName = this.host.relationships.resolveTarget(relId)\n\t\tconst part = this.host.opc.part(partName)\n\t\treturn part ? new Diagram(part, relIds, this.host.opc, this.host.relationships, this.host.themeContext()) : null\n\t}\n\n\t#graphicData(): Element | null {\n\t\tconst graphic = firstChild(this.element, 'a:graphic')\n\t\treturn graphic ? firstChild(graphic, 'a:graphicData') : null\n\t}\n\n\t#graphicDataUri(): string | null {\n\t\tconst graphicData = this.#graphicData()\n\t\treturn graphicData ? attr(graphicData, 'uri') : null\n\t}\n}\n","/**\n * Read-model proxies for the shapes in a `p:spTree`.\n *\n * The `p:spTree` holds five shape kinds; each wraps its element and exposes\n * non-visual identity (id/name), geometry (left/top/width/height in EMU), and\n * kind-specific reads. Proxies hold a back-reference to the owning\n * {@link ShapeHost} — the slide, layout, or master whose part carries the tree —\n * so pictures can resolve their image relationship and so edits can mark that\n * part dirty.\n *\n * This module is the entry point for that model: the `Shape` base and the four leaf kinds live in\n * `./shapes/`, and only the dispatch that turns an element into a proxy — plus `GroupShape`, which\n * recurses back through it — is here. Everything the read API surfaces is re-exported below, so\n * `ts-pptx/read` and its consumers keep importing shapes from one place.\n */\nimport { ELEMENT_NODE, OOXML_NS, firstChild, getElements, getOrAddChild, type Element } from '../oxml/dom.js'\nimport { GRPSPPR_AFTER_XFRM, GRPSPPR_FILL_AFTER, type ShapeProperties } from './shapes/oxml.js'\nimport { readBox } from './shapes/geometry.js'\nimport type { ChildFrame } from './shapes/types.js'\nimport { Shape } from './shapes/base.js'\nimport { AutoShape } from './shapes/autoshape.js'\nimport { Picture } from './shapes/picture.js'\nimport { Connector } from './shapes/connector.js'\nimport { GraphicFrame } from './shapes/graphic-frame.js'\nimport type { ShapeHost } from './shapes/host.js'\n\nexport { Shape } from './shapes/base.js'\nexport type { ShapeHost } from './shapes/host.js'\nexport { AutoShape } from './shapes/autoshape.js'\nexport { Picture } from './shapes/picture.js'\nexport { Connector } from './shapes/connector.js'\nexport { GraphicFrame } from './shapes/graphic-frame.js'\n\n// Re-exported so `ts-pptx/read` keeps surfacing the gradient types from here even\n// though their definitions moved to ./gradient.js (shared with the slide-background reader).\nexport type { GradientStop, GradientFill } from './gradient.js'\nexport type { PictureFill, PictureFillTile, FillRect } from './picture-fill.js'\n// Likewise for the shape value types, whose definitions live in ./shapes/types.js.\nexport type {\n\tAbsoluteFrame,\n\tChildFrame,\n\tConnectionSite,\n\tCustomGeometry,\n\tCustomGeometryPath,\n\tGeometryCommand,\n\tGlow,\n\tInnerShadow,\n\tLineEnd,\n\tLineEnds,\n\tOuterShadow,\n\tPatternFill,\n\tRecolor,\n\tRecolorColor,\n\tReflection,\n\tShapeType,\n\tSoftEdge,\n} from './shapes/types.js'\n\n/**\n * A group shape (`p:grpSp`) — contains nested shapes.\n *\n * It is the one kind defined here rather than under `./shapes/`: its `shapes` getter recurses\n * through `buildShapes` below, so putting it in a sibling module would make the dispatch and the\n * group import each other.\n */\nexport class GroupShape extends Shape {\n\treadonly shapeType = 'group' as const\n\n\tprotected override xfrm(): Element | null {\n\t\tconst grpSpPr = firstChild(this.element, 'p:grpSpPr')\n\t\treturn grpSpPr ? firstChild(grpSpPr, 'a:xfrm') : null\n\t}\n\n\tprotected override getOrAddXfrm(): Element {\n\t\treturn getOrAddChild(this.#getOrAddGrpSpPr(), 'a:xfrm', GRPSPPR_AFTER_XFRM)\n\t}\n\n\tprotected override properties(): Element | null {\n\t\treturn firstChild(this.element, 'p:grpSpPr')\n\t}\n\n\t// A group's fill lives in p:grpSpPr, which has no a:ln (no line colour).\n\tprotected override getOrAddProperties(): ShapeProperties {\n\t\treturn { props: this.#getOrAddGrpSpPr(), fillAfter: GRPSPPR_FILL_AFTER, lnAfter: null }\n\t}\n\n\t#getOrAddGrpSpPr(): Element {\n\t\treturn getOrAddChild(this.element, 'p:grpSpPr', ['p:sp', 'p:grpSp', 'p:pic', 'p:cxnSp', 'p:graphicFrame'])\n\t}\n\n\t/**\n\t * The group's own child coordinate space (`p:grpSpPr/a:xfrm/a:chOff` and\n\t * `a:chExt`) in EMU, or `null` when the group has no transform or either\n\t * element is incomplete.\n\t *\n\t * Most consumers should not need this: {@link Shape.absoluteFrame} already\n\t * composes the whole ancestor chain — child space, group flips and rotations —\n\t * and doing that arithmetic per consumer is how a shape in a nested group ends\n\t * up subtly displaced. It is here for a *replica* consumer rather than a\n\t * *paint* one: rebuilding this group and its children as OOXML needs the\n\t * source child space to reproduce the scaling, and without it only groups whose\n\t * child space is the identity can be rebuilt.\n\t */\n\tget childFrame(): ChildFrame | null {\n\t\tconst xfrm = this.xfrm()\n\t\tconst box = xfrm && readBox(xfrm, 'a:chOff', 'a:chExt')\n\t\tif (!box) return null\n\t\treturn { offsetX: box.x, offsetY: box.y, extentX: box.cx, extentY: box.cy }\n\t}\n\n\t/** The shapes nested directly inside this group, in document order. */\n\tget shapes(): AnyShape[] {\n\t\treturn buildShapes(this.element, this.host)\n\t}\n}\n\n/**\n * The concrete shape kinds as a discriminated union keyed on the\n * {@link Shape.shapeType} literal. The read API (`Slide.shapes`,\n * `Slide.shapeById`, `GroupShape.shapes`, `Presentation.importShape`, …) returns\n * this rather than the abstract {@link Shape} base, so a consumer can narrow to a\n * subtype by its discriminant and reach the subtype-only members — e.g.\n * `if (shape.shapeType === 'graphicFrame') shape.chart` or, equivalently, the\n * {@link isGraphicFrame} guard. The abstract {@link Shape} base is still exported\n * for the \"common members only\" case and for `instanceof` checks.\n */\nexport type AnyShape = AutoShape | Picture | Connector | GraphicFrame | GroupShape\n\n/** Narrow a shape to an {@link AutoShape} (`p:sp` — auto shape, text box, or placeholder). */\nexport function isAutoShape(shape: Shape): shape is AutoShape {\n\treturn shape.shapeType === 'autoShape'\n}\n\n/** Narrow a shape to a {@link Picture} (`p:pic`). */\nexport function isPicture(shape: Shape): shape is Picture {\n\treturn shape.shapeType === 'picture'\n}\n\n/** Narrow a shape to a {@link Connector} (`p:cxnSp`). */\nexport function isConnector(shape: Shape): shape is Connector {\n\treturn shape.shapeType === 'connector'\n}\n\n/** Narrow a shape to a {@link GraphicFrame} (`p:graphicFrame` — table/chart host). */\nexport function isGraphicFrame(shape: Shape): shape is GraphicFrame {\n\treturn shape.shapeType === 'graphicFrame'\n}\n\n/** Narrow a shape to a {@link GroupShape} (`p:grpSp`). */\nexport function isGroupShape(shape: Shape): shape is GroupShape {\n\treturn shape.shapeType === 'group'\n}\n\n/**\n * Wrap a single shape-tree element (`p:sp`/`p:pic`/`p:cxnSp`/`p:graphicFrame`/\n * `p:grpSp`) in its concrete `Shape` proxy, or `null` if it is not a shape kind\n * (e.g. `p:nvGrpSpPr`, `p:grpSpPr`, `p:extLst`).\n */\nexport function wrapShapeElement(element: Element, host: ShapeHost): AnyShape | null {\n\tif (element.namespaceURI !== OOXML_NS.p) return null\n\tswitch (element.localName) {\n\t\tcase 'sp':\n\t\t\treturn new AutoShape(element, host)\n\t\tcase 'pic':\n\t\t\treturn new Picture(element, host)\n\t\tcase 'cxnSp':\n\t\t\treturn new Connector(element, host)\n\t\tcase 'graphicFrame':\n\t\t\treturn new GraphicFrame(element, host)\n\t\tcase 'grpSp':\n\t\t\treturn new GroupShape(element, host)\n\t\tdefault:\n\t\t\treturn null\n\t}\n}\n\n/**\n * The richer of an `mc:AlternateContent`'s two branches: the first `mc:Choice`\n * that carries a shape element (what PowerPoint renders when it understands the\n * required feature), falling back to `mc:Fallback`. PowerPoint wraps a shape this\n * way when its full form needs a feature namespace a plain consumer lacks — a\n * chartEx chart's `p:graphicFrame`, a zoom frame, an inline-math shape. Returns\n * the wrapped inner shape, or `null` when neither branch holds one.\n */\nfunction unwrapAlternateContent(altContent: Element, host: ShapeHost): AnyShape | null {\n\tconst branches = [...getElements(altContent, 'mc:Choice'), ...getElements(altContent, 'mc:Fallback')]\n\tfor (const branch of branches) {\n\t\tfor (let node = branch.firstChild; node; node = node.nextSibling) {\n\t\t\tif (node.nodeType !== ELEMENT_NODE) continue\n\t\t\tconst shape = wrapShapeElement(node as Element, host)\n\t\t\tif (shape) return shape\n\t\t}\n\t}\n\treturn null\n}\n\n/**\n * Build shape proxies for the shape-tree children of `parent` (a `p:spTree` or\n * `p:grpSp`), skipping non-shape children (`p:nvGrpSpPr`, `p:grpSpPr`, …). An\n * `mc:AlternateContent` wrapper (chartEx charts, zoom frames, inline math) is\n * unwrapped to the shape inside its preferred branch.\n */\nexport function buildShapes(parent: Element, host: ShapeHost): AnyShape[] {\n\tconst shapes: AnyShape[] = []\n\tfor (let node = parent.firstChild; node; node = node.nextSibling) {\n\t\tif (node.nodeType !== ELEMENT_NODE) continue\n\t\tconst element = node as Element\n\t\tif (element.namespaceURI === OOXML_NS.mc && element.localName === 'AlternateContent') {\n\t\t\tconst unwrapped = unwrapAlternateContent(element, host)\n\t\t\tif (unwrapped) shapes.push(unwrapped)\n\t\t\tcontinue\n\t\t}\n\t\tconst shape = wrapShapeElement(element, host)\n\t\tif (shape) shapes.push(shape)\n\t}\n\treturn shapes\n}\n\n/**\n * The first shape in `shapes` with the given drawing id (`p:cNvPr/@id`), walked\n * pre-order so a group is visited before its children. Backs\n * {@link ShapeHost.shapeByIdDeep} on all three hosts — drawing ids are unique\n * within a part, so the first match is the only match and the walk order just\n * fixes a deterministic one.\n */\nexport function findShapeByIdDeep(shapes: AnyShape[], id: number): AnyShape | undefined {\n\tfor (const shape of shapes) {\n\t\tif (shape.id === id) return shape\n\t\tif (shape instanceof GroupShape) {\n\t\t\tconst found = findShapeByIdDeep(shape.shapes, id)\n\t\t\tif (found) return found\n\t\t}\n\t}\n\treturn undefined\n}\n"],"mappings":"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"}
|