@portel/photon 1.17.6 → 1.19.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 (194) hide show
  1. package/dist/auto-ui/beam/photon-management.d.ts.map +1 -1
  2. package/dist/auto-ui/beam/photon-management.js +28 -1
  3. package/dist/auto-ui/beam/photon-management.js.map +1 -1
  4. package/dist/auto-ui/beam/routes/api-marketplace.d.ts.map +1 -1
  5. package/dist/auto-ui/beam/routes/api-marketplace.js +10 -5
  6. package/dist/auto-ui/beam/routes/api-marketplace.js.map +1 -1
  7. package/dist/auto-ui/beam.d.ts.map +1 -1
  8. package/dist/auto-ui/beam.js +14 -4
  9. package/dist/auto-ui/beam.js.map +1 -1
  10. package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -1
  11. package/dist/auto-ui/streamable-http-transport.js +259 -88
  12. package/dist/auto-ui/streamable-http-transport.js.map +1 -1
  13. package/dist/auto-ui/types.d.ts +2 -0
  14. package/dist/auto-ui/types.d.ts.map +1 -1
  15. package/dist/auto-ui/types.js +5 -0
  16. package/dist/auto-ui/types.js.map +1 -1
  17. package/dist/beam-form.bundle.js +5 -3
  18. package/dist/beam-form.bundle.js.map +2 -2
  19. package/dist/beam.bundle.js +912 -59
  20. package/dist/beam.bundle.js.map +3 -3
  21. package/dist/claude-code-plugin.js +1 -1
  22. package/dist/cli/commands/beam.d.ts.map +1 -1
  23. package/dist/cli/commands/beam.js +8 -2
  24. package/dist/cli/commands/beam.js.map +1 -1
  25. package/dist/cli/commands/changelog.d.ts +9 -0
  26. package/dist/cli/commands/changelog.d.ts.map +1 -0
  27. package/dist/cli/commands/changelog.js +133 -0
  28. package/dist/cli/commands/changelog.js.map +1 -0
  29. package/dist/cli/commands/maker.d.ts.map +1 -1
  30. package/dist/cli/commands/maker.js +23 -2
  31. package/dist/cli/commands/maker.js.map +1 -1
  32. package/dist/cli/commands/mcp.d.ts.map +1 -1
  33. package/dist/cli/commands/mcp.js +53 -0
  34. package/dist/cli/commands/mcp.js.map +1 -1
  35. package/dist/cli/commands/package.d.ts.map +1 -1
  36. package/dist/cli/commands/package.js +18 -2
  37. package/dist/cli/commands/package.js.map +1 -1
  38. package/dist/cli/commands/run.d.ts.map +1 -1
  39. package/dist/cli/commands/run.js +1 -0
  40. package/dist/cli/commands/run.js.map +1 -1
  41. package/dist/cli/commands/update.d.ts +3 -2
  42. package/dist/cli/commands/update.d.ts.map +1 -1
  43. package/dist/cli/commands/update.js +50 -43
  44. package/dist/cli/commands/update.js.map +1 -1
  45. package/dist/cli/index.d.ts.map +1 -1
  46. package/dist/cli/index.js +16 -2
  47. package/dist/cli/index.js.map +1 -1
  48. package/dist/cli-alias.js +1 -1
  49. package/dist/cli-alias.js.map +1 -1
  50. package/dist/context-store.d.ts +23 -33
  51. package/dist/context-store.d.ts.map +1 -1
  52. package/dist/context-store.js +147 -97
  53. package/dist/context-store.js.map +1 -1
  54. package/dist/context.d.ts +15 -10
  55. package/dist/context.d.ts.map +1 -1
  56. package/dist/context.js +37 -13
  57. package/dist/context.js.map +1 -1
  58. package/dist/daemon/server.js +4 -2
  59. package/dist/daemon/server.js.map +1 -1
  60. package/dist/data-migration.d.ts +27 -0
  61. package/dist/data-migration.d.ts.map +1 -0
  62. package/dist/data-migration.js +307 -0
  63. package/dist/data-migration.js.map +1 -0
  64. package/dist/editor-support/docblock-tag-catalog.d.ts.map +1 -1
  65. package/dist/editor-support/docblock-tag-catalog.js +6 -0
  66. package/dist/editor-support/docblock-tag-catalog.js.map +1 -1
  67. package/dist/loader.d.ts +10 -0
  68. package/dist/loader.d.ts.map +1 -1
  69. package/dist/loader.js +106 -20
  70. package/dist/loader.js.map +1 -1
  71. package/dist/marketplace-manager.d.ts.map +1 -1
  72. package/dist/marketplace-manager.js +25 -5
  73. package/dist/marketplace-manager.js.map +1 -1
  74. package/dist/photon-cli-runner.d.ts.map +1 -1
  75. package/dist/photon-cli-runner.js +56 -19
  76. package/dist/photon-cli-runner.js.map +1 -1
  77. package/dist/photon-doc-extractor.d.ts +1 -0
  78. package/dist/photon-doc-extractor.d.ts.map +1 -1
  79. package/dist/photon-doc-extractor.js +6 -0
  80. package/dist/photon-doc-extractor.js.map +1 -1
  81. package/dist/readme-syncer.d.ts.map +1 -1
  82. package/dist/readme-syncer.js +6 -1
  83. package/dist/readme-syncer.js.map +1 -1
  84. package/dist/server.d.ts +40 -0
  85. package/dist/server.d.ts.map +1 -1
  86. package/dist/server.js +298 -29
  87. package/dist/server.js.map +1 -1
  88. package/dist/shared/audit.js +4 -4
  89. package/dist/shared/audit.js.map +1 -1
  90. package/dist/tasks/executor.d.ts +47 -0
  91. package/dist/tasks/executor.d.ts.map +1 -0
  92. package/dist/tasks/executor.js +180 -0
  93. package/dist/tasks/executor.js.map +1 -0
  94. package/dist/tasks/store.d.ts +13 -6
  95. package/dist/tasks/store.d.ts.map +1 -1
  96. package/dist/tasks/store.js +56 -11
  97. package/dist/tasks/store.js.map +1 -1
  98. package/dist/tasks/types.d.ts +23 -2
  99. package/dist/tasks/types.d.ts.map +1 -1
  100. package/dist/tasks/types.js +23 -3
  101. package/dist/tasks/types.js.map +1 -1
  102. package/dist/version-notify.d.ts +27 -0
  103. package/dist/version-notify.d.ts.map +1 -0
  104. package/dist/version-notify.js +142 -0
  105. package/dist/version-notify.js.map +1 -0
  106. package/package.json +5 -4
  107. package/dist/auto-ui/bridge/openai-shim.d.ts +0 -20
  108. package/dist/auto-ui/bridge/openai-shim.d.ts.map +0 -1
  109. package/dist/auto-ui/bridge/openai-shim.js +0 -231
  110. package/dist/auto-ui/bridge/openai-shim.js.map +0 -1
  111. package/dist/auto-ui/bridge/photon-app.d.ts +0 -162
  112. package/dist/auto-ui/bridge/photon-app.d.ts.map +0 -1
  113. package/dist/auto-ui/bridge/photon-app.js +0 -460
  114. package/dist/auto-ui/bridge/photon-app.js.map +0 -1
  115. package/dist/auto-ui/daemon-tools.d.ts +0 -45
  116. package/dist/auto-ui/daemon-tools.d.ts.map +0 -1
  117. package/dist/auto-ui/daemon-tools.js +0 -581
  118. package/dist/auto-ui/daemon-tools.js.map +0 -1
  119. package/dist/auto-ui/design-system/index.d.ts +0 -21
  120. package/dist/auto-ui/design-system/index.d.ts.map +0 -1
  121. package/dist/auto-ui/design-system/index.js +0 -27
  122. package/dist/auto-ui/design-system/index.js.map +0 -1
  123. package/dist/auto-ui/design-system/transaction-ui.d.ts +0 -70
  124. package/dist/auto-ui/design-system/transaction-ui.d.ts.map +0 -1
  125. package/dist/auto-ui/design-system/transaction-ui.js +0 -982
  126. package/dist/auto-ui/design-system/transaction-ui.js.map +0 -1
  127. package/dist/auto-ui/playground-server.d.ts +0 -7
  128. package/dist/auto-ui/playground-server.d.ts.map +0 -1
  129. package/dist/auto-ui/playground-server.js +0 -840
  130. package/dist/auto-ui/playground-server.js.map +0 -1
  131. package/dist/auto-ui/rendering/components.d.ts +0 -29
  132. package/dist/auto-ui/rendering/components.d.ts.map +0 -1
  133. package/dist/auto-ui/rendering/components.js +0 -1341
  134. package/dist/auto-ui/rendering/components.js.map +0 -1
  135. package/dist/auto-ui/rendering/field-analyzer.d.ts +0 -104
  136. package/dist/auto-ui/rendering/field-analyzer.d.ts.map +0 -1
  137. package/dist/auto-ui/rendering/field-analyzer.js +0 -447
  138. package/dist/auto-ui/rendering/field-analyzer.js.map +0 -1
  139. package/dist/auto-ui/rendering/field-renderers.d.ts +0 -64
  140. package/dist/auto-ui/rendering/field-renderers.d.ts.map +0 -1
  141. package/dist/auto-ui/rendering/field-renderers.js +0 -317
  142. package/dist/auto-ui/rendering/field-renderers.js.map +0 -1
  143. package/dist/auto-ui/rendering/index.d.ts +0 -28
  144. package/dist/auto-ui/rendering/index.d.ts.map +0 -1
  145. package/dist/auto-ui/rendering/index.js +0 -60
  146. package/dist/auto-ui/rendering/index.js.map +0 -1
  147. package/dist/auto-ui/rendering/layout-selector.d.ts +0 -60
  148. package/dist/auto-ui/rendering/layout-selector.d.ts.map +0 -1
  149. package/dist/auto-ui/rendering/layout-selector.js +0 -476
  150. package/dist/auto-ui/rendering/layout-selector.js.map +0 -1
  151. package/dist/markdown-utils.d.ts +0 -8
  152. package/dist/markdown-utils.d.ts.map +0 -1
  153. package/dist/markdown-utils.js +0 -64
  154. package/dist/markdown-utils.js.map +0 -1
  155. package/dist/mcp-client.d.ts +0 -9
  156. package/dist/mcp-client.d.ts.map +0 -1
  157. package/dist/mcp-client.js +0 -11
  158. package/dist/mcp-client.js.map +0 -1
  159. package/dist/mcp-elicitation.d.ts +0 -32
  160. package/dist/mcp-elicitation.d.ts.map +0 -1
  161. package/dist/mcp-elicitation.js +0 -26
  162. package/dist/mcp-elicitation.js.map +0 -1
  163. package/dist/photons/builder-compass.photon.d.ts +0 -167
  164. package/dist/photons/builder-compass.photon.d.ts.map +0 -1
  165. package/dist/photons/builder-compass.photon.js +0 -816
  166. package/dist/photons/builder-compass.photon.js.map +0 -1
  167. package/dist/photons/builder-compass.photon.ts +0 -1129
  168. package/dist/photons/docs/ui/docs.html +0 -441
  169. package/dist/photons/docs.photon.d.ts +0 -237
  170. package/dist/photons/docs.photon.d.ts.map +0 -1
  171. package/dist/photons/docs.photon.js +0 -483
  172. package/dist/photons/docs.photon.js.map +0 -1
  173. package/dist/photons/docs.photon.ts +0 -536
  174. package/dist/photons/slides.photon.d.ts +0 -212
  175. package/dist/photons/slides.photon.d.ts.map +0 -1
  176. package/dist/photons/slides.photon.js +0 -355
  177. package/dist/photons/slides.photon.js.map +0 -1
  178. package/dist/photons/slides.photon.ts +0 -370
  179. package/dist/photons/spreadsheet/ui/spreadsheet.html +0 -779
  180. package/dist/photons/spreadsheet.photon.d.ts +0 -554
  181. package/dist/photons/spreadsheet.photon.d.ts.map +0 -1
  182. package/dist/photons/spreadsheet.photon.js +0 -1050
  183. package/dist/photons/spreadsheet.photon.js.map +0 -1
  184. package/dist/photons/spreadsheet.photon.ts +0 -1239
  185. package/dist/photons/ui/builder-compass.html +0 -1199
  186. package/dist/photons/ui/builder-compass.photon.html +0 -380
  187. package/dist/security-scanner.d.ts +0 -52
  188. package/dist/security-scanner.d.ts.map +0 -1
  189. package/dist/security-scanner.js +0 -181
  190. package/dist/security-scanner.js.map +0 -1
  191. package/dist/shared/performance.d.ts +0 -65
  192. package/dist/shared/performance.d.ts.map +0 -1
  193. package/dist/shared/performance.js +0 -136
  194. package/dist/shared/performance.js.map +0 -1
