@portel/photon 1.18.0 → 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 (172) hide show
  1. package/dist/auto-ui/beam.d.ts.map +1 -1
  2. package/dist/auto-ui/beam.js +14 -4
  3. package/dist/auto-ui/beam.js.map +1 -1
  4. package/dist/beam-form.bundle.js +5 -3
  5. package/dist/beam-form.bundle.js.map +2 -2
  6. package/dist/beam.bundle.js +686 -30
  7. package/dist/beam.bundle.js.map +3 -3
  8. package/dist/claude-code-plugin.js +1 -1
  9. package/dist/cli/commands/beam.d.ts.map +1 -1
  10. package/dist/cli/commands/beam.js +8 -2
  11. package/dist/cli/commands/beam.js.map +1 -1
  12. package/dist/cli/commands/changelog.d.ts +9 -0
  13. package/dist/cli/commands/changelog.d.ts.map +1 -0
  14. package/dist/cli/commands/changelog.js +133 -0
  15. package/dist/cli/commands/changelog.js.map +1 -0
  16. package/dist/cli/commands/maker.d.ts.map +1 -1
  17. package/dist/cli/commands/maker.js +23 -2
  18. package/dist/cli/commands/maker.js.map +1 -1
  19. package/dist/cli/commands/mcp.d.ts.map +1 -1
  20. package/dist/cli/commands/mcp.js +53 -0
  21. package/dist/cli/commands/mcp.js.map +1 -1
  22. package/dist/cli/commands/package.d.ts.map +1 -1
  23. package/dist/cli/commands/package.js +18 -2
  24. package/dist/cli/commands/package.js.map +1 -1
  25. package/dist/cli/commands/run.d.ts.map +1 -1
  26. package/dist/cli/commands/run.js +1 -0
  27. package/dist/cli/commands/run.js.map +1 -1
  28. package/dist/cli/commands/update.d.ts +3 -2
  29. package/dist/cli/commands/update.d.ts.map +1 -1
  30. package/dist/cli/commands/update.js +50 -43
  31. package/dist/cli/commands/update.js.map +1 -1
  32. package/dist/cli/index.d.ts.map +1 -1
  33. package/dist/cli/index.js +16 -2
  34. package/dist/cli/index.js.map +1 -1
  35. package/dist/cli-alias.js +1 -1
  36. package/dist/cli-alias.js.map +1 -1
  37. package/dist/context-store.d.ts +23 -33
  38. package/dist/context-store.d.ts.map +1 -1
  39. package/dist/context-store.js +147 -97
  40. package/dist/context-store.js.map +1 -1
  41. package/dist/context.d.ts +15 -10
  42. package/dist/context.d.ts.map +1 -1
  43. package/dist/context.js +37 -13
  44. package/dist/context.js.map +1 -1
  45. package/dist/daemon/server.js +4 -2
  46. package/dist/daemon/server.js.map +1 -1
  47. package/dist/data-migration.d.ts +27 -0
  48. package/dist/data-migration.d.ts.map +1 -0
  49. package/dist/data-migration.js +307 -0
  50. package/dist/data-migration.js.map +1 -0
  51. package/dist/editor-support/docblock-tag-catalog.d.ts.map +1 -1
  52. package/dist/editor-support/docblock-tag-catalog.js +6 -0
  53. package/dist/editor-support/docblock-tag-catalog.js.map +1 -1
  54. package/dist/loader.d.ts +10 -0
  55. package/dist/loader.d.ts.map +1 -1
  56. package/dist/loader.js +97 -12
  57. package/dist/loader.js.map +1 -1
  58. package/dist/marketplace-manager.d.ts.map +1 -1
  59. package/dist/marketplace-manager.js +25 -5
  60. package/dist/marketplace-manager.js.map +1 -1
  61. package/dist/photon-cli-runner.d.ts.map +1 -1
  62. package/dist/photon-cli-runner.js +47 -21
  63. package/dist/photon-cli-runner.js.map +1 -1
  64. package/dist/photon-doc-extractor.d.ts +1 -0
  65. package/dist/photon-doc-extractor.d.ts.map +1 -1
  66. package/dist/photon-doc-extractor.js +6 -0
  67. package/dist/photon-doc-extractor.js.map +1 -1
  68. package/dist/readme-syncer.d.ts.map +1 -1
  69. package/dist/readme-syncer.js +6 -1
  70. package/dist/readme-syncer.js.map +1 -1
  71. package/dist/server.d.ts +40 -0
  72. package/dist/server.d.ts.map +1 -1
  73. package/dist/server.js +143 -28
  74. package/dist/server.js.map +1 -1
  75. package/dist/shared/audit.js +4 -4
  76. package/dist/shared/audit.js.map +1 -1
  77. package/dist/tasks/store.d.ts.map +1 -1
  78. package/dist/tasks/store.js +6 -2
  79. package/dist/tasks/store.js.map +1 -1
  80. package/dist/version-notify.d.ts +27 -0
  81. package/dist/version-notify.d.ts.map +1 -0
  82. package/dist/version-notify.js +142 -0
  83. package/dist/version-notify.js.map +1 -0
  84. package/package.json +2 -2
  85. package/dist/auto-ui/bridge/openai-shim.d.ts +0 -20
  86. package/dist/auto-ui/bridge/openai-shim.d.ts.map +0 -1
  87. package/dist/auto-ui/bridge/openai-shim.js +0 -231
  88. package/dist/auto-ui/bridge/openai-shim.js.map +0 -1
  89. package/dist/auto-ui/bridge/photon-app.d.ts +0 -162
  90. package/dist/auto-ui/bridge/photon-app.d.ts.map +0 -1
  91. package/dist/auto-ui/bridge/photon-app.js +0 -460
  92. package/dist/auto-ui/bridge/photon-app.js.map +0 -1
  93. package/dist/auto-ui/daemon-tools.d.ts +0 -45
  94. package/dist/auto-ui/daemon-tools.d.ts.map +0 -1
  95. package/dist/auto-ui/daemon-tools.js +0 -581
  96. package/dist/auto-ui/daemon-tools.js.map +0 -1
  97. package/dist/auto-ui/design-system/index.d.ts +0 -21
  98. package/dist/auto-ui/design-system/index.d.ts.map +0 -1
  99. package/dist/auto-ui/design-system/index.js +0 -27
  100. package/dist/auto-ui/design-system/index.js.map +0 -1
  101. package/dist/auto-ui/design-system/transaction-ui.d.ts +0 -70
  102. package/dist/auto-ui/design-system/transaction-ui.d.ts.map +0 -1
  103. package/dist/auto-ui/design-system/transaction-ui.js +0 -982
  104. package/dist/auto-ui/design-system/transaction-ui.js.map +0 -1
  105. package/dist/auto-ui/playground-server.d.ts +0 -7
  106. package/dist/auto-ui/playground-server.d.ts.map +0 -1
  107. package/dist/auto-ui/playground-server.js +0 -840
  108. package/dist/auto-ui/playground-server.js.map +0 -1
  109. package/dist/auto-ui/rendering/components.d.ts +0 -29
  110. package/dist/auto-ui/rendering/components.d.ts.map +0 -1
  111. package/dist/auto-ui/rendering/components.js +0 -1341
  112. package/dist/auto-ui/rendering/components.js.map +0 -1
  113. package/dist/auto-ui/rendering/field-analyzer.d.ts +0 -104
  114. package/dist/auto-ui/rendering/field-analyzer.d.ts.map +0 -1
  115. package/dist/auto-ui/rendering/field-analyzer.js +0 -447
  116. package/dist/auto-ui/rendering/field-analyzer.js.map +0 -1
  117. package/dist/auto-ui/rendering/field-renderers.d.ts +0 -64
  118. package/dist/auto-ui/rendering/field-renderers.d.ts.map +0 -1
  119. package/dist/auto-ui/rendering/field-renderers.js +0 -317
  120. package/dist/auto-ui/rendering/field-renderers.js.map +0 -1
  121. package/dist/auto-ui/rendering/index.d.ts +0 -28
  122. package/dist/auto-ui/rendering/index.d.ts.map +0 -1
  123. package/dist/auto-ui/rendering/index.js +0 -60
  124. package/dist/auto-ui/rendering/index.js.map +0 -1
  125. package/dist/auto-ui/rendering/layout-selector.d.ts +0 -60
  126. package/dist/auto-ui/rendering/layout-selector.d.ts.map +0 -1
  127. package/dist/auto-ui/rendering/layout-selector.js +0 -476
  128. package/dist/auto-ui/rendering/layout-selector.js.map +0 -1
  129. package/dist/markdown-utils.d.ts +0 -8
  130. package/dist/markdown-utils.d.ts.map +0 -1
  131. package/dist/markdown-utils.js +0 -64
  132. package/dist/markdown-utils.js.map +0 -1
  133. package/dist/mcp-client.d.ts +0 -9
  134. package/dist/mcp-client.d.ts.map +0 -1
  135. package/dist/mcp-client.js +0 -11
  136. package/dist/mcp-client.js.map +0 -1
  137. package/dist/mcp-elicitation.d.ts +0 -32
  138. package/dist/mcp-elicitation.d.ts.map +0 -1
  139. package/dist/mcp-elicitation.js +0 -26
  140. package/dist/mcp-elicitation.js.map +0 -1
  141. package/dist/photons/builder-compass.photon.d.ts +0 -167
  142. package/dist/photons/builder-compass.photon.d.ts.map +0 -1
  143. package/dist/photons/builder-compass.photon.js +0 -816
  144. package/dist/photons/builder-compass.photon.js.map +0 -1
  145. package/dist/photons/builder-compass.photon.ts +0 -1129
  146. package/dist/photons/docs/ui/docs.html +0 -441
  147. package/dist/photons/docs.photon.d.ts +0 -237
  148. package/dist/photons/docs.photon.d.ts.map +0 -1
  149. package/dist/photons/docs.photon.js +0 -483
  150. package/dist/photons/docs.photon.js.map +0 -1
  151. package/dist/photons/docs.photon.ts +0 -536
  152. package/dist/photons/slides.photon.d.ts +0 -212
  153. package/dist/photons/slides.photon.d.ts.map +0 -1
  154. package/dist/photons/slides.photon.js +0 -355
  155. package/dist/photons/slides.photon.js.map +0 -1
  156. package/dist/photons/slides.photon.ts +0 -370
  157. package/dist/photons/spreadsheet/ui/spreadsheet.html +0 -779
  158. package/dist/photons/spreadsheet.photon.d.ts +0 -554
  159. package/dist/photons/spreadsheet.photon.d.ts.map +0 -1
  160. package/dist/photons/spreadsheet.photon.js +0 -1050
  161. package/dist/photons/spreadsheet.photon.js.map +0 -1
  162. package/dist/photons/spreadsheet.photon.ts +0 -1239
  163. package/dist/photons/ui/builder-compass.html +0 -1199
  164. package/dist/photons/ui/builder-compass.photon.html +0 -380
  165. package/dist/security-scanner.d.ts +0 -52
  166. package/dist/security-scanner.d.ts.map +0 -1
  167. package/dist/security-scanner.js +0 -181
  168. package/dist/security-scanner.js.map +0 -1
  169. package/dist/shared/performance.d.ts +0 -65
  170. package/dist/shared/performance.d.ts.map +0 -1
  171. package/dist/shared/performance.js +0 -136
  172. 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
  /**
@@ -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
  ]);
@@ -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();
@@ -36423,6 +36440,7 @@ var ResultViewer = class extends i4 {
36423
36440
  case "slides":
36424
36441
  return typeof data === "string";
36425
36442
  case "checklist":
36443
+ case "guide":
36426
36444
  return Array.isArray(data);
36427
36445
  case "magazine":
36428
36446
  case "article":
@@ -36495,6 +36513,8 @@ var ResultViewer = class extends i4 {
36495
36513
  return this._renderSlides(filteredData);
36496
36514
  case "checklist":
36497
36515
  return this._renderChecklist(filteredData);
36516
+ case "guide":
36517
+ return this._renderGuide(filteredData);
36498
36518
  case "magazine":
36499
36519
  case "article":
36500
36520
  return this._renderMagazine(filteredData);
@@ -37427,6 +37447,8 @@ ${code}</pre>`;
37427
37447
  this._slidesTransitions.clear();
37428
37448
  this._slidesBackgrounds.clear();
37429
37449
  this._slidesEffects.clear();
37450
+ this._slidesMoods.clear();
37451
+ this._slidesBgEffects.clear();
37430
37452
  this._slidesCols.clear();
37431
37453
  this._slidesBuilds.clear();
37432
37454
  slides.forEach((slide, i7) => {
@@ -37436,10 +37458,15 @@ ${code}</pre>`;
37436
37458
  if (bgMatch) this._slidesBackgrounds.set(i7, bgMatch[1].trim());
37437
37459
  const fxMatch = slide.match(/<!--\s*effect:\s*(\S+)\s*-->/);
37438
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());
37439
37465
  const colMatch = slide.match(/<!--\s*cols:\s*(\d+)\s*-->/);
37440
37466
  if (colMatch) this._slidesCols.set(i7, Math.min(Math.max(parseInt(colMatch[1], 10), 2), 4));
37441
37467
  if (/<!--\s*build\s*-->/.test(slide)) this._slidesBuilds.set(i7, true);
37442
37468
  });
37469
+ this._slidesGlobalMood = config3.mood || "";
37443
37470
  const defaultTheme2 = "auto";
37444
37471
  return { slides, theme: config3.theme || defaultTheme2, config: config3 };
37445
37472
  }
@@ -37491,7 +37518,7 @@ ${code}</pre>`;
37491
37518
  return this._slidesBridgeScript || "";
37492
37519
  }
37493
37520
  /** Build an iframe srcdoc for a slide with the bridge loaded */
