@bendyline/squisq-formats 1.2.1 → 1.2.2

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.
@@ -54,6 +54,22 @@ async function markdownDocToEpub(doc, options = {}) {
54
54
  const isPng = bytes.length >= 4 && bytes[0] === 137 && bytes[1] === 80 && bytes[2] === 78 && bytes[3] === 71;
55
55
  coverFilename = isPng ? "cover.png" : "cover.jpg";
56
56
  zip.file(`OEBPS/images/${coverFilename}`, options.coverImage);
57
+ const coverXhtml = `<?xml version="1.0" encoding="UTF-8"?>
58
+ <!DOCTYPE html>
59
+ <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops">
60
+ <head>
61
+ <meta charset="UTF-8"/>
62
+ <title>Cover</title>
63
+ <style>
64
+ body { margin: 0; padding: 0; text-align: center; }
65
+ img { max-width: 100%; max-height: 100%; }
66
+ </style>
67
+ </head>
68
+ <body>
69
+ <img src="../images/${escapeXml(coverFilename)}" alt="Cover"/>
70
+ </body>
71
+ </html>`;
72
+ zip.file("OEBPS/chapters/cover.xhtml", coverXhtml);
57
73
  }
58
74
  const audioMap = options.audio;
59
75
  const audioSegments = options.audioSegments;
@@ -228,7 +244,7 @@ function collectDocImages(nodes) {
228
244
  }
229
245
  }
