@office-open/core 0.10.15 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +2 -1
  2. package/dist/chart/index.d.mts +2 -2
  3. package/dist/chart/index.mjs +2 -2
  4. package/dist/chart-Kf_utasF.mjs +1780 -0
  5. package/dist/chart-Kf_utasF.mjs.map +1 -0
  6. package/dist/color-mapping-CFF0vRSe.mjs +117 -0
  7. package/dist/color-mapping-CFF0vRSe.mjs.map +1 -0
  8. package/dist/descriptor/index.d.mts +2 -2
  9. package/dist/descriptor/index.mjs +1 -1
  10. package/dist/{descriptor-BjNkn5jo.mjs → descriptor-BX8xW8na.mjs} +6 -2
  11. package/dist/{descriptor-BjNkn5jo.mjs.map → descriptor-BX8xW8na.mjs.map} +1 -1
  12. package/dist/drawing/index.d.mts +2 -0
  13. package/dist/drawing/index.mjs +2 -0
  14. package/dist/{drawingml-sj1J3lb0.mjs → drawing-FBzd2I0m.mjs} +2596 -1518
  15. package/dist/drawing-FBzd2I0m.mjs.map +1 -0
  16. package/dist/{converters-C_Y2QX1w.mjs → generators-CElPsAhd.mjs} +699 -258
  17. package/dist/generators-CElPsAhd.mjs.map +1 -0
  18. package/dist/index-BsTUn4K1.d.mts +28 -0
  19. package/dist/index-BsTUn4K1.d.mts.map +1 -0
  20. package/dist/index-C0ClOhmZ.d.mts +869 -0
  21. package/dist/index-C0ClOhmZ.d.mts.map +1 -0
  22. package/dist/{index-BVK2dv6C.d.mts → index-CLX7gU9J.d.mts} +8 -3
  23. package/dist/index-CLX7gU9J.d.mts.map +1 -0
  24. package/dist/index-Cgz88FU0.d.mts +308 -0
  25. package/dist/index-Cgz88FU0.d.mts.map +1 -0
  26. package/dist/{index-CE53SwpZ.d.mts → index-CnjCK-lF.d.mts} +497 -351
  27. package/dist/index-CnjCK-lF.d.mts.map +1 -0
  28. package/dist/{index-BfHfKuKy.d.mts → index-DpPeyf5f.d.mts} +61 -20
  29. package/dist/index-DpPeyf5f.d.mts.map +1 -0
  30. package/dist/index-DxwLMnBF.d.mts +384 -0
  31. package/dist/index-DxwLMnBF.d.mts.map +1 -0
  32. package/dist/index.d.mts +175 -22
  33. package/dist/index.d.mts.map +1 -1
  34. package/dist/index.mjs +523 -70
  35. package/dist/index.mjs.map +1 -1
  36. package/dist/patch/index.mjs +1 -1
  37. package/dist/{patch-BmRfghOo.mjs → patch-3KLx2yEP.mjs} +4 -4
  38. package/dist/patch-3KLx2yEP.mjs.map +1 -0
  39. package/dist/smartart/index.d.mts +2 -2
  40. package/dist/smartart/index.mjs +2 -2
  41. package/dist/smartart-BxnkROOp.mjs +1649 -0
  42. package/dist/smartart-BxnkROOp.mjs.map +1 -0
  43. package/dist/style-matrix-DAP6XrLv.mjs +123 -0
  44. package/dist/style-matrix-DAP6XrLv.mjs.map +1 -0
  45. package/dist/theme/index.d.mts +4 -2
  46. package/dist/theme/index.mjs +3 -2
  47. package/dist/theme-OAuRcA9_.mjs +460 -0
  48. package/dist/theme-OAuRcA9_.mjs.map +1 -0
  49. package/dist/theme-options-BbWccl85.d.mts +109 -0
  50. package/dist/theme-options-BbWccl85.d.mts.map +1 -0
  51. package/dist/util/index.d.mts +3 -3
  52. package/dist/util/index.mjs +3 -3
  53. package/dist/{util-Tq9PSjK0.mjs → util-C94-JKtp.mjs} +175 -429
  54. package/dist/util-C94-JKtp.mjs.map +1 -0
  55. package/dist/{values-8di32lIe.d.mts → values-aVoirbWB.d.mts} +4 -2
  56. package/dist/values-aVoirbWB.d.mts.map +1 -0
  57. package/dist/vector/index.d.mts +2 -0
  58. package/dist/vector/index.mjs +2 -0
  59. package/dist/vector-TpjW6ZSc.mjs +3092 -0
  60. package/dist/vector-TpjW6ZSc.mjs.map +1 -0
  61. package/package.json +15 -7
  62. package/dist/chart-DIGJna_6.mjs +0 -582
  63. package/dist/chart-DIGJna_6.mjs.map +0 -1
  64. package/dist/converters-C_Y2QX1w.mjs.map +0 -1
  65. package/dist/drawingml/index.d.mts +0 -2
  66. package/dist/drawingml/index.mjs +0 -2
  67. package/dist/drawingml-sj1J3lb0.mjs.map +0 -1
  68. package/dist/index-BVK2dv6C.d.mts.map +0 -1
  69. package/dist/index-BfHfKuKy.d.mts.map +0 -1
  70. package/dist/index-CE53SwpZ.d.mts.map +0 -1
  71. package/dist/index-D6VE-MnJ.d.mts +0 -43
  72. package/dist/index-D6VE-MnJ.d.mts.map +0 -1
  73. package/dist/index-DE4CLElr.d.mts +0 -145
  74. package/dist/index-DE4CLElr.d.mts.map +0 -1
  75. package/dist/index-DlPA26cw.d.mts +0 -91
  76. package/dist/index-DlPA26cw.d.mts.map +0 -1
  77. package/dist/patch-BmRfghOo.mjs.map +0 -1
  78. package/dist/smartart-B7ukZ-Tw.mjs +0 -305
  79. package/dist/smartart-B7ukZ-Tw.mjs.map +0 -1
  80. package/dist/theme-CiNzdl-9.mjs +0 -177
  81. package/dist/theme-CiNzdl-9.mjs.map +0 -1
  82. package/dist/util-Tq9PSjK0.mjs.map +0 -1
  83. package/dist/values-8di32lIe.d.mts.map +0 -1