37494
- _buildSlideSrcdoc(slideHtml, codeBlocks, headerText, footerText, pageNum, slideBg, slideEffect) {
37521
+ _buildSlideSrcdoc(slideHtml, codeBlocks, headerText, footerText, pageNum, slideBg, slideEffect, slideBgEffect) {
37495
37522
  const bridge = this._slidesBridgeScript || "";
37496
37523
  const photonPrefix = this.photonName ? this.photonName + "/" : "";
37497
37524
  let html = slideHtml;
@@ -37516,11 +37543,15 @@ ${code}</pre>`;
37516
37543
  }
37517
37544
  }
37518
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">` : "";
37519
37549
  return `<!doctype html>
37520
37550
  <html lang="en" class="${themeClass}">
37521
37551
  <head>
37522
37552
  <meta charset="UTF-8">
37523
37553
  <meta name="photon-template" content="true">
37554
+ ${fontLink}
37524
37555
  ${bridge}
37525
37556
  <style>
37526
37557
  /* reveal.js-style scaling: fixed design canvas + transform:scale() */
@@ -37578,6 +37609,20 @@ ${bridge}
37578
37609
  [data-enter="flip-in"] { animation: motion-flip-in 0.5s cubic-bezier(0.16,1,0.3,1) both; }
37579
37610
  [data-enter="fade-in"] { animation: motion-fade-in 0.3s cubic-bezier(0.16,1,0.3,1) both; }
37580
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; } }
37581
37626
  @media (prefers-reduced-motion: reduce) {
37582
37627
  [data-enter] { animation: none !important; opacity: 1 !important; }
37583
37628
  }
@@ -37708,6 +37753,8 @@ ${bridge}
37708
37753
  /* Full-bleed image */
37709
37754
  .hero { width: 100%; border-radius: var(--radius-lg, 14px);
37710
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}
37711
37758
  </style>
37712
37759
  <script src="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/prism.min.js"><\/script>
37713
37760
  <script src="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/components/prism-typescript.min.js"><\/script>
@@ -37726,7 +37773,8 @@ ${bridge}
37726
37773
  </head>
37727
37774
  <body>
37728
37775
  ${this._buildSlideBgHtml(slideBg || "")}
37729
- <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;">
37730
37778
  ${headerText ? `<div class="slide-header">${headerText}</div>` : ""}
37731
37779
  <div class="slide-body">${html}</div>
37732
37780
  ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</span><span>${pageNum || ""}</span></div>` : ""}
@@ -37779,6 +37827,74 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
37779
37827
  return document.querySelectorAll('.slide-fragment:not(.visible)').length === 0;
37780
37828
  };
