@rowsncolumns/toolkit 24.4.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 (456) hide show
  1. package/LICENSE.md +100 -0
  2. package/Readme.md +27 -0
  3. package/dist/cjs/autofilter-condition.d.ts +43 -0
  4. package/dist/cjs/autofilter-condition.d.ts.map +1 -0
  5. package/dist/cjs/autofilter-condition.js +155 -0
  6. package/dist/cjs/csv-export.d.ts +49 -0
  7. package/dist/cjs/csv-export.d.ts.map +1 -0
  8. package/dist/cjs/csv-export.js +142 -0
  9. package/dist/cjs/csv-import-worker.d.ts +16 -0
  10. package/dist/cjs/csv-import-worker.d.ts.map +1 -0
  11. package/dist/cjs/csv-import-worker.js +60 -0
  12. package/dist/cjs/csv-import.d.ts +38 -0
  13. package/dist/cjs/csv-import.d.ts.map +1 -0
  14. package/dist/cjs/csv-import.js +166 -0
  15. package/dist/cjs/csv-parser/helpers.d.ts +14 -0
  16. package/dist/cjs/csv-parser/helpers.d.ts.map +1 -0
  17. package/dist/cjs/csv-parser/helpers.js +145 -0
  18. package/dist/cjs/csv-parser/types.d.ts +66 -0
  19. package/dist/cjs/csv-parser/types.d.ts.map +1 -0
  20. package/dist/cjs/csv-parser/types.js +14 -0
  21. package/dist/cjs/csv-parser/worker.d.ts +2 -0
  22. package/dist/cjs/csv-parser/worker.d.ts.map +1 -0
  23. package/dist/cjs/csv-parser/worker.js +200 -0
  24. package/dist/cjs/excel-export.d.ts +11 -0
  25. package/dist/cjs/excel-export.d.ts.map +1 -0
  26. package/dist/cjs/excel-export.js +22 -0
  27. package/dist/cjs/excel-import-session.d.ts +51 -0
  28. package/dist/cjs/excel-import-session.d.ts.map +1 -0
  29. package/dist/cjs/excel-import-session.js +307 -0
  30. package/dist/cjs/excel-import-worker.d.ts +7 -0
  31. package/dist/cjs/excel-import-worker.d.ts.map +1 -0
  32. package/dist/cjs/excel-import-worker.js +119 -0
  33. package/dist/cjs/excel-parser/builtin-numfmts.d.ts +24 -0
  34. package/dist/cjs/excel-parser/builtin-numfmts.d.ts.map +1 -0
  35. package/dist/cjs/excel-parser/builtin-numfmts.js +63 -0
  36. package/dist/cjs/excel-parser/cfb-decryptor.d.ts +53 -0
  37. package/dist/cjs/excel-parser/cfb-decryptor.d.ts.map +1 -0
  38. package/dist/cjs/excel-parser/cfb-decryptor.js +553 -0
  39. package/dist/cjs/excel-parser/cfb-encryptor.d.ts +23 -0
  40. package/dist/cjs/excel-parser/cfb-encryptor.d.ts.map +1 -0
  41. package/dist/cjs/excel-parser/cfb-encryptor.js +200 -0
  42. package/dist/cjs/excel-parser/dv-cell-stamp.d.ts +29 -0
  43. package/dist/cjs/excel-parser/dv-cell-stamp.d.ts.map +1 -0
  44. package/dist/cjs/excel-parser/dv-cell-stamp.js +239 -0
  45. package/dist/cjs/excel-parser/helpers.d.ts +28 -0
  46. package/dist/cjs/excel-parser/helpers.d.ts.map +1 -0
  47. package/dist/cjs/excel-parser/helpers.js +188 -0
  48. package/dist/cjs/excel-parser/interface.d.ts +179 -0
  49. package/dist/cjs/excel-parser/interface.d.ts.map +1 -0
  50. package/dist/cjs/excel-parser/interface.js +1 -0
  51. package/dist/cjs/excel-parser/plugins/base/index.d.ts +31 -0
  52. package/dist/cjs/excel-parser/plugins/base/index.d.ts.map +1 -0
  53. package/dist/cjs/excel-parser/plugins/base/index.js +101 -0
  54. package/dist/cjs/excel-parser/plugins/ods/conditional-formatting.d.ts +16 -0
  55. package/dist/cjs/excel-parser/plugins/ods/conditional-formatting.d.ts.map +1 -0
  56. package/dist/cjs/excel-parser/plugins/ods/conditional-formatting.js +488 -0
  57. package/dist/cjs/excel-parser/plugins/ods/data-validations.d.ts +15 -0
  58. package/dist/cjs/excel-parser/plugins/ods/data-validations.d.ts.map +1 -0
  59. package/dist/cjs/excel-parser/plugins/ods/data-validations.js +353 -0
  60. package/dist/cjs/excel-parser/plugins/ods/formula.d.ts +8 -0
  61. package/dist/cjs/excel-parser/plugins/ods/formula.d.ts.map +1 -0
  62. package/dist/cjs/excel-parser/plugins/ods/formula.js +82 -0
  63. package/dist/cjs/excel-parser/plugins/ods/index.d.ts +122 -0
  64. package/dist/cjs/excel-parser/plugins/ods/index.d.ts.map +1 -0
  65. package/dist/cjs/excel-parser/plugins/ods/index.js +3642 -0
  66. package/dist/cjs/excel-parser/plugins/ods/sparklines.d.ts +25 -0
  67. package/dist/cjs/excel-parser/plugins/ods/sparklines.d.ts.map +1 -0
  68. package/dist/cjs/excel-parser/plugins/ods/sparklines.js +221 -0
  69. package/dist/cjs/excel-parser/plugins/ods/styles.d.ts +60 -0
  70. package/dist/cjs/excel-parser/plugins/ods/styles.d.ts.map +1 -0
  71. package/dist/cjs/excel-parser/plugins/ods/styles.js +808 -0
  72. package/dist/cjs/excel-parser/plugins/ods/types.d.ts +7 -0
  73. package/dist/cjs/excel-parser/plugins/ods/types.d.ts.map +1 -0
  74. package/dist/cjs/excel-parser/plugins/ods/types.js +1 -0
  75. package/dist/cjs/excel-parser/plugins/xls/index.d.ts +5 -0
  76. package/dist/cjs/excel-parser/plugins/xls/index.d.ts.map +1 -0
  77. package/dist/cjs/excel-parser/plugins/xls/index.js +19 -0
  78. package/dist/cjs/excel-parser/plugins/xlsb/biff-record-reader.d.ts +13 -0
  79. package/dist/cjs/excel-parser/plugins/xlsb/biff-record-reader.d.ts.map +1 -0
  80. package/dist/cjs/excel-parser/plugins/xlsb/biff-record-reader.js +49 -0
  81. package/dist/cjs/excel-parser/plugins/xlsb/index.d.ts +117 -0
  82. package/dist/cjs/excel-parser/plugins/xlsb/index.d.ts.map +1 -0
  83. package/dist/cjs/excel-parser/plugins/xlsb/index.js +2972 -0
  84. package/dist/cjs/excel-parser/plugins/xlsb/rgce-parser.d.ts +18 -0
  85. package/dist/cjs/excel-parser/plugins/xlsb/rgce-parser.d.ts.map +1 -0
  86. package/dist/cjs/excel-parser/plugins/xlsb/rgce-parser.js +527 -0
  87. package/dist/cjs/excel-parser/plugins/xlsm/index.d.ts +5 -0
  88. package/dist/cjs/excel-parser/plugins/xlsm/index.d.ts.map +1 -0
  89. package/dist/cjs/excel-parser/plugins/xlsm/index.js +10 -0
  90. package/dist/cjs/excel-parser/plugins/xlsx/charts.d.ts +60 -0
  91. package/dist/cjs/excel-parser/plugins/xlsx/charts.d.ts.map +1 -0
  92. package/dist/cjs/excel-parser/plugins/xlsx/charts.js +2178 -0
  93. package/dist/cjs/excel-parser/plugins/xlsx/conditional-formatting.d.ts +18 -0
  94. package/dist/cjs/excel-parser/plugins/xlsx/conditional-formatting.d.ts.map +1 -0
  95. package/dist/cjs/excel-parser/plugins/xlsx/conditional-formatting.js +620 -0
  96. package/dist/cjs/excel-parser/plugins/xlsx/data-validations.d.ts +4 -0
  97. package/dist/cjs/excel-parser/plugins/xlsx/data-validations.d.ts.map +1 -0
  98. package/dist/cjs/excel-parser/plugins/xlsx/data-validations.js +515 -0
  99. package/dist/cjs/excel-parser/plugins/xlsx/drawing.d.ts +39 -0
  100. package/dist/cjs/excel-parser/plugins/xlsx/drawing.d.ts.map +1 -0
  101. package/dist/cjs/excel-parser/plugins/xlsx/drawing.js +941 -0
  102. package/dist/cjs/excel-parser/plugins/xlsx/index.d.ts +320 -0
  103. package/dist/cjs/excel-parser/plugins/xlsx/index.d.ts.map +1 -0
  104. package/dist/cjs/excel-parser/plugins/xlsx/index.js +6056 -0
  105. package/dist/cjs/excel-parser/plugins/xlsx/numfmt.d.ts +2 -0
  106. package/dist/cjs/excel-parser/plugins/xlsx/numfmt.d.ts.map +1 -0
  107. package/dist/cjs/excel-parser/plugins/xlsx/numfmt.js +3 -0
  108. package/dist/cjs/excel-parser/plugins/xlsx/pivots.d.ts +40 -0
  109. package/dist/cjs/excel-parser/plugins/xlsx/pivots.d.ts.map +1 -0
  110. package/dist/cjs/excel-parser/plugins/xlsx/pivots.js +342 -0
  111. package/dist/cjs/excel-parser/plugins/xlsx/relationships.d.ts +8 -0
  112. package/dist/cjs/excel-parser/plugins/xlsx/relationships.d.ts.map +1 -0
  113. package/dist/cjs/excel-parser/plugins/xlsx/relationships.js +26 -0
  114. package/dist/cjs/excel-parser/plugins/xlsx/sheet-views.d.ts +26 -0
  115. package/dist/cjs/excel-parser/plugins/xlsx/sheet-views.d.ts.map +1 -0
  116. package/dist/cjs/excel-parser/plugins/xlsx/sheet-views.js +59 -0
  117. package/dist/cjs/excel-parser/plugins/xlsx/styles.d.ts +44 -0
  118. package/dist/cjs/excel-parser/plugins/xlsx/styles.d.ts.map +1 -0
  119. package/dist/cjs/excel-parser/plugins/xlsx/styles.js +1377 -0
  120. package/dist/cjs/excel-parser/plugins/xlsx/theme.d.ts +50 -0
  121. package/dist/cjs/excel-parser/plugins/xlsx/theme.d.ts.map +1 -0
  122. package/dist/cjs/excel-parser/plugins/xlsx/theme.js +150 -0
  123. package/dist/cjs/excel-parser/plugins/xlsx/threaded-comments.d.ts +47 -0
  124. package/dist/cjs/excel-parser/plugins/xlsx/threaded-comments.d.ts.map +1 -0
  125. package/dist/cjs/excel-parser/plugins/xlsx/threaded-comments.js +141 -0
  126. package/dist/cjs/excel-parser/plugins/xlsx/value-type-detection.d.ts +44 -0
  127. package/dist/cjs/excel-parser/plugins/xlsx/value-type-detection.d.ts.map +1 -0
  128. package/dist/cjs/excel-parser/plugins/xlsx/value-type-detection.js +407 -0
  129. package/dist/cjs/excel-parser/registry.d.ts +5 -0
  130. package/dist/cjs/excel-parser/registry.d.ts.map +1 -0
  131. package/dist/cjs/excel-parser/registry.js +21 -0
  132. package/dist/cjs/excel-parser/style-registry.d.ts +51 -0
  133. package/dist/cjs/excel-parser/style-registry.d.ts.map +1 -0
  134. package/dist/cjs/excel-parser/style-registry.js +175 -0
  135. package/dist/cjs/excel-parser/theme-default.d.ts +3 -0
  136. package/dist/cjs/excel-parser/theme-default.d.ts.map +1 -0
  137. package/dist/cjs/excel-parser/theme-default.js +19 -0
  138. package/dist/cjs/excel-parser/types.d.ts +365 -0
  139. package/dist/cjs/excel-parser/types.d.ts.map +1 -0
  140. package/dist/cjs/excel-parser/types.js +59 -0
  141. package/dist/cjs/excel-parser/utils.d.ts +6 -0
  142. package/dist/cjs/excel-parser/utils.d.ts.map +1 -0
  143. package/dist/cjs/excel-parser/utils.js +30 -0
  144. package/dist/cjs/excel-parser/workbook.d.ts +51 -0
  145. package/dist/cjs/excel-parser/workbook.d.ts.map +1 -0
  146. package/dist/cjs/excel-parser/workbook.js +317 -0
  147. package/dist/cjs/excel-parser/worker.d.ts +2 -0
  148. package/dist/cjs/excel-parser/worker.d.ts.map +1 -0
  149. package/dist/cjs/excel-parser/worker.js +1149 -0
  150. package/dist/cjs/excel-parser/zip-parser-streaming.d.ts +13 -0
  151. package/dist/cjs/excel-parser/zip-parser-streaming.d.ts.map +1 -0
  152. package/dist/cjs/excel-parser/zip-parser-streaming.js +200 -0
  153. package/dist/cjs/excel-parser/zip-parser.d.ts +11 -0
  154. package/dist/cjs/excel-parser/zip-parser.d.ts.map +1 -0
  155. package/dist/cjs/excel-parser/zip-parser.js +49 -0
  156. package/dist/cjs/exporter/invalid-data-validation.d.ts +19 -0
  157. package/dist/cjs/exporter/invalid-data-validation.d.ts.map +1 -0
  158. package/dist/cjs/exporter/invalid-data-validation.js +39 -0
  159. package/dist/cjs/exporter/ods/ods-export.d.ts +26 -0
  160. package/dist/cjs/exporter/ods/ods-export.d.ts.map +1 -0
  161. package/dist/cjs/exporter/ods/ods-export.js +3714 -0
  162. package/dist/cjs/exporter/ods/sparkline-builder.d.ts +33 -0
  163. package/dist/cjs/exporter/ods/sparkline-builder.d.ts.map +1 -0
  164. package/dist/cjs/exporter/ods/sparkline-builder.js +221 -0
  165. package/dist/cjs/exporter/xlsx/chart-builder.d.ts +3 -0
  166. package/dist/cjs/exporter/xlsx/chart-builder.d.ts.map +1 -0
  167. package/dist/cjs/exporter/xlsx/chart-builder.js +1901 -0
  168. package/dist/cjs/exporter/xlsx/chart-templates.d.ts +1781 -0
  169. package/dist/cjs/exporter/xlsx/chart-templates.d.ts.map +1 -0
  170. package/dist/cjs/exporter/xlsx/chart-templates.js +1798 -0
  171. package/dist/cjs/exporter/xlsx/future-functions.d.ts +10 -0
  172. package/dist/cjs/exporter/xlsx/future-functions.d.ts.map +1 -0
  173. package/dist/cjs/exporter/xlsx/future-functions.js +264 -0
  174. package/dist/cjs/exporter/xlsx/pivot-builder.d.ts +58 -0
  175. package/dist/cjs/exporter/xlsx/pivot-builder.d.ts.map +1 -0
  176. package/dist/cjs/exporter/xlsx/pivot-builder.js +277 -0
  177. package/dist/cjs/exporter/xlsx/power-query-builder.d.ts +26 -0
  178. package/dist/cjs/exporter/xlsx/power-query-builder.d.ts.map +1 -0
  179. package/dist/cjs/exporter/xlsx/power-query-builder.js +306 -0
  180. package/dist/cjs/exporter/xlsx/slicer-builder.d.ts +11 -0
  181. package/dist/cjs/exporter/xlsx/slicer-builder.d.ts.map +1 -0
  182. package/dist/cjs/exporter/xlsx/slicer-builder.js +87 -0
  183. package/dist/cjs/exporter/xlsx/sparkline-builder.d.ts +61 -0
  184. package/dist/cjs/exporter/xlsx/sparkline-builder.d.ts.map +1 -0
  185. package/dist/cjs/exporter/xlsx/sparkline-builder.js +489 -0
  186. package/dist/cjs/exporter/xlsx/style-builder.d.ts +93 -0
  187. package/dist/cjs/exporter/xlsx/style-builder.d.ts.map +1 -0
  188. package/dist/cjs/exporter/xlsx/style-builder.js +813 -0
  189. package/dist/cjs/exporter/xlsx/threaded-comments-builder.d.ts +58 -0
  190. package/dist/cjs/exporter/xlsx/threaded-comments-builder.d.ts.map +1 -0
  191. package/dist/cjs/exporter/xlsx/threaded-comments-builder.js +189 -0
  192. package/dist/cjs/exporter/xlsx/xlsx-export.d.ts +121 -0
  193. package/dist/cjs/exporter/xlsx/xlsx-export.d.ts.map +1 -0
  194. package/dist/cjs/exporter/xlsx/xlsx-export.js +4596 -0
  195. package/dist/cjs/helpers/theme-xml-generator.d.ts +8 -0
  196. package/dist/cjs/helpers/theme-xml-generator.d.ts.map +1 -0
  197. package/dist/cjs/helpers/theme-xml-generator.js +33 -0
  198. package/dist/cjs/helpers.d.ts +34 -0
  199. package/dist/cjs/helpers.d.ts.map +1 -0
  200. package/dist/cjs/helpers.js +189 -0
  201. package/dist/cjs/index.d.ts +16 -0
  202. package/dist/cjs/index.d.ts.map +1 -0
  203. package/dist/cjs/index.js +15 -0
  204. package/dist/cjs/indexed-colors.d.ts +2 -0
  205. package/dist/cjs/indexed-colors.d.ts.map +1 -0
  206. package/dist/cjs/indexed-colors.js +75 -0
  207. package/dist/cjs/ods-export.d.ts +24 -0
  208. package/dist/cjs/ods-export.d.ts.map +1 -0
  209. package/dist/cjs/ods-export.js +23 -0
  210. package/dist/cjs/parse.d.ts +24 -0
  211. package/dist/cjs/parse.d.ts.map +1 -0
  212. package/dist/cjs/parse.js +68 -0
  213. package/dist/cjs/power-query.d.ts +41 -0
  214. package/dist/cjs/power-query.d.ts.map +1 -0
  215. package/dist/cjs/power-query.js +22 -0
  216. package/dist/cjs/server.d.ts +9 -0
  217. package/dist/cjs/server.d.ts.map +1 -0
  218. package/dist/cjs/server.js +8 -0
  219. package/dist/cjs/theme1.d.ts +3 -0
  220. package/dist/cjs/theme1.d.ts.map +1 -0
  221. package/dist/cjs/theme1.js +2 -0
  222. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  223. package/dist/cjs/types.d.ts +14 -0
  224. package/dist/cjs/types.d.ts.map +1 -0
  225. package/dist/cjs/types.js +14 -0
  226. package/dist/cjs/vitest.config.d.ts +3 -0
  227. package/dist/cjs/vitest.config.d.ts.map +1 -0
  228. package/dist/cjs/vitest.config.js +16 -0
  229. package/dist/esm/autofilter-condition.d.ts +43 -0
  230. package/dist/esm/autofilter-condition.d.ts.map +1 -0
  231. package/dist/esm/autofilter-condition.js +145 -0
  232. package/dist/esm/csv-export.d.ts +49 -0
  233. package/dist/esm/csv-export.d.ts.map +1 -0
  234. package/dist/esm/csv-export.js +126 -0
  235. package/dist/esm/csv-import-worker.d.ts +16 -0
  236. package/dist/esm/csv-import-worker.d.ts.map +1 -0
  237. package/dist/esm/csv-import-worker.js +60 -0
  238. package/dist/esm/csv-import.d.ts +38 -0
  239. package/dist/esm/csv-import.d.ts.map +1 -0
  240. package/dist/esm/csv-import.js +132 -0
  241. package/dist/esm/csv-parser/helpers.d.ts +14 -0
  242. package/dist/esm/csv-parser/helpers.d.ts.map +1 -0
  243. package/dist/esm/csv-parser/helpers.js +0 -0
  244. package/dist/esm/csv-parser/types.d.ts +66 -0
  245. package/dist/esm/csv-parser/types.d.ts.map +1 -0
  246. package/dist/esm/csv-parser/types.js +14 -0
  247. package/dist/esm/csv-parser/worker.d.ts +2 -0
  248. package/dist/esm/csv-parser/worker.d.ts.map +1 -0
  249. package/dist/esm/csv-parser/worker.js +154 -0
  250. package/dist/esm/excel-export.d.ts +11 -0
  251. package/dist/esm/excel-export.d.ts.map +1 -0
  252. package/dist/esm/excel-export.js +13 -0
  253. package/dist/esm/excel-import-session.d.ts +51 -0
  254. package/dist/esm/excel-import-session.d.ts.map +1 -0
  255. package/dist/esm/excel-import-session.js +255 -0
  256. package/dist/esm/excel-import-worker.d.ts +7 -0
  257. package/dist/esm/excel-import-worker.d.ts.map +1 -0
  258. package/dist/esm/excel-import-worker.js +116 -0
  259. package/dist/esm/excel-parser/builtin-numfmts.d.ts +24 -0
  260. package/dist/esm/excel-parser/builtin-numfmts.d.ts.map +1 -0
  261. package/dist/esm/excel-parser/builtin-numfmts.js +59 -0
  262. package/dist/esm/excel-parser/cfb-decryptor.d.ts +53 -0
  263. package/dist/esm/excel-parser/cfb-decryptor.d.ts.map +1 -0
  264. package/dist/esm/excel-parser/cfb-decryptor.js +493 -0
  265. package/dist/esm/excel-parser/cfb-encryptor.d.ts +23 -0
  266. package/dist/esm/excel-parser/cfb-encryptor.d.ts.map +1 -0
  267. package/dist/esm/excel-parser/cfb-encryptor.js +181 -0
  268. package/dist/esm/excel-parser/dv-cell-stamp.d.ts +29 -0
  269. package/dist/esm/excel-parser/dv-cell-stamp.d.ts.map +1 -0
  270. package/dist/esm/excel-parser/dv-cell-stamp.js +155 -0
  271. package/dist/esm/excel-parser/helpers.d.ts +28 -0
  272. package/dist/esm/excel-parser/helpers.d.ts.map +1 -0
  273. package/dist/esm/excel-parser/helpers.js +160 -0
  274. package/dist/esm/excel-parser/interface.d.ts +179 -0
  275. package/dist/esm/excel-parser/interface.d.ts.map +1 -0
  276. package/dist/esm/excel-parser/interface.js +1 -0
  277. package/dist/esm/excel-parser/plugins/base/index.d.ts +31 -0
  278. package/dist/esm/excel-parser/plugins/base/index.d.ts.map +1 -0
  279. package/dist/esm/excel-parser/plugins/base/index.js +64 -0
  280. package/dist/esm/excel-parser/plugins/ods/conditional-formatting.d.ts +16 -0
  281. package/dist/esm/excel-parser/plugins/ods/conditional-formatting.d.ts.map +1 -0
  282. package/dist/esm/excel-parser/plugins/ods/conditional-formatting.js +405 -0
  283. package/dist/esm/excel-parser/plugins/ods/data-validations.d.ts +15 -0
  284. package/dist/esm/excel-parser/plugins/ods/data-validations.d.ts.map +1 -0
  285. package/dist/esm/excel-parser/plugins/ods/data-validations.js +331 -0
  286. package/dist/esm/excel-parser/plugins/ods/formula.d.ts +8 -0
  287. package/dist/esm/excel-parser/plugins/ods/formula.d.ts.map +1 -0
  288. package/dist/esm/excel-parser/plugins/ods/formula.js +82 -0
  289. package/dist/esm/excel-parser/plugins/ods/index.d.ts +122 -0
  290. package/dist/esm/excel-parser/plugins/ods/index.d.ts.map +1 -0
  291. package/dist/esm/excel-parser/plugins/ods/index.js +2896 -0
  292. package/dist/esm/excel-parser/plugins/ods/sparklines.d.ts +25 -0
  293. package/dist/esm/excel-parser/plugins/ods/sparklines.d.ts.map +1 -0
  294. package/dist/esm/excel-parser/plugins/ods/sparklines.js +188 -0
  295. package/dist/esm/excel-parser/plugins/ods/styles.d.ts +60 -0
  296. package/dist/esm/excel-parser/plugins/ods/styles.d.ts.map +1 -0
  297. package/dist/esm/excel-parser/plugins/ods/styles.js +732 -0
  298. package/dist/esm/excel-parser/plugins/ods/types.d.ts +7 -0
  299. package/dist/esm/excel-parser/plugins/ods/types.d.ts.map +1 -0
  300. package/dist/esm/excel-parser/plugins/ods/types.js +1 -0
  301. package/dist/esm/excel-parser/plugins/xls/index.d.ts +5 -0
  302. package/dist/esm/excel-parser/plugins/xls/index.d.ts.map +1 -0
  303. package/dist/esm/excel-parser/plugins/xls/index.js +7 -0
  304. package/dist/esm/excel-parser/plugins/xlsb/biff-record-reader.d.ts +13 -0
  305. package/dist/esm/excel-parser/plugins/xlsb/biff-record-reader.d.ts.map +1 -0
  306. package/dist/esm/excel-parser/plugins/xlsb/biff-record-reader.js +48 -0
  307. package/dist/esm/excel-parser/plugins/xlsb/index.d.ts +117 -0
  308. package/dist/esm/excel-parser/plugins/xlsb/index.d.ts.map +1 -0
  309. package/dist/esm/excel-parser/plugins/xlsb/index.js +2339 -0
  310. package/dist/esm/excel-parser/plugins/xlsb/rgce-parser.d.ts +18 -0
  311. package/dist/esm/excel-parser/plugins/xlsb/rgce-parser.d.ts.map +1 -0
  312. package/dist/esm/excel-parser/plugins/xlsb/rgce-parser.js +522 -0
  313. package/dist/esm/excel-parser/plugins/xlsm/index.d.ts +5 -0
  314. package/dist/esm/excel-parser/plugins/xlsm/index.d.ts.map +1 -0
  315. package/dist/esm/excel-parser/plugins/xlsm/index.js +6 -0
  316. package/dist/esm/excel-parser/plugins/xlsx/charts.d.ts +60 -0
  317. package/dist/esm/excel-parser/plugins/xlsx/charts.d.ts.map +1 -0
  318. package/dist/esm/excel-parser/plugins/xlsx/charts.js +2036 -0
  319. package/dist/esm/excel-parser/plugins/xlsx/conditional-formatting.d.ts +18 -0
  320. package/dist/esm/excel-parser/plugins/xlsx/conditional-formatting.d.ts.map +1 -0
  321. package/dist/esm/excel-parser/plugins/xlsx/conditional-formatting.js +621 -0
  322. package/dist/esm/excel-parser/plugins/xlsx/data-validations.d.ts +4 -0
  323. package/dist/esm/excel-parser/plugins/xlsx/data-validations.d.ts.map +1 -0
  324. package/dist/esm/excel-parser/plugins/xlsx/data-validations.js +493 -0
  325. package/dist/esm/excel-parser/plugins/xlsx/drawing.d.ts +39 -0
  326. package/dist/esm/excel-parser/plugins/xlsx/drawing.d.ts.map +1 -0
  327. package/dist/esm/excel-parser/plugins/xlsx/drawing.js +905 -0
  328. package/dist/esm/excel-parser/plugins/xlsx/index.d.ts +320 -0
  329. package/dist/esm/excel-parser/plugins/xlsx/index.d.ts.map +1 -0
  330. package/dist/esm/excel-parser/plugins/xlsx/index.js +4654 -0
  331. package/dist/esm/excel-parser/plugins/xlsx/numfmt.d.ts +2 -0
  332. package/dist/esm/excel-parser/plugins/xlsx/numfmt.d.ts.map +1 -0
  333. package/dist/esm/excel-parser/plugins/xlsx/numfmt.js +3 -0
  334. package/dist/esm/excel-parser/plugins/xlsx/pivots.d.ts +40 -0
  335. package/dist/esm/excel-parser/plugins/xlsx/pivots.d.ts.map +1 -0
  336. package/dist/esm/excel-parser/plugins/xlsx/pivots.js +254 -0
  337. package/dist/esm/excel-parser/plugins/xlsx/relationships.d.ts +8 -0
  338. package/dist/esm/excel-parser/plugins/xlsx/relationships.d.ts.map +1 -0
  339. package/dist/esm/excel-parser/plugins/xlsx/relationships.js +13 -0
  340. package/dist/esm/excel-parser/plugins/xlsx/sheet-views.d.ts +26 -0
  341. package/dist/esm/excel-parser/plugins/xlsx/sheet-views.d.ts.map +1 -0
  342. package/dist/esm/excel-parser/plugins/xlsx/sheet-views.js +64 -0
  343. package/dist/esm/excel-parser/plugins/xlsx/styles.d.ts +44 -0
  344. package/dist/esm/excel-parser/plugins/xlsx/styles.d.ts.map +1 -0
  345. package/dist/esm/excel-parser/plugins/xlsx/styles.js +1365 -0
  346. package/dist/esm/excel-parser/plugins/xlsx/theme.d.ts +50 -0
  347. package/dist/esm/excel-parser/plugins/xlsx/theme.d.ts.map +1 -0
  348. package/dist/esm/excel-parser/plugins/xlsx/theme.js +127 -0
  349. package/dist/esm/excel-parser/plugins/xlsx/threaded-comments.d.ts +47 -0
  350. package/dist/esm/excel-parser/plugins/xlsx/threaded-comments.d.ts.map +1 -0
  351. package/dist/esm/excel-parser/plugins/xlsx/threaded-comments.js +103 -0
  352. package/dist/esm/excel-parser/plugins/xlsx/value-type-detection.d.ts +44 -0
  353. package/dist/esm/excel-parser/plugins/xlsx/value-type-detection.d.ts.map +1 -0
  354. package/dist/esm/excel-parser/plugins/xlsx/value-type-detection.js +399 -0
  355. package/dist/esm/excel-parser/registry.d.ts +5 -0
  356. package/dist/esm/excel-parser/registry.d.ts.map +1 -0
  357. package/dist/esm/excel-parser/registry.js +20 -0
  358. package/dist/esm/excel-parser/style-registry.d.ts +51 -0
  359. package/dist/esm/excel-parser/style-registry.d.ts.map +1 -0
  360. package/dist/esm/excel-parser/style-registry.js +163 -0
  361. package/dist/esm/excel-parser/theme-default.d.ts +3 -0
  362. package/dist/esm/excel-parser/theme-default.d.ts.map +1 -0
  363. package/dist/esm/excel-parser/theme-default.js +19 -0
  364. package/dist/esm/excel-parser/types.d.ts +365 -0
  365. package/dist/esm/excel-parser/types.d.ts.map +1 -0
  366. package/dist/esm/excel-parser/types.js +59 -0
  367. package/dist/esm/excel-parser/utils.d.ts +6 -0
  368. package/dist/esm/excel-parser/utils.d.ts.map +1 -0
  369. package/dist/esm/excel-parser/utils.js +25 -0
  370. package/dist/esm/excel-parser/workbook.d.ts +51 -0
  371. package/dist/esm/excel-parser/workbook.d.ts.map +1 -0
  372. package/dist/esm/excel-parser/workbook.js +192 -0
  373. package/dist/esm/excel-parser/worker.d.ts +2 -0
  374. package/dist/esm/excel-parser/worker.d.ts.map +1 -0
  375. package/dist/esm/excel-parser/worker.js +862 -0
  376. package/dist/esm/excel-parser/zip-parser-streaming.d.ts +13 -0
  377. package/dist/esm/excel-parser/zip-parser-streaming.d.ts.map +1 -0
  378. package/dist/esm/excel-parser/zip-parser-streaming.js +119 -0
  379. package/dist/esm/excel-parser/zip-parser.d.ts +11 -0
  380. package/dist/esm/excel-parser/zip-parser.d.ts.map +1 -0
  381. package/dist/esm/excel-parser/zip-parser.js +43 -0
  382. package/dist/esm/exporter/invalid-data-validation.d.ts +19 -0
  383. package/dist/esm/exporter/invalid-data-validation.d.ts.map +1 -0
  384. package/dist/esm/exporter/invalid-data-validation.js +37 -0
  385. package/dist/esm/exporter/ods/ods-export.d.ts +26 -0
  386. package/dist/esm/exporter/ods/ods-export.d.ts.map +1 -0
  387. package/dist/esm/exporter/ods/ods-export.js +3238 -0
  388. package/dist/esm/exporter/ods/sparkline-builder.d.ts +33 -0
  389. package/dist/esm/exporter/ods/sparkline-builder.d.ts.map +1 -0
  390. package/dist/esm/exporter/ods/sparkline-builder.js +165 -0
  391. package/dist/esm/exporter/xlsx/chart-builder.d.ts +3 -0
  392. package/dist/esm/exporter/xlsx/chart-builder.d.ts.map +1 -0
  393. package/dist/esm/exporter/xlsx/chart-builder.js +1805 -0
  394. package/dist/esm/exporter/xlsx/chart-templates.d.ts +1781 -0
  395. package/dist/esm/exporter/xlsx/chart-templates.d.ts.map +1 -0
  396. package/dist/esm/exporter/xlsx/chart-templates.js +1798 -0
  397. package/dist/esm/exporter/xlsx/future-functions.d.ts +10 -0
  398. package/dist/esm/exporter/xlsx/future-functions.d.ts.map +1 -0
  399. package/dist/esm/exporter/xlsx/future-functions.js +264 -0
  400. package/dist/esm/exporter/xlsx/pivot-builder.d.ts +58 -0
  401. package/dist/esm/exporter/xlsx/pivot-builder.d.ts.map +1 -0
  402. package/dist/esm/exporter/xlsx/pivot-builder.js +230 -0
  403. package/dist/esm/exporter/xlsx/power-query-builder.d.ts +26 -0
  404. package/dist/esm/exporter/xlsx/power-query-builder.d.ts.map +1 -0
  405. package/dist/esm/exporter/xlsx/power-query-builder.js +257 -0
  406. package/dist/esm/exporter/xlsx/slicer-builder.d.ts +11 -0
  407. package/dist/esm/exporter/xlsx/slicer-builder.d.ts.map +1 -0
  408. package/dist/esm/exporter/xlsx/slicer-builder.js +84 -0
  409. package/dist/esm/exporter/xlsx/sparkline-builder.d.ts +61 -0
  410. package/dist/esm/exporter/xlsx/sparkline-builder.d.ts.map +1 -0
  411. package/dist/esm/exporter/xlsx/sparkline-builder.js +437 -0
  412. package/dist/esm/exporter/xlsx/style-builder.d.ts +93 -0
  413. package/dist/esm/exporter/xlsx/style-builder.d.ts.map +1 -0
  414. package/dist/esm/exporter/xlsx/style-builder.js +795 -0
  415. package/dist/esm/exporter/xlsx/threaded-comments-builder.d.ts +58 -0
  416. package/dist/esm/exporter/xlsx/threaded-comments-builder.d.ts.map +1 -0
  417. package/dist/esm/exporter/xlsx/threaded-comments-builder.js +175 -0
  418. package/dist/esm/exporter/xlsx/xlsx-export.d.ts +121 -0
  419. package/dist/esm/exporter/xlsx/xlsx-export.d.ts.map +1 -0
  420. package/dist/esm/exporter/xlsx/xlsx-export.js +4062 -0
  421. package/dist/esm/helpers/theme-xml-generator.d.ts +8 -0
  422. package/dist/esm/helpers/theme-xml-generator.d.ts.map +1 -0
  423. package/dist/esm/helpers/theme-xml-generator.js +33 -0
  424. package/dist/esm/helpers.d.ts +34 -0
  425. package/dist/esm/helpers.d.ts.map +1 -0
  426. package/dist/esm/helpers.js +182 -0
  427. package/dist/esm/index.d.ts +16 -0
  428. package/dist/esm/index.d.ts.map +1 -0
  429. package/dist/esm/index.js +15 -0
  430. package/dist/esm/indexed-colors.d.ts +2 -0
  431. package/dist/esm/indexed-colors.d.ts.map +1 -0
  432. package/dist/esm/indexed-colors.js +75 -0
  433. package/dist/esm/ods-export.d.ts +24 -0
  434. package/dist/esm/ods-export.d.ts.map +1 -0
  435. package/dist/esm/ods-export.js +12 -0
  436. package/dist/esm/parse.d.ts +24 -0
  437. package/dist/esm/parse.d.ts.map +1 -0
  438. package/dist/esm/parse.js +55 -0
  439. package/dist/esm/power-query.d.ts +41 -0
  440. package/dist/esm/power-query.d.ts.map +1 -0
  441. package/dist/esm/power-query.js +19 -0
  442. package/dist/esm/server.d.ts +9 -0
  443. package/dist/esm/server.d.ts.map +1 -0
  444. package/dist/esm/server.js +8 -0
  445. package/dist/esm/theme1.d.ts +3 -0
  446. package/dist/esm/theme1.d.ts.map +1 -0
  447. package/dist/esm/theme1.js +2 -0
  448. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
  449. package/dist/esm/types.d.ts +14 -0
  450. package/dist/esm/types.d.ts.map +1 -0
  451. package/dist/esm/types.js +14 -0
  452. package/dist/esm/vitest.config.d.ts +3 -0
  453. package/dist/esm/vitest.config.d.ts.map +1 -0
  454. package/dist/esm/vitest.config.js +16 -0
  455. package/package.json +62 -0
  456. package/xlsx.d.ts +52 -0