@@ -0,0 +1,460 @@
1
+ import { C as shapePropertiesDesc, Rn as stringifyColorChoice, jn as parseColorChoice, l as textListStyleDesc, m as bodyPropertiesDesc } from "./drawing-FBzd2I0m.mjs";
2
+ import { i as stringifyShapeStyle, n as parseShapeStyle, r as stringifyFormatScheme, t as parseFormatScheme } from "./style-matrix-DAP6XrLv.mjs";
3
+ import { n as parseColorMapping, r as stringifyColorMapping } from "./color-mapping-CFF0vRSe.mjs";
4
+ import { escapeXml, findChild } from "@office-open/xml";
5
+ //#region src/theme/default-colors.ts
6
+ /** Office 2016+ default theme colors (hex without #). */
7
+ const DEFAULT_COLORS = {
8
+ dark1: "000000",
9
+ light1: "FFFFFF",
10
+ dark2: "44546A",
11
+ light2: "E7E6E6",
12
+ accent1: "4472C4",
13
+ accent2: "ED7D31",
14
+ accent3: "A5A5A5",
15
+ accent4: "FFC000",
16
+ accent5: "5B9BD5",
17
+ accent6: "70AD47",
18
+ hyperlink: "0563C1",
19
+ followedHyperlink: "954F72"
20
+ };
21
+ //#endregion
22
+ //#region src/theme/color-scheme.ts
23
+ /**
24
+ * Color scheme (a:clrScheme / CT_ColorScheme) stringify + parse.
25
+ *
26
+ * dk1/lt1 use a:sysClr (windowText/window) by Office convention; only when the
27
+ * caller explicitly supplies a value do they switch to a:srgbClr. parse reads
28
+ * back the effective color value (srgbClr val or sysClr lastClr).
29
+ *
30
+ * @module
31
+ */
32
+ /** clrScheme child tag → ColorSchemeOptions key, in schema order. */
33
+ const COLOR_TAGS = [
34
+ {
35
+ tag: "a:dk1",
36
+ key: "dark1"
37
+ },
38
+ {
39
+ tag: "a:lt1",
40
+ key: "light1"
41
+ },
42
+ {
43
+ tag: "a:dk2",
44
+ key: "dark2"
45
+ },
46
+ {
47
+ tag: "a:lt2",
48
+ key: "light2"
49
+ },
50
+ {
51
+ tag: "a:accent1",
52
+ key: "accent1"
53
+ },
54
+ {
55
+ tag: "a:accent2",
56
+ key: "accent2"
57
+ },
58
+ {
59
+ tag: "a:accent3",
60
+ key: "accent3"
61
+ },
62
+ {
63
+ tag: "a:accent4",
64
+ key: "accent4"
65
+ },
66
+ {
67
+ tag: "a:accent5",
68
+ key: "accent5"
69
+ },
70
+ {
71
+ tag: "a:accent6",
72
+ key: "accent6"
73
+ },
74
+ {
75
+ tag: "a:hlink",
76
+ key: "hyperlink"
77
+ },
78
+ {
79
+ tag: "a:folHlink",
80
+ key: "followedHyperlink"
81
+ }
82
+ ];
83
+ /** Read the effective hex color from a color element (srgbClr val or sysClr lastClr). */
84
+ function readColorValue(el) {
85
+ if (!el) return void 0;
86
+ const srgb = findChild(el, "a:srgbClr");
87
+ if (srgb) return String(srgb.attributes?.["val"] ?? "");
88
+ const sysClr = findChild(el, "a:sysClr");
89
+ if (sysClr) return String(sysClr.attributes?.["lastClr"] ?? "");
90
+ }
91
+ /**
92
+ * Whether the color element carries the conventional default sysClr form
93
+ * (dk1 = windowText, lt1 = window). These parse to "not explicitly set" so
94
+ * stringify re-emits the same sysClr spelling and Office-default themes
95
+ * round-trip byte-identically instead of degrading sysClr to srgbClr.
96
+ */
97
+ function isDefaultSysClr(el, val) {
98
+ const sysClr = findChild(el, "a:sysClr");
99
+ return sysClr !== void 0 && String(sysClr.attributes?.["val"] ?? "") === val;
100
+ }
101
+ /** dk1/lt1 emit sysClr by default, srgbClr when explicitly supplied. */
102
+ function stringifyColorTag(tag, key, opts) {
103
+ const userValue = opts?.[key];
104
+ const defaultValue = DEFAULT_COLORS[key];
105
+ if (key === "dark1") return userValue !== void 0 ? `<${tag}><a:srgbClr val="${userValue}"/></${tag}>` : `<${tag}><a:sysClr val="windowText" lastClr="${defaultValue}"/></${tag}>`;
106
+ if (key === "light1") return userValue !== void 0 ? `<${tag}><a:srgbClr val="${userValue}"/></${tag}>` : `<${tag}><a:sysClr val="window" lastClr="${defaultValue}"/></${tag}>`;
107
+ return `<${tag}><a:srgbClr val="${userValue ?? defaultValue}"/></${tag}>`;
108
+ }
109
+ /** Serialize a:clrScheme. Undefined options emit the full default scheme. */
110
+ function stringifyColorScheme(opts, fallbackName) {
111
+ return `<a:clrScheme name="${opts?.name ?? fallbackName}">${COLOR_TAGS.map(({ tag, key }) => stringifyColorTag(tag, key, opts)).join("")}</a:clrScheme>`;
112
+ }
113
+ /** Parse a:clrScheme into the subset of colors explicitly present. */
114
+ function parseColorScheme(el) {
115
+ if (!el) return void 0;
116
+ const result = {};
117
+ const name = el.attributes?.["name"];
118
+ if (name) result.name = String(name);
119
+ for (const { tag, key } of COLOR_TAGS) {
120
+ const colorEl = findChild(el, tag);
121
+ if (key === "dark1" && isDefaultSysClr(colorEl, "windowText") || key === "light1" && isDefaultSysClr(colorEl, "window")) continue;
122
+ const value = readColorValue(colorEl);
123
+ if (value) result[key] = value;
124
+ }
125
+ return result;
126
+ }
127
+ //#endregion
128
+ //#region src/theme/custom-color.ts
129
+ /** Serialize a:custClrLst. Returns "" when no custom colors set (optional element). */
130
+ function stringifyCustomColors(opts, ctx) {
131
+ if (!opts || opts.length === 0) return "";
132
+ return `<a:custClrLst>${opts.map((c) => {
133
+ return `<a:custClr${c.name ? ` name="${c.name}"` : ""}>${stringifyColorChoice(c.color, ctx)}</a:custClr>`;
134
+ }).join("")}</a:custClrLst>`;
135
+ }
136
+ /** Parse a:custClrLst. */
137
+ function parseCustomColors(el, ctx) {
138
+ if (!el) return void 0;
139
+ const result = [];
140
+ for (const child of el.elements ?? []) {
141
+ if (child.name !== "a:custClr") continue;
142
+ const color = parseColorChoice(child, ctx);
143
+ if (!color) continue;
144
+ const name = child.attributes?.["name"];
145
+ result.push(name !== void 0 ? {
146
+ name: String(name),
147
+ color
148
+ } : { color });
149
+ }
150
+ return result.length > 0 ? result : void 0;
151
+ }
152
+ //#endregion
153
+ //#region src/theme/extra-color-scheme.ts
154
+ /**
155
+ * Extra color scheme (a:extraClrScheme / CT_ExtraColorScheme) stringify + parse.
156
+ *
157
+ * Each entry pairs a color scheme with an optional color mapping. The list
158
+ * wrapper (a:extraClrSchemeLst / CT_ColorSchemeList) holds zero or more entries.
159
+ *
160
+ * @module
161
+ */
162
+ /** Serialize a:extraClrSchemeLst. Returns an empty element when no schemes set. */
163
+ function stringifyExtraColorSchemes(opts, fallbackName) {
164
+ if (!opts || opts.length === 0) return "<a:extraClrSchemeLst/>";
165
+ return `<a:extraClrSchemeLst>${opts.map((scheme) => {
166
+ return `<a:extraClrScheme>${stringifyColorScheme(scheme.colorScheme, scheme.colorScheme.name ?? fallbackName)}${scheme.colorMapping ? stringifyColorMapping(scheme.colorMapping) : ""}</a:extraClrScheme>`;
167
+ }).join("")}</a:extraClrSchemeLst>`;
168
+ }
169
+ /** Parse a:extraClrSchemeLst. */
170
+ function parseExtraColorSchemes(el) {
171
+ if (!el) return void 0;
172
+ const result = [];
173
+ for (const child of el.elements ?? []) {
174
+ if (child.name !== "a:extraClrScheme") continue;
175
+ const colorScheme = parseColorScheme(findChild(child, "a:clrScheme"));
176
+ if (!colorScheme) continue;
177
+ const colorMapping = parseColorMapping(findChild(child, "a:clrMap"));
178
+ result.push(colorMapping ? {
179
+ colorScheme,
180
+ colorMapping
181
+ } : { colorScheme });
182
+ }
183
+ return result.length > 0 ? result : void 0;
184
+ }
185
+ //#endregion
186
+ //#region src/theme/font-scheme.ts
187
+ /**
188
+ * Font scheme (a:fontScheme / CT_FontScheme) stringify + parse.
189
+ *
190
+ * CT_FontCollection order: latin → ea → cs → sym → font[] (supplemental).
191
+ *
192
+ * @module
193
+ */
194
+ function stringifyTextFont(tag, opts) {
195
+ if (!opts) return "";
196
+ const attrs = [`typeface="${escapeXml(opts.typeface)}"`];
197
+ if (opts.panose !== void 0) attrs.push(`panose="${escapeXml(opts.panose)}"`);
198
+ if (opts.pitchFamily !== void 0) attrs.push(`pitchFamily="${opts.pitchFamily}"`);
199
+ if (opts.charset !== void 0) attrs.push(`charset="${opts.charset}"`);
200
+ return `<${tag} ${attrs.join(" ")}/>`;
201
+ }
202
+ function parseTextFont(el) {
203
+ if (!el?.attributes) return void 0;
204
+ const typeface = el.attributes["typeface"];
205
+ if (typeface === void 0) return void 0;
206
+ const result = { typeface: String(typeface) };
207
+ if (el.attributes["panose"] !== void 0) result.panose = String(el.attributes["panose"]);
208
+ if (el.attributes["pitchFamily"] !== void 0) result.pitchFamily = Number(el.attributes["pitchFamily"]);
209
+ if (el.attributes["charset"] !== void 0) result.charset = Number(el.attributes["charset"]);
210
+ return result;
211
+ }
212
+ function stringifyFontCollection(tag, opts) {
213
+ return `<${tag}>${stringifyTextFont("a:latin", opts?.latin)}${stringifyTextFont("a:ea", opts?.eastAsian)}${stringifyTextFont("a:cs", opts?.complexScript)}${stringifyTextFont("a:sym", opts?.symbol)}${(opts?.supplementalFonts ?? []).map((f) => `<a:font script="${escapeXml(f.script)}" typeface="${escapeXml(f.typeface)}"/>`).join("")}</${tag}>`;
214
+ }
215
+ function parseFontCollection(el) {
216
+ if (!el) return void 0;
217
+ const result = {};
218
+ const latin = parseTextFont(findChild(el, "a:latin"));
219
+ if (latin) result.latin = latin;
220
+ const eastAsian = parseTextFont(findChild(el, "a:ea"));
221
+ if (eastAsian) result.eastAsian = eastAsian;
222
+ const complexScript = parseTextFont(findChild(el, "a:cs"));
223
+ if (complexScript) result.complexScript = complexScript;
224
+ const symbol = parseTextFont(findChild(el, "a:sym"));
225
+ if (symbol) result.symbol = symbol;
226
+ const supplementalFonts = (el.elements ?? []).filter((c) => c.name === "a:font").map((c) => {
227
+ const script = c.attributes?.["script"];
228
+ const typeface = c.attributes?.["typeface"];
229
+ if (script === void 0 || typeface === void 0) return void 0;
230
+ return {
231
+ script: String(script),
232
+ typeface: String(typeface)
233
+ };
234
+ }).filter((v) => v !== void 0);
235
+ if (supplementalFonts.length > 0) result.supplementalFonts = supplementalFonts;
236
+ return Object.keys(result).length > 0 ? result : void 0;
237
+ }
238
+ const DEFAULT_MAJOR_FONT = {
239
+ latin: {
240
+ typeface: "Calibri Light",
241
+ panose: "020F0302020204030204"
242
+ },
243
+ eastAsian: { typeface: "" },
244
+ complexScript: { typeface: "" }
245
+ };
246
+ const DEFAULT_MINOR_FONT = {
247
+ latin: {
248
+ typeface: "Calibri",
249
+ panose: "020F0502020204030204"
250
+ },
251
+ eastAsian: { typeface: "" },
252
+ complexScript: { typeface: "" }
253
+ };
254
+ /** Serialize a:fontScheme. Undefined options emit the Office default scheme. */
255
+ function stringifyFontScheme(opts, fallbackName) {
256
+ const majorFont = stringifyFontCollection("a:majorFont", opts?.majorFont ? {
257
+ ...DEFAULT_MAJOR_FONT,
258
+ ...opts.majorFont
259
+ } : DEFAULT_MAJOR_FONT);
260
+ const minorFont = stringifyFontCollection("a:minorFont", opts?.minorFont ? {
261
+ ...DEFAULT_MINOR_FONT,
262
+ ...opts.minorFont
263
+ } : DEFAULT_MINOR_FONT);
264
+ return `<a:fontScheme name="${opts?.name ?? fallbackName}">${majorFont}${minorFont}</a:fontScheme>`;
265
+ }
266
+ /** Parse a:fontScheme. Returns undefined only when neither major nor minor font is present. */
267
+ function parseFontScheme(el) {
268
+ if (!el) return void 0;
269
+ const result = {};
270
+ const name = el.attributes?.["name"];
271
+ if (name) result.name = String(name);
272
+ const majorFont = parseFontCollection(findChild(el, "a:majorFont"));
273
+ if (majorFont) result.majorFont = majorFont;
274
+ const minorFont = parseFontCollection(findChild(el, "a:minorFont"));
275
+ if (minorFont) result.minorFont = minorFont;
276
+ return Object.keys(result).length > 0 ? result : void 0;
277
+ }
278
+ //#endregion
279
+ //#region src/theme/object-defaults.ts
280
+ /**
281
+ * Object defaults (a:objectDefaults / CT_ObjectStyleDefaults) stringify + parse.
282
+ *
283
+ * Each default definition (spDef/lnDef/txDef) holds shape properties, body
284
+ * properties, list style, and an optional shape style. Reuses core descriptors
285
+ * so defaults round-trip through the same machinery as shapes.
286
+ *
287
+ * @module
288
+ */
289
+ function stringifyDefaultShapeDefinition(tag, opts, ctx) {
290
+ const spPrInner = opts.shapeProperties ? shapePropertiesDesc.stringify(opts.shapeProperties, ctx) ?? "" : "";
291
+ return `<${tag}>${spPrInner ? `<a:spPr>${spPrInner}</a:spPr>` : ""}${opts.bodyProperties ? bodyPropertiesDesc.stringify(opts.bodyProperties, ctx) ?? "" : ""}${opts.listStyle ? textListStyleDesc.stringify(opts.listStyle, ctx) ?? "" : ""}${opts.shapeStyle ? stringifyShapeStyle(opts.shapeStyle, ctx) : ""}</${tag}>`;
292
+ }
293
+ function parseDefaultShapeDefinition(el, ctx) {
294
+ if (!el) return void 0;
295
+ const result = {};
296
+ const spPr = findChild(el, "a:spPr");
297
+ if (spPr) {
298
+ const shapeProperties = shapePropertiesDesc.parse(spPr, ctx);
299
+ if (shapeProperties) result.shapeProperties = shapeProperties;
300
+ }
301
+ const bodyPr = findChild(el, "a:bodyPr");
302
+ if (bodyPr) {
303
+ const bodyProperties = bodyPropertiesDesc.parse(bodyPr, ctx);
304
+ if (bodyProperties) result.bodyProperties = bodyProperties;
305
+ }
306
+ const lstStyle = findChild(el, "a:lstStyle");
307
+ if (lstStyle) {
308
+ const listStyle = textListStyleDesc.parse(lstStyle, ctx);
309
+ if (listStyle) result.listStyle = listStyle;
310
+ }
311
+ const style = findChild(el, "a:style");
312
+ if (style) {
313
+ const shapeStyle = parseShapeStyle(style, ctx);
314
+ if (shapeStyle) result.shapeStyle = shapeStyle;
315
+ }
316
+ return Object.keys(result).length > 0 ? result : void 0;
317
+ }
318
+ /** Serialize a:objectDefaults. Returns an empty element when no defaults set. */
319
+ function stringifyObjectDefaults(opts, ctx) {
320
+ if (!opts) return "<a:objectDefaults/>";
321
+ const spDef = opts.shapeDefault ? stringifyDefaultShapeDefinition("a:spDef", opts.shapeDefault, ctx) : "";
322
+ const lnDef = opts.lineDefault ? stringifyDefaultShapeDefinition("a:lnDef", opts.lineDefault, ctx) : "";
323
+ const txDef = opts.textDefault ? stringifyDefaultShapeDefinition("a:txDef", opts.textDefault, ctx) : "";
324
+ if (!spDef && !lnDef && !txDef) return "<a:objectDefaults/>";
325
+ return `<a:objectDefaults>${spDef}${lnDef}${txDef}</a:objectDefaults>`;
326
+ }
327
+ /** Parse a:objectDefaults. */
328
+ function parseObjectDefaults(el, ctx) {
329
+ if (!el) return void 0;
330
+ const result = {};
331
+ const shapeDefault = parseDefaultShapeDefinition(findChild(el, "a:spDef"), ctx);
332
+ if (shapeDefault) result.shapeDefault = shapeDefault;
333
+ const lineDefault = parseDefaultShapeDefinition(findChild(el, "a:lnDef"), ctx);
334
+ if (lineDefault) result.lineDefault = lineDefault;
335
+ const textDefault = parseDefaultShapeDefinition(findChild(el, "a:txDef"), ctx);
336
+ if (textDefault) result.textDefault = textDefault;
337
+ return Object.keys(result).length > 0 ? result : void 0;
338
+ }
339
+ //#endregion
340
+ //#region src/theme/build-theme-xml.ts
341
+ const DEFAULT_FORMAT_SCHEME_XML = "<a:fmtScheme name=\"Office\"><a:fillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"110000\"/><a:satMod val=\"105000\"/><a:tint val=\"67000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:satMod val=\"103000\"/><a:tint val=\"73000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:satMod val=\"109000\"/><a:tint val=\"81000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"102000\"/><a:satMod val=\"103000\"/><a:tint val=\"94000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"100000\"/><a:satMod val=\"110000\"/><a:shade val=\"100000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"99000\"/><a:satMod val=\"120000\"/><a:shade val=\"78000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w=\"6350\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln><a:ln w=\"12700\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln><a:ln w=\"19050\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"57150\" dist=\"19050\" dir=\"5400000\" algn=\"ctr\" rotWithShape=\"0\"><a:srgbClr val=\"000000\"><a:alpha val=\"63000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:solidFill><a:schemeClr val=\"phClr\"><a:tint val=\"95000\"/><a:satMod val=\"170000\"/></a:schemeClr></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"102000\"/><a:satMod val=\"150000\"/><a:tint val=\"93000\"/><a:shade val=\"98000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"103000\"/><a:satMod val=\"130000\"/><a:tint val=\"98000\"/><a:shade val=\"90000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:satMod val=\"120000\"/><a:shade val=\"63000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill></a:bgFillStyleLst></a:fmtScheme>";
342
+ function requireCtx(ctx, field) {
343
+ if (!ctx) throw new Error(`buildThemeXml: ${field} requires a WriteContext`);
344
+ return ctx;
345
+ }
346
+ function buildThemeXml(options, ctx) {
347
+ const opts = options ?? {};
348
+ const name = opts.name ?? "Office Theme";
349
+ return `<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="${name}"><a:themeElements>${stringifyColorScheme(opts.colorScheme, name)}${stringifyFontScheme(opts.fontScheme, name)}${opts.formatScheme ? stringifyFormatScheme(opts.formatScheme, requireCtx(ctx, "formatScheme")) : DEFAULT_FORMAT_SCHEME_XML}</a:themeElements>${opts.objectDefaults ? stringifyObjectDefaults(opts.objectDefaults, requireCtx(ctx, "objectDefaults")) : "<a:objectDefaults/>"}${stringifyExtraColorSchemes(opts.extraColorSchemes, name)}${opts.customColors ? stringifyCustomColors(opts.customColors, requireCtx(ctx, "customColors")) : ""}</a:theme>`;
350
+ }
351
+ //#endregion
352
+ //#region src/theme/default-theme.ts
353
+ const DEFAULT_XML = buildThemeXml();
354
+ const customCache = /* @__PURE__ */ new Map();
355
+ function isSimpleCustomization(opts) {
356
+ return !opts.formatScheme && !opts.objectDefaults && !opts.extraColorSchemes;
357
+ }
358
+ function simpleKey(o) {
359
+ return `${o.name ?? ""}|${JSON.stringify(o.colorScheme)}|${JSON.stringify(o.fontScheme)}`;
360
+ }
361
+ /**
362
+ * Generate theme XML string from options.
363
+ * Returns the cached default when no options are provided.
364
+ */
365
+ function createThemeXml(options, ctx) {
366
+ if (!options) return DEFAULT_XML;
367
+ if (isSimpleCustomization(options)) {
368
+ const key = simpleKey(options);
369
+ const cached = customCache.get(key);
370
+ if (cached) return cached;
371
+ const built = buildThemeXml(options);
372
+ customCache.set(key, built);
373
+ return built;
374
+ }
375
+ return buildThemeXml(options, ctx);
376
+ }
377
+ //#endregion
378
+ //#region src/theme/theme-descriptors.ts
379
+ /**
380
+ * Theme descriptor — bidirectional mapping between ThemeOptions and theme XML.
381
+ *
382
+ * stringify delegates to buildThemeXml (structured driver). parse reads the full
383
+ * CT_BaseStyles surface: colorScheme, fontScheme, formatScheme, objectDefaults,
384
+ * and extraClrSchemeLst — so every part round-trips.
385
+ *
386
+ * @module
387
+ */
388
+ const themeDesc = {
389
+ kind: "custom",
390
+ stringify(opts, ctx) {
391
+ return buildThemeXml(opts, ctx);
392
+ },
393
+ parse(el, ctx) {
394
+ const result = {};
395
+ const name = el.attributes?.["name"];
396
+ if (name) result.name = String(name);
397
+ const themeElements = findChild(el, "a:themeElements");
398
+ if (themeElements) {
399
+ const colorScheme = parseColorScheme(findChild(themeElements, "a:clrScheme"));
400
+ if (colorScheme) result.colorScheme = colorScheme;
401
+ const fontScheme = parseFontScheme(findChild(themeElements, "a:fontScheme"));
402
+ if (fontScheme) result.fontScheme = fontScheme;
403
+ const formatScheme = parseFormatScheme(findChild(themeElements, "a:fmtScheme"), ctx);
404
+ if (formatScheme) result.formatScheme = formatScheme;
405
+ }
406
+ const objectDefaults = parseObjectDefaults(findChild(el, "a:objectDefaults"), ctx);
407
+ if (objectDefaults) result.objectDefaults = objectDefaults;
408
+ const extraColorSchemes = parseExtraColorSchemes(findChild(el, "a:extraClrSchemeLst"));
409
+ if (extraColorSchemes) result.extraColorSchemes = extraColorSchemes;
410
+ const customColors = parseCustomColors(findChild(el, "a:custClrLst"), ctx);
411
+ if (customColors) result.customColors = customColors;
412
+ return result;
413
+ }
414
+ };
415
+ //#endregion
416
+ //#region src/theme/theme-override.ts
417
+ /**
418
+ * Theme override and theme manager descriptors.
419
+ *
420
+ * a:themeOverride (CT_BaseStylesOverride) is the root of a themeOverride{n}.xml
421
+ * part — an optional subset of the base styles that a slide/layout/master can
422
+ * reference to deviate from its owning theme. a:themeManager (CT_EmptyElement)
423
+ * is the root of the legacy themeManager part; it carries no content.
424
+ *
425
+ * @module
426
+ */
427
+ const THEME_NS = "xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"";
428
+ const themeOverrideDesc = {
429
+ kind: "custom",
430
+ stringify(opts, ctx) {
431
+ let content = "";
432
+ if (opts.colorScheme) content += stringifyColorScheme(opts.colorScheme, opts.colorScheme.name ?? "Override");
433
+ if (opts.fontScheme) content += stringifyFontScheme(opts.fontScheme, opts.fontScheme.name ?? "Override");
434
+ if (opts.formatScheme) content += stringifyFormatScheme(opts.formatScheme, ctx);
435
+ return `<a:themeOverride ${THEME_NS}>${content}</a:themeOverride>`;
436
+ },
437
+ parse(el, ctx) {
438
+ const result = {};
439
+ const colorScheme = parseColorScheme(findChild(el, "a:clrScheme"));
440
+ if (colorScheme) result.colorScheme = colorScheme;
441
+ const fontScheme = parseFontScheme(findChild(el, "a:fontScheme"));
442
+ if (fontScheme) result.fontScheme = fontScheme;
443
+ const formatScheme = parseFormatScheme(findChild(el, "a:fmtScheme"), ctx);
444
+ if (formatScheme) result.formatScheme = formatScheme;
445
+ return result;
446
+ }
447
+ };
448
+ const themeManagerDesc = {
449
+ kind: "custom",
450
+ stringify(_opts, _ctx) {
451
+ return `<a:themeManager ${THEME_NS}/>`;
452
+ },
453
+ parse(_el, _ctx) {
454
+ return {};
455
+ }
456
+ };
457
+ //#endregion
458
+ export { buildThemeXml as a, createThemeXml as i, themeOverrideDesc as n, DEFAULT_COLORS as o, themeDesc as r, themeManagerDesc as t };
459
+
460
+ //# sourceMappingURL=theme-OAuRcA9_.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-OAuRcA9_.mjs","names":[],"sources":["../src/theme/default-colors.ts","../src/theme/color-scheme.ts","../src/theme/custom-color.ts","../src/theme/extra-color-scheme.ts","../src/theme/font-scheme.ts","../src/theme/object-defaults.ts","../src/theme/build-theme-xml.ts","../src/theme/default-theme.ts","../src/theme/theme-descriptors.ts","../src/theme/theme-override.ts"],"sourcesContent":["/**\n * Default Office 2016+ theme colors.\n *\n * @module\n */\nimport type { ColorSchemeOptions } from \"./theme-options\";\n\n/** Office 2016+ default theme colors (hex without #). */\nexport const DEFAULT_COLORS: Required<Omit<ColorSchemeOptions, \"name\">> = {\n dark1: \"000000\",\n light1: \"FFFFFF\",\n dark2: \"44546A\",\n light2: \"E7E6E6\",\n accent1: \"4472C4\",\n accent2: \"ED7D31\",\n accent3: \"A5A5A5\",\n accent4: \"FFC000\",\n accent5: \"5B9BD5\",\n accent6: \"70AD47\",\n hyperlink: \"0563C1\",\n followedHyperlink: \"954F72\",\n};\n","/**\n * Color scheme (a:clrScheme / CT_ColorScheme) stringify + parse.\n *\n * dk1/lt1 use a:sysClr (windowText/window) by Office convention; only when the\n * caller explicitly supplies a value do they switch to a:srgbClr. parse reads\n * back the effective color value (srgbClr val or sysClr lastClr).\n *\n * @module\n */\nimport { findChild } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport { DEFAULT_COLORS } from \"./default-colors\";\nimport type { ColorSchemeOptions } from \"./theme-options\";\n\n/** Color keys excluding the clrScheme/@name attribute. */\ntype ColorKey = Exclude<keyof ColorSchemeOptions, \"name\">;\n\n/** clrScheme child tag → ColorSchemeOptions key, in schema order. */\nconst COLOR_TAGS: ReadonlyArray<{ tag: string; key: ColorKey }> = [\n { tag: \"a:dk1\", key: \"dark1\" },\n { tag: \"a:lt1\", key: \"light1\" },\n { tag: \"a:dk2\", key: \"dark2\" },\n { tag: \"a:lt2\", key: \"light2\" },\n { tag: \"a:accent1\", key: \"accent1\" },\n { tag: \"a:accent2\", key: \"accent2\" },\n { tag: \"a:accent3\", key: \"accent3\" },\n { tag: \"a:accent4\", key: \"accent4\" },\n { tag: \"a:accent5\", key: \"accent5\" },\n { tag: \"a:accent6\", key: \"accent6\" },\n { tag: \"a:hlink\", key: \"hyperlink\" },\n { tag: \"a:folHlink\", key: \"followedHyperlink\" },\n];\n\n/** Read the effective hex color from a color element (srgbClr val or sysClr lastClr). */\nfunction readColorValue(el: XmlElement | undefined): string | undefined {\n if (!el) return undefined;\n const srgb = findChild(el, \"a:srgbClr\");\n if (srgb) return String(srgb.attributes?.[\"val\"] ?? \"\");\n const sysClr = findChild(el, \"a:sysClr\");\n if (sysClr) return String(sysClr.attributes?.[\"lastClr\"] ?? \"\");\n return undefined;\n}\n\n/**\n * Whether the color element carries the conventional default sysClr form\n * (dk1 = windowText, lt1 = window). These parse to \"not explicitly set\" so\n * stringify re-emits the same sysClr spelling and Office-default themes\n * round-trip byte-identically instead of degrading sysClr to srgbClr.\n */\nfunction isDefaultSysClr(el: XmlElement | undefined, val: string): boolean {\n const sysClr = findChild(el, \"a:sysClr\");\n return sysClr !== undefined && String(sysClr.attributes?.[\"val\"] ?? \"\") === val;\n}\n\n/** dk1/lt1 emit sysClr by default, srgbClr when explicitly supplied. */\nfunction stringifyColorTag(\n tag: string,\n key: ColorKey,\n opts: ColorSchemeOptions | undefined,\n): string {\n const userValue = opts?.[key];\n const defaultValue = DEFAULT_COLORS[key];\n if (key === \"dark1\") {\n return userValue !== undefined\n ? `<${tag}><a:srgbClr val=\"${userValue}\"/></${tag}>`\n : `<${tag}><a:sysClr val=\"windowText\" lastClr=\"${defaultValue}\"/></${tag}>`;\n }\n if (key === \"light1\") {\n return userValue !== undefined\n ? `<${tag}><a:srgbClr val=\"${userValue}\"/></${tag}>`\n : `<${tag}><a:sysClr val=\"window\" lastClr=\"${defaultValue}\"/></${tag}>`;\n }\n const value = userValue ?? defaultValue;\n return `<${tag}><a:srgbClr val=\"${value}\"/></${tag}>`;\n}\n\n/** Serialize a:clrScheme. Undefined options emit the full default scheme. */\nexport function stringifyColorScheme(\n opts: ColorSchemeOptions | undefined,\n fallbackName: string,\n): string {\n const name = opts?.name ?? fallbackName;\n const tags = COLOR_TAGS.map(({ tag, key }) => stringifyColorTag(tag, key, opts)).join(\"\");\n return `<a:clrScheme name=\"${name}\">${tags}</a:clrScheme>`;\n}\n\n/** Parse a:clrScheme into the subset of colors explicitly present. */\nexport function parseColorScheme(el: XmlElement | undefined): ColorSchemeOptions | undefined {\n if (!el) return undefined;\n const result: Partial<ColorSchemeOptions> = {};\n const name = el.attributes?.[\"name\"];\n if (name) result.name = String(name);\n for (const { tag, key } of COLOR_TAGS) {\n const colorEl = findChild(el, tag);\n // Conventional-default sysClr (windowText/window) parses to \"unset\" so\n // stringify re-emits the sysClr form — see isDefaultSysClr.\n if (\n (key === \"dark1\" && isDefaultSysClr(colorEl, \"windowText\")) ||\n (key === \"light1\" && isDefaultSysClr(colorEl, \"window\"))\n ) {\n continue;\n }\n const value = readColorValue(colorEl);\n if (value) result[key] = value;\n }\n return result;\n}\n","/**\n * Custom colors (a:custClr / CT_CustomColor) stringify + parse.\n *\n * Each entry is a named color choice; the list wrapper (a:custClrLst /\n * CT_CustomColorList) sits after extraClrSchemeLst in a theme.\n *\n * @module\n */\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport type { ReadContext, WriteContext } from \"../descriptor\";\nimport { parseColorChoice, stringifyColorChoice } from \"../drawing\";\nimport type { SolidFillOptions } from \"../drawing\";\nimport type { CustomColorOptions } from \"./theme-options\";\n\n/** Serialize a:custClrLst. Returns \"\" when no custom colors set (optional element). */\nexport function stringifyCustomColors(\n opts: CustomColorOptions[] | undefined,\n ctx: WriteContext,\n): string {\n if (!opts || opts.length === 0) return \"\";\n const items = opts\n .map((c) => {\n const name = c.name ? ` name=\"${c.name}\"` : \"\";\n return `<a:custClr${name}>${stringifyColorChoice(c.color, ctx)}</a:custClr>`;\n })\n .join(\"\");\n return `<a:custClrLst>${items}</a:custClrLst>`;\n}\n\n/** Parse a:custClrLst. */\nexport function parseCustomColors(\n el: XmlElement | undefined,\n ctx: ReadContext,\n): CustomColorOptions[] | undefined {\n if (!el) return undefined;\n const result: CustomColorOptions[] = [];\n for (const child of el.elements ?? []) {\n if (child.name !== \"a:custClr\") continue;\n const color: SolidFillOptions | undefined = parseColorChoice(child, ctx);\n if (!color) continue;\n const name = child.attributes?.[\"name\"];\n result.push(name !== undefined ? { name: String(name), color } : { color });\n }\n return result.length > 0 ? result : undefined;\n}\n","/**\n * Extra color scheme (a:extraClrScheme / CT_ExtraColorScheme) stringify + parse.\n *\n * Each entry pairs a color scheme with an optional color mapping. The list\n * wrapper (a:extraClrSchemeLst / CT_ColorSchemeList) holds zero or more entries.\n *\n * @module\n */\nimport { findChild } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport { parseColorMapping, stringifyColorMapping } from \"./color-mapping\";\nimport { parseColorScheme, stringifyColorScheme } from \"./color-scheme\";\nimport type { ExtraColorSchemeOptions } from \"./theme-options\";\n\n/** Serialize a:extraClrSchemeLst. Returns an empty element when no schemes set. */\nexport function stringifyExtraColorSchemes(\n opts: ExtraColorSchemeOptions[] | undefined,\n fallbackName: string,\n): string {\n if (!opts || opts.length === 0) return \"<a:extraClrSchemeLst/>\";\n const items = opts\n .map((scheme) => {\n const clrScheme = stringifyColorScheme(\n scheme.colorScheme,\n scheme.colorScheme.name ?? fallbackName,\n );\n const clrMap = scheme.colorMapping ? stringifyColorMapping(scheme.colorMapping) : \"\";\n return `<a:extraClrScheme>${clrScheme}${clrMap}</a:extraClrScheme>`;\n })\n .join(\"\");\n return `<a:extraClrSchemeLst>${items}</a:extraClrSchemeLst>`;\n}\n\n/** Parse a:extraClrSchemeLst. */\nexport function parseExtraColorSchemes(\n el: XmlElement | undefined,\n): ExtraColorSchemeOptions[] | undefined {\n if (!el) return undefined;\n const result: ExtraColorSchemeOptions[] = [];\n for (const child of el.elements ?? []) {\n if (child.name !== \"a:extraClrScheme\") continue;\n const colorScheme = parseColorScheme(findChild(child, \"a:clrScheme\"));\n if (!colorScheme) continue;\n const colorMapping = parseColorMapping(findChild(child, \"a:clrMap\"));\n result.push(colorMapping ? { colorScheme, colorMapping } : { colorScheme });\n }\n return result.length > 0 ? result : undefined;\n}\n","/**\n * Font scheme (a:fontScheme / CT_FontScheme) stringify + parse.\n *\n * CT_FontCollection order: latin → ea → cs → sym → font[] (supplemental).\n *\n * @module\n */\nimport { escapeXml } from \"@office-open/xml\";\nimport { findChild } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport type {\n FontCollectionOptions,\n FontSchemeOptions,\n SupplementalFontOptions,\n TextFontOptions,\n} from \"./theme-options\";\n\n// ── TextFont (a:latin / a:ea / a:cs / a:sym) ──\n\nfunction stringifyTextFont(tag: string, opts: TextFontOptions | undefined): string {\n if (!opts) return \"\";\n const attrs = [`typeface=\"${escapeXml(opts.typeface)}\"`];\n if (opts.panose !== undefined) attrs.push(`panose=\"${escapeXml(opts.panose)}\"`);\n if (opts.pitchFamily !== undefined) attrs.push(`pitchFamily=\"${opts.pitchFamily}\"`);\n if (opts.charset !== undefined) attrs.push(`charset=\"${opts.charset}\"`);\n return `<${tag} ${attrs.join(\" \")}/>`;\n}\n\nfunction parseTextFont(el: XmlElement | undefined): TextFontOptions | undefined {\n if (!el?.attributes) return undefined;\n const typeface = el.attributes[\"typeface\"];\n if (typeface === undefined) return undefined;\n const result: TextFontOptions = { typeface: String(typeface) };\n if (el.attributes[\"panose\"] !== undefined) result.panose = String(el.attributes[\"panose\"]);\n if (el.attributes[\"pitchFamily\"] !== undefined)\n result.pitchFamily = Number(el.attributes[\"pitchFamily\"]);\n if (el.attributes[\"charset\"] !== undefined) result.charset = Number(el.attributes[\"charset\"]);\n return result;\n}\n\n// ── Font collection (a:majorFont / a:minorFont) ──\n\nfunction stringifyFontCollection(tag: string, opts: FontCollectionOptions | undefined): string {\n const latin = stringifyTextFont(\"a:latin\", opts?.latin);\n const eastAsian = stringifyTextFont(\"a:ea\", opts?.eastAsian);\n const complexScript = stringifyTextFont(\"a:cs\", opts?.complexScript);\n const symbol = stringifyTextFont(\"a:sym\", opts?.symbol);\n const supplemental = (opts?.supplementalFonts ?? [])\n .map((f) => `<a:font script=\"${escapeXml(f.script)}\" typeface=\"${escapeXml(f.typeface)}\"/>`)\n .join(\"\");\n return `<${tag}>${latin}${eastAsian}${complexScript}${symbol}${supplemental}</${tag}>`;\n}\n\nfunction parseFontCollection(el: XmlElement | undefined): FontCollectionOptions | undefined {\n if (!el) return undefined;\n const result: FontCollectionOptions = {};\n const latin = parseTextFont(findChild(el, \"a:latin\"));\n if (latin) result.latin = latin;\n const eastAsian = parseTextFont(findChild(el, \"a:ea\"));\n if (eastAsian) result.eastAsian = eastAsian;\n const complexScript = parseTextFont(findChild(el, \"a:cs\"));\n if (complexScript) result.complexScript = complexScript;\n const symbol = parseTextFont(findChild(el, \"a:sym\"));\n if (symbol) result.symbol = symbol;\n const supplementalFonts = (el.elements ?? [])\n .filter((c) => c.name === \"a:font\")\n .map((c): SupplementalFontOptions | undefined => {\n const script = c.attributes?.[\"script\"];\n const typeface = c.attributes?.[\"typeface\"];\n if (script === undefined || typeface === undefined) return undefined;\n return { script: String(script), typeface: String(typeface) };\n })\n .filter((v): v is SupplementalFontOptions => v !== undefined);\n if (supplementalFonts.length > 0) result.supplementalFonts = supplementalFonts;\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\n// ── Fresh defaults (Office theme major/minor fonts) ──\n\nexport const DEFAULT_MAJOR_FONT: FontCollectionOptions = {\n latin: { typeface: \"Calibri Light\", panose: \"020F0302020204030204\" },\n eastAsian: { typeface: \"\" },\n complexScript: { typeface: \"\" },\n};\n\nexport const DEFAULT_MINOR_FONT: FontCollectionOptions = {\n latin: { typeface: \"Calibri\", panose: \"020F0502020204030204\" },\n eastAsian: { typeface: \"\" },\n complexScript: { typeface: \"\" },\n};\n\n// ── Font scheme (a:fontScheme) ──\n\n/** Serialize a:fontScheme. Undefined options emit the Office default scheme. */\nexport function stringifyFontScheme(\n opts: FontSchemeOptions | undefined,\n fallbackName: string,\n): string {\n // Merge defaults so the XSD-required latin/ea/cs slots are always present,\n // even when the caller only customizes one font (e.g. latin typeface).\n const majorFont = stringifyFontCollection(\n \"a:majorFont\",\n opts?.majorFont ? { ...DEFAULT_MAJOR_FONT, ...opts.majorFont } : DEFAULT_MAJOR_FONT,\n );\n const minorFont = stringifyFontCollection(\n \"a:minorFont\",\n opts?.minorFont ? { ...DEFAULT_MINOR_FONT, ...opts.minorFont } : DEFAULT_MINOR_FONT,\n );\n const name = opts?.name ?? fallbackName;\n return `<a:fontScheme name=\"${name}\">${majorFont}${minorFont}</a:fontScheme>`;\n}\n\n/** Parse a:fontScheme. Returns undefined only when neither major nor minor font is present. */\nexport function parseFontScheme(el: XmlElement | undefined): FontSchemeOptions | undefined {\n if (!el) return undefined;\n const result: FontSchemeOptions = {};\n const name = el.attributes?.[\"name\"];\n if (name) result.name = String(name);\n const majorFont = parseFontCollection(findChild(el, \"a:majorFont\"));\n if (majorFont) result.majorFont = majorFont;\n const minorFont = parseFontCollection(findChild(el, \"a:minorFont\"));\n if (minorFont) result.minorFont = minorFont;\n return Object.keys(result).length > 0 ? result : undefined;\n}\n","/**\n * Object defaults (a:objectDefaults / CT_ObjectStyleDefaults) stringify + parse.\n *\n * Each default definition (spDef/lnDef/txDef) holds shape properties, body\n * properties, list style, and an optional shape style. Reuses core descriptors\n * so defaults round-trip through the same machinery as shapes.\n *\n * @module\n */\nimport { findChild } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport type { ReadContext, WriteContext } from \"../descriptor\";\nimport { bodyPropertiesDesc, shapePropertiesDesc, textListStyleDesc } from \"../drawing\";\nimport { parseShapeStyle, stringifyShapeStyle } from \"./style-matrix\";\nimport type { DefaultShapeDefinitionOptions, ObjectDefaultsOptions } from \"./theme-options\";\n\nfunction stringifyDefaultShapeDefinition(\n tag: string,\n opts: DefaultShapeDefinitionOptions,\n ctx: WriteContext,\n): string {\n const spPrInner = opts.shapeProperties\n ? (shapePropertiesDesc.stringify(opts.shapeProperties, ctx) ?? \"\")\n : \"\";\n const spPr = spPrInner ? `<a:spPr>${spPrInner}</a:spPr>` : \"\";\n const bodyPr = opts.bodyProperties\n ? (bodyPropertiesDesc.stringify(opts.bodyProperties, ctx) ?? \"\")\n : \"\";\n const lstStyle = opts.listStyle ? (textListStyleDesc.stringify(opts.listStyle, ctx) ?? \"\") : \"\";\n const style = opts.shapeStyle ? stringifyShapeStyle(opts.shapeStyle, ctx) : \"\";\n return `<${tag}>${spPr}${bodyPr}${lstStyle}${style}</${tag}>`;\n}\n\nfunction parseDefaultShapeDefinition(\n el: XmlElement | undefined,\n ctx: ReadContext,\n): DefaultShapeDefinitionOptions | undefined {\n if (!el) return undefined;\n const result: Partial<DefaultShapeDefinitionOptions> = {};\n const spPr = findChild(el, \"a:spPr\");\n if (spPr) {\n const shapeProperties = shapePropertiesDesc.parse(spPr, ctx);\n if (shapeProperties) result.shapeProperties = shapeProperties;\n }\n const bodyPr = findChild(el, \"a:bodyPr\");\n if (bodyPr) {\n const bodyProperties = bodyPropertiesDesc.parse(bodyPr, ctx);\n if (bodyProperties) result.bodyProperties = bodyProperties;\n }\n const lstStyle = findChild(el, \"a:lstStyle\");\n if (lstStyle) {\n const listStyle = textListStyleDesc.parse(lstStyle, ctx);\n if (listStyle) result.listStyle = listStyle;\n }\n const style = findChild(el, \"a:style\");\n if (style) {\n const shapeStyle = parseShapeStyle(style, ctx);\n if (shapeStyle) result.shapeStyle = shapeStyle;\n }\n return Object.keys(result).length > 0 ? (result as DefaultShapeDefinitionOptions) : undefined;\n}\n\n/** Serialize a:objectDefaults. Returns an empty element when no defaults set. */\nexport function stringifyObjectDefaults(\n opts: ObjectDefaultsOptions | undefined,\n ctx: WriteContext,\n): string {\n if (!opts) return \"<a:objectDefaults/>\";\n const spDef = opts.shapeDefault\n ? stringifyDefaultShapeDefinition(\"a:spDef\", opts.shapeDefault, ctx)\n : \"\";\n const lnDef = opts.lineDefault\n ? stringifyDefaultShapeDefinition(\"a:lnDef\", opts.lineDefault, ctx)\n : \"\";\n const txDef = opts.textDefault\n ? stringifyDefaultShapeDefinition(\"a:txDef\", opts.textDefault, ctx)\n : \"\";\n if (!spDef && !lnDef && !txDef) return \"<a:objectDefaults/>\";\n return `<a:objectDefaults>${spDef}${lnDef}${txDef}</a:objectDefaults>`;\n}\n\n/** Parse a:objectDefaults. */\nexport function parseObjectDefaults(\n el: XmlElement | undefined,\n ctx: ReadContext,\n): ObjectDefaultsOptions | undefined {\n if (!el) return undefined;\n const result: Partial<ObjectDefaultsOptions> = {};\n const shapeDefault = parseDefaultShapeDefinition(findChild(el, \"a:spDef\"), ctx);\n if (shapeDefault) result.shapeDefault = shapeDefault;\n const lineDefault = parseDefaultShapeDefinition(findChild(el, \"a:lnDef\"), ctx);\n if (lineDefault) result.lineDefault = lineDefault;\n const textDefault = parseDefaultShapeDefinition(findChild(el, \"a:txDef\"), ctx);\n if (textDefault) result.textDefault = textDefault;\n return Object.keys(result).length > 0 ? (result as ObjectDefaultsOptions) : undefined;\n}\n","/**\n * Build theme XML string — structured driver over the CT_BaseStyles parts.\n *\n * Fresh output stays byte-identical to Office by reusing a pre-extracted\n * default fmtScheme fragment (O(1) fast path) unless the caller supplies a\n * structured formatScheme / objectDefaults / extraColorSchemes, in which case\n * the relevant descriptor serializes them.\n *\n * @module\n */\nimport type { WriteContext } from \"../descriptor\";\nimport { stringifyColorScheme } from \"./color-scheme\";\nimport { stringifyCustomColors } from \"./custom-color\";\nimport { stringifyExtraColorSchemes } from \"./extra-color-scheme\";\nimport { stringifyFontScheme } from \"./font-scheme\";\nimport { stringifyObjectDefaults } from \"./object-defaults\";\nimport { stringifyFormatScheme } from \"./style-matrix\";\nimport type { ThemeOptions } from \"./theme-options\";\n\n// Default Office fmtScheme — byte-identical to fresh output, keeps the common\n// path O(1) without running fill/line/effect descriptors.\nconst DEFAULT_FORMAT_SCHEME_XML =\n '<a:fmtScheme name=\"Office\"><a:fillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>' +\n '<a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"110000\"/>' +\n '<a:satMod val=\"105000\"/><a:tint val=\"67000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\">' +\n '<a:lumMod val=\"105000\"/><a:satMod val=\"103000\"/><a:tint val=\"73000\"/></a:schemeClr></a:gs>' +\n '<a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:satMod val=\"109000\"/><a:tint val=\"81000\"/>' +\n '</a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill><a:gradFill rotWithShape=\"1\">' +\n '<a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"102000\"/><a:satMod val=\"103000\"/><a:tint val=\"94000\"/>' +\n '</a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"100000\"/><a:satMod val=\"110000\"/>' +\n '<a:shade val=\"100000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"99000\"/>' +\n '<a:satMod val=\"120000\"/><a:shade val=\"78000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/>' +\n '</a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w=\"6350\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill>' +\n '<a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln>' +\n '<a:ln w=\"12700\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>' +\n '<a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln><a:ln w=\"19050\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\">' +\n '<a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln>' +\n \"</a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/>\" +\n '</a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"57150\" dist=\"19050\" dir=\"5400000\" algn=\"ctr\" ' +\n 'rotWithShape=\"0\"><a:srgbClr val=\"000000\"><a:alpha val=\"63000\"/></a:srgbClr></a:outerShdw></a:effectLst>' +\n '</a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>' +\n '<a:solidFill><a:schemeClr val=\"phClr\"><a:tint val=\"95000\"/><a:satMod val=\"170000\"/></a:schemeClr></a:solidFill>' +\n '<a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"102000\"/>' +\n '<a:satMod val=\"150000\"/><a:tint val=\"93000\"/><a:shade val=\"98000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\">' +\n '<a:schemeClr val=\"phClr\"><a:lumMod val=\"103000\"/><a:satMod val=\"130000\"/><a:tint val=\"98000\"/><a:shade val=\"90000\"/>' +\n '</a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:satMod val=\"120000\"/><a:shade val=\"63000\"/>' +\n '</a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill></a:bgFillStyleLst></a:fmtScheme>';\n\nfunction requireCtx(ctx: WriteContext | undefined, field: string): WriteContext {\n if (!ctx) throw new Error(`buildThemeXml: ${field} requires a WriteContext`);\n return ctx;\n}\n\nexport function buildThemeXml(options?: ThemeOptions, ctx?: WriteContext): string {\n const opts = options ?? {};\n const name = opts.name ?? \"Office Theme\";\n\n const clrScheme = stringifyColorScheme(opts.colorScheme, name);\n const fontScheme = stringifyFontScheme(opts.fontScheme, name);\n const fmtScheme = opts.formatScheme\n ? stringifyFormatScheme(opts.formatScheme, requireCtx(ctx, \"formatScheme\"))\n : DEFAULT_FORMAT_SCHEME_XML;\n const objectDefaults = opts.objectDefaults\n ? stringifyObjectDefaults(opts.objectDefaults, requireCtx(ctx, \"objectDefaults\"))\n : \"<a:objectDefaults/>\";\n const extraClrSchemeLst = stringifyExtraColorSchemes(opts.extraColorSchemes, name);\n const custClrLst = opts.customColors\n ? stringifyCustomColors(opts.customColors, requireCtx(ctx, \"customColors\"))\n : \"\";\n\n return (\n `<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"${name}\">` +\n `<a:themeElements>${clrScheme}${fontScheme}${fmtScheme}</a:themeElements>` +\n `${objectDefaults}${extraClrSchemeLst}${custClrLst}</a:theme>`\n );\n}\n","/**\n * Theme XML generation — pure function with caching.\n *\n * Fresh output (no options) returns a pre-computed default. Simple customizations\n * (colorScheme / fontScheme only) are cached by serialized key. Complex\n * customizations (formatScheme / objectDefaults / extraColorSchemes) bypass the\n * cache — they are rare (round-trip produces a different theme each time) and\n * require a WriteContext for nested descriptors.\n *\n * @module\n */\nimport type { WriteContext } from \"../descriptor\";\nimport { buildThemeXml } from \"./build-theme-xml\";\nimport type { ThemeOptions } from \"./theme-options\";\n\n// Pre-computed default theme XML — zero allocation for the common case.\nconst DEFAULT_XML = buildThemeXml();\n\n// Cache for simple customizations, keyed by serialized options.\nconst customCache = new Map<string, string>();\n\nfunction isSimpleCustomization(opts: ThemeOptions): boolean {\n return !opts.formatScheme && !opts.objectDefaults && !opts.extraColorSchemes;\n}\n\nfunction simpleKey(o: ThemeOptions): string {\n return `${o.name ?? \"\"}|${JSON.stringify(o.colorScheme)}|${JSON.stringify(o.fontScheme)}`;\n}\n\n/**\n * Generate theme XML string from options.\n * Returns the cached default when no options are provided.\n */\nexport function createThemeXml(options?: ThemeOptions, ctx?: WriteContext): string {\n if (!options) return DEFAULT_XML;\n if (isSimpleCustomization(options)) {\n const key = simpleKey(options);\n const cached = customCache.get(key);\n if (cached) return cached;\n const built = buildThemeXml(options);\n customCache.set(key, built);\n return built;\n }\n return buildThemeXml(options, ctx);\n}\n","/**\n * Theme descriptor — bidirectional mapping between ThemeOptions and theme XML.\n *\n * stringify delegates to buildThemeXml (structured driver). parse reads the full\n * CT_BaseStyles surface: colorScheme, fontScheme, formatScheme, objectDefaults,\n * and extraClrSchemeLst — so every part round-trips.\n *\n * @module\n */\n\nimport { findChild } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport type { CustomDescriptor, ReadContext, WriteContext } from \"../descriptor\";\nimport { buildThemeXml } from \"./build-theme-xml\";\nimport { parseColorScheme } from \"./color-scheme\";\nimport { parseCustomColors } from \"./custom-color\";\nimport { parseExtraColorSchemes } from \"./extra-color-scheme\";\nimport { parseFontScheme } from \"./font-scheme\";\nimport { parseObjectDefaults } from \"./object-defaults\";\nimport { parseFormatScheme } from \"./style-matrix\";\nimport type { ThemeOptions } from \"./theme-options\";\n\nexport const themeDesc: CustomDescriptor<ThemeOptions, WriteContext, ThemeOptions> = {\n kind: \"custom\",\n\n stringify(opts: ThemeOptions, ctx: WriteContext): string | undefined {\n return buildThemeXml(opts, ctx);\n },\n\n parse(el: XmlElement, ctx: ReadContext): ThemeOptions {\n const result: Partial<ThemeOptions> = {};\n\n const name = el.attributes?.[\"name\"];\n if (name) result.name = String(name);\n\n const themeElements = findChild(el, \"a:themeElements\");\n if (themeElements) {\n const colorScheme = parseColorScheme(findChild(themeElements, \"a:clrScheme\"));\n if (colorScheme) result.colorScheme = colorScheme;\n const fontScheme = parseFontScheme(findChild(themeElements, \"a:fontScheme\"));\n if (fontScheme) result.fontScheme = fontScheme;\n const formatScheme = parseFormatScheme(findChild(themeElements, \"a:fmtScheme\"), ctx);\n if (formatScheme) result.formatScheme = formatScheme;\n }\n\n const objectDefaults = parseObjectDefaults(findChild(el, \"a:objectDefaults\"), ctx);\n if (objectDefaults) result.objectDefaults = objectDefaults;\n\n const extraColorSchemes = parseExtraColorSchemes(findChild(el, \"a:extraClrSchemeLst\"));\n if (extraColorSchemes) result.extraColorSchemes = extraColorSchemes;\n\n const customColors = parseCustomColors(findChild(el, \"a:custClrLst\"), ctx);\n if (customColors) result.customColors = customColors;\n\n return result as ThemeOptions;\n },\n};\n","/**\n * Theme override and theme manager descriptors.\n *\n * a:themeOverride (CT_BaseStylesOverride) is the root of a themeOverride{n}.xml\n * part — an optional subset of the base styles that a slide/layout/master can\n * reference to deviate from its owning theme. a:themeManager (CT_EmptyElement)\n * is the root of the legacy themeManager part; it carries no content.\n *\n * @module\n */\n\nimport { findChild } from \"@office-open/xml\";\n\nimport type { CustomDescriptor, WriteContext } from \"../descriptor\";\nimport { parseColorScheme, stringifyColorScheme } from \"./color-scheme\";\nimport { parseFontScheme, stringifyFontScheme } from \"./font-scheme\";\nimport { parseFormatScheme, stringifyFormatScheme } from \"./style-matrix\";\nimport type { ThemeOverrideOptions } from \"./theme-options\";\n\nconst THEME_NS = 'xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"';\n\nexport const themeOverrideDesc: CustomDescriptor<\n ThemeOverrideOptions,\n WriteContext,\n ThemeOverrideOptions\n> = {\n kind: \"custom\",\n\n stringify(opts, ctx) {\n let content = \"\";\n if (opts.colorScheme) {\n content += stringifyColorScheme(opts.colorScheme, opts.colorScheme.name ?? \"Override\");\n }\n if (opts.fontScheme) {\n content += stringifyFontScheme(opts.fontScheme, opts.fontScheme.name ?? \"Override\");\n }\n if (opts.formatScheme) content += stringifyFormatScheme(opts.formatScheme, ctx);\n return `<a:themeOverride ${THEME_NS}>${content}</a:themeOverride>`;\n },\n\n parse(el, ctx) {\n const result: Partial<ThemeOverrideOptions> = {};\n const colorScheme = parseColorScheme(findChild(el, \"a:clrScheme\"));\n if (colorScheme) result.colorScheme = colorScheme;\n const fontScheme = parseFontScheme(findChild(el, \"a:fontScheme\"));\n if (fontScheme) result.fontScheme = fontScheme;\n const formatScheme = parseFormatScheme(findChild(el, \"a:fmtScheme\"), ctx);\n if (formatScheme) result.formatScheme = formatScheme;\n return result as ThemeOverrideOptions;\n },\n};\n\n/** Options for a themeManager part — CT_EmptyElement has no content or attributes. */\nexport type ThemeManagerOptions = Record<never, never>;\n\nexport const themeManagerDesc: CustomDescriptor<\n ThemeManagerOptions,\n WriteContext,\n ThemeManagerOptions\n> = {\n kind: \"custom\",\n\n stringify(_opts, _ctx) {\n return `<a:themeManager ${THEME_NS}/>`;\n },\n\n parse(_el, _ctx) {\n return {};\n },\n};\n"],"mappings":"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"}