@extend-ai/react-xlsx 0.20.3 → 0.20.5

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 (113) hide show
  1. package/dist/{browser-B73UAN6E.cjs → browser-6MKX73CJ.cjs} +8 -28
  2. package/dist/browser-6MKX73CJ.cjs.map +1 -0
  3. package/dist/{browser-KWIEUO2X.js → browser-KJ6EVWLG.js} +8 -27
  4. package/dist/{browser-KWIEUO2X.js.map → browser-KJ6EVWLG.js.map} +1 -1
  5. package/dist/{chart-renderer-XBF7EPUS.js → chart-renderer-2BLFC2BD.js} +94 -180
  6. package/dist/chart-renderer-2BLFC2BD.js.map +1 -0
  7. package/dist/{chart-renderer-W7XW24JI.cjs → chart-renderer-2K7XSPVG.cjs} +321 -407
  8. package/dist/chart-renderer-2K7XSPVG.cjs.map +1 -0
  9. package/dist/{chart-renderer-2EKXNHUD.cjs → chart-renderer-2UJZRUSN.cjs} +324 -410
  10. package/dist/chart-renderer-2UJZRUSN.cjs.map +1 -0
  11. package/dist/{chart-renderer-ZLJVPLGN.js → chart-renderer-IYKCQENY.js} +86 -172
  12. package/dist/chart-renderer-IYKCQENY.js.map +1 -0
  13. package/dist/{chunk-WGRRI25I.cjs → chunk-5PBSOOA7.cjs} +22 -9
  14. package/dist/chunk-5PBSOOA7.cjs.map +1 -0
  15. package/dist/{chunk-VG4JELEQ.js → chunk-BFSDKYQU.js} +30 -15
  16. package/dist/chunk-BFSDKYQU.js.map +1 -0
  17. package/dist/chunk-IN7OU5PF.js +32 -0
  18. package/dist/chunk-IN7OU5PF.js.map +1 -0
  19. package/dist/{chunk-HKMFMIKE.js → chunk-KSXNNWAY.js} +16 -7
  20. package/dist/chunk-KSXNNWAY.js.map +1 -0
  21. package/dist/chunk-LY4EWUKF.js +22 -0
  22. package/dist/chunk-LY4EWUKF.js.map +1 -0
  23. package/dist/chunk-N6MMMGLF.cjs +32 -0
  24. package/dist/chunk-N6MMMGLF.cjs.map +1 -0
  25. package/dist/{chunk-HEEFCVWS.js → chunk-R5ERJ3BT.js} +404 -149
  26. package/dist/chunk-R5ERJ3BT.js.map +1 -0
  27. package/dist/chunk-RN27VSTN.cjs +108 -0
  28. package/dist/chunk-RN27VSTN.cjs.map +1 -0
  29. package/dist/{chunk-XISBYOD5.cjs → chunk-YPTGD7GK.cjs} +1172 -917
  30. package/dist/chunk-YPTGD7GK.cjs.map +1 -0
  31. package/dist/chunk-ZAUUKER4.cjs +22 -0
  32. package/dist/chunk-ZAUUKER4.cjs.map +1 -0
  33. package/dist/full-C7H4X2EX.cjs +212 -0
  34. package/dist/full-C7H4X2EX.cjs.map +1 -0
  35. package/dist/full-YT626I57.js +209 -0
  36. package/dist/full-YT626I57.js.map +1 -0
  37. package/dist/index.cjs +838 -620
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.d.cts +57 -1
  40. package/dist/index.d.ts +57 -1
  41. package/dist/index.js +350 -132
  42. package/dist/index.js.map +1 -1
  43. package/dist/{internal-BJsg5os3.d.cts → internal-Cks9H21d.d.cts} +56 -1
  44. package/dist/{internal-BJsg5os3.d.ts → internal-Cks9H21d.d.ts} +56 -1
  45. package/dist/internal.cjs +4 -3
  46. package/dist/internal.cjs.map +1 -1
  47. package/dist/internal.d.cts +1 -1
  48. package/dist/internal.d.ts +1 -1
  49. package/dist/internal.js +3 -2
  50. package/dist/office_charts_bg.wasm +0 -0
  51. package/dist/office_charts_full_bg.wasm +0 -0
  52. package/dist/payload-7QT6NY6S.js +6 -0
  53. package/dist/payload-7QT6NY6S.js.map +1 -0
  54. package/dist/payload-BZGBW73P.cjs +8 -0
  55. package/dist/payload-BZGBW73P.cjs.map +1 -0
  56. package/dist/payload-H55PON66.js +6 -0
  57. package/dist/payload-H55PON66.js.map +1 -0
  58. package/dist/payload-RNKEYTQ4.cjs +8 -0
  59. package/dist/payload-RNKEYTQ4.cjs.map +1 -0
  60. package/dist/{shared-chart-DVC5S2P6.cjs → shared-chart-GCUFIUQL.cjs} +49 -20
  61. package/dist/shared-chart-GCUFIUQL.cjs.map +1 -0
  62. package/dist/{shared-chart-3STFRVWT.js → shared-chart-JV4MGKXX.js} +50 -20
  63. package/dist/shared-chart-JV4MGKXX.js.map +1 -0
  64. package/dist/{shared-chart-MFQSQG4K.cjs → shared-chart-OUC7EHFC.cjs} +49 -19
  65. package/dist/shared-chart-OUC7EHFC.cjs.map +1 -0
  66. package/dist/{shared-chart-BFQNYOIQ.js → shared-chart-PY47ED4I.js} +49 -20
  67. package/dist/shared-chart-PY47ED4I.js.map +1 -0
  68. package/dist/{surface-regl-R2N54JT2.js → surface-webgl-2ZZ6JQR2.js} +87 -151
  69. package/dist/surface-webgl-2ZZ6JQR2.js.map +1 -0
  70. package/dist/{surface-regl-BBJ6OIKK.cjs → surface-webgl-3HS6VBCK.cjs} +88 -152
  71. package/dist/surface-webgl-3HS6VBCK.cjs.map +1 -0
  72. package/dist/{surface-regl-7CDGGVDG.js → surface-webgl-4DQXDDXU.js} +87 -151
  73. package/dist/surface-webgl-4DQXDDXU.js.map +1 -0
  74. package/dist/{surface-regl-SUJ2TFZA.cjs → surface-webgl-SVYD564V.cjs} +88 -152
  75. package/dist/surface-webgl-SVYD564V.cjs.map +1 -0
  76. package/dist/vanilla.cjs +4 -3
  77. package/dist/vanilla.cjs.map +1 -1
  78. package/dist/vanilla.d.cts +2 -2
  79. package/dist/vanilla.d.ts +2 -2
  80. package/dist/vanilla.js +3 -2
  81. package/dist/xlsx-worker.js +298 -92
  82. package/dist/xlsx-worker.js.map +1 -1
  83. package/package.json +6 -15
  84. package/dist/browser-B73UAN6E.cjs.map +0 -1
  85. package/dist/chart-renderer-2EKXNHUD.cjs.map +0 -1
  86. package/dist/chart-renderer-W7XW24JI.cjs.map +0 -1
  87. package/dist/chart-renderer-XBF7EPUS.js.map +0 -1
  88. package/dist/chart-renderer-ZLJVPLGN.js.map +0 -1
  89. package/dist/chunk-6IGWCJU5.cjs +0 -90
  90. package/dist/chunk-6IGWCJU5.cjs.map +0 -1
  91. package/dist/chunk-HEEFCVWS.js.map +0 -1
  92. package/dist/chunk-HKMFMIKE.js.map +0 -1
  93. package/dist/chunk-VG4JELEQ.js.map +0 -1
  94. package/dist/chunk-WGRRI25I.cjs.map +0 -1
  95. package/dist/chunk-XISBYOD5.cjs.map +0 -1
  96. package/dist/payload-JBPE7GEG.cjs +0 -8
  97. package/dist/payload-JBPE7GEG.cjs.map +0 -1
  98. package/dist/payload-KYNCVJT5.js +0 -6
  99. package/dist/payload-KYNCVJT5.js.map +0 -1
  100. package/dist/region-map-geography-24TXETDP.cjs +0 -184
  101. package/dist/region-map-geography-24TXETDP.cjs.map +0 -1
  102. package/dist/region-map-geography-OR6DHAF7.js +0 -182
  103. package/dist/region-map-geography-OR6DHAF7.js.map +0 -1
  104. package/dist/shared-chart-3STFRVWT.js.map +0 -1
  105. package/dist/shared-chart-BFQNYOIQ.js.map +0 -1
  106. package/dist/shared-chart-DVC5S2P6.cjs.map +0 -1
  107. package/dist/shared-chart-MFQSQG4K.cjs.map +0 -1
  108. package/dist/surface-regl-7CDGGVDG.js.map +0 -1
  109. package/dist/surface-regl-BBJ6OIKK.cjs.map +0 -1
  110. package/dist/surface-regl-R2N54JT2.js.map +0 -1
  111. package/dist/surface-regl-SUJ2TFZA.cjs.map +0 -1
  112. package/dist/world-atlas-LICENSE.txt +0 -13
  113. /package/dist/{us-atlas-LICENSE.txt → rust-office-charts-MAP-DATA-LICENSE.txt} +0 -0
