ooxml-ui 1.30.0 → 1.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/README.md +10 -0
  2. package/custom-elements.json +4 -0
  3. package/dist/building-block-styles.d.ts +0 -1
  4. package/dist/chart/format-pane-3d.d.ts +0 -1
  5. package/dist/chart/format-pane-analysis.d.ts +0 -1
  6. package/dist/chart/format-pane-fill-line.d.ts +0 -1
  7. package/dist/chart/format-pane-text.d.ts +0 -1
  8. package/dist/{chunk-SBBFNAKM.js → chunk-32P252JS.js} +3 -3
  9. package/dist/{chunk-E4H3Y7M4.js → chunk-6TS7ASDJ.js} +1 -1
  10. package/dist/{chunk-BKHWBIXP.js → chunk-CALEXPBD.js} +132 -69
  11. package/dist/{chunk-SXVOXSTE.js → chunk-CDC5MAZS.js} +1 -1
  12. package/dist/chunk-DA57FPSN.js +54 -0
  13. package/dist/{chunk-HNREZW5U.js → chunk-KYXSQFDB.js} +484 -1
  14. package/dist/{chunk-IE6HKH4X.js → chunk-OKEFAQJT.js} +1 -1
  15. package/dist/controls.d.ts +6 -0
  16. package/dist/controls.d.ts.map +1 -1
  17. package/dist/controls.js +1 -1
  18. package/dist/dialog/dialog-session.d.ts +19 -0
  19. package/dist/dialog/dialog-session.d.ts.map +1 -0
  20. package/dist/docx/smartart-node-view.d.ts +1 -1
  21. package/dist/docx.js +36 -20
  22. package/dist/fonts/availability.d.ts +10 -0
  23. package/dist/fonts/availability.d.ts.map +1 -0
  24. package/dist/fonts/catalog.d.ts +63 -0
  25. package/dist/fonts/catalog.d.ts.map +1 -0
  26. package/dist/fonts/custom-fonts.d.ts +75 -0
  27. package/dist/fonts/custom-fonts.d.ts.map +1 -0
  28. package/dist/form/color-input/live-color-input.d.ts +93 -0
  29. package/dist/form/color-input/live-color-input.d.ts.map +1 -0
  30. package/dist/form/color-input/live-color-leaves.d.ts +34 -0
  31. package/dist/form/color-input/live-color-leaves.d.ts.map +1 -0
  32. package/dist/index.d.ts +1 -0
  33. package/dist/index.js +6 -5
  34. package/dist/picture-effects.d.ts +6 -0
  35. package/dist/pptx/ai/host.cjs +41 -37
  36. package/dist/pptx/ai/host.d.ts +2 -0
  37. package/dist/pptx/ai/host.d.ts.map +1 -1
  38. package/dist/pptx/ai/host.mjs +2 -2
  39. package/dist/pptx/ai/index.cjs +47 -43
  40. package/dist/pptx/ai/index.d.ts +2 -0
  41. package/dist/pptx/ai/index.d.ts.map +1 -1
  42. package/dist/pptx/ai/index.mjs +3 -3
  43. package/dist/pptx/{chart-3d-view-scene-ZUGA3DKM.mjs → chart-3d-view-scene-HNL4NWJT.mjs} +2 -2
  44. package/dist/pptx/{chart-3d-view-scene-N7UQOYFI.cjs → chart-3d-view-scene-OPVBTZL5.cjs} +38 -38
  45. package/dist/pptx/chunk-3RIGT7H6.cjs +82 -0
  46. package/dist/pptx/{chunk-D7UYDESZ.mjs → chunk-7DT3UJQB.mjs} +3 -3
  47. package/dist/pptx/{chunk-KY75GY5O.mjs → chunk-7FXQHSPE.mjs} +6 -24
  48. package/dist/pptx/{chunk-45OYSCLD.mjs → chunk-CH4Z6H6C.mjs} +581 -230
  49. package/dist/pptx/{chunk-6KLPQQYP.cjs → chunk-D4LJJ7Z7.cjs} +77 -327
  50. package/dist/pptx/{chunk-MNSWEXYO.mjs → chunk-DACFW5LO.mjs} +26 -3
  51. package/dist/pptx/{chunk-IOOI63TH.cjs → chunk-FFWLDANS.cjs} +6 -24
  52. package/dist/pptx/{chunk-SMMEIEEJ.mjs → chunk-KGDMMWIY.mjs} +1 -1
  53. package/dist/pptx/{chunk-LXEMMWVI.mjs → chunk-LCCRLB7Q.mjs} +1 -1
  54. package/dist/pptx/{chunk-BMMTD6PB.cjs → chunk-M55PNMFQ.cjs} +2 -2
  55. package/dist/pptx/chunk-PM2SOLK3.mjs +79 -0
  56. package/dist/pptx/{chunk-QX6XPYVA.mjs → chunk-PTIGQSTY.mjs} +31 -14
  57. package/dist/pptx/{chunk-34LEUH5R.mjs → chunk-RZVEPTLN.mjs} +63 -316
  58. package/dist/pptx/{chunk-CQYWHRZE.cjs → chunk-S3L5NNCK.cjs} +1 -1
  59. package/dist/pptx/{chunk-H5IPNKX6.cjs → chunk-S5I64Y55.cjs} +12 -12
  60. package/dist/pptx/{chunk-WQA3KZRB.mjs → chunk-SPOECCPV.mjs} +1 -1
  61. package/dist/pptx/{chunk-YMWEU56T.cjs → chunk-TDIJHLS5.cjs} +927 -543
  62. package/dist/pptx/{chunk-QWF3PGUX.cjs → chunk-VEFFYJGG.cjs} +26 -2
  63. package/dist/pptx/{chunk-BSGCZ4JZ.cjs → chunk-WBGU7BWD.cjs} +31 -14
  64. package/dist/pptx/{chunk-2CBK46AW.cjs → chunk-ZS5EVODY.cjs} +48 -48
  65. package/dist/pptx/dom/index.cjs +431 -430
  66. package/dist/pptx/dom/index.mjs +15 -14
  67. package/dist/pptx/export/html2canvas-clone.cjs +6 -6
  68. package/dist/pptx/export/html2canvas-clone.mjs +1 -1
  69. package/dist/pptx/index.cjs +3423 -3355
  70. package/dist/pptx/index.mjs +8 -8
  71. package/dist/pptx/render/bullet-toggle-selection.d.ts +8 -4
  72. package/dist/pptx/render/bullet-toggle-selection.d.ts.map +1 -1
  73. package/dist/pptx/render/chart-box-whisker.d.ts.map +1 -1
  74. package/dist/pptx/render/chart-combo-stock.cjs +3 -3
  75. package/dist/pptx/render/chart-combo-stock.mjs +1 -1
  76. package/dist/pptx/render/chart-data-table-metrics.d.ts +1 -1
  77. package/dist/pptx/render/chart-data-table-metrics.d.ts.map +1 -1
  78. package/dist/pptx/render/chart-data-table-render.d.ts.map +1 -1
  79. package/dist/pptx/render/chart-date-axis.d.ts +1 -1
  80. package/dist/pptx/render/chart-date-axis.d.ts.map +1 -1
  81. package/dist/pptx/render/chart-date-format.d.ts +1 -30
  82. package/dist/pptx/render/chart-date-format.d.ts.map +1 -1
  83. package/dist/pptx/render/chart-funnel-sunburst.d.ts +1 -1
  84. package/dist/pptx/render/chart-funnel-sunburst.d.ts.map +1 -1
  85. package/dist/pptx/render/chart-line-path.d.ts +2 -26
  86. package/dist/pptx/render/chart-line-path.d.ts.map +1 -1
  87. package/dist/pptx/render/chart-manual-layout.d.ts +1 -1
  88. package/dist/pptx/render/chart-manual-layout.d.ts.map +1 -1
  89. package/dist/pptx/render/chart-overlays.cjs +7 -7
  90. package/dist/pptx/render/chart-overlays.mjs +1 -1
  91. package/dist/pptx/render/chart-surface-treemap.cjs +4 -4
  92. package/dist/pptx/render/chart-surface-treemap.mjs +1 -1
  93. package/dist/pptx/render/chart-view-model-layout.d.ts.map +1 -1
  94. package/dist/pptx/render/chart-view-model.cjs +44 -44
  95. package/dist/pptx/render/chart-view-model.mjs +1 -1
  96. package/dist/pptx/render/chart-waterfall-map.cjs +6 -6
  97. package/dist/pptx/render/chart-waterfall-map.mjs +1 -1
  98. package/dist/pptx/render/controller/ai-assistant.d.ts +73 -0
  99. package/dist/pptx/render/controller/ai-assistant.d.ts.map +1 -0
  100. package/dist/pptx/render/controller/autosave-controller.d.ts.map +1 -1
  101. package/dist/pptx/render/controller/collaboration-history.d.ts +25 -0
  102. package/dist/pptx/render/controller/collaboration-history.d.ts.map +1 -1
  103. package/dist/pptx/render/controller/history-controller.d.ts +9 -0
  104. package/dist/pptx/render/controller/history-controller.d.ts.map +1 -1
  105. package/dist/pptx/render/controller/index.d.ts +4 -0
  106. package/dist/pptx/render/controller/index.d.ts.map +1 -1
  107. package/dist/pptx/render/custom-fonts.cjs +9 -5
  108. package/dist/pptx/render/custom-fonts.d.ts +1 -64
  109. package/dist/pptx/render/custom-fonts.d.ts.map +1 -1
  110. package/dist/pptx/render/custom-fonts.mjs +1 -1
  111. package/dist/pptx/render/editor-geometry.d.ts +3 -15
  112. package/dist/pptx/render/editor-geometry.d.ts.map +1 -1
  113. package/dist/pptx/render/font-availability.d.ts +1 -9
  114. package/dist/pptx/render/font-availability.d.ts.map +1 -1
  115. package/dist/pptx/render/font-catalog.cjs +3 -3
  116. package/dist/pptx/render/font-catalog.d.ts +3 -61
  117. package/dist/pptx/render/font-catalog.d.ts.map +1 -1
  118. package/dist/pptx/render/font-catalog.mjs +1 -1
  119. package/dist/pptx/render/hyperlink-security.cjs +8 -8
  120. package/dist/pptx/render/hyperlink-security.d.ts +1 -27
  121. package/dist/pptx/render/hyperlink-security.d.ts.map +1 -1
  122. package/dist/pptx/render/hyperlink-security.mjs +1 -1
  123. package/dist/pptx/render/image-effects.d.ts.map +1 -1
  124. package/dist/pptx/render/index.d.ts +2 -0
  125. package/dist/pptx/render/index.d.ts.map +1 -1
  126. package/dist/pptx/render/inline-list-style.d.ts +2 -1
  127. package/dist/pptx/render/inline-list-style.d.ts.map +1 -1
  128. package/dist/pptx/render/live-color-input.d.ts +2 -92
  129. package/dist/pptx/render/live-color-input.d.ts.map +1 -1
  130. package/dist/pptx/render/live-color-leaves.d.ts +2 -33
  131. package/dist/pptx/render/live-color-leaves.d.ts.map +1 -1
  132. package/dist/pptx/render/options/autocorrect.d.ts +15 -2
  133. package/dist/pptx/render/options/autocorrect.d.ts.map +1 -1
  134. package/dist/pptx/render/picture-crop/crop-geometry.d.ts +2 -20
  135. package/dist/pptx/render/picture-crop/crop-geometry.d.ts.map +1 -1
  136. package/dist/pptx/render/slides-pane-model.d.ts +79 -0
  137. package/dist/pptx/render/slides-pane-model.d.ts.map +1 -0
  138. package/dist/pptx/render/table-cell-edit.d.ts +1 -1
  139. package/dist/pptx/render/table-cell-edit.d.ts.map +1 -1
  140. package/dist/pptx/render/text-list-style-update.d.ts +23 -2
  141. package/dist/pptx/render/text-list-style-update.d.ts.map +1 -1
  142. package/dist/pptx/render/text-script-fonts.d.ts +4 -72
  143. package/dist/pptx/render/text-script-fonts.d.ts.map +1 -1
  144. package/dist/pptx/render/text-warp-envelope-block.d.ts +10 -1
  145. package/dist/pptx/render/text-warp-envelope-block.d.ts.map +1 -1
  146. package/dist/pptx/render/text-warp-envelope-curves.d.ts +8 -0
  147. package/dist/pptx/render/text-warp-envelope-curves.d.ts.map +1 -1
  148. package/dist/pptx/render/text-warp-envelope-layout.d.ts +9 -3
  149. package/dist/pptx/render/text-warp-envelope-layout.d.ts.map +1 -1
  150. package/dist/pptx/render/text-warp-envelope-map.d.ts.map +1 -1
  151. package/dist/pptx/render/text-warp-envelope-wrap.d.ts +29 -0
  152. package/dist/pptx/render/text-warp-envelope-wrap.d.ts.map +1 -0
  153. package/dist/pptx/render/text-warp-preset-definitions.d.ts +13 -0
  154. package/dist/pptx/render/text-warp-preset-definitions.d.ts.map +1 -1
  155. package/dist/pptx/render/text-warp-preset-sampler.d.ts +12 -0
  156. package/dist/pptx/render/text-warp-preset-sampler.d.ts.map +1 -1
  157. package/dist/pptx/render/text-warp.d.ts +3 -2
  158. package/dist/pptx/render/text-warp.d.ts.map +1 -1
  159. package/dist/pptx/render/viewer-props-manifest.d.ts.map +1 -1
  160. package/dist/pptx/{smartart-insert-preview-SKFD7NCQ.mjs → smartart-insert-preview-RQUFRLSV.mjs} +9 -9
  161. package/dist/pptx/{smartart-insert-preview-7OL7VWEK.cjs → smartart-insert-preview-YKNB37GE.cjs} +10 -10
  162. package/dist/recovery-scheduler.d.ts +18 -0
  163. package/dist/recovery-scheduler.d.ts.map +1 -0
  164. package/dist/smartart/smartart-geometry.d.ts +1 -3
  165. package/dist/smartart/smartart-paint.d.ts +2 -1
  166. package/dist/smartart/smartart-picture.d.ts +7 -0
  167. package/dist/smartart/smartart-svg.d.ts +2 -1
  168. package/dist/smartart/smartart.d.ts +6 -0
  169. package/dist/smartart.js +1 -1
  170. package/dist/teams.js +2 -2
  171. package/dist/theme-bridge.d.ts +0 -1
  172. package/dist/theme.d.ts +0 -1
  173. package/dist/visio/controller.d.ts +2 -2
  174. package/dist/visio/viewer-autorecover.d.ts +0 -1
  175. package/dist/visio/viewer-commands.d.ts +1 -1
  176. package/dist/visio/viewer-guides.d.ts +2 -2
  177. package/dist/visio/viewer-pointer-gestures.d.ts +1 -1
  178. package/dist/visio/viewer-resize-frame.d.ts +2 -2
  179. package/dist/visio/viewer-resize-handles.d.ts +1 -1
  180. package/dist/visio.js +109 -62
  181. package/dist/xlsx/grid/smartart.d.ts +1 -1
  182. package/dist/xlsx.js +91 -62
  183. package/package.json +2 -2
  184. package/dist/pptx/chunk-WM5SW737.mjs +0 -27
  185. package/dist/pptx/chunk-Y6DO6SVT.cjs +0 -29