@@ -19402,7 +19402,7 @@ ConfirmDialog.styles = [
19402
19402
  }
19403
19403
 
19404
19404
  .btn-cancel:hover {
19405
- background: var(--bg-glass-strong, rgba(255, 255, 255, 0.08));
19405
+ background: var(--bg-glass-strong);
19406
19406
  }
19407
19407
 
19408
19408
  .btn-confirm {
@@ -19442,10 +19442,12 @@ ConfirmDialog = __decorateClass([
19442
19442
  t4("confirm-dialog")
19443
19443
  ], ConfirmDialog);
19444
19444
  async function confirmDialog(message, options) {
19445
- let dialog = document.querySelector("confirm-dialog");
19445
+ const beamApp = document.querySelector("beam-app");
19446
+ const root = beamApp?.shadowRoot ?? document.body;
19447
+ let dialog = root.querySelector("confirm-dialog");
19446
19448
  if (!dialog) {
19447
19449
  dialog = document.createElement("confirm-dialog");
19448
- document.body.appendChild(dialog);
19450
+ root.appendChild(dialog);
19449
19451
  }
19450
19452
  return dialog.show(message, options);
19451
19453
  }
@@ -23181,11 +23183,19 @@ var BeamApp = class extends i4 {
23181
23183
  };
23182
23184
  this._handleDeletePhoton = async () => {
23183
23185
  this._closeSettingsMenu();
23184
- if (await confirmDialog(
23185
- `Are you sure you want to delete "${this._selectedPhoton?.name}"? This cannot be undone.`,
23186
- { confirm: "Delete", destructive: true }
23187
- )) {
23188
- void this._invokeMakerMethod("delete");
23186
+ if (await confirmDialog(`Remove "${this._selectedPhoton?.name}"? It will be moved to trash.`, {
23187
+ confirm: "Remove",
23188
+ destructive: true
23189
+ })) {
23190
+ const deletedName = this._selectedPhoton?.name;
23191
+ await this._invokeMakerMethod("delete");
23192
+ if (deletedName) {
23193
+ this._photons = this._photons.filter((p5) => p5.name !== deletedName);
23194
+ this._selectedPhoton = this._photons[0] || null;
23195
+ this._selectedMethod = null;
23196
+ this._lastResult = null;
23197
+ this.requestUpdate();
23198
+ }
23189
23199
  }
23190
23200
  };
23191
23201
  /**
@@ -24254,15 +24264,15 @@ var BeamApp = class extends i4 {
24254
24264
  mcpClient.on("progress", (data) => {
24255
24265
  this._log("info", data.message || "Processing...");
24256
24266
  if (typeof data.progress === "number") {
24257
- if (data.progress > 0 || !this._progress) {
24267
+ if (data.progress > 0) {
24258
24268
  this._progress = {
24259
24269
  value: data.total ? data.progress / data.total : data.progress,
24260
24270
  message: data.message || "Processing..."
24261
24271
  };
24262
- } else if (this._progress && data.message) {
24272
+ } else {
24263
24273
  this._progress = {
24264
- ...this._progress,
24265
- message: data.message
24274
+ value: -1,
24275
+ message: data.message || "Processing..."
24266
24276
  };
24267
24277
  }
24268
24278
  }
@@ -24335,6 +24345,7 @@ var BeamApp = class extends i4 {
24335
24345
  "stack",
24336
24346
  "columns",
24337
24347
  "qr",
24348
+ "guide",
24338
24349
  "slides",
24339
24350
  "presentation"
24340
24351
  ]);
@@ -26785,10 +26796,10 @@ ${photon.errorMessage || "Unknown error"}</pre
26785
26796
  }
26786
26797
  break;
26787
26798
  case "remember-values":
26788
- this._rememberFormValues = !this._rememberFormValues;
26799
+ this._toggleRememberValues();
26789
26800
  break;
26790
26801
  case "verbose-logging":
26791
- this._verboseLogging = !this._verboseLogging;
26802
+ this._toggleVerboseLogging();
26792
26803
  break;
26793
26804
  case "run-tests":
26794
26805
  void this._runTests();
@@ -35462,6 +35473,12 @@ var ResultViewer = class extends i4 {
35462
35473
  // per-slide bg (color, url, gradient)
35463
35474
  this._slidesEffects = /* @__PURE__ */ new Map();
35464
35475
  // per-slide element effect
35476
+ this._slidesMoods = /* @__PURE__ */ new Map();
35477
+ // per-slide mood (dramatic, techy, etc.)
35478
+ this._slidesGlobalMood = "";
35479
+ // frontmatter mood default
35480
+ this._slidesBgEffects = /* @__PURE__ */ new Map();
35481
+ // per-slide bg effect (gradient-mesh, etc.)
35465
35482
  this._slidesCols = /* @__PURE__ */ new Map();
35466
35483
  // per-slide column count
35467
35484
  this._slidesBuilds = /* @__PURE__ */ new Map();
@@ -36265,12 +36282,14 @@ var ResultViewer = class extends i4 {
36265
36282
  "qr",
36266
36283
  "slides",
36267
36284
  "checklist",
36268
- "article"
36285
+ "article",
36286
+ "magazine"
36269
36287
  ].includes(format)) {
36270
36288
  return format;
36271
36289
  }
36272
36290
  if (format === "md") return "markdown";
36273
36291
  if (format === "presentation") return "slides";
36292
+ if (format === "article") return "magazine";
36274
36293
  }
36275
36294
  const data = this.result;
