pptx-react-viewer 3.2.0 → 3.4.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 (166) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/dist/{AiChatPanel-TKBVSYD2.js → AiChatPanel-3Q4STA5E.js} +29 -28
  3. package/dist/AiChatPanel-3Q4STA5E.js.br +0 -0
  4. package/dist/AiChatPanel-3Q4STA5E.js.gz +0 -0
  5. package/dist/{AiChatPanel-C3E7NLX3.mjs → AiChatPanel-NQZBZIRM.mjs} +9 -8
  6. package/dist/AiChatPanel-NQZBZIRM.mjs.br +0 -0
  7. package/dist/AiChatPanel-NQZBZIRM.mjs.gz +0 -0
  8. package/dist/{Area3DChartScene-7YCFWEGX.mjs → Area3DChartScene-7PARQDOZ.mjs} +1 -1
  9. package/dist/Area3DChartScene-7PARQDOZ.mjs.br +3 -0
  10. package/dist/Area3DChartScene-7PARQDOZ.mjs.gz +0 -0
  11. package/dist/{Area3DChartScene-3A3CXKN3.js → Area3DChartScene-THLG74CM.js} +2 -2
  12. package/dist/Area3DChartScene-THLG74CM.js.br +0 -0
  13. package/dist/Area3DChartScene-THLG74CM.js.gz +0 -0
  14. package/dist/{Bar3DChartScene-BDUENAWJ.js → Bar3DChartScene-OLZ2V56I.js} +2 -2
  15. package/dist/Bar3DChartScene-OLZ2V56I.js.br +2 -0
  16. package/dist/Bar3DChartScene-OLZ2V56I.js.gz +0 -0
  17. package/dist/{Bar3DChartScene-7CNSJ35X.mjs → Bar3DChartScene-QUU6RUXM.mjs} +1 -1
  18. package/dist/Bar3DChartScene-QUU6RUXM.mjs.br +0 -0
  19. package/dist/Bar3DChartScene-QUU6RUXM.mjs.gz +0 -0
  20. package/dist/{Line3DChartScene-R352CZ5U.js → Line3DChartScene-2VZS52IB.js} +2 -2
  21. package/dist/Line3DChartScene-2VZS52IB.js.br +0 -0
  22. package/dist/Line3DChartScene-2VZS52IB.js.gz +0 -0
  23. package/dist/{Line3DChartScene-SMTHK6MD.mjs → Line3DChartScene-D77ORA4K.mjs} +1 -1
  24. package/dist/Line3DChartScene-D77ORA4K.mjs.br +3 -0
  25. package/dist/Line3DChartScene-D77ORA4K.mjs.gz +0 -0
  26. package/dist/{Model3DScene-Y4SGFQYW.js → Model3DScene-3WCALTXO.js} +2 -2
  27. package/dist/Model3DScene-3WCALTXO.js.br +0 -0
  28. package/dist/Model3DScene-3WCALTXO.js.gz +0 -0
  29. package/dist/{Model3DScene-AUVJXXPV.mjs → Model3DScene-ZEGWNILH.mjs} +1 -1
  30. package/dist/Model3DScene-ZEGWNILH.mjs.br +0 -0
  31. package/dist/Model3DScene-ZEGWNILH.mjs.gz +0 -0
  32. package/dist/{PieChart3DScene-TK2VT4RS.js → PieChart3DScene-7C3ACGKN.js} +2 -2
  33. package/dist/PieChart3DScene-7C3ACGKN.js.br +0 -0
  34. package/dist/PieChart3DScene-7C3ACGKN.js.gz +0 -0
  35. package/dist/{PieChart3DScene-UD7GRH55.mjs → PieChart3DScene-DGD4PZVV.mjs} +1 -1
  36. package/dist/PieChart3DScene-DGD4PZVV.mjs.br +0 -0
  37. package/dist/PieChart3DScene-DGD4PZVV.mjs.gz +0 -0
  38. package/dist/PowerPointViewer-Cl6jBPNw.d.ts.map +1 -1
  39. package/dist/{SurfaceChart3DScene-TXY6UZSW.mjs → SurfaceChart3DScene-QGH3OLJV.mjs} +1 -1
  40. package/dist/SurfaceChart3DScene-QGH3OLJV.mjs.br +0 -0
  41. package/dist/SurfaceChart3DScene-QGH3OLJV.mjs.gz +0 -0
  42. package/dist/{SurfaceChart3DScene-ERFXZW2O.js → SurfaceChart3DScene-SJPQGGGE.js} +2 -2
  43. package/dist/SurfaceChart3DScene-SJPQGGGE.js.br +0 -0
  44. package/dist/SurfaceChart3DScene-SJPQGGGE.js.gz +0 -0
  45. package/dist/{chunk-RRAL4Y7V.js → chunk-7E6SM42A.js} +2604 -2024
  46. package/dist/chunk-7E6SM42A.js.br +0 -0
  47. package/dist/chunk-7E6SM42A.js.gz +0 -0
  48. package/dist/{chunk-G7UBIKAG.mjs → chunk-B7WAGQW4.mjs} +5383 -873
  49. package/dist/chunk-B7WAGQW4.mjs.br +0 -0
  50. package/dist/chunk-B7WAGQW4.mjs.gz +0 -0
  51. package/dist/{chunk-RX6FE24O.mjs → chunk-C4WTQIC6.mjs} +302 -61
  52. package/dist/chunk-C4WTQIC6.mjs.br +0 -0
  53. package/dist/chunk-C4WTQIC6.mjs.gz +0 -0
  54. package/dist/{chunk-Q52HT4EZ.js → chunk-KY6JQJXK.js} +307 -63
  55. package/dist/chunk-KY6JQJXK.js.br +0 -0
  56. package/dist/chunk-KY6JQJXK.js.gz +0 -0
  57. package/dist/{chunk-PPNXPEEZ.mjs → chunk-L5MRKDRM.mjs} +1514 -934
  58. package/dist/chunk-L5MRKDRM.mjs.br +0 -0
  59. package/dist/chunk-L5MRKDRM.mjs.gz +0 -0
  60. package/dist/{chunk-UHR7EYFM.mjs → chunk-MSUUPLQ7.mjs} +718 -435
  61. package/dist/chunk-MSUUPLQ7.mjs.br +0 -0
  62. package/dist/chunk-MSUUPLQ7.mjs.gz +0 -0
  63. package/dist/{chunk-FJDZ7AEE.js → chunk-PCW2KT7Z.js} +5446 -879
  64. package/dist/chunk-PCW2KT7Z.js.br +0 -0
  65. package/dist/chunk-PCW2KT7Z.js.gz +0 -0
  66. package/dist/{chunk-FMEEIS6L.mjs → chunk-SFMATKNJ.mjs} +13 -114
  67. package/dist/chunk-SFMATKNJ.mjs.br +0 -0
  68. package/dist/chunk-SFMATKNJ.mjs.gz +0 -0
  69. package/dist/{chunk-ARQGUUYU.js → chunk-TJNG5VEK.js} +1114 -826
  70. package/dist/chunk-TJNG5VEK.js.br +0 -0
  71. package/dist/chunk-TJNG5VEK.js.gz +0 -0
  72. package/dist/{chunk-ALO4ZOHQ.js → chunk-UNIJUD5C.js} +45 -1
  73. package/dist/chunk-UNIJUD5C.js.br +0 -0
  74. package/dist/chunk-UNIJUD5C.js.gz +0 -0
  75. package/dist/{chunk-B6UIVRFA.js → chunk-XBTHWXNO.js} +177 -279
  76. package/dist/chunk-XBTHWXNO.js.br +0 -0
  77. package/dist/chunk-XBTHWXNO.js.gz +0 -0
  78. package/dist/{chunk-RHSA5BW5.mjs → chunk-XWUMM2TX.mjs} +45 -1
  79. package/dist/chunk-XWUMM2TX.mjs.br +0 -0
  80. package/dist/chunk-XWUMM2TX.mjs.gz +0 -0
  81. package/dist/i18n.js +4 -4
  82. package/dist/i18n.js.br +0 -0
  83. package/dist/i18n.js.gz +0 -0
  84. package/dist/i18n.mjs +1 -1
  85. package/dist/i18n.mjs.br +0 -0
  86. package/dist/i18n.mjs.gz +0 -0
  87. package/dist/index.d.ts +7 -0
  88. package/dist/index.js +47 -47
  89. package/dist/index.js.br +0 -0
  90. package/dist/index.js.gz +0 -0
  91. package/dist/index.mjs +6 -6
  92. package/dist/index.mjs.br +0 -0
  93. package/dist/index.mjs.gz +0 -0
  94. package/dist/internals.d.ts +176 -5
  95. package/dist/internals.d.ts.map +1 -1
  96. package/dist/internals.js +79 -79
  97. package/dist/internals.js.br +0 -0
  98. package/dist/internals.js.gz +0 -0
  99. package/dist/internals.mjs +4 -4
  100. package/dist/internals.mjs.br +0 -0
  101. package/dist/internals.mjs.gz +0 -0
  102. package/dist/pptx-viewer.css +1 -1
  103. package/dist/pptx-viewer.css.br +0 -0
  104. package/dist/pptx-viewer.css.gz +0 -0
  105. package/dist/{useViewerBuildingBlocks-X1L8BjsQ.d.ts → useViewerBuildingBlocks-f6oNGKMX.d.ts} +8 -1
  106. package/dist/useViewerBuildingBlocks-f6oNGKMX.d.ts.map +1 -0
  107. package/dist/viewer/index.js +27 -27
  108. package/dist/viewer/index.js.br +0 -0
  109. package/dist/viewer/index.js.gz +0 -0
  110. package/dist/viewer/index.mjs +6 -6
  111. package/dist/viewer/index.mjs.br +0 -0
  112. package/dist/viewer/index.mjs.gz +0 -0
  113. package/package.json +1 -1
  114. package/dist/AiChatPanel-C3E7NLX3.mjs.br +0 -0
  115. package/dist/AiChatPanel-C3E7NLX3.mjs.gz +0 -0
  116. package/dist/AiChatPanel-TKBVSYD2.js.br +0 -0
  117. package/dist/AiChatPanel-TKBVSYD2.js.gz +0 -0
  118. package/dist/Area3DChartScene-3A3CXKN3.js.br +0 -0
  119. package/dist/Area3DChartScene-3A3CXKN3.js.gz +0 -0
  120. package/dist/Area3DChartScene-7YCFWEGX.mjs.br +0 -3
  121. package/dist/Area3DChartScene-7YCFWEGX.mjs.gz +0 -0
  122. package/dist/Bar3DChartScene-7CNSJ35X.mjs.br +0 -0
  123. package/dist/Bar3DChartScene-7CNSJ35X.mjs.gz +0 -0
  124. package/dist/Bar3DChartScene-BDUENAWJ.js.br +0 -0
  125. package/dist/Bar3DChartScene-BDUENAWJ.js.gz +0 -0
  126. package/dist/Line3DChartScene-R352CZ5U.js.br +0 -0
  127. package/dist/Line3DChartScene-R352CZ5U.js.gz +0 -0
  128. package/dist/Line3DChartScene-SMTHK6MD.mjs.br +0 -3
  129. package/dist/Line3DChartScene-SMTHK6MD.mjs.gz +0 -0
  130. package/dist/Model3DScene-AUVJXXPV.mjs.br +0 -0
  131. package/dist/Model3DScene-AUVJXXPV.mjs.gz +0 -0
  132. package/dist/Model3DScene-Y4SGFQYW.js.br +0 -0
  133. package/dist/Model3DScene-Y4SGFQYW.js.gz +0 -0
  134. package/dist/PieChart3DScene-TK2VT4RS.js.br +0 -0
  135. package/dist/PieChart3DScene-TK2VT4RS.js.gz +0 -0
  136. package/dist/PieChart3DScene-UD7GRH55.mjs.br +0 -0
  137. package/dist/PieChart3DScene-UD7GRH55.mjs.gz +0 -0
  138. package/dist/SurfaceChart3DScene-ERFXZW2O.js.br +0 -0
  139. package/dist/SurfaceChart3DScene-ERFXZW2O.js.gz +0 -0
  140. package/dist/SurfaceChart3DScene-TXY6UZSW.mjs.br +0 -0
  141. package/dist/SurfaceChart3DScene-TXY6UZSW.mjs.gz +0 -0
  142. package/dist/chunk-ALO4ZOHQ.js.br +0 -0
  143. package/dist/chunk-ALO4ZOHQ.js.gz +0 -0
  144. package/dist/chunk-ARQGUUYU.js.br +0 -0
  145. package/dist/chunk-ARQGUUYU.js.gz +0 -0
  146. package/dist/chunk-B6UIVRFA.js.br +0 -0
  147. package/dist/chunk-B6UIVRFA.js.gz +0 -0
  148. package/dist/chunk-FJDZ7AEE.js.br +0 -0
  149. package/dist/chunk-FJDZ7AEE.js.gz +0 -0
  150. package/dist/chunk-FMEEIS6L.mjs.br +0 -0
  151. package/dist/chunk-FMEEIS6L.mjs.gz +0 -0
  152. package/dist/chunk-G7UBIKAG.mjs.br +0 -0
  153. package/dist/chunk-G7UBIKAG.mjs.gz +0 -0
  154. package/dist/chunk-PPNXPEEZ.mjs.br +0 -0
  155. package/dist/chunk-PPNXPEEZ.mjs.gz +0 -0
  156. package/dist/chunk-Q52HT4EZ.js.br +0 -0
  157. package/dist/chunk-Q52HT4EZ.js.gz +0 -0
  158. package/dist/chunk-RHSA5BW5.mjs.br +0 -0
  159. package/dist/chunk-RHSA5BW5.mjs.gz +0 -0
  160. package/dist/chunk-RRAL4Y7V.js.br +0 -0
  161. package/dist/chunk-RRAL4Y7V.js.gz +0 -0
  162. package/dist/chunk-RX6FE24O.mjs.br +0 -0
  163. package/dist/chunk-RX6FE24O.mjs.gz +0 -0
  164. package/dist/chunk-UHR7EYFM.mjs.br +0 -0
  165. package/dist/chunk-UHR7EYFM.mjs.gz +0 -0
  166. package/dist/useViewerBuildingBlocks-X1L8BjsQ.d.ts.map +0 -1