@@ -1959,16 +1959,16 @@ function bevelMarkup(rects, threeD) {
1959
1959
  }
1960
1960
 
1961
1961
  // src/pptx/render/chart-format/chart-format-geometry.ts
1962
- function chartTextBox(text, pad2 = 3) {
1962
+ function chartTextBox(text, pad = 3) {
1963
1963
  const width = Math.max(4, text.text.length * text.fontSize * 0.58);
1964
1964
  const left = text.textAnchor === "start" ? text.x : text.textAnchor === "end" ? text.x - width : text.x - width / 2;
1965
1965
  const middle = text.dominantBaseline === "middle" || text.dominantBaseline === "central";
1966
1966
  const top = middle ? text.y - text.fontSize / 2 : text.y - text.fontSize;
1967
1967
  return {
1968
- left: left - pad2,
1969
- top: top - pad2,
1970
- right: left + width + pad2,
1971
- bottom: top + text.fontSize + pad2
1968
+ left: left - pad,
1969
+ top: top - pad,
1970
+ right: left + width + pad,
1971
+ bottom: top + text.fontSize + pad
1972
1972
  };
1973
1973
  }
1974
1974
  function chartPlotBounds(vm) {
@@ -2552,12 +2552,12 @@ var hasBox = (format, ownGradient = true) => Boolean(
2552
2552
  format && !format.reset && (paints(format.fill, ownGradient) || format.line?.kind === "solid" || format.line?.kind === "gradient" || format.effects?.shadow || format.effects?.glow && format.effects.glow.radius > 0 || format.threeD?.bevelTop || format.threeD?.contour)
2553
2553
  );
2554
2554
  var boxFill = (fill, ownGradient) => fill?.kind === "gradient" && !ownGradient ? void 0 : fill;
2555
- function union(boxes, pad2) {
2555
+ function union(boxes, pad) {
2556
2556
  if (boxes.length === 0) return void 0;
2557
- const left = Math.min(...boxes.map((b) => b.left)) - pad2;
2558
- const top = Math.min(...boxes.map((b) => b.top)) - pad2;
2559
- const right = Math.max(...boxes.map((b) => b.right)) + pad2;
2560
- const bottom = Math.max(...boxes.map((b) => b.bottom)) + pad2;
2557
+ const left = Math.min(...boxes.map((b) => b.left)) - pad;
2558
+ const top = Math.min(...boxes.map((b) => b.top)) - pad;
2559
+ const right = Math.max(...boxes.map((b) => b.right)) + pad;
2560
+ const bottom = Math.max(...boxes.map((b) => b.bottom)) + pad;
2561
2561
  return { x: left, y: top, w: right - left, h: bottom - top };
2562
2562
  }
2563
2563
  var textBoxes = (texts) => (texts ?? []).filter((t) => !t.transform).map((t) => chartTextBox(t, 2));
@@ -3492,18 +3492,6 @@ function manualLegendAnchor(layout, frame, entryCount, vertical, auto) {
3492
3492
  }
3493
3493
  return vertical ? { x: rect.x, y: rect.y } : { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2 };
3494
3494
  }
3495
- function applyLabelManualLayout(layout, frame, point) {
3496
- if (!chart.hasManualLayoutFields(layout)) {
3497
- return point;
3498
- }
3499
- const rect = chart.resolveManualLayoutRect(layout, frame, {
3500
- x: point.x,
3501
- y: point.y,
3502
- width: 1,
3503
- height: 1
3504
- });
3505
- return rect ? { x: rect.x, y: rect.y } : point;
3506
- }
3507
3495
  function chartFrameToViewOffset(frame, view) {
3508
3496
  return { x: (frame.width - view.svgWidth) / 2, y: (frame.height - view.svgHeight) / 2 };
3509
3497
  }
@@ -3604,11 +3592,11 @@ function resolveMarkerLabelAnchor(position, point, offset = 7) {
3604
3592
  }
3605
3593
  }
3606
3594
  function resolveBarLabelPlacement(chartData, series, pointIndex, rect, value, orientation, frame, defaultPosition) {
3607
- const point = findPointLabel(series, pointIndex), position = point?.position ?? series.dataLabelOptions?.position ?? chartData.style?.dataLabels?.position ?? defaultPosition, anchor = resolveBarLabelAnchor(position, rect, value, orientation), shifted = applyLabelManualLayout(point?.layout, frame, anchor);
3595
+ const point = findPointLabel(series, pointIndex), position = point?.position ?? series.dataLabelOptions?.position ?? chartData.style?.dataLabels?.position ?? defaultPosition, anchor = resolveBarLabelAnchor(position, rect, value, orientation), shifted = chart.applyLabelManualLayout(point?.layout, frame, anchor);
3608
3596
  return { ...anchor, x: shifted.x, y: shifted.y };
3609
3597
  }
3610
3598
  function resolveMarkerLabelPlacement(chartData, series, pointIndex, point, frame, offset = 7, defaultPosition) {
3611
- const override = findPointLabel(series, pointIndex), position = override?.position ?? series.dataLabelOptions?.position ?? chartData.style?.dataLabels?.position ?? defaultPosition, anchor = resolveMarkerLabelAnchor(position, point, offset), shifted = applyLabelManualLayout(override?.layout, frame, anchor);
3599
+ const override = findPointLabel(series, pointIndex), position = override?.position ?? series.dataLabelOptions?.position ?? chartData.style?.dataLabels?.position ?? defaultPosition, anchor = resolveMarkerLabelAnchor(position, point, offset), shifted = chart.applyLabelManualLayout(override?.layout, frame, anchor);
3612
3600
  return { ...anchor, x: shifted.x, y: shifted.y };
3613
3601
  }
3614
3602
 
@@ -3878,60 +3866,6 @@ function dataLabelFontOverride(style) {
3878
3866
  ...style.color ? { fill: style.color } : {}
3879
3867
  };
3880
3868
  }