36276
36295
  if (data && typeof data === "object" && !Array.isArray(data) && typeof data._photonType === "string") {
@@ -36421,9 +36440,11 @@ var ResultViewer = class extends i4 {
36421
36440
  case "slides":
36422
36441
  return typeof data === "string";
36423
36442
  case "checklist":
36443
+ case "guide":
36424
36444
  return Array.isArray(data);
36445
+ case "magazine":
36425
36446
  case "article":
36426
- return typeof data === "object" && data !== null && typeof data.text === "string";
36447
+ return typeof data === "string" || typeof data === "object" && data !== null && typeof data.text === "string";
36427
36448
  default:
36428
36449
  return true;
36429
36450
  }
@@ -36452,7 +36473,10 @@ var ResultViewer = class extends i4 {
36452
36473
  case "tree":
36453
36474
  return this._renderTree(filteredData);
36454
36475
  case "markdown": {
36455
- const mdData = Array.isArray(filteredData) ? filteredData.join("\n\n---\n\n") : filteredData;
36476
+ if (Array.isArray(filteredData) && filteredData.length > 1) {
36477
+ return this._renderMarkdownStack(filteredData);
36478
+ }
36479
+ const mdData = Array.isArray(filteredData) ? filteredData[0] : filteredData;
36456
36480
  return this._renderMarkdown(mdData);
36457
36481
  }
36458
36482
  case "html":
@@ -36489,8 +36513,11 @@ var ResultViewer = class extends i4 {
36489
36513
  return this._renderSlides(filteredData);
36490
36514
  case "checklist":
36491
36515
  return this._renderChecklist(filteredData);
36516
+ case "guide":
36517
+ return this._renderGuide(filteredData);
36518
+ case "magazine":
36492
36519
  case "article":
36493
- return this._renderArticle(filteredData);
36520
+ return this._renderMagazine(filteredData);
36494
36521
  case "json":
36495
36522
  default:
36496
36523
  return this._renderJson(filteredData);
@@ -36991,10 +37018,34 @@ ${rows}`);
36991
37018
  }
36992
37019
  return { body, table: tables.length ? tables.join("\n\n") + "\n\n" : "" };
36993
37020
  }
37021
+ _renderMarkdownStack(rawItems) {
37022
+ const items = rawItems.filter((s5) => s5 && s5.trim());
37023
+ const marked2 = window.marked;
37024
+ return b2`
37025
+ <div style="display:flex; flex-direction:column; gap:0;">
37026
+ <span
37027
+ style="font-size:12px; color:var(--t-muted); padding-bottom:12px; border-bottom:1px solid var(--border-glass); margin-bottom:4px;"
37028
+ >
37029
+ ${items.length} results
37030
+ </span>
37031
+ ${items.map((item, i7) => {
37032
+ const htmlContent = marked2 ? marked2.parse(item, { breaks: false, gfm: true }) : item;
37033
+ return b2`
37034
+ <div
37035
+ class="markdown-content"
37036
+ style="padding:12px 0; ${i7 < items.length - 1 ? "border-bottom:1px solid var(--border-glass);" : ""}"
37037
+ >
37038
+ ${o5(htmlContent)}
37039
+ </div>
37040
+ `;
37041
+ })}
37042
+ </div>
37043
+ `;
37044
+ }
36994
37045
  _renderMarkdown(filteredData) {
36995
37046
  const data = filteredData !== void 0 ? filteredData : this.result;
36996
37047
  const marked2 = window.marked;
36997
- if (Array.isArray(this.result) && this.result.length > 1 && marked2) {
37048
+ if (Array.isArray(this.result) && this.result.length > 1 && marked2 && !this.outputFormat) {
36998
37049
  const query = this._filterQuery?.trim().toLowerCase() || "";
36999
37050
  const allMermaidBlocks = [];
37000
37051
  const allCodeBlocks = [];
@@ -37396,6 +37447,8 @@ ${code}</pre>`;
37396
37447
  this._slidesTransitions.clear();
37397
37448
  this._slidesBackgrounds.clear();
37398
37449
  this._slidesEffects.clear();
37450
+ this._slidesMoods.clear();
37451
+ this._slidesBgEffects.clear();
37399
37452
  this._slidesCols.clear();
37400
37453
  this._slidesBuilds.clear();
37401
37454
  slides.forEach((slide, i7) => {
@@ -37405,10 +37458,15 @@ ${code}</pre>`;
37405
37458
  if (bgMatch) this._slidesBackgrounds.set(i7, bgMatch[1].trim());
37406
37459
  const fxMatch = slide.match(/<!--\s*effect:\s*(\S+)\s*-->/);
37407
37460
  if (fxMatch) this._slidesEffects.set(i7, fxMatch[1].trim());
37461
+ const moodMatch = slide.match(/<!--\s*mood:\s*(\w+)\s*-->/);
37462
+ if (moodMatch) this._slidesMoods.set(i7, moodMatch[1].trim());
37463
+ const bgFxMatch = slide.match(/<!--\s*background:\s*(\S+)\s*-->/);
37464
+ if (bgFxMatch) this._slidesBgEffects.set(i7, bgFxMatch[1].trim());
37408
37465
  const colMatch = slide.match(/<!--\s*cols:\s*(\d+)\s*-->/);
37409
37466
  if (colMatch) this._slidesCols.set(i7, Math.min(Math.max(parseInt(colMatch[1], 10), 2), 4));
37410
37467
  if (/<!--\s*build\s*-->/.test(slide)) this._slidesBuilds.set(i7, true);
37411
37468
  });
37469
+ this._slidesGlobalMood = config3.mood || "";
37412
37470
  const defaultTheme2 = "auto";
37413
37471
  return { slides, theme: config3.theme || defaultTheme2, config: config3 };
37414
37472
  }
@@ -37460,7 +37518,7 @@ ${code}</pre>`;
37460
37518
  return this._slidesBridgeScript || "";
37461
37519
  }
37462
37520
  /** Build an iframe srcdoc for a slide with the bridge loaded */
37463
- _buildSlideSrcdoc(slideHtml, codeBlocks, headerText, footerText, pageNum, slideBg, slideEffect) {
37521
+ _buildSlideSrcdoc(slideHtml, codeBlocks, headerText, footerText, pageNum, slideBg, slideEffect, slideBgEffect) {
37464
37522
  const bridge = this._slidesBridgeScript || "";
37465
37523
  const photonPrefix = this.photonName ? this.photonName + "/" : "";
37466
37524
  let html = slideHtml;
@@ -37485,11 +37543,15 @@ ${code}</pre>`;
37485
37543
  }
37486
37544
  }
37487
37545
  const themeClass = this._slidesThemeClass || "slides-theme-default";
37546
+ const themeName = themeClass.replace("slides-theme-", "");
37547
+ const fontSpec = ResultViewer._THEME_FONTS[themeName];
37548
+ const fontLink = fontSpec ? `<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=${fontSpec}&display=swap">` : "";
37488
37549
  return `<!doctype html>
37489
37550
  <html lang="en" class="${themeClass}">
37490
37551
  <head>
37491
37552
  <meta charset="UTF-8">
37492
37553
  <meta name="photon-template" content="true">
37554
+ ${fontLink}
37493
37555
  ${bridge}
37494
37556
  <style>
37495
37557
  /* reveal.js-style scaling: fixed design canvas + transform:scale() */
@@ -37547,6 +37609,20 @@ ${bridge}
37547
37609
  [data-enter="flip-in"] { animation: motion-flip-in 0.5s cubic-bezier(0.16,1,0.3,1) both; }
37548
37610
  [data-enter="fade-in"] { animation: motion-fade-in 0.3s cubic-bezier(0.16,1,0.3,1) both; }
37549
37611
  [data-enter="drop-in"] { animation: motion-drop-in 0.5s cubic-bezier(0.16,1,0.3,1) both; }
37612
+ [data-enter="mood-dramatic"] { animation: mood-dramatic 0.6s ease both; }
37613
+ [data-enter="mood-techy"] { animation: mood-techy 0.3s ease-out both; }
37614
+ [data-enter="mood-playful"] { animation: mood-playful 0.4s ease both; }
37615
+ [data-enter="mood-calm"] { animation: mood-calm 0.8s ease-in-out both; }
37616
+ /* Hide slide children initially, auto-reveal after 1.5s fallback if stagger doesn't fire */
37617
+ .slide-body > :not(.slide-content-area):not([data-enter]) {
37618
+ opacity: 0;
37619
+ animation: stagger-fallback 0.3s ease 1.5s both;
37620
+ }
37621
+ .slide-content-area > :not([data-enter]) {
37622
+ opacity: 0;
37623
+ animation: stagger-fallback 0.3s ease 1.5s both;
37624
+ }
37625
+ @keyframes stagger-fallback { to { opacity: 1; } }
37550
37626
  @media (prefers-reduced-motion: reduce) {
37551
37627
  [data-enter] { animation: none !important; opacity: 1 !important; }
37552
37628
  }
@@ -37677,6 +37753,8 @@ ${bridge}
37677
37753
  /* Full-bleed image */
37678
37754
  .hero { width: 100%; border-radius: var(--radius-lg, 14px);
37679
37755
  box-shadow: var(--shadow-lg, 0 24px 60px rgba(0,0,0,0.28)); }
37756
+ /* Theme presets (shared with outer shadow DOM) */
37757
+ ${ResultViewer._BRIDGE_THEME_CSS}
37680
37758
  </style>
37681
37759
  <script src="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/prism.min.js"><\/script>
37682
37760
  <script src="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/components/prism-typescript.min.js"><\/script>
@@ -37695,7 +37773,8 @@ ${bridge}
37695
37773
  </head>
37696
37774
  <body>
37697
37775
  ${this._buildSlideBgHtml(slideBg || "")}
37698
- <div class="slide-canvas"${slideEffect ? ` data-effect="${slideEffect}"` : ""}>
37776
+ ${slideBgEffect ? `<div style="position:absolute;inset:0;pointer-events:none;z-index:0;${slideBgEffect === "gradient-mesh" ? "background:radial-gradient(ellipse at 20% 50%,rgba(120,80,255,0.15) 0%,transparent 50%),radial-gradient(ellipse at 80% 20%,rgba(255,100,80,0.12) 0%,transparent 50%),radial-gradient(ellipse at 50% 80%,rgba(80,200,255,0.1) 0%,transparent 50%);animation:bgdrift 12s ease-in-out infinite alternate;" : slideBgEffect === "noise" ? "opacity:0.06;background-image:url(&quot;data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 width=%27200%27 height=%27200%27%3E%3Cfilter id=%27n%27%3E%3CfeTurbulence type=%27fractalNoise%27 baseFrequency=%270.75%27 numOctaves=%274%27 stitchTiles=%27stitch%27/%3E%3C/filter%3E%3Crect width=%27100%25%27 height=%27100%25%27 filter=%27url(%23n)%27/%3E%3C/svg%3E&quot;);" : slideBgEffect === "grid" ? "background-image:linear-gradient(rgba(255,255,255,0.05) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,0.05) 1px,transparent 1px);background-size:32px 32px;" : slideBgEffect === "particles" ? "overflow:hidden;" : ""}"></div>` : ""}
37777
+ <div class="slide-canvas"${slideEffect ? ` data-effect="${slideEffect}"` : ""} style="position:relative;z-index:1;">
37699
37778
  ${headerText ? `<div class="slide-header">${headerText}</div>` : ""}
37700
37779
  <div class="slide-body">${html}</div>
37701
37780
  ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</span><span>${pageNum || ""}</span></div>` : ""}
@@ -37748,6 +37827,74 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
37748
37827
  return document.querySelectorAll('.slide-fragment:not(.visible)').length === 0;
37749
37828
  };
37750
37829
  <\/script>
37830
+ <script>
37831
+ // Text effects for bridge slides
37832
+ (function() {
37833
+ var canvas = document.querySelector('.slide-canvas');
37834
+ var effect = canvas ? canvas.getAttribute('data-effect') : '';
37835
+ if (!effect) return;
37836
+ var heading = document.querySelector('.slide-body h1, .slide-body h2');
37837
+ if (!heading) return;
37838
+ var text = heading.textContent || '';
37839
+ if (!text) return;
37840
+
37841
+ if (effect === 'typing') {
37842
+ heading.textContent = '';
37843
+ heading.style.borderRight = '2px solid currentColor';
37844
+ var i = 0;
37845
+ function typeChar() {
37846
+ if (i < text.length) {
37847
+ heading.textContent += text[i]; i++;
37848
+ requestAnimationFrame(function() { setTimeout(typeChar, 40 + Math.random() * 30); });
37849
+ } else { setTimeout(function() { heading.style.borderRight = 'none'; }, 800); }
37850
+ }
37851
+ setTimeout(typeChar, 300);
37852
+ } else if (effect === 'scramble') {
37853
+ var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
37854
+ var revealed = new Array(text.length).fill(false);
37855
+ var iter = 0;
37856
+ function scrambleStep() {
37857
+ var d = '';
37858
+ for (var j = 0; j < text.length; j++) {
37859
+ d += (revealed[j] || text[j] === ' ') ? text[j] : chars[Math.floor(Math.random() * chars.length)];
37860
+ }
37861
+ heading.textContent = d;
37862
+ if (iter > 5) {
37863
+ var ur = []; for (var k = 0; k < revealed.length; k++) { if (!revealed[k] && text[k] !== ' ') ur.push(k); }
37864
+ if (ur.length > 0) revealed[ur[Math.floor(Math.random() * ur.length)]] = true;
37865
+ }
37866
+ iter++;
37867
+ if (ur && ur.length > 0) requestAnimationFrame(scrambleStep);
37868
+ else heading.textContent = text;
37869
+ }
37870
+ setTimeout(scrambleStep, 300);
37871
+ } else if (effect === 'wave') {
37872
+ heading.innerHTML = '';
37873
+ text.split('').forEach(function(ch, idx) {
37874
+ var s = document.createElement('span');
37875
+ s.textContent = ch === ' ' ? '\\u00A0' : ch;
37876
+ s.style.display = 'inline-block';
37877
+ s.style.opacity = '0';
37878
+ s.style.transform = 'translateY(20px)';
37879
+ s.style.transition = 'all 0.4s ease ' + (idx * 30) + 'ms';
37880
+ heading.appendChild(s);
37881
+ requestAnimationFrame(function() { s.style.opacity = '1'; s.style.transform = 'none'; });
37882
+ });
37883
+ } else if (effect === 'fly-in') {
37884
+ heading.innerHTML = '';
37885
+ text.split(' ').forEach(function(word, idx) {
37886
+ var s = document.createElement('span');
37887
+ s.textContent = word + ' ';
37888
+ s.style.display = 'inline-block';
37889
+ s.style.opacity = '0';
37890
+ s.style.transform = 'translate(' + ((Math.random()-0.5)*200) + 'px,' + ((Math.random()-0.5)*100) + 'px)';
37891
+ s.style.transition = 'all 0.6s cubic-bezier(0.16,1,0.3,1) ' + (idx * 80) + 'ms';
37892
+ heading.appendChild(s);
37893
+ requestAnimationFrame(function() { s.style.opacity = '1'; s.style.transform = 'none'; });
37894
+ });
37895
+ }
37896
+ })();
37897
+ <\/script>
37751
37898
  </body>
37752
37899
  </html>`;
37753
37900
  }
@@ -37824,6 +37971,17 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
37824
37971
  const resolvedTheme = rawTheme === "auto" || rawTheme === "default" ? this.theme === "light" ? "uncover" : "default" : rawTheme;
37825
37972
  const themeClass = `slides-theme-${resolvedTheme}`;
37826
37973
  this._slidesThemeClass = themeClass;
37974
+ const fontSpec = ResultViewer._THEME_FONTS[resolvedTheme];
37975
+ if (fontSpec) {
37976
+ const linkId = `photon-font-${resolvedTheme}`;
37977
+ if (!document.getElementById(linkId)) {
37978
+ const link2 = document.createElement("link");
37979
+ link2.id = linkId;
37980
+ link2.rel = "stylesheet";
37981
+ link2.href = `https://fonts.googleapis.com/css2?family=${fontSpec}&display=swap`;
37982
+ document.head.appendChild(link2);
37983
+ }
37984
+ }
37827
37985
  const bgOverride = config3.backgroundColor ? `background:${config3.backgroundColor};` : "";
37828
37986
  const colorOverride = config3.color ? `color:${config3.color};` : "";
37829
37987
  const viewportStyle = bgOverride + colorOverride;
@@ -37833,6 +37991,7 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
37833
37991
  const currentTransition = this._getSlideTransition(idx);
37834
37992
  const slideBg = this._slidesBackgrounds.get(idx) || "";
37835
37993
  const slideEffect = this._slidesEffects.get(idx) || "";
37994
+ const slideBgEffect = this._slidesBgEffects.get(idx) || "";
37836
37995
  const slideBgStyle = this._buildSlideBgStyle(slideBg);
37837
37996
  const isVideoBg = /\.(mp4|webm|mov)(\?|$)/i.test(slideBg) || slideBg.startsWith("video:");
37838
37997
  return b2`
@@ -37855,6 +38014,7 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
37855
38014
  loop
37856
38015
  playsinline
37857
38016
  ></video>` : b2`<div class="slides-bg-layer" style="${slideBgStyle}"></div>` : ""}
