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
@@ -1,32 +1,14 @@
1
1
  'use strict';
2
2
 
3
+ var opc = require('ooxml-core/opc');
4
+
3
5
  // src/pptx/render/hyperlink-security.ts
4
- var BLOCKED_PROTOCOLS = /* @__PURE__ */ new Set([
5
- `${"javascript"}:`,
6
- "data:",
7
- "vbscript:",
8
- "mhtml:",
9
- `x-]${"javascript"}:`
10
- ]);
6
+ var PPTX_HYPERLINK_POLICY = { additionalOpenSchemes: ["ftp", "tel", "file"], openRelative: true };
11
7
  function isUrlSafe(url) {
12
- if (!url || typeof url !== "string") {
13
- return false;
14
- }
15
- const trimmed = url.trim();
16
- if (trimmed.length === 0) {
17
- return false;
18
- }
19
- const lower = trimmed.toLowerCase();
20
- const stripped = lower.replace(/[\s​]/gu, "").replace(/‌/gu, "").replace(/‍/gu, "").split(String.fromCharCode(0)).join("");
21
- for (const protocol of BLOCKED_PROTOCOLS) {
22
- if (stripped.startsWith(protocol)) {
23
- return false;
24
- }
25
- }
26
- return true;
8
+ return isPpactionUrl(url) || opc.isStorableHyperlinkHref(url, PPTX_HYPERLINK_POLICY);
27
9
  }