3881
-
3882
- // src/pptx/render/chart-line-path.ts
3883
- function smoothLinePath(points) {
3884
- if (points.length === 0) {
3885
- return "";
3886
- }
3887
- if (points.length === 1) {
3888
- return `M${points[0].x.toFixed(2)},${points[0].y.toFixed(2)}`;
3889
- }
3890
- if (points.length === 2) {
3891
- return `M${points[0].x.toFixed(2)},${points[0].y.toFixed(2)} L${points[1].x.toFixed(2)},${points[1].y.toFixed(2)}`;
3892
- }
3893
- let d = `M${points[0].x.toFixed(2)},${points[0].y.toFixed(2)}`;
3894
- for (let i = 0; i < points.length - 1; i++) {
3895
- const [cp1, cp2, end] = smoothSegment(points, i);
3896
- d += ` C${cp1.x.toFixed(2)},${cp1.y.toFixed(2)} ${cp2.x.toFixed(2)},${cp2.y.toFixed(2)} ${end.x.toFixed(2)},${end.y.toFixed(2)}`;
3897
- }
3898
- return d;
3899
- }
3900
- function smoothSegment(points, i) {
3901
- const p0 = points[i - 1] ?? points[i];
3902
- const p1 = points[i];
3903
- const p2 = points[i + 1];
3904
- const p3 = points[i + 2] ?? p2;
3905
- return [
3906
- { x: p1.x + (p2.x - p0.x) / 6, y: p1.y + (p2.y - p0.y) / 6 },
3907
- { x: p2.x - (p3.x - p1.x) / 6, y: p2.y - (p3.y - p1.y) / 6 },
3908
- p2
3909
- ];
3910
- }
3911
- function sampleSmoothLine(points, stepsPerSegment = 16) {
3912
- if (points.length < 3) {
3913
- return [...points];
3914
- }
3915
- const out = [points[0]];
3916
- for (let i = 0; i < points.length - 1; i++) {
3917
- const start = points[i], [cp1, cp2, end] = smoothSegment(points, i);
3918
- for (let step = 1; step <= stepsPerSegment; step++) {
3919
- const t = step / stepsPerSegment, u = 1 - t, a = u * u * u, b = 3 * u * u * t, c = 3 * u * t * t, d = t * t * t;
3920
- out.push(
3921
- step === stepsPerSegment ? end : {
3922
- x: a * start.x + b * cp1.x + c * cp2.x + d * end.x,
3923
- y: a * start.y + b * cp1.y + c * cp2.y + d * end.y
3924
- }
3925
- );
3926
- }
3927
- }
3928
- return out;
3929
- }
3930
- function polylineRunsPath(runs) {
3931
- return runs.map(
3932
- (run) => run.map((p, i) => `${i === 0 ? "M" : "L"}${p.x.toFixed(2)},${p.y.toFixed(2)}`).join(" ")
3933
- ).join(" ");
3934
- }
3935
3869
  var DEFAULT_COLOR = "#64748b";