Binary file
Binary file
@@ -1,4 +1,4 @@
1
- import { ThemePresets, PptxMarkdownConverter } from './chunk-G7UBIKAG.mjs';
1
+ import { ThemePresets, PptxMarkdownConverter, hasTextProperties, hasShapeProperties } from './chunk-B7WAGQW4.mjs';
2
2
  import { __export } from './chunk-XGB3TDIC.mjs';
3
3
  import * as mcp from 'pptx-viewer-mcp';
4
4
  import * as mcpSchemas from 'pptx-viewer-mcp/schemas';
@@ -16235,12 +16235,312 @@ function toRenderableParts(message) {
16235
16235
  }
16236
16236
  return out;
16237
16237
  }
16238
+ function isoOf(ms) {
16239
+ const n = Number.isFinite(ms) ? ms : 0;
16240
+ return new Date(n).toISOString();
16241
+ }
16242
+ function toLogChat(chat, detailed) {
16243
+ const messages = chat.messages.map((message) => {
16244
+ const parts = toRenderableParts(message);
16245
+ const textRuns = [];
16246
+ const toolCalls = [];
16247
+ for (const part of parts) {
16248
+ if (part.kind === "text") {
16249
+ textRuns.push(part.text);
16250
+ continue;
16251
+ }
16252
+ toolCalls.push({
16253
+ toolName: part.toolName,
16254
+ toolCallId: part.toolCallId,
16255
+ state: part.state,
16256
+ input: detailed ? part.input : void 0,
16257
+ output: detailed ? part.output : void 0,
16258
+ errorText: part.errorText
16259
+ });
16260
+ }
16261
+ return {
16262
+ role: message.role,
16263
+ text: textRuns.join("\n\n"),
16264
+ toolCalls
16265
+ };
16266
+ });
16267
+ return {
16268
+ id: chat.id,
16269
+ title: chat.title,
16270
+ deckId: chat.deckId,
16271
+ createdAt: chat.createdAt,
16272
+ updatedAt: chat.updatedAt,
16273
+ createdAtIso: isoOf(chat.createdAt),
16274
+ updatedAtIso: isoOf(chat.updatedAt),
16275
+ messageCount: chat.messages.length,
16276
+ messages
16277
+ };
16278
+ }
16279
+ function buildChatLogExport(chats, options) {
16280
+ const detailed = options?.detailed ?? true;
16281
+ const now = options?.now ?? Date.now();
16282
+ return {
16283
+ format: "pptx-ai-chat-log",
16284
+ version: 1,
16285
+ exportedAt: isoOf(now),
16286
+ detailed,
16287
+ chatCount: chats.length,
16288
+ chats: chats.map((chat) => toLogChat(chat, detailed))
16289
+ };
16290
+ }
16291
+ function toolCallLine(call, detailed) {
16292
+ const lines = [`- Tool \`${call.toolName}\` (${call.state})`];
16293
+ if (call.errorText) {
16294
+ lines.push(` - error: ${call.errorText}`);
16295
+ }
16296
+ if (detailed) {
16297
+ lines.push(" - input:");
16298
+ lines.push(" ```json");
16299
+ lines.push(JSON.stringify(call.input ?? null, null, 2));
16300
+ lines.push(" ```");
16301
+ lines.push(" - output:");
16302
+ lines.push(" ```json");
16303
+ lines.push(JSON.stringify(call.output ?? null, null, 2));
16304
+ lines.push(" ```");
16305
+ }
16306
+ return lines.join("\n");
16307
+ }
16308
+ function buildChatLogMarkdown(doc) {
16309
+ const out = [
16310
+ `# AI chat logs`,
16311
+ "",
16312
+ `Exported: ${doc.exportedAt}`,
16313
+ `Chats: ${doc.chatCount}`,
16314
+ ""
16315
+ ];
16316
+ for (const chat of doc.chats) {
16317
+ out.push(`## ${chat.title || chat.id}`);
16318
+ out.push("");
16319
+ out.push(`- id: ${chat.id}`);
16320
+ if (chat.deckId) {
16321
+ out.push(`- deck: ${chat.deckId}`);
16322
+ }
16323
+ out.push(`- created: ${chat.createdAtIso}`);
16324
+ out.push(`- updated: ${chat.updatedAtIso}`);
16325
+ out.push(`- messages: ${chat.messageCount}`);
16326
+ out.push("");
16327
+ for (const message of chat.messages) {
16328
+ out.push(`### ${message.role}`);
16329
+ out.push("");
16330
+ if (message.text) {
16331
+ out.push(message.text);
16332
+ out.push("");
16333
+ }
16334
+ for (const call of message.toolCalls) {
16335
+ out.push(toolCallLine(call, doc.detailed));
16336
+ out.push("");
16337
+ }
16338
+ }
16339
+ }
16340
+ return out.join("\n");
16341
+ }
16342
+ async function collectStoredChats(store = createChatHistoryStore()) {
16343
+ const summaries = await store.listChats();
16344
+ const chats = [];
16345
+ for (const summary of summaries) {
16346
+ const chat = await store.loadChat(summary.id);
16347
+ if (chat) {
16348
+ chats.push(chat);
16349
+ }
16350
+ }
16351
+ return chats;
16352
+ }
16353
+ function timestampSlug(now) {
16354
+ const d = new Date(now);
16355
+ const p = (n) => String(n).padStart(2, "0");
16356
+ return `${d.getFullYear()}${p(d.getMonth() + 1)}${p(d.getDate())}-${p(d.getHours())}${p(d.getMinutes())}${p(d.getSeconds())}`;
16357
+ }
16358
+ function exportAiChatLogs(chats, meta3, save) {
16359
+ if (chats.length === 0) {
16360
+ return 0;
16361
+ }
16362
+ const now = meta3?.now ?? Date.now();
16363
+ const doc = buildChatLogExport(chats, { detailed: meta3?.detailed ?? true, now });
16364
+ const slug = timestampSlug(now);
16365
+ const format = meta3?.format ?? "json";
16366
+ if (format === "markdown") {
16367
+ save(`pptx-ai-chats-${slug}.md`, buildChatLogMarkdown(doc), "text/markdown");
16368
+ } else {
16369
+ save(`pptx-ai-chats-${slug}.json`, JSON.stringify(doc, null, 2), "application/json");
16370
+ }
16371
+ return chats.length;
16372
+ }
16373
+ function computeFocusTargets(input) {
16374
+ const { activeSlideIndex, selectedElementIds, selectedElementId } = input;
16375
+ const ids = selectedElementIds.length > 0 ? [...selectedElementIds] : selectedElementId ? [selectedElementId] : [];
16376
+ if (ids.length === 0) {
16377
+ return [{ kind: "slide", slideIndex: activeSlideIndex }];
16378
+ }
16379
+ return ids.map((elementId2) => ({ kind: "element", slideIndex: activeSlideIndex, elementId: elementId2 }));
16380
+ }
16381
+ function elementTypeLabel(type) {
16382
+ if (type === "smartArt") {
16383
+ return "SmartArt";
16384
+ }
16385
+ if (type === "ole") {
16386
+ return "OLE";
16387
+ }
16388
+ return type.charAt(0).toUpperCase() + type.slice(1);
16389
+ }
16390
+ function shortElementId(id) {
16391
+ const trimmed = id.trimEnd();
16392
+ let start = trimmed.length;
16393
+ while (start > 0 && isAsciiDigit(trimmed.charCodeAt(start - 1))) {
16394
+ start -= 1;
16395
+ }
16396
+ if (start < trimmed.length) {
16397
+ return trimmed.slice(start);
16398
+ }
16399
+ const separator = Math.max(id.lastIndexOf("/"), id.lastIndexOf("."), id.lastIndexOf("-"));
16400
+ const tail = separator === -1 ? id : id.slice(separator + 1);
16401
+ return tail || id;
16402
+ }
16403
+ function isAsciiDigit(code) {
16404
+ return code >= 48 && code <= 57;
16405
+ }
16406
+ function focusTargetChips(targets, slides) {
16407
+ return targets.map((target, index) => {
16408
+ if (target.kind === "slide") {
16409
+ const label2 = `Slide ${target.slideIndex + 1}`;
16410
+ return { key: `slide-${target.slideIndex}-${index}`, label: label2, title: label2 };
16411
+ }
16412
+ const el = slides[target.slideIndex]?.elements.find((e) => e.id === target.elementId);
16413
+ const typeLabel = el ? elementTypeLabel(el.type) : "Element";
16414
+ const label = el ? `${typeLabel} ${shortElementId(target.elementId)}` : `${typeLabel} (missing)`;
16415
+ return {
16416
+ key: `el-${target.elementId}-${index}`,
16417
+ label,
16418
+ title: `${typeLabel}: ${target.elementId}`
16419
+ };
16420
+ });
16421
+ }
16422
+ function isTwoTableFocus(targets, slides) {
16423
+ if (targets.length !== 2 || targets.some((target) => target.kind !== "element")) {
16424
+ return false;
16425
+ }
16426
+ const [a, b] = targets;
16427
+ if (a.slideIndex !== b.slideIndex) {
16428
+ return false;
16429
+ }
16430
+ const slide = slides[a.slideIndex];
16431
+ const elA = slide?.elements.find((e) => e.id === a.elementId);
16432
+ const elB = slide?.elements.find((e) => e.id === b.elementId);
16433
+ if (elA?.type !== "table" || elB?.type !== "table") {
16434
+ return false;
16435
+ }
16436
+ return { slideIndex: a.slideIndex, elementIdA: a.elementId, elementIdB: b.elementId };
16437
+ }
16438
+ function mergeTablesDirective(slideIndex2, elementIdA, elementIdB) {
16439
+ return `Merge the two selected tables (elementIdA=${elementIdA}, elementIdB=${elementIdB}) on slide ${slideIndex2 + 1} using merge_tables; stage it now, do not ask me to confirm.`;
16440
+ }
16238
16441
  init_chat_history_store();
