@deckflow/deckuse 1.2.1 → 1.3.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.
Files changed (282) hide show
  1. package/README.es.md +342 -0
  2. package/README.fr.md +342 -0
  3. package/README.ja.md +342 -0
  4. package/README.ko.md +342 -0
  5. package/README.md +60 -8
  6. package/README.pt-BR.md +342 -0
  7. package/README.ru.md +342 -0
  8. package/README.zh-CN.md +367 -0
  9. package/assets/default.docx +0 -0
  10. package/assets/default.pptx +0 -0
  11. package/dist/bin.js +188 -21
  12. package/dist/bin.js.map +1 -1
  13. package/dist/core/adapter.d.ts +24 -0
  14. package/dist/core/adapter.d.ts.map +1 -0
  15. package/dist/core/adapter.js +20 -0
  16. package/dist/core/adapter.js.map +1 -0
  17. package/dist/core/executor.d.ts +24 -0
  18. package/dist/core/executor.d.ts.map +1 -0
  19. package/dist/core/executor.js +65 -0
  20. package/dist/core/executor.js.map +1 -0
  21. package/dist/core/index.d.ts +7 -0
  22. package/dist/core/index.d.ts.map +1 -0
  23. package/dist/core/index.js +7 -0
  24. package/dist/core/index.js.map +1 -0
  25. package/dist/core/length.d.ts +27 -0
  26. package/dist/core/length.d.ts.map +1 -0
  27. package/dist/core/length.js +63 -0
  28. package/dist/core/length.js.map +1 -0
  29. package/dist/core/measure.d.ts +24 -0
  30. package/dist/core/measure.d.ts.map +1 -0
  31. package/dist/core/measure.js +79 -0
  32. package/dist/core/measure.js.map +1 -0
  33. package/dist/core/not-implemented.d.ts +3 -0
  34. package/dist/core/not-implemented.d.ts.map +1 -0
  35. package/dist/core/not-implemented.js +12 -0
  36. package/dist/core/not-implemented.js.map +1 -0
  37. package/dist/core/schema.d.ts +3065 -0
  38. package/dist/core/schema.d.ts.map +1 -0
  39. package/dist/core/schema.js +799 -0
  40. package/dist/core/schema.js.map +1 -0
  41. package/dist/default-template.d.ts +8 -0
  42. package/dist/default-template.d.ts.map +1 -0
  43. package/dist/default-template.js +29 -0
  44. package/dist/default-template.js.map +1 -0
  45. package/dist/docx/adapter.d.ts +29 -0
  46. package/dist/docx/adapter.d.ts.map +1 -0
  47. package/dist/docx/adapter.js +442 -0
  48. package/dist/docx/adapter.js.map +1 -0
  49. package/dist/docx/addressing.d.ts +18 -0
  50. package/dist/docx/addressing.d.ts.map +1 -0
  51. package/dist/docx/addressing.js +111 -0
  52. package/dist/docx/addressing.js.map +1 -0
  53. package/dist/docx/blank.d.ts +4 -0
  54. package/dist/docx/blank.d.ts.map +1 -0
  55. package/dist/docx/blank.js +75 -0
  56. package/dist/docx/blank.js.map +1 -0
  57. package/dist/docx/index-sync.d.ts +7 -0
  58. package/dist/docx/index-sync.d.ts.map +1 -0
  59. package/dist/docx/index-sync.js +24 -0
  60. package/dist/docx/index-sync.js.map +1 -0
  61. package/dist/docx/index.d.ts +5 -0
  62. package/dist/docx/index.d.ts.map +1 -0
  63. package/dist/docx/index.js +4 -0
  64. package/dist/docx/index.js.map +1 -0
  65. package/dist/docx/indexer.d.ts +41 -0
  66. package/dist/docx/indexer.d.ts.map +1 -0
  67. package/dist/docx/indexer.js +353 -0
  68. package/dist/docx/indexer.js.map +1 -0
  69. package/dist/docx/mutations.d.ts +5 -0
  70. package/dist/docx/mutations.d.ts.map +1 -0
  71. package/dist/docx/mutations.js +311 -0
  72. package/dist/docx/mutations.js.map +1 -0
  73. package/dist/docx/paragraphs.d.ts +26 -0
  74. package/dist/docx/paragraphs.d.ts.map +1 -0
  75. package/dist/docx/paragraphs.js +314 -0
  76. package/dist/docx/paragraphs.js.map +1 -0
  77. package/dist/docx/properties.d.ts +23 -0
  78. package/dist/docx/properties.d.ts.map +1 -0
  79. package/dist/docx/properties.js +414 -0
  80. package/dist/docx/properties.js.map +1 -0
  81. package/dist/docx/tables.d.ts +4 -0
  82. package/dist/docx/tables.d.ts.map +1 -0
  83. package/dist/docx/tables.js +64 -0
  84. package/dist/docx/tables.js.map +1 -0
  85. package/dist/docx/text-spans.d.ts +25 -0
  86. package/dist/docx/text-spans.d.ts.map +1 -0
  87. package/dist/docx/text-spans.js +142 -0
  88. package/dist/docx/text-spans.js.map +1 -0
  89. package/dist/docx/types.d.ts +27 -0
  90. package/dist/docx/types.d.ts.map +1 -0
  91. package/dist/docx/types.js +2 -0
  92. package/dist/docx/types.js.map +1 -0
  93. package/dist/docx/workspace.d.ts +20 -0
  94. package/dist/docx/workspace.d.ts.map +1 -0
  95. package/dist/docx/workspace.js +145 -0
  96. package/dist/docx/workspace.js.map +1 -0
  97. package/dist/docx/xml.d.ts +18 -0
  98. package/dist/docx/xml.d.ts.map +1 -0
  99. package/dist/docx/xml.js +87 -0
  100. package/dist/docx/xml.js.map +1 -0
  101. package/dist/edition-config/index.d.ts +25 -0
  102. package/dist/edition-config/index.d.ts.map +1 -0
  103. package/dist/edition-config/index.js +22 -0
  104. package/dist/edition-config/index.js.map +1 -0
  105. package/dist/edition.d.ts +2 -2
  106. package/dist/edition.d.ts.map +1 -1
  107. package/dist/edition.js +1 -1
  108. package/dist/edition.js.map +1 -1
  109. package/dist/help.d.ts.map +1 -1
  110. package/dist/help.js +124 -32
  111. package/dist/help.js.map +1 -1
  112. package/dist/index.d.ts +1 -1
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.js +6 -6
  115. package/dist/index.js.map +1 -1
  116. package/dist/key/index.d.ts +2 -0
  117. package/dist/key/index.d.ts.map +1 -0
  118. package/dist/key/index.js +3 -0
  119. package/dist/key/index.js.map +1 -0
  120. package/dist/monitor-daemon.d.ts +21 -8
  121. package/dist/monitor-daemon.d.ts.map +1 -1
  122. package/dist/monitor-daemon.js +189 -51
  123. package/dist/monitor-daemon.js.map +1 -1
  124. package/dist/monitor-registry.d.ts +34 -0
  125. package/dist/monitor-registry.d.ts.map +1 -0
  126. package/dist/monitor-registry.js +191 -0
  127. package/dist/monitor-registry.js.map +1 -0
  128. package/dist/monitor.d.ts.map +1 -1
  129. package/dist/monitor.js +2 -12
  130. package/dist/monitor.js.map +1 -1
  131. package/dist/numbers/index.d.ts +2 -0
  132. package/dist/numbers/index.d.ts.map +1 -0
  133. package/dist/numbers/index.js +3 -0
  134. package/dist/numbers/index.js.map +1 -0
  135. package/dist/opc/index.d.ts +96 -0
  136. package/dist/opc/index.d.ts.map +1 -0
  137. package/dist/opc/index.js +596 -0
  138. package/dist/opc/index.js.map +1 -0
  139. package/dist/pptx/adapter.d.ts +167 -0
  140. package/dist/pptx/adapter.d.ts.map +1 -0
  141. package/dist/pptx/adapter.js +841 -0
  142. package/dist/pptx/adapter.js.map +1 -0
  143. package/dist/pptx/addressing.d.ts +47 -0
  144. package/dist/pptx/addressing.d.ts.map +1 -0
  145. package/dist/pptx/addressing.js +481 -0
  146. package/dist/pptx/addressing.js.map +1 -0
  147. package/dist/pptx/align.d.ts +24 -0
  148. package/dist/pptx/align.d.ts.map +1 -0
  149. package/dist/pptx/align.js +112 -0
  150. package/dist/pptx/align.js.map +1 -0
  151. package/dist/pptx/chart-classify.d.ts +10 -0
  152. package/dist/pptx/chart-classify.d.ts.map +1 -0
  153. package/dist/pptx/chart-classify.js +58 -0
  154. package/dist/pptx/chart-classify.js.map +1 -0
  155. package/dist/pptx/chart.d.ts +42 -0
  156. package/dist/pptx/chart.d.ts.map +1 -0
  157. package/dist/pptx/chart.js +614 -0
  158. package/dist/pptx/chart.js.map +1 -0
  159. package/dist/pptx/edition-extension.d.ts +25 -0
  160. package/dist/pptx/edition-extension.d.ts.map +1 -0
  161. package/dist/pptx/edition-extension.js +10 -0
  162. package/dist/pptx/edition-extension.js.map +1 -0
  163. package/dist/pptx/edition.d.ts +20 -0
  164. package/dist/pptx/edition.d.ts.map +1 -0
  165. package/dist/pptx/edition.js +69 -0
  166. package/dist/pptx/edition.js.map +1 -0
  167. package/dist/pptx/elements.d.ts +12 -0
  168. package/dist/pptx/elements.d.ts.map +1 -0
  169. package/dist/pptx/elements.js +224 -0
  170. package/dist/pptx/elements.js.map +1 -0
  171. package/dist/pptx/hyperlink.d.ts +7 -0
  172. package/dist/pptx/hyperlink.d.ts.map +1 -0
  173. package/dist/pptx/hyperlink.js +81 -0
  174. package/dist/pptx/hyperlink.js.map +1 -0
  175. package/dist/pptx/index-sync.d.ts +7 -0
  176. package/dist/pptx/index-sync.d.ts.map +1 -0
  177. package/dist/pptx/index-sync.js +24 -0
  178. package/dist/pptx/index-sync.js.map +1 -0
  179. package/dist/pptx/index.d.ts +10 -0
  180. package/dist/pptx/index.d.ts.map +1 -0
  181. package/dist/pptx/index.js +7 -0
  182. package/dist/pptx/index.js.map +1 -0
  183. package/dist/pptx/indexer.d.ts +19 -0
  184. package/dist/pptx/indexer.d.ts.map +1 -0
  185. package/dist/pptx/indexer.js +320 -0
  186. package/dist/pptx/indexer.js.map +1 -0
  187. package/dist/pptx/layout-ref.d.ts +41 -0
  188. package/dist/pptx/layout-ref.d.ts.map +1 -0
  189. package/dist/pptx/layout-ref.js +145 -0
  190. package/dist/pptx/layout-ref.js.map +1 -0
  191. package/dist/pptx/media.d.ts +15 -0
  192. package/dist/pptx/media.d.ts.map +1 -0
  193. package/dist/pptx/media.js +145 -0
  194. package/dist/pptx/media.js.map +1 -0
  195. package/dist/pptx/mutations.d.ts +11 -0
  196. package/dist/pptx/mutations.d.ts.map +1 -0
  197. package/dist/pptx/mutations.js +1114 -0
  198. package/dist/pptx/mutations.js.map +1 -0
  199. package/dist/pptx/picture.d.ts +25 -0
  200. package/dist/pptx/picture.d.ts.map +1 -0
  201. package/dist/pptx/picture.js +118 -0
  202. package/dist/pptx/picture.js.map +1 -0
  203. package/dist/pptx/placeholder-role.d.ts +19 -0
  204. package/dist/pptx/placeholder-role.d.ts.map +1 -0
  205. package/dist/pptx/placeholder-role.js +71 -0
  206. package/dist/pptx/placeholder-role.js.map +1 -0
  207. package/dist/pptx/properties.d.ts +13 -0
  208. package/dist/pptx/properties.d.ts.map +1 -0
  209. package/dist/pptx/properties.js +587 -0
  210. package/dist/pptx/properties.js.map +1 -0
  211. package/dist/pptx/resolve-properties.d.ts +17 -0
  212. package/dist/pptx/resolve-properties.d.ts.map +1 -0
  213. package/dist/pptx/resolve-properties.js +623 -0
  214. package/dist/pptx/resolve-properties.js.map +1 -0
  215. package/dist/pptx/slide-size.d.ts +9 -0
  216. package/dist/pptx/slide-size.d.ts.map +1 -0
  217. package/dist/pptx/slide-size.js +29 -0
  218. package/dist/pptx/slide-size.js.map +1 -0
  219. package/dist/pptx/slides.d.ts +15 -0
  220. package/dist/pptx/slides.d.ts.map +1 -0
  221. package/dist/pptx/slides.js +247 -0
  222. package/dist/pptx/slides.js.map +1 -0
  223. package/dist/pptx/table-measure.d.ts +43 -0
  224. package/dist/pptx/table-measure.d.ts.map +1 -0
  225. package/dist/pptx/table-measure.js +70 -0
  226. package/dist/pptx/table-measure.js.map +1 -0
  227. package/dist/pptx/table.d.ts +26 -0
  228. package/dist/pptx/table.d.ts.map +1 -0
  229. package/dist/pptx/table.js +638 -0
  230. package/dist/pptx/table.js.map +1 -0
  231. package/dist/pptx/types.d.ts +27 -0
  232. package/dist/pptx/types.d.ts.map +1 -0
  233. package/dist/pptx/types.js +2 -0
  234. package/dist/pptx/types.js.map +1 -0
  235. package/dist/pptx/workspace.d.ts +23 -0
  236. package/dist/pptx/workspace.d.ts.map +1 -0
  237. package/dist/pptx/workspace.js +148 -0
  238. package/dist/pptx/workspace.js.map +1 -0
  239. package/dist/pptx/xml.d.ts +75 -0
  240. package/dist/pptx/xml.d.ts.map +1 -0
  241. package/dist/pptx/xml.js +390 -0
  242. package/dist/pptx/xml.js.map +1 -0
  243. package/dist/render.d.ts.map +1 -1
  244. package/dist/render.js +14 -2
  245. package/dist/render.js.map +1 -1
  246. package/dist/version.d.ts +1 -1
  247. package/dist/version.js +1 -1
  248. package/dist/workspace/git.d.ts +7 -0
  249. package/dist/workspace/git.d.ts.map +1 -0
  250. package/dist/workspace/git.js +119 -0
  251. package/dist/workspace/git.js.map +1 -0
  252. package/dist/workspace/index.d.ts +7 -0
  253. package/dist/workspace/index.d.ts.map +1 -0
  254. package/dist/workspace/index.js +7 -0
  255. package/dist/workspace/index.js.map +1 -0
  256. package/dist/workspace/lock.d.ts +5 -0
  257. package/dist/workspace/lock.d.ts.map +1 -0
  258. package/dist/workspace/lock.js +104 -0
  259. package/dist/workspace/lock.js.map +1 -0
  260. package/dist/workspace/metadata.d.ts +4 -0
  261. package/dist/workspace/metadata.d.ts.map +1 -0
  262. package/dist/workspace/metadata.js +21 -0
  263. package/dist/workspace/metadata.js.map +1 -0
  264. package/dist/workspace/operations.d.ts +14 -0
  265. package/dist/workspace/operations.d.ts.map +1 -0
  266. package/dist/workspace/operations.js +35 -0
  267. package/dist/workspace/operations.js.map +1 -0
  268. package/dist/workspace/paths.d.ts +11 -0
  269. package/dist/workspace/paths.d.ts.map +1 -0
  270. package/dist/workspace/paths.js +12 -0
  271. package/dist/workspace/paths.js.map +1 -0
  272. package/dist/workspace/revision.d.ts +6 -0
  273. package/dist/workspace/revision.d.ts.map +1 -0
  274. package/dist/workspace/revision.js +15 -0
  275. package/dist/workspace/revision.js.map +1 -0
  276. package/dist/xlsx/index.d.ts +2 -0
  277. package/dist/xlsx/index.d.ts.map +1 -0
  278. package/dist/xlsx/index.js +3 -0
  279. package/dist/xlsx/index.js.map +1 -0
  280. package/package.json +51 -27
  281. package/schema/command.schema.json +2405 -0
  282. package/dist/.tsbuildinfo +0 -1