37781
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>
37782
37898
  </body>
37783
37899
  </html>`;
37784
37900
  }
@@ -37855,6 +37971,17 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
37855
37971
  const resolvedTheme = rawTheme === "auto" || rawTheme === "default" ? this.theme === "light" ? "uncover" : "default" : rawTheme;
37856
37972
  const themeClass = `slides-theme-${resolvedTheme}`;
37857
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
+ }
37858
37985
  const bgOverride = config3.backgroundColor ? `background:${config3.backgroundColor};` : "";
37859
37986
  const colorOverride = config3.color ? `color:${config3.color};` : "";
37860
37987
  const viewportStyle = bgOverride + colorOverride;
@@ -37864,6 +37991,7 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
37864
37991
  const currentTransition = this._getSlideTransition(idx);
37865
37992
  const slideBg = this._slidesBackgrounds.get(idx) || "";
37866
37993
  const slideEffect = this._slidesEffects.get(idx) || "";
37994
+ const slideBgEffect = this._slidesBgEffects.get(idx) || "";
37867
37995
  const slideBgStyle = this._buildSlideBgStyle(slideBg);
37868
37996
  const isVideoBg = /\.(mp4|webm|mov)(\?|$)/i.test(slideBg) || slideBg.startsWith("video:");
37869
37997
  return b2`