38017
+ ${slideBgEffect ? b2`<div class="slides-bgfx slides-bgfx-${slideBgEffect}"></div>` : ""}
37858
38018
  <div class="slides-content">
37859
38019
  ${this._slidesBridgeScript ? b2`<iframe
37860
38020
  class="slide-bridge-frame"
@@ -37865,7 +38025,8 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
37865
38025
  footerText,
37866
38026
  showPaginate ? `${idx + 1} / ${total}` : "",
37867
38027
  slideBg,
37868
- slideEffect
38028
+ slideEffect,
38029
+ slideBgEffect
37869
38030
  )}
37870
38031
  sandbox="allow-scripts allow-same-origin allow-popups"
37871
38032
  frameborder="0"
@@ -37943,8 +38104,6 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
37943
38104
  position: relative;
37944
38105
  border-radius: var(--radius-md, 8px);
37945
38106
  outline: none;
37946
- background: #1a1a2e;
37947
- color: #e5e5e5;
37948
38107
  font-family:
37949
38108
  system-ui,
37950
38109
  -apple-system,
@@ -37959,14 +38118,14 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
37959
38118
  display: flex;
37960
38119
  align-items: center;
37961
38120
  justify-content: center;
37962
- padding: 48px 64px;
38121
+ padding: clamp(24px, 4vw, 48px) clamp(32px, 5vw, 64px);
37963
38122
  overflow: hidden;
37964
38123
  position: relative;
37965
38124
  }
37966
38125
  .slides-container:fullscreen .slides-viewport {
37967
38126
  flex: 1;
37968
38127
  aspect-ratio: auto;
37969
- padding: 64px 120px;
38128
+ padding: clamp(32px, 5vh, 64px) clamp(48px, 8vw, 120px);
37970
38129
  }
37971
38130
  .slides-container:fullscreen .slides-viewport:has(.slide-bridge-frame) {
37972
38131
  padding: 0;
@@ -38021,26 +38180,26 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
38021
38180
  z-index: -1;
38022
38181
  }
38023
38182
  .slides-content h1 {
38024
- font-size: 2.4em;
38183
+ font-size: clamp(1.8rem, 5vw, 3.5rem);
38025
38184
  margin: 0 0 0.4em;
38026
38185
  font-weight: 800;
38027
38186
  letter-spacing: -0.02em;
38028
38187
  line-height: 1.15;
38029
38188
  }
38030
38189
  .slides-content h2 {
38031
- font-size: 1.8em;
38190
+ font-size: clamp(1.4rem, 3.5vw, 2.4rem);
38032
38191
  margin: 0 0 0.4em;
38033
38192
  font-weight: 700;
38034
38193
  letter-spacing: -0.01em;
38035
38194
  }
38036
38195
  .slides-content h3 {
38037
- font-size: 1.3em;
38196
+ font-size: clamp(1.1rem, 2.5vw, 1.6rem);
38038
38197
  margin: 0 0 0.3em;
38039
38198
  font-weight: 600;
38040
38199
  }
38041
38200
  .slides-content p {
38042
38201
  margin: 0.5em 0;
38043
- font-size: 1.15em;
38202
+ font-size: clamp(0.95rem, 1.8vw, 1.25rem);
38044
38203
  line-height: 1.65;
38045
38204
  }
38046
38205
  .slides-content ul,
@@ -38345,6 +38504,300 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
38345
38504
  background: #191a21;
38346
38505
  }
38347
38506
 
38507
+ /* ═══ AUTO THEME — inherits MCP client colors ═══ */
38508
+ .slides-theme-auto {
38509
+ background: var(--bg-panel, #1a1a2e);
38510
+ color: var(--t-primary, #e0e0e0);
38511
+ }
38512
+ .slides-theme-auto .slides-content h1,
38513
+ .slides-theme-auto .slides-content h2 {
38514
+ color: var(--accent, #6366f1);
38515
+ }
38516
+ .slides-theme-auto .slides-controls {
38517
+ background: var(--bg-glass, rgba(0, 0, 0, 0.4));
38518
+ }
38519
+
38520
+ /* ═══ NEON THEME ═══ */
38521
+ .slides-theme-neon {
38522
+ background: #0a0a1a;
38523
+ color: #e0e0ff;
38524
+ font-family: 'JetBrains Mono', var(--font-mono), monospace;
38525
+ }
38526
+ .slides-theme-neon .slides-content h1,
38527
+ .slides-theme-neon .slides-content h2 {
38528
+ color: #00f0ff;
38529
+ text-shadow:
38530
+ 0 0 10px rgba(0, 240, 255, 0.5),
38531
+ 0 0 40px rgba(0, 240, 255, 0.2);
38532
+ }
38533
+ .slides-theme-neon .slides-content blockquote {
38534
+ border-left: 3px solid #00f0ff;
38535
+ box-shadow: -4px 0 20px rgba(0, 240, 255, 0.15);
38536
+ }
38537
+ .slides-theme-neon .slides-content pre {
38538
+ border: 1px solid rgba(0, 240, 255, 0.2);
38539
+ box-shadow: 0 0 15px rgba(0, 240, 255, 0.1);
38540
+ }
38541
+ .slides-theme-neon .slides-viewport::after {
38542
+ content: '';
38543
+ position: absolute;
38544
+ inset: 0;
38545
+ pointer-events: none;
38546
+ background: repeating-linear-gradient(
38547
+ 0deg,
38548
+ transparent,
38549
+ transparent 2px,
38550
+ rgba(0, 240, 255, 0.015) 2px,
38551
+ rgba(0, 240, 255, 0.015) 4px
38552
+ );
38553
+ z-index: 2;
38554
+ }
38555
+ .slides-theme-neon .slides-controls {
38556
+ background: #050510;
38557
+ }
38558
+
38559
+ /* ═══ EDITORIAL THEME ═══ */
38560
+ .slides-theme-editorial,
38561
+ .slides-theme-editorial .slides-viewport {
38562
+ background: #faf8f5;
38563
+ color: #2c2c2c;
38564
+ font-family: Georgia, 'Times New Roman', serif;
38565
+ }
38566
+ .slides-theme-editorial .slides-content h1,
38567
+ .slides-theme-editorial .slides-content h2 {
38568
+ font-family: 'Cormorant Garamond', Georgia, serif;
38569
+ color: #1a1a1a;
38570
+ font-weight: 600;
38571
+ }
38572
+ .slides-theme-editorial .slides-content h1 {
38573
+ letter-spacing: -0.03em;
38574
+ }
38575
+ .slides-theme-editorial .slides-content p:first-of-type::first-letter {
38576
+ float: left;
38577
+ font-size: 3.4em;
38578
+ line-height: 0.8;
38579
+ padding-right: 8px;
38580
+ padding-top: 4px;
38581
+ font-weight: 700;
38582
+ color: #c0392b;
38583
+ font-family: 'Cormorant Garamond', Georgia, serif;
38584
+ }
38585
+ .slides-theme-editorial .slides-content blockquote {
38586
+ border-left: 2px solid #c0392b;
38587
+ font-style: italic;
38588
+ font-size: 1.15em;
38589
+ color: #555;
38590
+ }
38591
+ .slides-theme-editorial .slides-content hr {
38592
+ border: none;
38593
+ height: 1px;
38594
+ background: linear-gradient(to right, transparent, #ccc, transparent);
38595
+ margin: 1.5em 0;
38596
+ }
38597
+ .slides-theme-editorial .slides-controls {
38598
+ background: #f0ece6;
38599
+ color: #666;
38600
+ }
38601
+
38602
+ /* ═══ BOLD-SIGNAL THEME ═══ */
38603
+ .slides-theme-bold-signal {
38604
+ background: linear-gradient(135deg, #0f0c29, #1a1a3e, #24243e);
38605
+ color: #e8e8f0;
38606
+ font-family: 'Space Grotesk', var(--font-sans), sans-serif;
38607
+ }
38608
+ .slides-theme-bold-signal .slides-content h1 {
38609
+ color: #ff6b35;
38610
+ font-weight: 700;
38611
+ }
38612
+ .slides-theme-bold-signal .slides-content h2 {
38613
+ color: #ffd166;
38614
+ }
38615
+ .slides-theme-bold-signal .slides-content blockquote {
38616
+ background: rgba(255, 107, 53, 0.1);
38617
+ border-left: 4px solid #ff6b35;
38618
+ border-radius: 0 8px 8px 0;
38619
+ padding: 16px 20px;
38620
+ }
38621
+ .slides-theme-bold-signal .slides-controls {
38622
+ background: #0a0820;
38623
+ }
38624
+
38625
+ /* ═══ SWISS THEME ═══ */
38626
+ .slides-theme-swiss,
38627
+ .slides-theme-swiss .slides-viewport {
38628
+ background: #ffffff;
38629
+ color: #1a1a1a;
38630
+ font-family: 'Helvetica Neue', 'Inter', Arial, sans-serif;
38631
+ }
38632
+ .slides-theme-swiss .slides-viewport::before {
38633
+ content: '';
38634
+ position: absolute;
38635
+ inset: 0;
38636
+ pointer-events: none;
38637
+ background-image:
38638
+ linear-gradient(rgba(0, 0, 0, 0.04) 1px, transparent 1px),
38639
+ linear-gradient(90deg, rgba(0, 0, 0, 0.04) 1px, transparent 1px);
38640
+ background-size: 40px 40px;
38641
+ z-index: 0;
38642
+ }
38643
+ .slides-theme-swiss .slides-content {
38644
+ position: relative;
38645
+ z-index: 1;
38646
+ }
38647
+ .slides-theme-swiss .slides-content h1 {
38648
+ color: #e63946;
38649
+ text-transform: uppercase;
38650
+ letter-spacing: 0.05em;
38651
+ font-weight: 900;
38652
+ }
38653
+ .slides-theme-swiss .slides-content h2 {
38654
+ color: #1d3557;
38655
+ font-weight: 700;
38656
+ }
38657
+ .slides-theme-swiss .slides-controls {
38658
+ background: #f1f1f1;
38659
+ color: #333;
38660
+ }
38661
+
38662
+ /* ═══ NOTEBOOK THEME ═══ */
38663
+ .slides-theme-notebook {
38664
+ background: #1a1a2e;
38665
+ color: #3c3c3c;
38666
+ }
38667
+ .slides-theme-notebook .slides-viewport {
38668
+ background: #fdf6e3;
38669
+ border-radius: 8px;
38670
+ margin: 12px;
38671
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);
38672
+ border-left: 5px solid #e74c3c;
38673
+ }
38674
+ .slides-theme-notebook .slides-content h1,
38675
+ .slides-theme-notebook .slides-content h2 {
38676
+ font-family: 'Caveat', cursive, sans-serif;
38677
+ color: #2c3e50;
38678
+ }
38679
+ .slides-theme-notebook .slides-content h1 {
38680
+ font-size: clamp(2rem, 6vw, 4rem);
38681
+ }
38682
+ .slides-theme-notebook .slides-controls {
38683
+ background: #f5edd6;
38684
+ color: #666;
38685
+ }
38686
+
38687
+ /* ═══ MOOD KEYFRAMES ═══ */
38688
+ @keyframes mood-dramatic {
38689
+ from {
38690
+ opacity: 0;
38691
+ transform: scale(0.95) translateY(10px);
38692
+ }
38693
+ to {
38694
+ opacity: 1;
38695
+ transform: none;
38696
+ }
38697
+ }
38698
+ @keyframes mood-techy {
38699
+ 0% {
38700
+ opacity: 0;
38701
+ transform: translateY(8px);
38702
+ filter: blur(4px);
38703
+ }
38704
+ 50% {
38705
+ opacity: 1;
38706
+ filter: blur(0);
38707
+ }
38708
+ 100% {
38709
+ transform: none;
38710
+ }
38711
+ }
38712
+ @keyframes mood-playful {
38713
+ 0% {
38714
+ opacity: 0;
38715
+ transform: translateY(20px);
38716
+ }
38717
+ 60% {
38718
+ transform: translateY(-4px);
38719
+ }
38720
+ 80% {
38721
+ transform: translateY(2px);
38722
+ }
38723
+ 100% {
38724
+ opacity: 1;
38725
+ transform: none;
38726
+ }
38727
+ }
38728
+ @keyframes mood-calm {
38729
+ from {
38730
+ opacity: 0;
38731
+ }
38732
+ to {
38733
+ opacity: 1;
38734
+ }
38735
+ }
38736
+
38737
+ /* ═══ BACKGROUND EFFECTS ═══ */
38738
+ .slides-bgfx {
38739
+ position: absolute;
38740
+ inset: 0;
38741
+ pointer-events: none;
38742
+ z-index: 0;
38743
+ }
38744
+ .slides-bgfx-gradient-mesh {
38745
+ background:
38746
+ radial-gradient(ellipse at 20% 50%, rgba(120, 80, 255, 0.15) 0%, transparent 50%),
38747
+ radial-gradient(ellipse at 80% 20%, rgba(255, 100, 80, 0.12) 0%, transparent 50%),
38748
+ radial-gradient(ellipse at 50% 80%, rgba(80, 200, 255, 0.1) 0%, transparent 50%);
38749
+ animation: bgfx-drift 12s ease-in-out infinite alternate;
38750
+ }
38751
+ @keyframes bgfx-drift {
38752
+ 0% {
38753
+ transform: translate(0, 0) scale(1);
38754
+ }
38755
+ 50% {
38756
+ transform: translate(5%, -3%) scale(1.05);
38757
+ }
38758
+ 100% {
38759
+ transform: translate(-3%, 4%) scale(1.02);
38760
+ }
38761
+ }
38762
+ .slides-bgfx-noise {
38763
+ opacity: 0.06;
38764
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
38765
+ }
38766
+ .slides-bgfx-grid {
38767
+ background-image:
38768
+ linear-gradient(rgba(255, 255, 255, 0.05) 1px, transparent 1px),
38769
+ linear-gradient(90deg, rgba(255, 255, 255, 0.05) 1px, transparent 1px);
38770
+ background-size: 32px 32px;
38771
+ }
38772
+ .slides-bgfx-particles::before,
38773
+ .slides-bgfx-particles::after {
38774
+ content: '';
38775
+ position: absolute;
38776
+ width: 4px;
38777
+ height: 4px;
38778
+ border-radius: 50%;
38779
+ background: rgba(255, 255, 255, 0.2);
38780
+ box-shadow:
38781
+ 40px 80px 0 rgba(255, 255, 255, 0.15),
38782
+ 120px 40px 0 rgba(255, 255, 255, 0.1),
38783
+ 200px 120px 0 rgba(255, 255, 255, 0.12),
38784
+ 300px 60px 0 rgba(255, 255, 255, 0.08),
38785
+ 400px 140px 0 rgba(255, 255, 255, 0.15);
38786
+ animation: bgfx-float 8s ease-in-out infinite alternate;
38787
+ }
38788
+ .slides-bgfx-particles::after {
38789
+ animation-delay: -4s;
38790
+ animation-direction: alternate-reverse;
38791
+ }
38792
+ @keyframes bgfx-float {
38793
+ from {
38794
+ transform: translateY(0);
38795
+ }
38796
+ to {
38797
+ transform: translateY(-15px);
38798
+ }
38799
+ }
38800
+
38348
38801
  /* ═══ VIEW TRANSITIONS ═══ */
38349
38802
  .slides-content {
38350
38803
  view-transition-name: slide-content;
@@ -38660,11 +39113,14 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
38660
39113
  { once: true }
38661
39114
  );
38662
39115
  }
38663
- /** Trigger stagger-in animation on slide content children after transition.
38664
- * Uses the universal data-enter attribute from the motion system. */
38665
39116
  _slidesStaggerIn() {
38666
- const slideEffect = this._slidesEffects.get(this._slidesCurrentIndex) || "";
38667
- const enterValue = ResultViewer._EFFECT_MAP[slideEffect] || (slideEffect ? slideEffect : "slide-up");
39117
+ const idx = this._slidesCurrentIndex;
39118
+ const mood = this._slidesMoods.get(idx) || this._slidesGlobalMood;
39119
+ const moodCfg = ResultViewer._MOOD_CONFIG[mood];
39120
+ const slideEffect = this._slidesEffects.get(idx) || "";
39121
+ const enterValue = moodCfg ? moodCfg.enter : ResultViewer._EFFECT_MAP[slideEffect] || (slideEffect ? slideEffect : "slide-up");
39122
+ const delayMs = moodCfg?.delayMs ?? 60;
39123
+ const durationMs = moodCfg?.durationMs ?? 300;
38668
39124
  const CHILD_SELECTOR = ":scope > h1, :scope > h2, :scope > h3, :scope > p, :scope > ul, :scope > ol, :scope > table, :scope > blockquote, :scope > pre, :scope > div:not(.slide-header):not(.slide-footer), :scope > figure, :scope > img, :scope > .slide-content-area";
38669
39125
  const applyToChildren = (container) => {
38670
39126
  const children = container.querySelectorAll(CHILD_SELECTOR);
@@ -38673,7 +39129,8 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
38673
39129
  htmlEl.removeAttribute("data-enter");
38674
39130
  void htmlEl.offsetWidth;
38675
39131
  htmlEl.setAttribute("data-enter", enterValue);
38676
- htmlEl.style.animationDelay = `${i7 * 60}ms`;
39132
+ htmlEl.style.animationDelay = `${i7 * delayMs}ms`;
39133
+ htmlEl.style.animationDuration = `${durationMs}ms`;
38677
39134
  });
38678
39135
  };
38679
39136
  const iframe = this.shadowRoot?.querySelector(".slide-bridge-frame");
@@ -38693,6 +39150,97 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
38693
39150
  const content2 = this.shadowRoot?.querySelector(".slides-content");
38694
39151
  if (content2) applyToChildren(content2);
38695
39152
  }
39153
+ _slidesApplyTextEffect() {
39154
+ const effect = this._slidesEffects.get(this._slidesCurrentIndex) || "";
39155
+ if (!ResultViewer._PRETEXT_EFFECTS.has(effect)) return;
39156
+ const content2 = this.shadowRoot?.querySelector(".slides-content");
39157
+ if (!content2) return;
39158
+ const heading2 = content2.querySelector("h1, h2");
39159
+ if (!heading2) return;
39160
+ const text = heading2.textContent || "";
39161
+ if (!text) return;
39162
+ switch (effect) {
39163
+ case "typing": {
39164
+ heading2.textContent = "";
39165
+ heading2.style.borderRight = "2px solid currentColor";
39166
+ let i7 = 0;
39167
+ const type = () => {
39168
+ if (i7 < text.length) {
39169
+ heading2.textContent += text[i7];
39170
+ i7++;
39171
+ requestAnimationFrame(() => setTimeout(type, 40 + Math.random() * 30));
39172
+ } else {
39173
+ setTimeout(() => {
39174
+ heading2.style.borderRight = "none";
39175
+ }, 800);
39176
+ }
39177
+ };
39178
+ setTimeout(type, 200);
39179
+ break;
39180
+ }
39181
+ case "scramble": {
39182
+ const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@#$%&";
39183
+ const revealed = new Array(text.length).fill(false);
39184
+ let iterations = 0;
39185
+ const scramble = () => {
39186
+ let display = "";
39187
+ for (let j2 = 0; j2 < text.length; j2++) {
39188
+ if (revealed[j2] || text[j2] === " ") {
39189
+ display += text[j2];
39190
+ } else {
39191
+ display += chars[Math.floor(Math.random() * chars.length)];
39192
+ }
39193
+ }
39194
+ heading2.textContent = display;
39195
+ if (iterations > 5) {
39196
+ const unrevealed = revealed.map((r7, idx) => !r7 && text[idx] !== " " ? idx : -1).filter((x3) => x3 >= 0);
39197
+ if (unrevealed.length > 0) {
39198
+ const pick2 = unrevealed[Math.floor(Math.random() * unrevealed.length)];
39199
+ revealed[pick2] = true;
39200
+ }
39201
+ }
39202
+ iterations++;
39203
+ if (revealed.some((r7) => !r7) && revealed.filter((r7) => r7).length < text.length) {
39204
+ requestAnimationFrame(scramble);
39205
+ } else {
39206
+ heading2.textContent = text;
39207
+ }
39208
+ };
39209
+ setTimeout(scramble, 200);
39210
+ break;
39211
+ }
39212
+ case "wave": {
39213
+ heading2.innerHTML = "";
39214
+ const chars = text.split("");
39215
+ chars.forEach((char, i7) => {
39216
+ const span = document.createElement("span");
39217
+ span.textContent = char === " " ? "\xA0" : char;
39218
+ span.style.display = "inline-block";
39219
+ span.style.animation = `mood-playful 0.5s ease ${i7 * 30}ms both`;
39220
+ heading2.appendChild(span);
39221
+ });
39222
+ break;
39223
+ }
39224
+ case "fly-in": {
39225
+ heading2.innerHTML = "";
39226
+ const words = text.split(" ");
39227
+ words.forEach((word, i7) => {
39228
+ const span = document.createElement("span");
39229
+ span.textContent = word + " ";
39230
+ span.style.display = "inline-block";
39231
+ span.style.opacity = "0";
39232
+ span.style.transform = `translate(${(Math.random() - 0.5) * 200}px, ${(Math.random() - 0.5) * 100}px)`;
39233
+ span.style.transition = `all 0.6s cubic-bezier(0.16, 1, 0.3, 1) ${i7 * 80}ms`;
39234
+ heading2.appendChild(span);
39235
+ requestAnimationFrame(() => {
39236
+ span.style.opacity = "1";
39237
+ span.style.transform = "none";
39238
+ });
39239
+ });
39240
+ break;
39241
+ }
39242
+ }
39243
+ }
38696
39244
  /** Advance the next hidden build fragment. Returns true if a fragment was revealed. */
38697
39245
  _slidesAdvanceBuild() {
38698
39246
  const hasBuild = this._slidesBuilds.get(this._slidesCurrentIndex);
@@ -38757,6 +39305,7 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
38757
39305
  this._afterSlideRender();
38758
39306
  }
38759
39307
  this._slidesStaggerIn();
39308
+ this._slidesApplyTextEffect();
38760
39309
  };
38761
39310
  if (transition === "none" || !("startViewTransition" in document) || this._slidesBridgeScript) {
38762
39311
  this._slidesCurrentIndex = newIndex;
@@ -39632,7 +40181,116 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
39632
40181
  </div>
39633
40182
  `;
39634
40183
  }