package/dist/index.js CHANGED
@@ -1,4 +1,7 @@
1
- import "./chunk-HKMFMIKE.js";
1
+ import {
2
+ loadSpreadsheetFonts
3
+ } from "./chunk-LY4EWUKF.js";
4
+ import "./chunk-KSXNNWAY.js";
2
5
  import {
3
6
  getBuiltinChartColor,
4
7
  getBuiltinChartSurfaceStyle,
@@ -68,31 +71,85 @@ function localizeCellNumber(worksheet, row, col, text, locale = "en-US") {
68
71
  );
69
72
  }
70
73
 
71
- // src/spreadsheet-fonts.ts
72
- var fontLoadPromise;
73
- var SPREADSHEET_FALLBACK_FONT = "React XLSX Carlito";
74
- function loadSpreadsheetFonts() {
75
- if (typeof document === "undefined" || typeof FontFace === "undefined") {
76
- return Promise.resolve();
77
- }
78
- return fontLoadPromise ??= import("./spreadsheet-font-assets-V366MXRM.js").then(async ({ spreadsheetFontFaces }) => {
79
- await Promise.allSettled(spreadsheetFontFaces.map(async ({ source, ...descriptors }) => {
80
- const face = new FontFace(SPREADSHEET_FALLBACK_FONT, `url(${JSON.stringify(source)})`, descriptors);
81
- await face.load();
82
- document.fonts.add(face);
83
- }));
84
- }).catch(() => {
85
- });
86
- }
87
-
88
74
  // src/controller.tsx
89
75
  import * as React from "react";
90
76
  import { formatBinaryBytes, XlsxFileSizeLimitExceededError } from "@extend-ai/react-xlsx/internal";
91
77
  import { XlsxFileSizeLimitExceededError as XlsxFileSizeLimitExceededError2 } from "@extend-ai/react-xlsx/internal";
92
- import { strFromU8 as strFromU83, strToU8 as strToU83, unzipSync as unzipSync2, zipSync as zipSync2 } from "fflate";
78
+ import { strFromU8 as strFromU84, strToU8 as strToU83, unzipSync as unzipSync2, zipSync as zipSync2 } from "fflate";
79
+
80
+ // src/chartsheet-payload.ts
81
+ import { strFromU8 } from "fflate";
82
+ var REL_NS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
83
+ function readXml(archive, path) {
84
+ const bytes = archive[path];
85
+ if (!bytes || typeof DOMParser === "undefined") return null;
86
+ const document2 = new DOMParser().parseFromString(strFromU8(bytes), "application/xml");
87
+ return document2.getElementsByTagName("parsererror").length > 0 ? null : document2;
88
+ }
89
+ function relationshipPath(partPath) {
90
+ const separator = partPath.lastIndexOf("/");
91
+ return `${partPath.slice(0, separator + 1)}_rels/${partPath.slice(separator + 1)}.rels`;
92
+ }
93
+ function resolveTarget(partPath, target) {
94
+ if (/^[a-z][a-z0-9+.-]*:/i.test(target) || target.startsWith("//")) return null;
95
+ const segments = target.startsWith("/") ? [] : partPath.split("/").slice(0, -1);
96
+ for (const segment of target.replace(/\\/g, "/").split("/")) {
97
+ if (!segment || segment === ".") continue;
98
+ if (segment === "..") {
99
+ if (segments.length === 0) return null;
100
+ segments.pop();
101
+ } else {
102
+ segments.push(segment);
103
+ }
104
+ }
105
+ return segments.join("/");
106
+ }
107
+ function readRelationships(archive, partPath) {
108
+ const relationships = /* @__PURE__ */ new Map();
109
+ const document2 = readXml(archive, relationshipPath(partPath));
110
+ for (const element of Array.from(document2?.getElementsByTagNameNS("*", "Relationship") ?? [])) {
111
+ if (element.getAttribute("TargetMode") === "External") continue;
112
+ const id = element.getAttribute("Id");
113
+ const rawTarget = element.getAttribute("Target");
114
+ const type = element.getAttribute("Type");
115
+ const target = rawTarget ? resolveTarget(partPath, rawTarget) : null;
116
+ if (id && type && target && archive[target]) relationships.set(id, { target, type });
117
+ }
118
+ return relationships;
119
+ }
120
+ function collectChartsheetDrawingOrigins(archive, chartsheets) {
121
+ const origins = /* @__PURE__ */ new Map();
122
+ if (chartsheets.length === 0) return origins;
123
+ const workbookPath = "xl/workbook.xml";
124
+ const workbookDocument = readXml(archive, workbookPath);
125
+ const workbookRelationships = readRelationships(archive, workbookPath);
126
+ for (const sheet of Array.from(workbookDocument?.getElementsByTagNameNS("*", "sheet") ?? [])) {
127
+ const relationshipId = sheet.getAttributeNS(REL_NS, "id") ?? sheet.getAttribute("r:id");
128
+ const relationship = relationshipId ? workbookRelationships.get(relationshipId) : null;
129
+ if (!relationship?.type.endsWith("/chartsheet")) continue;
130
+ const chartsheet = chartsheets.find((entry) => entry.name === sheet.getAttribute("name"));
131
+ if (!chartsheet || chartsheet.workbookSheetIndex == null) continue;
132
+ const sheetDocument = readXml(archive, relationship.target);
133
+ const sheetRelationships = readRelationships(archive, relationship.target);
134
+ const attachments = [];
135
+ for (const drawing of Array.from(sheetDocument?.getElementsByTagNameNS("*", "drawing") ?? [])) {
136
+ const drawingId = drawing.getAttributeNS(REL_NS, "id") ?? drawing.getAttribute("r:id");
137
+ const drawingRelationship = drawingId ? sheetRelationships.get(drawingId) : null;
138
+ if (!drawingRelationship?.type.endsWith("/drawing")) continue;
139
+ const drawingRelsPath = relationshipPath(drawingRelationship.target);
140
+ attachments.push({
141
+ drawingPath: drawingRelationship.target,
142
+ drawingRelsPath: archive[drawingRelsPath] ? drawingRelsPath : null,
143
+ mediaPaths: []
144
+ });
145
+ }
146
+ origins.set(chartsheet.index, { attachments, workbookSheetIndex: chartsheet.workbookSheetIndex });
147
+ }
148
+ return origins;
149
+ }
93
150
 
94
151
  // src/charts.ts
95
- import { strFromU8, strToU8 } from "fflate";
152
+ import { strFromU8 as strFromU82, strToU8 } from "fflate";
96
153
  var CHART_NS = "http://schemas.openxmlformats.org/drawingml/2006/chart";
97
154
  var DRAWINGML_NS = "http://schemas.openxmlformats.org/drawingml/2006/main";
98
155
  var CHART_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart";
@@ -241,18 +298,33 @@ function applyChartSeriesFormula(chart, seriesIndex, formula, workbook) {
241
298
  }
242
299
  const categoriesRef = {
243
300
  ...currentSeries.categoriesRef ?? {},
244
- formula: parsed.categoryFormula
301
+ formula: parsed.categoryFormula,
302
+ values: parsed.categoryFormula === currentSeries.categoriesRef?.formula ? currentSeries.categoriesRef.values : void 0
245
303
  };
246
304
  const valuesRef = {
247
305
  ...currentSeries.valuesRef ?? {},
248
- formula: parsed.valueFormula
306
+ formula: parsed.valueFormula,
307
+ values: parsed.valueFormula === currentSeries.valuesRef?.formula ? currentSeries.valuesRef.values : void 0
249
308
  };
250
309
  const bubbleSizeRef = chart.chartType === "Bubble" || parsed.bubbleSizeFormula ? {
251
310
  ...currentSeries.bubbleSizeRef ?? {},
252
- formula: parsed.bubbleSizeFormula
311
+ formula: parsed.bubbleSizeFormula,
312
+ values: parsed.bubbleSizeFormula === currentSeries.bubbleSizeRef?.formula ? currentSeries.bubbleSizeRef?.values : void 0
253
313
  } : currentSeries.bubbleSizeRef ?? null;