@@ -37886,6 +38014,7 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
37886
38014
  loop
37887
38015
  playsinline
37888
38016
  ></video>` : b2`<div class="slides-bg-layer" style="${slideBgStyle}"></div>` : ""}
38017
+ ${slideBgEffect ? b2`<div class="slides-bgfx slides-bgfx-${slideBgEffect}"></div>` : ""}
37889
38018
  <div class="slides-content">
37890
38019
  ${this._slidesBridgeScript ? b2`<iframe
37891
38020
  class="slide-bridge-frame"
@@ -37896,7 +38025,8 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
37896
38025
  footerText,
37897
38026
  showPaginate ? `${idx + 1} / ${total}` : "",
37898
38027
  slideBg,
37899
- slideEffect
38028
+ slideEffect,
38029
+ slideBgEffect
37900
38030
  )}
37901
38031
  sandbox="allow-scripts allow-same-origin allow-popups"
37902
38032
  frameborder="0"
@@ -37974,8 +38104,6 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
37974
38104
  position: relative;
37975
38105
  border-radius: var(--radius-md, 8px);
37976
38106
  outline: none;
37977
- background: #1a1a2e;
37978
- color: #e5e5e5;
37979
38107
  font-family:
37980
38108
  system-ui,
37981
38109
  -apple-system,