39635
- // ── Article Renderer (Pretext-powered magazine layout) ──
40184
+ // ── Guide Renderer — horizontal stepper for multi-step flows ──
40185
+ _renderGuide(data) {
40186
+ const steps2 = Array.isArray(data) ? data : [];
40187
+ if (steps2.length === 0) {
40188
+ return b2`<div class="empty-state">No steps</div>`;
40189
+ }
40190
+ return b2`
40191
+ <div
40192
+ style="display: flex; align-items: flex-start; gap: 0; padding: 16px 8px; overflow-x: auto;"
40193
+ >
40194
+ ${steps2.map((step, i7) => {
40195
+ const status = step.status || "pending";
40196
+ const isDone = status === "done";
40197
+ const isActive = status === "active";
40198
+ const circleColor = isDone ? "var(--accent-primary, #3b82f6)" : isActive ? "var(--accent-primary, #3b82f6)" : "var(--bg-tertiary, #374151)";
40199
+ const circleBorder = isActive ? "2px solid var(--accent-primary, #3b82f6)" : "none";
40200
+ const circleText = isDone ? "#fff" : isActive ? "var(--accent-primary, #3b82f6)" : "var(--t-muted, #9ca3af)";
40201
+ const circleBg = isDone ? circleColor : isActive ? "transparent" : circleColor;
40202
+ const labelColor = isDone || isActive ? "var(--t-primary, #f5f5f5)" : "var(--t-muted, #9ca3af)";
40203
+ const lineColor = isDone ? "var(--accent-primary, #3b82f6)" : "var(--bg-tertiary, #374151)";
40204
+ return b2`
40205
+ <div style="display: flex; align-items: flex-start; flex: 1; min-width: 0;">
40206
+ <div
40207
+ style="display: flex; flex-direction: column; align-items: center; flex-shrink: 0; width: 100%;"
40208
+ >
40209
+ <div
40210
+ style="
40211
+ width: 28px; height: 28px; border-radius: 50%;
40212
+ background: ${circleBg}; border: ${circleBorder};
40213
+ display: flex; align-items: center; justify-content: center;
40214
+ font-size: 12px; font-weight: 600; color: ${circleText};
40215
+ transition: all 0.2s ease;
40216
+ "
40217
+ >
40218
+ ${isDone ? b2`<svg
40219
+ width="14"
40220
+ height="14"
40221
+ viewBox="0 0 12 12"
40222
+ fill="none"
40223
+ stroke="currentColor"
40224
+ stroke-width="2"
40225
+ stroke-linecap="round"
40226
+ >
40227
+ <path d="M2.5 6l2.5 2.5 4.5-5" />
40228
+ </svg>` : i7 + 1}
40229
+ </div>
40230
+ <div
40231
+ style="margin-top: 6px; font-size: 12px; font-weight: ${isActive ? "600" : "500"}; color: ${labelColor}; text-align: center; line-height: 1.3; padding: 0 4px;"
40232
+ >
40233
+ ${step.label}
40234
+ </div>
40235
+ ${step.detail ? b2`<div
40236
+ style="margin-top: 2px; font-size: 11px; color: var(--t-muted, #9ca3af); text-align: center; padding: 0 4px;"
40237
+ >
40238
+ ${step.detail}
40239
+ </div>` : ""}
40240
+ </div>
40241
+ ${i7 < steps2.length - 1 ? b2`<div
40242
+ style="
40243
+ position: relative; top: 14px;
40244
+ flex: 1; height: 2px; min-width: 20px;
40245
+ background: ${lineColor};
40246
+ transition: background 0.2s ease;
40247
+ "
40248
+ ></div>` : ""}
40249
+ </div>
40250
+ `;
40251
+ })}
40252
+ </div>
40253
+ `;
40254
+ }
40255
+ // ── Magazine Renderer — markdown-powered multi-column layout ──
40256
+ _renderMagazine(data) {
40257
+ const text = typeof data === "string" ? data : data?.text || "";
40258
+ const images = (typeof data === "object" && !Array.isArray(data) ? data?.images : null) || [];
40259
+ if (!text) {
40260
+ return b2`<div class="empty-state">No content</div>`;
40261
+ }
40262
+ const columnCount = Math.min(4, Math.max(1, parseInt(this.layoutHints?.columns || "2", 10)));
40263
+ const marked2 = window.marked;
40264
+ if (!marked2) return this._renderText(text);
40265
+ const { html: bodyHtml, mermaidBlocks, codeBlocks } = this._parseRichMarkdown(text);
40266
+ const effectiveCols = columnCount;
40267
+ let finalHtml = bodyHtml;
40268
+ if (images.length > 0) {
40269
+ const paragraphs = finalHtml.split(/(?=<(?:p|h[23456]|blockquote)[\s>])/i);
40270
+ const interval = Math.max(2, Math.floor(paragraphs.length / (images.length + 1)));
40271
+ for (let i7 = images.length - 1; i7 >= 0; i7--) {
40272
+ const img = images[i7];
40273
+ const pos = img.position || (i7 % 2 === 0 ? "right" : "left");
40274
+ const maxW = pos === "full" ? "100%" : img.width ? Math.min(img.width, 280) + "px" : "280px";
40275
+ const imgHtml = `<div class="magazine-float ${pos}" style="max-width:${maxW}"><img src="${img.url}" alt="" loading="lazy" />${img.caption ? `<div class="caption">${img.caption}</div>` : ""}</div>`;
40276
+ const insertIdx = Math.min((i7 + 1) * interval, paragraphs.length - 1);
40277
+ paragraphs.splice(insertIdx, 0, imgHtml);
40278
+ }
40279
+ finalHtml = paragraphs.join("");
40280
+ }
40281
+ if (mermaidBlocks.length > 0) {
40282
+ this._pendingMermaidBlocks = mermaidBlocks;
40283
+ }
40284
+ if (codeBlocks.length > 0) {
40285
+ this._pendingCodeBlocks = codeBlocks;
40286
+ }
40287
+ return b2`
40288
+ <div class="magazine-layout markdown-content" style="column-count: ${effectiveCols}">
40289
+ ${o5(finalHtml)}
40290
+ </div>
40291
+ `;
40292
+ }
40293
+ // ── Legacy Article Renderer (kept for backward compat, delegates to magazine) ──
39636
40294
  _renderArticle(data) {
39637
40295
  if (!data || typeof data.text !== "string") {
39638
40296
  return b2`<div class="empty-state">No article content</div>`;
@@ -40612,23 +41270,20 @@ ${str}</pre
40612
41270
  `;
40613
41271
  }
40614
41272
  return b2`
40615
- <div style="max-height: 200px; overflow-y: auto; font-size: 0.85rem;">
40616
- ${value.slice(0, 5).map(
41273
+ <div class="dash-mini-list" style="max-height: 200px; overflow-y: auto;">
41274
+ <table style="width:100%; border-collapse:collapse; font-size:12px;">
41275
+ ${value.slice(0, 5).map(
40617
41276
  (item) => b2`
40618
- <div
40619
- style="padding: 6px 8px; border-bottom: 1px solid var(--border-glass); display:flex; gap:8px;"
40620
- >
40621
- ${Object.entries(item).slice(0, 3).map(
40622
- ([, v2]) => b2`<span
40623
- style="flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;"
40624
- >${String(v2)}</span
40625
- >`
41277
+ <tr style="border-bottom: 1px solid var(--border-glass);">
41278
+ ${Object.entries(item).slice(0, 5).map(
41279
+ ([, v2]) => b2`<td style="padding:5px 6px; white-space:nowrap;">${String(v2)}</td>`
40626
41280
  )}
40627
- </div>
40628
- `
41281
+ </tr>
41282
+ `
40629
41283
  )}
41284
+ </table>
40630
41285
  ${value.length > 5 ? b2`<div
40631
- style="padding:6px 8px;color:var(--t-muted);text-align:center;font-style:italic;"
41286
+ style="padding:6px 8px;color:var(--t-muted);text-align:center;font-style:italic;font-size:12px;"
40632
41287
  >
40633
41288
  +${value.length - 5} more
40634
41289
  </div>` : ""}
@@ -41805,6 +42460,115 @@ ResultViewer.styles = [
41805
42460
  animation: article-fade-in 0.3s ease both;
41806
42461
  }
41807
42462
 
42463
+ /* Magazine: override flex/height constraints so CSS columns work */
42464
+ .container:has(.magazine-layout) {
42465
+ display: block;
42466
+ height: auto;
42467
+ overflow: auto;
42468
+ }
42469
+
42470
+ .container:has(.magazine-layout) > .content {
42471
+ flex: none;
42472
+ overflow: visible;
42473
+ }
42474
+
42475
+ /* Magazine Layout — markdown-powered multi-column */
42476
+ .magazine-layout {
42477
+ line-height: 1.7;
42478
+ font-size: 15px;
42479
+ color: var(--t-primary);
42480
+ column-gap: 32px;
42481
+ column-rule: 1px solid color-mix(in srgb, var(--border-glass) 50%, transparent);
42482
+ animation: article-fade-in 0.3s ease both;
42483
+ }
42484
+
42485
+ .magazine-layout h1 {
42486
+ column-span: all;
42487
+ margin-top: 0.6em;
42488
+ margin-bottom: 0.3em;
42489
+ }
42490
+
42491
+ .magazine-layout h1:first-child {
42492
+ margin-top: 0;
42493
+ }
42494
+
42495
+ .magazine-layout h2 {
42496
+ margin-top: 0.8em;
42497
+ margin-bottom: 0.3em;
42498
+ break-after: avoid;
42499
+ }
42500
+
42501
+ .magazine-layout > p:first-of-type::first-letter {
42502
+ float: left;
42503
+ font-size: 3.2em;
42504
+ line-height: 0.8;
42505
+ padding-right: 8px;
42506
+ padding-top: 4px;
42507
+ font-weight: 600;
42508
+ color: var(--accent);
42509
+ }
42510
+
42511
+ .magazine-float {
42512
+ break-inside: avoid;
42513
+ margin-bottom: 12px;
42514
+ border-radius: var(--radius-sm);
42515
+ overflow: hidden;
42516
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
42517
+ }
42518
+
42519
+ .magazine-float.left {
42520
+ float: left;
42521
+ margin: 0 20px 12px 0;
42522
+ max-width: 45%;
42523
+ shape-outside: margin-box;
42524
+ }
42525
+
42526
+ .magazine-float.right {
42527
+ float: right;
42528
+ margin: 0 0 12px 20px;
42529
+ max-width: 45%;
42530
+ shape-outside: margin-box;
42531
+ }
42532
+
42533
+ .magazine-float.full {
42534
+ column-span: all;
42535
+ width: 100%;
42536
+ float: none;
42537
+ margin: 1em 0;
42538
+ }
42539
+
42540
+ .magazine-float img {
42541
+ width: 100%;
42542
+ display: block;
42543
+ }
42544
+
42545
+ .magazine-float .caption {
42546
+ padding: 6px 10px;
42547
+ font-size: 11px;
42548
+ font-style: italic;
42549
+ color: var(--t-muted);
42550
+ background: var(--bg-glass);
42551
+ }
42552
+
42553
+ .magazine-layout p,
42554
+ .magazine-layout blockquote,
42555
+ .magazine-layout ul,
42556
+ .magazine-layout ol,
42557
+ .magazine-layout pre {
42558
+ break-inside: avoid;
42559
+ }
42560
+
42561
+ .magazine-layout blockquote {
42562
+ border-left: 3px solid var(--accent);
42563
+ padding-left: 16px;
42564
+ margin: 0.8em 0;
42565
+ color: var(--t-secondary);
42566
+ }
42567
+
42568
+ .magazine-layout pre {
42569
+ column-span: all;
42570
+ }
42571
+
41808
42572
  .status-badge {
41809
42573
  padding: 2px 8px;
41810
42574
  border-radius: var(--radius-full);
@@ -42984,6 +43748,8 @@ ResultViewer.styles = [
42984
43748
  border: 1px solid var(--border-glass);
42985
43749
  border-radius: var(--radius-md);
42986
43750
  overflow: hidden;
43751
+ display: flex;
43752
+ flex-direction: column;
42987
43753
  }
42988
43754
 
42989
43755
  .dashboard-panel-header {
@@ -42997,11 +43763,25 @@ ResultViewer.styles = [
42997
43763
  }
42998
43764
 
42999
43765
  .dashboard-panel-content {
43000
- padding: var(--space-xs);
43766
+ padding: var(--space-sm);
43001
43767
  display: flex;
43768
+ flex-direction: column;
43002
43769
  align-items: center;
43003
43770
  justify-content: center;
43004
43771
  text-align: center;
43772
+ flex: 1;
43773
+ min-height: 120px;
43774
+ }
43775
+
43776
+ /* Metrics center their big number + label */
43777
+ .dashboard-panel-content > .metric-card,
43778
+ .dashboard-panel-content > .gauge-container {
43779
+ display: flex;
43780
+ flex-direction: column;
43781
+ align-items: center;
43782
+ justify-content: center;
43783
+ width: 100%;
43784
+ flex: 1;
43005
43785
  }
43006
43786
 
43007
43787
  .dashboard-panel .chart-container {
@@ -43012,8 +43792,11 @@ ResultViewer.styles = [
43012
43792
  align-items: center;
43013
43793
  }
43014
43794
 
43015
- .dashboard-panel .table-wrapper {
43795
+ /* Tables and lists take full width, left-aligned */
43796
+ .dashboard-panel .table-wrapper,
43797
+ .dashboard-panel .dash-mini-list {
43016
43798
  width: 100%;
43799
+ text-align: left;
43017
43800
  }
43018
43801
 
43019
43802
  .dashboard-panel .chart-container canvas {
@@ -43022,11 +43805,14 @@ ResultViewer.styles = [
43022
43805
  }
43023
43806
 
43024
43807
  .dashboard-panel .metric-container {
43025
- padding: var(--space-xs);
43808
+ padding: var(--space-md);
43809
+ flex: 1;
43810
+ justify-content: center;
43026
43811
  }
43027
43812
 
43028
43813
  .dashboard-panel .metric-value {
43029
- font-size: var(--text-3xl);
43814
+ font-size: 2rem;
43815
+ font-weight: 700;
43030
43816
  }
43031
43817
 
43032
43818
  /* ═══════════════════════════════════════════════════════════════
@@ -43328,6 +44114,52 @@ ResultViewer._TIMESTAMP_FIELDS = [
43328
44114
  // ReactiveArray auto-stamp (fallback for creation)
43329
44115
  ];
43330
44116
  // Map slide effect directives to universal motion data-enter values
44117
+ // Shared theme CSS injected into both shadow DOM styles and bridge srcdoc
44118
+ ResultViewer._BRIDGE_THEME_CSS = `
44119
+ .slides-theme-default { background: #1a1a2e; color: #e6e6e6; }
44120
+ .slides-theme-default h1, .slides-theme-default h2 { color: #a5b4fc; }
44121
+ .slides-theme-uncover { background: #f8f8f8; color: #333; }
44122
+ .slides-theme-uncover h1, .slides-theme-uncover h2 { color: #1a1a1a; }
44123
+ .slides-theme-gaia { background: #1a472a; color: #e0f0e0; }
44124
+ .slides-theme-gaia h1, .slides-theme-gaia h2 { color: #66bb6a; }
44125
+ .slides-theme-rose { background: #2d1b2e; color: #f0e0e8; }
44126
+ .slides-theme-rose h1, .slides-theme-rose h2 { color: #f48fb1; }
44127
+ .slides-theme-dracula { background: #282a36; color: #f8f8f2; }
44128
+ .slides-theme-dracula h1, .slides-theme-dracula h2 { color: #bd93f9; }
44129
+ .slides-theme-auto { background: var(--bg-panel, #1a1a2e); color: var(--t-primary, #e0e0e0); }
44130
+ .slides-theme-auto h1, .slides-theme-auto h2 { color: var(--accent, #6366f1); }
44131
+ .slides-theme-neon { background: #0a0a1a; color: #e0e0ff; font-family: 'JetBrains Mono', monospace; }
44132
+ .slides-theme-neon h1, .slides-theme-neon h2 { color: #00f0ff; text-shadow: 0 0 10px rgba(0,240,255,0.5), 0 0 40px rgba(0,240,255,0.2); }
44133
+ .slides-theme-editorial { background: #faf8f5; color: #2c2c2c; font-family: Georgia, 'Times New Roman', serif; }
44134
+ .slides-theme-editorial h1, .slides-theme-editorial h2 { font-family: 'Cormorant Garamond', Georgia, serif; color: #1a1a1a; }
44135
+ .slides-theme-bold-signal { background: linear-gradient(135deg, #0f0c29, #1a1a3e, #24243e); color: #e8e8f0; font-family: 'Space Grotesk', sans-serif; }
44136
+ .slides-theme-bold-signal h1 { color: #ff6b35; }
44137
+ .slides-theme-bold-signal h2 { color: #ffd166; }
44138
+ .slides-theme-swiss { background: #ffffff; color: #1a1a1a; font-family: 'Helvetica Neue', 'Inter', Arial, sans-serif; }
44139
+ .slides-theme-swiss h1 { color: #e63946; text-transform: uppercase; letter-spacing: 0.05em; }
44140
+ .slides-theme-swiss h2 { color: #1d3557; }
44141
+ .slides-theme-notebook { background: #1a1a2e; color: #3c3c3c; }
44142
+ .slides-theme-notebook .slide-canvas { background: #fdf6e3; border-left: 5px solid #e74c3c; border-radius: 8px; }
44143
+ .slides-theme-notebook h1, .slides-theme-notebook h2 { font-family: 'Caveat', cursive; color: #2c3e50; }
44144
+ @keyframes mood-dramatic { from { opacity: 0; transform: scale(0.95) translateY(10px); } to { opacity: 1; transform: none; } }
44145
+ @keyframes mood-techy { 0% { opacity: 0; transform: translateY(8px); filter: blur(4px); } 50% { opacity: 1; filter: blur(0); } 100% { transform: none; } }
44146
+ @keyframes mood-playful { 0% { opacity: 0; transform: translateY(20px); } 60% { transform: translateY(-4px); } 80% { transform: translateY(2px); } 100% { opacity: 1; transform: none; } }
44147
+ @keyframes mood-calm { from { opacity: 0; } to { opacity: 1; } }
44148
+ @keyframes bgdrift { 0% { transform: translate(0,0) scale(1); } 50% { transform: translate(5%,-3%) scale(1.05); } 100% { transform: translate(-3%,4%) scale(1.02); } }
44149
+ .slides-theme-neon body::after { content: ''; position: fixed; inset: 0; pointer-events: none; background: repeating-linear-gradient(0deg, transparent, transparent 2px, rgba(0,240,255,0.015) 2px, rgba(0,240,255,0.015) 4px); z-index: 100; }
44150
+ .slides-theme-neon .slide-body blockquote { border-left: 3px solid #00f0ff; box-shadow: -4px 0 20px rgba(0,240,255,0.15); }
44151
+ .slides-theme-neon .slide-body pre { border: 1px solid rgba(0,240,255,0.2); box-shadow: 0 0 15px rgba(0,240,255,0.1); }
44152
+ .slides-theme-editorial .slide-body p:first-of-type::first-letter { float: left; font-size: 3.4em; line-height: 0.8; padding-right: 8px; padding-top: 4px; font-weight: 700; color: #c0392b; font-family: 'Cormorant Garamond', Georgia, serif; }
44153
+ .slides-theme-editorial .slide-body blockquote { border-left: 2px solid #c0392b; font-style: italic; color: #555; }
44154
+ .slides-theme-bold-signal .slide-body blockquote { background: rgba(255,107,53,0.1); border-left: 4px solid #ff6b35; border-radius: 0 8px 8px 0; padding: 16px 20px; }
44155
+ .slides-theme-swiss body::before { content: ''; position: fixed; inset: 0; pointer-events: none; background-image: linear-gradient(rgba(0,0,0,0.04) 1px, transparent 1px), linear-gradient(90deg, rgba(0,0,0,0.04) 1px, transparent 1px); background-size: 40px 40px; z-index: 0; }
44156
+ `;
44157
+ // Google Fonts per theme
44158
+ ResultViewer._THEME_FONTS = {
44159
+ editorial: "Cormorant+Garamond:wght@400;600;700",
44160
+ "bold-signal": "Space+Grotesk:wght@500;700",
44161
+ notebook: "Caveat:wght@400;700"
44162
+ };
43331
44163
  ResultViewer._EFFECT_MAP = {
43332
44164
  "fade-up": "slide-up",
43333
44165
  "fade-down": "slide-down",
@@ -43346,6 +44178,18 @@ ResultViewer._EFFECT_MAP = {
43346
44178
  "scale-up": "scale-up",
43347
44179
  "flip-in": "flip-in"
43348
44180
  };
44181
+ /** Trigger stagger-in animation on slide content children after transition.
44182
+ * Uses the universal data-enter attribute from the motion system. */
44183
+ // Mood → animation config
44184
+ ResultViewer._MOOD_CONFIG = {
44185
+ dramatic: { enter: "mood-dramatic", delayMs: 100, durationMs: 600 },
44186
+ techy: { enter: "mood-techy", delayMs: 40, durationMs: 300 },
44187
+ playful: { enter: "mood-playful", delayMs: 80, durationMs: 400 },
44188
+ professional: { enter: "fade-in", delayMs: 30, durationMs: 200 },
44189
+ calm: { enter: "mood-calm", delayMs: 120, durationMs: 800 }
44190
+ };
44191
+ // Pretext-powered text effects: typing, scramble, wave, fly-in
44192
+ ResultViewer._PRETEXT_EFFECTS = /* @__PURE__ */ new Set(["typing", "scramble", "wave", "fly-in"]);
43349
44193
  __decorateClass([
43350
44194
  n4({ type: Object })
43351
44195
  ], ResultViewer.prototype, "result", 2);
@@ -92087,6 +92931,12 @@ function buildPhotonDocblockTagCatalog(runtimeVersion) {
92087
92931
  apply: "@stateful true",
92088
92932
  type: "keyword"
92089
92933
  },
92934
+ {
92935
+ label: "@channel",
92936
+ detail: "Channel support \u2014 sends messages into client conversations (e.g. @channel claude)",
92937
+ apply: "@channel claude",
92938
+ type: "keyword"
92939
+ },
92090
92940
  {
92091
92941
  label: "@idleTimeout",
92092
92942
  detail: "Idle timeout in ms",
@@ -96086,6 +96936,7 @@ var ElicitationModal = class extends i4 {
96086
96936
  case "confirm":
96087
96937
  return this._renderConfirm();
96088
96938
  case "oauth":
96939
+ case "url":
96089
96940
  return this._renderOAuth();
96090
96941
  case "form":
96091
96942
  return this._renderForm();
@@ -96270,17 +97121,19 @@ var ElicitationModal = class extends i4 {
96270
97121
  };
96271
97122
  const provider = this.data?.provider || "OAuth";
96272
97123
  const icon2 = providerIcons[provider.toLowerCase()] || providerIcons.default;
96273
- const scopes = (this.data?.scopes || []).join(", ") || "basic access";
97124
+ const scopes = (this.data?.scopes || []).join(", ");
97125
+ const customMessage = this.data?.message;
97126
+ const buttonLabel = customMessage ? "Open" : `Authorize ${provider}`;
96274
97127
  return b2`
96275
97128
  <div class="oauth-content">
96276
97129
  <div class="oauth-icon">${icon2}</div>
96277
- <p class="oauth-message">Authorization is required to access ${provider}.</p>
96278
- <p class="oauth-scopes">Requested permissions: ${scopes}</p>
97130
+ <p class="oauth-message">
97131
+ ${customMessage || `Authorization is required to access ${provider}.`}
97132
+ </p>
97133
+ ${scopes ? b2`<p class="oauth-scopes">Requested permissions: ${scopes}</p>` : ""}
96279
97134
  <div class="actions" style="justify-content: center;">
96280
97135
  <button class="btn-secondary" @click=${() => this._cancel()}>Cancel</button>
96281
- <button class="btn-primary" @click=${() => this._startOAuth()}>
96282
- Authorize ${provider}
96283
- </button>
97136
+ <button class="btn-primary" @click=${() => this._startOAuth()}>${buttonLabel}</button>
96284
97137
  </div>
96285
97138
  </div>
96286
97139
  `;