@@ -0,0 +1,2178 @@
1
+ import { __assign, __awaiter, __generator, __values } from "tslib";
2
+ import { generateSelectionsFromFormula } from "@rowsncolumns/utils";
3
+ import { uuid } from "@rowsncolumns/utils";
4
+ import { get } from "lodash-es";
5
+ /**
6
+ * Pick the data sheetId for a parsed selection. Honours the explicit
7
+ * sheet prefix in the chart's formula reference (cross-sheet charts);
8
+ * falls back to the host sheet when the formula has no prefix.
9
+ */
10
+ function pickSheetId(sheetName, hostSheetId, resolveSheetId) {
11
+ if (sheetName && resolveSheetId) {
12
+ var resolved = resolveSheetId(sheetName);
13
+ if (resolved !== undefined)
14
+ return resolved;
15
+ }
16
+ return hostSheetId;
17
+ }
18
+ // Import from index.ts in the same directory (circular dependency but resolving symbols)
19
+ // Note: We need to use type import for Workbook if needed, or functions
20
+ // In this case, we need getChartReferenceFromAnchor which was exported from workbook.ts originally
21
+ // but now is in index.ts of the plugin. However, charts.ts doesn't seem to import it based on the file content I read.
22
+ // The search_replace failed because the import wasn't there.
23
+ // Let me double check the file content again.
24
+ // The file content I read has NO imports from "../charts" or "../workbook".
25
+ // It seems I was trying to fix a linter error that I *assumed* existed or was trying to match code that wasn't there.
26
+ // The file content shows standard imports and internal functions.
27
+ function getWithFallback(source, paths) {
28
+ var e_1, _a;
29
+ try {
30
+ for (var paths_1 = __values(paths), paths_1_1 = paths_1.next(); !paths_1_1.done; paths_1_1 = paths_1.next()) {
31
+ var path = paths_1_1.value;
32
+ var value = get(source, path);
33
+ if (value !== undefined) {
34
+ return value;
35
+ }
36
+ }
37
+ }
38
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
39
+ finally {
40
+ try {
41
+ if (paths_1_1 && !paths_1_1.done && (_a = paths_1.return)) _a.call(paths_1);
42
+ }
43
+ finally { if (e_1) throw e_1.error; }
44
+ }
45
+ return undefined;
46
+ }
47
+ function toInt(value) {
48
+ var parsed = parseInt(typeof value === "number" ? String(value) : value !== null && value !== void 0 ? value : "0", 10);
49
+ return Number.isNaN(parsed) ? 0 : parsed;
50
+ }
51
+ export function processChart(chartTarget, drawingPath, anchor, sheetId, zipParser, xmlParser, sheetDimensions, resolveSheetId) {
52
+ return __awaiter(this, void 0, void 0, function () {
53
+ var chartPath, drawingDir, chartContent, chartXml, chart, chartSpaceRoot, roundedCornersRaw, roundedCornersVal, roundedCorners, chartId, title, titleTextFormat, chartType, plotArea, series, domains, dataRange, bubbleSizes, scatterStyle, hiddenDimensionStrategy, position, legend, dataLabels, _a, valueAxisOptions, secondaryValueAxisOptions, categoryAxisOptions, doughnutHoleSize, ofPieOptions, radarStyle, binCount, barLayout, err_1;
54
+ var _b;
55
+ return __generator(this, function (_c) {
56
+ switch (_c.label) {
57
+ case 0:
58
+ _c.trys.push([0, 2, , 3]);
59
+ chartPath = chartTarget;
60
+ drawingDir = drawingPath.substring(0, drawingPath.lastIndexOf("/"));
61
+ if (chartPath.startsWith("../")) {
62
+ chartPath = "xl/".concat(chartPath.replace("../", ""));
63
+ }
64
+ else if (!chartPath.startsWith("/") && !chartPath.startsWith("xl/")) {
65
+ chartPath = "".concat(drawingDir, "/").concat(chartPath);
66
+ }
67
+ return [4 /*yield*/, zipParser.getText(chartPath)];
68
+ case 1:
69
+ chartContent = _c.sent();
70
+ if (!chartContent) {
71
+ return [2 /*return*/, null];
72
+ }
73
+ chartXml = xmlParser.parse(chartContent);
74
+ chart = getWithFallback(chartXml, [
75
+ "c:chartSpace.c:chart",
76
+ "chartSpace.chart",
77
+ "chartSpace.c:chart",
78
+ "c:chartSpace.chart",
79
+ ]);
80
+ if (!chart) {
81
+ console.log("Chart data not found in file:", chartPath);
82
+ console.log("Available keys:", Object.keys(chartXml));
83
+ return [2 /*return*/, null];
84
+ }
85
+ chartSpaceRoot = getWithFallback(chartXml, [
86
+ "c:chartSpace",
87
+ "chartSpace",
88
+ ]);
89
+ roundedCornersRaw = getWithFallback(chartSpaceRoot, [
90
+ "c:roundedCorners",
91
+ "roundedCorners",
92
+ ]);
93
+ roundedCornersVal = (_b = roundedCornersRaw === null || roundedCornersRaw === void 0 ? void 0 : roundedCornersRaw.a$) === null || _b === void 0 ? void 0 : _b.val;
94
+ roundedCorners = roundedCornersVal === "1" ||
95
+ roundedCornersVal === "true" ||
96
+ roundedCornersVal === true
97
+ ? true
98
+ : undefined;
99
+ chartId = uuid();
100
+ title = extractChartTitle(chart);
101
+ titleTextFormat = extractChartTitleTextFormat(chart);
102
+ chartType = determineChartType(chart);
103
+ plotArea = getWithFallback(chart, ["c:plotArea", "plotArea"]);
104
+ series = extractChartSeries(plotArea, chartType, sheetId, resolveSheetId);
105
+ domains = extractChartDomains(plotArea, chartType, sheetId, resolveSheetId);
106
+ dataRange = extractChartDataRange(plotArea, chartType, sheetId, resolveSheetId);
107
+ bubbleSizes = chartType === "bubble"
108
+ ? extractChartBubbleSizes(plotArea, sheetId, resolveSheetId)
109
+ : undefined;
110
+ scatterStyle = chartType === "scatter" ? extractScatterStyle(plotArea) : undefined;
111
+ hiddenDimensionStrategy = extractHiddenDimensionStrategy(chart);
112
+ position = extractChartPosition(anchor, sheetId, sheetDimensions);
113
+ if (!position) {
114
+ console.log("Could not extract chart position");
115
+ return [2 /*return*/, null];
116
+ }
117
+ legend = extractLegendOptions(chart);
118
+ dataLabels = extractDataLabelsOptions(plotArea, chartType);
119
+ _a = extractAxisOptions(plotArea), valueAxisOptions = _a.valueAxisOptions, secondaryValueAxisOptions = _a.secondaryValueAxisOptions, categoryAxisOptions = _a.categoryAxisOptions;
120
+ doughnutHoleSize = chartType === "doughnut" ? extractDoughnutHoleSize(plotArea) : undefined;
121
+ ofPieOptions = chartType === "pie" ? extractOfPieOptions(plotArea) : undefined;
122
+ radarStyle = chartType === "radar" ? extractRadarStyle(plotArea) : undefined;
123
+ binCount = chartType === "histogram"
124
+ ? extractC15HistogramBinCount(plotArea)
125
+ : undefined;
126
+ barLayout = chartType === "bar" || chartType === "column"
127
+ ? extractBarLayoutOptions(plotArea)
128
+ : undefined;
129
+ return [2 /*return*/, {
130
+ chartId: chartId,
131
+ spec: __assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign({ title: title }, (titleTextFormat ? { titleTextFormat: titleTextFormat } : {})), { chartType: chartType, domains: domains, series: series, dataRange: dataRange, hiddenDimensionStrategy: hiddenDimensionStrategy }), (chartType === "scatter" || chartType === "bubble"
132
+ ? { bubbleLabels: [] }
133
+ : {})), (bubbleSizes && bubbleSizes.length ? { bubbleSizes: bubbleSizes } : {})), (scatterStyle
134
+ ? { scatterStyle: scatterStyle }
135
+ : {})), (legend ? { legend: legend } : {})), (dataLabels ? { dataLabels: dataLabels } : {})), (valueAxisOptions ? { valueAxisOptions: valueAxisOptions } : {})), (secondaryValueAxisOptions
136
+ ? { secondaryValueAxisOptions: secondaryValueAxisOptions }
137
+ : {})), (categoryAxisOptions ? { categoryAxisOptions: categoryAxisOptions } : {})), (typeof doughnutHoleSize === "number"
138
+ ? { doughnutHoleSize: doughnutHoleSize }
139
+ : {})), (ofPieOptions
140
+ ? __assign({ sourceChartType: "OF_PIE" }, ofPieOptions) : {})), (radarStyle ? { radarStyle: radarStyle } : {})), (typeof binCount === "number" ? { binCount: binCount } : {})), ((barLayout === null || barLayout === void 0 ? void 0 : barLayout.stackedType)
141
+ ? { stackedType: barLayout.stackedType }
142
+ : {})), (typeof (barLayout === null || barLayout === void 0 ? void 0 : barLayout.overlap) === "number"
143
+ ? { overlap: barLayout.overlap }
144
+ : {})), (typeof (barLayout === null || barLayout === void 0 ? void 0 : barLayout.gapWidth) === "number"
145
+ ? { gapWidth: barLayout.gapWidth }
146
+ : {})), (roundedCorners ? { roundedCorners: roundedCorners } : {})),
147
+ position: position,
148
+ id: chartId,
149
+ type: "chart",
150
+ }];
151
+ case 2:
152
+ err_1 = _c.sent();
153
+ console.log("Error processing chart:", err_1);
154
+ return [2 /*return*/, null];
155
+ case 3: return [2 /*return*/];
156
+ }
157
+ });
158
+ });
159
+ }
160
+ // Helper to get series elements with namespace fallbacks
161
+ function getSeriesElements(plotArea, chartType) {
162
+ switch (chartType) {
163
+ case "bar":
164
+ case "column":
165
+ // Phase 5.5 — c15 extension chart types emit a c:barChart body
166
+ // for older-Excel compatibility, so their series live in the same
167
+ // place as a bar/column chart. Phase 5.5b — histogram additionally
168
+ // wraps the barChart in mc:AlternateContent > mc:Fallback, so we
169
+ // also probe that path.
170
+ case "histogram":
171
+ case "boxplot":
172
+ case "waterfall":
173
+ case "funnel":
174
+ return getWithFallback(plotArea, [
175
+ "c:barChart.c:ser",
176
+ "barChart.ser",
177
+ "c:bar3DChart.c:ser",
178
+ "bar3DChart.ser",
179
+ "mc:AlternateContent.mc:Fallback.c:barChart.c:ser",
180
+ "AlternateContent.Fallback.barChart.ser",
181
+ ]);
182
+ case "line":
183
+ return getWithFallback(plotArea, [
184
+ "c:lineChart.c:ser",
185
+ "lineChart.ser",
186
+ "c:line3DChart.c:ser",
187
+ "line3DChart.ser",
188
+ ]);
189
+ case "pie":
190
+ return getWithFallback(plotArea, [
191
+ "c:pieChart.c:ser",
192
+ "pieChart.ser",
193
+ "c:pie3DChart.c:ser",
194
+ "pie3DChart.ser",
195
+ // pie-of-pie / bar-of-pie — determineChartType maps
196
+ // <c:ofPieChart> to "pie", so its series live here too.
197
+ "c:ofPieChart.c:ser",
198
+ "ofPieChart.ser",
199
+ ]);
200
+ case "doughnut":
201
+ return getWithFallback(plotArea, [
202
+ "c:doughnutChart.c:ser",
203
+ "doughnutChart.ser",
204
+ ]);
205
+ case "area":
206
+ return getWithFallback(plotArea, [
207
+ "c:areaChart.c:ser",
208
+ "areaChart.ser",
209
+ "c:area3DChart.c:ser",
210
+ "area3DChart.ser",
211
+ ]);
212
+ case "radar":
213
+ return getWithFallback(plotArea, ["c:radarChart.c:ser", "radarChart.ser"]);
214
+ case "stock":
215
+ return getWithFallback(plotArea, ["c:stockChart.c:ser", "stockChart.ser"]);
216
+ case "scatter":
217
+ return getWithFallback(plotArea, [
218
+ "c:scatterChart.c:ser",
219
+ "scatterChart.ser",
220
+ ]);
221
+ case "bubble":
222
+ return getWithFallback(plotArea, [
223
+ "c:bubbleChart.c:ser",
224
+ "bubbleChart.ser",
225
+ ]);
226
+ default:
227
+ return getWithFallback(plotArea, ["c:barChart.c:ser", "barChart.ser"]);
228
+ }
229
+ }
230
+ // Path tuples used by the per-series ref extractors below. We accept
231
+ // both namespaced and stripped forms because fast-xml-parser is
232
+ // configured both ways in different code paths.
233
+ var X_VAL_REF_PATHS = [
234
+ "c:xVal.c:numRef.c:f",
235
+ "c:xVal.c:numRef.c:f.t$",
236
+ "xVal.numRef.f",
237
+ "xVal.numRef.f.t$",
238
+ // scatter X axis can also be string (categorical X)
239
+ "c:xVal.c:strRef.c:f",
240
+ "c:xVal.c:strRef.c:f.t$",
241
+ "xVal.strRef.f",
242
+ "xVal.strRef.f.t$",
243
+ ];
244
+ var Y_VAL_REF_PATHS = [
245
+ "c:yVal.c:numRef.c:f",
246
+ "c:yVal.c:numRef.c:f.t$",
247
+ "yVal.numRef.f",
248
+ "yVal.numRef.f.t$",
249
+ ];
250
+ var BUBBLE_SIZE_REF_PATHS = [
251
+ "c:bubbleSize.c:numRef.c:f",
252
+ "c:bubbleSize.c:numRef.c:f.t$",
253
+ "bubbleSize.numRef.f",
254
+ "bubbleSize.numRef.f.t$",
255
+ ];
256
+ var CAT_REF_PATHS = [
257
+ "c:cat.c:strRef.c:f",
258
+ "c:cat.c:numRef.c:f",
259
+ "c:cat.c:strRef.c:f.t$",
260
+ "c:cat.c:numRef.c:f.t$",
261
+ "cat.strRef.f",
262
+ "cat.numRef.f",
263
+ "cat.strRef.f.t$",
264
+ "cat.numRef.f.t$",
265
+ ];
266
+ var VAL_REF_PATHS = [
267
+ "c:val.c:numRef.c:f",
268
+ "c:val.c:numRef.c:f.t$",
269
+ "val.numRef.f",
270
+ "val.numRef.f.t$",
271
+ ];
272
+ var TX_REF_PATHS = [
273
+ "c:tx.c:strRef.c:f",
274
+ "c:tx.c:strRef.c:f.t$",
275
+ "tx.strRef.f",
276
+ "tx.strRef.f.t$",
277
+ ];
278
+ var isXYChart = function (chartType) {
279
+ return chartType === "scatter" || chartType === "bubble";
280
+ };
281
+ // Extract the overall data range for the chart
282
+ export function extractChartDataRange(plotArea, chartType, sheetId, resolveSheetId) {
283
+ var e_2, _a;
284
+ try {
285
+ var seriesElements = getSeriesElements(plotArea, chartType);
286
+ if (!seriesElements)
287
+ return null;
288
+ var seriesArray = Array.isArray(seriesElements)
289
+ ? seriesElements
290
+ : [seriesElements];
291
+ // Collect all ranges from the chart, tagged with their parsed
292
+ // sheet name so cross-sheet refs can be honoured.
293
+ var allRanges = [];
294
+ try {
295
+ for (var seriesArray_1 = __values(seriesArray), seriesArray_1_1 = seriesArray_1.next(); !seriesArray_1_1.done; seriesArray_1_1 = seriesArray_1.next()) {
296
+ var ser = seriesArray_1_1.value;
297
+ if (isXYChart(chartType)) {
298
+ var xRef = getWithFallback(ser, X_VAL_REF_PATHS);
299
+ var yRef = getWithFallback(ser, Y_VAL_REF_PATHS);
300
+ var sizeRef = chartType === "bubble"
301
+ ? getWithFallback(ser, BUBBLE_SIZE_REF_PATHS)
302
+ : undefined;
303
+ var nameRef = getWithFallback(ser, TX_REF_PATHS);
304
+ if (xRef)
305
+ allRanges.push(xRef);
306
+ if (yRef)
307
+ allRanges.push(yRef);
308
+ if (sizeRef)
309
+ allRanges.push(sizeRef);
310
+ if (nameRef)
311
+ allRanges.push(nameRef);
312
+ }
313
+ else {
314
+ var catRef = getWithFallback(ser, CAT_REF_PATHS);
315
+ var valRef = getWithFallback(ser, VAL_REF_PATHS);
316
+ var nameRef = getWithFallback(ser, TX_REF_PATHS);
317
+ if (catRef)
318
+ allRanges.push(catRef);
319
+ if (valRef)
320
+ allRanges.push(valRef);
321
+ if (nameRef)
322
+ allRanges.push(nameRef);
323
+ }
324
+ }
325
+ }
326
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
327
+ finally {
328
+ try {
329
+ if (seriesArray_1_1 && !seriesArray_1_1.done && (_a = seriesArray_1.return)) _a.call(seriesArray_1);
330
+ }
331
+ finally { if (e_2) throw e_2.error; }
332
+ }
333
+ if (allRanges.length === 0)
334
+ return null;
335
+ // Bounding range is computed per-sheet — different ranges may live
336
+ // on different sheets (a chart referencing both the host sheet and
337
+ // a data sheet, for example). Per Excel, the chart's "data range"
338
+ // is logically the union of inputs; we pick the first sheet's
339
+ // bounding box as the reportable dataRange and pin the rest via
340
+ // the per-series sources.
341
+ var boundingRange = calculateBoundingRange(allRanges);
342
+ if (boundingRange) {
343
+ var selections = generateSelectionsFromFormula("=".concat(boundingRange));
344
+ if (selections.length > 0) {
345
+ var sel = selections[0];
346
+ var resolved = pickSheetId(sel.sheetName, sheetId, resolveSheetId);
347
+ return __assign(__assign({}, sel.range), { sheetId: resolved });
348
+ }
349
+ }
350
+ return null;
351
+ }
352
+ catch (err) {
353
+ console.log("Error extracting chart data range:", err);
354
+ return null;
355
+ }
356
+ }
357
+ // Calculate the bounding range that encompasses all the individual ranges
358
+ function calculateBoundingRange(ranges) {
359
+ var e_3, _a;
360
+ try {
361
+ var minRow = Infinity;
362
+ var maxRow = -Infinity;
363
+ var minCol = Infinity;
364
+ var maxCol = -Infinity;
365
+ var sheetName = "";
366
+ try {
367
+ for (var ranges_1 = __values(ranges), ranges_1_1 = ranges_1.next(); !ranges_1_1.done; ranges_1_1 = ranges_1.next()) {
368
+ var range = ranges_1_1.value;
369
+ // Parse each range (e.g., "Sheet1!$A$2:$A$20" or "Sheet1!$C$1")
370
+ var selections = generateSelectionsFromFormula("=".concat(range));
371
+ if (selections.length > 0) {
372
+ var sel = selections[0];
373
+ // Extract sheet name from the first range
374
+ if (!sheetName && range.includes("!")) {
375
+ sheetName = range.split("!")[0];
376
+ }
377
+ // Update bounding box
378
+ minRow = Math.min(minRow, sel.range.startRowIndex);
379
+ maxRow = Math.max(maxRow, sel.range.endRowIndex);
380
+ minCol = Math.min(minCol, sel.range.startColumnIndex);
381
+ maxCol = Math.max(maxCol, sel.range.endColumnIndex);
382
+ }
383
+ }
384
+ }
385
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
386
+ finally {
387
+ try {
388
+ if (ranges_1_1 && !ranges_1_1.done && (_a = ranges_1.return)) _a.call(ranges_1);
389
+ }
390
+ finally { if (e_3) throw e_3.error; }
391
+ }
392
+ if (minRow === Infinity || minCol === Infinity) {
393
+ return null;
394
+ }
395
+ // Convert back to Excel range format
396
+ var startCell = columnIndexToLetter(minCol) + minRow;
397
+ var endCell = columnIndexToLetter(maxCol) + maxRow;
398
+ var rangeStr = startCell === endCell ? startCell : "".concat(startCell, ":").concat(endCell);
399
+ return sheetName ? "".concat(sheetName, "!").concat(rangeStr) : rangeStr;
400
+ }
401
+ catch (err) {
402
+ console.log("Error calculating bounding range:", err);
403
+ return null;
404
+ }
405
+ }
406
+ // Helper function to convert column index to letter (1 -> A, 2 -> B, etc.)
407
+ function columnIndexToLetter(index) {
408
+ var result = "";
409
+ var num = index;
410
+ while (num > 0) {
411
+ num--;
412
+ result = String.fromCharCode(65 + (num % 26)) + result;
413
+ num = Math.floor(num / 26);
414
+ }
415
+ return result;
416
+ }
417
+ /**
418
+ * Extract hidden dimension strategy from plotVisOnly attribute
419
+ * In Excel: plotVisOnly="1" means skip hidden rows/columns, "0" means show all
420
+ */
421
+ export function extractHiddenDimensionStrategy(chart) {
422
+ var plotVisOnly = getWithFallback(chart, [
423
+ "c:plotVisOnly.a$.val",
424
+ "c:plotVisOnly.a$.t$",
425
+ "plotVisOnly.a$.val",
426
+ "plotVisOnly.a$.t$",
427
+ ]);
428
+ if (plotVisOnly === undefined) {
429
+ return undefined;
430
+ }
431
+ // "1" or "true" = skip hidden cells, "0" or "false" = show all
432
+ var skipHidden = plotVisOnly === "1" || plotVisOnly === "true" || plotVisOnly === true;
433
+ return skipHidden ? "SKIP_HIDDEN_ROWS_AND_COLUMNS" : "SHOW_ALL";
434
+ }
435
+ /**
436
+ * Read the chart title's text formatting. Excel chart titles can be
437
+ * styled two ways:
438
+ * - via `<c:title><c:txPr>` (paragraph default, affects future
439
+ * content); writers use this when no inline rich text is present.
440
+ * - via `<c:title><c:tx><c:rich>` (the title text itself, with
441
+ * per-paragraph `<a:pPr><a:defRPr>` carrying the styling).
442
+ * We probe both, with the rich-text path winning when present (it's
443
+ * the more explicit signal). Returns `undefined` when neither carries
444
+ * formatting so the renderer falls back to its theme defaults.
445
+ */
446
+ function extractChartTitleTextFormat(chart) {
447
+ var _a, _b, _c;
448
+ var title = (_a = get(chart, "c:title")) !== null && _a !== void 0 ? _a : get(chart, "title");
449
+ if (!title)
450
+ return undefined;
451
+ var richTxPr = (_b = get(title, "c:tx.c:rich")) !== null && _b !== void 0 ? _b : get(title, "tx.rich");
452
+ var fromRich = extractTextProperties(richTxPr);
453
+ if (fromRich)
454
+ return fromRich;
455
+ var txPr = (_c = get(title, "c:txPr")) !== null && _c !== void 0 ? _c : get(title, "txPr");
456
+ return extractTextProperties(txPr);
457
+ }
458
+ export function extractChartTitle(chart) {
459
+ // Try different possible paths for chart title
460
+ var title =
461
+ // Rich text format (your current structure)
462
+ get(chart, "c:title.c:tx.c:rich.a:p.a:r.a:t") ||
463
+ // Alternative rich text paths
464
+ get(chart, "c:title.c:tx.c:rich.a:p.a:r.a:t.t$") ||
465
+ // String reference format
466
+ get(chart, "c:title.c:tx.c:strRef.c:strCache.c:pt.c:v") ||
467
+ get(chart, "c:title.c:tx.c:strRef.c:strCache.c:pt.c:v.t$") ||
468
+ // Direct value format
469
+ get(chart, "c:title.c:tx.c:v") ||
470
+ get(chart, "c:title.c:tx.c:v.t$") ||
471
+ // Simple text format
472
+ get(chart, "c:title.c:tx") ||
473
+ // Fallback: look for any text in title
474
+ extractTextFromTitle(get(chart, "c:title")) ||
475
+ "";
476
+ return typeof title === "string" ? title : "";
477
+ }
478
+ // Helper function to recursively search for text in title structure
479
+ function extractTextFromTitle(titleObj) {
480
+ if (!titleObj)
481
+ return "";
482
+ // If it's already a string, return it
483
+ if (typeof titleObj === "string")
484
+ return titleObj;
485
+ // Look for common text properties
486
+ if (titleObj["a:t"])
487
+ return titleObj["a:t"];
488
+ if (titleObj.t$)
489
+ return titleObj.t$;
490
+ if (titleObj.text)
491
+ return titleObj.text;
492
+ if (titleObj.value)
493
+ return titleObj.value;
494
+ // Recursively search through nested objects
495
+ for (var key in titleObj) {
496
+ if (typeof titleObj[key] === "object") {
497
+ var result = extractTextFromTitle(titleObj[key]);
498
+ if (result)
499
+ return result;
500
+ }
501
+ }
502
+ return "";
503
+ }
504
+ export function determineChartType(chart) {
505
+ var plotArea = getWithFallback(chart, ["c:plotArea", "plotArea"]);
506
+ // c15 extension marker (Phase 5.5): if the plotArea's c:extLst tags
507
+ // the chart as histogram / boxplot / waterfall / funnel, that overrides
508
+ // the bar-chart fallback the body uses for older-Excel compatibility.
509
+ var c15Type = detectC15ChartType(plotArea);
510
+ if (c15Type)
511
+ return c15Type;
512
+ var barChart = getWithFallback(plotArea, [
513
+ "c:barChart",
514
+ "barChart",
515
+ "c:bar3DChart",
516
+ "bar3DChart",
517
+ ]);
518
+ if (barChart) {
519
+ var direction = get(barChart, "c:barDir.a$.val") ||
520
+ get(barChart, "c:barDir.a$.t$") ||
521
+ get(barChart, "barDir.a$.val") ||
522
+ get(barChart, "barDir.a$.t$") ||
523
+ get(barChart, "c:barDir.a$.v") ||
524
+ get(barChart, "barDir.a$.v");
525
+ return direction === "bar" ? "bar" : "column";
526
+ }
527
+ if (getWithFallback(plotArea, [
528
+ "c:lineChart",
529
+ "lineChart",
530
+ "c:line3DChart",
531
+ "line3DChart",
532
+ ]))
533
+ return "line";
534
+ // OOXML uses a dedicated <c:doughnutChart> element. Check it before
535
+ // <c:pieChart>/<c:ofPieChart> so the more-specific shape wins.
536
+ if (getWithFallback(plotArea, ["c:doughnutChart", "doughnutChart"]))
537
+ return "doughnut";
538
+ // pie-of-pie / bar-of-pie — the renderer draws the composite from a
539
+ // plain "pie" chartType plus sourceChartType "OF_PIE" and the of-pie
540
+ // split fields (extracted in extractOfPieOptions).
541
+ if (getWithFallback(plotArea, ["c:ofPieChart", "ofPieChart"]))
542
+ return "pie";
543
+ if (getWithFallback(plotArea, [
544
+ "c:pieChart",
545
+ "pieChart",
546
+ "c:pie3DChart",
547
+ "pie3DChart",
548
+ ]))
549
+ return "pie";
550
+ if (getWithFallback(plotArea, [
551
+ "c:areaChart",
552
+ "areaChart",
553
+ "c:area3DChart",
554
+ "area3DChart",
555
+ ]))
556
+ return "area";
557
+ if (getWithFallback(plotArea, ["c:radarChart", "radarChart"]))
558
+ return "radar";
559
+ if (getWithFallback(plotArea, ["c:stockChart", "stockChart"]))
560
+ return "stock";
561
+ // Scatter and bubble — both use c:xVal/c:yVal series shape (not
562
+ // c:cat/c:val like other charts). Bubble additionally has c:bubbleSize.
563
+ if (getWithFallback(plotArea, ["c:scatterChart", "scatterChart"]))
564
+ return "scatter";
565
+ if (getWithFallback(plotArea, ["c:bubbleChart", "bubbleChart"]))
566
+ return "bubble";
567
+ return "column"; // default
568
+ }
569
+ /**
570
+ * Phase 5.5 — detect the c15 extension marker our exporter writes on
571
+ * the plotArea. Returns the originating chart type (histogram /
572
+ * boxplot / waterfall / funnel) or null if no marker is present.
573
+ *
574
+ * The marker shape is:
575
+ * c:plotArea > c:extLst > c:ext (uri = ...) > c15:<chartName>Chart
576
+ *
577
+ * We accept either array or single-object shape for `c:ext` since
578
+ * fast-xml-parser normalizes lone children to objects.
579
+ */
580
+ function detectC15ChartType(plotArea) {
581
+ var e_4, _a, e_5, _b;
582
+ if (!plotArea)
583
+ return null;
584
+ // Empty c15 elements (`<c15:histogramChart/>`) parse to "" — truthy
585
+ // checks skip them, so we test for key presence instead.
586
+ var hasKey = function (obj, key) {
587
+ return obj != null && Object.prototype.hasOwnProperty.call(obj, key);
588
+ };
589
+ // Phase 5.5b: c15 chart wrapped in mc:AlternateContent > mc:Choice.
590
+ // This is the Excel-native shape — modern Excel renders the chart
591
+ // from here, older Excel uses mc:Fallback (a c:barChart).
592
+ var altContent = getWithFallback(plotArea, [
593
+ "mc:AlternateContent",
594
+ "AlternateContent",
595
+ ]);
596
+ if (altContent) {
597
+ var choice = getWithFallback(altContent, ["mc:Choice", "Choice"]);
598
+ if (choice) {
599
+ var choices = Array.isArray(choice) ? choice : [choice];
600
+ try {
601
+ for (var choices_1 = __values(choices), choices_1_1 = choices_1.next(); !choices_1_1.done; choices_1_1 = choices_1.next()) {
602
+ var c = choices_1_1.value;
603
+ if (hasKey(c, "c15:histogramChart") || hasKey(c, "histogramChart"))
604
+ return "histogram";
605
+ if (hasKey(c, "c15:boxWhiskerChart") || hasKey(c, "boxWhiskerChart"))
606
+ return "boxplot";
607
+ if (hasKey(c, "c15:waterfallChart") || hasKey(c, "waterfallChart"))
608
+ return "waterfall";
609
+ if (hasKey(c, "c15:funnelChart") || hasKey(c, "funnelChart"))
610
+ return "funnel";
611
+ }
612
+ }
613
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
614
+ finally {
615
+ try {
616
+ if (choices_1_1 && !choices_1_1.done && (_a = choices_1.return)) _a.call(choices_1);
617
+ }
618
+ finally { if (e_4) throw e_4.error; }
619
+ }
620
+ }
621
+ }
622
+ // Phase 5.5 (legacy): c15 extension marker inside c:extLst > c:ext.
623
+ // Round-trips through our pipeline; opens as bar chart in Excel.
624
+ // Kept so files written by older versions of this code still parse.
625
+ var extLst = getWithFallback(plotArea, ["c:extLst", "extLst"]);
626
+ if (!extLst)
627
+ return null;
628
+ var extNode = getWithFallback(extLst, ["c:ext", "ext"]);
629
+ if (!extNode)
630
+ return null;
631
+ var exts = Array.isArray(extNode) ? extNode : [extNode];
632
+ try {
633
+ for (var exts_1 = __values(exts), exts_1_1 = exts_1.next(); !exts_1_1.done; exts_1_1 = exts_1.next()) {
634
+ var ext = exts_1_1.value;
635
+ if (!ext)
636
+ continue;
637
+ if (hasKey(ext, "c15:histogramChart") || hasKey(ext, "histogramChart"))
638
+ return "histogram";
639
+ if (hasKey(ext, "c15:boxWhiskerChart") || hasKey(ext, "boxWhiskerChart"))
640
+ return "boxplot";
641
+ if (hasKey(ext, "c15:waterfallChart") || hasKey(ext, "waterfallChart"))
642
+ return "waterfall";
643
+ if (hasKey(ext, "c15:funnelChart") || hasKey(ext, "funnelChart"))
644
+ return "funnel";
645
+ }
646
+ }
647
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
648
+ finally {
649
+ try {
650
+ if (exts_1_1 && !exts_1_1.done && (_b = exts_1.return)) _b.call(exts_1);
651
+ }
652
+ finally { if (e_5) throw e_5.error; }
653
+ }
654
+ return null;
655
+ }
656
+ /**
657
+ * Phase 5.5 — pull binCount out of the c15:histogramChart extension
658
+ * marker. Returns undefined if absent.
659
+ */
660
+ export function extractC15HistogramBinCount(plotArea) {
661
+ var e_6, _a, e_7, _b;
662
+ var _c, _d, _e, _f;
663
+ if (!plotArea)
664
+ return undefined;
665
+ var readBinCount = function (hist) {
666
+ var _a, _b, _c;
667
+ if (!hist)
668
+ return undefined;
669
+ var raw = (_c = (_b = (_a = get(hist, "c15:binCount.a$.val")) !== null && _a !== void 0 ? _a : get(hist, "binCount.a$.val")) !== null && _b !== void 0 ? _b : get(hist, "c15:binCount.a$.v")) !== null && _c !== void 0 ? _c : get(hist, "binCount.a$.v");
670
+ if (raw === undefined || raw === null)
671
+ return undefined;
672
+ var num = Number(raw);
673
+ return Number.isFinite(num) ? num : undefined;
674
+ };
675
+ // Phase 5.5b: histogram inside mc:AlternateContent > mc:Choice.
676
+ var altContent = getWithFallback(plotArea, [
677
+ "mc:AlternateContent",
678
+ "AlternateContent",
679
+ ]);
680
+ if (altContent) {
681
+ var choice = getWithFallback(altContent, ["mc:Choice", "Choice"]);
682
+ var choices = Array.isArray(choice)
683
+ ? choice
684
+ : choice
685
+ ? [choice]
686
+ : [];
687
+ try {
688
+ for (var choices_2 = __values(choices), choices_2_1 = choices_2.next(); !choices_2_1.done; choices_2_1 = choices_2.next()) {
689
+ var c = choices_2_1.value;
690
+ var hist = (_d = (_c = c === null || c === void 0 ? void 0 : c["c15:histogramChart"]) !== null && _c !== void 0 ? _c : c === null || c === void 0 ? void 0 : c["histogramChart"]) !== null && _d !== void 0 ? _d : null;
691
+ var v = readBinCount(hist);
692
+ if (v !== undefined)
693
+ return v;
694
+ }
695
+ }
696
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
697
+ finally {
698
+ try {
699
+ if (choices_2_1 && !choices_2_1.done && (_a = choices_2.return)) _a.call(choices_2);
700
+ }
701
+ finally { if (e_6) throw e_6.error; }
702
+ }
703
+ }
704
+ // Phase 5.5 (legacy): histogram inside c:extLst > c:ext marker.
705
+ var extLst = getWithFallback(plotArea, ["c:extLst", "extLst"]);
706
+ if (!extLst)
707
+ return undefined;
708
+ var extNode = getWithFallback(extLst, ["c:ext", "ext"]);
709
+ if (!extNode)
710
+ return undefined;
711
+ var exts = Array.isArray(extNode) ? extNode : [extNode];
712
+ try {
713
+ for (var exts_2 = __values(exts), exts_2_1 = exts_2.next(); !exts_2_1.done; exts_2_1 = exts_2.next()) {
714
+ var ext = exts_2_1.value;
715
+ var hist = (_f = (_e = ext === null || ext === void 0 ? void 0 : ext["c15:histogramChart"]) !== null && _e !== void 0 ? _e : ext === null || ext === void 0 ? void 0 : ext["histogramChart"]) !== null && _f !== void 0 ? _f : null;
716
+ var v = readBinCount(hist);
717
+ if (v !== undefined)
718
+ return v;
719
+ }
720
+ }
721
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
722
+ finally {
723
+ try {
724
+ if (exts_2_1 && !exts_2_1.done && (_b = exts_2.return)) _b.call(exts_2);
725
+ }
726
+ finally { if (e_7) throw e_7.error; }
727
+ }
728
+ return undefined;
729
+ }
730
+ // Chart type containers to search for series. Combo charts can mix
731
+ // multiple containers (e.g. column + line on one chart), so we iterate
732
+ // through all of them. XY charts (scatter/bubble) have a different
733
+ // per-series shape (xVal/yVal/bubbleSize) and require their own series
734
+ // extractor — they're listed here so combo charts that mix XY with
735
+ // non-XY series (rare but valid in OOXML) still pick up both.
736
+ var CHART_TYPE_CONTAINERS = [
737
+ {
738
+ paths: ["c:barChart", "barChart", "c:bar3DChart", "bar3DChart"],
739
+ chartType: "column",
740
+ isBar: true,
741
+ },
742
+ {
743
+ paths: ["c:lineChart", "lineChart", "c:line3DChart", "line3DChart"],
744
+ chartType: "line",
745
+ },
746
+ {
747
+ paths: ["c:areaChart", "areaChart", "c:area3DChart", "area3DChart"],
748
+ chartType: "area",
749
+ },
750
+ {
751
+ paths: ["c:scatterChart", "scatterChart"],
752
+ chartType: "scatter",
753
+ isXY: true,
754
+ },
755
+ {
756
+ paths: ["c:bubbleChart", "bubbleChart"],
757
+ chartType: "bubble",
758
+ isXY: true,
759
+ },
760
+ ];
761
+ /**
762
+ * Resolve a chart-formula range string (e.g.
763
+ * `'Data for the Chart'!$A$7:$A$26`) into the sources array our chart
764
+ * model expects (one entry per parsed selection, with the data sheet's
765
+ * sheetId — not the chart's host sheet).
766
+ */
767
+ function resolveSourcesFromRef(ref, hostSheetId, resolveSheetId) {
768
+ var selections = generateSelectionsFromFormula("=".concat(ref));
769
+ return selections.map(function (sel) { return (__assign(__assign({}, sel.range), { sheetId: pickSheetId(sel.sheetName, hostSheetId, resolveSheetId) })); });
770
+ }
771
+ /**
772
+ * Extract inline values from a `<c:strLit>` or `<c:numLit>` element —
773
+ * these appear when chart data is embedded directly in the chart XML
774
+ * rather than referencing the sheet (Event Budget.xlsx uses this for
775
+ * its `["Estimated", "Actual"]` category labels).
776
+ *
777
+ * Returns the values ordered by their `idx` attribute (Excel allows
778
+ * sparse indices). Returns `undefined` when no inline data is present.
779
+ */
780
+ function extractInlineValues(node) {
781
+ var e_8, _a;
782
+ var _b, _c, _d, _e;
783
+ if (!node)
784
+ return undefined;
785
+ var strLit = (_b = get(node, "c:strLit")) !== null && _b !== void 0 ? _b : get(node, "strLit");
786
+ var numLit = (_c = get(node, "c:numLit")) !== null && _c !== void 0 ? _c : get(node, "numLit");
787
+ var lit = strLit !== null && strLit !== void 0 ? strLit : numLit;
788
+ if (!lit)
789
+ return undefined;
790
+ var pts = (_d = get(lit, "c:pt")) !== null && _d !== void 0 ? _d : get(lit, "pt");
791
+ if (!pts)
792
+ return [];
793
+ var ptArray = Array.isArray(pts) ? pts : [pts];
794
+ // Order by the `idx` attribute. Most files emit them in order but
795
+ // spec permits any order; we honour that to avoid mis-aligning the
796
+ // first column when authors hand-craft chart XML.
797
+ var indexed = [];
798
+ try {
799
+ for (var ptArray_1 = __values(ptArray), ptArray_1_1 = ptArray_1.next(); !ptArray_1_1.done; ptArray_1_1 = ptArray_1.next()) {
800
+ var pt = ptArray_1_1.value;
801
+ var idxAttr = get(pt, "a$.idx");
802
+ var idx = idxAttr !== undefined ? Number(idxAttr) : indexed.length;
803
+ var rawV = (_e = get(pt, "c:v")) !== null && _e !== void 0 ? _e : get(pt, "v");
804
+ var v = void 0;
805
+ if (typeof rawV === "number" || typeof rawV === "boolean") {
806
+ v = rawV;
807
+ }
808
+ else if (numLit && typeof rawV === "string" && rawV.trim() !== "") {
809
+ var n = Number(rawV);
810
+ v = Number.isFinite(n) ? n : rawV;
811
+ }
812
+ else {
813
+ v = typeof rawV === "string" ? rawV : String(rawV !== null && rawV !== void 0 ? rawV : "");
814
+ }
815
+ indexed.push({ idx: Number.isFinite(idx) ? idx : indexed.length, v: v });
816
+ }
817
+ }
818
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
819
+ finally {
820
+ try {
821
+ if (ptArray_1_1 && !ptArray_1_1.done && (_a = ptArray_1.return)) _a.call(ptArray_1);
822
+ }
823
+ finally { if (e_8) throw e_8.error; }
824
+ }
825
+ indexed.sort(function (a, b) { return a.idx - b.idx; });
826
+ return indexed.map(function (entry) { return entry.v; });
827
+ }
828
+ export function extractChartSeries(plotArea, chartType, sheetId, resolveSheetId) {
829
+ var e_9, _a, e_10, _b;
830
+ var _c, _d;
831
+ var series = [];
832
+ var seriesIndex = 0;
833
+ try {
834
+ // Iterate through all chart type containers to support combo charts
835
+ for (var CHART_TYPE_CONTAINERS_1 = __values(CHART_TYPE_CONTAINERS), CHART_TYPE_CONTAINERS_1_1 = CHART_TYPE_CONTAINERS_1.next(); !CHART_TYPE_CONTAINERS_1_1.done; CHART_TYPE_CONTAINERS_1_1 = CHART_TYPE_CONTAINERS_1.next()) {
836
+ var container = CHART_TYPE_CONTAINERS_1_1.value;
837
+ var chartElement = getWithFallback(plotArea, container.paths);
838
+ if (!chartElement)
839
+ continue;
840
+ // Handle case where chart element is an array (e.g., multiple c:lineChart elements)
841
+ var chartElements = Array.isArray(chartElement)
842
+ ? chartElement
843
+ : [chartElement];
844
+ try {
845
+ for (var chartElements_1 = (e_10 = void 0, __values(chartElements)), chartElements_1_1 = chartElements_1.next(); !chartElements_1_1.done; chartElements_1_1 = chartElements_1.next()) {
846
+ var singleChartElement = chartElements_1_1.value;
847
+ // Determine the actual chart type for this container
848
+ var seriesChartType = container.chartType;
849
+ if (container.isBar) {
850
+ // Check barDir to distinguish bar vs column
851
+ var direction = get(singleChartElement, "c:barDir.a$.val") ||
852
+ get(singleChartElement, "c:barDir.a$.t$") ||
853
+ get(singleChartElement, "barDir.a$.val") ||
854
+ get(singleChartElement, "barDir.a$.t$");
855
+ seriesChartType = direction === "bar" ? "bar" : "column";
856
+ }
857
+ // Get series elements from this container
858
+ var seriesElements = getWithFallback(singleChartElement, [
859
+ "c:ser",
860
+ "ser",
861
+ ]);
862
+ if (!seriesElements)
863
+ continue;
864
+ var seriesArray = Array.isArray(seriesElements)
865
+ ? seriesElements
866
+ : [seriesElements];
867
+ for (var i = 0; i < seriesArray.length; i++) {
868
+ var ser = seriesArray[i];
869
+ // Scatter/bubble — "series" carries Y values (yVal). Non-XY —
870
+ // it carries c:val.
871
+ var valRef = container.isXY
872
+ ? getWithFallback(ser, Y_VAL_REF_PATHS)
873
+ : getWithFallback(ser, VAL_REF_PATHS);
874
+ var seriesTitle = extractSeriesTitleFromSeries(ser);
875
+ var colorInfo = extractSeriesColorInfo(ser);
876
+ // Resolve the series' value source — preferring the cell-range
877
+ // reference and falling back to inline `<c:numLit>`/`<c:strLit>`
878
+ // when there's no range (rare for series values, common for
879
+ // tiny embedded charts).
880
+ var sources = [];
881
+ var inlineValues = void 0;
882
+ if (valRef) {
883
+ sources = resolveSourcesFromRef(valRef, sheetId, resolveSheetId);
884
+ }
885
+ if (!sources.length) {
886
+ var valNode = container.isXY
887
+ ? (_c = get(ser, "c:yVal")) !== null && _c !== void 0 ? _c : get(ser, "yVal")
888
+ : (_d = get(ser, "c:val")) !== null && _d !== void 0 ? _d : get(ser, "val");
889
+ inlineValues = extractInlineValues(valNode);
890
+ }
891
+ if (!sources.length && (!inlineValues || !inlineValues.length)) {
892
+ seriesIndex++;
893
+ continue;
894
+ }
895
+ var trendlines = extractTrendlines(ser);
896
+ var errorBars = extractErrorBars(ser, sheetId, resolveSheetId);
897
+ var marker = extractSeriesMarker(ser);
898
+ var dataPointColors = extractSeriesDataPointColors(ser);
899
+ var nameRef = getWithFallback(ser, TX_REF_PATHS);
900
+ // Per-series category reference — charts whose series plot against
901
+ // different category ranges can't be represented by the single
902
+ // chart-level domain alone; the exporter prefers this when present.
903
+ var serCatRef = container.isXY
904
+ ? undefined
905
+ : getWithFallback(ser, CAT_REF_PATHS);
906
+ var categorySources = serCatRef
907
+ ? resolveSourcesFromRef(serCatRef, sheetId, resolveSheetId)
908
+ : [];
909
+ series.push(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign({ dataLabel: seriesTitle || "Series ".concat(seriesIndex + 1) }, (nameRef ? { dataLabelRef: nameRef } : {})), (categorySources.length ? { categorySources: categorySources } : {})), { color: colorInfo.color }), (colorInfo.noFill ? { noFill: true } : {})), { negativeColor: colorInfo.negativeColor, invertIfNegative: colorInfo.invertIfNegative }), (colorInfo.gradient ? { gradient: colorInfo.gradient } : {})), (container.isXY ? {} : { seriesChartType: seriesChartType })), { sources: sources }), (inlineValues && inlineValues.length ? { inlineValues: inlineValues } : {})), (trendlines && trendlines.length ? { trendlines: trendlines } : {})), (errorBars ? { errorBars: errorBars } : {})), (marker ? { marker: marker } : {})), (dataPointColors && dataPointColors.length
910
+ ? { dataPointColors: dataPointColors }
911
+ : {})));
912
+ seriesIndex++;
913
+ }
914
+ }
915
+ }
916
+ catch (e_10_1) { e_10 = { error: e_10_1 }; }
917
+ finally {
918
+ try {
919
+ if (chartElements_1_1 && !chartElements_1_1.done && (_b = chartElements_1.return)) _b.call(chartElements_1);
920
+ }
921
+ finally { if (e_10) throw e_10.error; }
922
+ }
923
+ }
924
+ }
925
+ catch (e_9_1) { e_9 = { error: e_9_1 }; }
926
+ finally {
927
+ try {
928
+ if (CHART_TYPE_CONTAINERS_1_1 && !CHART_TYPE_CONTAINERS_1_1.done && (_a = CHART_TYPE_CONTAINERS_1.return)) _a.call(CHART_TYPE_CONTAINERS_1);
929
+ }
930
+ finally { if (e_9) throw e_9.error; }
931
+ }
932
+ // Fallback: pie/doughnut/radar/stock/ofPie/etc. aren't in
933
+ // CHART_TYPE_CONTAINERS; they're single-container, type-specific,
934
+ // and don't combo with other types. Pick up via the type-specific
935
+ // path-set helper.
936
+ if (series.length === 0) {
937
+ var seriesElements = getSeriesElements(plotArea, chartType);
938
+ if (seriesElements) {
939
+ var seriesArray = Array.isArray(seriesElements)
940
+ ? seriesElements
941
+ : [seriesElements];
942
+ seriesArray.forEach(function (ser, index) {
943
+ var _a, _b;
944
+ var valRef = isXYChart(chartType)
945
+ ? getWithFallback(ser, Y_VAL_REF_PATHS)
946
+ : getWithFallback(ser, VAL_REF_PATHS);
947
+ var seriesTitle = extractSeriesTitleFromSeries(ser);
948
+ var colorInfo = extractSeriesColorInfo(ser);
949
+ var sources = [];
950
+ var inlineValues;
951
+ if (valRef) {
952
+ sources = resolveSourcesFromRef(valRef, sheetId, resolveSheetId);
953
+ }
954
+ if (!sources.length) {
955
+ var valNode = isXYChart(chartType)
956
+ ? (_a = get(ser, "c:yVal")) !== null && _a !== void 0 ? _a : get(ser, "yVal")
957
+ : (_b = get(ser, "c:val")) !== null && _b !== void 0 ? _b : get(ser, "val");
958
+ inlineValues = extractInlineValues(valNode);
959
+ }
960
+ if (!sources.length && (!inlineValues || !inlineValues.length)) {
961
+ return;
962
+ }
963
+ var marker = extractSeriesMarker(ser);
964
+ var dataPointColors = extractSeriesDataPointColors(ser);
965
+ var nameRef = getWithFallback(ser, TX_REF_PATHS);
966
+ var serCatRef = isXYChart(chartType)
967
+ ? undefined
968
+ : getWithFallback(ser, CAT_REF_PATHS);
969
+ var categorySources = serCatRef
970
+ ? resolveSourcesFromRef(serCatRef, sheetId, resolveSheetId)
971
+ : [];
972
+ series.push(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign({ dataLabel: seriesTitle || "Series ".concat(index + 1) }, (nameRef ? { dataLabelRef: nameRef } : {})), (categorySources.length ? { categorySources: categorySources } : {})), { color: colorInfo.color }), (colorInfo.noFill ? { noFill: true } : {})), { negativeColor: colorInfo.negativeColor, invertIfNegative: colorInfo.invertIfNegative }), (colorInfo.gradient ? { gradient: colorInfo.gradient } : {})), { sources: sources }), (inlineValues && inlineValues.length ? { inlineValues: inlineValues } : {})), (marker ? { marker: marker } : {})), (dataPointColors && dataPointColors.length
973
+ ? { dataPointColors: dataPointColors }
974
+ : {})));
975
+ });
976
+ }
977
+ }
978
+ return series;
979
+ }
980
+ /**
981
+ * Extract per-data-point color overrides — `<c:dPt>` array inside
982
+ * `<c:ser>`. Each entry pins a specific category index to its own
983
+ * fill color (Gantt charts use this to colour individual tasks; pie
984
+ * charts use it for per-slice colors). Returns `undefined` when there
985
+ * are no overrides.
986
+ */
987
+ function extractSeriesDataPointColors(ser) {
988
+ var e_11, _a;
989
+ var _b, _c, _d;
990
+ var raw = (_b = get(ser, "c:dPt")) !== null && _b !== void 0 ? _b : get(ser, "dPt");
991
+ if (!raw)
992
+ return undefined;
993
+ var list = Array.isArray(raw) ? raw : [raw];
994
+ var result = [];
995
+ try {
996
+ for (var list_1 = __values(list), list_1_1 = list_1.next(); !list_1_1.done; list_1_1 = list_1.next()) {
997
+ var dPt = list_1_1.value;
998
+ var idxRaw = (_c = get(dPt, "c:idx.a$.val")) !== null && _c !== void 0 ? _c : get(dPt, "idx.a$.val");
999
+ var idx = idxRaw !== undefined ? Number(idxRaw) : NaN;
1000
+ if (!Number.isFinite(idx))
1001
+ continue;
1002
+ var solidFill = (_d = get(dPt, "c:spPr.a:solidFill")) !== null && _d !== void 0 ? _d : get(dPt, "spPr.a:solidFill");
1003
+ var color = resolveDrawingColor(solidFill);
1004
+ if (!color)
1005
+ continue;
1006
+ result.push({ idx: idx, color: color });
1007
+ }
1008
+ }
1009
+ catch (e_11_1) { e_11 = { error: e_11_1 }; }
1010
+ finally {
1011
+ try {
1012
+ if (list_1_1 && !list_1_1.done && (_a = list_1.return)) _a.call(list_1);
1013
+ }
1014
+ finally { if (e_11) throw e_11.error; }
1015
+ }
1016
+ return result.length ? result : undefined;
1017
+ }
1018
+ var MARKER_SYMBOL_SET = new Set([
1019
+ "none",
1020
+ "circle",
1021
+ "square",
1022
+ "diamond",
1023
+ "triangle",
1024
+ "x",
1025
+ "plus",
1026
+ "star",
1027
+ "dash",
1028
+ "dot",
1029
+ "auto",
1030
+ "picture",
1031
+ ]);
1032
+ function extractSeriesMarker(ser) {
1033
+ var _a, _b, _c, _d, _e, _f, _g, _h;
1034
+ var raw = (_a = get(ser, "c:marker")) !== null && _a !== void 0 ? _a : get(ser, "marker");
1035
+ if (!raw)
1036
+ return undefined;
1037
+ var symbolRaw = (_d = (_c = (_b = get(raw, "c:symbol.a$.val")) !== null && _b !== void 0 ? _b : get(raw, "symbol.a$.val")) !== null && _c !== void 0 ? _c : get(raw, "c:symbol.a$.t$")) !== null && _d !== void 0 ? _d : get(raw, "symbol.a$.t$");
1038
+ var symbol = typeof symbolRaw === "string" &&
1039
+ MARKER_SYMBOL_SET.has(symbolRaw)
1040
+ ? symbolRaw
1041
+ : undefined;
1042
+ var sizeAttr = (_g = (_f = (_e = get(raw, "c:size.a$.val")) !== null && _e !== void 0 ? _e : get(raw, "size.a$.val")) !== null && _f !== void 0 ? _f : get(raw, "c:size.a$.t$")) !== null && _g !== void 0 ? _g : get(raw, "size.a$.t$");
1043
+ var size = sizeAttr !== undefined && sizeAttr !== null && sizeAttr !== ""
1044
+ ? Number(sizeAttr)
1045
+ : undefined;
1046
+ // Marker fill — used when explicit (not derived from series color).
1047
+ var fillRgb = (_h = get(raw, "c:spPr.a:solidFill.a:srgbClr.a$.val")) !== null && _h !== void 0 ? _h : get(raw, "spPr.solidFill.srgbClr.a$.val");
1048
+ var color = fillRgb ? "#".concat(fillRgb) : undefined;
1049
+ var result = {};
1050
+ if (symbol)
1051
+ result.symbol = symbol;
1052
+ if (typeof size === "number" && Number.isFinite(size))
1053
+ result.size = size;
1054
+ if (color)
1055
+ result.color = color;
1056
+ return Object.keys(result).length ? result : undefined;
1057
+ }
1058
+ // ─── Text property extraction (color, font) ──────────────────────────
1059
+ // Used by `readAxis`, `extractLegendOptions`, `extractDataLabelsOptions`,
1060
+ // `extractChartTitle` to pull `<c:txPr>` / `<a:rPr>` styling so axis
1061
+ // labels, data labels, legend entries and chart titles render with
1062
+ // their authored colors instead of falling back to the renderer's
1063
+ // theme default (the BEP.xlsx import showed all labels as
1064
+ // near-black).
1065
+ var OFFICE_THEME_FALLBACK = {
1066
+ // Standard Office theme color tokens. We don't try to resolve from
1067
+ // the workbook's actual `xl/theme/themeN.xml` here — the chart is
1068
+ // typically authored against the same theme palette and these
1069
+ // defaults match the in-app theme defaults closely enough that the
1070
+ // visual difference is below noise level.
1071
+ tx1: "#000000",
1072
+ tx2: "#44546A",
1073
+ bg1: "#FFFFFF",
1074
+ bg2: "#E7E6E6",
1075
+ dk1: "#000000",
1076
+ dk2: "#44546A",
1077
+ lt1: "#FFFFFF",
1078
+ lt2: "#E7E6E6",
1079
+ accent1: "#4472C4",
1080
+ accent2: "#ED7D31",
1081
+ accent3: "#A5A5A5",
1082
+ accent4: "#FFC000",
1083
+ accent5: "#5B9BD5",
1084
+ accent6: "#70AD47",
1085
+ hlink: "#0563C1",
1086
+ folHlink: "#954F72",
1087
+ };
1088
+ /**
1089
+ * Apply OOXML lumMod / lumOff / shade / tint modifiers to a base RGB
1090
+ * color. All are stored as 1000ths of a percent (75000 = 75%).
1091
+ *
1092
+ * - `lumMod` scales each channel (`c * mod`)
1093
+ * - `lumOff` adds toward white (`+ 255 * off`)
1094
+ * - `shade` darkens — interpolates toward black (`c * shade`)
1095
+ * - `tint` lightens — interpolates toward white (`c + (255 - c) * tint`)
1096
+ *
1097
+ * Order: shade/tint apply first (they're independent transforms), then
1098
+ * lumMod/lumOff. Matches Excel's behaviour closely for common patterns:
1099
+ * - `tx1 + lumMod=75% + lumOff=25%` → `#404040` dark gray (BEP)
1100
+ * - `accent1 + shade=76%` → darker accent1 (Gantt)
1101
+ */
1102
+ var applyLumModOff = function (hex, lumMod, lumOff, shade, tint) {
1103
+ var m = /^#?([0-9a-fA-F]{6})$/.exec(hex);
1104
+ if (!m)
1105
+ return hex;
1106
+ var v = parseInt(m[1], 16);
1107
+ var r = (v >> 16) & 0xff;
1108
+ var g = (v >> 8) & 0xff;
1109
+ var b = v & 0xff;
1110
+ // shade darkens (multiply by factor < 1); tint lightens (interp
1111
+ // toward white). Apply before lumMod/lumOff since those mix in a
1112
+ // different luminance space and Excel evaluates shade/tint first.
1113
+ if (typeof shade === "number" && shade > 0 && shade < 1) {
1114
+ r = r * shade;
1115
+ g = g * shade;
1116
+ b = b * shade;
1117
+ }
1118
+ if (typeof tint === "number" && tint > 0 && tint < 1) {
1119
+ r = r + (255 - r) * tint;
1120
+ g = g + (255 - g) * tint;
1121
+ b = b + (255 - b) * tint;
1122
+ }
1123
+ var mod = typeof lumMod === "number" ? lumMod : 1;
1124
+ var off = typeof lumOff === "number" ? lumOff : 0;
1125
+ var apply = function (c) {
1126
+ return Math.max(0, Math.min(255, Math.round(c * mod + 255 * off)));
1127
+ };
1128
+ var toHex = function (c) {
1129
+ return c.toString(16).padStart(2, "0").toUpperCase();
1130
+ };
1131
+ return "#".concat(toHex(apply(r))).concat(toHex(apply(g))).concat(toHex(apply(b)));
1132
+ };
1133
+ /**
1134
+ * Resolve a DrawingML `<a:solidFill>` (or any element that wraps an
1135
+ * `<a:srgbClr>` / `<a:schemeClr>`) to a hex color string. Handles
1136
+ * `lumMod`/`lumOff` modifiers used to derive grays from theme tokens.
1137
+ */
1138
+ function resolveDrawingColor(node) {
1139
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
1140
+ if (!node)
1141
+ return undefined;
1142
+ // Direct RGB.
1143
+ var srgb = (_a = get(node, "a:srgbClr.a$.val")) !== null && _a !== void 0 ? _a : get(node, "srgbClr.a$.val");
1144
+ if (srgb) {
1145
+ var lumMod = readPctNumber((_b = get(node, "a:srgbClr.a:lumMod.a$.val")) !== null && _b !== void 0 ? _b : get(node, "srgbClr.lumMod.a$.val"));
1146
+ var lumOff = readPctNumber((_c = get(node, "a:srgbClr.a:lumOff.a$.val")) !== null && _c !== void 0 ? _c : get(node, "srgbClr.lumOff.a$.val"));
1147
+ var shade = readPctNumber((_d = get(node, "a:srgbClr.a:shade.a$.val")) !== null && _d !== void 0 ? _d : get(node, "srgbClr.shade.a$.val"));
1148
+ var tint = readPctNumber((_e = get(node, "a:srgbClr.a:tint.a$.val")) !== null && _e !== void 0 ? _e : get(node, "srgbClr.tint.a$.val"));
1149
+ return applyLumModOff("#".concat(srgb), lumMod, lumOff, shade, tint);
1150
+ }
1151
+ // Theme reference.
1152
+ var schemeName = (_f = get(node, "a:schemeClr.a$.val")) !== null && _f !== void 0 ? _f : get(node, "schemeClr.a$.val");
1153
+ if (typeof schemeName === "string") {
1154
+ var base = (_g = OFFICE_THEME_FALLBACK[schemeName]) !== null && _g !== void 0 ? _g : "#000000";
1155
+ var lumMod = readPctNumber((_h = get(node, "a:schemeClr.a:lumMod.a$.val")) !== null && _h !== void 0 ? _h : get(node, "schemeClr.lumMod.a$.val"));
1156
+ var lumOff = readPctNumber((_j = get(node, "a:schemeClr.a:lumOff.a$.val")) !== null && _j !== void 0 ? _j : get(node, "schemeClr.lumOff.a$.val"));
1157
+ var shade = readPctNumber((_k = get(node, "a:schemeClr.a:shade.a$.val")) !== null && _k !== void 0 ? _k : get(node, "schemeClr.shade.a$.val"));
1158
+ var tint = readPctNumber((_l = get(node, "a:schemeClr.a:tint.a$.val")) !== null && _l !== void 0 ? _l : get(node, "schemeClr.tint.a$.val"));
1159
+ return applyLumModOff(base, lumMod, lumOff, shade, tint);
1160
+ }
1161
+ return undefined;
1162
+ }
1163
+ /** Parse an OOXML percentage stored as 1000ths-of-a-percent → 0..1. */
1164
+ function readPctNumber(val) {
1165
+ if (val === undefined || val === null || val === "")
1166
+ return undefined;
1167
+ var n = Number(val);
1168
+ return Number.isFinite(n) ? n / 100000 : undefined;
1169
+ }
1170
+ /**
1171
+ * Extract a `ChartTextFormat` from an OOXML text-properties node. The
1172
+ * input is typically `<c:txPr>` or `<c:title><c:tx><c:rich>` — both
1173
+ * use the same `<a:p><a:pPr><a:defRPr>…</a:defRPr></a:pPr></a:p>`
1174
+ * shape to express paragraph-default character properties.
1175
+ *
1176
+ * Returns `undefined` when the node carries no formatting (so the
1177
+ * caller doesn't emit an empty `textFormat` field).
1178
+ */
1179
+ function extractTextProperties(txPr) {
1180
+ var _a, _b, _c, _d, _e, _f;
1181
+ if (!txPr)
1182
+ return undefined;
1183
+ // The font/color lives on `<a:p><a:pPr><a:defRPr>`. Some writers put
1184
+ // it directly on `<a:r><a:rPr>` for rich titles — accept both.
1185
+ var defRPr = (_c = (_b = (_a = get(txPr, "a:p.a:pPr.a:defRPr")) !== null && _a !== void 0 ? _a : get(txPr, "p.pPr.defRPr")) !== null && _b !== void 0 ? _b : get(txPr, "a:p.a:r.a:rPr")) !== null && _c !== void 0 ? _c : get(txPr, "p.r.rPr");
1186
+ if (!defRPr)
1187
+ return undefined;
1188
+ var result = {};
1189
+ // Font size — `sz` is in 100ths of a point (`sz="900"` → 9pt).
1190
+ var szAttr = (_d = get(defRPr, "a$.sz")) !== null && _d !== void 0 ? _d : get(defRPr, "a$.t$");
1191
+ if (szAttr !== undefined && szAttr !== null && szAttr !== "") {
1192
+ var sz = Number(szAttr);
1193
+ if (Number.isFinite(sz) && sz > 0)
1194
+ result.fontSize = sz / 100;
1195
+ }
1196
+ // Bold / italic / underline / strikethrough.
1197
+ var bAttr = get(defRPr, "a$.b");
1198
+ if (bAttr === "1" || bAttr === 1 || bAttr === true)
1199
+ result.bold = true;
1200
+ var iAttr = get(defRPr, "a$.i");
1201
+ if (iAttr === "1" || iAttr === 1 || iAttr === true)
1202
+ result.italic = true;
1203
+ var uAttr = get(defRPr, "a$.u");
1204
+ if (typeof uAttr === "string" && uAttr !== "none")
1205
+ result.underline = true;
1206
+ var strikeAttr = get(defRPr, "a$.strike");
1207
+ if (typeof strikeAttr === "string" && strikeAttr !== "noStrike") {
1208
+ result.strikethrough = true;
1209
+ }
1210
+ // Font family — `<a:latin typeface="…">`.
1211
+ var latin = (_e = get(defRPr, "a:latin.a$.typeface")) !== null && _e !== void 0 ? _e : get(defRPr, "latin.a$.typeface");
1212
+ if (typeof latin === "string" && latin)
1213
+ result.fontFamily = latin;
1214
+ // Color — `<a:solidFill>` containing `<a:srgbClr>` or `<a:schemeClr>`.
1215
+ var solidFill = (_f = get(defRPr, "a:solidFill")) !== null && _f !== void 0 ? _f : get(defRPr, "solidFill");
1216
+ var color = resolveDrawingColor(solidFill);
1217
+ if (color)
1218
+ result.color = color;
1219
+ return Object.keys(result).length ? result : undefined;
1220
+ }
1221
+ /**
1222
+ * Read bar/column `<c:grouping>`, `<c:overlap>`, `<c:gapWidth>` —
1223
+ * controls how multi-series bars are arranged (clustered / stacked /
1224
+ * percent-stacked). Looks inside `<c:barChart>` / `<c:bar3DChart>`
1225
+ * containers; returns `undefined` if no settings are present so the
1226
+ * renderer keeps its defaults.
1227
+ */
1228
+ function extractBarLayoutOptions(plotArea) {
1229
+ var _a, _b, _c, _d, _e, _f, _g, _h;
1230
+ var bar = (_c = (_b = (_a = get(plotArea, "c:barChart")) !== null && _a !== void 0 ? _a : get(plotArea, "barChart")) !== null && _b !== void 0 ? _b : get(plotArea, "c:bar3DChart")) !== null && _c !== void 0 ? _c : get(plotArea, "bar3DChart");
1231
+ if (!bar)
1232
+ return undefined;
1233
+ // `<c:grouping val="clustered|stacked|percentStacked|standard"/>`.
1234
+ // `standard` is "side-by-side, no stacking" — same as `clustered`
1235
+ // semantically; map both to UNSTACKED.
1236
+ var groupingVal = (_f = (_e = (_d = get(bar, "c:grouping.a$.val")) !== null && _d !== void 0 ? _d : get(bar, "grouping.a$.val")) !== null && _e !== void 0 ? _e : get(bar, "c:grouping.a$.t$")) !== null && _f !== void 0 ? _f : get(bar, "grouping.a$.t$");
1237
+ var stackedType;
1238
+ switch (groupingVal) {
1239
+ case "stacked":
1240
+ stackedType = "STACKED";
1241
+ break;
1242
+ case "percentStacked":
1243
+ stackedType = "PERCENT_STACKED";
1244
+ break;
1245
+ case "clustered":
1246
+ case "standard":
1247
+ stackedType = "UNSTACKED";
1248
+ break;
1249
+ }
1250
+ var overlapVal = readNumber((_g = get(bar, "c:overlap.a$.val")) !== null && _g !== void 0 ? _g : get(bar, "overlap.a$.val"));
1251
+ var gapWidthVal = readNumber((_h = get(bar, "c:gapWidth.a$.val")) !== null && _h !== void 0 ? _h : get(bar, "gapWidth.a$.val"));
1252
+ var result = {};
1253
+ if (stackedType)
1254
+ result.stackedType = stackedType;
1255
+ if (typeof overlapVal === "number")
1256
+ result.overlap = overlapVal;
1257
+ if (typeof gapWidthVal === "number")
1258
+ result.gapWidth = gapWidthVal;
1259
+ return Object.keys(result).length ? result : undefined;
1260
+ }
1261
+ /**
1262
+ * Extract chart-level `<c:scatterStyle val=…>`. Excel default is
1263
+ * "lineMarker" (straight lines + markers). Returns undefined for
1264
+ * non-scatter charts.
1265
+ */
1266
+ function extractScatterStyle(plotArea) {
1267
+ var _a, _b, _c;
1268
+ var val = (_c = (_b = (_a = get(plotArea, "c:scatterChart.c:scatterStyle.a$.val")) !== null && _a !== void 0 ? _a : get(plotArea, "scatterChart.scatterStyle.a$.val")) !== null && _b !== void 0 ? _b : get(plotArea, "c:scatterChart.c:scatterStyle.a$.t$")) !== null && _c !== void 0 ? _c : get(plotArea, "scatterChart.scatterStyle.a$.t$");
1269
+ return typeof val === "string" && val ? val : undefined;
1270
+ }
1271
+ function extractSeriesTitleFromSeries(ser) {
1272
+ var e_12, _a;
1273
+ // Prefer cached textual value if present
1274
+ var cacheEntries = get(ser, "c:tx.c:strRef.c:strCache.c:pt");
1275
+ if (cacheEntries) {
1276
+ var pts = Array.isArray(cacheEntries) ? cacheEntries : [cacheEntries];
1277
+ try {
1278
+ for (var pts_1 = __values(pts), pts_1_1 = pts_1.next(); !pts_1_1.done; pts_1_1 = pts_1.next()) {
1279
+ var pt = pts_1_1.value;
1280
+ var value = coerceTitleText(get(pt, "c:v.t$") ||
1281
+ get(pt, "c:v") ||
1282
+ extractRichText(get(pt, "c:rich")));
1283
+ if (value) {
1284
+ return value;
1285
+ }
1286
+ }
1287
+ }
1288
+ catch (e_12_1) { e_12 = { error: e_12_1 }; }
1289
+ finally {
1290
+ try {
1291
+ if (pts_1_1 && !pts_1_1.done && (_a = pts_1.return)) _a.call(pts_1);
1292
+ }
1293
+ finally { if (e_12) throw e_12.error; }
1294
+ }
1295
+ }
1296
+ // Fall back to literal
1297
+ var literal = coerceTitleText(get(ser, "c:tx.c:v.t$") ||
1298
+ get(ser, "c:tx.c:v") ||
1299
+ extractRichText(get(ser, "c:tx.c:rich")));
1300
+ if (literal) {
1301
+ return literal;
1302
+ }
1303
+ return undefined;
1304
+ }
1305
+ /**
1306
+ * fast-xml-parser converts numeric `<c:v>` values (e.g. a series header
1307
+ * like 2024) into numbers; normalize primitives to strings and drop
1308
+ * anything else so titles are always strings downstream.
1309
+ */
1310
+ function coerceTitleText(value) {
1311
+ if (typeof value === "string")
1312
+ return value;
1313
+ if (typeof value === "number" || typeof value === "boolean") {
1314
+ return String(value);
1315
+ }
1316
+ return undefined;
1317
+ }
1318
+ function extractRichText(node) {
1319
+ var e_13, _a, e_14, _b;
1320
+ if (!node) {
1321
+ return undefined;
1322
+ }
1323
+ var paragraphs = getWithFallback(node, ["a:p", "p"]);
1324
+ var paragraphArray = Array.isArray(paragraphs)
1325
+ ? paragraphs
1326
+ : paragraphs
1327
+ ? [paragraphs]
1328
+ : [];
1329
+ var fragments = [];
1330
+ try {
1331
+ for (var paragraphArray_1 = __values(paragraphArray), paragraphArray_1_1 = paragraphArray_1.next(); !paragraphArray_1_1.done; paragraphArray_1_1 = paragraphArray_1.next()) {
1332
+ var paragraph = paragraphArray_1_1.value;
1333
+ var runs = getWithFallback(paragraph, ["a:r", "r"]);
1334
+ var runArray = Array.isArray(runs) ? runs : runs ? [runs] : [paragraph];
1335
+ try {
1336
+ for (var runArray_1 = (e_14 = void 0, __values(runArray)), runArray_1_1 = runArray_1.next(); !runArray_1_1.done; runArray_1_1 = runArray_1.next()) {
1337
+ var run = runArray_1_1.value;
1338
+ var text = getWithFallback(run, ["a:t.t$", "a:t"]) ||
1339
+ getWithFallback(run, ["t$", "t"]);
1340
+ if (typeof text === "string") {
1341
+ fragments.push(text);
1342
+ }
1343
+ }
1344
+ }
1345
+ catch (e_14_1) { e_14 = { error: e_14_1 }; }
1346
+ finally {
1347
+ try {
1348
+ if (runArray_1_1 && !runArray_1_1.done && (_b = runArray_1.return)) _b.call(runArray_1);
1349
+ }
1350
+ finally { if (e_14) throw e_14.error; }
1351
+ }
1352
+ }
1353
+ }
1354
+ catch (e_13_1) { e_13 = { error: e_13_1 }; }
1355
+ finally {
1356
+ try {
1357
+ if (paragraphArray_1_1 && !paragraphArray_1_1.done && (_a = paragraphArray_1.return)) _a.call(paragraphArray_1);
1358
+ }
1359
+ finally { if (e_13) throw e_13.error; }
1360
+ }
1361
+ if (fragments.length > 0) {
1362
+ return fragments.join("");
1363
+ }
1364
+ return undefined;
1365
+ }
1366
+ function normalizeHexColor(value) {
1367
+ if (!value)
1368
+ return undefined;
1369
+ var trimmed = value.toString().trim().replace(/^#/, "");
1370
+ if (!trimmed)
1371
+ return undefined;
1372
+ var sanitized = trimmed.replace(/[^0-9a-fA-F]/g, "").toUpperCase();
1373
+ if (sanitized.length === 6) {
1374
+ return "#".concat(sanitized);
1375
+ }
1376
+ if (sanitized.length === 8) {
1377
+ return "#".concat(sanitized.slice(-6));
1378
+ }
1379
+ return undefined;
1380
+ }
1381
+ function extractSeriesColorInfo(ser) {
1382
+ var e_15, _a, e_16, _b;
1383
+ var _c, _d, _e, _f;
1384
+ var result = {};
1385
+ // <a:noFill/> on the series shape properties — transparent series.
1386
+ // OOXML can express this as the singleton element with no children;
1387
+ // the absence of a:solidFill / a:gradFill is also a signal but
1388
+ // brittler. fast-xml-parser emits `noFill: ""` or `noFill: {}` for
1389
+ // empty elements — both falsy by-value but truthy by-presence.
1390
+ var noFillFill = (_c = get(ser, "c:spPr.a:noFill")) !== null && _c !== void 0 ? _c : get(ser, "spPr.a:noFill");
1391
+ if (noFillFill !== undefined) {
1392
+ result.noFill = true;
1393
+ }
1394
+ // Try the full <a:solidFill> shape first — handles both srgbClr
1395
+ // and schemeClr (with lumMod/lumOff/shade/tint/alpha modifiers).
1396
+ var solidFillNode = (_d = get(ser, "c:spPr.a:solidFill")) !== null && _d !== void 0 ? _d : get(ser, "spPr.a:solidFill");
1397
+ var resolvedFill = resolveDrawingColor(solidFillNode);
1398
+ // Extract main color - check both fill color (for bar/column) and line color (for line/area charts)
1399
+ var fillColorValue = getWithFallback(ser, [
1400
+ "c:spPr.a:solidFill.a:srgbClr.a$.val",
1401
+ "c:spPr.a:solidFill.a:srgbClr.a$.t$",
1402
+ "c:spPr.a:solidFill.a:srgbClr.a$.rgb",
1403
+ "c:spPr.solidFill.srgbClr.a$.val",
1404
+ "spPr.a:solidFill.a:srgbClr.a$.val",
1405
+ "spPr.solidFill.srgbClr.a$.val",
1406
+ ]);
1407
+ // Line color for line/scatter/area charts
1408
+ var lineColorValue = getWithFallback(ser, [
1409
+ "c:spPr.a:ln.a:solidFill.a:srgbClr.a$.val",
1410
+ "c:spPr.a:ln.a:solidFill.a:srgbClr.a$.t$",
1411
+ "c:spPr.a:ln.a:solidFill.a:srgbClr.a$.rgb",
1412
+ "c:spPr.a:ln.solidFill.srgbClr.a$.val",
1413
+ "spPr.a:ln.a:solidFill.a:srgbClr.a$.val",
1414
+ "spPr.ln.solidFill.srgbClr.a$.val",
1415
+ ]);
1416
+ // Use fill color if available, otherwise use line color.
1417
+ // resolvedFill handles schemeClr; the legacy normalize call handles
1418
+ // the explicit srgbClr path (kept as a fallback). When noFill is set
1419
+ // we leave `color` undefined — the renderer treats the series as
1420
+ // transparent.
1421
+ if (!result.noFill) {
1422
+ result.color =
1423
+ (_e = resolvedFill !== null && resolvedFill !== void 0 ? resolvedFill : normalizeHexColor(fillColorValue)) !== null && _e !== void 0 ? _e : normalizeHexColor(lineColorValue);
1424
+ }
1425
+ // Gradient fill — DrawingML `<a:gradFill>` inside `<c:spPr>`. Stops
1426
+ // come in EMU per-mille (0..100000); positions get normalized back
1427
+ // to 0..1 for our shape. Linear angle is in 60000ths of a degree;
1428
+ // path gradients carry insets via `<a:path><a:fillToRect/>`.
1429
+ var gradFill = getWithFallback(ser, [
1430
+ "c:spPr.a:gradFill",
1431
+ "spPr.a:gradFill",
1432
+ "c:spPr.gradFill",
1433
+ ]);
1434
+ if (gradFill) {
1435
+ var rawStops = getWithFallback(gradFill, [
1436
+ "a:gsLst.a:gs",
1437
+ "gsLst.gs",
1438
+ ]);
1439
+ var stopList = rawStops
1440
+ ? Array.isArray(rawStops)
1441
+ ? rawStops
1442
+ : [rawStops]
1443
+ : [];
1444
+ var stops = [];
1445
+ try {
1446
+ for (var stopList_1 = __values(stopList), stopList_1_1 = stopList_1.next(); !stopList_1_1.done; stopList_1_1 = stopList_1.next()) {
1447
+ var stop_1 = stopList_1_1.value;
1448
+ var posRaw = (_f = stop_1 === null || stop_1 === void 0 ? void 0 : stop_1.a$) === null || _f === void 0 ? void 0 : _f.pos;
1449
+ var position = posRaw != null
1450
+ ? Math.max(0, Math.min(1, parseFloat(posRaw) / 100000))
1451
+ : NaN;
1452
+ if (!Number.isFinite(position))
1453
+ continue;
1454
+ var hex = getWithFallback(stop_1, [
1455
+ "a:srgbClr.a$.val",
1456
+ "srgbClr.a$.val",
1457
+ ]);
1458
+ var color = normalizeHexColor(hex);
1459
+ if (!color)
1460
+ continue;
1461
+ stops.push({ position: position, color: color });
1462
+ }
1463
+ }
1464
+ catch (e_15_1) { e_15 = { error: e_15_1 }; }
1465
+ finally {
1466
+ try {
1467
+ if (stopList_1_1 && !stopList_1_1.done && (_a = stopList_1.return)) _a.call(stopList_1);
1468
+ }
1469
+ finally { if (e_15) throw e_15.error; }
1470
+ }
1471
+ if (stops.length > 0) {
1472
+ stops.sort(function (a, b) { return a.position - b.position; });
1473
+ var lin = getWithFallback(gradFill, ["a:lin.a$", "lin.a$"]);
1474
+ var path = getWithFallback(gradFill, ["a:path", "path"]);
1475
+ if (path) {
1476
+ var insets = getWithFallback(path, [
1477
+ "a:fillToRect.a$",
1478
+ "fillToRect.a$",
1479
+ ]);
1480
+ var emuToFraction = function (v) {
1481
+ if (v == null)
1482
+ return undefined;
1483
+ var n = parseFloat(v);
1484
+ return Number.isFinite(n) ? n / 100000 : undefined;
1485
+ };
1486
+ result.gradient = {
1487
+ type: "path",
1488
+ left: emuToFraction(insets === null || insets === void 0 ? void 0 : insets.l),
1489
+ right: emuToFraction(insets === null || insets === void 0 ? void 0 : insets.r),
1490
+ top: emuToFraction(insets === null || insets === void 0 ? void 0 : insets.t),
1491
+ bottom: emuToFraction(insets === null || insets === void 0 ? void 0 : insets.b),
1492
+ stops: stops,
1493
+ };
1494
+ }
1495
+ else {
1496
+ var ang = (lin === null || lin === void 0 ? void 0 : lin.ang) != null ? parseFloat(lin.ang) : 0;
1497
+ result.gradient = {
1498
+ type: "linear",
1499
+ degree: Number.isFinite(ang) ? ang / 60000 : 0,
1500
+ stops: stops,
1501
+ };
1502
+ }
1503
+ }
1504
+ }
1505
+ // Extract invertIfNegative flag
1506
+ var invertIfNegativeVal = getWithFallback(ser, [
1507
+ "c:invertIfNegative.a$.val",
1508
+ "c:invertIfNegative.t$",
1509
+ "c:invertIfNegative",
1510
+ "invertIfNegative.a$.val",
1511
+ "invertIfNegative",
1512
+ ]);
1513
+ // Value can be "1", "true", true, or 1
1514
+ if (invertIfNegativeVal !== undefined) {
1515
+ result.invertIfNegative =
1516
+ invertIfNegativeVal === "1" ||
1517
+ invertIfNegativeVal === true ||
1518
+ invertIfNegativeVal === 1 ||
1519
+ invertIfNegativeVal === "true";
1520
+ }
1521
+ // Extract negative fill color from extLst (Excel 2010+ format)
1522
+ // The negative color is stored in c:extLst.c:ext with specific URI
1523
+ var extLst = getWithFallback(ser, [
1524
+ "c:extLst.c:ext",
1525
+ "c:extLst",
1526
+ "extLst.ext",
1527
+ "extLst",
1528
+ ]);
1529
+ if (extLst) {
1530
+ var extArray = Array.isArray(extLst) ? extLst : [extLst];
1531
+ try {
1532
+ for (var extArray_1 = __values(extArray), extArray_1_1 = extArray_1.next(); !extArray_1_1.done; extArray_1_1 = extArray_1.next()) {
1533
+ var ext = extArray_1_1.value;
1534
+ // Look for invertSolidFillFmt extension (negative fill format)
1535
+ var negFillColor = getWithFallback(ext, [
1536
+ "c14:invertSolidFillFmt.c14:spPr.a:solidFill.a:srgbClr.a$.val",
1537
+ "c14:invertSolidFillFmt.c14:spPr.a:solidFill.a:srgbClr.a$.rgb",
1538
+ "invertSolidFillFmt.spPr.solidFill.srgbClr.a$.val",
1539
+ // Also check for c15 namespace (Excel 2013+)
1540
+ "c15:invertSolidFillFmt.c15:spPr.a:solidFill.a:srgbClr.a$.val",
1541
+ ]);
1542
+ if (negFillColor) {
1543
+ result.negativeColor = normalizeHexColor(negFillColor);
1544
+ // If we have a negative color, invertIfNegative should be true
1545
+ if (result.negativeColor) {
1546
+ result.invertIfNegative = true;
1547
+ }
1548
+ break;
1549
+ }
1550
+ }
1551
+ }
1552
+ catch (e_16_1) { e_16 = { error: e_16_1 }; }
1553
+ finally {
1554
+ try {
1555
+ if (extArray_1_1 && !extArray_1_1.done && (_b = extArray_1.return)) _b.call(extArray_1);
1556
+ }
1557
+ finally { if (e_16) throw e_16.error; }
1558
+ }
1559
+ }
1560
+ return result;
1561
+ }
1562
+ export function extractChartDomains(plotArea, chartType, sheetId, resolveSheetId) {
1563
+ var e_17, _a, e_18, _b, e_19, _c, e_20, _d;
1564
+ var _e, _f;
1565
+ var domains = [];
1566
+ try {
1567
+ // Search all chart type containers for domains. For XY charts the
1568
+ // "domain" is the X values (c:xVal); for everything else it's the
1569
+ // category axis (c:cat). Per-container loop covers combo charts.
1570
+ for (var CHART_TYPE_CONTAINERS_2 = __values(CHART_TYPE_CONTAINERS), CHART_TYPE_CONTAINERS_2_1 = CHART_TYPE_CONTAINERS_2.next(); !CHART_TYPE_CONTAINERS_2_1.done; CHART_TYPE_CONTAINERS_2_1 = CHART_TYPE_CONTAINERS_2.next()) {
1571
+ var container = CHART_TYPE_CONTAINERS_2_1.value;
1572
+ var chartElement = getWithFallback(plotArea, container.paths);
1573
+ if (!chartElement)
1574
+ continue;
1575
+ var chartElements = Array.isArray(chartElement)
1576
+ ? chartElement
1577
+ : [chartElement];
1578
+ try {
1579
+ for (var chartElements_2 = (e_18 = void 0, __values(chartElements)), chartElements_2_1 = chartElements_2.next(); !chartElements_2_1.done; chartElements_2_1 = chartElements_2.next()) {
1580
+ var singleChartElement = chartElements_2_1.value;
1581
+ var seriesElements_1 = getWithFallback(singleChartElement, [
1582
+ "c:ser",
1583
+ "ser",
1584
+ ]);
1585
+ if (!seriesElements_1)
1586
+ continue;
1587
+ var seriesArray = Array.isArray(seriesElements_1)
1588
+ ? seriesElements_1
1589
+ : [seriesElements_1];
1590
+ try {
1591
+ for (var seriesArray_2 = (e_19 = void 0, __values(seriesArray)), seriesArray_2_1 = seriesArray_2.next(); !seriesArray_2_1.done; seriesArray_2_1 = seriesArray_2.next()) {
1592
+ var ser = seriesArray_2_1.value;
1593
+ var domainRef = container.isXY
1594
+ ? getWithFallback(ser, X_VAL_REF_PATHS)
1595
+ : getWithFallback(ser, CAT_REF_PATHS);
1596
+ if (domainRef) {
1597
+ var sources = resolveSourcesFromRef(domainRef, sheetId, resolveSheetId);
1598
+ if (sources.length) {
1599
+ domains.push({ sources: sources });
1600
+ // XY charts may carry per-series domains that differ — keep
1601
+ // the first one we encounter for the dataRange anchor, but
1602
+ // continue collecting so the renderer has a per-series X
1603
+ // when it needs one. For non-XY, first-found is enough.
1604
+ if (!container.isXY)
1605
+ return domains;
1606
+ }
1607
+ }
1608
+ else if (!container.isXY) {
1609
+ // No cell ref — check for an inline `<c:strLit>`/`<c:numLit>`
1610
+ // category list (e.g. `["Estimated", "Actual"]` embedded
1611
+ // directly in the chart XML). Same for the series val side,
1612
+ // but domains is by far the most common case.
1613
+ var catNode = (_e = get(ser, "c:cat")) !== null && _e !== void 0 ? _e : get(ser, "cat");
1614
+ var inlineValues = extractInlineValues(catNode);
1615
+ if (inlineValues && inlineValues.length) {
1616
+ domains.push({ sources: [], inlineValues: inlineValues });
1617
+ return domains;
1618
+ }
1619
+ }
1620
+ }
1621
+ }
1622
+ catch (e_19_1) { e_19 = { error: e_19_1 }; }
1623
+ finally {
1624
+ try {
1625
+ if (seriesArray_2_1 && !seriesArray_2_1.done && (_c = seriesArray_2.return)) _c.call(seriesArray_2);
1626
+ }
1627
+ finally { if (e_19) throw e_19.error; }
1628
+ }
1629
+ if (domains.length && container.isXY)
1630
+ return domains;
1631
+ }
1632
+ }
1633
+ catch (e_18_1) { e_18 = { error: e_18_1 }; }
1634
+ finally {
1635
+ try {
1636
+ if (chartElements_2_1 && !chartElements_2_1.done && (_b = chartElements_2.return)) _b.call(chartElements_2);
1637
+ }
1638
+ finally { if (e_18) throw e_18.error; }
1639
+ }
1640
+ }
1641
+ }
1642
+ catch (e_17_1) { e_17 = { error: e_17_1 }; }
1643
+ finally {
1644
+ try {
1645
+ if (CHART_TYPE_CONTAINERS_2_1 && !CHART_TYPE_CONTAINERS_2_1.done && (_a = CHART_TYPE_CONTAINERS_2.return)) _a.call(CHART_TYPE_CONTAINERS_2);
1646
+ }
1647
+ finally { if (e_17) throw e_17.error; }
1648
+ }
1649
+ // Fallback for chart types not in CHART_TYPE_CONTAINERS
1650
+ // (pie/doughnut/radar/stock/ofPie/scatter/bubble outside combos).
1651
+ var seriesElements = getSeriesElements(plotArea, chartType);
1652
+ if (seriesElements) {
1653
+ var seriesArray = Array.isArray(seriesElements)
1654
+ ? seriesElements
1655
+ : [seriesElements];
1656
+ try {
1657
+ for (var seriesArray_3 = __values(seriesArray), seriesArray_3_1 = seriesArray_3.next(); !seriesArray_3_1.done; seriesArray_3_1 = seriesArray_3.next()) {
1658
+ var ser = seriesArray_3_1.value;
1659
+ var domainRef = isXYChart(chartType)
1660
+ ? getWithFallback(ser, X_VAL_REF_PATHS)
1661
+ : getWithFallback(ser, CAT_REF_PATHS);
1662
+ if (domainRef) {
1663
+ var sources = resolveSourcesFromRef(domainRef, sheetId, resolveSheetId);
1664
+ if (sources.length) {
1665
+ domains.push({ sources: sources });
1666
+ if (!isXYChart(chartType))
1667
+ break;
1668
+ }
1669
+ }
1670
+ else if (!isXYChart(chartType)) {
1671
+ var catNode = (_f = get(ser, "c:cat")) !== null && _f !== void 0 ? _f : get(ser, "cat");
1672
+ var inlineValues = extractInlineValues(catNode);
1673
+ if (inlineValues && inlineValues.length) {
1674
+ domains.push({ sources: [], inlineValues: inlineValues });
1675
+ break;
1676
+ }
1677
+ }
1678
+ }
1679
+ }
1680
+ catch (e_20_1) { e_20 = { error: e_20_1 }; }
1681
+ finally {
1682
+ try {
1683
+ if (seriesArray_3_1 && !seriesArray_3_1.done && (_d = seriesArray_3.return)) _d.call(seriesArray_3);
1684
+ }
1685
+ finally { if (e_20) throw e_20.error; }
1686
+ }
1687
+ }
1688
+ return domains;
1689
+ }
1690
+ /**
1691
+ * Bubble charts have a third dimension — bubble size — referenced
1692
+ * via `<c:bubbleSize><c:numRef><c:f>` on each series. Returns one
1693
+ * `ChartData` entry per series (matches the shape used by `domains` /
1694
+ * `series`).
1695
+ */
1696
+ export function extractChartBubbleSizes(plotArea, sheetId, resolveSheetId) {
1697
+ var e_21, _a;
1698
+ var sizes = [];
1699
+ var seriesElements = getSeriesElements(plotArea, "bubble");
1700
+ if (!seriesElements)
1701
+ return sizes;
1702
+ var seriesArray = Array.isArray(seriesElements)
1703
+ ? seriesElements
1704
+ : [seriesElements];
1705
+ try {
1706
+ for (var seriesArray_4 = __values(seriesArray), seriesArray_4_1 = seriesArray_4.next(); !seriesArray_4_1.done; seriesArray_4_1 = seriesArray_4.next()) {
1707
+ var ser = seriesArray_4_1.value;
1708
+ var sizeRef = getWithFallback(ser, BUBBLE_SIZE_REF_PATHS);
1709
+ if (!sizeRef)
1710
+ continue;
1711
+ var sources = resolveSourcesFromRef(sizeRef, sheetId, resolveSheetId);
1712
+ if (sources.length)
1713
+ sizes.push({ sources: sources });
1714
+ }
1715
+ }
1716
+ catch (e_21_1) { e_21 = { error: e_21_1 }; }
1717
+ finally {
1718
+ try {
1719
+ if (seriesArray_4_1 && !seriesArray_4_1.done && (_a = seriesArray_4.return)) _a.call(seriesArray_4);
1720
+ }
1721
+ finally { if (e_21) throw e_21.error; }
1722
+ }
1723
+ return sizes;
1724
+ }
1725
+ export function extractChartPosition(anchor, sheetId, sheetDimensions) {
1726
+ var _a, _b, _c, _d, _e, _f;
1727
+ try {
1728
+ // Handle oneCellAnchor
1729
+ var oneCellFrom = (_a = getWithFallback(anchor, ["xdr:from", "from"])) !== null && _a !== void 0 ? _a : undefined;
1730
+ var hasTwoCellTarget = getWithFallback(anchor, ["xdr:to", "to"]) !== undefined;
1731
+ if (oneCellFrom && !hasTwoCellTarget) {
1732
+ var extNode = getWithFallback(anchor, ["xdr:ext", "ext"]);
1733
+ var extAttributes = (extNode && ((_b = extNode.a$) !== null && _b !== void 0 ? _b : extNode)) || undefined;
1734
+ var col = toInt(getWithFallback(oneCellFrom, ["xdr:col", "col"]));
1735
+ var row = toInt(getWithFallback(oneCellFrom, ["xdr:row", "row"]));
1736
+ var colOff = toInt(getWithFallback(oneCellFrom, ["xdr:colOff", "colOff"]));
1737
+ var rowOff = toInt(getWithFallback(oneCellFrom, ["xdr:rowOff", "rowOff"]));
1738
+ // Convert EMU to pixels (1 EMU = 1/9525 pixels)
1739
+ var width = extAttributes && extAttributes.cx
1740
+ ? Math.round(parseInt(String(extAttributes.cx), 10) / 9525)
1741
+ : 400;
1742
+ var height = extAttributes && extAttributes.cy
1743
+ ? Math.round(parseInt(String(extAttributes.cy), 10) / 9525)
1744
+ : 300;
1745
+ return {
1746
+ sheetId: sheetId,
1747
+ overlayPosition: {
1748
+ anchorCell: {
1749
+ rowIndex: row + 1,
1750
+ columnIndex: col + 1,
1751
+ },
1752
+ offsetXPixels: Math.round(colOff / 9525),
1753
+ offsetYPixels: Math.round(rowOff / 9525),
1754
+ widthPixels: width,
1755
+ heightPixels: height,
1756
+ },
1757
+ };
1758
+ }
1759
+ // Handle twoCellAnchor
1760
+ var fromCell = (_c = getWithFallback(anchor, ["xdr:from", "from"])) !== null && _c !== void 0 ? _c : undefined;
1761
+ var toCell = (_d = getWithFallback(anchor, ["xdr:to", "to"])) !== null && _d !== void 0 ? _d : undefined;
1762
+ if (fromCell && toCell) {
1763
+ var col = toInt(getWithFallback(fromCell, ["xdr:col", "col"]));
1764
+ var row = toInt(getWithFallback(fromCell, ["xdr:row", "row"]));
1765
+ var colOff = toInt(getWithFallback(fromCell, ["xdr:colOff", "colOff"]));
1766
+ var rowOff = toInt(getWithFallback(fromCell, ["xdr:rowOff", "rowOff"]));
1767
+ var toCol = toInt(getWithFallback(toCell, ["xdr:col", "col"]));
1768
+ var toRow = toInt(getWithFallback(toCell, ["xdr:row", "row"]));
1769
+ var toColOff = toInt(getWithFallback(toCell, ["xdr:colOff", "colOff"]));
1770
+ var toRowOff = toInt(getWithFallback(toCell, ["xdr:rowOff", "rowOff"]));
1771
+ // Default cell dimensions in pixels
1772
+ var DEFAULT_COL_WIDTH_PX_1 = (_e = sheetDimensions === null || sheetDimensions === void 0 ? void 0 : sheetDimensions.defaultColumnWidth) !== null && _e !== void 0 ? _e : 64;
1773
+ var DEFAULT_ROW_HEIGHT_PX_1 = (_f = sheetDimensions === null || sheetDimensions === void 0 ? void 0 : sheetDimensions.defaultRowHeight) !== null && _f !== void 0 ? _f : 20;
1774
+ // Helper to get column width in pixels
1775
+ var getColWidth = function (colIndex) {
1776
+ var _a, _b;
1777
+ return ((_b = (_a = sheetDimensions === null || sheetDimensions === void 0 ? void 0 : sheetDimensions.columnWidths) === null || _a === void 0 ? void 0 : _a.get(colIndex + 1)) !== null && _b !== void 0 ? _b : DEFAULT_COL_WIDTH_PX_1);
1778
+ };
1779
+ // Helper to get row height in pixels
1780
+ var getRowHeight = function (rowIndex) {
1781
+ var _a, _b;
1782
+ return ((_b = (_a = sheetDimensions === null || sheetDimensions === void 0 ? void 0 : sheetDimensions.rowHeights) === null || _a === void 0 ? void 0 : _a.get(rowIndex + 1)) !== null && _b !== void 0 ? _b : DEFAULT_ROW_HEIGHT_PX_1);
1783
+ };
1784
+ // Calculate width by summing actual column widths
1785
+ var widthPx = 0;
1786
+ for (var c = col; c < toCol; c++) {
1787
+ widthPx += getColWidth(c);
1788
+ }
1789
+ // Subtract offset into first cell, add offset into last cell
1790
+ // Offsets are in EMUs, convert to pixels
1791
+ widthPx -= Math.round(colOff / 9525);
1792
+ widthPx += Math.round(toColOff / 9525);
1793
+ // Calculate height by summing actual row heights
1794
+ var heightPx = 0;
1795
+ for (var r = row; r < toRow; r++) {
1796
+ heightPx += getRowHeight(r);
1797
+ }
1798
+ // Subtract offset into first cell, add offset into last cell
1799
+ heightPx -= Math.round(rowOff / 9525);
1800
+ heightPx += Math.round(toRowOff / 9525);
1801
+ var width = Math.max(widthPx, 100);
1802
+ var height = Math.max(heightPx, 100);
1803
+ return {
1804
+ sheetId: sheetId,
1805
+ overlayPosition: {
1806
+ anchorCell: {
1807
+ rowIndex: row + 1,
1808
+ columnIndex: col + 1,
1809
+ },
1810
+ offsetXPixels: Math.round(colOff / 9525),
1811
+ offsetYPixels: Math.round(rowOff / 9525),
1812
+ widthPixels: width,
1813
+ heightPixels: height,
1814
+ },
1815
+ };
1816
+ }
1817
+ return null;
1818
+ }
1819
+ catch (err) {
1820
+ console.log("Error extracting chart position:", err);
1821
+ return null;
1822
+ }
1823
+ }
1824
+ // -------------------------- Phase 5 helpers --------------------------
1825
+ // Read OOXML legend (<c:legend>), data labels (<c:dLbls>), and axis
1826
+ // formatting (<c:valAx>, <c:catAx>) elements into the engine's ChartSpec
1827
+ // shape. All helpers return `undefined` when nothing meaningful is set,
1828
+ // so callers can spread the result without polluting the spec.
1829
+ var readBoolean = function (val) {
1830
+ if (val === undefined || val === null)
1831
+ return undefined;
1832
+ return val === "1" || val === "true" || val === true;
1833
+ };
1834
+ var readNumber = function (val) {
1835
+ if (val === undefined || val === null)
1836
+ return undefined;
1837
+ var n = typeof val === "number" ? val : parseFloat(String(val));
1838
+ return Number.isFinite(n) ? n : undefined;
1839
+ };
1840
+ var mapLegendPosition = function (val) {
1841
+ switch (val) {
1842
+ case "t":
1843
+ return "top";
1844
+ case "b":
1845
+ return "bottom";
1846
+ case "l":
1847
+ return "left";
1848
+ case "r":
1849
+ return "right";
1850
+ case "tr":
1851
+ return "topRight";
1852
+ default:
1853
+ return undefined;
1854
+ }
1855
+ };
1856
+ function extractLegendOptions(chart) {
1857
+ var _a, _b, _c;
1858
+ // OOXML omits <c:legend> when the chart hides the legend, but
1859
+ // includes it (possibly empty) when the legend is shown. Some
1860
+ // writers add a child <c:delete val="1"/> instead — handle that too.
1861
+ var legend = getWithFallback(chart, ["c:legend", "legend"]);
1862
+ if (legend === undefined) {
1863
+ // Excel's default is "show". We only emit a `legend` field when the
1864
+ // source explicitly suppressed it, otherwise renderers fall back.
1865
+ return undefined;
1866
+ }
1867
+ var deleted = readBoolean((_a = get(legend, "c:delete.a$.val")) !== null && _a !== void 0 ? _a : get(legend, "delete.a$.val"));
1868
+ if (deleted) {
1869
+ return { position: "none" };
1870
+ }
1871
+ var posVal = (_b = get(legend, "c:legendPos.a$.val")) !== null && _b !== void 0 ? _b : get(legend, "legendPos.a$.val");
1872
+ var position = mapLegendPosition(posVal);
1873
+ var textFormat = extractTextProperties((_c = get(legend, "c:txPr")) !== null && _c !== void 0 ? _c : get(legend, "txPr"));
1874
+ if (!position && !textFormat)
1875
+ return undefined;
1876
+ return __assign(__assign({}, (position ? { position: position } : {})), (textFormat ? { textFormat: textFormat } : {}));
1877
+ }
1878
+ var mapDataLabelPosition = function (val) {
1879
+ switch (val) {
1880
+ case "ctr":
1881
+ return "center";
1882
+ case "inEnd":
1883
+ return "insideEnd";
1884
+ case "inBase":
1885
+ return "inside";
1886
+ case "outEnd":
1887
+ return "outsideEnd";
1888
+ case "bestFit":
1889
+ return "bestFit";
1890
+ default:
1891
+ return undefined;
1892
+ }
1893
+ };
1894
+ function extractDataLabelsOptions(plotArea, chartType) {
1895
+ var e_22, _a;
1896
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
1897
+ // Look for <c:dLbls> inside the chartType-specific container. We pick
1898
+ // the first one we find — chart-level labels apply to all series.
1899
+ var containerKeys = {
1900
+ bar: ["c:barChart", "barChart"],
1901
+ column: ["c:barChart", "barChart"],
1902
+ line: ["c:lineChart", "lineChart"],
1903
+ pie: ["c:pieChart", "pieChart", "c:ofPieChart", "ofPieChart"],
1904
+ doughnut: ["c:doughnutChart", "doughnutChart"],
1905
+ area: ["c:areaChart", "areaChart"],
1906
+ };
1907
+ var keys = (_b = containerKeys[chartType]) !== null && _b !== void 0 ? _b : [];
1908
+ var container;
1909
+ try {
1910
+ for (var keys_1 = __values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {
1911
+ var key = keys_1_1.value;
1912
+ container = container !== null && container !== void 0 ? container : get(plotArea, key);
1913
+ }
1914
+ }
1915
+ catch (e_22_1) { e_22 = { error: e_22_1 }; }
1916
+ finally {
1917
+ try {
1918
+ if (keys_1_1 && !keys_1_1.done && (_a = keys_1.return)) _a.call(keys_1);
1919
+ }
1920
+ finally { if (e_22) throw e_22.error; }
1921
+ }
1922
+ var dLbls = (_e = (_d = (_c = get(container, "c:dLbls")) !== null && _c !== void 0 ? _c : get(container, "dLbls")) !== null && _d !== void 0 ? _d : get(plotArea, "c:dLbls")) !== null && _e !== void 0 ? _e : get(plotArea, "dLbls");
1923
+ if (!dLbls)
1924
+ return undefined;
1925
+ var result = {};
1926
+ var pos = (_f = get(dLbls, "c:dLblPos.a$.val")) !== null && _f !== void 0 ? _f : get(dLbls, "dLblPos.a$.val");
1927
+ var position = mapDataLabelPosition(pos);
1928
+ if (position)
1929
+ result.position = position;
1930
+ var showVal = readBoolean((_g = get(dLbls, "c:showVal.a$.val")) !== null && _g !== void 0 ? _g : get(dLbls, "showVal.a$.val"));
1931
+ if (showVal) {
1932
+ result.show = true;
1933
+ result.showValue = true;
1934
+ }
1935
+ var showCat = readBoolean((_h = get(dLbls, "c:showCatName.a$.val")) !== null && _h !== void 0 ? _h : get(dLbls, "showCatName.a$.val"));
1936
+ if (showCat) {
1937
+ result.show = true;
1938
+ result.showCategoryName = true;
1939
+ }
1940
+ var showPct = readBoolean((_j = get(dLbls, "c:showPercent.a$.val")) !== null && _j !== void 0 ? _j : get(dLbls, "showPercent.a$.val"));
1941
+ if (showPct) {
1942
+ result.show = true;
1943
+ result.showPercent = true;
1944
+ }
1945
+ var showSer = readBoolean((_k = get(dLbls, "c:showSerName.a$.val")) !== null && _k !== void 0 ? _k : get(dLbls, "showSerName.a$.val"));
1946
+ if (showSer) {
1947
+ result.show = true;
1948
+ result.showSeriesName = true;
1949
+ }
1950
+ // If only `position` was set with no `show*` flags, treat as "show".
1951
+ if (position && result.show === undefined)
1952
+ result.show = true;
1953
+ // <c:txPr> on the dLbls block — affects every label in the chart.
1954
+ var textFormat = extractTextProperties((_l = get(dLbls, "c:txPr")) !== null && _l !== void 0 ? _l : get(dLbls, "txPr"));
1955
+ if (textFormat)
1956
+ result.textFormat = textFormat;
1957
+ // <c:numFmt formatCode="…"/> — Excel uses this to render labels as
1958
+ // currency / percent / etc. (`"$"#,##0`, `0.00%`). Without parsing
1959
+ // this, the renderer falls back to raw numbers (e.g. `1831` instead
1960
+ // of `$1,831`).
1961
+ var numFmt = (_p = (_o = (_m = get(dLbls, "c:numFmt.a$.formatCode")) !== null && _m !== void 0 ? _m : get(dLbls, "numFmt.a$.formatCode")) !== null && _o !== void 0 ? _o : get(dLbls, "c:numFmt.a$.t$")) !== null && _p !== void 0 ? _p : get(dLbls, "numFmt.a$.t$");
1962
+ if (typeof numFmt === "string" && numFmt) {
1963
+ result.numberFormatPattern = numFmt;
1964
+ }
1965
+ return Object.keys(result).length ? result : undefined;
1966
+ }
1967
+ function readAxis(axis) {
1968
+ var _a, _b, _c, _d, _e, _f, _g;
1969
+ if (!axis)
1970
+ return undefined;
1971
+ var result = {};
1972
+ // <c:scaling><c:logBase val="…"/> + <c:orientation val="minMax|maxMin"/>
1973
+ var logBase = readNumber((_a = get(axis, "c:scaling.c:logBase.a$.val")) !== null && _a !== void 0 ? _a : get(axis, "scaling.logBase.a$.val"));
1974
+ if (typeof logBase === "number" && logBase > 0)
1975
+ result.logarithmic = true;
1976
+ var orientation = (_b = get(axis, "c:scaling.c:orientation.a$.val")) !== null && _b !== void 0 ? _b : get(axis, "scaling.orientation.a$.val");
1977
+ if (orientation === "maxMin")
1978
+ result.reverse = true;
1979
+ var min = readNumber((_c = get(axis, "c:scaling.c:min.a$.val")) !== null && _c !== void 0 ? _c : get(axis, "scaling.min.a$.val"));
1980
+ if (typeof min === "number")
1981
+ result.min = min;
1982
+ var max = readNumber((_d = get(axis, "c:scaling.c:max.a$.val")) !== null && _d !== void 0 ? _d : get(axis, "scaling.max.a$.val"));
1983
+ if (typeof max === "number")
1984
+ result.max = max;
1985
+ // <c:delete val="1"/> hides the axis entirely.
1986
+ var deleted = readBoolean((_e = get(axis, "c:delete.a$.val")) !== null && _e !== void 0 ? _e : get(axis, "delete.a$.val"));
1987
+ if (deleted)
1988
+ result.visible = false;
1989
+ // <c:majorGridlines/> presence == show. Empty element is sufficient.
1990
+ var majorGridlines = (_f = get(axis, "c:majorGridlines")) !== null && _f !== void 0 ? _f : get(axis, "majorGridlines");
1991
+ if (majorGridlines !== undefined)
1992
+ result.showMajorGridlines = true;
1993
+ // <c:txPr> — axis tick-label font/color. Without this we'd inherit
1994
+ // the renderer's theme default (near-black) and lose the authored
1995
+ // color (e.g. BEP.xlsx X axis = #14325A, Y axis = #F0621C).
1996
+ var textFormat = extractTextProperties((_g = get(axis, "c:txPr")) !== null && _g !== void 0 ? _g : get(axis, "txPr"));
1997
+ if (textFormat)
1998
+ result.textFormat = textFormat;
1999
+ return Object.keys(result).length ? result : undefined;
2000
+ }
2001
+ export function extractAxisOptions(plotArea) {
2002
+ var _a, _b, _c, _d;
2003
+ var valAx = (_a = get(plotArea, "c:valAx")) !== null && _a !== void 0 ? _a : get(plotArea, "valAx");
2004
+ var catAx = (_b = get(plotArea, "c:catAx")) !== null && _b !== void 0 ? _b : get(plotArea, "catAx");
2005
+ // Some chart types use <c:dateAx>; treat as category for our purposes.
2006
+ var dateAx = (_c = get(plotArea, "c:dateAx")) !== null && _c !== void 0 ? _c : get(plotArea, "dateAx");
2007
+ var valAxes = Array.isArray(valAx) ? valAx : valAx ? [valAx] : [];
2008
+ return {
2009
+ valueAxisOptions: readAxis(valAxes[0]),
2010
+ secondaryValueAxisOptions: valAxes.length > 1 ? readAxis(valAxes[1]) : undefined,
2011
+ categoryAxisOptions: readAxis((_d = (Array.isArray(catAx) ? catAx[0] : catAx)) !== null && _d !== void 0 ? _d : (Array.isArray(dateAx) ? dateAx[0] : dateAx)),
2012
+ };
2013
+ }
2014
+ /**
2015
+ * Pie-of-pie / bar-of-pie — extract the of-pie layout fields from
2016
+ * `<c:ofPieChart>`. Returns undefined for plain pies. `splitType`
2017
+ * maps the OOXML tokens (`pos`/`val`/`percent`) to the spec vocabulary;
2018
+ * `auto` and `cust` (custom point assignment, carried in `<c:custSplit>`
2019
+ * which the spec cannot represent) are omitted so the renderer applies
2020
+ * Excel's default rule (position, last 3 values).
2021
+ */
2022
+ export function extractOfPieOptions(plotArea) {
2023
+ var _a, _b, _c, _d;
2024
+ var ofPie = getWithFallback(plotArea, ["c:ofPieChart", "ofPieChart"]);
2025
+ if (!ofPie)
2026
+ return undefined;
2027
+ var typeRaw = (_a = get(ofPie, "c:ofPieType.a$.val")) !== null && _a !== void 0 ? _a : get(ofPie, "ofPieType.a$.val");
2028
+ var ofPieType = typeRaw === "bar" ? "bar" : "pie";
2029
+ var splitRaw = (_b = get(ofPie, "c:splitType.a$.val")) !== null && _b !== void 0 ? _b : get(ofPie, "splitType.a$.val");
2030
+ var splitType = splitRaw === "pos"
2031
+ ? "position"
2032
+ : splitRaw === "val"
2033
+ ? "value"
2034
+ : splitRaw === "percent"
2035
+ ? "percent"
2036
+ : undefined;
2037
+ var splitPos = readNumber((_c = get(ofPie, "c:splitPos.a$.val")) !== null && _c !== void 0 ? _c : get(ofPie, "splitPos.a$.val"));
2038
+ var secondPieSize = readNumber((_d = get(ofPie, "c:secondPieSize.a$.val")) !== null && _d !== void 0 ? _d : get(ofPie, "secondPieSize.a$.val"));
2039
+ return __assign(__assign(__assign({ ofPieType: ofPieType }, (splitType ? { splitType: splitType } : {})), (typeof splitPos === "number" ? { splitPos: splitPos } : {})), (typeof secondPieSize === "number" ? { secondPieSize: secondPieSize } : {}));
2040
+ }
2041
+ function extractDoughnutHoleSize(plotArea) {
2042
+ var _a;
2043
+ // <c:doughnutChart><c:holeSize val="50"/> — value is the inner radius
2044
+ // as a percentage of the chart radius (0-90). We normalize to a 0-1
2045
+ // fraction so renderers can use it without knowing the spec.
2046
+ var holeSize = readNumber((_a = get(plotArea, "c:doughnutChart.c:holeSize.a$.val")) !== null && _a !== void 0 ? _a : get(plotArea, "doughnutChart.holeSize.a$.val"));
2047
+ if (typeof holeSize !== "number")
2048
+ return undefined;
2049
+ return Math.min(0.9, Math.max(0, holeSize / 100));
2050
+ }
2051
+ // -------------------------- Phase 5.2 helpers --------------------------
2052
+ var mapTrendlineType = function (val) {
2053
+ switch (val) {
2054
+ case "exp":
2055
+ return "exp";
2056
+ case "log":
2057
+ return "log";
2058
+ case "poly":
2059
+ return "poly";
2060
+ case "power":
2061
+ return "power";
2062
+ case "movingAvg":
2063
+ return "movingAvg";
2064
+ case "linear":
2065
+ default:
2066
+ return "linear";
2067
+ }
2068
+ };
2069
+ function extractTrendlines(ser) {
2070
+ var e_23, _a;
2071
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
2072
+ // <c:trendline> can appear multiple times under a single series; the
2073
+ // parser may surface either an array or a single object.
2074
+ var raw = (_b = get(ser, "c:trendline")) !== null && _b !== void 0 ? _b : get(ser, "trendline");
2075
+ if (!raw)
2076
+ return undefined;
2077
+ var list = Array.isArray(raw) ? raw : [raw];
2078
+ var results = [];
2079
+ try {
2080
+ for (var list_2 = __values(list), list_2_1 = list_2.next(); !list_2_1.done; list_2_1 = list_2.next()) {
2081
+ var t = list_2_1.value;
2082
+ var type = mapTrendlineType((_c = get(t, "c:trendlineType.a$.val")) !== null && _c !== void 0 ? _c : get(t, "trendlineType.a$.val"));
2083
+ var order = readNumber((_d = get(t, "c:order.a$.val")) !== null && _d !== void 0 ? _d : get(t, "order.a$.val"));
2084
+ var period = readNumber((_e = get(t, "c:period.a$.val")) !== null && _e !== void 0 ? _e : get(t, "period.a$.val"));
2085
+ var name_1 = (_h = (_g = (_f = get(t, "c:name.t$")) !== null && _f !== void 0 ? _f : get(t, "name.t$")) !== null && _g !== void 0 ? _g : get(t, "c:name")) !== null && _h !== void 0 ? _h : get(t, "name");
2086
+ var showEquation = readBoolean((_j = get(t, "c:dispEq.a$.val")) !== null && _j !== void 0 ? _j : get(t, "dispEq.a$.val"));
2087
+ var showRSquared = readBoolean((_k = get(t, "c:dispRSqr.a$.val")) !== null && _k !== void 0 ? _k : get(t, "dispRSqr.a$.val"));
2088
+ var forecastForward = readNumber((_l = get(t, "c:forward.a$.val")) !== null && _l !== void 0 ? _l : get(t, "forward.a$.val"));
2089
+ var forecastBackward = readNumber((_m = get(t, "c:backward.a$.val")) !== null && _m !== void 0 ? _m : get(t, "backward.a$.val"));
2090
+ var entry = { type: type };
2091
+ if (typeof order === "number")
2092
+ entry.order = order;
2093
+ if (typeof period === "number")
2094
+ entry.period = period;
2095
+ if (typeof name_1 === "string" && name_1)
2096
+ entry.name = name_1;
2097
+ if (showEquation)
2098
+ entry.showEquation = true;
2099
+ if (showRSquared)
2100
+ entry.showRSquared = true;
2101
+ if (typeof forecastForward === "number")
2102
+ entry.forecastForward = forecastForward;
2103
+ if (typeof forecastBackward === "number")
2104
+ entry.forecastBackward = forecastBackward;
2105
+ results.push(entry);
2106
+ }
2107
+ }
2108
+ catch (e_23_1) { e_23 = { error: e_23_1 }; }
2109
+ finally {
2110
+ try {
2111
+ if (list_2_1 && !list_2_1.done && (_a = list_2.return)) _a.call(list_2);
2112
+ }
2113
+ finally { if (e_23) throw e_23.error; }
2114
+ }
2115
+ return results;
2116
+ }
2117
+ function extractErrorBars(ser, hostSheetId, resolveSheetId) {
2118
+ var _a, _b, _c, _d, _e, _f;
2119
+ var raw = (_a = get(ser, "c:errBars")) !== null && _a !== void 0 ? _a : get(ser, "errBars");
2120
+ if (!raw)
2121
+ return undefined;
2122
+ var direction = (_b = get(raw, "c:errDir.a$.val")) !== null && _b !== void 0 ? _b : get(raw, "errDir.a$.val");
2123
+ var barType = (_c = get(raw, "c:errBarType.a$.val")) !== null && _c !== void 0 ? _c : get(raw, "errBarType.a$.val");
2124
+ var valTypeVal = (_d = get(raw, "c:errValType.a$.val")) !== null && _d !== void 0 ? _d : get(raw, "errValType.a$.val");
2125
+ var value = readNumber((_e = get(raw, "c:val.a$.val")) !== null && _e !== void 0 ? _e : get(raw, "val.a$.val"));
2126
+ var noEndCap = readBoolean((_f = get(raw, "c:noEndCap.a$.val")) !== null && _f !== void 0 ? _f : get(raw, "noEndCap.a$.val"));
2127
+ var result = {};
2128
+ if (direction === "x" || direction === "y")
2129
+ result.direction = direction;
2130
+ if (barType === "both" || barType === "plus" || barType === "minus") {
2131
+ result.barType = barType;
2132
+ }
2133
+ if (valTypeVal === "fixedVal" ||
2134
+ valTypeVal === "percentage" ||
2135
+ valTypeVal === "stdDev" ||
2136
+ valTypeVal === "stdErr" ||
2137
+ valTypeVal === "cust") {
2138
+ result.valueType = valTypeVal === "cust" ? "custom" : valTypeVal;
2139
+ }
2140
+ if (typeof value === "number")
2141
+ result.value = value;
2142
+ if (noEndCap)
2143
+ result.noEndCap = true;
2144
+ // Custom error bars carry per-point magnitudes in worksheet ranges —
2145
+ // `<c:plus>/<c:minus>` each hold a `<c:numRef><c:f>` reference.
2146
+ if (result.valueType === "custom") {
2147
+ var plusRef = getWithFallback(raw, [
2148
+ "c:plus.c:numRef.c:f",
2149
+ "c:plus.c:numRef.c:f.t$",
2150
+ "plus.numRef.f",
2151
+ "plus.numRef.f.t$",
2152
+ ]);
2153
+ var minusRef = getWithFallback(raw, [
2154
+ "c:minus.c:numRef.c:f",
2155
+ "c:minus.c:numRef.c:f.t$",
2156
+ "minus.numRef.f",
2157
+ "minus.numRef.f.t$",
2158
+ ]);
2159
+ if (plusRef) {
2160
+ var plusSources = resolveSourcesFromRef(plusRef, hostSheetId, resolveSheetId);
2161
+ if (plusSources.length)
2162
+ result.plusRange = plusSources[0];
2163
+ }
2164
+ if (minusRef) {
2165
+ var minusSources = resolveSourcesFromRef(minusRef, hostSheetId, resolveSheetId);
2166
+ if (minusSources.length)
2167
+ result.minusRange = minusSources[0];
2168
+ }
2169
+ }
2170
+ return Object.keys(result).length ? result : undefined;
2171
+ }
2172
+ function extractRadarStyle(plotArea) {
2173
+ var _a;
2174
+ var val = (_a = get(plotArea, "c:radarChart.c:radarStyle.a$.val")) !== null && _a !== void 0 ? _a : get(plotArea, "radarChart.radarStyle.a$.val");
2175
+ if (val === "standard" || val === "marker" || val === "filled")
2176
+ return val;
2177
+ return undefined;
2178
+ }