3936
3870
  function chartAxisTextStyle(axis, defaultFontSizePx = DEFAULT_CHART_TEXT_PX) {
3937
3871
  return {
@@ -4330,7 +4264,7 @@ function buildScatter(chartData, layout, range) {
4330
4264
  primitives.push(
4331
4265
  series.smooth ?? smoothStyle ? {
4332
4266
  kind: "path",
4333
- d: smoothLinePath(points),
4267
+ d: chart.smoothLinePath(points),
4334
4268
  stroke: c,
4335
4269
  strokeWidth: 2.4,
4336
4270
  fill: "none",
@@ -4487,12 +4421,12 @@ function visibleSpanCentre(y1, y2, band2) {
4487
4421
  function clippedSeriesLine(points, smooth, style, band2) {
4488
4422
  if (points.every((point) => insideBand(point, band2))) {
4489
4423
  return [
4490
- smooth ? { kind: "path", d: smoothLinePath(points), ...style } : { kind: "polyline", points: linePointsToSvgString(points), ...style }
4424
+ smooth ? { kind: "path", d: chart.smoothLinePath(points), ...style } : { kind: "polyline", points: linePointsToSvgString(points), ...style }
4491
4425
  ];
4492
4426
  }
4493
4427
  if (smooth) {
4494
- const runs = clipPolylineToBand(sampleSmoothLine(points), band2);
4495
- return runs.length > 0 ? [{ kind: "path", d: polylineRunsPath(runs), ...style }] : [];
4428
+ const runs = clipPolylineToBand(chart.sampleSmoothLine(points), band2);
4429
+ return runs.length > 0 ? [{ kind: "path", d: chart.polylineRunsPath(runs), ...style }] : [];
4496
4430
  }
4497
4431
  return clipPolylineToBand(points, band2).map((run) => ({
4498
4432
  kind: "polyline",
@@ -5396,8 +5330,6 @@ function buildLines(chartData, catCount, layout, primaryRange, secondaryRange, s
5396
5330
  }
5397
5331
  return { primitives: [...primitives, ...labelBoxes], dataLabels };
5398
5332
  }
5399
-
5400
- // src/pptx/render/chart-data-table-metrics.ts
5401
5333
  function resolveDataTableMetrics(chartData) {
5402
5334
  const table = chartData.dataTable;
5403
5335
  if (!table) {
@@ -5405,10 +5337,11 @@ function resolveDataTableMetrics(chartData) {
5405
5337
  }
5406
5338
  const sizePt = resolveChartTextStyle(chartData, table.txPr)?.fontSize;
5407
5339
  const fontSize = sizePt !== void 0 ? chartFontPx(sizePt) : resolveChartStyleDefaults(chartData).bodyTextPx;
5408
- const rowH = Math.max(14, Math.round(fontSize * 1.45));
5409
- const longestName = chartData.series.reduce((m, s) => Math.max(m, (s.name ?? "").length), 0);
5410
- const keyW = table.showKeys === false ? 0 : Math.min(160, Math.max(40, longestName * fontSize * 0.55 + 24));
5411
- return { fontSize, rowH, keyW, height: rowH * (1 + chartData.series.length) };
5340
+ return chart.chartDataTableMetrics(
5341
+ fontSize,
5342
+ chartData.series.map((s) => s.name ?? ""),
5343
+ table.showKeys !== false
5344
+ );
5412
5345
  }
5413
5346
  function labelsBesideTable(chartData, axis) {
5414
5347
  return chartData.dataTable ? [] : axis.labels;
@@ -5494,14 +5427,14 @@ function computeDataTablePrimitives(chartData, layout, colorPalette) {
5494
5427
  out.push(line2(x, top, x, bottom));
5495
5428
  }
5496
5429
  });
5497
- if (showV && showK) {
5430
+ if (showV) {
5498
5431
  out.push(line2(layout.plotLeft, top, layout.plotLeft, bottom));
5499
5432
  }
5500
5433
  series.forEach((s, si) => {
5501
5434
  const rowTop = top + rowH * (si + 1);
5502
5435
  const cy = rowTop + rowH / 2;
5503
5436
  if (showH) {
5504
- out.push(line2(showK ? left : layout.plotLeft, rowTop, right, rowTop));
5437
+ out.push(line2(left, rowTop, right, rowTop));
5505
5438
  }
5506
5439
  if (showK) {
5507
5440
  const swatch = Math.max(6, Math.round(metrics.fontSize * 0.55));
@@ -5513,8 +5446,9 @@ function computeDataTablePrimitives(chartData, layout, colorPalette) {
5513
5446
  h: swatch,
5514
5447
  fill: seriesColor2(s, si, colorPalette)
5515
5448
  });
5516
- out.push(label(left + DATA_TABLE_PADDING + swatch + 3, cy, s.name, "start"));
5517
5449
  }
5450
+ const keyInset = showK ? Math.max(6, Math.round(metrics.fontSize * 0.55)) + 3 : 0;
5451
+ out.push(label(left + DATA_TABLE_PADDING + keyInset, cy, s.name, "start"));
5518
5452
  categories.forEach((_cat, ci) => {
5519
5453
  const val = s.values[ci];
5520
5454
  const x = layout.plotLeft + ci * cellW + cellW / 2;
@@ -5642,175 +5576,6 @@ function computeHelperLinePrimitives(chartData, layout, range, catCount, options
5642
5576
  ...computeHiLowLinePrimitives(chartData, layout, range, catCount, options)
5643
5577
  ];
5644
5578
  }
5645
-
5646
- // src/pptx/render/chart-date-format.ts
5647
- var MONTH_ABBR = [
5648
- "Jan",
5649
- "Feb",
5650
- "Mar",
5651
- "Apr",
5652
- "May",
5653
- "Jun",
5654
- "Jul",
5655
- "Aug",
5656
- "Sep",
5657
- "Oct",
5658
- "Nov",
5659
- "Dec"
5660
- ];
5661
- var MONTH_FULL = [
5662
- "January",
5663
- "February",
5664
- "March",
5665
- "April",
5666
- "May",
5667
- "June",
5668
- "July",
5669
- "August",
5670
- "September",
5671
- "October",
5672
- "November",
5673
- "December"
5674
- ];
5675
- var WEEKDAY_ABBR = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
5676
- var WEEKDAY_FULL = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
5677
- function scanDateFormatTokens(code) {
5678
- const tokens = [];
5679
- let i = 0;
5680
- while (i < code.length) {
5681
- const ch = code[i];
5682
- if (ch === '"') {
5683
- const close = code.indexOf('"', i + 1);
5684
- tokens.push({
5685
- kind: "literal",
5686
- text: close === -1 ? code.slice(i + 1) : code.slice(i + 1, close)
5687
- });
5688
- i = close === -1 ? code.length : close + 1;
5689
- continue;
5690
- }
5691
- if (ch === "\\") {
5692
- tokens.push({ kind: "literal", text: code[i + 1] ?? "" });
5693
- i += 2;
5694
- continue;
5695
- }
5696
- const rest = code.slice(i);
5697
- if (/^am\/pm/iu.test(rest)) {
5698
- tokens.push({ kind: "ampm", upper: ch === ch.toUpperCase(), short: false });
5699
- i += 5;
5700
- continue;
5701
- }
5702
- if (/^a\/p/iu.test(rest)) {
5703
- tokens.push({ kind: "ampm", upper: ch === ch.toUpperCase(), short: true });
5704
- i += 3;
5705
- continue;
5706
- }
5707
- if (/[ymdhs]/iu.test(ch)) {
5708
- let j = i + 1;
5709
- while (j < code.length && code[j].toLowerCase() === ch.toLowerCase()) {
5710
- j += 1;
5711
- }
5712
- tokens.push({
5713
- kind: "letters",
5714
- letter: ch.toLowerCase(),
5715
- count: j - i
5716
- });
5717
- i = j;
5718
- continue;
5719
- }
5720
- tokens.push({ kind: "literal", text: ch });
5721
- i += 1;
5722
- }
5723
- return tokens;
5724
- }
5725
- function findNonLiteral(tokens, index, step) {
5726
- for (let i = index + step; i >= 0 && i < tokens.length; i += step) {
5727
- if (tokens[i].kind !== "literal") {
5728
- return tokens[i];
5729
- }
5730
- }
5731
- return void 0;
5732
- }
5733
- function pad(n, width) {
5734
- return String(n).padStart(width, "0");
5735
- }
5736
- function renderDatePart(part, count, date, twelveHour) {
5737
- switch (part) {
5738
- case "year":
5739
- return count >= 4 ? pad(date.getUTCFullYear(), 4) : pad(date.getUTCFullYear() % 100, 2);
5740
- case "month":
5741
- if (count >= 4) {
5742
- return MONTH_FULL[date.getUTCMonth()] ?? "";
5743
- }
5744
- if (count === 3) {
5745
- return MONTH_ABBR[date.getUTCMonth()] ?? "";
5746
- }
5747
- return count >= 2 ? pad(date.getUTCMonth() + 1, 2) : String(date.getUTCMonth() + 1);
5748
- case "day":
5749
- if (count >= 4) {
5750
- return WEEKDAY_FULL[date.getUTCDay()] ?? "";
5751
- }
5752
- if (count === 3) {
5753
- return WEEKDAY_ABBR[date.getUTCDay()] ?? "";
5754
- }
5755
- return count >= 2 ? pad(date.getUTCDate(), 2) : String(date.getUTCDate());
5756
- case "hour": {
5757
- const h24 = date.getUTCHours();
5758
- const h = twelveHour ? h24 % 12 === 0 ? 12 : h24 % 12 : h24;
5759
- return count >= 2 ? pad(h, 2) : String(h);
5760
- }
5761
- case "minute":
5762
- return count >= 2 ? pad(date.getUTCMinutes(), 2) : String(date.getUTCMinutes());
5763
- case "second":
5764
- return count >= 2 ? pad(date.getUTCSeconds(), 2) : String(date.getUTCSeconds());
5765
- }
5766
- }
5767
- function renderExcelDateFormat(date, code) {
5768
- const tokens = scanDateFormatTokens(code);
5769
- const hasAmPm = tokens.some((t) => t.kind === "ampm");
5770
- let out = "";
5771
- for (const [index, token] of tokens.entries()) {
5772
- if (token.kind === "literal") {
5773
- out += token.text;
5774
- continue;
5775
- }
5776
- if (token.kind === "ampm") {
5777
- const hour = date.getUTCHours(), text = token.short ? hour < 12 ? "A" : "P" : hour < 12 ? "AM" : "PM";
5778
- out += token.upper ? text : text.toLowerCase();
5779
- continue;
5780
- }
5781
- if (token.letter === "m") {
5782
- const prev = findNonLiteral(tokens, index, -1), next = findNonLiteral(tokens, index, 1), isMinute = prev?.kind === "letters" && prev.letter === "h" || next?.kind === "letters" && next.letter === "s";
5783
- out += renderDatePart(isMinute ? "minute" : "month", token.count, date, hasAmPm);
5784
- continue;
5785
- }
5786
- const part = { y: "year", d: "day", h: "hour", s: "second" };
5787
- out += renderDatePart(part[token.letter], token.count, date, hasAmPm);
5788
- }
5789
- return out;
5790
- }
5791
- function formatDate(date, unit, format) {
5792
- if (format && /[ymdhs]/iu.test(format)) {
5793
- const rendered = renderExcelDateFormat(date, format);
5794
- if (rendered.length > 0) {
5795
- return rendered;
5796
- }
5797
- }
5798
- const month = date.toLocaleString("en-US", { month: "short", timeZone: "UTC" }), year = String(date.getUTCFullYear()), day = String(date.getUTCDate());
5799
- if (unit === "years") {
5800
- return year;
5801
- }
5802
- if (unit === "months") {
5803
- return `${month} ${year}`;
5804
- }
5805
- return `${day} ${month}`;
5806
- }
5807
-
5808
- // src/pptx/render/chart-date-axis.ts
5809
- var DAY_MS = 864e5;
5810
- function excelSerialToDate(serial5, date1904 = false) {
5811
- const epoch2 = date1904 ? Date.UTC(1904, 0, 1) : Date.UTC(1899, 11, serial5 < 60 ? 31 : 30);
5812
- return new Date(epoch2 + serial5 * DAY_MS);
5813
- }
5814
5579
  function primaryDateAxis(chartData) {
5815
5580
  return chartData.axes?.find((axis) => axis.axisType === "dateAx" && axis.axPos !== "t") ?? chartData.axes?.find((axis) => axis.axisType === "dateAx");
5816
5581
  }
@@ -5818,17 +5583,6 @@ function serialToX(serial5, min, max, layout) {
5818
5583
  const ratio = max === min ? 0.5 : (serial5 - min) / (max - min);
5819
5584
  return layout.plotLeft + ratio * layout.plotWidth;
5820
5585
  }
5821
- function addUnit(date, amount, unit) {
5822
- const next = new Date(date);
5823
- if (unit === "days") {
5824
- next.setUTCDate(next.getUTCDate() + amount);
5825
- } else if (unit === "months") {
5826
- next.setUTCMonth(next.getUTCMonth() + amount);
5827
- } else {
5828
- next.setUTCFullYear(next.getUTCFullYear() + amount);
5829
- }
5830
- return next;
5831
- }
5832
5586
  function tickLine2(x, y, axis, minor) {
5833
5587
  const placement = minor ? axis.minorTickMark : axis.majorTickMark;
5834
5588
  if (!placement || placement === "none" || isNoLine(axis.spPr)) {
@@ -5848,15 +5602,6 @@ function tickLine2(x, y, axis, minor) {
5848
5602
  ...chartLineStyle(axis.spPr)
5849
5603
  };
5850
5604
  }
5851
- function calendarTicks(min, max, date1904, unit, step) {
5852
- const result = [];
5853
- let date = excelSerialToDate(min, date1904);
5854
- for (let guard = 0; guard < 1e3 && date.getTime() <= excelSerialToDate(max, date1904).getTime(); guard++) {
5855
- result.push(min + (date.getTime() - excelSerialToDate(min, date1904).getTime()) / DAY_MS);
5856
- date = addUnit(date, step, unit);
5857
- }
5858
- return result;
5859
- }
5860
5605
  function buildDateAxisPlan(chartData, layout, selectedAxis, axisY) {
5861
5606
  const dates = chartData.dateCategories;
5862
5607
  const axis = selectedAxis ?? primaryDateAxis(chartData);
@@ -5878,7 +5623,7 @@ function buildDateAxisPlan(chartData, layout, selectedAxis, axisY) {
5878
5623
  return axis.orientation === "maxMin" ? layout.plotLeft + layout.plotWidth - (x - layout.plotLeft) : x;
5879
5624
  });
5880
5625
  const unit = axis.majorTimeUnit ?? axis.baseTimeUnit ?? "days";
5881
- const ticks = calendarTicks(
5626
+ const ticks = chart.calendarTicks(
5882
5627
  min,
5883
5628
  max,
5884
5629
  dates.date1904 ?? false,
@@ -5903,8 +5648,8 @@ function buildDateAxisPlan(chartData, layout, selectedAxis, axisY) {
5903
5648
  kind: "text",
5904
5649
  x,
5905
5650
  y: labelsAbove ? labelY - offset : labelY + offset,
5906
- text: formatDate(
5907
- excelSerialToDate(serial5, dates.date1904),
5651
+ text: chart.formatDate(
5652
+ chart.excelSerialToDate(serial5, dates.date1904),
5908
5653
  unit,
5909
5654
  axis.numFmt?.formatCode ?? dates.formatCode
5910
5655
  ),
@@ -5937,7 +5682,7 @@ function buildDateAxisPlan(chartData, layout, selectedAxis, axisY) {
5937
5682
  }
5938
5683
  if (!axis.deleted && axis.minorTickMark && axis.minorTickMark !== "none") {
5939
5684
  const minorUnit = axis.minorTimeUnit ?? axis.baseTimeUnit ?? unit;
5940
- for (const serial5 of calendarTicks(
5685
+ for (const serial5 of chart.calendarTicks(
5941
5686
  min,
5942
5687
  max,
5943
5688
  dates.date1904 ?? false,
@@ -7361,20 +7106,14 @@ function computeBoxWhiskerGeometry(chartData, rawCategories, layout, range, colo
7361
7106
  const observations = rows.map((row) => ({ row, value: series.values[row] })).filter((item) => item.value !== void 0);
7362
7107
  const values = observations.map((item) => item.value);
7363
7108
  const options = series.boxWhiskerOptions;
7364
- const stats = chart.computeBoxStats(values, options?.quartileMethod ?? "exclusive");
7365
- if (!stats) {
7366
- return;
7367
- }
7368
- const iqr = stats.q3 - stats.q1;
7369
- const lowerFence = stats.q1 - 1.5 * iqr;
7370
- const upperFence = stats.q3 + 1.5 * iqr;
7371
- const inlierValues = values.filter(
7372
- (value) => !options || value >= lowerFence && value <= upperFence
7109
+ const distribution = chart.boxWhiskerDistribution(
7110
+ values,
7111
+ options?.quartileMethod ?? "exclusive",
7112
+ options !== void 0
7373
7113
  );
7374
- const whiskerMin = inlierValues.length > 0 ? Math.min(...inlierValues) : stats.min;
7375
- const whiskerMax = inlierValues.length > 0 ? Math.max(...inlierValues) : stats.max;
7114
+ if (!distribution) return;
7115
+ const { stats, whiskerMin, whiskerMax, mean } = distribution;
7376
7116
  const boxX = layout.plotLeft + groupWidth * categoryIndex + slotWidth * seriesIndex + (slotWidth - boxW) / 2;
7377
- const mean = values.reduce((sum, value) => sum + value, 0) / values.length;
7378
7117
  output.push({
7379
7118
  stats,
7380
7119
  boxX,
@@ -7465,11 +7204,8 @@ function whiskerPrimitives(geometry) {
7465
7204
  }
7466
7205
  function optionPrimitives(geometry) {
7467
7206
  const options = geometry.options;
7468
- if (!options) {
7469
- return [];
7470
- }
7471
7207
  const output = [];
7472
- if (options.showMeanLine) {
7208
+ if (options?.showMeanLine) {
7473
7209
  output.push({
7474
7210
  kind: "line",
7475
7211
  x1: geometry.boxX,
@@ -7480,17 +7216,17 @@ function optionPrimitives(geometry) {
7480
7216
  strokeWidth: 1.5
7481
7217
  });
7482
7218
  }
7483
- if (options.showMeanMarker) {
7219
+ if (options?.showMeanMarker !== false) {
7484
7220
  output.push({
7485
- kind: "circle",
7486
- cx: geometry.xMid,
7487
- cy: geometry.yMean,
7488
- r: 3,
7489
- fill: "#0f766e"
7221
+ kind: "path",
7222
+ d: chart.boxMeanMarkerPath(geometry.xMid, geometry.yMean),
7223
+ fill: "none",
7224
+ stroke: "#0f766e",
7225
+ strokeWidth: 1.5
7490
7226
  });
7491
7227
  }
7492
7228
  for (const point of geometry.points) {
7493
- if (point.outlier && !options.showOutlierPoints || !point.outlier && !options.showInnerPoints) {
7229
+ if (point.outlier && !options?.showOutlierPoints || !point.outlier && !options?.showInnerPoints) {
7494
7230
  continue;
7495
7231
  }
7496
7232
  output.push({
@@ -7871,15 +7607,17 @@ function computeFunnelSegments(values, plotLeft, plotTop, plotWidth, plotHeight,
7871
7607
  if (count === 0) {
7872
7608
  return [];
7873
7609
  }
7874
- const maxVal = Math.max(...values.map((v) => Math.abs(v)), 1);
7875
- const segH = plotHeight / Math.max(count, 1);
7876
- const centerX = plotLeft + plotWidth / 2;
7877
7610
  const fill = seriesColorOverride ?? paletteColor2(0, colorPalette);
7878
7611
  const out = [];
7879
- for (let i = 0; i < count; i++) {
7612
+ for (const bar of chart.computeFunnelGeometry(values, {
7613
+ x: plotLeft,
7614
+ y: plotTop,
7615
+ width: plotWidth,
7616
+ height: plotHeight
7617
+ })) {
7618
+ const i = bar.index;
7880
7619
  const val = values[i];
7881
- const w = Math.abs(val) / maxVal * plotWidth;
7882
- const y = plotTop + i * segH;
7620
+ const w = bar.width, y = bar.y, segH = bar.height, centerX = bar.center;
7883
7621
  const labelY = y + segH / 2 + 4;
7884
7622
  const d = [
7885
7623
  `M ${centerX - w / 2} ${y}`,
@@ -7930,11 +7668,20 @@ function buildFunnelViewModel(element, chartData, categoryLabels) {
7930
7668
  }
7931
7669
  const funnelSeries = chartData.series[0];
7932
7670
  segments.forEach((seg, i) => {
7671
+ if (!funnelSeries || !funnelSeries.dataLabelOptions && !chartData.style?.dataLabels && !funnelSeries.dataLabels?.some((label2) => label2.idx === i))
7672
+ return;
7673
+ const label = buildDataLabelText({
7674
+ chartData,
7675
+ series: funnelSeries,
7676
+ pointIndex: i,
7677
+ value: values[i]
7678
+ });
7679
+ if (!label) return;
7933
7680
  dataLabels.push({
7934
7681
  kind: "text",
7935
7682
  x: seg.labelX,
7936
7683
  y: seg.labelY,
7937
- text: seg.labelText,
7684
+ text: label.text,
7938
7685
  fontSize: seg.fontSize,
7939
7686
  fill: "#ffffff",
7940
7687
  textAnchor: "middle",
@@ -7962,7 +7709,7 @@ function buildFunnelViewModel(element, chartData, categoryLabels) {
7962
7709
  categoryLabels: categoryAxisLabels,
7963
7710
  primitives,
7964
7711
  dataLabels,
7965
- // Funnel does not draw a separate legend swatch list (labels are inline).
7712
+ // The PPTX host keeps its existing funnel legend policy.
7966
7713
  legend: [],
7967
7714
  legendX: layout.svgWidth / 2,
7968
7715
  legendY: layout.svgHeight - 8,
@@ -9138,7 +8885,7 @@ function applyManualDrag(point, pointIndex, params) {
9138
8885
  const layout = layoutFor(pointIndex);
9139
8886
  const viewOffset = chartFrameToViewOffset(frame, { svgWidth, svgHeight });
9140
8887
  const framePoint = { x: point.x + viewOffset.x, y: point.y + viewOffset.y };
9141
- const shifted = applyLabelManualLayout(layout, frame, framePoint);
8888
+ const shifted = chart.applyLabelManualLayout(layout, frame, framePoint);
9142
8889
  return { x: shifted.x - viewOffset.x, y: shifted.y - viewOffset.y };
9143
8890
  }
9144
8891
  function leaderLine2(slice, cx, cy, outerR, to, style) {
@@ -9535,8 +9282,6 @@ function buildPieViewModel(element, chartData, categoryLabels, isDoughnut) {
9535
9282
  legendAnchor
9536
9283
  };
9537
9284
  }
9538
-
9539
- // src/pptx/render/chart-view-model-layout.ts
9540
9285
  function categoryAxisBand(chartData) {
9541
9286
  const axis = chartData.axes?.find(
9542
9287
  (candidate) => candidate.axisType === "catAx" || candidate.axisType === "dateAx"
@@ -9585,20 +9330,22 @@ function computePlotLayout(elementWidth, elementHeight, chartData, hasAxes, opti
9585
9330
  plotLeft = Math.max(plotLeft, 8 + tableMetrics.keyW);
9586
9331
  }
9587
9332
  const autoPlotHeight = Math.max(plotBottom - plotTop, 1);
9588
- const plotLayout = manualLayoutOf(chartData, "plotArea"), manual = chart.resolveManualLayoutRect(
9333
+ const plotLayout = manualLayoutOf(chartData, "plotArea"), manual = chart.resolveManualPlotRect(
9589
9334
  plotLayout,
9590
9335
  { width: svgWidth, height: svgHeight },
9591
- { x: plotLeft, y: plotTop, width: plotRight - plotLeft, height: plotBottom - plotTop }
9336
+ { x: plotLeft, y: plotTop, width: plotRight - plotLeft, height: plotBottom - plotTop },
9337
+ {
9338
+ left: hasAxes ? leftAxisBand(options?.leftCategoryLabelWidth) : 0,
9339
+ top: 0,
9340
+ right: 0,
9341
+ bottom: hasAxes ? categoryAxisBand(chartData) - 8 : 0
9342
+ }
9592
9343
  );
9593
9344
  if (plotLayout && manual) {
9594
9345
  plotLeft = manual.x;
9595
9346
  plotTop = manual.y;
9596
9347
  plotRight = manual.x + manual.width;
9597
9348
  plotBottom = manual.y + manual.height;
9598
- if (hasAxes && plotLayout.layoutTarget !== "inner") {
9599
- plotLeft += leftAxisBand(options?.leftCategoryLabelWidth);
9600
- plotBottom -= categoryAxisBand(chartData) - 8;
9601
- }
9602
9349
  }
9603
9350
  const plotWidth = Math.max(plotRight - plotLeft, 1), plotHeight = Math.max(plotBottom - plotTop, 1);
9604
9351
  return {
@@ -9707,7 +9454,7 @@ function buildRadarViewModel(element, chartData, categoryLabels) {
9707
9454
  y: clamp2(p.y + out * Math.sin(angle), fontSize, frame.height - fontSize)
9708
9455
  };
9709
9456
  anchor = {
9710
- ...applyLabelManualLayout(findPointLabel(series, vi)?.layout, frame, auto),
9457
+ ...chart.applyLabelManualLayout(findPointLabel(series, vi)?.layout, frame, auto),
9711
9458
  textAnchor: "middle",
9712
9459
  dominantBaseline: "central"
9713
9460
  };
@@ -10947,7 +10694,7 @@ function computeTrendlinePrimitives(chartData, catCount, layout, range, mode = "
10947
10694
  }
10948
10695
  if (labelLines.length > 0) {
10949
10696
  const last = points[points.length - 1];
10950
- const anchor = applyLabelManualLayout(
10697
+ const anchor = chart.applyLabelManualLayout(
10951
10698
  tl.label?.layout,
10952
10699
  { width: layout.svgWidth, height: layout.svgHeight },
10953
10700
  { x: last.x, y: last.y - 6 }
@@ -10977,6 +10724,10 @@ Object.defineProperty(exports, "DEFAULT_CHART_PALETTE", {
10977
10724
  enumerable: true,
10978
10725
  get: function () { return chart.DEFAULT_CHART_PALETTE; }
10979
10726
  });
10727
+ Object.defineProperty(exports, "applyLabelManualLayout", {
10728
+ enumerable: true,
10729
+ get: function () { return chart.applyLabelManualLayout; }
10730
+ });
10980
10731
  Object.defineProperty(exports, "computeBoxStats", {
10981
10732
  enumerable: true,
10982
10733
  get: function () { return chart.computeBoxStats; }
@@ -11128,7 +10879,6 @@ exports.TEXT_ORIENTATION_IDENTITY = TEXT_ORIENTATION_IDENTITY;
11128
10879
  exports.ZERO_LINE_COLOR = ZERO_LINE_COLOR;
11129
10880
  exports.adjustFillForMode = adjustFillForMode;
11130
10881
  exports.applyDataPointPictureFills = applyDataPointPictureFills;
11131
- exports.applyLabelManualLayout = applyLabelManualLayout;
11132
10882
  exports.applyLegendEntryOverrides = applyLegendEntryOverrides;
11133
10883
  exports.applyParetoConversion = applyParetoConversion;
11134
10884
  exports.axisShowsMajorGridlines = axisShowsMajorGridlines;
@@ -1,4 +1,4 @@
1
- // src/pptx/render/custom-fonts.ts
1
+ // src/fonts/custom-fonts.ts
2
2
  var CUSTOM_FONT_EXTENSIONS = [".ttf", ".otf", ".woff", ".woff2"];
3
3
  var CUSTOM_FONT_ACCEPT = [
4
4
  ...CUSTOM_FONT_EXTENSIONS,
@@ -90,7 +90,30 @@ async function registerCustomFont(file, target) {
90
90
  });
91
91
  await face.load();
92
92
  fontSet.add(face);
93
- return { family: descriptor.family, descriptor };
93
+ return { family: descriptor.family, descriptor, dispose: () => void fontSet.delete(face) };
94
+ }
95
+ function createFontFaceScope(target) {
96
+ const registrations = /* @__PURE__ */ new Set();
97
+ let disposed = false;
98
+ return {
99
+ async register(file) {
100
+ if (disposed) return null;
101
+ const registration = await registerCustomFont(file, target);
102
+ if (!registration) return null;
103
+ if (disposed) {
104
+ registration.dispose();
105
+ return null;
106
+ }
107
+ registrations.add(registration);
108
+ return registration;
109
+ },
110
+ dispose() {
111
+ if (disposed) return;
112
+ disposed = true;
113
+ for (const registration of registrations) registration.dispose();
114
+ registrations.clear();
115
+ }
116
+ };
94
117
  }
95
118
 
96
- export { CUSTOM_FONT_ACCEPT, CUSTOM_FONT_EXTENSIONS, deriveCustomFontDescriptor, registerCustomFont };
119
+ export { CUSTOM_FONT_ACCEPT, CUSTOM_FONT_EXTENSIONS, createFontFaceScope, deriveCustomFontDescriptor, registerCustomFont };