@thanh01.pmt/presentation-kit 0.2.17 → 0.2.18

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.
package/dist/ai/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunk6R6L6KSC_cjs = require('../chunk-6R6L6KSC.cjs');
4
- var chunkJNTRKKJX_cjs = require('../chunk-JNTRKKJX.cjs');
3
+ var chunkSFBEDDGU_cjs = require('../chunk-SFBEDDGU.cjs');
4
+ var chunkHSVXH7DD_cjs = require('../chunk-HSVXH7DD.cjs');
5
5
  var zod = require('zod');
6
6
 
7
7
  var listSlidePresetsSchema = zod.z.object({
@@ -65,7 +65,7 @@ var generateDeckOutlineSchema = zod.z.object({
65
65
  // src/ai/tools.ts
66
66
  function executeListSlidePresets(params) {
67
67
  const category = params?.category;
68
- const presets = !category || category === "all" ? chunkJNTRKKJX_cjs.SLIDE_LAYOUT_PRESETS : chunkJNTRKKJX_cjs.getSlideLayoutPresetsByCategory(category);
68
+ const presets = !category || category === "all" ? chunkSFBEDDGU_cjs.SLIDE_LAYOUT_PRESETS : chunkSFBEDDGU_cjs.getSlideLayoutPresetsByCategory(category);
69
69
  return {
70
70
  count: presets.length,
71
71
  presets: presets.map((p) => ({
@@ -79,7 +79,7 @@ function executeListSlidePresets(params) {
79
79
  };
80
80
  }
81
81
  function executeCreateSlideFromPreset(params) {
82
- const preset = chunkJNTRKKJX_cjs.getSlideLayoutPresetById(params.presetId);
82
+ const preset = chunkSFBEDDGU_cjs.getSlideLayoutPresetById(params.presetId);
83
83
  if (!preset) {
84
84
  return {
85
85
  success: false,
@@ -87,7 +87,7 @@ function executeCreateSlideFromPreset(params) {
87
87
  error: `Preset with ID "${params.presetId}" not found. Use listSlidePresets to see available layout templates.`
88
88
  };
89
89
  }
90
- const layoutComment = chunkJNTRKKJX_cjs.serializeLayoutToComment(preset.layout);
90
+ const layoutComment = chunkSFBEDDGU_cjs.serializeLayoutToComment(preset.layout);
91
91
  const title = params.title;
92
92
  const subtitle = params.subtitle ? `
93
93
  ### ${params.subtitle}` : "";
@@ -228,7 +228,7 @@ Presenter Notes:
228
228
  function executeApplySlideLayout(params) {
229
229
  let layoutData = null;
230
230
  if (params.presetId) {
231
- const preset = chunkJNTRKKJX_cjs.getSlideLayoutPresetById(params.presetId);
231
+ const preset = chunkSFBEDDGU_cjs.getSlideLayoutPresetById(params.presetId);
232
232
  if (!preset) {
233
233
  return {
234
234
  success: false,
@@ -240,7 +240,7 @@ function executeApplySlideLayout(params) {
240
240
  } else if (params.boxes && params.boxes.length > 0) {
241
241
  layoutData = { boxes: params.boxes };
242
242
  }
243
- const updatedMarkdown = chunkJNTRKKJX_cjs.updateSlideLayoutInMarkdown(
243
+ const updatedMarkdown = chunkSFBEDDGU_cjs.updateSlideLayoutInMarkdown(
244
244
  params.markdown,
245
245
  params.slideIndex,
246
246
  layoutData
@@ -251,7 +251,7 @@ function executeApplySlideLayout(params) {
251
251
  };
252
252
  }
253
253
  function executeUpdatePresenterNotes(params) {
254
- const { frontmatter, slides } = chunkJNTRKKJX_cjs.splitMarkdownSlides(params.markdown);
254
+ const { frontmatter, slides } = chunkSFBEDDGU_cjs.splitMarkdownSlides(params.markdown);
255
255
  if (params.slideIndex < 0 || params.slideIndex >= slides.length) {
256
256
  return {
257
257
  success: false,
@@ -470,20 +470,20 @@ function validateHtmlSlideDeck(deck, strict = false) {
470
470
  slides.forEach((slide, idx) => {
471
471
  const slideNumber = idx + 1;
472
472
  const layoutId = slide.layoutId;
473
- const preset = chunkJNTRKKJX_cjs.HTML_SLIDE_PRESETS[layoutId];
473
+ const preset = chunkSFBEDDGU_cjs.HTML_SLIDE_PRESETS[layoutId];
474
474
  if (!preset) {
475
475
  issues.push({
476
476
  slideIndex: slideNumber,
477
477
  severity: "error",
478
478
  rule: "INVALID_LAYOUT_PRESET",
479
- message: `Unknown layoutId "${slide.layoutId}". Available presets: ${Object.keys(chunkJNTRKKJX_cjs.HTML_SLIDE_PRESETS).join(", ")}`
479
+ message: `Unknown layoutId "${slide.layoutId}". Available presets: ${Object.keys(chunkSFBEDDGU_cjs.HTML_SLIDE_PRESETS).join(", ")}`
480
480
  });
481
481
  return;
482
482
  }
483
483
  if (preset.category === "cover" && idx === 0) hasCover = true;
484
484
  if (preset.id === "checkpoint-quiz") hasQuiz = true;
485
485
  if (preset.id === "summary-takeaways") hasSummary = true;
486
- const slots = chunkJNTRKKJX_cjs.normalizeSlideSlots(slide);
486
+ const slots = chunkSFBEDDGU_cjs.normalizeSlideSlots(slide);
487
487
  for (const slotDef of preset.slots) {
488
488
  if (slotDef.required) {
489
489
  const val = slots[slotDef.name];
@@ -625,7 +625,7 @@ function validateMarkdownSlideDeck(markdown, strict = false) {
625
625
  suggestions: ['Provide Markdown slide content delimited by "---".']
626
626
  };
627
627
  }
628
- const { slides: rawSlides } = chunkJNTRKKJX_cjs.splitMarkdownSlides(markdown);
628
+ const { slides: rawSlides } = chunkSFBEDDGU_cjs.splitMarkdownSlides(markdown);
629
629
  const activeSlides = rawSlides.filter((s) => s.trim().length > 0);
630
630
  const slideCount = activeSlides.length;
631
631
  if (slideCount === 0) {
@@ -774,7 +774,7 @@ var createHtmlSlideSchema = zod.z.object({
774
774
  // src/ai/html/tools.ts
775
775
  function handleListHtmlSlidePresets(input) {
776
776
  const category = input.category || "all";
777
- const presets = Object.values(chunkJNTRKKJX_cjs.HTML_SLIDE_PRESETS).filter((p) => category === "all" || p.category === category).map((p) => ({
777
+ const presets = Object.values(chunkSFBEDDGU_cjs.HTML_SLIDE_PRESETS).filter((p) => category === "all" || p.category === category).map((p) => ({
778
778
  id: p.id,
779
779
  name: p.name,
780
780
  category: p.category,
@@ -790,12 +790,12 @@ function handleListHtmlSlidePresets(input) {
790
790
  return {
791
791
  success: true,
792
792
  presets,
793
- availableThemes: Object.keys(chunkJNTRKKJX_cjs.HTML_THEMES)
793
+ availableThemes: Object.keys(chunkSFBEDDGU_cjs.HTML_THEMES)
794
794
  };
795
795
  }
796
796
  function handleGenerateHtmlDeck(input) {
797
797
  try {
798
- const result = chunkJNTRKKJX_cjs.compileHtmlDeck(input);
798
+ const result = chunkSFBEDDGU_cjs.compileHtmlDeck(input);
799
799
  return {
800
800
  success: true,
801
801
  title: result.title,
@@ -811,7 +811,7 @@ function handleGenerateHtmlDeck(input) {
811
811
  }
812
812
  }
813
813
  function handleCreateHtmlSlide(input) {
814
- const preset = chunkJNTRKKJX_cjs.HTML_SLIDE_PRESETS[input.layoutId];
814
+ const preset = chunkSFBEDDGU_cjs.HTML_SLIDE_PRESETS[input.layoutId];
815
815
  if (!preset) {
816
816
  return {
817
817
  success: false,
@@ -833,51 +833,55 @@ var executeCreateHtmlSlide = handleCreateHtmlSlide;
833
833
 
834
834
  Object.defineProperty(exports, "FRONTEND_SLIDES_CORE_RULES", {
835
835
  enumerable: true,
836
- get: function () { return chunk6R6L6KSC_cjs.FRONTEND_SLIDES_CORE_RULES; }
836
+ get: function () { return chunkHSVXH7DD_cjs.FRONTEND_SLIDES_CORE_RULES; }
837
837
  });
838
838
  Object.defineProperty(exports, "SLIDE_HTML_PROMPT_CONTRACT", {
839
839
  enumerable: true,
840
- get: function () { return chunk6R6L6KSC_cjs.SLIDE_HTML_PROMPT_CONTRACT; }
840
+ get: function () { return chunkHSVXH7DD_cjs.SLIDE_HTML_PROMPT_CONTRACT; }
841
841
  });
842
842
  Object.defineProperty(exports, "STYLE_PRESETS", {
843
843
  enumerable: true,
844
- get: function () { return chunk6R6L6KSC_cjs.STYLE_PRESETS; }
844
+ get: function () { return chunkHSVXH7DD_cjs.STYLE_PRESETS; }
845
845
  });
846
846
  Object.defineProperty(exports, "TEMPLATES_CATALOG", {
847
847
  enumerable: true,
848
- get: function () { return chunk6R6L6KSC_cjs.TEMPLATES_CATALOG; }
848
+ get: function () { return chunkHSVXH7DD_cjs.TEMPLATES_CATALOG; }
849
849
  });
850
850
  Object.defineProperty(exports, "VIEWPORT_BASE_CSS", {
851
851
  enumerable: true,
852
- get: function () { return chunk6R6L6KSC_cjs.VIEWPORT_BASE_CSS; }
852
+ get: function () { return chunkHSVXH7DD_cjs.VIEWPORT_BASE_CSS; }
853
853
  });
854
854
  Object.defineProperty(exports, "frontendSlidesTools", {
855
855
  enumerable: true,
856
- get: function () { return chunk6R6L6KSC_cjs.frontendSlidesTools; }
856
+ get: function () { return chunkHSVXH7DD_cjs.frontendSlidesTools; }
857
857
  });
858
858
  Object.defineProperty(exports, "getFrontendSlidesSkillPrompt", {
859
859
  enumerable: true,
860
- get: function () { return chunk6R6L6KSC_cjs.getFrontendSlidesSkillPrompt; }
860
+ get: function () { return chunkHSVXH7DD_cjs.getFrontendSlidesSkillPrompt; }
861
861
  });
862
862
  Object.defineProperty(exports, "getSlideStylePresetSchema", {
863
863
  enumerable: true,
864
- get: function () { return chunk6R6L6KSC_cjs.getSlideStylePresetSchema; }
864
+ get: function () { return chunkHSVXH7DD_cjs.getSlideStylePresetSchema; }
865
865
  });
866
866
  Object.defineProperty(exports, "getStylePreset", {
867
867
  enumerable: true,
868
- get: function () { return chunk6R6L6KSC_cjs.getStylePreset; }
868
+ get: function () { return chunkHSVXH7DD_cjs.getStylePreset; }
869
+ });
870
+ Object.defineProperty(exports, "getStylePresetById", {
871
+ enumerable: true,
872
+ get: function () { return chunkHSVXH7DD_cjs.getStylePresetById; }
869
873
  });
870
874
  Object.defineProperty(exports, "getTemplatesCatalog", {
871
875
  enumerable: true,
872
- get: function () { return chunk6R6L6KSC_cjs.getTemplatesCatalog; }
876
+ get: function () { return chunkHSVXH7DD_cjs.getTemplatesCatalog; }
873
877
  });
874
878
  Object.defineProperty(exports, "querySlideTemplatesSchema", {
875
879
  enumerable: true,
876
- get: function () { return chunk6R6L6KSC_cjs.querySlideTemplatesSchema; }
880
+ get: function () { return chunkHSVXH7DD_cjs.querySlideTemplatesSchema; }
877
881
  });
878
882
  Object.defineProperty(exports, "searchTemplates", {
879
883
  enumerable: true,
880
- get: function () { return chunk6R6L6KSC_cjs.searchTemplates; }
884
+ get: function () { return chunkHSVXH7DD_cjs.searchTemplates; }
881
885
  });
882
886
  exports.SLIDE_DESIGN_PROMPT_CONTRACT = SLIDE_DESIGN_PROMPT_CONTRACT;
883
887
  exports.applySlideLayoutSchema = applySlideLayoutSchema;
@@ -1,7 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import { S as SlideLayoutCategory } from '../presets-BYvgAAkJ.cjs';
3
3
  import { S as SlideLayoutData, H as HtmlLayoutPresetId, e as HtmlDeckData, f as HtmlThemeName, g as HtmlSlideSlotData } from '../types-C3d04zzP.cjs';
4
- export { FRONTEND_SLIDES_CORE_RULES, FrontendSlidesSkillOptions, STYLE_PRESETS, StylePresetItem, TEMPLATES_CATALOG, TemplateCatalogItem, VIEWPORT_BASE_CSS, frontendSlidesTools, getFrontendSlidesSkillPrompt, getSlideStylePresetSchema, getStylePreset, getTemplatesCatalog, querySlideTemplatesSchema, searchTemplates } from '../skills/index.cjs';
4
+ export { FRONTEND_SLIDES_CORE_RULES, FrontendSlidesSkillOptions, STYLE_PRESETS, StylePresetItem, TEMPLATES_CATALOG, TemplateCatalogItem, VIEWPORT_BASE_CSS, frontendSlidesTools, getFrontendSlidesSkillPrompt, getSlideStylePresetSchema, getStylePreset, getStylePresetById, getTemplatesCatalog, querySlideTemplatesSchema, searchTemplates } from '../skills/index.cjs';
5
5
 
6
6
  declare const listSlidePresetsSchema: z.ZodObject<{
7
7
  category: z.ZodOptional<z.ZodEnum<["all", "cover", "content", "split", "code", "metrics", "diagram", "quote", "assessment"]>>;
@@ -1,7 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import { S as SlideLayoutCategory } from '../presets-D_hfPJX9.js';
3
3
  import { S as SlideLayoutData, H as HtmlLayoutPresetId, e as HtmlDeckData, f as HtmlThemeName, g as HtmlSlideSlotData } from '../types-C3d04zzP.js';
4
- export { FRONTEND_SLIDES_CORE_RULES, FrontendSlidesSkillOptions, STYLE_PRESETS, StylePresetItem, TEMPLATES_CATALOG, TemplateCatalogItem, VIEWPORT_BASE_CSS, frontendSlidesTools, getFrontendSlidesSkillPrompt, getSlideStylePresetSchema, getStylePreset, getTemplatesCatalog, querySlideTemplatesSchema, searchTemplates } from '../skills/index.js';
4
+ export { FRONTEND_SLIDES_CORE_RULES, FrontendSlidesSkillOptions, STYLE_PRESETS, StylePresetItem, TEMPLATES_CATALOG, TemplateCatalogItem, VIEWPORT_BASE_CSS, frontendSlidesTools, getFrontendSlidesSkillPrompt, getSlideStylePresetSchema, getStylePreset, getStylePresetById, getTemplatesCatalog, querySlideTemplatesSchema, searchTemplates } from '../skills/index.js';
5
5
 
6
6
  declare const listSlidePresetsSchema: z.ZodObject<{
7
7
  category: z.ZodOptional<z.ZodEnum<["all", "cover", "content", "split", "code", "metrics", "diagram", "quote", "assessment"]>>;
package/dist/ai/index.js CHANGED
@@ -1,5 +1,5 @@
1
- export { FRONTEND_SLIDES_CORE_RULES, SLIDE_HTML_PROMPT_CONTRACT, STYLE_PRESETS, TEMPLATES_CATALOG, VIEWPORT_BASE_CSS, frontendSlidesTools, getFrontendSlidesSkillPrompt, getSlideStylePresetSchema, getStylePreset, getTemplatesCatalog, querySlideTemplatesSchema, searchTemplates } from '../chunk-BHJXQCVE.js';
2
- import { SLIDE_LAYOUT_PRESETS, getSlideLayoutPresetsByCategory, getSlideLayoutPresetById, serializeLayoutToComment, updateSlideLayoutInMarkdown, splitMarkdownSlides, HTML_SLIDE_PRESETS, normalizeSlideSlots, HTML_THEMES, compileHtmlDeck } from '../chunk-7QHDWDSB.js';
1
+ import { SLIDE_LAYOUT_PRESETS, getSlideLayoutPresetsByCategory, getSlideLayoutPresetById, serializeLayoutToComment, updateSlideLayoutInMarkdown, splitMarkdownSlides, HTML_SLIDE_PRESETS, normalizeSlideSlots, HTML_THEMES, compileHtmlDeck } from '../chunk-JJQDQIRG.js';
2
+ export { FRONTEND_SLIDES_CORE_RULES, SLIDE_HTML_PROMPT_CONTRACT, STYLE_PRESETS, TEMPLATES_CATALOG, VIEWPORT_BASE_CSS, frontendSlidesTools, getFrontendSlidesSkillPrompt, getSlideStylePresetSchema, getStylePreset, getStylePresetById, getTemplatesCatalog, querySlideTemplatesSchema, searchTemplates } from '../chunk-VRXEXUHR.js';
3
3
  import { z } from 'zod';
4
4
 
5
5
  var listSlidePresetsSchema = z.object({
@@ -1,3 +1,4 @@
1
+ import { highlightCodeBlocks } from './chunk-JJQDQIRG.js';
1
2
  import yaml from 'js-yaml';
2
3
  import { Marp } from '@marp-team/marp-core';
3
4
 
@@ -979,81 +980,6 @@ async function renderMermaidDiagrams(container, theme = "dark") {
979
980
  }
980
981
  }
981
982
 
982
- // src/plugins/shiki.ts
983
- var highlighterPromise = null;
984
- var highlighterFailed = false;
985
- var SUPPORTED_LANGS = [
986
- "javascript",
987
- "typescript",
988
- "python",
989
- "cpp",
990
- "c",
991
- "java",
992
- "html",
993
- "css",
994
- "json",
995
- "yaml",
996
- "bash",
997
- "shell",
998
- "sql",
999
- "go",
1000
- "rust",
1001
- "swift",
1002
- "kotlin",
1003
- "ruby",
1004
- "php",
1005
- "xml",
1006
- "markdown",
1007
- "dockerfile",
1008
- "toml",
1009
- "ini",
1010
- "graphql",
1011
- "prisma",
1012
- "solidity"
1013
- ];
1014
- async function getHighlighter() {
1015
- if (highlighterFailed) {
1016
- highlighterPromise = null;
1017
- highlighterFailed = false;
1018
- }
1019
- if (!highlighterPromise) {
1020
- highlighterPromise = import('shiki').then(
1021
- (mod) => mod.createHighlighter({
1022
- themes: ["vitesse-dark", "vitesse-light"],
1023
- langs: [...SUPPORTED_LANGS]
1024
- })
1025
- ).catch((err) => {
1026
- highlighterPromise = null;
1027
- highlighterFailed = true;
1028
- throw new Error(`[presentation-kit] Failed to load Shiki highlighter: ${err}`);
1029
- });
1030
- }
1031
- return highlighterPromise;
1032
- }
1033
- function decodeHtmlEntities2(html) {
1034
- return html.replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, '"').replace(/&#39;/g, "'").replace(/&#x27;/g, "'").replace(/&nbsp;/g, " ").replace(/&#(\d+);/g, (_, code) => String.fromCharCode(Number(code))).replace(/&#x([0-9a-fA-F]+);/g, (_, hex) => String.fromCharCode(parseInt(hex, 16)));
1035
- }
1036
- function getShikiTheme(theme) {
1037
- if (theme === "light") return "vitesse-light";
1038
- return "vitesse-dark";
1039
- }
1040
- async function highlightCodeBlocks(html, theme = "dark") {
1041
- if (!html.includes("<pre><code")) return html;
1042
- const highlighter = await getHighlighter();
1043
- const shikiTheme = getShikiTheme(theme);
1044
- return html.replace(
1045
- /<pre><code class="language-(\w+)">([\s\S]*?)<\/code><\/pre>/g,
1046
- (_, lang, code) => {
1047
- const decoded = decodeHtmlEntities2(code);
1048
- try {
1049
- return highlighter.codeToHtml(decoded, { lang, theme: shikiTheme });
1050
- } catch {
1051
- return `<pre><code class="language-${lang}">${code}</code></pre>`;
1052
- }
1053
- }
1054
- );
1055
- }
1056
-
1057
983
  // src/vclick/preprocessor.ts
1058
984
  function preprocessClicks(markdown) {
1059
985
  if (!markdown || !markdown.trim()) {
@@ -1388,6 +1314,6 @@ async function renderSlideAsync(markdown, options) {
1388
1314
  };
1389
1315
  }
1390
1316
 
1391
- export { convertTextArrows, countSlides, darkThemeTokens, defineTheme, detectMermaidBlocks, extractLayoutsAndNotes, extractMarpSource, extractMaxClicks, filterPresenterNotes, generateClickCss, generateLayoutCss, generateScopedCss, generateScopedCss2, getHighlighter, getThemeTokens, highlightCodeBlocks, isLayoutComment, lightThemeTokens, navyThemeTokens, parseLayoutFromComment, postprocessClicks, preprocessClicks, renderMarp, renderMermaidDiagrams, renderSlide, renderSlideAsync, resolveTheme, sanitizeMermaidCode };
1392
- //# sourceMappingURL=chunk-NYLDRVHZ.js.map
1393
- //# sourceMappingURL=chunk-NYLDRVHZ.js.map
1317
+ export { convertTextArrows, countSlides, darkThemeTokens, defineTheme, detectMermaidBlocks, extractLayoutsAndNotes, extractMarpSource, extractMaxClicks, filterPresenterNotes, generateClickCss, generateLayoutCss, generateScopedCss, generateScopedCss2, getThemeTokens, isLayoutComment, lightThemeTokens, navyThemeTokens, parseLayoutFromComment, postprocessClicks, preprocessClicks, renderMarp, renderMermaidDiagrams, renderSlide, renderSlideAsync, resolveTheme, sanitizeMermaidCode };
1318
+ //# sourceMappingURL=chunk-DDOUFYLK.js.map
1319
+ //# sourceMappingURL=chunk-DDOUFYLK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/arrow-converter.ts","../src/core/source-extractor.ts","../src/themes/dark.ts","../src/themes/light.ts","../src/themes/navy.ts","../src/themes/scoped-css.ts","../src/themes/index.ts","../src/plugins/mermaid.ts","../src/vclick/preprocessor.ts","../src/vclick/postprocessor.ts","../src/vclick/click-css.ts","../src/core/layout/parser.ts","../src/core/layout/css-generator.ts","../src/core/render.ts"],"names":["generateScopedCss","totalClicks"],"mappings":"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","file":"chunk-DDOUFYLK.js","sourcesContent":["// ═══════════════════════════════════════════════════════════════════════════════\n// Arrow Converter — Text arrows → Unicode arrows\n// Ported from: apps/web/app/api/render-marp/route.ts\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Converts text arrows (->, -->, --->, =>, ==>, <->, etc.) into clean Unicode\n * arrows while strictly preserving YAML frontmatter, code fences, inline code,\n * HTML comments, and style tags.\n */\nexport function convertTextArrows(text: string): string {\n if (!text) return '';\n\n let content = text;\n let yamlFrontmatter = '';\n\n // 1. Preserve YAML frontmatter at the beginning of markdown (e.g. --- ... ---)\n const yamlMatch = content.match(/^(---\\r?\\n[\\s\\S]*?\\r?\\n---(?:\\r?\\n|$))/);\n if (yamlMatch?.[1]) {\n yamlFrontmatter = yamlMatch[1];\n content = content.slice(yamlFrontmatter.length);\n }\n\n // 2. Split by code fences, inline code, HTML comments, and style tags\n const segments = content.split(/(```[\\s\\S]*?```|`[^`\\n]+`|<!--[\\s\\S]*?-->|<style[\\s\\S]*?<\\/style>)/g);\n\n const processedContent = segments\n .map((segment) => {\n // If it's a code block, inline code, HTML comment, or style tag, leave untouched\n if (\n segment.startsWith('```') ||\n segment.startsWith('`') ||\n segment.startsWith('<!--') ||\n segment.startsWith('<style')\n ) {\n return segment;\n }\n\n return (\n segment\n // Bi-directional double arrows\n .replace(/<={3,}>/g, '⟺')\n .replace(/<==>/g, '⟺')\n .replace(/<=>/g, '⇔')\n // Bi-directional single arrows\n .replace(/<-{3,}>/g, '⟷')\n .replace(/<-->/g, '⟷')\n .replace(/<->/g, '↔')\n // Long right double arrows\n .replace(/={3,}>/g, '⟹')\n .replace(/==>/g, '⟹')\n .replace(/(^|\\s)=>(?=\\s|$|[.,:;!?\\)])/g, '$1⇒')\n // Long left double arrows\n .replace(/<={3,}/g, '⟸')\n .replace(/<==/g, '⟸')\n .replace(/(^|\\s)<=(?=\\s|$|[.,:;!?\\)])/g, '$1⇐')\n // Long right single arrows (----> -> ⟶, ---> -> ⟶, --> -> ⟶, -> -> →)\n .replace(/-{3,}>/g, '⟶')\n .replace(/-->/g, '⟶')\n .replace(/(^|\\s)->(?=\\s|$|[.,:;!?\\)])/g, '$1→')\n // Long left single arrows (<---- -> ⟵, <--- -> ⟵, <-- -> ⟵, <- -> ←)\n .replace(/<-{3,}/g, '⟵')\n .replace(/<--/g, '⟵')\n .replace(/(^|\\s)<-(?=\\s|$|[.,:;!?\\)])/g, '$1←')\n // LaTeX math arrows\n .replace(/\\$\\\\rightarrow\\$/g, '→')\n .replace(/\\$\\\\leftarrow\\$/g, '←')\n .replace(/\\$\\\\Rightarrow\\$/g, '⇒')\n .replace(/\\$\\\\Leftarrow\\$/g, '⇐')\n .replace(/\\\\rightarrow/g, '→')\n .replace(/\\\\leftarrow/g, '←')\n .replace(/\\\\Rightarrow/g, '⇒')\n .replace(/\\\\Leftarrow/g, '⇐')\n );\n })\n .join('');\n\n return yamlFrontmatter + processedContent;\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Source Extractor — Extract clean Marp source from markdown wrappers\n// Ported from: apps/web/components/MarpSlideViewer.tsx\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Extracts clean Marp source from markdown that may be wrapped in code fences\n * or preceded by conversational preamble.\n *\n * Handles:\n * - Wrapped in ```markdown ... ``` or ```marp ... ``` or ```md ... ```\n * - Conversational preamble before the first frontmatter ---\n */\nexport function extractMarpSource(raw: string): string {\n if (!raw) return '';\n let text = raw.trim();\n\n // If wrapped in ```markdown ... ``` or ```marp ... ``` or ```md ... ```\n const codeBlockMatch = text.match(/^```(?:markdown|marp|md)?\\s*\\n([\\s\\S]*?)\\n```\\s*$/i);\n if (codeBlockMatch?.[1]) {\n text = codeBlockMatch[1].trim();\n }\n\n // If there is conversational preamble before the first frontmatter ---\n const firstFrontmatter = text.search(/^---\\s*$/m);\n if (firstFrontmatter > 0 && text.includes('marp: true')) {\n text = text.substring(firstFrontmatter).trim();\n }\n\n return text;\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Dark Theme — Studio Dark (#14151b)\n// Ported from: apps/web/components/MarpSlideViewer.tsx scopedSlideStyles\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { ThemeTokens } from '../types.js';\n\nexport const darkThemeTokens: ThemeTokens = {\n // Surfaces\n background: '#14151b',\n cardBorder: '1px solid rgba(255, 255, 255, 0.08)',\n cardShadow: '0 8px 24px -4px rgba(0, 0, 0, 0.4)',\n\n // Typography — Calm single-hue readability (Zinc-200)\n text: '#cbd5e1',\n heading: '#e4e4e7',\n bold: '#ffffff',\n link: '#60a5fa',\n meta: '#94a3b8',\n\n // Code\n codeBg: '#0c0c0e',\n codeText: '#e4e4e7',\n inlineCodeBg: '#0c0c0e',\n inlineCodeText: '#e4e4e7',\n codeBorder: 'rgba(255, 255, 255, 0.08)',\n\n // Blockquotes\n quoteBg: 'rgba(255, 255, 255, 0.04)',\n quoteBorder: 'rgba(255, 255, 255, 0.15)',\n quoteText: '#e4e4e7',\n\n // Tables\n tableHeaderBg: 'rgba(255, 255, 255, 0.04)',\n tableBorder: 'rgba(255, 255, 255, 0.08)',\n tableRowHover: 'rgba(255, 255, 255, 0.02)',\n tableText: '#cbd5e1',\n tableEvenRow: 'rgba(255, 255, 255, 0.03)',\n\n // Mermaid\n mermaidDark: true,\n mermaidVariables: {\n darkMode: 'true',\n background: '#18181b',\n primaryColor: '#27272a',\n primaryTextColor: '#f4f4f5',\n primaryBorderColor: 'rgba(255, 255, 255, 0.2)',\n lineColor: '#71717a',\n secondaryColor: '#1e1e24',\n tertiaryColor: '#121214',\n textColor: '#f4f4f5',\n mainBkg: '#1f1f23',\n nodeBorder: 'rgba(255, 255, 255, 0.22)',\n clusterBkg: 'rgba(255, 255, 255, 0.02)',\n clusterBorder: 'rgba(255, 255, 255, 0.12)',\n titleColor: '#f4f4f5',\n edgeLabelBackground: '#27272a',\n actorBorder: 'rgba(255, 255, 255, 0.2)',\n actorBkg: '#27272a',\n actorTextColor: '#f4f4f5',\n actorLineColor: '#71717a',\n signalColor: '#f4f4f5',\n signalTextColor: '#f4f4f5',\n },\n mermaidThemeCSS: `\n svg, svg *, g, text, tspan, .node, .node *, .edgeLabel, .edgeLabel *, .cluster, .cluster * {\n clip-path: none !important;\n -webkit-clip-path: none !important;\n overflow: visible !important;\n }\n .node rect, .node circle, .node ellipse, .node polygon, .node path {\n stroke-width: 1.5px !important;\n rx: 8px !important;\n ry: 8px !important;\n }\n .node text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 13px !important;\n font-weight: 500 !important;\n text-anchor: middle !important;\n dominant-baseline: central !important;\n }\n .edgeLabel rect {\n rx: 5px !important;\n ry: 5px !important;\n fill: #27272a !important;\n stroke: rgba(255, 255, 255, 0.12) !important;\n stroke-width: 1px !important;\n }\n .edgeLabel text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 11px !important;\n font-weight: 500 !important;\n fill: #e4e4e7 !important;\n text-anchor: middle !important;\n dominant-baseline: central !important;\n }\n .cluster rect {\n rx: 10px !important;\n ry: 10px !important;\n fill: rgba(255, 255, 255, 0.02) !important;\n stroke: rgba(255, 255, 255, 0.12) !important;\n stroke-width: 1.5px !important;\n }\n .cluster text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 12px !important;\n font-weight: 600 !important;\n fill: #a1a1aa !important;\n }\n .edgePath path {\n stroke: #71717a !important;\n stroke-width: 1.5px !important;\n }\n .arrowheadPath {\n fill: #71717a !important;\n }\n `,\n};\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Light Theme — Keynote White (#ffffff)\n// Ported from: apps/web/components/MarpSlideViewer.tsx scopedSlideStyles\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { ThemeTokens } from '../types.js';\n\nexport const lightThemeTokens: ThemeTokens = {\n // Surfaces\n background: '#ffffff',\n cardBorder: '1px solid rgba(0, 0, 0, 0.08)',\n cardShadow: '0 4px 16px -2px rgba(0, 0, 0, 0.05), 0 1px 2px rgba(0, 0, 0, 0.03)',\n\n // Typography — Calm single-hue readability (Zinc-800)\n text: '#3f3f46',\n heading: '#27272a',\n bold: '#18181b',\n link: '#2563eb',\n meta: '#71717a',\n\n // Code\n codeBg: '#f4f4f5',\n codeText: '#27272a',\n inlineCodeBg: '#f4f4f5',\n inlineCodeText: '#27272a',\n codeBorder: 'rgba(0, 0, 0, 0.08)',\n\n // Blockquotes\n quoteBg: '#f8f9fa',\n quoteBorder: 'rgba(0, 0, 0, 0.15)',\n quoteText: '#27272a',\n\n // Tables\n tableHeaderBg: '#f8fafc',\n tableBorder: '#e2e8f0',\n tableRowHover: 'rgba(0, 0, 0, 0.02)',\n tableText: '#3f3f46',\n tableEvenRow: '#f8fafc',\n\n // Mermaid\n mermaidDark: false,\n mermaidVariables: {\n darkMode: 'false',\n background: '#ffffff',\n primaryColor: '#f4f4f6',\n primaryTextColor: '#18181b',\n primaryBorderColor: 'rgba(0, 0, 0, 0.15)',\n lineColor: '#94a3b8',\n secondaryColor: '#fafafa',\n tertiaryColor: '#f4f4f5',\n textColor: '#18181b',\n mainBkg: '#f8fafc',\n nodeBorder: 'rgba(0, 0, 0, 0.15)',\n clusterBkg: 'rgba(0, 0, 0, 0.015)',\n clusterBorder: 'rgba(0, 0, 0, 0.1)',\n titleColor: '#18181b',\n edgeLabelBackground: '#f1f5f9',\n actorBorder: 'rgba(0, 0, 0, 0.2)',\n actorBkg: '#f4f4f6',\n actorTextColor: '#18181b',\n actorLineColor: '#94a3b8',\n signalColor: '#18181b',\n signalTextColor: '#18181b',\n },\n mermaidThemeCSS: `\n svg, svg *, g, text, tspan, .node, .node *, .edgeLabel, .edgeLabel *, .cluster, .cluster * {\n clip-path: none !important;\n -webkit-clip-path: none !important;\n overflow: visible !important;\n }\n .node rect, .node circle, .node ellipse, .node polygon, .node path {\n stroke-width: 1.5px !important;\n rx: 8px !important;\n ry: 8px !important;\n }\n .node text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 13px !important;\n font-weight: 500 !important;\n text-anchor: middle !important;\n dominant-baseline: central !important;\n }\n .edgeLabel rect {\n rx: 5px !important;\n ry: 5px !important;\n fill: #f1f5f9 !important;\n stroke: rgba(0, 0, 0, 0.12) !important;\n stroke-width: 1px !important;\n }\n .edgeLabel text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 11px !important;\n font-weight: 500 !important;\n fill: #334155 !important;\n text-anchor: middle !important;\n dominant-baseline: central !important;\n }\n .cluster rect {\n rx: 10px !important;\n ry: 10px !important;\n fill: rgba(0, 0, 0, 0.015) !important;\n stroke: rgba(0, 0, 0, 0.12) !important;\n stroke-width: 1.5px !important;\n }\n .cluster text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 12px !important;\n font-weight: 600 !important;\n fill: #64748b !important;\n }\n .edgePath path {\n stroke: #94a3b8 !important;\n stroke-width: 1.5px !important;\n }\n .arrowheadPath {\n fill: #94a3b8 !important;\n }\n `,\n};\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Navy Theme — Deep Navy (#0f172a)\n// Ported from: apps/web/components/MarpSlideViewer.tsx scopedSlideStyles\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { ThemeTokens } from '../types.js';\n\nexport const navyThemeTokens: ThemeTokens = {\n // Surfaces\n background: '#0f172a',\n cardBorder: '1px solid rgba(255, 255, 255, 0.08)',\n cardShadow: '0 8px 24px -4px rgba(0, 0, 0, 0.4)',\n\n // Typography — Calm single-hue readability (Zinc-200)\n text: '#94a3b8',\n heading: '#f8fafc',\n bold: '#ffffff',\n link: '#38bdf8',\n meta: '#94a3b8',\n\n // Code\n codeBg: '#020617',\n codeText: '#e4e4e7',\n inlineCodeBg: '#020617',\n inlineCodeText: '#e4e4e7',\n codeBorder: 'rgba(255, 255, 255, 0.08)',\n\n // Blockquotes — Navy uses sky tint\n quoteBg: 'rgba(56, 189, 248, 0.06)',\n quoteBorder: 'rgba(255, 255, 255, 0.15)',\n quoteText: '#e4e4e7',\n\n // Tables\n tableHeaderBg: 'rgba(255, 255, 255, 0.04)',\n tableBorder: 'rgba(255, 255, 255, 0.08)',\n tableRowHover: 'rgba(255, 255, 255, 0.02)',\n tableText: '#94a3b8',\n tableEvenRow: 'rgba(56, 189, 248, 0.03)',\n\n // Mermaid — reuse dark config with navy tint\n mermaidDark: true,\n mermaidVariables: {\n darkMode: 'true',\n background: '#18181b',\n primaryColor: '#27272a',\n primaryTextColor: '#f4f4f5',\n primaryBorderColor: 'rgba(255, 255, 255, 0.2)',\n lineColor: '#71717a',\n secondaryColor: '#1e1e24',\n tertiaryColor: '#121214',\n textColor: '#f4f4f5',\n mainBkg: '#1f1f23',\n nodeBorder: 'rgba(255, 255, 255, 0.22)',\n clusterBkg: 'rgba(255, 255, 255, 0.02)',\n clusterBorder: 'rgba(255, 255, 255, 0.12)',\n titleColor: '#f4f4f5',\n edgeLabelBackground: '#27272a',\n actorBorder: 'rgba(255, 255, 255, 0.2)',\n actorBkg: '#27272a',\n actorTextColor: '#f4f4f5',\n actorLineColor: '#71717a',\n signalColor: '#f4f4f5',\n signalTextColor: '#f4f4f5',\n },\n mermaidThemeCSS: `\n svg, svg *, g, text, tspan, .node, .node *, .edgeLabel, .edgeLabel *, .cluster, .cluster * {\n clip-path: none !important;\n -webkit-clip-path: none !important;\n overflow: visible !important;\n }\n .node rect, .node circle, .node ellipse, .node polygon, .node path {\n stroke-width: 1.5px !important;\n rx: 8px !important;\n ry: 8px !important;\n }\n .node text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 13px !important;\n font-weight: 500 !important;\n text-anchor: middle !important;\n dominant-baseline: central !important;\n }\n .edgeLabel rect {\n rx: 5px !important;\n ry: 5px !important;\n fill: #27272a !important;\n stroke: rgba(255, 255, 255, 0.12) !important;\n stroke-width: 1px !important;\n }\n .edgeLabel text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 11px !important;\n font-weight: 500 !important;\n fill: #e4e4e7 !important;\n text-anchor: middle !important;\n dominant-baseline: central !important;\n }\n .cluster rect {\n rx: 10px !important;\n ry: 10px !important;\n fill: rgba(255, 255, 255, 0.02) !important;\n stroke: rgba(255, 255, 255, 0.12) !important;\n stroke-width: 1.5px !important;\n }\n .cluster text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 12px !important;\n font-weight: 600 !important;\n fill: #a1a1aa !important;\n }\n .edgePath path {\n stroke: #71717a !important;\n stroke-width: 1.5px !important;\n }\n .arrowheadPath {\n fill: #71717a !important;\n }\n `,\n};\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Scoped CSS Generator — Theme-specific CSS for 1280x720 Marp canvas\n// Ported from: apps/web/components/MarpSlideViewer.tsx scopedSlideStyles\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { ThemeTokens } from '../types.js';\n\n/**\n * Sanitize a string for safe use as a CSS selector (ID).\n * Escapes characters that are special in CSS selectors.\n */\nfunction sanitizeCssId(id: string): string {\n // CSS.escape() is available in modern browsers and Node 20+\n // Fallback: manual escape for common problematic chars\n if (typeof CSS !== 'undefined' && typeof CSS.escape === 'function') {\n return CSS.escape(id);\n }\n return id.replace(/([\"'\\\\()\\[\\]#.;,{}\\s!@#$%^&*=+|<>?/~`])/g, '\\\\$1');\n}\n\n/**\n * Generate scoped CSS string for a given theme.\n * This CSS overrides Marp defaults for 1280×720 canvas typography using\n * the container ID for CSS isolation.\n */\nexport function generateScopedCss(tokens: ThemeTokens, containerId: string = 'marp-container'): string {\n const safeId = sanitizeCssId(containerId);\n return `\n/* ── Isolation: Scope all styles to #${safeId} ── */\n#${safeId} {\n width: 100%;\n}\n\n/* Base Slide Card Styling (Thin hairline border) */\n#${safeId} svg[data-marpit-svg] {\n background-color: ${tokens.background} !important;\n border-radius: 12px !important;\n border: ${tokens.cardBorder} !important;\n box-shadow: ${tokens.cardShadow} !important;\n overflow: hidden !important;\n transition: border-color 0.15s ease;\n}\n\n/* Slide Inner Section (1280x720 Canvas Coordinate Scale) */\n#${safeId} section:not([data-background-color]):not([style*=\"background\"]),\n#${safeId} foreignObject > section:not([data-background-color]):not([style*=\"background\"]) {\n background-color: ${tokens.background} !important;\n}\n\n#${safeId} section,\n#${safeId} foreignObject > section {\n color: ${tokens.text} !important;\n font-family: var(--font-sans), Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n padding: 50px 60px !important;\n box-sizing: border-box !important;\n display: flex !important;\n flex-direction: column !important;\n justify-content: center !important;\n}\n\n/* Force inline display for emojis, twemojis, and inline text emojis */\n#${safeId} section img.emoji,\n#${safeId} section img[data-marp-twemoji],\n#${safeId} section .emoji {\n display: inline-block !important;\n vertical-align: -0.15em !important;\n height: 1.15em !important;\n width: 1.15em !important;\n margin: 0 0.15em !important;\n}\n\n/* Mermaid Diagram styling inside Marp Canvas */\n#${safeId} section .marp-mermaid-rendered {\n width: 100% !important;\n display: flex !important;\n justify-content: center !important;\n align-items: center !important;\n margin: 16px 0 !important;\n}\n\n#${safeId} section .marp-mermaid-rendered svg {\n display: block !important;\n max-width: 100% !important;\n max-height: 420px !important;\n width: auto !important;\n height: auto !important;\n}\n\n#${safeId} section .marp-mermaid-rendered svg * {\n clip-path: none !important;\n -webkit-clip-path: none !important;\n}\n\n#${safeId} section .katex,\n#${safeId} section .katex-html {\n display: inline-block !important;\n vertical-align: baseline !important;\n}\n\n#${safeId} section strong,\n#${safeId} section b,\n#${safeId} section em,\n#${safeId} section span {\n display: inline !important;\n}\n\n/* ── Typography Scale for 1280x720 Canvas ── */\n#${safeId} section h1 {\n font-size: 38px !important;\n font-weight: 700 !important;\n line-height: 1.25 !important;\n color: ${tokens.heading} !important;\n margin: 0 0 18px 0 !important;\n letter-spacing: -0.02em !important;\n font-family: var(--font-sans), Inter, sans-serif !important;\n}\n\n#${safeId} section h2 {\n font-size: 28px !important;\n font-weight: 600 !important;\n line-height: 1.3 !important;\n color: ${tokens.heading} !important;\n margin: 0 0 16px 0 !important;\n letter-spacing: -0.01em !important;\n font-family: var(--font-sans), Inter, sans-serif !important;\n}\n\n#${safeId} section h3 {\n font-size: 22px !important;\n font-weight: 600 !important;\n line-height: 1.4 !important;\n color: ${tokens.heading} !important;\n margin: 0 0 14px 0 !important;\n font-family: var(--font-sans), Inter, sans-serif !important;\n}\n\n#${safeId} section p,\n#${safeId} section li {\n font-size: 18px !important;\n line-height: 1.7 !important;\n color: ${tokens.text} !important;\n margin-top: 0 !important;\n margin-bottom: 12px !important;\n font-family: var(--font-sans), Inter, sans-serif !important;\n}\n\n#${safeId} section strong,\n#${safeId} section b {\n color: ${tokens.bold} !important;\n font-weight: 600 !important;\n}\n\n#${safeId} section a {\n color: ${tokens.link} !important;\n text-decoration: underline !important;\n text-decoration-thickness: 1px !important;\n text-underline-offset: 2px !important;\n}\n\n#${safeId} section a:hover {\n opacity: 0.85 !important;\n}\n\n#${safeId} section ul,\n#${safeId} section ol {\n margin: 0 0 16px 28px !important;\n padding: 0 !important;\n}\n\n#${safeId} section li {\n margin-bottom: 8px !important;\n}\n\n/* Blockquotes / Callout Cards */\n#${safeId} section blockquote {\n background: ${tokens.quoteBg} !important;\n border-left: 3px solid ${tokens.quoteBorder} !important;\n border-radius: 6px !important;\n padding: 16px 24px !important;\n margin: 16px 0 !important;\n color: ${tokens.quoteText} !important;\n}\n#${safeId} section blockquote p {\n color: ${tokens.quoteText} !important;\n font-size: 18px !important;\n margin: 0 !important;\n}\n\n/* Code Blocks & Inline Code (Monospace font standard) */\n#${safeId} section code {\n font-family: var(--font-mono), ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace !important;\n font-style: normal !important;\n font-size: 15px !important;\n background: ${tokens.inlineCodeBg} !important;\n color: ${tokens.inlineCodeText} !important;\n padding: 2px 8px !important;\n border-radius: 6px !important;\n border: 1px solid ${tokens.codeBorder} !important;\n}\n\n#${safeId} section pre {\n background: ${tokens.codeBg} !important;\n border: 1px solid ${tokens.codeBorder} !important;\n border-radius: 8px !important;\n padding: 18px 22px !important;\n margin: 16px 0 !important;\n overflow-x: auto !important;\n}\n\n#${safeId} section pre code {\n background: transparent !important;\n border: none !important;\n padding: 0 !important;\n font-family: var(--font-mono), ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace !important;\n font-style: normal !important;\n font-size: 15px !important;\n line-height: 1.6 !important;\n color: ${tokens.codeText} !important;\n}\n\n/* Tables */\ndiv#${safeId} svg foreignObject section table,\n#${safeId} section table {\n width: 100% !important;\n border-collapse: collapse !important;\n margin: 16px 0 !important;\n font-size: 17px !important;\n background-color: transparent !important;\n background: transparent !important;\n display: table !important;\n}\n\ndiv#${safeId} svg foreignObject section table tr,\n#${safeId} section table tr {\n background-color: transparent !important;\n background: transparent !important;\n border-top: 1px solid ${tokens.tableBorder} !important;\n}\n\ndiv#${safeId} svg foreignObject section table tbody tr:nth-child(2n),\n#${safeId} section table tbody tr:nth-child(2n) {\n background-color: ${tokens.tableEvenRow ?? tokens.tableHeaderBg} !important;\n}\n\ndiv#${safeId} svg foreignObject section table thead tr,\n#${safeId} section table thead tr {\n background-color: ${tokens.tableHeaderBg} !important;\n}\n\ndiv#${safeId} svg foreignObject section table th,\n#${safeId} section table th {\n background-color: ${tokens.tableHeaderBg} !important;\n color: ${tokens.heading} !important;\n font-weight: 600 !important;\n padding: 10px 16px !important;\n border: 1px solid ${tokens.tableBorder} !important;\n text-align: left !important;\n}\n\ndiv#${safeId} svg foreignObject section table td,\n#${safeId} section table td {\n padding: 10px 16px !important;\n border: 1px solid ${tokens.tableBorder} !important;\n color: ${tokens.tableText} !important;\n background-color: transparent !important;\n}\n\ndiv#${safeId} svg foreignObject section table tr:hover td,\n#${safeId} section table tr:hover td {\n background-color: ${tokens.tableRowHover} !important;\n}\n\n/* Header & Footer */\n#${safeId} section header,\n#${safeId} section footer {\n position: absolute !important;\n left: 60px !important;\n right: 60px !important;\n font-size: 14px !important;\n color: ${tokens.meta} !important;\n font-family: var(--font-sans), Inter, sans-serif !important;\n opacity: 0.8 !important;\n}\n\n#${safeId} section header {\n top: 24px !important;\n border-bottom: 1px solid ${tokens.tableBorder} !important;\n padding-bottom: 6px !important;\n}\n\n#${safeId} section footer {\n bottom: 24px !important;\n border-top: 1px solid ${tokens.tableBorder} !important;\n padding-top: 6px !important;\n}\n\n/* Multi-column Grid & Flex Layout Utilities */\n#${safeId} section .columns,\n#${safeId} section .grid-2 {\n display: grid !important;\n grid-template-columns: 1fr 1fr !important;\n gap: 28px !important;\n width: 100% !important;\n margin: 16px 0 !important;\n align-items: start !important;\n}\n\n#${safeId} section .columns > div,\n#${safeId} section .grid-2 > div {\n min-width: 0 !important;\n}\n\n#${safeId} section .card {\n background: ${tokens.quoteBg} !important;\n border: 1px solid ${tokens.cardBorder} !important;\n border-radius: 10px !important;\n padding: 18px 22px !important;\n margin: 12px 0 !important;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15) !important;\n}\n\n#${safeId} section .card.highlight {\n border-left: 4px solid ${tokens.link} !important;\n}\n\n#${safeId} section .card.warning {\n border-left: 4px solid #f59e0b !important;\n}\n\n#${safeId} section .card.success {\n border-left: 4px solid #10b981 !important;\n}\n\n/* Marp Split Layout Container */\n#${safeId} section[data-marpit-advanced-background=\"background\"] {\n display: flex !important;\n flex-direction: row !important;\n padding: 0 !important;\n}\n\n#${safeId} section[data-marpit-advanced-background=\"background\"] > .marpit-advanced-background-container {\n flex: 0 0 50% !important;\n height: 100% !important;\n position: relative !important;\n}\n\n#${safeId} section[data-marpit-advanced-background=\"background\"] > .marpit-advanced-background-container + * {\n flex: 1 !important;\n padding: 50px 60px !important;\n display: flex !important;\n flex-direction: column !important;\n justify-content: center !important;\n}\n\n/* Hide Raw Marp Image Artifacts */\n#${safeId} section img[data-marp-bg] {\n display: none !important;\n}\n`;\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Theme System — Registry, resolution, and CSS generation\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { BuiltInTheme, SlideTheme, ThemeTokens } from '../types.js';\nimport { darkThemeTokens } from './dark.js';\nimport { lightThemeTokens } from './light.js';\nimport { navyThemeTokens } from './navy.js';\nimport { generateScopedCss as _generateScopedCss } from './scoped-css.js';\n\n/** Built-in theme registry */\nconst builtInThemes: Record<BuiltInTheme, ThemeTokens> = {\n dark: darkThemeTokens,\n light: lightThemeTokens,\n navy: navyThemeTokens,\n};\n\n/**\n * Get theme tokens by built-in name.\n */\nexport function getThemeTokens(theme: BuiltInTheme): ThemeTokens {\n return builtInThemes[theme];\n}\n\n/**\n * Resolve a theme (built-in name or custom SlideTheme) to a full SlideTheme object.\n */\nexport function resolveTheme(theme: BuiltInTheme | SlideTheme | undefined): SlideTheme {\n if (!theme) {\n return { name: 'dark', tokens: builtInThemes.dark };\n }\n\n if (typeof theme === 'string') {\n return { name: theme, tokens: builtInThemes[theme] };\n }\n\n return theme;\n}\n\n/**\n * Define a custom theme with full token control.\n */\nexport function defineTheme(definition: { name: string; tokens: ThemeTokens }): SlideTheme {\n return {\n name: definition.name,\n tokens: definition.tokens,\n };\n}\n\n/**\n * Generate scoped CSS for a theme.\n */\nexport function generateScopedCss(\n theme: SlideTheme,\n containerId?: string,\n): string {\n return _generateScopedCss(theme.tokens, containerId);\n}\n\n// Re-export sub-modules (token objects for advanced usage)\nexport { darkThemeTokens } from './dark.js';\nexport { lightThemeTokens } from './light.js';\nexport { navyThemeTokens } from './navy.js';\nexport { generateScopedCss as generateScopedCssFromTokens } from './scoped-css.js';\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Mermaid Plugin — Lazy-loaded diagram detection and DOM-based rendering\n// Ported from: apps/web/components/MarpSlideViewer.tsx + MermaidRenderer.tsx\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport type { MermaidBlock } from '../types.js';\n\n/** Singleton mermaid module promise */\nlet mermaidModulePromise: Promise<typeof import('mermaid').default> | null = null;\n/** Track if singleton init failed so we can retry */\nlet mermaidFailed = false;\n\n// ─── Detection ───────────────────────────────────────────────────────────────\n\n/**\n * Decode HTML entities in code content.\n */\nfunction decodeHtmlEntities(html: string): string {\n return html\n .replace(/&amp;/g, '&') // MUST be first to avoid double-decode\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&nbsp;/g, ' ')\n .replace(/&#(\\d+);/g, (_, code: string) => String.fromCharCode(Number(code)))\n .replace(/&#x([0-9a-fA-F]+);/g, (_, hex: string) => String.fromCharCode(parseInt(hex, 16)));\n}\n\n/**\n * Check if raw text looks like valid mermaid diagram code.\n */\nfunction isValidMermaidCode(text: string): boolean {\n if (!text || text.length > 2500) return false;\n if (text.startsWith('---') || text.includes('marp: true')) return false;\n\n // Check for known mermaid diagram headers\n const hasHeader =\n /^(?:graph\\s+(?:TD|TB|LR|RL|BT)|flowchart\\s+(?:TD|TB|LR|RL|BT)|sequenceDiagram|classDiagram|stateDiagram|erDiagram|gantt|pie|gitGraph|mindmap|quadrantChart|journey|timeline|xychart|C4Context)\\b/i.test(\n text,\n );\n\n // Must have at least one connection indicator\n const hasConnections =\n text.includes('-->') ||\n text.includes('->>') ||\n text.includes('---') ||\n text.includes('[') ||\n text.includes('(');\n\n return hasHeader && text.includes('\\n') && hasConnections;\n}\n\n/**\n * Detect mermaid blocks in rendered Marp HTML.\n * Returns array of MermaidBlock with raw and sanitized code.\n */\nexport function detectMermaidBlocks(html: string): MermaidBlock[] {\n const blocks: MermaidBlock[] = [];\n\n // Match <pre><code class=\"language-mermaid|diagram|graph\">...</code></pre>\n const regex =\n /<pre><code class=\"language-(?:mermaid|diagram|graph)\">([\\s\\S]*?)<\\/code><\\/pre>/g;\n\n let match;\n let index = 0;\n\n while ((match = regex.exec(html)) !== null) {\n const code = decodeHtmlEntities(match[1]);\n if (isValidMermaidCode(code)) {\n blocks.push({\n index: index++,\n code,\n sanitizedCode: sanitizeMermaidCode(code),\n });\n }\n }\n\n return blocks;\n}\n\n// ─── Sanitization ────────────────────────────────────────────────────────────\n\n/**\n * Sanitize mermaid code — fix common issues that cause render failures.\n * Ported from: apps/web/components/MermaidRenderer.tsx sanitizeMermaidCode()\n */\nexport function sanitizeMermaidCode(chart: string, isDark = false): string {\n let code = (chart || '').trim();\n\n // Remove markdown code fences if wrapped\n code = code.replace(/^```(?:mermaid|diagram|graph)?\\s*/i, '').replace(/```$/i, '').trim();\n\n // If missing diagram header, prepend flowchart TD\n if (\n code &&\n !/^(graph|flowchart|sequenceDiagram|classDiagram|stateDiagram|erDiagram|gantt|pie|gitGraph|mindmap|journey|quadrantChart|xychart|C4Context|timeline)/i.test(\n code,\n )\n ) {\n code = `flowchart TD\\n${code}`;\n }\n\n // Fix unquoted node labels with special characters in square brackets\n code = code.replace(\n /([a-zA-Z0-9_-]+)\\[([^\\]\\n\\r\"]+)\\]/g,\n (match, id: string, label: string) => {\n const trimmed = label.trim();\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) return match;\n return `${id}[\"${trimmed.replace(/\"/g, \"'\")}\"]`;\n },\n );\n\n // Fix unquoted node labels with special characters in rounded nodes\n code = code.replace(\n /([a-zA-Z0-9_-]+)\\(([^)\\n\\r\"]+)\\)/g,\n (match, id: string, label: string) => {\n const trimmed = label.trim();\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) return match;\n return `${id}(\"${trimmed.replace(/\"/g, \"'\")}\")`;\n },\n );\n\n // Fix subgraphs with spaces in name (Mermaid v10+ requires: subgraph id [Title])\n code = code.replace(\n /^\\s*subgraph\\s+([A-Za-z0-9_ -]+)\\s*$/gm,\n (match, rawName: string) => {\n const trimmed = rawName.trim();\n if (trimmed.includes('[') || trimmed.includes(']')) return match;\n const cleanId = trimmed.replace(/[^A-Za-z0-9_]/g, '_');\n return ` subgraph ${cleanId} [\"${trimmed}\"]`;\n },\n );\n\n return code;\n}\n\n// ─── DOM Rendering ───────────────────────────────────────────────────────────\n\n/**\n * Get or create the Mermaid singleton module.\n */\nasync function getMermaid(): Promise<typeof import('mermaid').default> {\n if (mermaidFailed) {\n mermaidModulePromise = null;\n mermaidFailed = false;\n }\n\n if (!mermaidModulePromise) {\n mermaidModulePromise = import('mermaid')\n .then((mod) => mod.default)\n .catch((err) => {\n mermaidModulePromise = null;\n mermaidFailed = true;\n throw new Error(`[presentation-kit] Failed to load Mermaid: ${err}`);\n });\n }\n return mermaidModulePromise;\n}\n\n/**\n * Configuration for Mermaid initialization.\n * Matches the detailed config from MarpSlideViewer.\n */\nfunction getMermaidConfig(isDark: boolean) {\n const tokens = isDark\n ? {\n darkMode: true,\n background: '#18181b',\n primaryColor: '#27272a',\n primaryTextColor: '#f4f4f5',\n primaryBorderColor: 'rgba(255, 255, 255, 0.2)',\n lineColor: '#71717a',\n secondaryColor: '#1e1e24',\n tertiaryColor: '#121214',\n textColor: '#f4f4f5',\n mainBkg: '#1f1f23',\n nodeBorder: 'rgba(255, 255, 255, 0.22)',\n clusterBkg: 'rgba(255, 255, 255, 0.02)',\n clusterBorder: 'rgba(255, 255, 255, 0.12)',\n titleColor: '#f4f4f5',\n edgeLabelBackground: '#27272a',\n actorBorder: 'rgba(255, 255, 255, 0.2)',\n actorBkg: '#27272a',\n actorTextColor: '#f4f4f5',\n actorLineColor: '#71717a',\n signalColor: '#f4f4f5',\n signalTextColor: '#f4f4f5',\n }\n : {\n darkMode: false,\n background: '#ffffff',\n primaryColor: '#f4f4f6',\n primaryTextColor: '#18181b',\n primaryBorderColor: 'rgba(0, 0, 0, 0.15)',\n lineColor: '#94a3b8',\n secondaryColor: '#fafafa',\n tertiaryColor: '#f4f4f5',\n textColor: '#18181b',\n mainBkg: '#f8fafc',\n nodeBorder: 'rgba(0, 0, 0, 0.15)',\n clusterBkg: 'rgba(0, 0, 0, 0.015)',\n clusterBorder: 'rgba(0, 0, 0, 0.1)',\n titleColor: '#18181b',\n edgeLabelBackground: '#f1f5f9',\n actorBorder: 'rgba(0, 0, 0, 0.2)',\n actorBkg: '#f4f4f6',\n actorTextColor: '#18181b',\n actorLineColor: '#94a3b8',\n signalColor: '#18181b',\n signalTextColor: '#18181b',\n };\n\n return {\n startOnLoad: false,\n suppressErrorRendering: true,\n theme: isDark ? ('dark' as const) : ('neutral' as const),\n securityLevel: 'loose' as const,\n fontFamily: 'Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: 14,\n flowchart: {\n htmlLabels: false,\n useMaxWidth: false,\n padding: 32,\n nodeSpacing: 55,\n rankSpacing: 60,\n curve: 'basis' as const,\n },\n themeCSS: `\n svg, svg *, g, text, tspan, .node, .node *, .edgeLabel, .edgeLabel *, .cluster, .cluster * {\n clip-path: none !important;\n -webkit-clip-path: none !important;\n overflow: visible !important;\n }\n .node rect, .node circle, .node ellipse, .node polygon, .node path {\n stroke-width: 1.5px !important;\n rx: 8px !important;\n ry: 8px !important;\n }\n .node text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 13px !important;\n font-weight: 500 !important;\n text-anchor: middle !important;\n dominant-baseline: central !important;\n }\n .edgeLabel rect {\n rx: 5px !important;\n ry: 5px !important;\n fill: ${isDark ? '#27272a' : '#f1f5f9'} !important;\n stroke: ${isDark ? 'rgba(255, 255, 255, 0.12)' : 'rgba(0, 0, 0, 0.12)'} !important;\n stroke-width: 1px !important;\n }\n .edgeLabel text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 11px !important;\n font-weight: 500 !important;\n fill: ${isDark ? '#e4e4e7' : '#334155'} !important;\n text-anchor: middle !important;\n dominant-baseline: central !important;\n }\n .cluster rect {\n rx: 10px !important;\n ry: 10px !important;\n fill: ${isDark ? 'rgba(255, 255, 255, 0.02)' : 'rgba(0, 0, 0, 0.015)'} !important;\n stroke: ${isDark ? 'rgba(255, 255, 255, 0.12)' : 'rgba(0, 0, 0, 0.12)'} !important;\n stroke-width: 1.5px !important;\n }\n .cluster text {\n font-family: Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif !important;\n font-size: 12px !important;\n font-weight: 600 !important;\n fill: ${isDark ? '#a1a1aa' : '#64748b'} !important;\n }\n .edgePath path {\n stroke: ${isDark ? '#71717a' : '#94a3b8'} !important;\n stroke-width: 1.5px !important;\n }\n .arrowheadPath {\n fill: ${isDark ? '#71717a' : '#94a3b8'} !important;\n }\n `,\n themeVariables: tokens,\n };\n}\n\n/**\n * Render mermaid diagrams inside a container element.\n * Lazy-loads mermaid module on first call.\n *\n * This function MUST run in a browser environment (needs DOM).\n * Returns early gracefully in SSR/Node.js environments.\n */\nexport async function renderMermaidDiagrams(\n container: HTMLElement,\n theme: 'dark' | 'light' | 'navy' = 'dark',\n): Promise<void> {\n // Guard: SSR/Node.js environments have no DOM\n if (typeof document === 'undefined' || typeof window === 'undefined') {\n console.warn('[presentation-kit] renderMermaidDiagrams skipped: no DOM available (SSR)');\n return;\n }\n\n const mermaid = await getMermaid();\n const isDark = theme === 'dark' || theme === 'navy';\n\n mermaid.initialize(getMermaidConfig(isDark));\n\n // Find mermaid code blocks in container\n const codeNodes = Array.from(\n container.querySelectorAll('pre > code, pre, .marp-mermaid-rendered'),\n );\n\n const mermaidNodes = codeNodes.filter((node) => {\n if ((node as HTMLElement).classList.contains('marp-mermaid-rendered')) return true;\n const text = node.textContent?.trim() || '';\n const className = (node as HTMLElement).className || '';\n\n // Never treat frontmatter or large blocks as mermaid\n if (text.startsWith('---') || text.includes('marp: true') || text.length > 2500) {\n return false;\n }\n\n return (\n className.includes('language-mermaid') ||\n className.includes('language-diagram') ||\n className.includes('language-graph') ||\n isValidMermaidCode(text)\n );\n });\n\n if (mermaidNodes.length === 0) return;\n\n for (let i = 0; i < mermaidNodes.length; i++) {\n const node = mermaidNodes[i] as HTMLElement;\n const isAlreadyWrapper = node.classList.contains('marp-mermaid-rendered');\n const rawChartCode = isAlreadyWrapper\n ? node.getAttribute('data-chart-code') || ''\n : node.textContent?.trim() || '';\n\n if (!rawChartCode) continue;\n\n const preEl = isAlreadyWrapper\n ? node\n : node.tagName.toLowerCase() === 'pre'\n ? node\n : node.parentElement;\n if (!preEl) continue;\n\n const sanitizedCode = sanitizeMermaidCode(rawChartCode, isDark);\n const diagId = `slide_mermaid_${Date.now()}_${i}_${Math.floor(Math.random() * 10000)}`;\n\n try {\n let { svg } = await mermaid.render(diagId, sanitizedCode);\n\n // Strip SVG clip-path attributes to eliminate clipping issues\n svg = svg\n .replace(/clip-path=\"url\\(#[^\"]+\\)\"/gi, '')\n .replace(/clip-path=\"[^\"]*\"/gi, '')\n .replace(/<clipPath[\\s\\S]*?<\\/clipPath>/gi, '');\n\n const wrapper = document.createElement('div');\n wrapper.className =\n 'marp-mermaid-rendered my-3 flex items-center justify-center p-3 rounded-xl bg-black/5 dark:bg-white/5 border border-black/10 dark:border-white/10 [&_svg]:max-w-full [&_svg]:h-auto';\n wrapper.setAttribute('data-chart-code', rawChartCode);\n wrapper.setAttribute('data-mermaid-processed', 'true');\n wrapper.innerHTML = svg;\n preEl.replaceWith(wrapper);\n } catch (renderErr) {\n console.warn('[presentation-kit] Mermaid render error:', renderErr);\n }\n }\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Click Preprocessor — Convert <!-- click --> / <!-- clicks --> to wrapped divs\n// Runs BEFORE Marp renders. Wraps content INSIDE divs for robust HTML structure.\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface ClickPreprocessResult {\n /** Processed markdown with HTML click markers */\n markdown: string;\n /** Total number of click groups assigned */\n totalClicks: number;\n}\n\n/**\n * Preprocess markdown to convert click directives to HTML wrappers.\n *\n * Syntax:\n * - `<!-- click -->` → Block-level: wraps next block in data-click-group=\"N\"\n * - `<!-- clicks -->` → Item-level: marks list for auto-expansion in postprocessor\n *\n * Auto-assigns sequential indices (1, 2, 3, ...) based on order of appearance.\n *\n * IMPORTANT: Skips code fences (``` ... ```) to avoid converting directives\n * inside code blocks.\n *\n * Strategy: Each `<!-- click -->` opens a `<div data-click-group=\"N\">` that wraps\n * all content until the next `<!-- click -->` / `<!-- clicks -->` or end of slide.\n * The postprocessor only needs to handle `<!-- clicks -->` (list expansion).\n */\nexport function preprocessClicks(markdown: string): ClickPreprocessResult {\n if (!markdown || !markdown.trim()) {\n return { markdown, totalClicks: 0 };\n }\n\n // Split markdown into segments: code fences vs normal content\n // Code fences are preserved untouched\n const segments = splitByCodeFences(markdown);\n\n let clickIndex = 0;\n let totalClicks = 0;\n let inClickBlock = false;\n\n const processed = segments\n .map((segment) => {\n // Code fences — pass through untouched\n if (segment.isCodeFence) {\n return segment.content;\n }\n\n // Normal content — process click directives\n let content = segment.content;\n\n // Replace <!-- click --> and <!-- clicks --> with HTML markers\n content = content.replace(\n /^<!--\\s*(click|clicks)\\s*-->$/gm,\n (match, type: string) => {\n clickIndex++;\n\n // Close previous click block if open\n const closePrev = inClickBlock ? '</div>\\n' : '';\n inClickBlock = true;\n\n if (type === 'clicks') {\n totalClicks++;\n // clicks marker — will be expanded in postprocessor\n return `${closePrev}<div data-clicks=\"${clickIndex}\">`;\n } else {\n totalClicks++;\n // click marker — wraps everything until next marker\n return `${closePrev}<div data-click-group=\"${clickIndex}\">`;\n }\n },\n );\n\n return content;\n })\n .join('');\n\n // Close the last click block if open\n const result = inClickBlock ? processed + '</div>' : processed;\n\n return { markdown: result, totalClicks };\n}\n\n/** Represents a segment of markdown (either code fence or normal content) */\ninterface Segment {\n content: string;\n isCodeFence: boolean;\n}\n\n/**\n * Split markdown into code fence and non-code-fence segments.\n * Code fences (``` ... ```) are preserved untouched.\n */\nfunction splitByCodeFences(markdown: string): Segment[] {\n const segments: Segment[] = [];\n const regex = /^(```[\\s\\S]*?^```)/gm;\n\n let lastIndex = 0;\n let match;\n\n while ((match = regex.exec(markdown)) !== null) {\n // Add non-code content before this fence\n if (match.index > lastIndex) {\n segments.push({\n content: markdown.slice(lastIndex, match.index),\n isCodeFence: false,\n });\n }\n // Add the code fence itself\n segments.push({\n content: match[0],\n isCodeFence: true,\n });\n lastIndex = match.index + match[0].length;\n }\n\n // Add remaining content\n if (lastIndex < markdown.length) {\n segments.push({\n content: markdown.slice(lastIndex),\n isCodeFence: false,\n });\n }\n\n return segments;\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Click Postprocessor — Expand <!-- clicks --> list items after Marp render\n//\n// The preprocessor already handles <!-- click --> wrapping (block-level).\n// This postprocessor only handles <!-- clicks --> (item-level list expansion).\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface ClickPostprocessResult {\n /** HTML with click groups applied */\n html: string;\n /** Total number of individual click groups (after expanding clicks) */\n totalClicks: number;\n}\n\n/**\n * Post-process rendered Marp HTML to expand clicks (item-level) list items.\n *\n * The preprocessor wraps <!-- click --> blocks in <div data-click-group=\"N\">.\n * This postprocessor handles <!-- clicks --> by splitting list items into\n * individual click groups.\n *\n * Pattern: <div data-clicks=\"N\">...<ul><li>...</li></ul>...</div>\n * Becomes: multiple <div data-click-group=\"N\">...<ul><li>...</li></ul>...</div>\n *\n * @param html - Raw Marp-rendered HTML (with click-group and clicks markers)\n * @returns HTML with all click groups expanded\n */\nexport function postprocessClicks(html: string): ClickPostprocessResult {\n if (!html || !html.includes('data-clicks')) {\n // No clicks markers — count existing click-groups\n const totalClicks = extractMaxClicks(html);\n return { html, totalClicks };\n }\n\n let result = html;\n let totalClicks = 0;\n\n // Handle <!-- clicks --> markers: expand list items into individual click groups\n // Pattern: <div data-clicks=\"N\">...(content with <ul>/<ol>)...</div>\n result = result.replace(\n /<div data-clicks=\"(\\d+)\">([\\s\\S]*?)<\\/div>/g,\n (_, startIdx: string, innerContent: string) => {\n const start = parseInt(startIdx, 10);\n\n // Check if inner content contains a list\n const listMatch = innerContent.match(/((?:<[^>]+>)*?<(?:ul|ol)[^>]*>[\\s\\S]*?<\\/(?:ul|ol)>)/);\n\n if (!listMatch) {\n // No list found — treat as single click group\n totalClicks++;\n return `<div data-click-group=\"${start}\">${innerContent}</div>`;\n }\n\n // Extract list items\n const listBlock = listMatch[0];\n const liRegex = /<li[^>]*>[\\s\\S]*?<\\/li>/g;\n const items: string[] = [];\n let liMatch;\n while ((liMatch = liRegex.exec(listBlock)) !== null) {\n items.push(liMatch[0]);\n }\n\n if (items.length === 0) {\n totalClicks++;\n return `<div data-click-group=\"${start}\">${innerContent}</div>`;\n }\n\n // Get list wrapper tags\n const listOpenTag = listBlock.match(/<(ul|ol)[^>]*>/)?.[0] ?? '<ul>';\n const listCloseTag = listBlock.match(/<\\/(ul|ol)>$/)?.[0] ?? '</ul>';\n\n // Wrap each item in its own click group\n let clickIdx = start;\n const wrappedItems = items.map((item) => {\n const idx = clickIdx++;\n totalClicks++;\n return `<div data-click-group=\"${idx}\">${listOpenTag}${item}${listCloseTag}</div>`;\n });\n\n return wrappedItems.join('\\n');\n },\n );\n\n // Also count any click-groups that were already in the HTML (from <!-- click -->)\n const existingGroups = extractMaxClicks(result);\n if (existingGroups > totalClicks) {\n totalClicks = existingGroups;\n }\n\n return { html: result, totalClicks };\n}\n\n/**\n * Extract max click index from rendered HTML.\n * Scans for all data-click-group=\"N\" attributes and returns the max N.\n */\nexport function extractMaxClicks(html: string): number {\n const matches = html.match(/data-click-group=\"(\\d+)\"/g);\n if (!matches) return 0;\n\n let max = 0;\n for (const match of matches) {\n const num = parseInt(match.match(/data-click-group=\"(\\d+)\"/)?.[1] ?? '0', 10);\n if (num > max) max = num;\n }\n return max;\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Click CSS — Scoped CSS for click-to-reveal animations\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface ClickCssOptions {\n /** Container ID to scope CSS (default: no scope, global) */\n containerId?: string;\n /** Animation duration in ms (default: 300) */\n duration?: number;\n /** Animation easing (default: 'ease') */\n easing?: string;\n /** Y offset for slide-up animation in px (default: 8) */\n offsetY?: number;\n /** Use slide-up animation (default: true) */\n slideUp?: boolean;\n /** Use fade animation (default: true) */\n fade?: boolean;\n}\n\n/**\n * Generate CSS for click-to-reveal system.\n *\n * Elements with `data-click-group=\"N\"` are hidden by default.\n * Adding class `visible` reveals them with animation.\n *\n * @param options - Animation options\n * @returns CSS string to inject via <style>\n */\nexport function generateClickCss(options?: ClickCssOptions): string {\n const {\n containerId,\n duration = 300,\n easing = 'ease',\n offsetY = 8,\n slideUp = true,\n fade = true,\n } = options ?? {};\n\n const prefix = containerId ? `#${containerId} ` : '';\n\n const opacityFrom = fade ? '0' : '1';\n const transformFrom = slideUp ? `translateY(${offsetY}px)` : 'none';\n const opacityTo = '1';\n const transformTo = 'translateY(0)';\n\n return `\n/* ── Click-to-Reveal System ── */\n${prefix}[data-click-group] {\n opacity: ${opacityFrom};\n ${slideUp ? `transform: ${transformFrom};` : ''}\n transition: opacity ${duration}ms ${easing}, transform ${duration}ms ${easing};\n pointer-events: none;\n}\n\n${prefix}[data-click-group].visible {\n opacity: ${opacityTo};\n ${slideUp ? `transform: ${transformTo};` : ''}\n pointer-events: auto;\n}\n\n`;\n}\n","import yaml from 'js-yaml';\nimport type { LayoutBoxConfig, SlideLayoutData } from '../../types.js';\n\n/**\n * Check if a comment string represents a layout definition\n */\nexport function isLayoutComment(comment: string): boolean {\n const trimmed = comment.trim();\n return trimmed.startsWith('layout:') || trimmed.startsWith('layout :');\n}\n\n/**\n * Parse YAML layout data from a comment string\n */\nexport function parseLayoutFromComment(comment: string): SlideLayoutData | null {\n try {\n const trimmed = comment.trim();\n if (!isLayoutComment(trimmed)) return null;\n\n const parsed = yaml.load(trimmed) as { layout?: { boxes?: LayoutBoxConfig[] }; boxes?: LayoutBoxConfig[] } | null;\n if (!parsed || typeof parsed !== 'object') return null;\n\n const boxes = parsed.boxes ?? parsed.layout?.boxes;\n if (Array.isArray(boxes)) {\n return { boxes };\n }\n return null;\n } catch (err) {\n console.warn('[presentation-kit] Failed to parse layout comment YAML:', err);\n return null;\n }\n}\n\n/**\n * Filter presenter notes from a slide's comment list,\n * excluding layout blocks and Marp system directives.\n */\nexport function filterPresenterNotes(comments: string[]): string[] {\n return comments\n .map(c => c.trim())\n .filter(c => {\n if (!c) return false;\n // Skip layout definitions\n if (isLayoutComment(c)) return false;\n // Skip Marp directives like <!-- _backgroundColor: ... --> or <!-- paginate: true -->\n if (/^_?[a-zA-Z0-9_-]+\\s*:/i.test(c) && !c.toLowerCase().startsWith('note:')) {\n return false;\n }\n return true;\n })\n .map(c => {\n // If starts with \"note:\" or \"_note:\", strip the prefix\n return c.replace(/^_?note:\\s*/i, '').trim();\n });\n}\n\n/**\n * Extract per-slide layout data and presenter notes from Marp's comments array.\n */\nexport function extractLayoutsAndNotes(rawComments: (string[] | undefined)[]): {\n layouts: (SlideLayoutData | null)[];\n notes: string[][];\n} {\n const layouts: (SlideLayoutData | null)[] = [];\n const notes: string[][] = [];\n\n for (const slideComments of rawComments) {\n if (!slideComments || slideComments.length === 0) {\n layouts.push(null);\n notes.push([]);\n continue;\n }\n\n let slideLayout: SlideLayoutData | null = null;\n\n for (const comment of slideComments) {\n if (isLayoutComment(comment)) {\n const parsed = parseLayoutFromComment(comment);\n if (parsed) {\n slideLayout = parsed;\n }\n }\n }\n\n layouts.push(slideLayout);\n notes.push(filterPresenterNotes(slideComments));\n }\n\n return { layouts, notes };\n}\n","import type { SlideLayoutData } from '../../types.js';\n\n/**\n * Generate scoped CSS for per-slide layout overrides.\n *\n * Targets each slide's section within Marp's 1280x720 SVG coordinate space.\n */\nexport function generateLayoutCss(\n layouts: (SlideLayoutData | null)[],\n containerId: string = 'marp-container'\n): string {\n const cssRules: string[] = [];\n\n layouts.forEach((layout, index) => {\n if (!layout || !layout.boxes || layout.boxes.length === 0) return;\n\n const slideNum = index + 1;\n const sectionSelectors = [\n `#${containerId} svg[data-marpit-svg]:nth-of-type(${slideNum}) section`,\n `#${containerId} .marpit > svg:nth-of-type(${slideNum}) section`,\n `#${containerId} > svg:nth-of-type(${slideNum}) section`,\n ];\n\n // Make section position: relative so absolute boxes position correctly within 1280x720 canvas\n cssRules.push(`\n/* Slide ${slideNum} Layout Container */\n${sectionSelectors.join(',\\n')} {\n position: relative !important;\n display: block !important;\n}`);\n\n for (const box of layout.boxes) {\n if (!box || !Array.isArray(box.pos) || box.pos.length < 4) continue;\n\n const [x, y, w, h] = box.pos;\n // Target selector inside the slide\n const targetSelector = box.target || `[data-box-id=\"${box.id}\"]`;\n const ruleSelector = sectionSelectors.map(s => `${s} ${targetSelector}`).join(',\\n');\n\n const styles: string[] = [\n `position: absolute !important`,\n `left: ${Math.round(x)}px !important`,\n `top: ${Math.round(y)}px !important`,\n `width: ${Math.round(w)}px !important`,\n `min-height: ${Math.round(h)}px !important`,\n `box-sizing: border-box !important`,\n `margin: 0 !important`,\n `word-break: break-word !important`,\n `overflow-wrap: break-word !important`,\n `white-space: normal !important`,\n ];\n\n if (targetSelector.includes('li')) {\n styles.push(`list-style-position: inside !important`);\n }\n\n if (box.fontSize) {\n styles.push(`font-size: ${box.fontSize} !important`);\n }\n if (box.color) {\n styles.push(`color: ${box.color} !important`);\n }\n if (box.textAlign) {\n styles.push(`text-align: ${box.textAlign} !important`);\n }\n if (box.style) {\n styles.push(box.style);\n }\n\n cssRules.push(`\n${ruleSelector} {\n ${styles.join(';\\n ')};\n}`);\n }\n });\n\n return cssRules.join('\\n');\n}\n","// ═══════════════════════════════════════════════════════════════════════════════\n// Core Render — Client-side Marp rendering\n// Replaces: apps/web/app/api/render-marp (server-side HTTP roundtrip)\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport { Marp } from '@marp-team/marp-core';\nimport type { SlideRenderResult, SlideRenderAsyncResult, SlideRenderOptions, MermaidBlock } from '../types.js';\nimport { convertTextArrows } from './arrow-converter.js';\nimport { extractMarpSource } from './source-extractor.js';\nimport { resolveTheme, generateScopedCss } from '../themes/index.js';\nimport { detectMermaidBlocks } from '../plugins/mermaid.js';\nimport { highlightCodeBlocks } from '../plugins/shiki.js';\nimport { preprocessClicks } from '../vclick/preprocessor.js';\nimport { postprocessClicks } from '../vclick/postprocessor.js';\nimport { generateClickCss } from '../vclick/click-css.js';\nimport { extractLayoutsAndNotes, generateLayoutCss } from './layout/index.js';\n\ninterface RenderMarpResult {\n html: string;\n css: string;\n comments: (string[] | undefined)[];\n maxClicks: number;\n}\n\n/**\n * Low-level synchronous Marp render.\n * Preprocesses clicks, converts arrows, renders Marp, postprocesses clicks.\n */\nexport function renderMarp(\n markdown: string,\n containerId: string = 'marp-container',\n enableClicks: boolean = false,\n): RenderMarpResult {\n const cleanSource = extractMarpSource(markdown);\n \n const { markdown: clickProcessed, totalClicks } = enableClicks\n ? preprocessClicks(cleanSource)\n : { markdown: cleanSource, totalClicks: 0 };\n \n const arrowsConverted = convertTextArrows(clickProcessed);\n\n const marp = new Marp({\n container: { tag: 'div', id: containerId },\n html: true,\n emoji: { unicode: true },\n });\n\n const { html, css, comments } = marp.render(arrowsConverted);\n\n // Postprocess click groups if clicks were preprocessed\n if (enableClicks && totalClicks > 0) {\n const { html: processedHtml, totalClicks: finalClicks } = postprocessClicks(html);\n return { html: processedHtml, css, comments: (comments ?? []) as (string[] | undefined)[], maxClicks: finalClicks };\n }\n\n return { html, css, comments: (comments ?? []) as (string[] | undefined)[], maxClicks: 0 };\n}\n\n/**\n * Count slides in rendered Marp HTML by detecting <svg data-marpit-svg> elements.\n */\nexport function countSlides(html: string): number {\n const matches = html.match(/<svg[^>]*data-marpit-svg/g);\n return matches ? matches.length : 1;\n}\n\n/**\n * High-level synchronous render — resolves theme, generates scoped CSS,\n * detects mermaid blocks. Does NOT apply Shiki or Mermaid rendering.\n */\nexport function renderSlide(\n markdown: string,\n options?: SlideRenderOptions,\n): SlideRenderResult {\n const containerId = options?.containerId ?? 'marp-container';\n const theme = resolveTheme(options?.theme ?? 'dark');\n const enableClicks = options?.enableClicks ?? false;\n\n const { html, css, comments, maxClicks } = renderMarp(markdown, containerId, enableClicks);\n const themeCss = generateScopedCss(theme, containerId);\n const slideCount = countSlides(html);\n const mermaidBlocks = options?.enableMermaid !== false\n ? detectMermaidBlocks(html)\n : [];\n const clickCss = enableClicks\n ? generateClickCss({ containerId })\n : '';\n\n const { layouts, notes } = extractLayoutsAndNotes(comments);\n const layoutCss = generateLayoutCss(layouts, containerId);\n\n return {\n html,\n css,\n themeCss,\n layoutCss,\n slideCount,\n mermaidBlocks,\n clickCss,\n maxClicks,\n notes,\n layouts,\n };\n}\n\n/**\n * High-level async render — applies Shiki syntax highlighting.\n * Mermaid blocks are returned separately (DOM-based, consumer renders them).\n */\nexport async function renderSlideAsync(\n markdown: string,\n options?: SlideRenderOptions,\n): Promise<SlideRenderAsyncResult> {\n const containerId = options?.containerId ?? 'marp-container';\n const theme = resolveTheme(options?.theme ?? 'dark');\n const enableClicks = options?.enableClicks ?? false;\n\n const { html, css, comments, maxClicks } = renderMarp(markdown, containerId, enableClicks);\n const themeCss = generateScopedCss(theme, containerId);\n const slideCount = countSlides(html);\n const mermaidBlocks = options?.enableMermaid !== false\n ? detectMermaidBlocks(html)\n : [];\n const clickCss = enableClicks\n ? generateClickCss({ containerId })\n : '';\n\n const { layouts, notes } = extractLayoutsAndNotes(comments);\n const layoutCss = generateLayoutCss(layouts, containerId);\n\n // Apply Shiki syntax highlighting\n const enableShiki = options?.enableShiki ?? true;\n const processedHtml = enableShiki\n ? await highlightCodeBlocks(html, theme.name)\n : html;\n\n return {\n html,\n css,\n themeCss,\n layoutCss,\n processedHtml,\n slideCount,\n mermaidBlocks,\n clickCss,\n maxClicks,\n notes,\n layouts,\n };\n}\n"]}