28
10
  function safeOpenUrl(url, target = "_blank") {
29
- if (!isUrlSafe(url)) {
11
+ if (isPpactionUrl(url) || !opc.isOpenableHyperlinkHref(url, PPTX_HYPERLINK_POLICY)) {
30
12
  if (typeof console !== "undefined") {
31
13
  console.warn(`[pptx-viewer] Blocked attempt to open unsafe URL: ${url.slice(0, 100)}`);
32
14
  }
@@ -77,7 +59,7 @@ function isPpactionUrl(url) {
77
59
  return url.toLowerCase().startsWith("ppaction://");
78
60
  }
79
61
  function resolveHyperlinkHref(url) {
80
- if (!url || isPpactionUrl(url) || !isUrlSafe(url)) {
62
+ if (!url || isPpactionUrl(url) || !opc.isOpenableHyperlinkHref(url, PPTX_HYPERLINK_POLICY)) {
81
63
  return void 0;
82
64
  }
83
65
  return url.trim();
@@ -1,5 +1,5 @@
1
1
  import { createChatHistoryStore } from './chunk-LVDF75JU.mjs';
2
- import { createControllerStore } from './chunk-WM5SW737.mjs';
2
+ import { createControllerStore } from './chunk-PM2SOLK3.mjs';
3
3
  import { updateTextSegmentStyle } from './chunk-PEDGPFLR.mjs';
4
4
  import { hasTextProperties, hasShapeProperties } from 'ooxml-core/pptx';
5
5
 
@@ -112,7 +112,7 @@ async function loadChart3DThree() {
112
112
 
113
113
  // src/pptx/three-view/scene-registry.ts
114
114
  var loaders = {
115
- chart: async () => (await import('./chart-3d-view-scene-ZUGA3DKM.mjs')).mountChart3DView,
115
+ chart: async () => (await import('./chart-3d-view-scene-HNL4NWJT.mjs')).mountChart3DView,
116
116
  smartart: async () => (await import('./view-scene-GHBN7QMR.mjs')).mountSmartArt3DView
117
117
  };
118
118
  async function loadThreeViewScene(kind) {
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkA5MANNJR_cjs = require('./chunk-A5MANNJR.cjs');
4
- var chunkY6DO6SVT_cjs = require('./chunk-Y6DO6SVT.cjs');
4
+ var chunk3RIGT7H6_cjs = require('./chunk-3RIGT7H6.cjs');
5
5
  var chunkPBZWDEXQ_cjs = require('./chunk-PBZWDEXQ.cjs');
6
6
  var pptx = require('ooxml-core/pptx');
7
7
 
@@ -353,7 +353,7 @@ var INITIAL_STATE = {
353
353
  changeBatch: null
354
354
  };
355
355
  function createPptxAiPanelController(deps) {
356
- const store = chunkY6DO6SVT_cjs.createControllerStore(INITIAL_STATE);
356
+ const store = chunk3RIGT7H6_cjs.createControllerStore(INITIAL_STATE);
357
357
  let toolFocus = null;
358
358
  let flashing = false;
359
359
  let flashTimer = null;
@@ -0,0 +1,79 @@
1
+ // src/pptx/render/controller/controller.ts
2
+ function createControllerStore(initial) {
3
+ let snapshot = initial;
4
+ const listeners = /* @__PURE__ */ new Set();
5
+ const set = (next) => {
6
+ if (Object.is(next, snapshot)) {
7
+ return;
8
+ }
9
+ snapshot = next;
10
+ for (const listener of [...listeners]) {
11
+ listener();
12
+ }
13
+ };
14
+ return {
15
+ getSnapshot: () => snapshot,
16
+ subscribe(listener) {
17
+ listeners.add(listener);
18
+ return () => {
19
+ listeners.delete(listener);
20
+ };
21
+ },
22
+ set,
23
+ update: (recipe) => set(recipe(snapshot))
24
+ };
25
+ }
26
+
27
+ // src/pptx/render/controller/ai-assistant.ts
28
+ var HANDLE_TAG = "PptxAiAssistant";
29
+ var handlePrototype = Object.freeze(
30
+ Object.create(null, { [Symbol.toStringTag]: { value: HANDLE_TAG } })
31
+ );
32
+ var warned = /* @__PURE__ */ new WeakSet();
33
+ function createAiAssistantRegistry({
34
+ owner
35
+ }) {
36
+ const assistants = /* @__PURE__ */ new WeakMap();
37
+ return Object.freeze({
38
+ register(config, panel) {
39
+ const handle = Object.freeze(Object.create(handlePrototype));
40
+ assistants.set(handle, Object.freeze({ config, panel }));
41
+ return handle;
42
+ },
43
+ resolve(value, options = {}) {
44
+ if (value === void 0 || value === null) {
45
+ return void 0;
46
+ }
47
+ const entry = assistants.get(value);
48
+ if (entry) {
49
+ return entry;
50
+ }
51
+ if (isHandleShaped(value) && (options.development ?? isDevelopment())) {
52
+ warnOnce(value, unreadableHandleMessage(owner), options.warn);
53
+ }
54
+ return { config: value, panel: void 0 };
55
+ }
56
+ });
57
+ }
58
+ function isHandleShaped(value) {
59
+ return typeof value === "object" && value !== null && Object.prototype.toString.call(value) === `[object ${HANDLE_TAG}]`;
60
+ }
61
+ function unreadableHandleMessage(owner) {
62
+ return `[pptx-viewer] The \`ai\` value is a createAiAssistant handle that ${owner}/ai did not create: it comes from another binding, or from another copy of the package (a second install, or the ESM and CommonJS builds mixed). ${owner} treats it as a plain config, and the assistant shows its error state. Create the handle with createAiAssistant from ${owner}/ai, loaded from the same copy of the package as the viewer.`;
63
+ }
64
+ function warnOnce(value, message, warn) {
65
+ if (warned.has(value)) {
66
+ return;
67
+ }
68
+ warned.add(value);
69
+ (warn ?? console.warn)(message);
70
+ }
71
+ function isDevelopment() {
72
+ try {
73
+ return process.env.NODE_ENV !== "production";
74
+ } catch {
75
+ return false;
76
+ }
77
+ }
78
+
79
+ export { createAiAssistantRegistry, createControllerStore };
@@ -1,11 +1,11 @@
1
1
  import { COMMON_FONT_FAMILIES } from './chunk-SMSCEGAE.mjs';
2
2
 
3
- // src/pptx/render/font-catalog.ts
3
+ // src/fonts/catalog.ts
4
4
  var GROUP_LABEL_KEYS = {
5
- theme: "pptx.font.group.theme",
6
- embedded: "pptx.font.group.embedded",
7
- custom: "pptx.font.group.custom",
8
- all: "pptx.font.group.all"
5
+ theme: "theme",
6
+ embedded: "embedded",
7
+ custom: "custom",
8
+ all: "all"
9
9
  };
10
10
  function buildFontCatalog(input = {}) {
11
11
  const themeEntries = [];
@@ -32,19 +32,16 @@ function buildFontCatalog(input = {}) {
32
32
  }
33
33
  const embedded = collect(input.embeddedFonts, claim);
34
34
  const custom = collect(input.customFonts, claim);
35
- const all = collect(input.allFonts ?? COMMON_FONT_FAMILIES, claim);
35
+ const all = collect(input.allFonts, claim);
36
36
  return [
37
37
  { id: "theme", entries: themeEntries },
38
38
  { id: "embedded", entries: embedded },
39
39
  { id: "custom", entries: custom },
40
40
  { id: "all", entries: all }
41
- ].filter((group) => group.entries.length > 0).map((group) => ({ ...group, labelKey: GROUP_LABEL_KEYS[group.id] }));
42
- }
43
- function resolveDefaultFontFamily(placeholderType, themeFonts, fallback = "Segoe UI") {
44
- const normalized = placeholderType?.trim().toLowerCase();
45
- const isHeading = normalized === "title" || normalized === "ctrtitle";
46
- const preferred = isHeading ? themeFonts?.heading : themeFonts?.body;
47
- return preferred?.trim() || themeFonts?.body?.trim() || themeFonts?.heading?.trim() || fallback;
41
+ ].filter((group) => group.entries.length > 0).map((group) => ({
42
+ ...group,
43
+ labelKey: input.labelKeys?.[group.id] ?? GROUP_LABEL_KEYS[group.id]
44
+ }));
48
45
  }
49
46
  function collect(families, claim) {
50
47
  const entries = [];
@@ -57,4 +54,24 @@ function collect(families, claim) {
57
54
  return entries;
58
55
  }
59
56
 
60
- export { buildFontCatalog, resolveDefaultFontFamily };
57
+ // src/pptx/render/font-catalog.ts
58
+ function buildFontCatalog2(input = {}) {
59
+ return buildFontCatalog({
60
+ ...input,
61
+ allFonts: input.allFonts ?? COMMON_FONT_FAMILIES,
62
+ labelKeys: {
63
+ theme: "pptx.font.group.theme",
64
+ embedded: "pptx.font.group.embedded",
65
+ custom: "pptx.font.group.custom",
66
+ all: "pptx.font.group.all"
67
+ }
68
+ });
69
+ }
70
+ function resolveDefaultFontFamily(placeholderType, themeFonts, fallback = "Segoe UI") {
71
+ const normalized = placeholderType?.trim().toLowerCase();
72
+ const isHeading = normalized === "title" || normalized === "ctrtitle";
73
+ const preferred = isHeading ? themeFonts?.heading : themeFonts?.body;
74
+ return preferred?.trim() || themeFonts?.body?.trim() || themeFonts?.heading?.trim() || fallback;
75
+ }
76
+
77
+ export { buildFontCatalog2 as buildFontCatalog, resolveDefaultFontFamily };