230
246
  function walkInline(node) {
231
- if (node.type === "image" && node.url && !node.url.startsWith("data:") && !node.url.startsWith("http")) {
247
+ if (node.type === "image" && node.url && !node.url.startsWith("data:")) {
232
248
  images.add(node.url);
233
249
  }
234
250
  if ("children" in node && Array.isArray(node.children)) {
@@ -414,6 +430,9 @@ function generateContentOpf(params) {
414
430
  manifestItems.push(
415
431
  ` <item id="cover-image" href="images/${escapeXml(coverFilename)}" media-type="${mime}" properties="cover-image"/>`
416
432
  );
433
+ manifestItems.push(
434
+ ' <item id="cover-page" href="chapters/cover.xhtml" media-type="application/xhtml+xml"/>'
435
+ );
417
436
  }
418
437
  for (const chap of chapters) {
419
438
  const overlayAttr = chap.smilFilename ? ` media-overlay="${chap.id}-overlay"` : "";
@@ -446,7 +465,14 @@ function generateContentOpf(params) {
446
465
  ` <item id="${imgId}" href="images/${escapeXml(img.filename)}" media-type="${img.mime}"/>`
447
466
  );
448
467
  }
449
- const spineItems = chapters.map((chap) => ` <itemref idref="${chap.id}"/>`).join("\n");
468
+ const spineEntries = [];
469
+ if (coverFilename) {
470
+ spineEntries.push(' <itemref idref="cover-page"/>');
471
+ }
472
+ for (const chap of chapters) {
473
+ spineEntries.push(` <itemref idref="${chap.id}"/>`);
474
+ }
475
+ const spineItems = spineEntries.join("\n");
450
476
  const metaParts = [
451
477
  ` <dc:identifier id="uid">urn:uuid:${uuid}</dc:identifier>`,
452
478
  ` <dc:title>${escapeXml(title)}</dc:title>`,
@@ -618,4 +644,4 @@ export {
618
644
  markdownDocToEpub,
619
645
  docToEpub
620
646
  };
621
- //# sourceMappingURL=chunk-2FPJKJ6I.js.map
647
+ //# sourceMappingURL=chunk-EUQQYBZZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/epub/export.ts"],"sourcesContent":["/**\n * EPUB 3 Export\n *\n * Converts a MarkdownDocument (or Doc) to an EPUB 3 file (.epub).\n *\n * An EPUB is a ZIP archive containing XHTML chapter files, images,\n * a package manifest (content.opf), and a navigation document (toc.xhtml).\n * Content is split into chapters at H1/H2 heading boundaries.\n *\n * Uses JSZip for packaging (already a dependency), escapeXml from the\n * OOXML utils, and image utilities from the HTML exporter.\n *\n * @example\n * ```ts\n * import { markdownDocToEpub } from '@bendyline/squisq-formats/epub';\n *\n * const epub = await markdownDocToEpub(markdownDoc, {\n * title: 'My Book',\n * author: 'Jane Doe',\n * });\n * ```\n */\n\nimport JSZip from 'jszip';\nimport type { Doc, AudioSegment } from '@bendyline/squisq/schemas';\nimport { resolveTheme } from '@bendyline/squisq/schemas';\nimport type {\n MarkdownDocument,\n MarkdownBlockNode,\n MarkdownInlineNode,\n MarkdownHeading,\n MarkdownParagraph,\n MarkdownListItem,\n MarkdownTable,\n MarkdownTableRow,\n MarkdownTableCell,\n} from '@bendyline/squisq/markdown';\nimport { escapeXml } from '../ooxml/xmlUtils.js';\nimport { inferMimeType, extractFilename } from '../html/imageUtils.js';\n\n// ── Public API ────────────────────────────────────────────────────\n\nexport interface EpubExportOptions {\n /** Book title (default: 'Untitled') */\n title?: string;\n /** Author name */\n author?: string;\n /** Book description / summary */\n description?: string;\n /** BCP-47 language code (default: 'en') */\n language?: string;\n /** Publisher name */\n publisher?: string;\n /** Squisq theme ID for CSS styling */\n themeId?: string;\n /** Pre-resolved image data keyed by relative path as it appears in the markdown */\n images?: Map<string, ArrayBuffer>;\n /** Cover image data (JPEG or PNG) */\n coverImage?: ArrayBuffer;\n /**\n * Audio narration data keyed by segment src/name.\n * When provided alongside audioSegments, EPUB 3 Media Overlays (SMIL)\n * are generated for synchronized audio playback.\n */\n audio?: Map<string, ArrayBuffer>;\n /**\n * Audio segment metadata (from Doc.audio.segments).\n * Required together with `audio` to generate Media Overlays.\n * Each segment's duration and startTime are used to build SMIL timing.\n */\n audioSegments?: AudioSegment[];\n /** Total document duration in seconds (used for Media Overlay metadata) */\n totalDuration?: number;\n}\n\n/**\n * Convert a MarkdownDocument to an EPUB 3 file.\n *\n * Chapters are split at H1/H2 heading boundaries. All referenced images\n * (provided via `options.images`) are embedded in the archive.\n */\nexport async function markdownDocToEpub(\n doc: MarkdownDocument,\n options: EpubExportOptions = {},\n): Promise<ArrayBuffer> {\n const fmTitle = doc.frontmatter?.title;\n const fmAuthor = doc.frontmatter?.author;\n const title = options.title ?? (typeof fmTitle === 'string' ? fmTitle : 'Untitled');\n const author = options.author ?? (typeof fmAuthor === 'string' ? fmAuthor : '');\n const language = options.language ?? 'en';\n const description = options.description ?? '';\n const publisher = options.publisher ?? '';\n const uuid = crypto.randomUUID();\n\n // Split document into chapters\n const chapters = splitIntoChapters(doc.children);\n\n // Collect images referenced in the document, deduplicating filenames\n const imageEntries = collectDocImages(doc.children);\n const resolvedImages = new Map<string, { data: ArrayBuffer; mime: string; filename: string }>();\n if (options.images) {\n const usedNames = new Set<string>();\n for (const src of imageEntries) {\n const data = options.images.get(src);\n if (data) {\n let filename = extractFilename(src);\n // Deduplicate: if two paths share a basename (e.g. a/hero.png and b/hero.png)\n if (usedNames.has(filename)) {\n const dot = filename.lastIndexOf('.');\n const base = dot > 0 ? filename.slice(0, dot) : filename;\n const ext = dot > 0 ? filename.slice(dot) : '';\n let counter = 2;\n while (usedNames.has(`${base}-${counter}${ext}`)) counter++;\n filename = `${base}-${counter}${ext}`;\n }\n usedNames.add(filename);\n resolvedImages.set(src, { data, mime: inferMimeType(filename), filename });\n }\n }\n }\n\n // Generate theme CSS\n const css = generateStylesheet(options.themeId);\n\n // Build the ZIP\n const zip = new JSZip();\n\n // mimetype must be first entry, stored (not compressed)\n zip.file('mimetype', 'application/epub+zip', { compression: 'STORE' });\n\n // META-INF/container.xml\n zip.file('META-INF/container.xml', CONTAINER_XML);\n\n // OEBPS/styles.css\n zip.file('OEBPS/styles.css', css);\n\n // OEBPS/images/*\n for (const [, img] of resolvedImages) {\n zip.file(`OEBPS/images/${img.filename}`, img.data);\n }\n\n // Cover image — detect PNG vs JPEG from magic bytes.\n // When provided, generates a cover.xhtml page in the spine so e-readers\n // (especially Kindle) display the cover as both thumbnail and first page.\n let coverFilename: string | undefined;\n if (options.coverImage) {\n const bytes = new Uint8Array(options.coverImage);\n const isPng =\n bytes.length >= 4 &&\n bytes[0] === 0x89 &&\n bytes[1] === 0x50 &&\n bytes[2] === 0x4e &&\n bytes[3] === 0x47;\n coverFilename = isPng ? 'cover.png' : 'cover.jpg';\n zip.file(`OEBPS/images/${coverFilename}`, options.coverImage);\n\n // Generate cover XHTML page — full-bleed image, no margins\n const coverXhtml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:epub=\"http://www.idpf.org/2007/ops\">\n<head>\n <meta charset=\"UTF-8\"/>\n <title>Cover</title>\n <style>\n body { margin: 0; padding: 0; text-align: center; }\n img { max-width: 100%; max-height: 100%; }\n </style>\n</head>\n<body>\n <img src=\"../images/${escapeXml(coverFilename)}\" alt=\"Cover\"/>\n</body>\n</html>`;\n zip.file('OEBPS/chapters/cover.xhtml', coverXhtml);\n }\n\n // ── Audio narration ──────────────────────────────────────────────\n const audioMap = options.audio;\n const audioSegments = options.audioSegments;\n const hasAudio = audioMap && audioSegments && audioSegments.length > 0;\n // Per-segment audio file info, indexed by segment index (null if data missing)\n const segmentAudioFiles: ({ filename: string; mime: string } | null)[] = [];\n const allAudioFiles: { filename: string; mime: string }[] = [];\n\n if (hasAudio) {\n for (const seg of audioSegments) {\n const data = audioMap.get(seg.src) ?? audioMap.get(seg.name);\n if (data) {\n const filename = extractFilename(seg.src);\n const finalName = filename.includes('.') ? filename : `${filename}.mp3`;\n zip.file(`OEBPS/audio/${finalName}`, data);\n const info = { filename: finalName, mime: inferMimeType(finalName) };\n segmentAudioFiles.push(info);\n allAudioFiles.push(info);\n } else {\n segmentAudioFiles.push(null);\n }\n }\n }\n\n // Build chapter-to-audio mapping for SMIL overlays\n const chapterAudio: (ChapterAudioInfo | null)[] = [];\n if (hasAudio && allAudioFiles.length > 0) {\n if (chapters.length !== audioSegments.length) {\n console.warn(\n `EPUB: ${chapters.length} chapters but ${audioSegments.length} audio segments — ` +\n `extra chapters will reuse the last segment's audio`,\n );\n }\n for (let i = 0; i < chapters.length; i++) {\n const segIdx = Math.min(i, audioSegments.length - 1);\n const seg = audioSegments[segIdx];\n const audioFile = segmentAudioFiles[segIdx];\n if (audioFile) {\n chapterAudio.push({\n audioFilename: audioFile.filename,\n clipStart: 0,\n clipEnd: seg.duration,\n duration: seg.duration,\n });\n } else {\n chapterAudio.push(null);\n }\n }\n }\n\n // OEBPS/chapters/*.xhtml + optional SMIL overlays\n const chapterFiles: ChapterFileInfo[] = [];\n for (let i = 0; i < chapters.length; i++) {\n const chap = chapters[i];\n const num = String(i + 1).padStart(3, '0');\n const id = `chapter-${num}`;\n const filename = `${id}.xhtml`;\n const audioInfo = chapterAudio[i] ?? null;\n\n // Render XHTML with element IDs for SMIL references when audio is present\n const xhtml = renderChapterXhtml(chap.nodes, title, resolvedImages, audioInfo !== null);\n zip.file(`OEBPS/chapters/${filename}`, xhtml);\n\n let smilFilename: string | undefined;\n if (audioInfo) {\n smilFilename = `${id}.smil`;\n const smil = generateSmil(filename, audioInfo, chap.nodes);\n zip.file(`OEBPS/chapters/${smilFilename}`, smil);\n }\n\n chapterFiles.push({\n id,\n filename,\n title: chap.title,\n smilFilename,\n duration: audioInfo?.duration,\n });\n }\n\n // OEBPS/toc.xhtml (EPUB 3 nav)\n zip.file('OEBPS/toc.xhtml', generateTocXhtml(chapterFiles, title));\n\n // OEBPS/content.opf\n zip.file(\n 'OEBPS/content.opf',\n generateContentOpf({\n uuid,\n title,\n author,\n language,\n description,\n publisher,\n chapters: chapterFiles,\n images: resolvedImages,\n coverFilename,\n audioFiles: allAudioFiles,\n totalDuration: options.totalDuration,\n }),\n );\n\n const blob = await zip.generateAsync({\n type: 'arraybuffer',\n compression: 'DEFLATE',\n compressionOptions: { level: 6 },\n // mimetype was already set to STORE above; JSZip respects per-file options\n });\n\n return blob;\n}\n\n/**\n * Convert a squisq Doc to an EPUB 3 file.\n *\n * Convenience wrapper: Doc → MarkdownDocument → EPUB.\n * When the Doc has audio segments and `options.audio` is provided,\n * EPUB 3 Media Overlays are generated for narrated playback.\n */\nexport async function docToEpub(doc: Doc, options: EpubExportOptions = {}): Promise<ArrayBuffer> {\n const { docToMarkdown } = await import('@bendyline/squisq/doc');\n const markdownDoc = docToMarkdown(doc);\n\n // Thread audio segment metadata from the Doc into options\n const epubOptions: EpubExportOptions = { ...options };\n if (doc.audio?.segments?.length && !epubOptions.audioSegments) {\n epubOptions.audioSegments = doc.audio.segments;\n }\n if (doc.duration && !epubOptions.totalDuration) {\n epubOptions.totalDuration = doc.duration;\n }\n\n return markdownDocToEpub(markdownDoc, epubOptions);\n}\n\n// ── Chapter Splitting ─────────────────────────────────────────────\n\ninterface Chapter {\n title: string;\n nodes: MarkdownBlockNode[];\n}\n\ninterface ChapterFileInfo {\n id: string;\n filename: string;\n title: string;\n smilFilename?: string;\n duration?: number;\n}\n\ninterface ChapterAudioInfo {\n audioFilename: string;\n clipStart: number;\n clipEnd: number;\n duration: number;\n}\n\nfunction splitIntoChapters(nodes: MarkdownBlockNode[]): Chapter[] {\n const chapters: Chapter[] = [];\n let currentNodes: MarkdownBlockNode[] = [];\n let currentTitle = 'Untitled';\n\n for (const node of nodes) {\n if (node.type === 'heading' && node.depth <= 2) {\n // Flush previous chapter\n if (currentNodes.length > 0) {\n chapters.push({ title: currentTitle, nodes: currentNodes });\n }\n currentTitle = extractHeadingText(node);\n currentNodes = [node];\n } else {\n currentNodes.push(node);\n }\n }\n\n // Flush remaining\n if (currentNodes.length > 0) {\n chapters.push({ title: currentTitle, nodes: currentNodes });\n }\n\n // If no chapters were created, wrap everything as one\n if (chapters.length === 0) {\n chapters.push({ title: 'Untitled', nodes: [] });\n }\n\n return chapters;\n}\n\nfunction extractHeadingText(heading: MarkdownHeading): string {\n return heading.children.map(inlineToText).join('');\n}\n\nfunction inlineToText(node: MarkdownInlineNode): string {\n switch (node.type) {\n case 'text':\n return node.value;\n case 'emphasis':\n case 'strong':\n case 'delete':\n return node.children.map(inlineToText).join('');\n case 'inlineCode':\n return node.value;\n case 'link':\n return node.children.map(inlineToText).join('');\n case 'image':\n return node.alt ?? '';\n case 'break':\n return ' ';\n default:\n return '';\n }\n}\n\n// ── Image Collection ──────────────────────────────────────────────\n\nfunction collectDocImages(nodes: MarkdownBlockNode[]): Set<string> {\n const images = new Set<string>();\n\n function walkBlock(node: MarkdownBlockNode): void {\n switch (node.type) {\n case 'paragraph':\n case 'heading':\n node.children.forEach(walkInline);\n break;\n case 'blockquote':\n node.children.forEach(walkBlock);\n break;\n case 'list':\n node.children.forEach((item) => item.children.forEach(walkBlock));\n break;\n case 'table':\n node.children.forEach((row) =>\n row.children.forEach((cell) => cell.children.forEach(walkInline)),\n );\n break;\n default:\n break;\n }\n }\n\n function walkInline(node: MarkdownInlineNode): void {\n if (node.type === 'image' && node.url && !node.url.startsWith('data:')) {\n images.add(node.url);\n }\n if ('children' in node && Array.isArray(node.children)) {\n (node.children as MarkdownInlineNode[]).forEach(walkInline);\n }\n }\n\n nodes.forEach(walkBlock);\n return images;\n}\n\n// ── XHTML Rendering ───────────────────────────────────────────────\n\ntype ImageMap = Map<string, { data: ArrayBuffer; mime: string; filename: string }>;\n\nfunction renderChapterXhtml(\n nodes: MarkdownBlockNode[],\n bookTitle: string,\n images: ImageMap,\n addIds = false,\n): string {\n let elementCounter = 0;\n const nextId = () => `p${++elementCounter}`;\n const body = nodes.map((n) => blockToXhtml(n, images, addIds ? nextId : undefined)).join('\\n');\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:epub=\"http://www.idpf.org/2007/ops\">\n<head>\n <meta charset=\"UTF-8\"/>\n <title>${escapeXml(bookTitle)}</title>\n <link rel=\"stylesheet\" type=\"text/css\" href=\"../styles.css\"/>\n</head>\n<body>\n${body}\n</body>\n</html>`;\n}\n\nfunction blockToXhtml(node: MarkdownBlockNode, images: ImageMap, nextId?: () => string): string {\n const idAttr = nextId ? ` id=\"${nextId()}\"` : '';\n\n switch (node.type) {\n case 'heading': {\n const tag = `h${node.depth}`;\n return `<${tag}${idAttr}>${inlinesToXhtml(node.children, images)}</${tag}>`;\n }\n\n case 'paragraph':\n return `<p${idAttr}>${inlinesToXhtml(node.children, images)}</p>`;\n\n case 'blockquote':\n return `<blockquote${idAttr}>\\n${node.children.map((c) => blockToXhtml(c, images, nextId)).join('\\n')}\\n</blockquote>`;\n\n case 'list': {\n const tag = node.ordered ? 'ol' : 'ul';\n const startAttr =\n node.ordered && node.start && node.start !== 1 ? ` start=\"${node.start}\"` : '';\n const items = node.children.map((item) => listItemToXhtml(item, images)).join('\\n');\n return `<${tag}${idAttr}${startAttr}>\\n${items}\\n</${tag}>`;\n }\n\n case 'code': {\n const langAttr = node.lang ? ` class=\"language-${escapeXml(node.lang)}\"` : '';\n return `<pre${idAttr}><code${langAttr}>${escapeXml(node.value)}</code></pre>`;\n }\n\n case 'thematicBreak':\n return `<hr${idAttr}/>`;\n\n case 'table':\n return tableToXhtml(node as MarkdownTable, images, idAttr);\n\n case 'htmlBlock':\n // Strip HTML tags for XHTML safety — raw HTML may not be well-formed XML\n return `<p${idAttr}>${escapeXml(node.rawHtml.replace(/<[^>]+>/g, ''))}</p>`;\n\n case 'math':\n return `<p${idAttr} class=\"math\">${escapeXml(node.value)}</p>`;\n\n default:\n return '';\n }\n}\n\nfunction listItemToXhtml(item: MarkdownListItem, images: ImageMap): string {\n const content = item.children.map((c) => blockToXhtml(c, images)).join('\\n');\n // Unwrap single <p> inside <li> for cleaner output\n const unwrapped =\n item.children.length === 1 && item.children[0].type === 'paragraph'\n ? inlinesToXhtml((item.children[0] as MarkdownParagraph).children, images)\n : content;\n return `<li>${unwrapped}</li>`;\n}\n\nfunction tableToXhtml(table: MarkdownTable, images: ImageMap, idAttr = ''): string {\n const rows = table.children;\n if (rows.length === 0) return `<table${idAttr}></table>`;\n\n const headerRow = rows[0];\n const bodyRows = rows.slice(1);\n const align = table.align ?? [];\n\n function cellToXhtml(cell: MarkdownTableCell, tag: 'th' | 'td', colIndex: number): string {\n const a = align[colIndex];\n const style = a ? ` style=\"text-align: ${a}\"` : '';\n return `<${tag}${style}>${inlinesToXhtml(cell.children, images)}</${tag}>`;\n }\n\n const thead = `<thead><tr>${headerRow.children.map((c, i) => cellToXhtml(c, 'th', i)).join('')}</tr></thead>`;\n const tbody =\n bodyRows.length > 0\n ? `<tbody>${bodyRows.map((row: MarkdownTableRow) => `<tr>${row.children.map((c, i) => cellToXhtml(c, 'td', i)).join('')}</tr>`).join('')}</tbody>`\n : '';\n\n return `<table${idAttr}>${thead}${tbody}</table>`;\n}\n\nfunction inlinesToXhtml(nodes: MarkdownInlineNode[], images: ImageMap): string {\n return nodes.map((n) => inlineToXhtml(n, images)).join('');\n}\n\nfunction inlineToXhtml(node: MarkdownInlineNode, images: ImageMap): string {\n switch (node.type) {\n case 'text':\n return escapeXml(node.value);\n\n case 'strong':\n return `<strong>${inlinesToXhtml(node.children, images)}</strong>`;\n\n case 'emphasis':\n return `<em>${inlinesToXhtml(node.children, images)}</em>`;\n\n case 'delete':\n return `<del>${inlinesToXhtml(node.children, images)}</del>`;\n\n case 'inlineCode':\n return `<code>${escapeXml(node.value)}</code>`;\n\n case 'link': {\n const titleAttr = node.title ? ` title=\"${escapeXml(node.title)}\"` : '';\n return `<a href=\"${escapeXml(node.url)}\"${titleAttr}>${inlinesToXhtml(node.children, images)}</a>`;\n }\n\n case 'image': {\n const alt = escapeXml(node.alt ?? '');\n const resolved = images.get(node.url);\n const src = resolved ? `../images/${resolved.filename}` : escapeXml(node.url);\n return `<img src=\"${src}\" alt=\"${alt}\"/>`;\n }\n\n case 'break':\n return '<br/>';\n\n case 'inlineMath':\n return `<span class=\"math\">${escapeXml(node.value)}</span>`;\n\n case 'htmlInline':\n // Strip tags for XHTML safety\n return escapeXml(node.rawHtml.replace(/<[^>]+>/g, ''));\n\n default:\n return '';\n }\n}\n\n// ── SMIL Media Overlays ───────────────────────────────────────────\n\n/**\n * Generate an EPUB 3 Media Overlay (SMIL) file for a chapter.\n * Maps block-level elements to audio clip ranges for synchronized narration.\n */\nfunction generateSmil(\n chapterFilename: string,\n audioInfo: ChapterAudioInfo,\n nodes: MarkdownBlockNode[],\n): string {\n // Count block elements to match the IDs generated by blockToXhtml.\n // Must mirror blockToXhtml's recursion: each block gets an ID,\n // blockquote children recurse (they pass nextId), but list items do not.\n let elementCount = 0;\n function countBlocks(node: MarkdownBlockNode): void {\n elementCount++;\n if (node.type === 'blockquote') node.children.forEach(countBlocks);\n }\n nodes.forEach(countBlocks);\n\n if (elementCount === 0) elementCount = 1;\n\n // Distribute audio duration evenly across elements (best effort without word-level timing)\n const clipDuration = audioInfo.duration / elementCount;\n const pars: string[] = [];\n\n for (let i = 0; i < elementCount; i++) {\n const clipStart = formatTime(audioInfo.clipStart + i * clipDuration, true);\n const clipEnd = formatTime(audioInfo.clipStart + (i + 1) * clipDuration, true);\n pars.push(\n ` <par id=\"par-${i + 1}\">` +\n `\\n <text src=\"${chapterFilename}#p${i + 1}\"/>` +\n `\\n <audio src=\"../audio/${escapeXml(audioInfo.audioFilename)}\" clipBegin=\"${clipStart}\" clipEnd=\"${clipEnd}\"/>` +\n `\\n </par>`,\n );\n }\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<smil xmlns=\"http://www.w3.org/ns/SMIL\" xmlns:epub=\"http://www.idpf.org/2007/ops\" version=\"3.0\">\n <body>\n <seq id=\"seq-1\" epub:textref=\"${chapterFilename}\">\n${pars.join('\\n')}\n </seq>\n </body>\n</smil>`;\n}\n\nfunction formatTime(seconds: number, fractional = false): string {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = seconds % 60;\n const sPart = fractional ? s.toFixed(3).padStart(6, '0') : String(Math.floor(s)).padStart(2, '0');\n return `${h}:${String(m).padStart(2, '0')}:${sPart}`;\n}\n\n// ── Package Documents ─────────────────────────────────────────────\n\nconst CONTAINER_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<container version=\"1.0\" xmlns=\"urn:oasis:names:tc:opendocument:xmlns:container\">\n <rootfiles>\n <rootfile full-path=\"OEBPS/content.opf\" media-type=\"application/oebps-package+xml\"/>\n </rootfiles>\n</container>`;\n\ninterface OpfParams {\n uuid: string;\n title: string;\n author: string;\n language: string;\n description: string;\n publisher: string;\n chapters: ChapterFileInfo[];\n images: ImageMap;\n coverFilename?: string;\n audioFiles?: { filename: string; mime: string }[];\n totalDuration?: number;\n}\n\nfunction generateContentOpf(params: OpfParams): string {\n const {\n uuid,\n title,\n author,\n language,\n description,\n publisher,\n chapters,\n images,\n coverFilename,\n audioFiles,\n totalDuration,\n } = params;\n const modified = new Date().toISOString().replace(/\\.\\d+Z$/, 'Z');\n const hasOverlays = chapters.some((c) => c.smilFilename);\n\n // Manifest items\n const manifestItems: string[] = [\n ' <item id=\"toc\" href=\"toc.xhtml\" media-type=\"application/xhtml+xml\" properties=\"nav\"/>',\n ' <item id=\"css\" href=\"styles.css\" media-type=\"text/css\"/>',\n ];\n\n if (coverFilename) {\n const mime = inferMimeType(coverFilename);\n manifestItems.push(\n ` <item id=\"cover-image\" href=\"images/${escapeXml(coverFilename)}\" media-type=\"${mime}\" properties=\"cover-image\"/>`,\n );\n manifestItems.push(\n ' <item id=\"cover-page\" href=\"chapters/cover.xhtml\" media-type=\"application/xhtml+xml\"/>',\n );\n }\n\n for (const chap of chapters) {\n const overlayAttr = chap.smilFilename ? ` media-overlay=\"${chap.id}-overlay\"` : '';\n manifestItems.push(\n ` <item id=\"${chap.id}\" href=\"chapters/${escapeXml(chap.filename)}\" media-type=\"application/xhtml+xml\"${overlayAttr}/>`,\n );\n if (chap.smilFilename) {\n manifestItems.push(\n ` <item id=\"${chap.id}-overlay\" href=\"chapters/${escapeXml(chap.smilFilename)}\" media-type=\"application/smil+xml\"/>`,\n );\n }\n }\n\n // Audio files in manifest\n if (audioFiles) {\n const usedAudioNames = new Set<string>();\n for (const af of audioFiles) {\n if (usedAudioNames.has(af.filename)) continue;\n usedAudioNames.add(af.filename);\n const audioId = `audio-${af.filename.replace(/[^a-zA-Z0-9]/g, '-')}`;\n manifestItems.push(\n ` <item id=\"${audioId}\" href=\"audio/${escapeXml(af.filename)}\" media-type=\"${af.mime}\"/>`,\n );\n }\n }\n\n const usedFilenames = new Set<string>();\n for (const [, img] of images) {\n if (usedFilenames.has(img.filename)) continue;\n usedFilenames.add(img.filename);\n const imgId = `img-${img.filename.replace(/[^a-zA-Z0-9]/g, '-')}`;\n manifestItems.push(\n ` <item id=\"${imgId}\" href=\"images/${escapeXml(img.filename)}\" media-type=\"${img.mime}\"/>`,\n );\n }\n\n // Spine — cover page first (if present), then chapters\n const spineEntries: string[] = [];\n if (coverFilename) {\n spineEntries.push(' <itemref idref=\"cover-page\"/>');\n }\n for (const chap of chapters) {\n spineEntries.push(` <itemref idref=\"${chap.id}\"/>`);\n }\n const spineItems = spineEntries.join('\\n');\n\n // Metadata\n const metaParts = [\n ` <dc:identifier id=\"uid\">urn:uuid:${uuid}</dc:identifier>`,\n ` <dc:title>${escapeXml(title)}</dc:title>`,\n ` <dc:language>${escapeXml(language)}</dc:language>`,\n ` <meta property=\"dcterms:modified\">${modified}</meta>`,\n ];\n if (author) metaParts.push(` <dc:creator>${escapeXml(author)}</dc:creator>`);\n if (description) metaParts.push(` <dc:description>${escapeXml(description)}</dc:description>`);\n if (publisher) metaParts.push(` <dc:publisher>${escapeXml(publisher)}</dc:publisher>`);\n\n // Media Overlay metadata\n if (hasOverlays && totalDuration) {\n metaParts.push(` <meta property=\"media:duration\">${formatTime(totalDuration)}</meta>`);\n metaParts.push(' <meta property=\"media:active-class\">epub-media-overlay-active</meta>');\n }\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<package xmlns=\"http://www.idpf.org/2007/opf\" version=\"3.0\" unique-identifier=\"uid\">\n <metadata xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n${metaParts.join('\\n')}\n </metadata>\n <manifest>\n${manifestItems.join('\\n')}\n </manifest>\n <spine>\n${spineItems}\n </spine>\n</package>`;\n}\n\nfunction generateTocXhtml(chapters: ChapterFileInfo[], bookTitle: string): string {\n const navItems = chapters\n .map(\n (chap) =>\n ` <li><a href=\"chapters/${escapeXml(chap.filename)}\">${escapeXml(chap.title)}</a></li>`,\n )\n .join('\\n');\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:epub=\"http://www.idpf.org/2007/ops\">\n<head>\n <meta charset=\"UTF-8\"/>\n <title>${escapeXml(bookTitle)}</title>\n <link rel=\"stylesheet\" type=\"text/css\" href=\"styles.css\"/>\n</head>\n<body>\n <nav epub:type=\"toc\">\n <h1>Table of Contents</h1>\n <ol>\n${navItems}\n </ol>\n </nav>\n</body>\n</html>`;\n}\n\n// ── Stylesheet ────────────────────────────────────────────────────\n\nfunction generateStylesheet(themeId?: string): string {\n let themeVars = '';\n if (themeId) {\n const theme = resolveTheme(themeId);\n themeVars = `\n --epub-bg: ${theme.colors.background};\n --epub-text: ${theme.colors.text};\n --epub-primary: ${theme.colors.primary};\n --epub-heading-font: ${theme.typography.titleFontFamily};\n --epub-body-font: ${theme.typography.bodyFontFamily};`;\n }\n\n return `/* Squisq EPUB Stylesheet */\n:root {${themeVars}\n}\n\nbody {\n font-family: var(--epub-body-font, Georgia, 'Times New Roman', serif);\n color: var(--epub-text, #1a1a1a);\n line-height: 1.7;\n margin: 1em 2em;\n max-width: 40em;\n}\n\nh1, h2, h3, h4, h5, h6 {\n font-family: var(--epub-heading-font, system-ui, sans-serif);\n color: var(--epub-primary, #1a1a1a);\n margin-top: 1.5em;\n margin-bottom: 0.5em;\n line-height: 1.3;\n}\n\nh1 { font-size: 2em; }\nh2 { font-size: 1.5em; }\nh3 { font-size: 1.25em; }\n\np {\n margin: 0.8em 0;\n}\n\na {\n color: var(--epub-primary, #2563eb);\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\npre {\n background: #f5f5f5;\n padding: 1em;\n overflow-x: auto;\n border-radius: 4px;\n font-size: 0.9em;\n line-height: 1.4;\n}\n\ncode {\n font-family: 'Courier New', Courier, monospace;\n font-size: 0.9em;\n}\n\np > code, li > code {\n background: #f0f0f0;\n padding: 0.1em 0.3em;\n border-radius: 3px;\n}\n\nblockquote {\n border-left: 3px solid var(--epub-primary, #d1d5db);\n margin: 1em 0;\n padding: 0.5em 1em;\n color: #4b5563;\n}\n\ntable {\n border-collapse: collapse;\n width: 100%;\n margin: 1em 0;\n}\n\nth, td {\n border: 1px solid #d1d5db;\n padding: 0.5em 0.75em;\n text-align: left;\n}\n\nth {\n background: #f3f4f6;\n font-weight: 600;\n}\n\nhr {\n border: none;\n border-top: 1px solid #d1d5db;\n margin: 2em 0;\n}\n\nul, ol {\n margin: 0.8em 0;\n padding-left: 1.5em;\n}\n\nli {\n margin: 0.3em 0;\n}\n\n.math {\n font-family: 'Courier New', Courier, monospace;\n font-style: italic;\n}\n\n/* Media Overlay active highlight (narration sync) */\n.epub-media-overlay-active {\n background-color: rgba(37, 99, 235, 0.12);\n}\n`;\n}\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/epub/export.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEnE,OAAO,KAAK,EACV,gBAAgB,EASjB,MAAM,4BAA4B,CAAC;AAMpC,MAAM,WAAW,iBAAiB;IAChC,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAClC,qCAAqC;IACrC,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB;;;;OAIG;IACH,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACjC;;;;OAIG;IACH,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,gBAAgB,EACrB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,WAAW,CAAC,CAmLtB;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,WAAW,CAAC,CAc/F"}
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/epub/export.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEnE,OAAO,KAAK,EACV,gBAAgB,EASjB,MAAM,4BAA4B,CAAC;AAMpC,MAAM,WAAW,iBAAiB;IAChC,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAClC,qCAAqC;IACrC,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB;;;;OAIG;IACH,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACjC;;;;OAIG;IACH,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,gBAAgB,EACrB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,WAAW,CAAC,CAuMtB;AAED;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,WAAW,CAAC,CAc/F"}
@@ -79,7 +79,9 @@ export async function markdownDocToEpub(doc, options = {}) {
79
79
  for (const [, img] of resolvedImages) {
80
80
  zip.file(`OEBPS/images/${img.filename}`, img.data);
81
81
  }
82
- // Cover image — detect PNG vs JPEG from magic bytes
82
+ // Cover image — detect PNG vs JPEG from magic bytes.
83
+ // When provided, generates a cover.xhtml page in the spine so e-readers
84
+ // (especially Kindle) display the cover as both thumbnail and first page.
83
85
  let coverFilename;
84
86
  if (options.coverImage) {
85
87
  const bytes = new Uint8Array(options.coverImage);
@@ -90,6 +92,23 @@ export async function markdownDocToEpub(doc, options = {}) {
90
92
  bytes[3] === 0x47;
91
93
  coverFilename = isPng ? 'cover.png' : 'cover.jpg';
92
94
  zip.file(`OEBPS/images/${coverFilename}`, options.coverImage);
95
+ // Generate cover XHTML page — full-bleed image, no margins
96
+ const coverXhtml = `<?xml version="1.0" encoding="UTF-8"?>
97
+ <!DOCTYPE html>
98
+ <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops">
99
+ <head>
100
+ <meta charset="UTF-8"/>
101
+ <title>Cover</title>
102
+ <style>
103
+ body { margin: 0; padding: 0; text-align: center; }
104
+ img { max-width: 100%; max-height: 100%; }
105
+ </style>
106
+ </head>
107
+ <body>
108
+ <img src="../images/${escapeXml(coverFilename)}" alt="Cover"/>
109
+ </body>
110
+ </html>`;
111
+ zip.file('OEBPS/chapters/cover.xhtml', coverXhtml);
93
112
  }
94
113
  // ── Audio narration ──────────────────────────────────────────────
95
114
  const audioMap = options.audio;
@@ -280,10 +299,7 @@ function collectDocImages(nodes) {
280
299
  }
281
300
  }
282
301
  function walkInline(node) {
283
- if (node.type === 'image' &&
284
- node.url &&
285
- !node.url.startsWith('data:') &&
286
- !node.url.startsWith('http')) {
302
+ if (node.type === 'image' && node.url && !node.url.startsWith('data:')) {
287
303
  images.add(node.url);
288
304
  }
289
305
  if ('children' in node && Array.isArray(node.children)) {
@@ -470,6 +486,7 @@ function generateContentOpf(params) {
470
486
  if (coverFilename) {
471
487
  const mime = inferMimeType(coverFilename);
472
488
  manifestItems.push(` <item id="cover-image" href="images/${escapeXml(coverFilename)}" media-type="${mime}" properties="cover-image"/>`);
489
+ manifestItems.push(' <item id="cover-page" href="chapters/cover.xhtml" media-type="application/xhtml+xml"/>');
473
490
  }
474
491
  for (const chap of chapters) {
475
492
  const overlayAttr = chap.smilFilename ? ` media-overlay="${chap.id}-overlay"` : '';
@@ -497,8 +514,15 @@ function generateContentOpf(params) {
497
514
  const imgId = `img-${img.filename.replace(/[^a-zA-Z0-9]/g, '-')}`;
498
515
  manifestItems.push(` <item id="${imgId}" href="images/${escapeXml(img.filename)}" media-type="${img.mime}"/>`);
499
516
  }
500
- // Spine
501
- const spineItems = chapters.map((chap) => ` <itemref idref="${chap.id}"/>`).join('\n');
517
+ // Spine — cover page first (if present), then chapters
518
+ const spineEntries = [];
519
+ if (coverFilename) {
520
+ spineEntries.push(' <itemref idref="cover-page"/>');
521
+ }
522
+ for (const chap of chapters) {
523
+ spineEntries.push(` <itemref idref="${chap.id}"/>`);
524
+ }
525
+ const spineItems = spineEntries.join('\n');
502
526
  // Metadata
503
527
  const metaParts = [
504
528
  ` <dc:identifier id="uid">urn:uuid:${uuid}</dc:identifier>`,
@@ -1 +1 @@
1
- {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/epub/export.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/epub/export.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAYzD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAqCvE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAqB,EACrB,UAA6B,EAAE;IAE/B,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC;IACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACpF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC;IAC1C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;IAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAEjC,+BAA+B;IAC/B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEjD,qEAAqE;IACrE,MAAM,YAAY,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAiE,CAAC;IAChG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QACpC,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;gBACpC,8EAA8E;gBAC9E,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;oBACtC,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;oBACzD,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC/C,IAAI,OAAO,GAAG,CAAC,CAAC;oBAChB,OAAO,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,OAAO,GAAG,GAAG,EAAE,CAAC;wBAAE,OAAO,EAAE,CAAC;oBAC5D,QAAQ,GAAG,GAAG,IAAI,IAAI,OAAO,GAAG,GAAG,EAAE,CAAC;gBACxC,CAAC;gBACD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACxB,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,MAAM,GAAG,GAAG,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhD,gBAAgB;IAChB,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;IAExB,wDAAwD;IACxD,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,sBAAsB,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IAEvE,yBAAyB;IACzB,GAAG,CAAC,IAAI,CAAC,wBAAwB,EAAE,aAAa,CAAC,CAAC;IAElD,mBAAmB;IACnB,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;IAElC,iBAAiB;IACjB,KAAK,MAAM,CAAC,EAAE,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC;QACrC,GAAG,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,qDAAqD;IACrD,wEAAwE;IACxE,0EAA0E;IAC1E,IAAI,aAAiC,CAAC;IACtC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACjD,MAAM,KAAK,GACT,KAAK,CAAC,MAAM,IAAI,CAAC;YACjB,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;YACjB,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;YACjB,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;YACjB,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;QACpB,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;QAClD,GAAG,CAAC,IAAI,CAAC,gBAAgB,aAAa,EAAE,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAE9D,2DAA2D;QAC3D,MAAM,UAAU,GAAG;;;;;;;;;;;;wBAYC,SAAS,CAAC,aAAa,CAAC;;QAExC,CAAC;QACL,GAAG,CAAC,IAAI,CAAC,4BAA4B,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC;IAED,oEAAoE;IACpE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;IAC/B,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAC5C,MAAM,QAAQ,GAAG,QAAQ,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IACvE,+EAA+E;IAC/E,MAAM,iBAAiB,GAAkD,EAAE,CAAC;IAC5E,MAAM,aAAa,GAAyC,EAAE,CAAC;IAE/D,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7D,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC1C,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,MAAM,CAAC;gBACxE,GAAG,CAAC,IAAI,CAAC,eAAe,SAAS,EAAE,EAAE,IAAI,CAAC,CAAC;gBAC3C,MAAM,IAAI,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrE,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,MAAM,YAAY,GAAgC,EAAE,CAAC;IACrD,IAAI,QAAQ,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,QAAQ,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,EAAE,CAAC;YAC7C,OAAO,CAAC,IAAI,CACV,SAAS,QAAQ,CAAC,MAAM,iBAAiB,aAAa,CAAC,MAAM,oBAAoB;gBAC/E,oDAAoD,CACvD,CAAC;QACJ,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACrD,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,SAAS,EAAE,CAAC;gBACd,YAAY,CAAC,IAAI,CAAC;oBAChB,aAAa,EAAE,SAAS,CAAC,QAAQ;oBACjC,SAAS,EAAE,CAAC;oBACZ,OAAO,EAAE,GAAG,CAAC,QAAQ;oBACrB,QAAQ,EAAE,GAAG,CAAC,QAAQ;iBACvB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED,kDAAkD;IAClD,MAAM,YAAY,GAAsB,EAAE,CAAC;IAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC3C,MAAM,EAAE,GAAG,WAAW,GAAG,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,GAAG,EAAE,QAAQ,CAAC;QAC/B,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QAE1C,0EAA0E;QAC1E,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,KAAK,IAAI,CAAC,CAAC;QACxF,GAAG,CAAC,IAAI,CAAC,kBAAkB,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;QAE9C,IAAI,YAAgC,CAAC;QACrC,IAAI,SAAS,EAAE,CAAC;YACd,YAAY,GAAG,GAAG,EAAE,OAAO,CAAC;YAC5B,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3D,GAAG,CAAC,IAAI,CAAC,kBAAkB,YAAY,EAAE,EAAE,IAAI,CAAC,CAAC;QACnD,CAAC;QAED,YAAY,CAAC,IAAI,CAAC;YAChB,EAAE;YACF,QAAQ;YACR,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,YAAY;YACZ,QAAQ,EAAE,SAAS,EAAE,QAAQ;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,+BAA+B;IAC/B,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;IAEnE,oBAAoB;IACpB,GAAG,CAAC,IAAI,CACN,mBAAmB,EACnB,kBAAkB,CAAC;QACjB,IAAI;QACJ,KAAK;QACL,MAAM;QACN,QAAQ;QACR,WAAW;QACX,SAAS;QACT,QAAQ,EAAE,YAAY;QACtB,MAAM,EAAE,cAAc;QACtB,aAAa;QACb,UAAU,EAAE,aAAa;QACzB,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC,CACH,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC;QACnC,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,SAAS;QACtB,kBAAkB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;QAChC,2EAA2E;KAC5E,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAQ,EAAE,UAA6B,EAAE;IACvE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAEvC,0DAA0D;IAC1D,MAAM,WAAW,GAAsB,EAAE,GAAG,OAAO,EAAE,CAAC;IACtD,IAAI,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;QAC9D,WAAW,CAAC,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;IACjD,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;QAC/C,WAAW,CAAC,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC;IAC3C,CAAC;IAED,OAAO,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AACrD,CAAC;AAwBD,SAAS,iBAAiB,CAAC,KAA0B;IACnD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,YAAY,GAAwB,EAAE,CAAC;IAC3C,IAAI,YAAY,GAAG,UAAU,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;YAC/C,yBAAyB;YACzB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;YAC9D,CAAC;YACD,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;YACxC,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,sDAAsD;IACtD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAwB;IAClD,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,YAAY,CAAC,IAAwB;IAC5C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,KAAK,UAAU,CAAC;QAChB,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClD,KAAK,YAAY;YACf,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClD,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;QACxB,KAAK,OAAO;YACV,OAAO,GAAG,CAAC;QACb;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,qEAAqE;AAErE,SAAS,gBAAgB,CAAC,KAA0B;IAClD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAEjC,SAAS,SAAS,CAAC,IAAuB;QACxC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,WAAW,CAAC;YACjB,KAAK,SAAS;gBACZ,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAClC,MAAM;YACR,KAAK,YAAY;gBACf,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACjC,MAAM;YACR,KAAK,MAAM;gBACT,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;gBAClE,MAAM;YACR,KAAK,OAAO;gBACV,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAC5B,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAClE,CAAC;gBACF,MAAM;YACR;gBACE,MAAM;QACV,CAAC;IACH,CAAC;IAED,SAAS,UAAU,CAAC,IAAwB;QAC1C,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACvE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,UAAU,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,QAAiC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzB,OAAO,MAAM,CAAC;AAChB,CAAC;AAMD,SAAS,kBAAkB,CACzB,KAA0B,EAC1B,SAAiB,EACjB,MAAgB,EAChB,MAAM,GAAG,KAAK;IAEd,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/F,OAAO;;;;;WAKE,SAAS,CAAC,SAAS,CAAC;;;;EAI7B,IAAI;;QAEE,CAAC;AACT,CAAC;AAED,SAAS,YAAY,CAAC,IAAuB,EAAE,MAAgB,EAAE,MAAqB;IACpF,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjD,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7B,OAAO,IAAI,GAAG,GAAG,MAAM,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC;QAC9E,CAAC;QAED,KAAK,WAAW;YACd,OAAO,KAAK,MAAM,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;QAEpE,KAAK,YAAY;YACf,OAAO,cAAc,MAAM,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;QAEzH,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACvC,MAAM,SAAS,GACb,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACjF,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpF,OAAO,IAAI,GAAG,GAAG,MAAM,GAAG,SAAS,MAAM,KAAK,OAAO,GAAG,GAAG,CAAC;QAC9D,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9E,OAAO,OAAO,MAAM,SAAS,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC;QAChF,CAAC;QAED,KAAK,eAAe;YAClB,OAAO,MAAM,MAAM,IAAI,CAAC;QAE1B,KAAK,OAAO;YACV,OAAO,YAAY,CAAC,IAAqB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAE7D,KAAK,WAAW;YACd,yEAAyE;YACzE,OAAO,KAAK,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;QAE9E,KAAK,MAAM;YACT,OAAO,KAAK,MAAM,iBAAiB,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAEjE;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAsB,EAAE,MAAgB;IAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7E,mDAAmD;IACnD,MAAM,SAAS,GACb,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW;QACjE,CAAC,CAAC,cAAc,CAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAuB,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1E,CAAC,CAAC,OAAO,CAAC;IACd,OAAO,OAAO,SAAS,OAAO,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,KAAoB,EAAE,MAAgB,EAAE,MAAM,GAAG,EAAE;IACvE,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC;IAC5B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,MAAM,WAAW,CAAC;IAEzD,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;IAEhC,SAAS,WAAW,CAAC,IAAuB,EAAE,GAAgB,EAAE,QAAgB;QAC9E,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,OAAO,IAAI,GAAG,GAAG,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC;IAC7E,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC;IAC9G,MAAM,KAAK,GACT,QAAQ,CAAC,MAAM,GAAG,CAAC;QACjB,CAAC,CAAC,UAAU,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAqB,EAAE,EAAE,CAAC,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU;QAClJ,CAAC,CAAC,EAAE,CAAC;IAET,OAAO,SAAS,MAAM,IAAI,KAAK,GAAG,KAAK,UAAU,CAAC;AACpD,CAAC;AAED,SAAS,cAAc,CAAC,KAA2B,EAAE,MAAgB;IACnE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,aAAa,CAAC,IAAwB,EAAE,MAAgB;IAC/D,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE/B,KAAK,QAAQ;YACX,OAAO,WAAW,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC;QAErE,KAAK,UAAU;YACb,OAAO,OAAO,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC;QAE7D,KAAK,QAAQ;YACX,OAAO,QAAQ,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;QAE/D,KAAK,YAAY;YACf,OAAO,SAAS,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QAEjD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,OAAO,YAAY,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;QACrG,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,aAAa,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9E,OAAO,aAAa,GAAG,UAAU,GAAG,KAAK,CAAC;QAC5C,CAAC;QAED,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QAEjB,KAAK,YAAY;YACf,OAAO,sBAAsB,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QAE9D,KAAK,YAAY;YACf,8BAA8B;YAC9B,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;QAEzD;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,qEAAqE;AAErE;;;GAGG;AACH,SAAS,YAAY,CACnB,eAAuB,EACvB,SAA2B,EAC3B,KAA0B;IAE1B,mEAAmE;IACnE,+DAA+D;IAC/D,yEAAyE;IACzE,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,SAAS,WAAW,CAAC,IAAuB;QAC1C,YAAY,EAAE,CAAC;QACf,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY;YAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACrE,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAE3B,IAAI,YAAY,KAAK,CAAC;QAAE,YAAY,GAAG,CAAC,CAAC;IAEzC,2FAA2F;IAC3F,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,GAAG,YAAY,CAAC;IACvD,MAAM,IAAI,GAAa,EAAE,CAAC;IAE1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,GAAG,YAAY,EAAE,IAAI,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,EAAE,IAAI,CAAC,CAAC;QAC/E,IAAI,CAAC,IAAI,CACP,oBAAoB,CAAC,GAAG,CAAC,IAAI;YAC3B,sBAAsB,eAAe,KAAK,CAAC,GAAG,CAAC,KAAK;YACpD,gCAAgC,SAAS,CAAC,SAAS,CAAC,aAAa,CAAC,gBAAgB,SAAS,cAAc,OAAO,KAAK;YACrH,cAAc,CACjB,CAAC;IACJ,CAAC;IAED,OAAO;;;oCAG2B,eAAe;EACjD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;;;QAGT,CAAC;AACT,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,UAAU,GAAG,KAAK;IACrD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,OAAO,GAAG,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClG,OAAO,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC;AACvD,CAAC;AAED,qEAAqE;AAErE,MAAM,aAAa,GAAG;;;;;aAKT,CAAC;AAgBd,SAAS,kBAAkB,CAAC,MAAiB;IAC3C,MAAM,EACJ,IAAI,EACJ,KAAK,EACL,MAAM,EACN,QAAQ,EACR,WAAW,EACX,SAAS,EACT,QAAQ,EACR,MAAM,EACN,aAAa,EACb,UAAU,EACV,aAAa,GACd,GAAG,MAAM,CAAC;IACX,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAEzD,iBAAiB;IACjB,MAAM,aAAa,GAAa;QAC9B,2FAA2F;QAC3F,8DAA8D;KAC/D,CAAC;IAEF,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;QAC1C,aAAa,CAAC,IAAI,CAChB,2CAA2C,SAAS,CAAC,aAAa,CAAC,iBAAiB,IAAI,8BAA8B,CACvH,CAAC;QACF,aAAa,CAAC,IAAI,CAChB,4FAA4F,CAC7F,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,mBAAmB,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,aAAa,CAAC,IAAI,CAChB,iBAAiB,IAAI,CAAC,EAAE,oBAAoB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,uCAAuC,WAAW,IAAI,CAC3H,CAAC;QACF,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,aAAa,CAAC,IAAI,CAChB,iBAAiB,IAAI,CAAC,EAAE,4BAA4B,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,uCAAuC,CACxH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;QACzC,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC;gBAAE,SAAS;YAC9C,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;YAChC,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,EAAE,CAAC;YACrE,aAAa,CAAC,IAAI,CAChB,iBAAiB,OAAO,iBAAiB,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC,IAAI,KAAK,CAC7F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IACxC,KAAK,MAAM,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC;QAC7B,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,SAAS;QAC9C,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,EAAE,CAAC;QAClE,aAAa,CAAC,IAAI,CAChB,iBAAiB,KAAK,kBAAkB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,iBAAiB,GAAG,CAAC,IAAI,KAAK,CAC9F,CAAC;IACJ,CAAC;IAED,uDAAuD;IACvD,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,aAAa,EAAE,CAAC;QAClB,YAAY,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACzD,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,YAAY,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE3C,WAAW;IACX,MAAM,SAAS,GAAG;QAChB,wCAAwC,IAAI,kBAAkB;QAC9D,iBAAiB,SAAS,CAAC,KAAK,CAAC,aAAa;QAC9C,oBAAoB,SAAS,CAAC,QAAQ,CAAC,gBAAgB;QACvD,yCAAyC,QAAQ,SAAS;KAC3D,CAAC;IACF,IAAI,MAAM;QAAE,SAAS,CAAC,IAAI,CAAC,mBAAmB,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAChF,IAAI,WAAW;QAAE,SAAS,CAAC,IAAI,CAAC,uBAAuB,SAAS,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;IAClG,IAAI,SAAS;QAAE,SAAS,CAAC,IAAI,CAAC,qBAAqB,SAAS,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAE1F,yBAAyB;IACzB,IAAI,WAAW,IAAI,aAAa,EAAE,CAAC;QACjC,SAAS,CAAC,IAAI,CAAC,uCAAuC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC1F,SAAS,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO;;;EAGP,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;;;EAGpB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;;;EAGxB,UAAU;;WAED,CAAC;AACZ,CAAC;AAED,SAAS,gBAAgB,CAAC,QAA2B,EAAE,SAAiB;IACtE,MAAM,QAAQ,GAAG,QAAQ;SACtB,GAAG,CACF,CAAC,IAAI,EAAE,EAAE,CACP,+BAA+B,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAC/F;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;;;;WAKE,SAAS,CAAC,SAAS,CAAC;;;;;;;EAO7B,QAAQ;;;;QAIF,CAAC;AACT,CAAC;AAED,qEAAqE;AAErE,SAAS,kBAAkB,CAAC,OAAgB;IAC1C,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACpC,SAAS,GAAG;eACD,KAAK,CAAC,MAAM,CAAC,UAAU;iBACrB,KAAK,CAAC,MAAM,CAAC,IAAI;oBACd,KAAK,CAAC,MAAM,CAAC,OAAO;yBACf,KAAK,CAAC,UAAU,CAAC,eAAe;sBACnC,KAAK,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC;IACvD,CAAC;IAED,OAAO;SACA,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwGjB,CAAC;AACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bendyline/squisq-formats",
3
- "version": "1.2.1",
3
+ "version": "1.2.2",
4
4
  "description": "Document format converters — DOCX, PDF, OOXML import/export",
5
5
  "license": "MIT",
6
6
  "author": "Bendyline",
@@ -83,7 +83,7 @@
83
83
  "typecheck": "tsc --noEmit"
84
84
  },
85
85
  "dependencies": {
86
- "@bendyline/squisq": "1.2.1",
86
+ "@bendyline/squisq": "1.2.2",
87
87
  "jszip": "3.10.1",
88
88
  "pdf-lib": "1.17.1",
89
89
  "pdfjs-dist": "4.10.38"
@@ -139,7 +139,9 @@ export async function markdownDocToEpub(
139
139
  zip.file(`OEBPS/images/${img.filename}`, img.data);
140
140
  }
141
141
 
142
- // Cover image — detect PNG vs JPEG from magic bytes
142
+ // Cover image — detect PNG vs JPEG from magic bytes.
143
+ // When provided, generates a cover.xhtml page in the spine so e-readers
144
+ // (especially Kindle) display the cover as both thumbnail and first page.
143
145
  let coverFilename: string | undefined;
144
146
  if (options.coverImage) {
145
147
  const bytes = new Uint8Array(options.coverImage);
@@ -151,6 +153,24 @@ export async function markdownDocToEpub(
151
153
  bytes[3] === 0x47;
152
154
  coverFilename = isPng ? 'cover.png' : 'cover.jpg';
153
155
  zip.file(`OEBPS/images/${coverFilename}`, options.coverImage);
156
+
157
+ // Generate cover XHTML page — full-bleed image, no margins
158
+ const coverXhtml = `<?xml version="1.0" encoding="UTF-8"?>
159
+ <!DOCTYPE html>
160
+ <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops">
161
+ <head>
162
+ <meta charset="UTF-8"/>
163
+ <title>Cover</title>
164
+ <style>
165
+ body { margin: 0; padding: 0; text-align: center; }
166
+ img { max-width: 100%; max-height: 100%; }
167
+ </style>
168
+ </head>
169
+ <body>
170
+ <img src="../images/${escapeXml(coverFilename)}" alt="Cover"/>
171
+ </body>
172
+ </html>`;
173
+ zip.file('OEBPS/chapters/cover.xhtml', coverXhtml);
154
174
  }
155
175
 
156
176
  // ── Audio narration ──────────────────────────────────────────────
@@ -392,12 +412,7 @@ function collectDocImages(nodes: MarkdownBlockNode[]): Set<string> {
392
412
  }
393
413
 
394
414
  function walkInline(node: MarkdownInlineNode): void {
395
- if (
396
- node.type === 'image' &&
397
- node.url &&
398
- !node.url.startsWith('data:') &&
399
- !node.url.startsWith('http')
400
- ) {
415
+ if (node.type === 'image' && node.url && !node.url.startsWith('data:')) {
401
416
  images.add(node.url);
402
417
  }
403
418
  if ('children' in node && Array.isArray(node.children)) {
@@ -670,6 +685,9 @@ function generateContentOpf(params: OpfParams): string {
670
685
  manifestItems.push(
671
686
  ` <item id="cover-image" href="images/${escapeXml(coverFilename)}" media-type="${mime}" properties="cover-image"/>`,
672
687
  );
688
+ manifestItems.push(
689
+ ' <item id="cover-page" href="chapters/cover.xhtml" media-type="application/xhtml+xml"/>',
690
+ );
673
691
  }
674
692
 
675
693
  for (const chap of chapters) {
@@ -707,8 +725,15 @@ function generateContentOpf(params: OpfParams): string {
707
725
  );
708
726
  }
709
727
 
710
- // Spine
711
- const spineItems = chapters.map((chap) => ` <itemref idref="${chap.id}"/>`).join('\n');
728
+ // Spine — cover page first (if present), then chapters
729
+ const spineEntries: string[] = [];
730
+ if (coverFilename) {
731
+ spineEntries.push(' <itemref idref="cover-page"/>');
732
+ }
733
+ for (const chap of chapters) {
734
+ spineEntries.push(` <itemref idref="${chap.id}"/>`);
735
+ }
736
+ const spineItems = spineEntries.join('\n');
712
737
 
713
738
  // Metadata
714
739
  const metaParts = [
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/epub/export.ts"],"sourcesContent":["/**\n * EPUB 3 Export\n *\n * Converts a MarkdownDocument (or Doc) to an EPUB 3 file (.epub).\n *\n * An EPUB is a ZIP archive containing XHTML chapter files, images,\n * a package manifest (content.opf), and a navigation document (toc.xhtml).\n * Content is split into chapters at H1/H2 heading boundaries.\n *\n * Uses JSZip for packaging (already a dependency), escapeXml from the\n * OOXML utils, and image utilities from the HTML exporter.\n *\n * @example\n * ```ts\n * import { markdownDocToEpub } from '@bendyline/squisq-formats/epub';\n *\n * const epub = await markdownDocToEpub(markdownDoc, {\n * title: 'My Book',\n * author: 'Jane Doe',\n * });\n * ```\n */\n\nimport JSZip from 'jszip';\nimport type { Doc, AudioSegment } from '@bendyline/squisq/schemas';\nimport { resolveTheme } from '@bendyline/squisq/schemas';\nimport type {\n MarkdownDocument,\n MarkdownBlockNode,\n MarkdownInlineNode,\n MarkdownHeading,\n MarkdownParagraph,\n MarkdownListItem,\n MarkdownTable,\n MarkdownTableRow,\n MarkdownTableCell,\n} from '@bendyline/squisq/markdown';\nimport { escapeXml } from '../ooxml/xmlUtils.js';\nimport { inferMimeType, extractFilename } from '../html/imageUtils.js';\n\n// ── Public API ────────────────────────────────────────────────────\n\nexport interface EpubExportOptions {\n /** Book title (default: 'Untitled') */\n title?: string;\n /** Author name */\n author?: string;\n /** Book description / summary */\n description?: string;\n /** BCP-47 language code (default: 'en') */\n language?: string;\n /** Publisher name */\n publisher?: string;\n /** Squisq theme ID for CSS styling */\n themeId?: string;\n /** Pre-resolved image data keyed by relative path as it appears in the markdown */\n images?: Map<string, ArrayBuffer>;\n /** Cover image data (JPEG or PNG) */\n coverImage?: ArrayBuffer;\n /**\n * Audio narration data keyed by segment src/name.\n * When provided alongside audioSegments, EPUB 3 Media Overlays (SMIL)\n * are generated for synchronized audio playback.\n */\n audio?: Map<string, ArrayBuffer>;\n /**\n * Audio segment metadata (from Doc.audio.segments).\n * Required together with `audio` to generate Media Overlays.\n * Each segment's duration and startTime are used to build SMIL timing.\n */\n audioSegments?: AudioSegment[];\n /** Total document duration in seconds (used for Media Overlay metadata) */\n totalDuration?: number;\n}\n\n/**\n * Convert a MarkdownDocument to an EPUB 3 file.\n *\n * Chapters are split at H1/H2 heading boundaries. All referenced images\n * (provided via `options.images`) are embedded in the archive.\n */\nexport async function markdownDocToEpub(\n doc: MarkdownDocument,\n options: EpubExportOptions = {},\n): Promise<ArrayBuffer> {\n const fmTitle = doc.frontmatter?.title;\n const fmAuthor = doc.frontmatter?.author;\n const title = options.title ?? (typeof fmTitle === 'string' ? fmTitle : 'Untitled');\n const author = options.author ?? (typeof fmAuthor === 'string' ? fmAuthor : '');\n const language = options.language ?? 'en';\n const description = options.description ?? '';\n const publisher = options.publisher ?? '';\n const uuid = crypto.randomUUID();\n\n // Split document into chapters\n const chapters = splitIntoChapters(doc.children);\n\n // Collect images referenced in the document, deduplicating filenames\n const imageEntries = collectDocImages(doc.children);\n const resolvedImages = new Map<string, { data: ArrayBuffer; mime: string; filename: string }>();\n if (options.images) {\n const usedNames = new Set<string>();\n for (const src of imageEntries) {\n const data = options.images.get(src);\n if (data) {\n let filename = extractFilename(src);\n // Deduplicate: if two paths share a basename (e.g. a/hero.png and b/hero.png)\n if (usedNames.has(filename)) {\n const dot = filename.lastIndexOf('.');\n const base = dot > 0 ? filename.slice(0, dot) : filename;\n const ext = dot > 0 ? filename.slice(dot) : '';\n let counter = 2;\n while (usedNames.has(`${base}-${counter}${ext}`)) counter++;\n filename = `${base}-${counter}${ext}`;\n }\n usedNames.add(filename);\n resolvedImages.set(src, { data, mime: inferMimeType(filename), filename });\n }\n }\n }\n\n // Generate theme CSS\n const css = generateStylesheet(options.themeId);\n\n // Build the ZIP\n const zip = new JSZip();\n\n // mimetype must be first entry, stored (not compressed)\n zip.file('mimetype', 'application/epub+zip', { compression: 'STORE' });\n\n // META-INF/container.xml\n zip.file('META-INF/container.xml', CONTAINER_XML);\n\n // OEBPS/styles.css\n zip.file('OEBPS/styles.css', css);\n\n // OEBPS/images/*\n for (const [, img] of resolvedImages) {\n zip.file(`OEBPS/images/${img.filename}`, img.data);\n }\n\n // Cover image — detect PNG vs JPEG from magic bytes\n let coverFilename: string | undefined;\n if (options.coverImage) {\n const bytes = new Uint8Array(options.coverImage);\n const isPng =\n bytes.length >= 4 &&\n bytes[0] === 0x89 &&\n bytes[1] === 0x50 &&\n bytes[2] === 0x4e &&\n bytes[3] === 0x47;\n coverFilename = isPng ? 'cover.png' : 'cover.jpg';\n zip.file(`OEBPS/images/${coverFilename}`, options.coverImage);\n }\n\n // ── Audio narration ──────────────────────────────────────────────\n const audioMap = options.audio;\n const audioSegments = options.audioSegments;\n const hasAudio = audioMap && audioSegments && audioSegments.length > 0;\n // Per-segment audio file info, indexed by segment index (null if data missing)\n const segmentAudioFiles: ({ filename: string; mime: string } | null)[] = [];\n const allAudioFiles: { filename: string; mime: string }[] = [];\n\n if (hasAudio) {\n for (const seg of audioSegments) {\n const data = audioMap.get(seg.src) ?? audioMap.get(seg.name);\n if (data) {\n const filename = extractFilename(seg.src);\n const finalName = filename.includes('.') ? filename : `${filename}.mp3`;\n zip.file(`OEBPS/audio/${finalName}`, data);\n const info = { filename: finalName, mime: inferMimeType(finalName) };\n segmentAudioFiles.push(info);\n allAudioFiles.push(info);\n } else {\n segmentAudioFiles.push(null);\n }\n }\n }\n\n // Build chapter-to-audio mapping for SMIL overlays\n const chapterAudio: (ChapterAudioInfo | null)[] = [];\n if (hasAudio && allAudioFiles.length > 0) {\n if (chapters.length !== audioSegments.length) {\n console.warn(\n `EPUB: ${chapters.length} chapters but ${audioSegments.length} audio segments — ` +\n `extra chapters will reuse the last segment's audio`,\n );\n }\n for (let i = 0; i < chapters.length; i++) {\n const segIdx = Math.min(i, audioSegments.length - 1);\n const seg = audioSegments[segIdx];\n const audioFile = segmentAudioFiles[segIdx];\n if (audioFile) {\n chapterAudio.push({\n audioFilename: audioFile.filename,\n clipStart: 0,\n clipEnd: seg.duration,\n duration: seg.duration,\n });\n } else {\n chapterAudio.push(null);\n }\n }\n }\n\n // OEBPS/chapters/*.xhtml + optional SMIL overlays\n const chapterFiles: ChapterFileInfo[] = [];\n for (let i = 0; i < chapters.length; i++) {\n const chap = chapters[i];\n const num = String(i + 1).padStart(3, '0');\n const id = `chapter-${num}`;\n const filename = `${id}.xhtml`;\n const audioInfo = chapterAudio[i] ?? null;\n\n // Render XHTML with element IDs for SMIL references when audio is present\n const xhtml = renderChapterXhtml(chap.nodes, title, resolvedImages, audioInfo !== null);\n zip.file(`OEBPS/chapters/${filename}`, xhtml);\n\n let smilFilename: string | undefined;\n if (audioInfo) {\n smilFilename = `${id}.smil`;\n const smil = generateSmil(filename, audioInfo, chap.nodes);\n zip.file(`OEBPS/chapters/${smilFilename}`, smil);\n }\n\n chapterFiles.push({\n id,\n filename,\n title: chap.title,\n smilFilename,\n duration: audioInfo?.duration,\n });\n }\n\n // OEBPS/toc.xhtml (EPUB 3 nav)\n zip.file('OEBPS/toc.xhtml', generateTocXhtml(chapterFiles, title));\n\n // OEBPS/content.opf\n zip.file(\n 'OEBPS/content.opf',\n generateContentOpf({\n uuid,\n title,\n author,\n language,\n description,\n publisher,\n chapters: chapterFiles,\n images: resolvedImages,\n coverFilename,\n audioFiles: allAudioFiles,\n totalDuration: options.totalDuration,\n }),\n );\n\n const blob = await zip.generateAsync({\n type: 'arraybuffer',\n compression: 'DEFLATE',\n compressionOptions: { level: 6 },\n // mimetype was already set to STORE above; JSZip respects per-file options\n });\n\n return blob;\n}\n\n/**\n * Convert a squisq Doc to an EPUB 3 file.\n *\n * Convenience wrapper: Doc → MarkdownDocument → EPUB.\n * When the Doc has audio segments and `options.audio` is provided,\n * EPUB 3 Media Overlays are generated for narrated playback.\n */\nexport async function docToEpub(doc: Doc, options: EpubExportOptions = {}): Promise<ArrayBuffer> {\n const { docToMarkdown } = await import('@bendyline/squisq/doc');\n const markdownDoc = docToMarkdown(doc);\n\n // Thread audio segment metadata from the Doc into options\n const epubOptions: EpubExportOptions = { ...options };\n if (doc.audio?.segments?.length && !epubOptions.audioSegments) {\n epubOptions.audioSegments = doc.audio.segments;\n }\n if (doc.duration && !epubOptions.totalDuration) {\n epubOptions.totalDuration = doc.duration;\n }\n\n return markdownDocToEpub(markdownDoc, epubOptions);\n}\n\n// ── Chapter Splitting ─────────────────────────────────────────────\n\ninterface Chapter {\n title: string;\n nodes: MarkdownBlockNode[];\n}\n\ninterface ChapterFileInfo {\n id: string;\n filename: string;\n title: string;\n smilFilename?: string;\n duration?: number;\n}\n\ninterface ChapterAudioInfo {\n audioFilename: string;\n clipStart: number;\n clipEnd: number;\n duration: number;\n}\n\nfunction splitIntoChapters(nodes: MarkdownBlockNode[]): Chapter[] {\n const chapters: Chapter[] = [];\n let currentNodes: MarkdownBlockNode[] = [];\n let currentTitle = 'Untitled';\n\n for (const node of nodes) {\n if (node.type === 'heading' && node.depth <= 2) {\n // Flush previous chapter\n if (currentNodes.length > 0) {\n chapters.push({ title: currentTitle, nodes: currentNodes });\n }\n currentTitle = extractHeadingText(node);\n currentNodes = [node];\n } else {\n currentNodes.push(node);\n }\n }\n\n // Flush remaining\n if (currentNodes.length > 0) {\n chapters.push({ title: currentTitle, nodes: currentNodes });\n }\n\n // If no chapters were created, wrap everything as one\n if (chapters.length === 0) {\n chapters.push({ title: 'Untitled', nodes: [] });\n }\n\n return chapters;\n}\n\nfunction extractHeadingText(heading: MarkdownHeading): string {\n return heading.children.map(inlineToText).join('');\n}\n\nfunction inlineToText(node: MarkdownInlineNode): string {\n switch (node.type) {\n case 'text':\n return node.value;\n case 'emphasis':\n case 'strong':\n case 'delete':\n return node.children.map(inlineToText).join('');\n case 'inlineCode':\n return node.value;\n case 'link':\n return node.children.map(inlineToText).join('');\n case 'image':\n return node.alt ?? '';\n case 'break':\n return ' ';\n default:\n return '';\n }\n}\n\n// ── Image Collection ──────────────────────────────────────────────\n\nfunction collectDocImages(nodes: MarkdownBlockNode[]): Set<string> {\n const images = new Set<string>();\n\n function walkBlock(node: MarkdownBlockNode): void {\n switch (node.type) {\n case 'paragraph':\n case 'heading':\n node.children.forEach(walkInline);\n break;\n case 'blockquote':\n node.children.forEach(walkBlock);\n break;\n case 'list':\n node.children.forEach((item) => item.children.forEach(walkBlock));\n break;\n case 'table':\n node.children.forEach((row) =>\n row.children.forEach((cell) => cell.children.forEach(walkInline)),\n );\n break;\n default:\n break;\n }\n }\n\n function walkInline(node: MarkdownInlineNode): void {\n if (\n node.type === 'image' &&\n node.url &&\n !node.url.startsWith('data:') &&\n !node.url.startsWith('http')\n ) {\n images.add(node.url);\n }\n if ('children' in node && Array.isArray(node.children)) {\n (node.children as MarkdownInlineNode[]).forEach(walkInline);\n }\n }\n\n nodes.forEach(walkBlock);\n return images;\n}\n\n// ── XHTML Rendering ───────────────────────────────────────────────\n\ntype ImageMap = Map<string, { data: ArrayBuffer; mime: string; filename: string }>;\n\nfunction renderChapterXhtml(\n nodes: MarkdownBlockNode[],\n bookTitle: string,\n images: ImageMap,\n addIds = false,\n): string {\n let elementCounter = 0;\n const nextId = () => `p${++elementCounter}`;\n const body = nodes.map((n) => blockToXhtml(n, images, addIds ? nextId : undefined)).join('\\n');\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:epub=\"http://www.idpf.org/2007/ops\">\n<head>\n <meta charset=\"UTF-8\"/>\n <title>${escapeXml(bookTitle)}</title>\n <link rel=\"stylesheet\" type=\"text/css\" href=\"../styles.css\"/>\n</head>\n<body>\n${body}\n</body>\n</html>`;\n}\n\nfunction blockToXhtml(node: MarkdownBlockNode, images: ImageMap, nextId?: () => string): string {\n const idAttr = nextId ? ` id=\"${nextId()}\"` : '';\n\n switch (node.type) {\n case 'heading': {\n const tag = `h${node.depth}`;\n return `<${tag}${idAttr}>${inlinesToXhtml(node.children, images)}</${tag}>`;\n }\n\n case 'paragraph':\n return `<p${idAttr}>${inlinesToXhtml(node.children, images)}</p>`;\n\n case 'blockquote':\n return `<blockquote${idAttr}>\\n${node.children.map((c) => blockToXhtml(c, images, nextId)).join('\\n')}\\n</blockquote>`;\n\n case 'list': {\n const tag = node.ordered ? 'ol' : 'ul';\n const startAttr =\n node.ordered && node.start && node.start !== 1 ? ` start=\"${node.start}\"` : '';\n const items = node.children.map((item) => listItemToXhtml(item, images)).join('\\n');\n return `<${tag}${idAttr}${startAttr}>\\n${items}\\n</${tag}>`;\n }\n\n case 'code': {\n const langAttr = node.lang ? ` class=\"language-${escapeXml(node.lang)}\"` : '';\n return `<pre${idAttr}><code${langAttr}>${escapeXml(node.value)}</code></pre>`;\n }\n\n case 'thematicBreak':\n return `<hr${idAttr}/>`;\n\n case 'table':\n return tableToXhtml(node as MarkdownTable, images, idAttr);\n\n case 'htmlBlock':\n // Strip HTML tags for XHTML safety — raw HTML may not be well-formed XML\n return `<p${idAttr}>${escapeXml(node.rawHtml.replace(/<[^>]+>/g, ''))}</p>`;\n\n case 'math':\n return `<p${idAttr} class=\"math\">${escapeXml(node.value)}</p>`;\n\n default:\n return '';\n }\n}\n\nfunction listItemToXhtml(item: MarkdownListItem, images: ImageMap): string {\n const content = item.children.map((c) => blockToXhtml(c, images)).join('\\n');\n // Unwrap single <p> inside <li> for cleaner output\n const unwrapped =\n item.children.length === 1 && item.children[0].type === 'paragraph'\n ? inlinesToXhtml((item.children[0] as MarkdownParagraph).children, images)\n : content;\n return `<li>${unwrapped}</li>`;\n}\n\nfunction tableToXhtml(table: MarkdownTable, images: ImageMap, idAttr = ''): string {\n const rows = table.children;\n if (rows.length === 0) return `<table${idAttr}></table>`;\n\n const headerRow = rows[0];\n const bodyRows = rows.slice(1);\n const align = table.align ?? [];\n\n function cellToXhtml(cell: MarkdownTableCell, tag: 'th' | 'td', colIndex: number): string {\n const a = align[colIndex];\n const style = a ? ` style=\"text-align: ${a}\"` : '';\n return `<${tag}${style}>${inlinesToXhtml(cell.children, images)}</${tag}>`;\n }\n\n const thead = `<thead><tr>${headerRow.children.map((c, i) => cellToXhtml(c, 'th', i)).join('')}</tr></thead>`;\n const tbody =\n bodyRows.length > 0\n ? `<tbody>${bodyRows.map((row: MarkdownTableRow) => `<tr>${row.children.map((c, i) => cellToXhtml(c, 'td', i)).join('')}</tr>`).join('')}</tbody>`\n : '';\n\n return `<table${idAttr}>${thead}${tbody}</table>`;\n}\n\nfunction inlinesToXhtml(nodes: MarkdownInlineNode[], images: ImageMap): string {\n return nodes.map((n) => inlineToXhtml(n, images)).join('');\n}\n\nfunction inlineToXhtml(node: MarkdownInlineNode, images: ImageMap): string {\n switch (node.type) {\n case 'text':\n return escapeXml(node.value);\n\n case 'strong':\n return `<strong>${inlinesToXhtml(node.children, images)}</strong>`;\n\n case 'emphasis':\n return `<em>${inlinesToXhtml(node.children, images)}</em>`;\n\n case 'delete':\n return `<del>${inlinesToXhtml(node.children, images)}</del>`;\n\n case 'inlineCode':\n return `<code>${escapeXml(node.value)}</code>`;\n\n case 'link': {\n const titleAttr = node.title ? ` title=\"${escapeXml(node.title)}\"` : '';\n return `<a href=\"${escapeXml(node.url)}\"${titleAttr}>${inlinesToXhtml(node.children, images)}</a>`;\n }\n\n case 'image': {\n const alt = escapeXml(node.alt ?? '');\n const resolved = images.get(node.url);\n const src = resolved ? `../images/${resolved.filename}` : escapeXml(node.url);\n return `<img src=\"${src}\" alt=\"${alt}\"/>`;\n }\n\n case 'break':\n return '<br/>';\n\n case 'inlineMath':\n return `<span class=\"math\">${escapeXml(node.value)}</span>`;\n\n case 'htmlInline':\n // Strip tags for XHTML safety\n return escapeXml(node.rawHtml.replace(/<[^>]+>/g, ''));\n\n default:\n return '';\n }\n}\n\n// ── SMIL Media Overlays ───────────────────────────────────────────\n\n/**\n * Generate an EPUB 3 Media Overlay (SMIL) file for a chapter.\n * Maps block-level elements to audio clip ranges for synchronized narration.\n */\nfunction generateSmil(\n chapterFilename: string,\n audioInfo: ChapterAudioInfo,\n nodes: MarkdownBlockNode[],\n): string {\n // Count block elements to match the IDs generated by blockToXhtml.\n // Must mirror blockToXhtml's recursion: each block gets an ID,\n // blockquote children recurse (they pass nextId), but list items do not.\n let elementCount = 0;\n function countBlocks(node: MarkdownBlockNode): void {\n elementCount++;\n if (node.type === 'blockquote') node.children.forEach(countBlocks);\n }\n nodes.forEach(countBlocks);\n\n if (elementCount === 0) elementCount = 1;\n\n // Distribute audio duration evenly across elements (best effort without word-level timing)\n const clipDuration = audioInfo.duration / elementCount;\n const pars: string[] = [];\n\n for (let i = 0; i < elementCount; i++) {\n const clipStart = formatTime(audioInfo.clipStart + i * clipDuration, true);\n const clipEnd = formatTime(audioInfo.clipStart + (i + 1) * clipDuration, true);\n pars.push(\n ` <par id=\"par-${i + 1}\">` +\n `\\n <text src=\"${chapterFilename}#p${i + 1}\"/>` +\n `\\n <audio src=\"../audio/${escapeXml(audioInfo.audioFilename)}\" clipBegin=\"${clipStart}\" clipEnd=\"${clipEnd}\"/>` +\n `\\n </par>`,\n );\n }\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<smil xmlns=\"http://www.w3.org/ns/SMIL\" xmlns:epub=\"http://www.idpf.org/2007/ops\" version=\"3.0\">\n <body>\n <seq id=\"seq-1\" epub:textref=\"${chapterFilename}\">\n${pars.join('\\n')}\n </seq>\n </body>\n</smil>`;\n}\n\nfunction formatTime(seconds: number, fractional = false): string {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = seconds % 60;\n const sPart = fractional ? s.toFixed(3).padStart(6, '0') : String(Math.floor(s)).padStart(2, '0');\n return `${h}:${String(m).padStart(2, '0')}:${sPart}`;\n}\n\n// ── Package Documents ─────────────────────────────────────────────\n\nconst CONTAINER_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<container version=\"1.0\" xmlns=\"urn:oasis:names:tc:opendocument:xmlns:container\">\n <rootfiles>\n <rootfile full-path=\"OEBPS/content.opf\" media-type=\"application/oebps-package+xml\"/>\n </rootfiles>\n</container>`;\n\ninterface OpfParams {\n uuid: string;\n title: string;\n author: string;\n language: string;\n description: string;\n publisher: string;\n chapters: ChapterFileInfo[];\n images: ImageMap;\n coverFilename?: string;\n audioFiles?: { filename: string; mime: string }[];\n totalDuration?: number;\n}\n\nfunction generateContentOpf(params: OpfParams): string {\n const {\n uuid,\n title,\n author,\n language,\n description,\n publisher,\n chapters,\n images,\n coverFilename,\n audioFiles,\n totalDuration,\n } = params;\n const modified = new Date().toISOString().replace(/\\.\\d+Z$/, 'Z');\n const hasOverlays = chapters.some((c) => c.smilFilename);\n\n // Manifest items\n const manifestItems: string[] = [\n ' <item id=\"toc\" href=\"toc.xhtml\" media-type=\"application/xhtml+xml\" properties=\"nav\"/>',\n ' <item id=\"css\" href=\"styles.css\" media-type=\"text/css\"/>',\n ];\n\n if (coverFilename) {\n const mime = inferMimeType(coverFilename);\n manifestItems.push(\n ` <item id=\"cover-image\" href=\"images/${escapeXml(coverFilename)}\" media-type=\"${mime}\" properties=\"cover-image\"/>`,\n );\n }\n\n for (const chap of chapters) {\n const overlayAttr = chap.smilFilename ? ` media-overlay=\"${chap.id}-overlay\"` : '';\n manifestItems.push(\n ` <item id=\"${chap.id}\" href=\"chapters/${escapeXml(chap.filename)}\" media-type=\"application/xhtml+xml\"${overlayAttr}/>`,\n );\n if (chap.smilFilename) {\n manifestItems.push(\n ` <item id=\"${chap.id}-overlay\" href=\"chapters/${escapeXml(chap.smilFilename)}\" media-type=\"application/smil+xml\"/>`,\n );\n }\n }\n\n // Audio files in manifest\n if (audioFiles) {\n const usedAudioNames = new Set<string>();\n for (const af of audioFiles) {\n if (usedAudioNames.has(af.filename)) continue;\n usedAudioNames.add(af.filename);\n const audioId = `audio-${af.filename.replace(/[^a-zA-Z0-9]/g, '-')}`;\n manifestItems.push(\n ` <item id=\"${audioId}\" href=\"audio/${escapeXml(af.filename)}\" media-type=\"${af.mime}\"/>`,\n );\n }\n }\n\n const usedFilenames = new Set<string>();\n for (const [, img] of images) {\n if (usedFilenames.has(img.filename)) continue;\n usedFilenames.add(img.filename);\n const imgId = `img-${img.filename.replace(/[^a-zA-Z0-9]/g, '-')}`;\n manifestItems.push(\n ` <item id=\"${imgId}\" href=\"images/${escapeXml(img.filename)}\" media-type=\"${img.mime}\"/>`,\n );\n }\n\n // Spine\n const spineItems = chapters.map((chap) => ` <itemref idref=\"${chap.id}\"/>`).join('\\n');\n\n // Metadata\n const metaParts = [\n ` <dc:identifier id=\"uid\">urn:uuid:${uuid}</dc:identifier>`,\n ` <dc:title>${escapeXml(title)}</dc:title>`,\n ` <dc:language>${escapeXml(language)}</dc:language>`,\n ` <meta property=\"dcterms:modified\">${modified}</meta>`,\n ];\n if (author) metaParts.push(` <dc:creator>${escapeXml(author)}</dc:creator>`);\n if (description) metaParts.push(` <dc:description>${escapeXml(description)}</dc:description>`);\n if (publisher) metaParts.push(` <dc:publisher>${escapeXml(publisher)}</dc:publisher>`);\n\n // Media Overlay metadata\n if (hasOverlays && totalDuration) {\n metaParts.push(` <meta property=\"media:duration\">${formatTime(totalDuration)}</meta>`);\n metaParts.push(' <meta property=\"media:active-class\">epub-media-overlay-active</meta>');\n }\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<package xmlns=\"http://www.idpf.org/2007/opf\" version=\"3.0\" unique-identifier=\"uid\">\n <metadata xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n${metaParts.join('\\n')}\n </metadata>\n <manifest>\n${manifestItems.join('\\n')}\n </manifest>\n <spine>\n${spineItems}\n </spine>\n</package>`;\n}\n\nfunction generateTocXhtml(chapters: ChapterFileInfo[], bookTitle: string): string {\n const navItems = chapters\n .map(\n (chap) =>\n ` <li><a href=\"chapters/${escapeXml(chap.filename)}\">${escapeXml(chap.title)}</a></li>`,\n )\n .join('\\n');\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:epub=\"http://www.idpf.org/2007/ops\">\n<head>\n <meta charset=\"UTF-8\"/>\n <title>${escapeXml(bookTitle)}</title>\n <link rel=\"stylesheet\" type=\"text/css\" href=\"styles.css\"/>\n</head>\n<body>\n <nav epub:type=\"toc\">\n <h1>Table of Contents</h1>\n <ol>\n${navItems}\n </ol>\n </nav>\n</body>\n</html>`;\n}\n\n// ── Stylesheet ────────────────────────────────────────────────────\n\nfunction generateStylesheet(themeId?: string): string {\n let themeVars = '';\n if (themeId) {\n const theme = resolveTheme(themeId);\n themeVars = `\n --epub-bg: ${theme.colors.background};\n --epub-text: ${theme.colors.text};\n --epub-primary: ${theme.colors.primary};\n --epub-heading-font: ${theme.typography.titleFontFamily};\n --epub-body-font: ${theme.typography.bodyFontFamily};`;\n }\n\n return `/* Squisq EPUB Stylesheet */\n:root {${themeVars}\n}\n\nbody {\n font-family: var(--epub-body-font, Georgia, 'Times New Roman', serif);\n color: var(--epub-text, #1a1a1a);\n line-height: 1.7;\n margin: 1em 2em;\n max-width: 40em;\n}\n\nh1, h2, h3, h4, h5, h6 {\n font-family: var(--epub-heading-font, system-ui, sans-serif);\n color: var(--epub-primary, #1a1a1a);\n margin-top: 1.5em;\n margin-bottom: 0.5em;\n line-height: 1.3;\n}\n\nh1 { font-size: 2em; }\nh2 { font-size: 1.5em; }\nh3 { font-size: 1.25em; }\n\np {\n margin: 0.8em 0;\n}\n\na {\n color: var(--epub-primary, #2563eb);\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\npre {\n background: #f5f5f5;\n padding: 1em;\n overflow-x: auto;\n border-radius: 4px;\n font-size: 0.9em;\n line-height: 1.4;\n}\n\ncode {\n font-family: 'Courier New', Courier, monospace;\n font-size: 0.9em;\n}\n\np > code, li > code {\n background: #f0f0f0;\n padding: 0.1em 0.3em;\n border-radius: 3px;\n}\n\nblockquote {\n border-left: 3px solid var(--epub-primary, #d1d5db);\n margin: 1em 0;\n padding: 0.5em 1em;\n color: #4b5563;\n}\n\ntable {\n border-collapse: collapse;\n width: 100%;\n margin: 1em 0;\n}\n\nth, td {\n border: 1px solid #d1d5db;\n padding: 0.5em 0.75em;\n text-align: left;\n}\n\nth {\n background: #f3f4f6;\n font-weight: 600;\n}\n\nhr {\n border: none;\n border-top: 1px solid #d1d5db;\n margin: 2em 0;\n}\n\nul, ol {\n margin: 0.8em 0;\n padding-left: 1.5em;\n}\n\nli {\n margin: 0.3em 0;\n}\n\n.math {\n font-family: 'Courier New', Courier, monospace;\n font-style: italic;\n}\n\n/* Media Overlay active highlight (narration sync) */\n.epub-media-overlay-active {\n background-color: rgba(37, 99, 235, 0.12);\n}\n`;\n}\n"],"mappings":";;;;;;;;;AAuBA,OAAO,WAAW;AAElB,SAAS,oBAAoB;AAwD7B,eAAsB,kBACpB,KACA,UAA6B,CAAC,GACR;AACtB,QAAM,UAAU,IAAI,aAAa;AACjC,QAAM,WAAW,IAAI,aAAa;AAClC,QAAM,QAAQ,QAAQ,UAAU,OAAO,YAAY,WAAW,UAAU;AACxE,QAAM,SAAS,QAAQ,WAAW,OAAO,aAAa,WAAW,WAAW;AAC5E,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,cAAc,QAAQ,eAAe;AAC3C,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,OAAO,OAAO,WAAW;AAG/B,QAAM,WAAW,kBAAkB,IAAI,QAAQ;AAG/C,QAAM,eAAe,iBAAiB,IAAI,QAAQ;AAClD,QAAM,iBAAiB,oBAAI,IAAmE;AAC9F,MAAI,QAAQ,QAAQ;AAClB,UAAM,YAAY,oBAAI,IAAY;AAClC,eAAW,OAAO,cAAc;AAC9B,YAAM,OAAO,QAAQ,OAAO,IAAI,GAAG;AACnC,UAAI,MAAM;AACR,YAAI,WAAW,gBAAgB,GAAG;AAElC,YAAI,UAAU,IAAI,QAAQ,GAAG;AAC3B,gBAAM,MAAM,SAAS,YAAY,GAAG;AACpC,gBAAM,OAAO,MAAM,IAAI,SAAS,MAAM,GAAG,GAAG,IAAI;AAChD,gBAAM,MAAM,MAAM,IAAI,SAAS,MAAM,GAAG,IAAI;AAC5C,cAAI,UAAU;AACd,iBAAO,UAAU,IAAI,GAAG,IAAI,IAAI,OAAO,GAAG,GAAG,EAAE,EAAG;AAClD,qBAAW,GAAG,IAAI,IAAI,OAAO,GAAG,GAAG;AAAA,QACrC;AACA,kBAAU,IAAI,QAAQ;AACtB,uBAAe,IAAI,KAAK,EAAE,MAAM,MAAM,cAAc,QAAQ,GAAG,SAAS,CAAC;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAGA,QAAM,MAAM,mBAAmB,QAAQ,OAAO;AAG9C,QAAM,MAAM,IAAI,MAAM;AAGtB,MAAI,KAAK,YAAY,wBAAwB,EAAE,aAAa,QAAQ,CAAC;AAGrE,MAAI,KAAK,0BAA0B,aAAa;AAGhD,MAAI,KAAK,oBAAoB,GAAG;AAGhC,aAAW,CAAC,EAAE,GAAG,KAAK,gBAAgB;AACpC,QAAI,KAAK,gBAAgB,IAAI,QAAQ,IAAI,IAAI,IAAI;AAAA,EACnD;AAGA,MAAI;AACJ,MAAI,QAAQ,YAAY;AACtB,UAAM,QAAQ,IAAI,WAAW,QAAQ,UAAU;AAC/C,UAAM,QACJ,MAAM,UAAU,KAChB,MAAM,CAAC,MAAM,OACb,MAAM,CAAC,MAAM,MACb,MAAM,CAAC,MAAM,MACb,MAAM,CAAC,MAAM;AACf,oBAAgB,QAAQ,cAAc;AACtC,QAAI,KAAK,gBAAgB,aAAa,IAAI,QAAQ,UAAU;AAAA,EAC9D;AAGA,QAAM,WAAW,QAAQ;AACzB,QAAM,gBAAgB,QAAQ;AAC9B,QAAM,WAAW,YAAY,iBAAiB,cAAc,SAAS;AAErE,QAAM,oBAAmE,CAAC;AAC1E,QAAM,gBAAsD,CAAC;AAE7D,MAAI,UAAU;AACZ,eAAW,OAAO,eAAe;AAC/B,YAAM,OAAO,SAAS,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,IAAI;AAC3D,UAAI,MAAM;AACR,cAAM,WAAW,gBAAgB,IAAI,GAAG;AACxC,cAAM,YAAY,SAAS,SAAS,GAAG,IAAI,WAAW,GAAG,QAAQ;AACjE,YAAI,KAAK,eAAe,SAAS,IAAI,IAAI;AACzC,cAAM,OAAO,EAAE,UAAU,WAAW,MAAM,cAAc,SAAS,EAAE;AACnE,0BAAkB,KAAK,IAAI;AAC3B,sBAAc,KAAK,IAAI;AAAA,MACzB,OAAO;AACL,0BAAkB,KAAK,IAAI;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAGA,QAAM,eAA4C,CAAC;AACnD,MAAI,YAAY,cAAc,SAAS,GAAG;AACxC,QAAI,SAAS,WAAW,cAAc,QAAQ;AAC5C,cAAQ;AAAA,QACN,SAAS,SAAS,MAAM,iBAAiB,cAAc,MAAM;AAAA,MAE/D;AAAA,IACF;AACA,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAM,SAAS,KAAK,IAAI,GAAG,cAAc,SAAS,CAAC;AACnD,YAAM,MAAM,cAAc,MAAM;AAChC,YAAM,YAAY,kBAAkB,MAAM;AAC1C,UAAI,WAAW;AACb,qBAAa,KAAK;AAAA,UAChB,eAAe,UAAU;AAAA,UACzB,WAAW;AAAA,UACX,SAAS,IAAI;AAAA,UACb,UAAU,IAAI;AAAA,QAChB,CAAC;AAAA,MACH,OAAO;AACL,qBAAa,KAAK,IAAI;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,eAAkC,CAAC;AACzC,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,UAAM,OAAO,SAAS,CAAC;AACvB,UAAM,MAAM,OAAO,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACzC,UAAM,KAAK,WAAW,GAAG;AACzB,UAAM,WAAW,GAAG,EAAE;AACtB,UAAM,YAAY,aAAa,CAAC,KAAK;AAGrC,UAAM,QAAQ,mBAAmB,KAAK,OAAO,OAAO,gBAAgB,cAAc,IAAI;AACtF,QAAI,KAAK,kBAAkB,QAAQ,IAAI,KAAK;AAE5C,QAAI;AACJ,QAAI,WAAW;AACb,qBAAe,GAAG,EAAE;AACpB,YAAM,OAAO,aAAa,UAAU,WAAW,KAAK,KAAK;AACzD,UAAI,KAAK,kBAAkB,YAAY,IAAI,IAAI;AAAA,IACjD;AAEA,iBAAa,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,MACA,OAAO,KAAK;AAAA,MACZ;AAAA,MACA,UAAU,WAAW;AAAA,IACvB,CAAC;AAAA,EACH;AAGA,MAAI,KAAK,mBAAmB,iBAAiB,cAAc,KAAK,CAAC;AAGjE,MAAI;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,QAAQ;AAAA,MACR;AAAA,MACA,YAAY;AAAA,MACZ,eAAe,QAAQ;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,QAAM,OAAO,MAAM,IAAI,cAAc;AAAA,IACnC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,oBAAoB,EAAE,OAAO,EAAE;AAAA;AAAA,EAEjC,CAAC;AAED,SAAO;AACT;AASA,eAAsB,UAAU,KAAU,UAA6B,CAAC,GAAyB;AAC/F,QAAM,EAAE,cAAc,IAAI,MAAM,OAAO,uBAAuB;AAC9D,QAAM,cAAc,cAAc,GAAG;AAGrC,QAAM,cAAiC,EAAE,GAAG,QAAQ;AACpD,MAAI,IAAI,OAAO,UAAU,UAAU,CAAC,YAAY,eAAe;AAC7D,gBAAY,gBAAgB,IAAI,MAAM;AAAA,EACxC;AACA,MAAI,IAAI,YAAY,CAAC,YAAY,eAAe;AAC9C,gBAAY,gBAAgB,IAAI;AAAA,EAClC;AAEA,SAAO,kBAAkB,aAAa,WAAW;AACnD;AAwBA,SAAS,kBAAkB,OAAuC;AAChE,QAAM,WAAsB,CAAC;AAC7B,MAAI,eAAoC,CAAC;AACzC,MAAI,eAAe;AAEnB,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,aAAa,KAAK,SAAS,GAAG;AAE9C,UAAI,aAAa,SAAS,GAAG;AAC3B,iBAAS,KAAK,EAAE,OAAO,cAAc,OAAO,aAAa,CAAC;AAAA,MAC5D;AACA,qBAAe,mBAAmB,IAAI;AACtC,qBAAe,CAAC,IAAI;AAAA,IACtB,OAAO;AACL,mBAAa,KAAK,IAAI;AAAA,IACxB;AAAA,EACF;AAGA,MAAI,aAAa,SAAS,GAAG;AAC3B,aAAS,KAAK,EAAE,OAAO,cAAc,OAAO,aAAa,CAAC;AAAA,EAC5D;AAGA,MAAI,SAAS,WAAW,GAAG;AACzB,aAAS,KAAK,EAAE,OAAO,YAAY,OAAO,CAAC,EAAE,CAAC;AAAA,EAChD;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,SAAkC;AAC5D,SAAO,QAAQ,SAAS,IAAI,YAAY,EAAE,KAAK,EAAE;AACnD;AAEA,SAAS,aAAa,MAAkC;AACtD,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,KAAK;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,KAAK,SAAS,IAAI,YAAY,EAAE,KAAK,EAAE;AAAA,IAChD,KAAK;AACH,aAAO,KAAK;AAAA,IACd,KAAK;AACH,aAAO,KAAK,SAAS,IAAI,YAAY,EAAE,KAAK,EAAE;AAAA,IAChD,KAAK;AACH,aAAO,KAAK,OAAO;AAAA,IACrB,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAIA,SAAS,iBAAiB,OAAyC;AACjE,QAAM,SAAS,oBAAI,IAAY;AAE/B,WAAS,UAAU,MAA+B;AAChD,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AAAA,MACL,KAAK;AACH,aAAK,SAAS,QAAQ,UAAU;AAChC;AAAA,MACF,KAAK;AACH,aAAK,SAAS,QAAQ,SAAS;AAC/B;AAAA,MACF,KAAK;AACH,aAAK,SAAS,QAAQ,CAAC,SAAS,KAAK,SAAS,QAAQ,SAAS,CAAC;AAChE;AAAA,MACF,KAAK;AACH,aAAK,SAAS;AAAA,UAAQ,CAAC,QACrB,IAAI,SAAS,QAAQ,CAAC,SAAS,KAAK,SAAS,QAAQ,UAAU,CAAC;AAAA,QAClE;AACA;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AAEA,WAAS,WAAW,MAAgC;AAClD,QACE,KAAK,SAAS,WACd,KAAK,OACL,CAAC,KAAK,IAAI,WAAW,OAAO,KAC5B,CAAC,KAAK,IAAI,WAAW,MAAM,GAC3B;AACA,aAAO,IAAI,KAAK,GAAG;AAAA,IACrB;AACA,QAAI,cAAc,QAAQ,MAAM,QAAQ,KAAK,QAAQ,GAAG;AACtD,MAAC,KAAK,SAAkC,QAAQ,UAAU;AAAA,IAC5D;AAAA,EACF;AAEA,QAAM,QAAQ,SAAS;AACvB,SAAO;AACT;AAMA,SAAS,mBACP,OACA,WACA,QACA,SAAS,OACD;AACR,MAAI,iBAAiB;AACrB,QAAM,SAAS,MAAM,IAAI,EAAE,cAAc;AACzC,QAAM,OAAO,MAAM,IAAI,CAAC,MAAM,aAAa,GAAG,QAAQ,SAAS,SAAS,MAAS,CAAC,EAAE,KAAK,IAAI;AAC7F,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,WAKE,UAAU,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA,EAI7B,IAAI;AAAA;AAAA;AAGN;AAEA,SAAS,aAAa,MAAyB,QAAkB,QAA+B;AAC9F,QAAM,SAAS,SAAS,QAAQ,OAAO,CAAC,MAAM;AAE9C,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK,WAAW;AACd,YAAM,MAAM,IAAI,KAAK,KAAK;AAC1B,aAAO,IAAI,GAAG,GAAG,MAAM,IAAI,eAAe,KAAK,UAAU,MAAM,CAAC,KAAK,GAAG;AAAA,IAC1E;AAAA,IAEA,KAAK;AACH,aAAO,KAAK,MAAM,IAAI,eAAe,KAAK,UAAU,MAAM,CAAC;AAAA,IAE7D,KAAK;AACH,aAAO,cAAc,MAAM;AAAA,EAAM,KAAK,SAAS,IAAI,CAAC,MAAM,aAAa,GAAG,QAAQ,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,IAEvG,KAAK,QAAQ;AACX,YAAM,MAAM,KAAK,UAAU,OAAO;AAClC,YAAM,YACJ,KAAK,WAAW,KAAK,SAAS,KAAK,UAAU,IAAI,WAAW,KAAK,KAAK,MAAM;AAC9E,YAAM,QAAQ,KAAK,SAAS,IAAI,CAAC,SAAS,gBAAgB,MAAM,MAAM,CAAC,EAAE,KAAK,IAAI;AAClF,aAAO,IAAI,GAAG,GAAG,MAAM,GAAG,SAAS;AAAA,EAAM,KAAK;AAAA,IAAO,GAAG;AAAA,IAC1D;AAAA,IAEA,KAAK,QAAQ;AACX,YAAM,WAAW,KAAK,OAAO,oBAAoB,UAAU,KAAK,IAAI,CAAC,MAAM;AAC3E,aAAO,OAAO,MAAM,SAAS,QAAQ,IAAI,UAAU,KAAK,KAAK,CAAC;AAAA,IAChE;AAAA,IAEA,KAAK;AACH,aAAO,MAAM,MAAM;AAAA,IAErB,KAAK;AACH,aAAO,aAAa,MAAuB,QAAQ,MAAM;AAAA,IAE3D,KAAK;AAEH,aAAO,KAAK,MAAM,IAAI,UAAU,KAAK,QAAQ,QAAQ,YAAY,EAAE,CAAC,CAAC;AAAA,IAEvE,KAAK;AACH,aAAO,KAAK,MAAM,iBAAiB,UAAU,KAAK,KAAK,CAAC;AAAA,IAE1D;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,gBAAgB,MAAwB,QAA0B;AACzE,QAAM,UAAU,KAAK,SAAS,IAAI,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,KAAK,IAAI;AAE3E,QAAM,YACJ,KAAK,SAAS,WAAW,KAAK,KAAK,SAAS,CAAC,EAAE,SAAS,cACpD,eAAgB,KAAK,SAAS,CAAC,EAAwB,UAAU,MAAM,IACvE;AACN,SAAO,OAAO,SAAS;AACzB;AAEA,SAAS,aAAa,OAAsB,QAAkB,SAAS,IAAY;AACjF,QAAM,OAAO,MAAM;AACnB,MAAI,KAAK,WAAW,EAAG,QAAO,SAAS,MAAM;AAE7C,QAAM,YAAY,KAAK,CAAC;AACxB,QAAM,WAAW,KAAK,MAAM,CAAC;AAC7B,QAAM,QAAQ,MAAM,SAAS,CAAC;AAE9B,WAAS,YAAY,MAAyB,KAAkB,UAA0B;AACxF,UAAM,IAAI,MAAM,QAAQ;AACxB,UAAM,QAAQ,IAAI,uBAAuB,CAAC,MAAM;AAChD,WAAO,IAAI,GAAG,GAAG,KAAK,IAAI,eAAe,KAAK,UAAU,MAAM,CAAC,KAAK,GAAG;AAAA,EACzE;AAEA,QAAM,QAAQ,cAAc,UAAU,SAAS,IAAI,CAAC,GAAG,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAC9F,QAAM,QACJ,SAAS,SAAS,IACd,UAAU,SAAS,IAAI,CAAC,QAA0B,OAAO,IAAI,SAAS,IAAI,CAAC,GAAG,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,aACtI;AAEN,SAAO,SAAS,MAAM,IAAI,KAAK,GAAG,KAAK;AACzC;AAEA,SAAS,eAAe,OAA6B,QAA0B;AAC7E,SAAO,MAAM,IAAI,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,EAAE,KAAK,EAAE;AAC3D;AAEA,SAAS,cAAc,MAA0B,QAA0B;AACzE,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,UAAU,KAAK,KAAK;AAAA,IAE7B,KAAK;AACH,aAAO,WAAW,eAAe,KAAK,UAAU,MAAM,CAAC;AAAA,IAEzD,KAAK;AACH,aAAO,OAAO,eAAe,KAAK,UAAU,MAAM,CAAC;AAAA,IAErD,KAAK;AACH,aAAO,QAAQ,eAAe,KAAK,UAAU,MAAM,CAAC;AAAA,IAEtD,KAAK;AACH,aAAO,SAAS,UAAU,KAAK,KAAK,CAAC;AAAA,IAEvC,KAAK,QAAQ;AACX,YAAM,YAAY,KAAK,QAAQ,WAAW,UAAU,KAAK,KAAK,CAAC,MAAM;AACrE,aAAO,YAAY,UAAU,KAAK,GAAG,CAAC,IAAI,SAAS,IAAI,eAAe,KAAK,UAAU,MAAM,CAAC;AAAA,IAC9F;AAAA,IAEA,KAAK,SAAS;AACZ,YAAM,MAAM,UAAU,KAAK,OAAO,EAAE;AACpC,YAAM,WAAW,OAAO,IAAI,KAAK,GAAG;AACpC,YAAM,MAAM,WAAW,aAAa,SAAS,QAAQ,KAAK,UAAU,KAAK,GAAG;AAC5E,aAAO,aAAa,GAAG,UAAU,GAAG;AAAA,IACtC;AAAA,IAEA,KAAK;AACH,aAAO;AAAA,IAET,KAAK;AACH,aAAO,sBAAsB,UAAU,KAAK,KAAK,CAAC;AAAA,IAEpD,KAAK;AAEH,aAAO,UAAU,KAAK,QAAQ,QAAQ,YAAY,EAAE,CAAC;AAAA,IAEvD;AACE,aAAO;AAAA,EACX;AACF;AAQA,SAAS,aACP,iBACA,WACA,OACQ;AAIR,MAAI,eAAe;AACnB,WAAS,YAAY,MAA+B;AAClD;AACA,QAAI,KAAK,SAAS,aAAc,MAAK,SAAS,QAAQ,WAAW;AAAA,EACnE;AACA,QAAM,QAAQ,WAAW;AAEzB,MAAI,iBAAiB,EAAG,gBAAe;AAGvC,QAAM,eAAe,UAAU,WAAW;AAC1C,QAAM,OAAiB,CAAC;AAExB,WAAS,IAAI,GAAG,IAAI,cAAc,KAAK;AACrC,UAAM,YAAY,WAAW,UAAU,YAAY,IAAI,cAAc,IAAI;AACzE,UAAM,UAAU,WAAW,UAAU,aAAa,IAAI,KAAK,cAAc,IAAI;AAC7E,SAAK;AAAA,MACH,oBAAoB,IAAI,CAAC;AAAA,mBACD,eAAe,KAAK,IAAI,CAAC;AAAA,6BACf,UAAU,UAAU,aAAa,CAAC,gBAAgB,SAAS,cAAc,OAAO;AAAA;AAAA,IAEpH;AAAA,EACF;AAEA,SAAO;AAAA;AAAA;AAAA,oCAG2B,eAAe;AAAA,EACjD,KAAK,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAIjB;AAEA,SAAS,WAAW,SAAiB,aAAa,OAAe;AAC/D,QAAM,IAAI,KAAK,MAAM,UAAU,IAAI;AACnC,QAAM,IAAI,KAAK,MAAO,UAAU,OAAQ,EAAE;AAC1C,QAAM,IAAI,UAAU;AACpB,QAAM,QAAQ,aAAa,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG,IAAI,OAAO,KAAK,MAAM,CAAC,CAAC,EAAE,SAAS,GAAG,GAAG;AAChG,SAAO,GAAG,CAAC,IAAI,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,KAAK;AACpD;AAIA,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBtB,SAAS,mBAAmB,QAA2B;AACrD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,WAAW,GAAG;AAChE,QAAM,cAAc,SAAS,KAAK,CAAC,MAAM,EAAE,YAAY;AAGvD,QAAM,gBAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,EACF;AAEA,MAAI,eAAe;AACjB,UAAM,OAAO,cAAc,aAAa;AACxC,kBAAc;AAAA,MACZ,2CAA2C,UAAU,aAAa,CAAC,iBAAiB,IAAI;AAAA,IAC1F;AAAA,EACF;AAEA,aAAW,QAAQ,UAAU;AAC3B,UAAM,cAAc,KAAK,eAAe,mBAAmB,KAAK,EAAE,cAAc;AAChF,kBAAc;AAAA,MACZ,iBAAiB,KAAK,EAAE,oBAAoB,UAAU,KAAK,QAAQ,CAAC,uCAAuC,WAAW;AAAA,IACxH;AACA,QAAI,KAAK,cAAc;AACrB,oBAAc;AAAA,QACZ,iBAAiB,KAAK,EAAE,4BAA4B,UAAU,KAAK,YAAY,CAAC;AAAA,MAClF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,YAAY;AACd,UAAM,iBAAiB,oBAAI,IAAY;AACvC,eAAW,MAAM,YAAY;AAC3B,UAAI,eAAe,IAAI,GAAG,QAAQ,EAAG;AACrC,qBAAe,IAAI,GAAG,QAAQ;AAC9B,YAAM,UAAU,SAAS,GAAG,SAAS,QAAQ,iBAAiB,GAAG,CAAC;AAClE,oBAAc;AAAA,QACZ,iBAAiB,OAAO,iBAAiB,UAAU,GAAG,QAAQ,CAAC,iBAAiB,GAAG,IAAI;AAAA,MACzF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,oBAAI,IAAY;AACtC,aAAW,CAAC,EAAE,GAAG,KAAK,QAAQ;AAC5B,QAAI,cAAc,IAAI,IAAI,QAAQ,EAAG;AACrC,kBAAc,IAAI,IAAI,QAAQ;AAC9B,UAAM,QAAQ,OAAO,IAAI,SAAS,QAAQ,iBAAiB,GAAG,CAAC;AAC/D,kBAAc;AAAA,MACZ,iBAAiB,KAAK,kBAAkB,UAAU,IAAI,QAAQ,CAAC,iBAAiB,IAAI,IAAI;AAAA,IAC1F;AAAA,EACF;AAGA,QAAM,aAAa,SAAS,IAAI,CAAC,SAAS,uBAAuB,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI;AAGxF,QAAM,YAAY;AAAA,IAChB,wCAAwC,IAAI;AAAA,IAC5C,iBAAiB,UAAU,KAAK,CAAC;AAAA,IACjC,oBAAoB,UAAU,QAAQ,CAAC;AAAA,IACvC,yCAAyC,QAAQ;AAAA,EACnD;AACA,MAAI,OAAQ,WAAU,KAAK,mBAAmB,UAAU,MAAM,CAAC,eAAe;AAC9E,MAAI,YAAa,WAAU,KAAK,uBAAuB,UAAU,WAAW,CAAC,mBAAmB;AAChG,MAAI,UAAW,WAAU,KAAK,qBAAqB,UAAU,SAAS,CAAC,iBAAiB;AAGxF,MAAI,eAAe,eAAe;AAChC,cAAU,KAAK,uCAAuC,WAAW,aAAa,CAAC,SAAS;AACxF,cAAU,KAAK,0EAA0E;AAAA,EAC3F;AAEA,SAAO;AAAA;AAAA;AAAA,EAGP,UAAU,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,EAGpB,cAAc,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,EAGxB,UAAU;AAAA;AAAA;AAGZ;AAEA,SAAS,iBAAiB,UAA6B,WAA2B;AAChF,QAAM,WAAW,SACd;AAAA,IACC,CAAC,SACC,+BAA+B,UAAU,KAAK,QAAQ,CAAC,KAAK,UAAU,KAAK,KAAK,CAAC;AAAA,EACrF,EACC,KAAK,IAAI;AAEZ,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,WAKE,UAAU,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7B,QAAQ;AAAA;AAAA;AAAA;AAAA;AAKV;AAIA,SAAS,mBAAmB,SAA0B;AACpD,MAAI,YAAY;AAChB,MAAI,SAAS;AACX,UAAM,QAAQ,aAAa,OAAO;AAClC,gBAAY;AAAA,eACD,MAAM,OAAO,UAAU;AAAA,iBACrB,MAAM,OAAO,IAAI;AAAA,oBACd,MAAM,OAAO,OAAO;AAAA,yBACf,MAAM,WAAW,eAAe;AAAA,sBACnC,MAAM,WAAW,cAAc;AAAA,EACnD;AAEA,SAAO;AAAA,SACA,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyGlB;","names":[]}