@@ -37990,14 +38118,14 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
37990
38118
  display: flex;
37991
38119
  align-items: center;
37992
38120
  justify-content: center;
37993
- padding: 48px 64px;
38121
+ padding: clamp(24px, 4vw, 48px) clamp(32px, 5vw, 64px);
37994
38122
  overflow: hidden;
37995
38123
  position: relative;
37996
38124
  }
37997
38125
  .slides-container:fullscreen .slides-viewport {
37998
38126
  flex: 1;
37999
38127
  aspect-ratio: auto;
38000
- padding: 64px 120px;
38128
+ padding: clamp(32px, 5vh, 64px) clamp(48px, 8vw, 120px);
38001
38129
  }
38002
38130
  .slides-container:fullscreen .slides-viewport:has(.slide-bridge-frame) {
38003
38131
  padding: 0;
@@ -38052,26 +38180,26 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
38052
38180
  z-index: -1;
38053
38181
  }
38054
38182
  .slides-content h1 {
38055
- font-size: 2.4em;
38183
+ font-size: clamp(1.8rem, 5vw, 3.5rem);
38056
38184
  margin: 0 0 0.4em;
38057
38185
  font-weight: 800;
38058
38186
  letter-spacing: -0.02em;
38059
38187
  line-height: 1.15;
38060
38188
  }
38061
38189
  .slides-content h2 {
38062
- font-size: 1.8em;
38190
+ font-size: clamp(1.4rem, 3.5vw, 2.4rem);
38063
38191
  margin: 0 0 0.4em;
38064
38192
  font-weight: 700;
38065
38193
  letter-spacing: -0.01em;
38066
38194
  }
38067
38195
  .slides-content h3 {
38068
- font-size: 1.3em;
38196
+ font-size: clamp(1.1rem, 2.5vw, 1.6rem);
38069
38197
  margin: 0 0 0.3em;
38070
38198
  font-weight: 600;
38071
38199
  }
38072
38200
  .slides-content p {
38073
38201
  margin: 0.5em 0;
38074
- font-size: 1.15em;
38202
+ font-size: clamp(0.95rem, 1.8vw, 1.25rem);
38075
38203
  line-height: 1.65;
38076
38204
  }
38077
38205
  .slides-content ul,
@@ -38376,6 +38504,300 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
38376
38504
  background: #191a21;
38377
38505
  }
38378
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
+
38379
38801
  /* ═══ VIEW TRANSITIONS ═══ */
38380
38802
  .slides-content {
38381
38803
  view-transition-name: slide-content;
@@ -38691,11 +39113,14 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
38691
39113
  { once: true }
38692
39114
  );
38693
39115
  }