314
+ const isUnresolved = (formula2) => Boolean(
315
+ workbook && formula2 && !resolveReferenceSheet(workbook, chart.workbookSheetIndex, formula2).sheet
316
+ );
317
+ const resolveEditedReference = (reference, currentReference, currentValues, mode) => {
318
+ if (!workbook) return currentValues;
319
+ if (reference?.formula === currentReference?.formula && isUnresolved(reference?.formula)) return currentValues;
320
+ return resolveReferenceValues(workbook, chart.workbookSheetIndex, reference, mode);
321
+ };
254
322
  const raw = {
255
- ...currentSeries.raw ?? {}
323
+ ...currentSeries.raw ?? {},
324
+ unresolvedCategoriesReference: isUnresolved(categoriesRef.formula),
325
+ unresolvedValuesReference: isUnresolved(valuesRef.formula),
326
+ unresolvedBubbleSizeReference: isUnresolved(bubbleSizeRef?.formula),
327
+ unresolvedNameReference: isUnresolved(parsed.nameFormula)
256
328
  };
257
329
  if (parsed.nameFormula) {
258
330
  raw.name = parsed.nameFormula;
@@ -262,17 +334,21 @@ function applyChartSeriesFormula(chart, seriesIndex, formula, workbook) {
262
334
  const nextSeries = {
263
335
  ...currentSeries,
264
336
  bubbleSizeRef,
265
- bubbleSizes: workbook && bubbleSizeRef?.formula ? resolveReferenceValues(workbook, chart.workbookSheetIndex, bubbleSizeRef, "value").map((value) => typeof value === "number" && Number.isFinite(value) ? value : null) : currentSeries.bubbleSizes,
266
- categories: workbook ? resolveReferenceValues(workbook, chart.workbookSheetIndex, categoriesRef, "category") : currentSeries.categories,
337
+ bubbleSizes: resolveEditedReference(bubbleSizeRef, currentSeries.bubbleSizeRef, currentSeries.bubbleSizes ?? [], "value").map((value) => typeof value === "number" && Number.isFinite(value) ? value : null),
338
+ categories: resolveEditedReference(categoriesRef, currentSeries.categoriesRef, currentSeries.categories, "category"),
267
339
  categoriesRef,
268
- name: parsed.nameLiteral ?? (parsed.nameFormula && workbook ? resolveSeriesName(workbook, chart.workbookSheetIndex, parsed.nameFormula) : parsed.nameFormula ?? currentSeries.name),
340
+ name: parsed.nameLiteral ?? (parsed.nameFormula === currentSeries.raw?.name && isUnresolved(parsed.nameFormula) ? currentSeries.name : parsed.nameFormula && workbook ? resolveSeriesName(workbook, chart.workbookSheetIndex, parsed.nameFormula) : parsed.nameFormula ?? currentSeries.name),
269
341
  raw,
270
- values: workbook ? resolveReferenceValues(workbook, chart.workbookSheetIndex, valuesRef, "value").map((value) => typeof value === "number" && Number.isFinite(value) ? value : null) : currentSeries.values,
342
+ values: resolveEditedReference(valuesRef, currentSeries.valuesRef, currentSeries.values, "value").map((value) => typeof value === "number" && Number.isFinite(value) ? value : null),
271
343
  valuesRef
272
344
  };
273
345
  return {
274
346
  ...chart,
275
- series: chart.series.map((series, index) => index === seriesIndex ? nextSeries : series)
347
+ series: chart.series.map((series, index) => index === seriesIndex ? nextSeries : series),
348
+ typeGroups: chart.typeGroups?.map((group) => ({
349
+ ...group,
350
+ series: group.series.map((series) => series.id === currentSeries.id ? nextSeries : series)
351
+ }))
276
352
  };
277
353
  }
278
354
  function normalizeWorksheetVisibility(value) {
@@ -978,9 +1054,10 @@ function applyBuiltinChartDefaults(chart, themePalette) {
978
1054
  };
979
1055
  };
980
1056
  chart.series = chart.series.map(applySeriesDefaults);
1057
+ const canonicalSeries = chart.id.startsWith("chart-ex-") ? null : new Map(chart.series.map((series) => [series.id, series]));
981
1058
  let groupSeriesOffset = 0;
982
1059
  chart.typeGroups = chart.typeGroups?.map((group) => {
983
- const series = group.series.map((entry, index) => applySeriesDefaults(entry, groupSeriesOffset + index));
1060
+ const series = group.series.map((entry, index) => canonicalSeries?.get(entry.id) ?? applySeriesDefaults(entry, groupSeriesOffset + index));
984
1061
  groupSeriesOffset += group.series.length;
985
1062
  return { ...group, series };
986
1063
  });
@@ -1124,11 +1201,12 @@ function applyChartSeriesStyleFromXml(chart, chartTypeNode, themePalette) {
1124
1201
  const rawFillColor = typeof existingShapeProperties?.solidFillHex === "string" ? normalizeHexColor(existingShapeProperties.solidFillHex) : null;
1125
1202
  const rawLineColor = typeof existingShapeProperties?.lineColorHex === "string" ? normalizeHexColor(existingShapeProperties.lineColorHex) : null;
1126
1203
  const resolvedLineColor = lineStyle.hidden ? void 0 : rawLineColor ?? lineStyle.color ?? rawFillColor ?? fillColor ?? series.lineColor ?? series.color;
1127
- const hasCategoryReference = typeof series.categoriesRef?.formula === "string" && series.categoriesRef.formula.length > 0;
1128
- const hasValueReference = typeof series.valuesRef?.formula === "string" && series.valuesRef.formula.length > 0;
1129
- const hasBubbleSizeReference = typeof series.bubbleSizeRef?.formula === "string" && series.bubbleSizeRef.formula.length > 0;
1204
+ const hasCategoryReference = typeof series.categoriesRef?.formula === "string" && series.categoriesRef.formula.length > 0 && !series.raw?.unresolvedCategoriesReference;
1205
+ const hasValueReference = typeof series.valuesRef?.formula === "string" && series.valuesRef.formula.length > 0 && !series.raw?.unresolvedValuesReference;
1206
+ const hasBubbleSizeReference = typeof series.bubbleSizeRef?.formula === "string" && series.bubbleSizeRef.formula.length > 0 && !series.raw?.unresolvedBubbleSizeReference;
1130
1207
  return {
1131
1208
  ...series,
1209
+ name: series.raw?.unresolvedNameReference ? parseChartCacheValues(getFirstLocalChild(seriesNode, "tx"), "strCache", "category")?.[0]?.toString() ?? series.name : series.name,
1132
1210
  bubbleSizes: !hasBubbleSizeReference && cachedBubbleSizes ? cachedBubbleSizes.map((value) => typeof value === "number" && Number.isFinite(value) ? value : null) : series.bubbleSizes,
1133
1211
  categories: !hasCategoryReference && cachedCategories ? cachedCategories : series.categories,
1134
1212
  color: rawFillColor ?? rawLineColor ?? fillColor ?? lineStyle.color ?? series.color,
@@ -1388,6 +1466,23 @@ function applyChartStyleFromXml(chart, chartPath, archive, themePalette) {
1388
1466
  if (typeof fallbackStyleId === "number" && Number.isFinite(fallbackStyleId)) {
1389
1467
  chart.chartStyleId = fallbackStyleId;
1390
1468
  }
1469
+ const sourceSeries = chart.raw?.officeSourceSeries;
1470
+ if (sourceSeries && chartDocument?.documentElement.namespaceURI === "http://schemas.microsoft.com/office/drawing/2014/chartex") {
1471
+ chart.renderSource = {
1472
+ kind: chart.chartExLayout ?? "",
1473
+ seriesTypes: getLocalDescendants(chartNode, "series").map((node) => node.getAttribute("layoutId") ?? ""),
1474
+ sourceSeries,
1475
+ experimental: true,
1476
+ xml: chartXml,
1477
+ themeColors: themePalette ? Object.fromEntries(Object.entries(THEME_COLOR_INDEX_BY_NAME).flatMap(([key, index]) => {
1478
+ const color = themePalette.colorsByIndex[index];
1479
+ return color ? [[key, color]] : [];
1480
+ })) : void 0,
1481
+ themeOverrideXml: readArchiveText(archive, relationships.get("http://schemas.openxmlformats.org/officeDocument/2006/relationships/themeOverride")) ?? void 0,
1482
+ styleXml: readArchiveText(archive, relationships.get(CHART_STYLE_REL_TYPE)) ?? void 0,
1483
+ colorStyleXml: readArchiveText(archive, relationships.get(CHART_COLOR_STYLE_REL_TYPE)) ?? void 0
1484
+ };
1485
+ }
1391
1486
  applyModernChartExStyles();
1392
1487
  applyFallbackSeriesStyles();
1393
1488
  applyBuiltinChartDefaults(chart, themePalette);
@@ -1629,11 +1724,22 @@ function applyChartStyleFromXml(chart, chartPath, archive, themePalette) {
1629
1724
  chart.axes = [...chart.axes, seriesAxis];
1630
1725
  }
1631
1726
  }
1632
- const kind = chartTypeNode.localName === "lineChart" && chart.chartType === "Line" ? "line" : chartTypeNode.localName === "barChart" && chart.chartType === "ColumnClustered" ? "bar" : null;
1633
- const groupCount = Array.from(plotArea.children).filter((entry) => entry.localName.endsWith("Chart")).length;
1634
- if (kind && groupCount === 1 && !chart.is3d && !plotArea.querySelector("trendline, errBars, dropLines, hiLowLines, upDownBars, dateAx, multiLvlStrRef, pictureOptions") && getLocalChildren(chartTypeNode, "ser").length === chart.series.length) {
1727
+ const groups = Array.from(plotArea.children).filter((entry) => entry.localName.endsWith("Chart"));
1728
+ const seriesTypes = groups.flatMap((group) => getLocalChildren(group, "ser").map(() => group.localName.slice(0, -5)));
1729
+ const seriesNodes = groups.flatMap((group) => getLocalChildren(group, "ser"));
1730
+ const indexedXSeries = seriesNodes.map((series) => {
1731
+ const x = getFirstLocalChild(series, "xVal");
1732
+ return Boolean(x && (getFirstLocalChild(x, "multiLvlStrRef") || getFirstLocalChild(x, "strRef") || getFirstLocalChild(x, "strLit")));
1733
+ });
1734
+ const unsupportedHierarchy = getLocalDescendants(plotArea, "multiLvlStrRef").some((node) => node.parentElement?.localName !== "xVal");
1735
+ const kind = chartTypeNode.localName.slice(0, -5);
1736
+ const stable = groups.length === 1 && !chart.is3d && (kind === "line" && chart.chartType === "Line" || kind === "bar" && chart.chartType === "ColumnClustered") && !plotArea.querySelector("trendline, errBars, dropLines, hiLowLines, upDownBars, dateAx, multiLvlStrRef, pictureOptions");
1737
+ if (seriesTypes.length === chart.series.length && !unsupportedHierarchy && !plotArea.querySelector("pictureOptions")) {
1635
1738
  chart.renderSource = {
1636
1739
  kind,
1740
+ seriesTypes,
1741
+ indexedXSeries,
1742
+ experimental: !stable,
1637
1743
  xml: chartXml,
1638
1744
  themeColors: themePalette ? Object.fromEntries(Object.entries(THEME_COLOR_INDEX_BY_NAME).flatMap(([key, index]) => {
1639
1745
  const color = themePalette.colorsByIndex[index];
@@ -1644,7 +1750,21 @@ function applyChartStyleFromXml(chart, chartPath, archive, themePalette) {
1644
1750
  colorStyleXml: readArchiveText(archive, relationships.get(CHART_COLOR_STYLE_REL_TYPE)) ?? void 0
1645
1751
  };
1646
1752
  }
1647
- applyChartSeriesStyleFromXml(chart, chartTypeNode, themePalette);
1753
+ if (groups.length > 1 && chart.typeGroups?.length === groups.length) {
1754
+ let seriesOffset = 0;
1755
+ const hydratedSeries = [];
1756
+ chart.typeGroups = chart.typeGroups.map((group, index) => {
1757
+ const count = getLocalChildren(groups[index], "ser").length;
1758
+ const groupChart = { ...chart, chartType: group.chartType, series: chart.series.slice(seriesOffset, seriesOffset + count) };
1759
+ applyChartSeriesStyleFromXml(groupChart, groups[index], themePalette);
1760
+ seriesOffset += count;
1761
+ hydratedSeries.push(...groupChart.series);
1762
+ return { ...group, series: groupChart.series };
1763
+ });
1764
+ chart.series = [...hydratedSeries, ...chart.series.slice(seriesOffset)];
1765
+ } else {
1766
+ applyChartSeriesStyleFromXml(chart, chartTypeNode, themePalette);
1767
+ }
1648
1768
  applyFallbackSeriesStyles();
1649
1769
  applyBuiltinChartDefaults(chart, themePalette);
1650
1770
  }
@@ -1695,7 +1815,7 @@ function readArchiveText(archive, path) {
1695
1815
  return null;
1696
1816
  }
1697
1817
  const entry = archive[normalizeArchivePath(path)];
1698
- return entry ? strFromU8(entry) : null;
1818
+ return entry ? strFromU82(entry) : null;
1699
1819
  }
1700
1820
  function parseXml(xml) {
1701
1821
  if (typeof DOMParser === "undefined") {
@@ -1831,8 +1951,8 @@ function resolveReferenceSheet(workbook, fallbackSheetIndex, formula) {
1831
1951
  if (!formula) {
1832
1952
  return {
1833
1953
  range: null,
1834
- sheet: workbook.getSheet(fallbackSheetIndex),
1835
- sheetName: workbook.getSheet(fallbackSheetIndex)?.name ?? ""
1954
+ sheet: fallbackSheetIndex < workbook.sheetCount ? workbook.getSheet(fallbackSheetIndex) : null,
1955
+ sheetName: fallbackSheetIndex < workbook.sheetCount ? workbook.getSheet(fallbackSheetIndex)?.name ?? "" : ""
1836
1956
  };
1837
1957
  }
1838
1958
  const trimmedFormula = formula.trim();
@@ -1849,8 +1969,8 @@ function resolveReferenceSheet(workbook, fallbackSheetIndex, formula) {
1849
1969
  if (!split) {
1850
1970
  return {
1851
1971
  range: parseA1Range(trimmedFormula),
1852
- sheet: workbook.getSheet(fallbackSheetIndex),
1853
- sheetName: workbook.getSheet(fallbackSheetIndex)?.name ?? ""
1972
+ sheet: fallbackSheetIndex < workbook.sheetCount ? workbook.getSheet(fallbackSheetIndex) : null,
1973
+ sheetName: fallbackSheetIndex < workbook.sheetCount ? workbook.getSheet(fallbackSheetIndex)?.name ?? "" : ""
1854
1974
  };
1855
1975
  }
1856
1976
  try {
@@ -1862,8 +1982,8 @@ function resolveReferenceSheet(workbook, fallbackSheetIndex, formula) {
1862
1982
  } catch {
1863
1983
  return {
1864
1984
  range: parseA1Range(split.range),
1865
- sheet: workbook.getSheet(fallbackSheetIndex),
1866
- sheetName: workbook.getSheet(fallbackSheetIndex)?.name ?? ""
1985
+ sheet: null,
1986
+ sheetName: split.sheetName
1867
1987
  };
1868
1988
  }
1869
1989
  }
@@ -2132,6 +2252,7 @@ function buildChartExParetoLineSeries(series, sourceRaw, index) {
2132
2252
  });
2133
2253
  return {
2134
2254
  ...series,
2255
+ id: series.id.replace(/-series-\d+$/, `-series-${index}`),
2135
2256
  color: void 0,
2136
2257
  lineColor: void 0,
2137
2258
  markerColor: void 0,
@@ -2394,7 +2515,7 @@ function normalizeChartExChart(workbook, workbookSheetIndex, visibleSheetIndex,
2394
2515
  name: typeof drawing.name === "string" ? drawing.name : chartTitle,
2395
2516
  overlap: void 0,
2396
2517
  plotVisibleOnly: void 0,
2397
- raw: chart,
2518
+ raw: { ...chart, officeSourceSeries: normalizedSeries },
2398
2519
  radarStyle: void 0,
2399
2520
  scatterStyle: void 0,
2400
2521
  roundedCorners: void 0,
@@ -2862,7 +2983,13 @@ function normalizeChartSeries(workbook, workbookSheetIndex, chartId, raw, index)
2862
2983
  name: resolveSeriesName(workbook, workbookSheetIndex, series.name),
2863
2984
  negativeColor: void 0,
2864
2985
  negativeLineColor: void 0,
2865
- raw: series,
2986
+ raw: {
2987
+ ...series,
2988
+ unresolvedCategoriesReference: Boolean(categoriesRef?.formula && !resolveReferenceSheet(workbook, workbookSheetIndex, categoriesRef.formula).sheet),
2989
+ unresolvedValuesReference: Boolean(valuesRef?.formula && !resolveReferenceSheet(workbook, workbookSheetIndex, valuesRef.formula).sheet),
2990
+ unresolvedBubbleSizeReference: Boolean(bubbleSizeRef?.formula && !resolveReferenceSheet(workbook, workbookSheetIndex, bubbleSizeRef.formula).sheet),
2991
+ unresolvedNameReference: typeof series.name === "string" && series.name.includes("!") && !resolveReferenceSheet(workbook, workbookSheetIndex, series.name).sheet
2992
+ },
2866
2993
  shapeProperties,
2867
2994
  smooth: typeof series.smooth === "boolean" ? series.smooth : void 0,
2868
2995
  values: resolveReferenceValues(workbook, workbookSheetIndex, valuesRef, "value").map((value) => typeof value === "number" && Number.isFinite(value) ? value : null),
@@ -2924,12 +3051,15 @@ function buildTabs(workbook, chartsheets, visibleSheetIndexByWorkbookSheetIndex,
2924
3051
  const slotIndex = typeof entry.index === "number" ? entry.index : index;
2925
3052
  if (slotType === "chartsheet") {
2926
3053
  const chartsheet = chartsheets[slotIndex];
3054
+ const visibility2 = normalizeWorksheetVisibility(chartsheet?.raw?.visibility);
3055
+ if (!showHiddenSheets && visibility2 !== "visible") return [];
2927
3056
  return chartsheet ? [{
2928
3057
  chartsheetIndex: slotIndex,
2929
3058
  id: `chartsheet-${slotIndex}`,
2930
3059
  index,
2931
3060
  kind: "chartsheet",
2932
- name: chartsheet.name
3061
+ name: chartsheet.name,
3062
+ visibility: visibility2
2933
3063
  }] : [];
2934
3064
  }
2935
3065
  const worksheet = workbook.getSheet(slotIndex);
@@ -3033,9 +3163,24 @@ function applyChartOrigins(chartsByWorkbookSheetIndex, chartOriginsById, archive
3033
3163
  });
3034
3164
  }
3035
3165
  }
3036
- function hydrateWorkbookChartStyles(chartsByWorkbookSheetIndex, imageAssets) {
3166
+ function hydrateWorkbookChartStyles(chartsByWorkbookSheetIndex, imageAssets, chartsheets = []) {
3037
3167
  const chartOriginsById = /* @__PURE__ */ new Map();
3038
3168
  applyChartOrigins(chartsByWorkbookSheetIndex, chartOriginsById, imageAssets.archive, imageAssets.sheetOrigins);
3169
+ const chartsheetOrigins = collectChartsheetDrawingOrigins(imageAssets.archive, chartsheets);
3170
+ for (const chartsheet of chartsheets) {
3171
+ if (chartsheet.workbookSheetIndex == null) continue;
3172
+ const charts = chartsByWorkbookSheetIndex[chartsheet.workbookSheetIndex] ?? [];
3173
+ const origins = collectChartOriginsForSheet(imageAssets.archive, chartsheetOrigins.get(chartsheet.index) ?? null);
3174
+ for (const chart of charts) {
3175
+ const kind = chart.id.startsWith("chart-ex-") ? "modern" : "classic";
3176
+ const origin = origins.find((entry) => entry.chartKind === kind);
3177
+ if (!origin) continue;
3178
+ if (origin.anchor) chart.anchor = origin.anchor;
3179
+ chart.chartPath = origin.chartPath ?? void 0;
3180
+ chartsheet.chartPath = chart.chartPath;
3181
+ chartOriginsById.set(chart.id, origin);
3182
+ }
3183
+ }
3039
3184
  for (const charts of chartsByWorkbookSheetIndex) {
3040
3185
  for (const chart of charts) {
3041
3186
  applyChartStyleFromXml(chart, chart.chartPath, imageAssets.archive, imageAssets.themePalette);
@@ -3044,6 +3189,84 @@ function hydrateWorkbookChartStyles(chartsByWorkbookSheetIndex, imageAssets) {
3044
3189
  }
3045
3190
  return chartOriginsById;
3046
3191
  }
3192
+ function normalizeClassicChartDrawing(workbook, workbookSheetIndex, visibleSheetIndex, rawChart, chartIndex, chartId = `chart-${workbookSheetIndex}-${chartIndex}`) {
3193
+ const drawing = rawChart && typeof rawChart === "object" ? rawChart : {};
3194
+ const chart = drawing.chart && typeof drawing.chart === "object" ? drawing.chart : {};
3195
+ const rawView3d = chart.view3D && typeof chart.view3D === "object" ? chart.view3D : null;
3196
+ const rawSeries = Array.isArray(chart.series) ? chart.series : [];
3197
+ const typeGroups = Array.isArray(chart.typeGroups) ? chart.typeGroups.map((entry, groupIndex) => normalizeChartTypeGroup(workbook, workbookSheetIndex, chartId, entry, groupIndex)).filter((value) => value != null) : [];
3198
+ let seriesOrdinal = 0;
3199
+ const series = typeGroups.some((group) => group.series.length > 0) ? typeGroups.flatMap((group) => {
3200
+ group.series = group.series.map((entry) => ({ ...entry, id: `${chartId}-series-${seriesOrdinal++}` }));
3201
+ return group.series;
3202
+ }) : rawSeries.map((entry, seriesIndex) => normalizeChartSeries(workbook, workbookSheetIndex, chartId, entry, seriesIndex));
3203
+ const chartLevelDataLabels = normalizeChartDataLabels(chart.dataLabels);
3204
+ const firstSeriesDataLabels = rawSeries.length > 0 && rawSeries[0] && typeof rawSeries[0] === "object" ? normalizeChartDataLabels(rawSeries[0].dataLabels) : null;
3205
+ return {
3206
+ anchor: normalizeChartAnchor(drawing.anchor),
3207
+ autoTitleDeleted: typeof chart.autoTitleDeleted === "boolean" ? chart.autoTitleDeleted : void 0,
3208
+ axes: Array.isArray(chart.axes) ? chart.axes.map(normalizeChartAxis).filter((value) => Boolean(value)) : [],
3209
+ axisLabelColor: void 0,
3210
+ axisLineColor: void 0,
3211
+ categoryAxis: normalizeChartAxis(chart.categoryAxis),
3212
+ chartAreaBorderColor: void 0,
3213
+ chartAreaFillColor: void 0,
3214
+ chartColorPalette: void 0,
3215
+ chartColorPaletteOffset: void 0,
3216
+ chartPath: void 0,
3217
+ chartStyleId: void 0,
3218
+ chartType: typeof chart.chartType === "string" ? chart.chartType : "ColumnClustered",
3219
+ dataLabels: chartLevelDataLabels ?? firstSeriesDataLabels,
3220
+ displayBlanksAs: typeof chart.displayBlanksAs === "string" ? chart.displayBlanksAs : void 0,
3221
+ editable: true,
3222
+ firstSliceAngle: typeof chart.firstSliceAngle === "number" ? chart.firstSliceAngle : void 0,
3223
+ fontFamily: void 0,
3224
+ gapWidth: typeof chart.gapWidth === "number" ? chart.gapWidth : void 0,
3225
+ holeSize: typeof chart.holeSize === "number" ? chart.holeSize : void 0,
3226
+ id: chartId,
3227
+ is3d: typeof chart.is3D === "boolean" ? chart.is3D : typeof chart.is3d === "boolean" ? chart.is3d : void 0,
3228
+ legend: normalizeLegend(chart.legend) ? {
3229
+ ...normalizeLegend(chart.legend),
3230
+ position: normalizeLegendPosition(normalizeLegend(chart.legend)?.position)
3231
+ } : null,
3232
+ name: typeof drawing.name === "string" ? drawing.name : void 0,
3233
+ overlap: typeof chart.overlap === "number" ? chart.overlap : void 0,
3234
+ plotVisibleOnly: typeof chart.plotVisibleOnly === "boolean" ? chart.plotVisibleOnly : void 0,
3235
+ raw: chart,
3236
+ radarStyle: typeof chart.radarStyle === "string" ? chart.radarStyle : void 0,
3237
+ scatterStyle: typeof chart.scatterStyle === "string" ? chart.scatterStyle : void 0,
3238
+ roundedCorners: typeof chart.roundedCorners === "boolean" ? chart.roundedCorners : void 0,
3239
+ shape3d: typeof chart.shape === "string" ? chart.shape : typeof chart.shape3d === "string" ? chart.shape3d : void 0,
3240
+ seriesAxis: null,
3241
+ series,
3242
+ sheetIndex: visibleSheetIndex,
3243
+ showDlblsOverMax: typeof chart.showDlblsOverMax === "boolean" ? chart.showDlblsOverMax : void 0,
3244
+ sideWall: null,
3245
+ backWall: null,
3246
+ bubbleScale: typeof chart.bubbleScale === "number" ? chart.bubbleScale : void 0,
3247
+ bubble3d: typeof chart.bubble3d === "boolean" ? chart.bubble3d : void 0,
3248
+ floor: null,
3249
+ surfaceMaterial: void 0,
3250
+ textColor: void 0,
3251
+ title: typeof chart.title === "string" ? chart.title : void 0,
3252
+ titleColor: void 0,
3253
+ titleFontFamily: void 0,
3254
+ typeGroups,
3255
+ valueAxis: normalizeChartAxis(chart.valueAxis),
3256
+ varyColors: typeof chart.varyColors === "boolean" ? chart.varyColors : void 0,
3257
+ view3d: rawView3d ? {
3258
+ depthPercent: typeof rawView3d.depthPercent === "number" ? rawView3d.depthPercent : void 0,
3259
+ heightPercent: typeof rawView3d.heightPercent === "number" ? rawView3d.heightPercent : void 0,
3260
+ perspective: typeof rawView3d.perspective === "number" ? rawView3d.perspective : void 0,
3261
+ rAngAx: typeof rawView3d.rAngAx === "boolean" ? rawView3d.rAngAx : typeof rawView3d.rightAngleAxes === "boolean" ? rawView3d.rightAngleAxes : void 0,
3262
+ rotX: typeof rawView3d.rotX === "number" ? rawView3d.rotX : typeof rawView3d.rotateX === "number" ? rawView3d.rotateX : void 0,
3263
+ rotY: typeof rawView3d.rotY === "number" ? rawView3d.rotY : typeof rawView3d.rotateY === "number" ? rawView3d.rotateY : void 0
3264
+ } : void 0,
3265
+ wireframe: typeof chart.wireframe === "boolean" ? chart.wireframe : void 0,
3266
+ workbookSheetIndex,
3267
+ zIndex: Array.isArray(drawing.drawingPath) && typeof drawing.drawingPath[0] === "number" ? drawing.drawingPath[0] + 1 : chartIndex + 1
3268
+ };
3269
+ }
3047
3270
  function loadWorkbookChartAssets(workbook, imageAssets, visibleSheetIndexByWorkbookSheetIndex, showHiddenSheets = false) {
3048
3271
  const excludedChartIds = /* @__PURE__ */ new Set();
3049
3272
  const chartsByWorkbookSheetIndex = Array.from({ length: workbook.sheetCount }, (_, workbookSheetIndex) => {
@@ -3056,76 +3279,7 @@ function loadWorkbookChartAssets(workbook, imageAssets, visibleSheetIndexByWorkb
3056
3279
  if (rawChart.hidden || !rawChart.anchor) {
3057
3280
  excludedChartIds.add(chartId);
3058
3281
  }
3059
- const drawing = rawChart && typeof rawChart === "object" ? rawChart : {};
3060
- const chart = drawing.chart && typeof drawing.chart === "object" ? drawing.chart : {};
3061
- const rawView3d = chart.view3D && typeof chart.view3D === "object" ? chart.view3D : null;
3062
- const rawSeries = Array.isArray(chart.series) ? chart.series : [];
3063
- const chartLevelDataLabels = normalizeChartDataLabels(chart.dataLabels);
3064
- const firstSeriesDataLabels = rawSeries.length > 0 && rawSeries[0] && typeof rawSeries[0] === "object" ? normalizeChartDataLabels(rawSeries[0].dataLabels) : null;
3065
- return {
3066
- anchor: normalizeChartAnchor(drawing.anchor),
3067
- autoTitleDeleted: typeof chart.autoTitleDeleted === "boolean" ? chart.autoTitleDeleted : void 0,
3068
- axes: Array.isArray(chart.axes) ? chart.axes.map(normalizeChartAxis).filter((value) => Boolean(value)) : [],
3069
- axisLabelColor: void 0,
3070
- axisLineColor: void 0,
3071
- categoryAxis: normalizeChartAxis(chart.categoryAxis),
3072
- chartAreaBorderColor: void 0,
3073
- chartAreaFillColor: void 0,
3074
- chartColorPalette: void 0,
3075
- chartColorPaletteOffset: void 0,
3076
- chartPath: void 0,
3077
- chartStyleId: void 0,
3078
- chartType: typeof chart.chartType === "string" ? chart.chartType : "ColumnClustered",
3079
- dataLabels: chartLevelDataLabels ?? firstSeriesDataLabels,
3080
- displayBlanksAs: typeof chart.displayBlanksAs === "string" ? chart.displayBlanksAs : void 0,
3081
- editable: true,
3082
- firstSliceAngle: typeof chart.firstSliceAngle === "number" ? chart.firstSliceAngle : void 0,
3083
- fontFamily: void 0,
3084
- gapWidth: typeof chart.gapWidth === "number" ? chart.gapWidth : void 0,
3085
- holeSize: typeof chart.holeSize === "number" ? chart.holeSize : void 0,
3086
- id: chartId,
3087
- is3d: typeof chart.is3D === "boolean" ? chart.is3D : void 0,
3088
- legend: normalizeLegend(chart.legend) ? {
3089
- ...normalizeLegend(chart.legend),
3090
- position: normalizeLegendPosition(normalizeLegend(chart.legend)?.position)
3091
- } : null,
3092
- name: typeof drawing.name === "string" ? drawing.name : void 0,
3093
- overlap: typeof chart.overlap === "number" ? chart.overlap : void 0,
3094
- plotVisibleOnly: typeof chart.plotVisibleOnly === "boolean" ? chart.plotVisibleOnly : void 0,
3095
- raw: chart,
3096
- radarStyle: typeof chart.radarStyle === "string" ? chart.radarStyle : void 0,
3097
- scatterStyle: typeof chart.scatterStyle === "string" ? chart.scatterStyle : void 0,
3098
- roundedCorners: typeof chart.roundedCorners === "boolean" ? chart.roundedCorners : void 0,
3099
- shape3d: typeof chart.shape === "string" ? chart.shape : typeof chart.shape3d === "string" ? chart.shape3d : void 0,
3100
- seriesAxis: null,
3101
- series: rawSeries.map((entry, seriesIndex) => normalizeChartSeries(workbook, workbookSheetIndex, chartId, entry, seriesIndex)),
3102
- sheetIndex: visibleSheetIndex,
3103
- showDlblsOverMax: typeof chart.showDlblsOverMax === "boolean" ? chart.showDlblsOverMax : void 0,
3104
- sideWall: null,
3105
- backWall: null,
3106
- bubbleScale: typeof chart.bubbleScale === "number" ? chart.bubbleScale : void 0,
3107
- bubble3d: typeof chart.bubble3d === "boolean" ? chart.bubble3d : void 0,
3108
- floor: null,
3109
- surfaceMaterial: void 0,
3110
- textColor: void 0,
3111
- title: typeof chart.title === "string" ? chart.title : void 0,
3112
- titleColor: void 0,
3113
- titleFontFamily: void 0,
3114
- typeGroups: Array.isArray(chart.typeGroups) ? chart.typeGroups.map((entry, groupIndex) => normalizeChartTypeGroup(workbook, workbookSheetIndex, chartId, entry, groupIndex)).filter((value) => value != null) : [],
3115
- valueAxis: normalizeChartAxis(chart.valueAxis),
3116
- varyColors: typeof chart.varyColors === "boolean" ? chart.varyColors : void 0,
3117
- view3d: rawView3d ? {
3118
- depthPercent: typeof rawView3d.depthPercent === "number" ? rawView3d.depthPercent : void 0,
3119
- heightPercent: typeof rawView3d.heightPercent === "number" ? rawView3d.heightPercent : void 0,
3120
- perspective: typeof rawView3d.perspective === "number" ? rawView3d.perspective : void 0,
3121
- rAngAx: typeof rawView3d.rAngAx === "boolean" ? rawView3d.rAngAx : typeof rawView3d.rightAngleAxes === "boolean" ? rawView3d.rightAngleAxes : void 0,
3122
- rotX: typeof rawView3d.rotX === "number" ? rawView3d.rotX : typeof rawView3d.rotateX === "number" ? rawView3d.rotateX : void 0,
3123
- rotY: typeof rawView3d.rotY === "number" ? rawView3d.rotY : typeof rawView3d.rotateY === "number" ? rawView3d.rotateY : void 0
3124
- } : void 0,
3125
- wireframe: typeof chart.wireframe === "boolean" ? chart.wireframe : void 0,
3126
- workbookSheetIndex,
3127
- zIndex: Array.isArray(drawing.drawingPath) && typeof drawing.drawingPath[0] === "number" ? drawing.drawingPath[0] + 1 : chartIndex + 1
3128
- };
3282
+ return normalizeClassicChartDrawing(workbook, workbookSheetIndex, visibleSheetIndex, rawChart, chartIndex, chartId);
3129
3283
  });
3130
3284
  const modernCharts = rawChartsEx.map((rawChartEx, chartExIndex) => {
3131
3285
  const chartId = `chart-ex-${workbookSheetIndex}-${chartExIndex}`;
@@ -3144,8 +3298,36 @@ function loadWorkbookChartAssets(workbook, imageAssets, visibleSheetIndexByWorkb
3144
3298
  return [...classicCharts, ...modernCharts];
3145
3299
  });
3146
3300
  const chartsheets = Array.isArray(workbook.chartsheets) ? workbook.chartsheets.map((entry, index) => normalizeChartsheet(entry, index)) : [];
3301
+ for (const chartsheet of chartsheets) {
3302
+ const workbookSheetIndex = workbook.sheetCount + chartsheet.index;
3303
+ const raw = chartsheet.raw;
3304
+ const charts = [];
3305
+ if (raw?.chart && typeof raw.chart === "object") {
3306
+ charts.push(normalizeClassicChartDrawing(
3307
+ workbook,
3308
+ workbookSheetIndex,
3309
+ workbookSheetIndex,
3310
+ raw,
3311
+ 0,
3312
+ `${chartsheet.id}-chart-0`
3313
+ ));
3314
+ }
3315
+ if (raw?.chartEx && typeof raw.chartEx === "object") {
3316
+ charts.push(normalizeChartExChart(
3317
+ workbook,
3318
+ workbookSheetIndex,
3319
+ workbookSheetIndex,
3320
+ raw,
3321
+ 0,
3322
+ imageAssets?.themePalette ?? null
3323
+ ));
3324
+ }
3325
+ chartsByWorkbookSheetIndex[workbookSheetIndex] = charts;
3326
+ chartsheet.chartIds = charts.map((chart) => chart.id);
3327
+ chartsheet.workbookSheetIndex = workbookSheetIndex;
3328
+ }
3147
3329
  const tabs = buildTabs(workbook, chartsheets, visibleSheetIndexByWorkbookSheetIndex, showHiddenSheets);
3148
- const chartOriginsById = imageAssets ? hydrateWorkbookChartStyles(chartsByWorkbookSheetIndex, imageAssets) : /* @__PURE__ */ new Map();
3330
+ const chartOriginsById = imageAssets ? hydrateWorkbookChartStyles(chartsByWorkbookSheetIndex, imageAssets, chartsheets) : /* @__PURE__ */ new Map();
3149
3331
  if (imageAssets) {
3150
3332
  for (let index = 0; index < chartsByWorkbookSheetIndex.length; index += 1) {
3151
3333
  chartsByWorkbookSheetIndex[index] = (chartsByWorkbookSheetIndex[index] ?? []).filter((chart) => !excludedChartIds.has(chart.id));
@@ -3616,8 +3798,8 @@ function resolveWorkbookFillStyle(fill, themePalette) {
3616
3798
  }
3617
3799
 
3618
3800
  // src/images.ts
3619
- import { strFromU8 as strFromU82, strToU8 as strToU82, unzipSync, zipSync } from "fflate";
3620
- var REL_NS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
3801
+ import { strFromU8 as strFromU83, strToU8 as strToU82, unzipSync, zipSync } from "fflate";
3802
+ var REL_NS2 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
3621
3803
  var PKG_REL_NS = "http://schemas.openxmlformats.org/package/2006/relationships";
3622
3804
  var SPREADSHEET_NS = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
3623
3805
  var CONTENT_TYPES_NS = "http://schemas.openxmlformats.org/package/2006/content-types";
@@ -3666,6 +3848,19 @@ function measureColumnCharacterWidthPx(fontFamily, fontSizePt) {
3666
3848
  columnCharacterWidthCache.set(cacheKey, width);
3667
3849
  return width;
3668
3850
  }
3851
+ function measureOfficeDigitWidthPt(fontFamily, fontSizePt) {
3852
+ const family = fontFamily?.trim() || "Calibri";
3853
+ const size = typeof fontSizePt === "number" && fontSizePt > 0 ? fontSizePt : 11;
3854
+ const key = `office|${family}|${size}`;
3855
+ const cached = columnCharacterWidthCache.get(key);
3856
+ if (cached !== void 0) return cached;
3857
+ const context = typeof document !== "undefined" ? document.createElement("canvas").getContext("2d") : null;
3858
+ if (!context) return 6;
3859
+ context.font = `${size}px ${JSON.stringify(family)}, "React XLSX Carlito"`;
3860
+ const width = Math.max(1, Math.round(Math.max(...Array.from("0123456789", (digit) => context.measureText(digit).width))));
3861
+ columnCharacterWidthCache.set(key, width);
3862
+ return width;
3863
+ }
3669
3864
  function sheetColumnWidthToPixels(width, columnCharacterWidthPx = DEFAULT_COLUMN_CHARACTER_WIDTH_PX) {
3670
3865
  if (!Number.isFinite(width) || width <= 0) {
3671
3866
  return MIN_COL_WIDTH_PX;
@@ -3838,7 +4033,7 @@ function serializeXml2(document2) {
3838
4033
  }
3839
4034
  function readArchiveText2(archive, path) {
3840
4035
  const entry = archive[path];
3841
- return entry ? strFromU82(entry) : null;
4036
+ return entry ? strFromU83(entry) : null;
3842
4037
  }
3843
4038
  function parseColumnReference(reference) {
3844
4039
  let value = 0;
@@ -3933,10 +4128,10 @@ function readFeaturePropertyBagCheckboxComplements(archive) {
3933
4128
  return checkboxComplementIndices;
3934
4129
  }
3935
4130
  function getRelationshipId(element) {
3936
- return element.getAttributeNS(REL_NS, "id") ?? element.getAttribute("r:id") ?? element.getAttribute("id");
4131
+ return element.getAttributeNS(REL_NS2, "id") ?? element.getAttribute("r:id") ?? element.getAttribute("id");
3937
4132
  }
3938
4133
  function getEmbeddedRelationshipId(element) {
3939
- return element.getAttributeNS(REL_NS, "embed") ?? element.getAttribute("r:embed") ?? element.getAttribute("embed");
4134
+ return element.getAttributeNS(REL_NS2, "embed") ?? element.getAttribute("r:embed") ?? element.getAttribute("embed");
3940
4135
  }
3941
4136
  function setChildText(parent, localName, value) {
3942
4137
  const child = getFirstChild(parent, localName);
@@ -4804,6 +4999,18 @@ function parseSheetState(archive, path, options) {
4804
4999
  options?.defaultFont?.sizePt
4805
5000
  );
4806
5001
  const defaultRowHeight = Number(sheetFormatNode?.getAttribute("defaultRowHeight") ?? 15);
5002
+ const digitWidthPt = measureOfficeDigitWidthPt(options?.defaultFont?.family, options?.defaultFont?.sizePt);
5003
+ const storedColumnPixels = (width) => Math.max(0, Math.floor(
5004
+ (256 * width + Math.floor(128 / digitWidthPt)) / 256 * digitWidthPt
5005
+ ) * (4 / 3));
5006
+ const explicitDefaultWidth = Number(sheetFormatNode?.getAttribute("defaultColWidth") ?? Number.NaN);
5007
+ const baseWidth = Number(sheetFormatNode?.getAttribute("baseColWidth") ?? 8);
5008
+ const officeLayout = {
5009
+ defaultColumnPx: Number.isFinite(explicitDefaultWidth) && explicitDefaultWidth > 0 ? storedColumnPixels(explicitDefaultWidth) : ((Number.isFinite(baseWidth) && baseWidth > 0 ? baseWidth : 8) * digitWidthPt + 5) * (4 / 3),
5010
+ defaultRowPx: (Number.isFinite(defaultRowHeight) && defaultRowHeight > 0 ? defaultRowHeight : 15) * (4 / 3),
5011
+ columns: {},
5012
+ rows: {}
5013
+ };
4807
5014
  const defaultColWidth = Number(
4808
5015
  sheetFormatNode?.getAttribute("defaultColWidth") ?? sheetFormatNode?.getAttribute("baseColWidth") ?? 8.43
4809
5016
  );
@@ -4837,6 +5044,7 @@ function parseSheetState(archive, path, options) {
4837
5044
  const styleId = Number(rowNode.getAttribute("s") ?? Number.NaN);
4838
5045
  if (rowIndex >= 0 && Number.isFinite(height)) {
4839
5046
  rowHeightOverridesPx[rowIndex] = Math.max(MIN_ROW_HEIGHT_PX, Math.round(height * 1.33));
5047
+ officeLayout.rows[rowIndex] = { sourcePx: rowHeightOverridesPx[rowIndex], sizePx: Math.max(0, height * (4 / 3)) };
4840
5048
  }
4841
5049
  if (rowIndex >= 0 && Number.isFinite(styleId)) {
4842
5050
  rowStyleIds[rowIndex] = styleId;
@@ -4875,6 +5083,7 @@ function parseSheetState(archive, path, options) {
4875
5083
  if (Number.isFinite(width)) {
4876
5084
  const widthPx = sheetColumnWidthToPixels(width, columnWidthCharacterWidthPx);
4877
5085
  colWidthOverridesPx[col] = widthPx;
5086
+ officeLayout.columns[col] = { sourcePx: widthPx, sizePx: storedColumnPixels(width) };
4878
5087
  }
4879
5088
  if (Number.isFinite(styleId)) {
4880
5089
  colStyleIds[col] = styleId;
@@ -4891,6 +5100,7 @@ function parseSheetState(archive, path, options) {
4891
5100
  colStyleIds,
4892
5101
  conditionalFormatRules,
4893
5102
  defaultColWidthPx: sheetColumnWidthToPixels(defaultColWidth, columnWidthCharacterWidthPx),
5103
+ officeLayout,
4894
5104
  defaultRowHeightPx: Math.max(MIN_ROW_HEIGHT_PX, Math.round(defaultRowHeight * 1.33)),
4895
5105
  hasHorizontalMerges: false,
4896
5106
  hasVerticalMerges: false,
@@ -6345,7 +6555,7 @@ function appendSheetDrawingReference(sheetDocument, relationshipId) {
6345
6555
  return;
6346
6556
  }
6347
6557
  const drawingNode = sheetDocument.createElementNS(SPREADSHEET_NS, "drawing");
6348
- drawingNode.setAttributeNS(REL_NS, "r:id", relationshipId);
6558
+ drawingNode.setAttributeNS(REL_NS2, "r:id", relationshipId);
6349
6559
  const successorNames = /* @__PURE__ */ new Set([
6350
6560
  "legacyDrawing",
6351
6561
  "legacyDrawingHF",
@@ -7396,6 +7606,7 @@ function buildSheetList(workbook, sheetStatesByWorkbookSheetIndex, themePalette,
7396
7606
  colStyleIds: sheetState?.colStyleIds ?? {},
7397
7607
  conditionalFormatRules: sheetState?.conditionalFormatRules ?? [],
7398
7608
  dataValidations: parseWorksheetDataValidations(worksheet),
7609
+ officeLayout: sheetState?.officeLayout,
7399
7610
  defaultColWidthPx,
7400
7611
  defaultRowHeightPx,
7401
7612
  freezePanes: parseWorksheetFreezePanes(worksheet),
@@ -7485,6 +7696,7 @@ function buildSheetList(workbook, sheetStatesByWorkbookSheetIndex, themePalette,
7485
7696
  colStyleIds: sheetState?.colStyleIds ?? {},
7486
7697
  conditionalFormatRules: sheetState?.conditionalFormatRules ?? [],
7487
7698
  dataValidations: parseWorksheetDataValidations(worksheet),
7699
+ officeLayout: sheetState?.officeLayout,
7488
7700
  defaultColWidthPx,
7489
7701
  defaultRowHeightPx,
7490
7702
  freezePanes: parseWorksheetFreezePanes(worksheet),
@@ -8010,7 +8222,7 @@ function sanitizeSavedWorkbookBytes(bytes) {
8010
8222
  const archive = unzipSync2(bytes);
8011
8223
  const stylesEntry = archive["xl/styles.xml"];
8012
8224
  if (stylesEntry) {
8013
- const stylesXml = strFromU83(stylesEntry).replace(/&amp;quot;/g, "&quot;").replace(/&amp;apos;/g, "&apos;");
8225
+ const stylesXml = strFromU84(stylesEntry).replace(/&amp;quot;/g, "&quot;").replace(/&amp;apos;/g, "&apos;");
8014
8226
  archive["xl/styles.xml"] = strToU83(stylesXml);
8015
8227
  }
8016
8228
  return zipSync2(archive, { level: 6 });
@@ -8653,7 +8865,7 @@ function useXlsxViewerController(options) {
8653
8865
  return;
8654
8866
  }
8655
8867
  if (imageAssetsRef.current && !effectiveSkipXmlParsing) {
8656
- const chartOriginsById = hydrateWorkbookChartStyles(result.chartsByWorkbookSheetIndex, imageAssetsRef.current);
8868
+ const chartOriginsById = hydrateWorkbookChartStyles(result.chartsByWorkbookSheetIndex, imageAssetsRef.current, result.chartsheets);
8657
8869
  chartAssetsRef.current = { ...result, chartOriginsById };
8658
8870
  }
8659
8871
  setChartsByWorkbookSheetIndex(result.chartsByWorkbookSheetIndex);
@@ -8878,10 +9090,10 @@ function useXlsxViewerController(options) {
8878
9090
  return;
8879
9091
  }
8880
9092
  setImageAssets(workerImageAssets);
8881
- const chartOriginsById = workerImageAssets ? hydrateWorkbookChartStyles(snapshot.chartsByWorkbookSheetIndex, workerImageAssets) : /* @__PURE__ */ new Map();
9093
+ const chartOriginsById = workerImageAssets ? hydrateWorkbookChartStyles(snapshot.chartsByWorkbookSheetIndex, workerImageAssets, snapshot.chartsheets) : /* @__PURE__ */ new Map();
8882
9094
  setFormControlsByWorkbookSheetIndex(snapshot.formControlsByWorkbookSheetIndex);
8883
9095
  setWorkbook(null);
8884
- setSheets(snapshot.sheets);
9096
+ setSheets(snapshot.sheets.map((sheet) => ({ ...sheet, officeLayout: workerImageAssets?.sheetStatesByWorkbookSheetIndex[sheet.workbookSheetIndex]?.officeLayout })));
8885
9097
  setChartsByWorkbookSheetIndex(snapshot.chartsByWorkbookSheetIndex);
8886
9098
  setChartsheets(snapshot.chartsheets);
8887
9099
  setTabs(snapshot.tabs);
@@ -9134,11 +9346,11 @@ function useXlsxViewerController(options) {
9134
9346
  }
9135
9347
  const workerImageAssets = effectiveSkipXmlParsing ? null : parseWorkbookImageAssets(new Uint8Array(deferredBuffer));
9136
9348
  setImageAssets(workerImageAssets);
9137
- const chartOriginsById = workerImageAssets ? hydrateWorkbookChartStyles(snapshot.chartsByWorkbookSheetIndex, workerImageAssets) : /* @__PURE__ */ new Map();
9349
+ const chartOriginsById = workerImageAssets ? hydrateWorkbookChartStyles(snapshot.chartsByWorkbookSheetIndex, workerImageAssets, snapshot.chartsheets) : /* @__PURE__ */ new Map();
9138
9350
  deferredBufferRef.current = null;
9139
9351
  setDeferredLoadFileSize(null);
9140
9352
  setWorkbook(null);
9141
- setSheets(snapshot.sheets);
9353
+ setSheets(snapshot.sheets.map((sheet) => ({ ...sheet, officeLayout: workerImageAssets?.sheetStatesByWorkbookSheetIndex[sheet.workbookSheetIndex]?.officeLayout })));
9142
9354
  setChartsByWorkbookSheetIndex(snapshot.chartsByWorkbookSheetIndex);
9143
9355
  setChartsheets(snapshot.chartsheets);
9144
9356
  setTabs(snapshot.tabs);
@@ -10461,7 +10673,13 @@ function useXlsxViewerController(options) {
10461
10673
  if (!nextChart) {
10462
10674
  return false;
10463
10675
  }
10464
- updateChart(chartId, { series: nextChart.series, renderSource: chart.renderSource });
10676
+ const source = chart.renderSource;
10677
+ const indexedCategoryFormulaChanged = source?.indexedXSeries?.[seriesIndex] && chart.series[seriesIndex]?.categoriesRef?.formula !== nextChart.series[seriesIndex]?.categoriesRef?.formula;
10678
+ updateChart(chartId, {
10679
+ series: nextChart.series,
10680
+ typeGroups: nextChart.typeGroups,
10681
+ renderSource: source?.sourceSeries || indexedCategoryFormulaChanged ? void 0 : source
10682
+ });
10465
10683
  const selectedSeries = nextChart.series[seriesIndex];
10466
10684
  if (selectedSeries) {
10467
10685
  setSelectedChartElement((current) => current && current.chartId === chartId && current.kind !== "chart" ? {