@@ -0,0 +1,614 @@
1
+ import { posix } from 'node:path';
2
+ import { NS, REL, children, descendants, first, setNodeText } from './xml.js';
3
+ const CHART_CT = 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml';
4
+ /** Default series fills — readable on both light and dark slide backgrounds. */
5
+ export const DEFAULT_SERIES_COLORS = [
6
+ '5B8DEF',
7
+ 'F0A500',
8
+ '2ECC71',
9
+ 'E74C3C',
10
+ '9B59B6',
11
+ '1ABC9C',
12
+ ];
13
+ const esc = (value) => value.replaceAll('&', '&amp;').replaceAll('"', '&quot;').replaceAll('<', '&lt;');
14
+ export const normalizeHexColor = (value) => {
15
+ const hex = value.trim().replace(/^#/, '').toUpperCase();
16
+ if (!/^[0-9A-F]{6}$/.test(hex))
17
+ throw new Error(`Invalid color: ${value}`);
18
+ return hex;
19
+ };
20
+ const nextChartPart = (archive) => {
21
+ let n = 1;
22
+ while (archive.getPart(`/ppt/charts/chart${String(n)}.xml`))
23
+ n++;
24
+ return `/ppt/charts/chart${String(n)}.xml`;
25
+ };
26
+ const nextRid = (rels) => {
27
+ let n = 1;
28
+ const ids = new Set(rels.map((r) => r.id));
29
+ while (ids.has(`rId${String(n)}`))
30
+ n++;
31
+ return `rId${String(n)}`;
32
+ };
33
+ const relativeTarget = (source, target) => posix.relative(posix.dirname(source), target).replace(/^\//, '');
34
+ const directChild = (node, localName) => children(node).find((child) => child.localName === localName);
35
+ /** Literal string points for c:strLit (not nested c:strCache — that belongs under c:strRef). */
36
+ const strLitPoints = (values) => `<c:ptCount val="${String(values.length)}"/>${values
37
+ .map((v, i) => `<c:pt idx="${String(i)}"><c:v>${esc(v)}</c:v></c:pt>`)
38
+ .join('')}`;
39
+ /** Literal number points for c:numLit (not nested c:numCache — that belongs under c:numRef). */
40
+ const numLitPoints = (values, formatCode = 'General') => `<c:formatCode>${esc(formatCode)}</c:formatCode><c:ptCount val="${String(values.length)}"/>${values
41
+ .map((v, i) => `<c:pt idx="${String(i)}"><c:v>${String(v)}</c:v></c:pt>`)
42
+ .join('')}`;
43
+ const seriesSpPrXml = (color) => `<c:spPr><a:solidFill><a:srgbClr val="${color}"/></a:solidFill><a:ln><a:noFill/></a:ln></c:spPr>`;
44
+ const dLblsXml = (show) => `<c:dLbls><c:showLegendKey val="0"/><c:showVal val="${show ? '1' : '0'}"/><c:showCatName val="0"/><c:showSerName val="0"/><c:showPercent val="0"/><c:showBubbleSize val="0"/></c:dLbls>`;
45
+ const seriesXml = (series, categories, options = {}) => series
46
+ .map((ser, localIndex) => {
47
+ const index = (options.startIndex ?? 0) + localIndex;
48
+ const cats = categories.length > 0
49
+ ? `<c:cat><c:strLit>${strLitPoints(categories)}</c:strLit></c:cat>`
50
+ : '';
51
+ const vals = `<c:val><c:numLit>${numLitPoints(ser.values, options.formatCode)}</c:numLit></c:val>`;
52
+ const tx = `<c:tx><c:v>${esc(ser.name)}</c:v></c:tx>`;
53
+ const color = ser.color
54
+ ? normalizeHexColor(ser.color)
55
+ : DEFAULT_SERIES_COLORS[index % DEFAULT_SERIES_COLORS.length];
56
+ return `<c:ser><c:idx val="${String(index)}"/><c:order val="${String(index)}"/>${tx}${seriesSpPrXml(color)}${cats}${vals}</c:ser>`;
57
+ })
58
+ .join('');
59
+ const plotXml = (chartType, series, categories, showDataLabels, formatCode) => {
60
+ if (chartType === 'combo') {
61
+ const barSeries = series.filter((s) => (s.chart ?? 'column') !== 'line');
62
+ const lineSeries = series.filter((s) => (s.chart ?? 'column') === 'line');
63
+ const barDir = barSeries.some((s) => s.chart === 'bar') ? 'bar' : 'col';
64
+ const primaryBar = barSeries.filter((s) => (s.axis ?? 'primary') === 'primary');
65
+ const secondaryBar = barSeries.filter((s) => s.axis === 'secondary');
66
+ const primaryLine = lineSeries.filter((s) => (s.axis ?? 'primary') === 'primary');
67
+ const secondaryLine = lineSeries.filter((s) => s.axis === 'secondary');
68
+ // Put bar on primary (ax 1/2), line typically secondary (ax 1/3) when dual axis requested.
69
+ const useSecondary = secondaryBar.length + secondaryLine.length > 0 || lineSeries.length > 0;
70
+ let nextIdx = 0;
71
+ const take = (list) => {
72
+ const opts = { startIndex: nextIdx };
73
+ if (formatCode !== undefined)
74
+ opts.formatCode = formatCode;
75
+ const xml = seriesXml(list, categories, opts);
76
+ nextIdx += list.length;
77
+ return xml;
78
+ };
79
+ const barPrimary = take(primaryBar.length ? primaryBar : barSeries);
80
+ const lineOnSecondary = useSecondary
81
+ ? take(secondaryLine.length ? secondaryLine : lineSeries)
82
+ : '';
83
+ const leftoverLine = !useSecondary ? take(primaryLine) : '';
84
+ const leftoverBarSec = take(secondaryBar);
85
+ const barChart = primaryBar.length || barSeries.length
86
+ ? `<c:barChart><c:barDir val="${barDir}"/><c:grouping val="clustered"/>${barPrimary}${leftoverBarSec}${dLblsXml(showDataLabels)}<c:gapWidth val="100"/><c:overlap val="0"/><c:axId val="1"/><c:axId val="2"/></c:barChart>`
87
+ : '';
88
+ const lineAxId = useSecondary ? '3' : '2';
89
+ const lineChart = lineSeries.length > 0
90
+ ? `<c:lineChart><c:grouping val="standard"/>${useSecondary ? lineOnSecondary : leftoverLine}<c:marker val="1"/>${dLblsXml(showDataLabels)}<c:axId val="1"/><c:axId val="${lineAxId}"/></c:lineChart>`
91
+ : '';
92
+ return `${barChart}${lineChart}`;
93
+ }
94
+ const ser = seriesXml(series, categories, formatCode !== undefined ? { formatCode } : {});
95
+ if (chartType === 'pie') {
96
+ return `<c:pieChart><c:varyColors val="1"/>${ser}${dLblsXml(showDataLabels)}</c:pieChart>`;
97
+ }
98
+ if (chartType === 'line') {
99
+ return `<c:lineChart><c:grouping val="standard"/>${ser}<c:marker val="1"/>${dLblsXml(showDataLabels)}<c:axId val="1"/><c:axId val="2"/></c:lineChart>`;
100
+ }
101
+ const barDir = chartType === 'bar' ? 'bar' : 'col';
102
+ return `<c:barChart><c:barDir val="${barDir}"/><c:grouping val="clustered"/>${ser}${dLblsXml(showDataLabels)}<c:gapWidth val="100"/><c:overlap val="0"/><c:axId val="1"/><c:axId val="2"/></c:barChart>`;
103
+ };
104
+ const axesXml = (chartType, series, formatCode) => {
105
+ if (chartType === 'pie')
106
+ return '';
107
+ const numFmt = formatCode && formatCode !== 'General'
108
+ ? `<c:numFmt formatCode="${esc(formatCode)}" sourceLinked="0"/>`
109
+ : '';
110
+ if (chartType === 'combo') {
111
+ const needsSecondary = series.some((s) => s.axis === 'secondary') ||
112
+ series.some((s) => (s.chart ?? 'column') === 'line');
113
+ const primary = `<c:catAx><c:axId val="1"/><c:scaling><c:orientation val="minMax"/></c:scaling><c:delete val="0"/><c:axPos val="b"/><c:tickLblPos val="nextTo"/><c:crossAx val="2"/></c:catAx><c:valAx><c:axId val="2"/><c:scaling><c:orientation val="minMax"/></c:scaling><c:delete val="0"/><c:axPos val="l"/><c:majorGridlines/><c:tickLblPos val="nextTo"/>${numFmt}<c:crossAx val="1"/></c:valAx>`;
114
+ if (!needsSecondary)
115
+ return primary;
116
+ return `${primary}<c:valAx><c:axId val="3"/><c:scaling><c:orientation val="minMax"/></c:scaling><c:delete val="0"/><c:axPos val="r"/><c:tickLblPos val="nextTo"/>${numFmt}<c:crossAx val="1"/><c:crosses val="max"/></c:valAx>`;
117
+ }
118
+ return `<c:catAx><c:axId val="1"/><c:scaling><c:orientation val="minMax"/></c:scaling><c:delete val="0"/><c:axPos val="b"/><c:tickLblPos val="nextTo"/><c:crossAx val="2"/></c:catAx><c:valAx><c:axId val="2"/><c:scaling><c:orientation val="minMax"/></c:scaling><c:delete val="0"/><c:axPos val="l"/><c:majorGridlines/><c:tickLblPos val="nextTo"/>${numFmt}<c:crossAx val="1"/></c:valAx>`;
119
+ };
120
+ const titleXml = (title) => {
121
+ if (!title)
122
+ return '<c:autoTitleDeleted val="1"/>';
123
+ return `<c:title><c:tx><c:rich><a:bodyPr/><a:lstStyle/><a:p><a:pPr><a:defRPr/></a:pPr><a:r><a:rPr lang="en-US"/><a:t>${esc(title)}</a:t></a:r></a:p></c:rich></c:tx><c:overlay val="0"/></c:title><c:autoTitleDeleted val="0"/>`;
124
+ };
125
+ export function buildChartXml(input) {
126
+ const categories = input.categories;
127
+ const series = input.series;
128
+ const showDataLabels = input.showDataLabels === true;
129
+ const formatCode = input.valueFormatCode;
130
+ const legend = input.chartType === 'pie'
131
+ ? ''
132
+ : '<c:legend><c:legendPos val="b"/><c:overlay val="0"/></c:legend>';
133
+ return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><c:chartSpace xmlns:c="${NS.c}" xmlns:a="${NS.a}" xmlns:r="${NS.r}"><c:chart>${titleXml(input.title)}<c:plotArea><c:layout/>${plotXml(input.chartType, series, categories, showDataLabels, formatCode)}${axesXml(input.chartType, series, formatCode)}</c:plotArea>${legend}<c:plotVisOnly val="1"/></c:chart></c:chartSpace>`;
134
+ }
135
+ export function createChartPart(archive, slidePart, input) {
136
+ const chartPart = nextChartPart(archive);
137
+ const xml = buildChartXml(input);
138
+ archive.setPart(chartPart, new TextEncoder().encode(xml), CHART_CT);
139
+ const rels = [...archive.getRelationships(slidePart)];
140
+ const rid = nextRid(rels);
141
+ rels.push({
142
+ id: rid,
143
+ type: REL.chart,
144
+ target: relativeTarget(slidePart, chartPart),
145
+ external: false,
146
+ resolvedTarget: chartPart,
147
+ });
148
+ archive.setRelationships(slidePart, rels);
149
+ return { chartPart, rid };
150
+ }
151
+ export const chartGraphicFrameXml = (id, rid, e) => {
152
+ const name = typeof e['name'] === 'string' && e['name'].length > 0 ? e['name'] : `Chart ${String(id)}`;
153
+ const x = typeof e['x'] === 'number' ? e['x'] : 0;
154
+ const y = typeof e['y'] === 'number' ? e['y'] : 0;
155
+ const width = typeof e['width'] === 'number' ? e['width'] : 914400 * 4;
156
+ const height = typeof e['height'] === 'number' ? e['height'] : 914400 * 3;
157
+ return `<p:graphicFrame xmlns:p="${NS.p}" xmlns:a="${NS.a}" xmlns:r="${NS.r}" xmlns:c="${NS.c}"><p:nvGraphicFramePr><p:cNvPr id="${String(id)}" name="${esc(name)}"/><p:cNvGraphicFramePr/><p:nvPr/></p:nvGraphicFramePr><p:xfrm><a:off x="${String(x)}" y="${String(y)}"/><a:ext cx="${String(width)}" cy="${String(height)}"/></p:xfrm><a:graphic><a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/chart"><c:chart xmlns:c="${NS.c}" xmlns:r="${NS.r}" r:id="${rid}"/></a:graphicData></a:graphic></p:graphicFrame>`;
158
+ };
159
+ const ensureChild = (parent, localName, ns, qualified, afterLocalNames = []) => {
160
+ const existing = directChild(parent, localName);
161
+ if (existing)
162
+ return existing;
163
+ const doc = parent.ownerDocument;
164
+ if (!doc)
165
+ throw new Error('Element has no document');
166
+ const created = doc.createElementNS(ns, qualified);
167
+ const kids = children(parent);
168
+ let anchor;
169
+ for (const child of kids)
170
+ if (child.localName && afterLocalNames.includes(child.localName))
171
+ anchor = child;
172
+ if (anchor?.nextSibling)
173
+ parent.insertBefore(created, anchor.nextSibling);
174
+ else if (anchor)
175
+ parent.appendChild(created);
176
+ else
177
+ parent.appendChild(created);
178
+ return created;
179
+ };
180
+ const setSolidOnRPr = (rPr, color) => {
181
+ const doc = rPr.ownerDocument;
182
+ if (!doc)
183
+ throw new Error('Element has no document');
184
+ for (const child of [...children(rPr)])
185
+ if (child.localName === 'solidFill' || child.localName === 'schemeClr')
186
+ rPr.removeChild(child);
187
+ const solid = doc.createElementNS(NS.a, 'a:solidFill');
188
+ const srgb = doc.createElementNS(NS.a, 'a:srgbClr');
189
+ srgb.setAttribute('val', color);
190
+ solid.appendChild(srgb);
191
+ if (rPr.firstChild)
192
+ rPr.insertBefore(solid, rPr.firstChild);
193
+ else
194
+ rPr.appendChild(solid);
195
+ };
196
+ const buildTxPr = (doc, color) => {
197
+ const txPr = doc.createElementNS(NS.c, 'c:txPr');
198
+ const bodyPr = doc.createElementNS(NS.a, 'a:bodyPr');
199
+ const lstStyle = doc.createElementNS(NS.a, 'a:lstStyle');
200
+ const p = doc.createElementNS(NS.a, 'a:p');
201
+ const pPr = doc.createElementNS(NS.a, 'a:pPr');
202
+ const defRPr = doc.createElementNS(NS.a, 'a:defRPr');
203
+ defRPr.setAttribute('sz', '1100');
204
+ setSolidOnRPr(defRPr, color);
205
+ pPr.appendChild(defRPr);
206
+ p.appendChild(pPr);
207
+ const end = doc.createElementNS(NS.a, 'a:endParaRPr');
208
+ end.setAttribute('sz', '1100');
209
+ setSolidOnRPr(end, color);
210
+ p.appendChild(end);
211
+ txPr.appendChild(bodyPr);
212
+ txPr.appendChild(lstStyle);
213
+ txPr.appendChild(p);
214
+ return txPr;
215
+ };
216
+ /** Apply text color to title runs, legend, and axis tick labels. */
217
+ export function applyChartTextColor(chartDoc, colorInput) {
218
+ const color = normalizeHexColor(colorInput);
219
+ const title = first(chartDoc, 'title');
220
+ if (title) {
221
+ for (const rPr of descendants(title, 'rPr'))
222
+ setSolidOnRPr(rPr, color);
223
+ for (const defRPr of descendants(title, 'defRPr'))
224
+ setSolidOnRPr(defRPr, color);
225
+ }
226
+ const doc = chartDoc;
227
+ for (const local of ['legend', 'catAx', 'valAx']) {
228
+ for (const node of descendants(chartDoc, local)) {
229
+ const existing = directChild(node, 'txPr');
230
+ if (existing)
231
+ existing.parentNode?.removeChild(existing);
232
+ // Repair tickLblPos placed after crossAx (invalid CT_CatAx / CT_ValAx order).
233
+ const tickLblPos = directChild(node, 'tickLblPos');
234
+ const crossAxExisting = directChild(node, 'crossAx');
235
+ if (tickLblPos && crossAxExisting) {
236
+ const kids = children(node);
237
+ if (kids.indexOf(tickLblPos) > kids.indexOf(crossAxExisting)) {
238
+ node.removeChild(tickLblPos);
239
+ node.insertBefore(tickLblPos, crossAxExisting);
240
+ }
241
+ }
242
+ const txPr = buildTxPr(doc, color);
243
+ // CT_CatAx/CT_ValAx: txPr sits after tickLblPos/spPr and before crossAx.
244
+ // CT_Legend: txPr is last before extLst — append is fine.
245
+ const crossAx = directChild(node, 'crossAx');
246
+ if (crossAx)
247
+ node.insertBefore(txPr, crossAx);
248
+ else
249
+ node.appendChild(txPr);
250
+ }
251
+ }
252
+ }
253
+ export function applyChartGapWidth(chartDoc, gapWidth) {
254
+ if (!Number.isFinite(gapWidth) || gapWidth < 0)
255
+ throw new Error(`gapWidth must be a non-negative number, got ${String(gapWidth)}`);
256
+ const val = String(Math.round(gapWidth));
257
+ for (const plot of [
258
+ ...descendants(chartDoc, 'barChart'),
259
+ ...descendants(chartDoc, 'lineChart'),
260
+ ]) {
261
+ // After ser* / dLbls so gapWidth stays ahead of overlap / axId.
262
+ const gap = ensureChild(plot, 'gapWidth', NS.c, 'c:gapWidth', [
263
+ 'barDir',
264
+ 'grouping',
265
+ 'varyColors',
266
+ 'ser',
267
+ 'dLbls',
268
+ ]);
269
+ gap.setAttribute('val', val);
270
+ // Repair charts that still have gapWidth before ser (invalid CT_BarChart order).
271
+ const kids = children(plot);
272
+ const gapIndex = kids.indexOf(gap);
273
+ let lastSerOrDlbls = -1;
274
+ for (let i = 0; i < kids.length; i++) {
275
+ const name = kids[i]?.localName;
276
+ if (name === 'ser' || name === 'dLbls')
277
+ lastSerOrDlbls = i;
278
+ }
279
+ if (lastSerOrDlbls >= 0 && gapIndex >= 0 && gapIndex < lastSerOrDlbls) {
280
+ const anchor = kids[lastSerOrDlbls];
281
+ plot.removeChild(gap);
282
+ if (anchor.nextSibling)
283
+ plot.insertBefore(gap, anchor.nextSibling);
284
+ else
285
+ plot.appendChild(gap);
286
+ }
287
+ }
288
+ }
289
+ export function applyChartBackground(chartDoc, colorInput) {
290
+ const color = normalizeHexColor(colorInput);
291
+ const root = chartDoc.documentElement;
292
+ if (!root)
293
+ throw new Error('Chart XML has no root');
294
+ let spPr = directChild(root, 'spPr');
295
+ if (!spPr) {
296
+ spPr = chartDoc.createElementNS(NS.c, 'c:spPr');
297
+ // chartSpace children order: date1904?, lang?, roundedCorners?, style?, colorStyle?,
298
+ // clrMapOvr?, pivotSource?, protection?, chart, spPr, txPr, externalData, ...
299
+ const chart = directChild(root, 'chart');
300
+ if (chart?.nextSibling)
301
+ root.insertBefore(spPr, chart.nextSibling);
302
+ else if (chart)
303
+ root.appendChild(spPr);
304
+ else
305
+ root.appendChild(spPr);
306
+ }
307
+ for (const child of [...children(spPr)])
308
+ if (child.localName === 'solidFill' ||
309
+ child.localName === 'gradFill' ||
310
+ child.localName === 'noFill' ||
311
+ child.localName === 'pattFill')
312
+ spPr.removeChild(child);
313
+ const solid = chartDoc.createElementNS(NS.a, 'a:solidFill');
314
+ const srgb = chartDoc.createElementNS(NS.a, 'a:srgbClr');
315
+ srgb.setAttribute('val', color);
316
+ solid.appendChild(srgb);
317
+ if (spPr.firstChild)
318
+ spPr.insertBefore(solid, spPr.firstChild);
319
+ else
320
+ spPr.appendChild(solid);
321
+ }
322
+ export function applyChartMajorGridlines(chartDoc, show, color = 'FFFFFF') {
323
+ const line = normalizeHexColor(color.startsWith('#') ? color : `#${color}`);
324
+ for (const ax of descendants(chartDoc, 'valAx')) {
325
+ const existing = directChild(ax, 'majorGridlines');
326
+ if (show) {
327
+ if (existing)
328
+ existing.parentNode?.removeChild(existing);
329
+ const grid = chartDoc.createElementNS(NS.c, 'c:majorGridlines');
330
+ const spPr = chartDoc.createElementNS(NS.c, 'c:spPr');
331
+ const ln = chartDoc.createElementNS(NS.a, 'a:ln');
332
+ ln.setAttribute('w', '6350');
333
+ const solid = chartDoc.createElementNS(NS.a, 'a:solidFill');
334
+ const srgb = chartDoc.createElementNS(NS.a, 'a:srgbClr');
335
+ srgb.setAttribute('val', line);
336
+ const alpha = chartDoc.createElementNS(NS.a, 'a:alpha');
337
+ alpha.setAttribute('val', line === 'FFFFFF' ? '25000' : '35000');
338
+ srgb.appendChild(alpha);
339
+ solid.appendChild(srgb);
340
+ ln.appendChild(solid);
341
+ spPr.appendChild(ln);
342
+ grid.appendChild(spPr);
343
+ const after = directChild(ax, 'axPos') ?? directChild(ax, 'delete');
344
+ if (after?.nextSibling)
345
+ ax.insertBefore(grid, after.nextSibling);
346
+ else if (after)
347
+ ax.appendChild(grid);
348
+ else
349
+ ax.appendChild(grid);
350
+ }
351
+ else if (existing) {
352
+ existing.parentNode?.removeChild(existing);
353
+ }
354
+ }
355
+ }
356
+ const valueCache = (ser) => {
357
+ const val = directChild(ser, 'val') ?? first(ser, 'val');
358
+ if (!val)
359
+ return undefined;
360
+ return (directChild(val, 'numLit') ??
361
+ first(val, 'numLit') ??
362
+ directChild(val, 'numCache') ??
363
+ first(val, 'numCache'));
364
+ };
365
+ const setSeriesColor = (ser, colorInput) => {
366
+ const color = normalizeHexColor(colorInput);
367
+ const doc = ser.ownerDocument;
368
+ if (!doc)
369
+ throw new Error('Element has no document');
370
+ let spPr = directChild(ser, 'spPr');
371
+ if (!spPr) {
372
+ spPr = doc.createElementNS(NS.c, 'c:spPr');
373
+ const after = directChild(ser, 'tx') ?? directChild(ser, 'order') ?? directChild(ser, 'idx');
374
+ if (after?.nextSibling)
375
+ ser.insertBefore(spPr, after.nextSibling);
376
+ else if (after)
377
+ ser.appendChild(spPr);
378
+ else
379
+ ser.appendChild(spPr);
380
+ }
381
+ for (const child of [...children(spPr)])
382
+ if (child.localName === 'solidFill' ||
383
+ child.localName === 'gradFill' ||
384
+ child.localName === 'noFill' ||
385
+ child.localName === 'pattFill')
386
+ spPr.removeChild(child);
387
+ const solid = doc.createElementNS(NS.a, 'a:solidFill');
388
+ const srgb = doc.createElementNS(NS.a, 'a:srgbClr');
389
+ srgb.setAttribute('val', color);
390
+ solid.appendChild(srgb);
391
+ if (spPr.firstChild)
392
+ spPr.insertBefore(solid, spPr.firstChild);
393
+ else
394
+ spPr.appendChild(solid);
395
+ if (!directChild(spPr, 'ln')) {
396
+ const ln = doc.createElementNS(NS.a, 'a:ln');
397
+ ln.appendChild(doc.createElementNS(NS.a, 'a:noFill'));
398
+ spPr.appendChild(ln);
399
+ }
400
+ };
401
+ const setSeriesValues = (ser, values) => {
402
+ const cache = valueCache(ser);
403
+ if (!cache)
404
+ return;
405
+ const doc = ser.ownerDocument;
406
+ if (!doc)
407
+ throw new Error('Element has no document');
408
+ const pts = children(cache).filter((c) => c.localName === 'pt');
409
+ values.forEach((entry, i) => {
410
+ let pt = pts[i];
411
+ if (!pt) {
412
+ pt = doc.createElementNS(NS.c, 'c:pt');
413
+ pt.setAttribute('idx', String(i));
414
+ const v = doc.createElementNS(NS.c, 'c:v');
415
+ v.appendChild(doc.createTextNode(String(entry)));
416
+ pt.appendChild(v);
417
+ cache.appendChild(pt);
418
+ }
419
+ else {
420
+ const v = directChild(pt, 'v') ?? first(pt, 'v');
421
+ if (v)
422
+ v.textContent = String(entry);
423
+ }
424
+ });
425
+ // Drop trailing points if the series shrank.
426
+ for (const extra of pts.slice(values.length))
427
+ extra.parentNode?.removeChild(extra);
428
+ const count = directChild(cache, 'ptCount') ?? first(cache, 'ptCount');
429
+ if (count)
430
+ count.setAttribute('val', String(values.length));
431
+ };
432
+ export function readSeriesColor(ser) {
433
+ const spPr = directChild(ser, 'spPr');
434
+ if (!spPr)
435
+ return undefined;
436
+ const srgb = first(spPr, 'srgbClr');
437
+ const val = srgb?.getAttribute('val');
438
+ return val ? `#${val.toUpperCase()}` : undefined;
439
+ }
440
+ /** Ensure c:title under c:chart so setNodeText never appends a:p onto chartSpace. */
441
+ const ensureChartTitle = (chartDoc) => {
442
+ const existing = first(chartDoc, 'title');
443
+ if (existing)
444
+ return existing;
445
+ const root = chartDoc.documentElement;
446
+ if (!root)
447
+ throw new Error('Chart XML has no root');
448
+ const chart = directChild(root, 'chart') ?? first(chartDoc, 'chart');
449
+ if (!chart)
450
+ throw new Error('Chart XML has no c:chart');
451
+ const title = chartDoc.createElementNS(NS.c, 'c:title');
452
+ const tx = chartDoc.createElementNS(NS.c, 'c:tx');
453
+ const rich = chartDoc.createElementNS(NS.c, 'c:rich');
454
+ rich.appendChild(chartDoc.createElementNS(NS.a, 'a:bodyPr'));
455
+ rich.appendChild(chartDoc.createElementNS(NS.a, 'a:lstStyle'));
456
+ const p = chartDoc.createElementNS(NS.a, 'a:p');
457
+ const pPr = chartDoc.createElementNS(NS.a, 'a:pPr');
458
+ pPr.appendChild(chartDoc.createElementNS(NS.a, 'a:defRPr'));
459
+ p.appendChild(pPr);
460
+ const r = chartDoc.createElementNS(NS.a, 'a:r');
461
+ const rPr = chartDoc.createElementNS(NS.a, 'a:rPr');
462
+ rPr.setAttribute('lang', 'en-US');
463
+ r.appendChild(rPr);
464
+ r.appendChild(chartDoc.createElementNS(NS.a, 'a:t'));
465
+ p.appendChild(r);
466
+ rich.appendChild(p);
467
+ tx.appendChild(rich);
468
+ title.appendChild(tx);
469
+ const overlay = chartDoc.createElementNS(NS.c, 'c:overlay');
470
+ overlay.setAttribute('val', '0');
471
+ title.appendChild(overlay);
472
+ // CT_Chart: title is first among title / autoTitleDeleted / … / plotArea.
473
+ if (chart.firstChild)
474
+ chart.insertBefore(title, chart.firstChild);
475
+ else
476
+ chart.appendChild(title);
477
+ const auto = directChild(chart, 'autoTitleDeleted') ?? first(chart, 'autoTitleDeleted');
478
+ if (auto)
479
+ auto.setAttribute('val', '0');
480
+ else {
481
+ const created = chartDoc.createElementNS(NS.c, 'c:autoTitleDeleted');
482
+ created.setAttribute('val', '0');
483
+ if (title.nextSibling)
484
+ chart.insertBefore(created, title.nextSibling);
485
+ else
486
+ chart.appendChild(created);
487
+ }
488
+ return title;
489
+ };
490
+ /** Mutate an existing chart part from semantic chart properties. */
491
+ export function applyChartProperties(chartDoc, properties) {
492
+ if (typeof properties['title'] === 'string')
493
+ setNodeText(ensureChartTitle(chartDoc), properties['title']);
494
+ const series = properties['series'];
495
+ if (Array.isArray(series))
496
+ series.forEach((input, index) => {
497
+ if (typeof input !== 'object' || input === null)
498
+ return;
499
+ const spec = input;
500
+ const node = descendants(chartDoc, 'ser')[index];
501
+ if (!node)
502
+ return;
503
+ if (typeof spec['name'] === 'string') {
504
+ const tx = first(node, 'tx');
505
+ if (tx) {
506
+ const v = first(tx, 'v');
507
+ if (v)
508
+ v.textContent = spec['name'];
509
+ else
510
+ setNodeText(tx, spec['name']);
511
+ }
512
+ }
513
+ if (Array.isArray(spec['values']))
514
+ setSeriesValues(node, spec['values']);
515
+ if (typeof spec['color'] === 'string')
516
+ setSeriesColor(node, spec['color']);
517
+ });
518
+ const textColor = typeof properties['textColor'] === 'string'
519
+ ? properties['textColor']
520
+ : typeof properties['fontColor'] === 'string'
521
+ ? properties['fontColor']
522
+ : undefined;
523
+ if (typeof textColor === 'string')
524
+ applyChartTextColor(chartDoc, textColor);
525
+ if (typeof properties['gapWidth'] === 'number')
526
+ applyChartGapWidth(chartDoc, properties['gapWidth']);
527
+ const fill = typeof properties['fill'] === 'string'
528
+ ? properties['fill']
529
+ : typeof properties['background'] === 'string'
530
+ ? properties['background']
531
+ : undefined;
532
+ if (typeof fill === 'string')
533
+ applyChartBackground(chartDoc, fill);
534
+ if (typeof properties['showMajorGridlines'] === 'boolean') {
535
+ const gridColor = typeof properties['gridlineColor'] === 'string'
536
+ ? properties['gridlineColor']
537
+ : typeof fill === 'string'
538
+ ? '8893A8'
539
+ : 'FFFFFF';
540
+ applyChartMajorGridlines(chartDoc, properties['showMajorGridlines'], gridColor);
541
+ }
542
+ if (typeof properties['showDataLabels'] === 'boolean')
543
+ applyChartDataLabels(chartDoc, properties['showDataLabels']);
544
+ const formatCode = typeof properties['valueFormatCode'] === 'string'
545
+ ? properties['valueFormatCode']
546
+ : typeof properties['axisFormatCode'] === 'string'
547
+ ? properties['axisFormatCode']
548
+ : undefined;
549
+ if (typeof formatCode === 'string')
550
+ applyChartValueFormat(chartDoc, formatCode);
551
+ }
552
+ export function applyChartDataLabels(chartDoc, show) {
553
+ for (const plot of [
554
+ ...descendants(chartDoc, 'barChart'),
555
+ ...descendants(chartDoc, 'lineChart'),
556
+ ...descendants(chartDoc, 'pieChart'),
557
+ ]) {
558
+ let dLbls = directChild(plot, 'dLbls');
559
+ if (!dLbls) {
560
+ dLbls = chartDoc.createElementNS(NS.c, 'c:dLbls');
561
+ const after = [...children(plot)].reverse().find((c) => c.localName === 'ser') ??
562
+ directChild(plot, 'varyColors') ??
563
+ directChild(plot, 'grouping') ??
564
+ directChild(plot, 'barDir');
565
+ if (after?.nextSibling)
566
+ plot.insertBefore(dLbls, after.nextSibling);
567
+ else if (after)
568
+ plot.appendChild(dLbls);
569
+ else
570
+ plot.appendChild(dLbls);
571
+ }
572
+ const setFlag = (name, val) => {
573
+ let node = directChild(dLbls, name);
574
+ if (!node) {
575
+ node = chartDoc.createElementNS(NS.c, `c:${name}`);
576
+ dLbls.appendChild(node);
577
+ }
578
+ node.setAttribute('val', val);
579
+ };
580
+ setFlag('showVal', show ? '1' : '0');
581
+ setFlag('showPercent', '0');
582
+ setFlag('showCatName', '0');
583
+ setFlag('showSerName', '0');
584
+ }
585
+ }
586
+ export function applyChartValueFormat(chartDoc, formatCode) {
587
+ for (const ax of descendants(chartDoc, 'valAx')) {
588
+ let numFmt = directChild(ax, 'numFmt');
589
+ if (!numFmt) {
590
+ numFmt = chartDoc.createElementNS(NS.c, 'c:numFmt');
591
+ const after = directChild(ax, 'tickLblPos') ?? directChild(ax, 'majorGridlines');
592
+ if (after?.nextSibling)
593
+ ax.insertBefore(numFmt, after.nextSibling);
594
+ else if (after)
595
+ ax.appendChild(numFmt);
596
+ else
597
+ ax.appendChild(numFmt);
598
+ }
599
+ numFmt.setAttribute('formatCode', formatCode);
600
+ numFmt.setAttribute('sourceLinked', '0');
601
+ }
602
+ for (const lit of [...descendants(chartDoc, 'numLit'), ...descendants(chartDoc, 'numCache')]) {
603
+ let code = directChild(lit, 'formatCode');
604
+ if (!code) {
605
+ code = chartDoc.createElementNS(NS.c, 'c:formatCode');
606
+ if (lit.firstChild)
607
+ lit.insertBefore(code, lit.firstChild);
608
+ else
609
+ lit.appendChild(code);
610
+ }
611
+ code.textContent = formatCode;
612
+ }
613
+ }
614
+ //# sourceMappingURL=chart.js.map