38694
- /** Trigger stagger-in animation on slide content children after transition.
38695
- * Uses the universal data-enter attribute from the motion system. */
38696
39116
  _slidesStaggerIn() {
38697
- const slideEffect = this._slidesEffects.get(this._slidesCurrentIndex) || "";
38698
- 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;
38699
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";
38700
39125
  const applyToChildren = (container) => {
38701
39126
  const children = container.querySelectorAll(CHILD_SELECTOR);
@@ -38704,7 +39129,8 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
38704
39129
  htmlEl.removeAttribute("data-enter");
38705
39130
  void htmlEl.offsetWidth;
38706
39131
  htmlEl.setAttribute("data-enter", enterValue);
38707
- htmlEl.style.animationDelay = `${i7 * 60}ms`;
39132
+ htmlEl.style.animationDelay = `${i7 * delayMs}ms`;
39133
+ htmlEl.style.animationDuration = `${durationMs}ms`;
38708
39134
  });
38709
39135
  };
38710
39136
  const iframe = this.shadowRoot?.querySelector(".slide-bridge-frame");
@@ -38724,6 +39150,97 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
38724
39150
  const content2 = this.shadowRoot?.querySelector(".slides-content");
38725
39151
  if (content2) applyToChildren(content2);
38726
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
+ }
38727
39244
  /** Advance the next hidden build fragment. Returns true if a fragment was revealed. */
38728
39245
  _slidesAdvanceBuild() {
38729
39246
  const hasBuild = this._slidesBuilds.get(this._slidesCurrentIndex);
@@ -38788,6 +39305,7 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
38788
39305
  this._afterSlideRender();
38789
39306
  }
38790
39307
  this._slidesStaggerIn();
39308
+ this._slidesApplyTextEffect();
38791
39309
  };
38792
39310
  if (transition === "none" || !("startViewTransition" in document) || this._slidesBridgeScript) {
38793
39311
  this._slidesCurrentIndex = newIndex;
@@ -39663,6 +40181,77 @@ ${footerText || pageNum ? `<div class="slide-footer"><span>${footerText || ""}</
39663
40181
  </div>
39664
40182
  `;
39665
40183
  }
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
+ }
39666
40255
  // ── Magazine Renderer — markdown-powered multi-column layout ──
39667
40256
  _renderMagazine(data) {
39668
40257
  const text = typeof data === "string" ? data : data?.text || "";
@@ -43525,6 +44114,52 @@ ResultViewer._TIMESTAMP_FIELDS = [
43525
44114
  // ReactiveArray auto-stamp (fallback for creation)
43526
44115
  ];
43527
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
+ };
43528
44163
  ResultViewer._EFFECT_MAP = {
43529
44164
  "fade-up": "slide-up",
43530
44165
  "fade-down": "slide-down",
@@ -43543,6 +44178,18 @@ ResultViewer._EFFECT_MAP = {
43543
44178
  "scale-up": "scale-up",
43544
44179
  "flip-in": "flip-in"
43545
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"]);
43546
44193
  __decorateClass([
43547
44194
  n4({ type: Object })
43548
44195
  ], ResultViewer.prototype, "result", 2);
@@ -92284,6 +92931,12 @@ function buildPhotonDocblockTagCatalog(runtimeVersion) {
92284
92931
  apply: "@stateful true",
92285
92932
  type: "keyword"
92286
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
+ },
92287
92940
  {
92288
92941
  label: "@idleTimeout",
92289
92942
  detail: "Idle timeout in ms",
@@ -96283,6 +96936,7 @@ var ElicitationModal = class extends i4 {
96283
96936
  case "confirm":
96284
96937
  return this._renderConfirm();
96285
96938
  case "oauth":
96939
+ case "url":
96286
96940
  return this._renderOAuth();
96287
96941
  case "form":
96288
96942
  return this._renderForm();
@@ -96467,17 +97121,19 @@ var ElicitationModal = class extends i4 {
96467
97121
  };
96468
97122
  const provider = this.data?.provider || "OAuth";
96469
97123
  const icon2 = providerIcons[provider.toLowerCase()] || providerIcons.default;
96470
- 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}`;
96471
97127
  return b2`
96472
97128
  <div class="oauth-content">
96473
97129
  <div class="oauth-icon">${icon2}</div>
96474
- <p class="oauth-message">Authorization is required to access ${provider}.</p>
96475
- <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>` : ""}
96476
97134
  <div class="actions" style="justify-content: center;">
96477
97135
  <button class="btn-secondary" @click=${() => this._cancel()}>Cancel</button>
96478
- <button class="btn-primary" @click=${() => this._startOAuth()}>
96479
- Authorize ${provider}
96480
- </button>
97136
+ <button class="btn-primary" @click=${() => this._startOAuth()}>${buttonLabel}</button>
96481
97137
  </div>
96482
97138
  </div>
96483
97139
  `;