16239
16442
  function deckIdFromBridge(bridge) {
16240
16443
  const meta3 = bridge.getDeckMeta();
16241
16444
  const title = (meta3.title ?? "deck").trim().toLowerCase().replace(/\s+/gu, "-").slice(0, 60);
16242
16445
  return `${title || "deck"}::${meta3.slideCount}`;
16243
16446
  }
16447
+ function applyElementUpdate(el, u) {
16448
+ if (u.x !== void 0) {
16449
+ el.x = u.x;
16450
+ }
16451
+ if (u.y !== void 0) {
16452
+ el.y = u.y;
16453
+ }
16454
+ if (u.width !== void 0) {
16455
+ el.width = u.width;
16456
+ }
16457
+ if (u.height !== void 0) {
16458
+ el.height = u.height;
16459
+ }
16460
+ if (u.rotation !== void 0) {
16461
+ el.rotation = u.rotation;
16462
+ }
16463
+ if (u.opacity !== void 0) {
16464
+ el.opacity = u.opacity;
16465
+ }
16466
+ if (u.hidden !== void 0) {
16467
+ el.hidden = u.hidden;
16468
+ }
16469
+ if (u.flipHorizontal !== void 0) {
16470
+ el.flipHorizontal = u.flipHorizontal;
16471
+ }
16472
+ if (u.flipVertical !== void 0) {
16473
+ el.flipVertical = u.flipVertical;
16474
+ }
16475
+ applyTextUpdate(el, u);
16476
+ applyShapeStyleUpdate(el, u);
16477
+ }
16478
+ function applyTextUpdate(el, u) {
16479
+ if (!hasTextProperties(el)) {
16480
+ return;
16481
+ }
16482
+ const textEl = el;
16483
+ if (u.text !== void 0) {
16484
+ textEl.text = u.text;
16485
+ if (textEl.textSegments && textEl.textSegments.length > 0) {
16486
+ textEl.textSegments[0].text = u.text;
16487
+ } else {
16488
+ textEl.textSegments = [{ text: u.text, style: {} }];
16489
+ }
16490
+ }
16491
+ if (u.fontSize === void 0 && u.fontFamily === void 0 && u.fontColor === void 0 && u.bold === void 0 && u.italic === void 0 && u.underline === void 0 && u.align === void 0) {
16492
+ return;
16493
+ }
16494
+ const textStyle = {};
16495
+ if (u.fontSize !== void 0) {
16496
+ textStyle.fontSize = u.fontSize;
16497
+ }
16498
+ if (u.fontFamily !== void 0) {
16499
+ textStyle.fontFamily = u.fontFamily;
16500
+ }
16501
+ if (u.fontColor !== void 0) {
16502
+ textStyle.color = u.fontColor;
16503
+ }
16504
+ if (u.bold !== void 0) {
16505
+ textStyle.bold = u.bold;
16506
+ }
16507
+ if (u.italic !== void 0) {
16508
+ textStyle.italic = u.italic;
16509
+ }
16510
+ if (u.underline !== void 0) {
16511
+ textStyle.underline = u.underline;
16512
+ }
16513
+ if (u.align !== void 0) {
16514
+ textStyle.align = u.align;
16515
+ }
16516
+ textEl.textStyle = { ...textEl.textStyle, ...textStyle };
16517
+ if (textEl.textSegments) {
16518
+ textEl.textSegments = textEl.textSegments.map((seg) => ({
16519
+ ...seg,
16520
+ style: { ...seg.style, ...textStyle }
16521
+ }));
16522
+ }
16523
+ }
16524
+ function applyShapeStyleUpdate(el, u) {
16525
+ if (u.fillColor === void 0 && u.strokeColor === void 0 && u.strokeWidth === void 0) {
16526
+ return;
16527
+ }
16528
+ if (!hasShapeProperties(el)) {
16529
+ return;
16530
+ }
16531
+ const holder = el;
16532
+ holder.shapeStyle ??= {};
16533
+ const style = holder.shapeStyle;
16534
+ if (u.fillColor !== void 0) {
16535
+ style.fillColor = u.fillColor;
16536
+ }
16537
+ if (u.strokeColor !== void 0) {
16538
+ style.strokeColor = u.strokeColor;
16539
+ }
16540
+ if (u.strokeWidth !== void 0) {
16541
+ style.strokeWidth = u.strokeWidth;
16542
+ }
16543
+ }
16244
16544
  function toolLabel(toolName) {
16245
16545
  if (!toolName) {
16246
16546
  return "Tool";
@@ -16642,63 +16942,4 @@ function toolCanvasTarget(toolName, input) {
16642
16942
  return { slideIndex: slideIndex2, elementIds };
16643
16943
  }
16644
16944
 
16645
- // src/viewer/hooks/ai/focus-targets.ts
16646
- function computeFocusTargets(input) {
16647
- const { activeSlideIndex, selectedElementIds, selectedElementId } = input;
16648
- const ids = selectedElementIds.length > 0 ? selectedElementIds : selectedElementId ? [selectedElementId] : [];
16649
- if (ids.length === 0) {
16650
- return [{ kind: "slide", slideIndex: activeSlideIndex }];
16651
- }
16652
- return ids.map((elementId2) => ({ kind: "element", slideIndex: activeSlideIndex, elementId: elementId2 }));
16653
- }
16654
- function elementTypeLabel(type) {
16655
- if (type === "smartArt") {
16656
- return "SmartArt";
16657
- }
16658
- if (type === "ole") {
16659
- return "OLE";
16660
- }
16661
- return type.charAt(0).toUpperCase() + type.slice(1);
16662
- }
16663
- function shortElementId(id) {
16664
- const trailingNumber = id.match(/(\d+)\s*$/u);
16665
- if (trailingNumber) {
16666
- return trailingNumber[1];
16667
- }
16668
- const tail = id.replace(/^.*[/.-]/u, "");
16669
- return tail || id;
16670
- }
16671
- function focusTargetChips(targets, slides) {
16672
- return targets.map((target, index) => {
16673
- if (target.kind === "slide") {
16674
- const label2 = `Slide ${target.slideIndex + 1}`;
16675
- return { key: `slide-${target.slideIndex}-${index}`, label: label2, title: label2 };
16676
- }
16677
- const el = slides[target.slideIndex]?.elements.find((e) => e.id === target.elementId);
16678
- const typeLabel = el ? elementTypeLabel(el.type) : "Element";
16679
- const label = el ? `${typeLabel} ${shortElementId(target.elementId)}` : `${typeLabel} (missing)`;
16680
- return {
16681
- key: `el-${target.elementId}-${index}`,
16682
- label,
16683
- title: `${typeLabel}: ${target.elementId}`
16684
- };
16685
- });
16686
- }
16687
- function isTwoTableFocus(targets, slides) {
16688
- if (targets.length !== 2 || targets.some((t) => t.kind !== "element")) {
16689
- return false;
16690
- }
16691
- const [a, b] = targets;
16692
- if (a.slideIndex !== b.slideIndex) {
16693
- return false;
16694
- }
16695
- const slide = slides[a.slideIndex];
16696
- const elA = slide?.elements.find((e) => e.id === a.elementId);
16697
- const elB = slide?.elements.find((e) => e.id === b.elementId);
16698
- if (elA?.type !== "table" || elB?.type !== "table") {
16699
- return false;
16700
- }
16701
- return { slideIndex: a.slideIndex, elementIdA: a.elementId, elementIdB: b.elementId };
16702
- }
16703
-
16704
- export { aiChangeAnimationCss, buildDeckContext, changeGhostStyle, computeFocusTargets, createAiChatSession, createChatHistoryStore, deckIdFromBridge, describeToolActivity, focusTargetChips, humanizeDiffLine, isAiAvailable, isTwoTableFocus, summarizeToolArgs, toRenderableParts, toolCanvasTarget, toolLabel };
16945
+ export { aiChangeAnimationCss, applyElementUpdate, buildDeckContext, changeGhostStyle, collectStoredChats, computeFocusTargets, createAiChatSession, createChatHistoryStore, deckIdFromBridge, describeToolActivity, exportAiChatLogs, focusTargetChips, humanizeDiffLine, isAiAvailable, isTwoTableFocus, mergeTablesDirective, summarizeToolArgs, toolCanvasTarget, toolLabel };
Binary file
Binary file