@codename/deck 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/deck.mjs.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/yaml.js", "../src/parse.js", "../src/kit.js", "../src/render.js", "../src/look.js", "../src/strings.js", "../src/deck.js", "../src/version.js", "../src/file.js", "../src/pptx.js", "../src/blocks.js", "../src/pictures.js", "../src/repair.js"],
4
- "sourcesContent": ["// Front matter as brains and Slidev write it: the YAML a deck needs, maps by their indent, lists\n// in blocks and in brackets, quoted and plain scalars, block scalars (| and >) and comments. What\n// it can't read stays a string, so a deck never fails to open over its settings. Pure.\n\n/** @param {string} text @returns {Record<string, any>} */\nexport function parseYaml(text) {\n const lines = text.replace(/\\r\\n?/g, '\\n').split('\\n').map((raw) => ({ indent: raw.length - raw.trimStart().length, text: uncomment(raw).trimEnd(), raw }))\n const at = { i: 0 }\n const value = block(lines, at, 0)\n return value && typeof value === 'object' && !Array.isArray(value) ? value : {}\n}\n\n/** A line without its comment: a # at its start or after a space, outside quotes. @param {string} line */\nfunction uncomment(line) {\n let quote = ''\n for (let i = 0; i < line.length; i++) {\n const c = line[i]\n if (quote) { if (c === quote) quote = '' }\n else if (c === '\"' || c === \"'\") quote = c\n else if (c === '#' && (i === 0 || /\\s/.test(line[i - 1]))) return line.slice(0, i)\n }\n return line\n}\n\n/** @param {{ indent: number, text: string, raw: string }[]} lines @param {{ i: number }} at @param {number} min @returns {any} */\nfunction block(lines, at, min) {\n while (at.i < lines.length && !lines[at.i].text.trim()) at.i++\n if (at.i >= lines.length || lines[at.i].indent < min) return null\n const indent = lines[at.i].indent\n if (/^-(\\s|$)/.test(lines[at.i].text.trim())) {\n const list = []\n while (at.i < lines.length) {\n const line = lines[at.i]\n if (!line.text.trim()) { at.i++; continue }\n if (line.indent !== indent || !/^-(\\s|$)/.test(line.text.trim())) break\n const rest = line.text.trim().slice(1).trim()\n at.i++\n if (!rest) list.push(block(lines, at, indent + 1))\n else if (/^[^'\"[{][^:]*:(\\s|$)/.test(rest)) {\n // A map that starts on the dash's line: its first key there, the rest below it.\n const width = line.raw.indexOf(rest)\n lines.splice(at.i, 0, { indent: width, text: ' '.repeat(width) + rest, raw: ' '.repeat(width) + rest })\n list.push(block(lines, at, width))\n } else list.push(scalar(rest))\n }\n return list\n }\n /** @type {Record<string, any>} */\n const map = {}\n while (at.i < lines.length) {\n const line = lines[at.i]\n if (!line.text.trim()) { at.i++; continue }\n if (line.indent !== indent) break\n const entry = /^(\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^']|'')*'|[^:]+?)\\s*:(?:\\s+(.*))?$/.exec(line.text.trim())\n at.i++\n if (!entry) continue\n const key = String(scalar(entry[1]))\n const rest = (entry[2] ?? '').trim()\n if (rest === '|' || rest === '>' || /^[|>][+-]$/.test(rest)) map[key] = blockScalar(lines, at, indent, rest[0] === '>')\n else if (rest) map[key] = scalar(rest)\n else map[key] = block(lines, at, indent + 1)\n }\n return map\n}\n\n/** @param {{ indent: number, text: string, raw: string }[]} lines @param {{ i: number }} at @param {number} indent @param {boolean} folded */\nfunction blockScalar(lines, at, indent, folded) {\n const taken = []\n while (at.i < lines.length && (!lines[at.i].raw.trim() || lines[at.i].indent > indent)) taken.push(lines[at.i++].raw)\n while (taken.length && !taken.at(-1)?.trim()) taken.pop()\n const width = Math.min(...taken.filter((line) => line.trim()).map((line) => line.length - line.trimStart().length))\n const text = taken.map((line) => line.slice(width)).join('\\n')\n return folded ? text.replace(/([^\\n])\\n(?=[^\\n])/g, '$1 ') : text\n}\n\n/** A scalar, or a list or map in brackets. @param {string} text @returns {any} */\nfunction scalar(text) {\n const t = text.trim()\n if (t.startsWith('[') || t.startsWith('{')) {\n const read = flow(t, { i: 0 })\n if (read !== undefined) return read\n }\n if (/^\"(?:[^\"\\\\]|\\\\.)*\"$/.test(t)) {\n try { return JSON.parse(t) } catch { return t.slice(1, -1) }\n }\n if (/^'(?:[^']|'')*'$/.test(t)) return t.slice(1, -1).replace(/''/g, \"'\")\n if (/^(true|yes|on)$/i.test(t)) return true\n if (/^(false|no|off)$/i.test(t)) return false\n if (/^(null|~)$/i.test(t) || t === '') return null\n if (/^[-+]?(\\d+\\.?\\d*|\\.\\d+)(e[-+]?\\d+)?$/i.test(t)) return Number(t)\n return t\n}\n\n/** A list or map in brackets, or undefined when it isn't one. @param {string} text @param {{ i: number }} at @returns {any} */\nfunction flow(text, at) {\n const space = () => { while (/\\s/.test(text[at.i] ?? '')) at.i++ }\n const item = () => {\n space()\n if (text[at.i] === '[' || text[at.i] === '{') return flow(text, at)\n const start = at.i\n if (text[at.i] === '\"' || text[at.i] === \"'\") {\n const q = text[at.i++]\n while (at.i < text.length && !(text[at.i] === q && text[at.i - 1] !== '\\\\')) at.i++\n at.i++\n } else while (at.i < text.length && !/[,\\]}]/.test(text[at.i]) && !(text[at.i] === ':' && /^[\\s,\\]}]?$/.test(text[at.i + 1] ?? ''))) at.i++\n return scalar(text.slice(start, at.i))\n }\n const open = text[at.i++]\n space()\n if (open === '[') {\n const list = []\n while (at.i < text.length && text[at.i] !== ']') {\n list.push(item())\n space()\n if (text[at.i] === ',') at.i++\n else if (text[at.i] !== ']') return undefined\n space()\n }\n at.i++\n return list\n }\n /** @type {Record<string, any>} */\n const map = {}\n while (at.i < text.length && text[at.i] !== '}') {\n const key = item()\n space()\n if (text[at.i] !== ':') return undefined\n at.i++\n map[String(key)] = item()\n space()\n if (text[at.i] === ',') at.i++\n else if (text[at.i] !== '}') return undefined\n space()\n }\n at.i++\n return map\n}\n", "// A deck's Markdown read as Slidev reads it (@slidev/parser's rules): slides between `---` lines;\n// a `---` line followed by a line that isn't empty opens that slide's settings, YAML up to the next\n// `---` line (or a ```yaml block at the slide's top); the first slide's settings are the deck's\n// too (its headmatter); the last HTML comment at a slide's end is the speaker's notes; `::name::`\n// on its own line starts a layout's slot. Fenced code and comments never split a slide. Every slide\n// and slot keeps where it starts in the source, so an edit made on a slide goes back to its words.\n// Read too, as brains write them even when asked for Slidev: Pandoc's and Quarto's fenced divs,\n// `::: notes` as the notes, and `:::: columns` holding `::: column`s as slots (what is above them\n// the heading, each column a slot, what is under them the foot), never rewritten.\n// Pure: no DOM, no Markdown parser.\nimport { parseYaml } from './yaml.js'\n\n/** @typedef {{ name: string, text: string, start: number }} Slot */\n/** @typedef {{ index: number, start: number, end: number, settings: Record<string, any>, slots: Slot[], notes: string, title: string }} Slide */\n/** @typedef {{ settings: Record<string, any>, slides: Slide[] }} Deck */\n\nconst SLOT = /^::([\\w-]+)::\\s*$/\n\n/** @param {string} source @returns {Deck} */\nexport function parseDeck(source) {\n const text = source.replace(/\\r\\n?/g, '\\n')\n const lines = text.split('\\n')\n const offsets = [0]\n for (const line of lines) offsets.push(/** @type {number} */ (offsets.at(-1)) + line.length + 1)\n /** @type {{ start: number, end: number, matter: [number, number] | null }[]} */\n const ranges = []\n let start = 0, matter = /** @type {[number, number] | null} */ (null), comment = false\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trimEnd()\n if (comment) { comment = commentGoesOn(line, true); continue }\n if (line.startsWith('---') && !/^---\\s*-/.test(line)) {\n if (i > start || matter) ranges.push({ start, end: i, matter })\n matter = null\n start = i + 1\n // Settings only when settings follow (a `key:` line), not words: Slidev would take a heading\n // there for settings and lose the slide, as decks brains write often start `---`, `# Title`.\n if (line[3] !== '-' && lines[i + 1]?.trim() && /^\\s*([\\w-]+\\s*:|#\\s)/.test(lines[i + 1]) && !/^#{1,6}\\s/.test(lines[i + 1])) {\n let j = i + 1\n while (j < lines.length && lines[j].trimEnd() !== '---') j++\n matter = [i + 1, j]\n i = j\n start = j + 1\n }\n } else if (/^\\s*(`{3,}|~{3,})/.test(line)) {\n const fence = /** @type {RegExpExecArray} */ (/^\\s*(`{3,}|~{3,})/.exec(line))[1]\n let j = i + 1\n while (j < lines.length && !lines[j].trimStart().startsWith(fence)) j++\n if (j < lines.length) i = j\n } else comment = commentGoesOn(line, false)\n }\n if (start < lines.length || matter) ranges.push({ start, end: lines.length, matter })\n // No `---` at all, as a document or a Pandoc deck is written: a slide at each heading of the first\n // two levels, as Pandoc's slide level does, the headmatter staying with the first.\n const last = /** @type {{ start: number, end: number, matter: [number, number] | null }} */ (ranges.at(-1))\n if (ranges.length === 1 && last) {\n let fence = ''\n const heads = []\n for (let i = last.start; i < last.end; i++) {\n const mark = /^\\s*(`{3,}|~{3,})/.exec(lines[i])?.[1]\n if (fence) { if (mark && lines[i].trimStart().startsWith(fence)) fence = '' }\n else if (mark) fence = mark\n else if (/^#{1,2}\\s+\\S/.test(lines[i])) heads.push(i)\n }\n if (heads.length >= 2) {\n ranges.pop()\n const cuts = heads[0] > last.start && !lines.slice(last.start, heads[0]).some((line) => line.trim()) ? heads : [last.start, ...heads.slice(heads[0] === last.start ? 1 : 0)]\n cuts.forEach((at, k) => ranges.push({ start: k === 0 ? last.start : at, end: cuts[k + 1] ?? last.end, matter: k === 0 ? last.matter : null }))\n }\n }\n const slides = ranges.map(({ start, end, matter }, index) => slide(lines, offsets, start, end, matter, index))\n .filter((one, i) => i === 0 || one.slots.some((slot) => slot.text.trim()) || Object.keys(one.settings).length)\n slides.forEach((one, i) => { one.index = i })\n return { settings: slides[0]?.settings ?? {}, slides }\n}\n\n/**\n * Pandoc's columns, as the lines where each slot starts: the first column `left`, the next `right`\n * (or `middle`, then `right`, for three), the line after the columns `bottom`. The fences' own lines\n * are left as they are and drawn as nothing. @param {string[]} lines @returns {Map<number, string>}\n */\nfunction columnsOf(lines) {\n /** @type {Map<number, string>} */\n const starts = new Map()\n const open = lines.findIndex((line) => /^:{3,}[ \\t]*\\{?[ \\t]*\\.?columns\\b/.test(line))\n if (open < 0) return starts\n const fence = /** @type {RegExpExecArray} */ (/^:+/.exec(lines[open]))[0]\n const close = lines.findIndex((line, i) => i > open && line.trim() === fence)\n const cols = lines.map((line, i) => [line, i]).filter(([line, i]) => Number(i) > open && (close < 0 || Number(i) < close) && /^:{3,}[ \\t]*\\{?[ \\t]*\\.?col(umn)?\\b/.test(String(line))).map(([, i]) => Number(i))\n if (cols.length < 2) return starts\n const names = cols.length === 2 ? ['left', 'right'] : ['left', 'middle', 'right', ...cols.slice(3).map((_, k) => `col-${k + 4}`)]\n cols.forEach((at, k) => starts.set(at, names[k]))\n if (close > 0 && lines.slice(close + 1).some((line) => line.trim())) starts.set(close, 'bottom')\n return starts\n}\n\n/** Whether a comment is still open at this line's end. @param {string} line @param {boolean} open */\nfunction commentGoesOn(line, open) {\n let at = 0\n for (;;) {\n if (open) {\n const end = line.indexOf('-->', at)\n if (end < 0) return true\n open = false\n at = end + 3\n } else {\n const begin = line.indexOf('<!--', at)\n if (begin < 0) return false\n const end = line.indexOf('-->', begin + 4)\n if (end < 0) return true\n at = end + 3\n }\n }\n}\n\n/**\n * @param {string[]} lines @param {number[]} offsets @param {number} from @param {number} to\n * @param {[number, number] | null} matter @param {number} index @returns {Slide}\n */\nfunction slide(lines, offsets, from, to, matter, index) {\n let settings = matter ? parseYaml(lines.slice(matter[0], matter[1]).join('\\n')) : {}\n let top = from\n // Slidev's other way to write settings: a ```yaml block at the slide's top.\n while (top < to && !lines[top].trim()) top++\n if (!matter && /^```ya?ml\\s*$/.test(lines[top] ?? '')) {\n let j = top + 1\n while (j < to && !lines[j].startsWith('```')) j++\n settings = parseYaml(lines.slice(top + 1, j).join('\\n'))\n from = j + 1\n }\n let body = lines.slice(from, to).join('\\n')\n let notes = ''\n // remark's `???` and reveal.js's `Note:`: what follows, to the slide's end, is the notes.\n const after = /^(\\?\\?\\?|Notes?:)[ \\t]*(.*)$/m.exec(body)\n if (after && after.index !== undefined && !/^```/m.test(body.slice(after.index))) {\n notes = [after[2], body.slice(after.index + after[0].length)].join('\\n').trim()\n body = body.slice(0, after.index)\n }\n // reveal.js's <aside class=\"notes\">, wherever on the slide, as Pandoc's below.\n body = body.replace(/<aside\\b[^>]*class=[\"']?notes[\"']?[^>]*>([\\s\\S]*?)<\\/aside>/gi, (all, text) => {\n notes += (notes ? '\\n' : '') + text.replace(/<[^>]*>/g, ' ').replace(/[ \\t]+/g, ' ').trim()\n return all.replace(/[^\\n]/g, ' ')\n })\n // Pandoc's notes, wherever on the slide: kept as the notes, blanked in place so offsets stay.\n body = body.replace(/^(:{3,})[ \\t]*\\{?[ \\t]*\\.?notes[ \\t]*\\}?[ \\t]*\\n([\\s\\S]*?)\\n\\1[ \\t]*$/gm, (all, _, text) => {\n notes += (notes ? '\\n' : '') + text.trim()\n return all.replace(/[^\\n]/g, ' ')\n })\n const comments = [...body.matchAll(/<!--([\\s\\S]*?)-->/g)]\n const last = comments.at(-1)\n if (last && last.index !== undefined && !body.slice(last.index + last[0].length).trim()) {\n notes = [last[1].trim(), notes].filter(Boolean).join('\\n')\n body = body.slice(0, last.index)\n }\n // Each slot's text is the source's own, from where it starts, so offsets in it are the source's.\n /** @type {Slot[]} */\n const slots = []\n let name = 'default', first = from, fence = ''\n /** @type {string[]} */\n let taken = []\n const push = () => slots.push({ name, text: taken.join('\\n'), start: offsets[first] })\n const columns = columnsOf(body.split('\\n'))\n for (const [i, line] of body.split('\\n').entries()) {\n const mark = /^\\s*(`{3,}|~{3,})/.exec(line)?.[1]\n const marker = SLOT.exec(line) ?? (columns.has(i) ? [line, /** @type {string} */ (columns.get(i))] : null)\n if (fence) { if (mark && line.trimStart().startsWith(fence)) fence = '' }\n else if (mark) fence = mark\n else if (marker) {\n push()\n name = marker[1]\n taken = []\n first = from + i + 1\n continue\n }\n taken.push(line)\n }\n push()\n const kept = slots.filter((slot, i) => i > 0 || slot.text.trim() || slots.length === 1)\n const heading = /^#{1,6}\\s+(.+)$/m.exec(body.replace(/^```[\\s\\S]*?^```/gm, ''))\n return { index, start: offsets[matter ? matter[0] - 1 : from], end: offsets[to] - 1, settings, slots: kept, notes, title: String(settings.title ?? heading?.[1] ?? '').trim() }\n}\n", "// A kit: a design system and the layouts that go with it, as data and never as CSS or code, so a\n// person, an organisation or a brain can make one and no kit can do more than lay out a slide.\n// deck's own kit holds the usual layouts; a host's (an organisation's, a project's) and the deck\n// file's own `kit:` go over it, in that order. A layout is a grid: its slots by name, the areas\n// they take, its tracks, how its words sit, what paper it is on, and the PowerPoint layout it is\n// nearest to. Everything is checked against a small grammar; what fails is dropped, with a reason.\n// Pure.\n\n/** @typedef {{ required?: boolean, max_words?: number, max_chars?: number, items?: [number, number], item_max_words?: number, heading_max_words?: number, kind?: string }} Budget */\n/** @typedef {{ label?: Record<string, string> | string, intent?: string, use_when?: string, avoid_when?: string, slots: string[], budgets: Record<string, Budget>, areas: string[][], columns: string[], rows: string[], align: 'start' | 'center' | 'end', justify: 'start' | 'center' | 'end', paper: 'paper' | 'fill' | 'ink' | 'soft', title: 'normal' | 'large' | 'huge', pptx: string, numbered: boolean }} Layout */\n/** @typedef {{ name?: string, tokens: Record<string, any>, layouts: Record<string, Layout> }} Kit */\n\nconst NAME = /^[a-z][a-z0-9-]{0,31}$/\nconst TRACK = /^(auto|min-content|max-content|\\d{1,2}(\\.\\d)?fr|\\d{1,3}%)$/\nconst PPTX = ['Title Slide', 'Title and Content', 'Section Header', 'Two Content', 'Comparison', 'Title Only', 'Blank', 'Content with Caption', 'Picture with Caption']\nconst ENUMS = /** @type {const} */ ({ align: ['start', 'center', 'end'], justify: ['start', 'center', 'end'], paper: ['paper', 'fill', 'ink', 'soft'], title: ['normal', 'large', 'huge'] })\n\n/** The names brains give the usual layouts, for the ones deck has. */\nexport const ALIASES = /** @type {Record<string, string>} */ ({\n title: 'cover', 'title-slide': 'cover', 'two-columns': 'two-cols', 'two-column': 'two-cols', columns: 'two-cols', comparison: 'two-cols-header',\n 'three-columns': 'three-cols', 'section-header': 'section', divider: 'section', big: 'fact', number: 'fact', 'image-text': 'image-right', closing: 'end', thanks: 'end',\n})\n\n/** deck's own kit: the usual layouts, the ones Slidev names and the ones PowerPoint has, as data. */\nexport const STANDARD = /** @type {Kit} */ ({\n name: 'standard',\n tokens: {},\n layouts: Object.fromEntries(Object.entries(/** @type {Record<string, any>} */ ({\n default: { label: { en: 'Title and content', fr: 'Titre et contenu' }, pptx: 'Title and Content' },\n cover: { label: { en: 'Cover', fr: 'Couverture' }, justify: 'center', paper: 'fill', title: 'huge', pptx: 'Title Slide', numbered: false },\n intro: { label: { en: 'Introduction', fr: 'Introduction' }, justify: 'center', paper: 'fill', title: 'large', pptx: 'Title Slide', numbered: false },\n section: { label: { en: 'Section', fr: 'Section' }, justify: 'center', paper: 'ink', title: 'huge', pptx: 'Section Header', numbered: false },\n center: { label: { en: 'Centred', fr: 'Centré' }, justify: 'center', align: 'center', pptx: 'Title Only' },\n statement: { label: { en: 'Statement', fr: 'Affirmation' }, justify: 'center', align: 'center', title: 'large', pptx: 'Title Only' },\n fact: { label: { en: 'Big number', fr: 'Grand chiffre' }, justify: 'center', align: 'center', title: 'huge', pptx: 'Title Only' },\n quote: { label: { en: 'Quote', fr: 'Citation' }, justify: 'center', pptx: 'Title Only' },\n end: { label: { en: 'Closing', fr: 'Clôture' }, justify: 'center', align: 'center', paper: 'fill', title: 'large', pptx: 'Title Slide', numbered: false },\n full: { label: { en: 'Full', fr: 'Plein cadre' }, pptx: 'Blank', numbered: false },\n none: { label: { en: 'Blank', fr: 'Vide' }, pptx: 'Blank', numbered: false },\n 'two-cols': { label: { en: 'Two columns', fr: 'Deux colonnes' }, slots: ['default', 'right'], areas: 'default right', columns: '1fr 1fr', pptx: 'Two Content' },\n 'two-cols-header': { label: { en: 'Comparison', fr: 'Comparaison' }, slots: ['default', 'left', 'right', 'bottom'], areas: 'default default | left right | bottom bottom', columns: '1fr 1fr', rows: 'auto 1fr auto', pptx: 'Comparison' },\n 'three-cols': { label: { en: 'Three columns', fr: 'Trois colonnes' }, slots: ['default', 'left', 'middle', 'right'], areas: 'default default default | left middle right', columns: '1fr 1fr 1fr', rows: 'auto 1fr', pptx: 'Comparison' },\n 'image-left': { label: { en: 'Picture left', fr: 'Image à gauche' }, pptx: 'Picture with Caption', justify: 'center' },\n 'image-right': { label: { en: 'Picture right', fr: 'Image à droite' }, pptx: 'Picture with Caption', justify: 'center' },\n image: { label: { en: 'Picture', fr: 'Image' }, pptx: 'Blank', numbered: false },\n })).map(([name, given]) => [name, /** @type {Layout} */ (layoutOf(given).layout)])),\n})\n\n/**\n * A layout as given, checked: its slots, areas and tracks in the grammar, its words' place, paper\n * and size among their names. @param {any} given @returns {{ layout: Layout | null, problems: string[] }}\n */\nexport function layoutOf(given) {\n const problems = []\n if (!given || typeof given !== 'object') return { layout: null, problems: ['not a layout'] }\n // Slots as names, or as a catalog writes them: each a budget, `title` being the heading the\n // default slot opens with rather than a slot of its own.\n /** @type {Record<string, Budget>} */\n const budgets = {}\n const named = Array.isArray(given.slots) || typeof given.slots === 'string' ? [given.slots].flat().map(String)\n : given.slots && typeof given.slots === 'object' ? Object.entries(given.slots).map(([name, budget]) => {\n if (budget && typeof budget === 'object') budgets[name] = clean(budget)\n return name === 'title' ? 'default' : name\n }) : ['default']\n const slots = [...new Set(named)]\n if (!slots.every((slot) => NAME.test(slot))) return { layout: null, problems: ['a slot name is not a-z, 0-9 and -'] }\n if (!slots.includes('default')) slots.unshift('default')\n // Areas as Slidev's and CSS's grid write them, rows split by | or new lines.\n /** @type {string[]} */\n const lines = Array.isArray(given.areas) ? given.areas.map((/** @type {any} */ row) => [row].flat().join(' ')) : String(given.areas ?? slots.join(' ')).split(/\\||\\n/)\n const rows = lines.map((row) => row.trim().replace(/^\"|\"$/g, '').split(/\\s+/)).filter((row) => row.length && row[0])\n const width = rows[0]?.length ?? 0\n if (!rows.length || rows.some((row) => row.length !== width) || rows.flat().some((cell) => cell !== '.' && !slots.includes(cell))) return { layout: null, problems: ['areas are not a rectangle of its slots'] }\n for (const slot of slots) {\n const cells = rows.flatMap((row, y) => row.map((cell, x) => /** @type {[string, number, number]} */ ([cell, x, y]))).filter(([cell]) => cell === slot)\n if (!cells.length) { if (slot !== 'default') problems.push(`slot ${slot} has no area`); continue }\n const xs = cells.map((c) => c[1]), ys = cells.map((c) => c[2])\n if (cells.length !== (Math.max(...xs) - Math.min(...xs) + 1) * (Math.max(...ys) - Math.min(...ys) + 1)) return { layout: null, problems: [`slot ${slot} is not a rectangle`] }\n }\n const tracks = (/** @type {any} */ value, /** @type {number} */ count) => {\n const list = value === undefined ? Array(count).fill('1fr') : (Array.isArray(value) ? value : String(value).split(/\\s+/)).map(String)\n return list.length === count && list.every((t) => TRACK.test(t)) ? list : null\n }\n const columns = tracks(given.columns, width), rowTracks = tracks(given.rows, rows.length)\n if (!columns || !rowTracks) return { layout: null, problems: ['columns or rows are not tracks deck knows (auto, 1fr, 40%…), one per column or row'] }\n const pick = (/** @type {keyof typeof ENUMS} */ key, /** @type {string} */ fallback) => {\n const value = String(given[key] ?? fallback)\n if (!(/** @type {readonly string[]} */ (ENUMS[key])).includes(value)) { problems.push(`${key} ${value} is not one of ${ENUMS[key].join(', ')}`); return fallback }\n return value\n }\n const label = typeof given.label === 'string' || (given.label && typeof given.label === 'object') ? given.label : undefined\n const words = (/** @type {any} */ v) => (typeof v === 'string' ? v.slice(0, 300) : undefined)\n return {\n layout: /** @type {Layout} */ ({\n label, intent: words(given.intent), use_when: words(given.use_when), avoid_when: words(given.avoid_when), slots, budgets, areas: rows, columns, rows: rowTracks,\n align: pick('align', 'start'), justify: pick('justify', 'start'), paper: pick('paper', 'paper'), title: pick('title', 'normal'),\n pptx: PPTX.includes(given.pptx) ? given.pptx : slots.length > 1 ? 'Comparison' : 'Title and Content', numbered: given.numbered !== false,\n }),\n problems,\n }\n}\n\n/** A slot's budget, its numbers only. @param {Record<string, any>} given @returns {Budget} */\nfunction clean(given) {\n /** @type {Record<string, any>} */\n const kept = {}\n for (const key of ['max_words', 'max_chars', 'item_max_words', 'heading_max_words']) if (Number.isInteger(given[key]) && given[key] > 0) kept[key] = given[key]\n if (Array.isArray(given.items) && given.items.length === 2 && given.items.every(Number.isInteger)) kept.items = given.items\n if (typeof given.required === 'boolean') kept.required = given.required\n if (typeof given.kind === 'string' && /^[a-z-]{1,20}$/.test(given.kind)) kept.kind = given.kind\n return kept\n}\n\n/**\n * Design tokens as the W3C's Design Tokens format (DTCG 2025.10) writes them, read into a kit's:\n * `color.light` and `color.dark` groups (bg, surface, fg, muted, accent) or flat colours, `font.sans`\n * and the like; each `$value` a hex string or a colour object with its `hex`. Tokens already flat\n * pass through. @param {any} given @returns {Record<string, any>}\n */\nexport function tokensFrom(given) {\n if (!given || typeof given !== 'object') return {}\n if (!JSON.stringify(given).includes('\"$value\"')) return given\n const value = (/** @type {any} */ t) => (t && typeof t === 'object' && '$value' in t ? t.$value : t)\n const colour = (/** @type {any} */ t) => { const v = value(t); return typeof v === 'string' ? v : typeof v?.hex === 'string' ? v.hex : undefined }\n const face = (/** @type {any} */ t) => { const v = value(t); return Array.isArray(v) ? v.map(String) : typeof v === 'string' ? [v] : undefined }\n const NAMES = /** @type {const} */ ({ bg: 'paper', background: 'paper', paper: 'paper', fg: 'ink', text: 'ink', ink: 'ink', accent: 'primary', primary: 'primary', muted: 'muted', surface: 'soft', soft: 'soft' })\n const group = (/** @type {any} */ g) => Object.fromEntries(Object.entries(g ?? {}).filter(([k]) => k in NAMES).map(([k, t]) => [NAMES[/** @type {keyof typeof NAMES} */ (k)], colour(t)]).filter(([, v]) => v))\n const colours = given.color ?? given.colour ?? {}\n /** @type {Record<string, any>} */\n const tokens = { ...group(colours), ...group(colours.light) }\n const dark = group(colours.dark)\n if (Object.keys(dark).length) tokens.dark = dark\n const fonts = given.font ?? given.fontFamily ?? {}\n const heading = face(fonts.heading ?? fonts.display ?? fonts.sans), body = face(fonts.body ?? fonts.text ?? fonts.sans)\n if (heading || body) tokens.fonts = { heading: heading ?? body, body: body ?? heading }\n return tokens\n}\n\n/**\n * Kits merged, the later over the earlier: their tokens, and their layouts by name, each checked.\n * @param {...any} kits @returns {{ kit: Kit, problems: string[] }}\n */\nexport function mergeKits(...kits) {\n /** @type {Kit} */\n const kit = { name: 'standard', tokens: {}, layouts: { ...STANDARD.layouts } }\n const problems = []\n for (const given of kits) {\n if (!given || typeof given !== 'object') continue\n if (typeof given.name === 'string') kit.name = given.name\n if (given.tokens && typeof given.tokens === 'object') kit.tokens = { ...kit.tokens, ...tokensFrom(given.tokens) }\n for (const [name, definition] of Object.entries(given.layouts ?? given.types ?? {})) {\n if (!NAME.test(name)) { problems.push(`layout ${name}: not a-z, 0-9 and -`); continue }\n const { layout, problems: found } = layoutOf(definition)\n problems.push(...found.map((p) => `layout ${name}: ${p}`))\n if (layout) kit.layouts[name] = layout\n }\n }\n return { kit, problems }\n}\n\n/** A layout's name in a language, else its own name. @param {Layout} layout @param {string} name @param {string} lang */\nexport function labelOf(layout, name, lang) {\n if (typeof layout.label === 'string') return layout.label\n return layout.label?.[lang] ?? layout.label?.[lang.split('-')[0]] ?? layout.label?.en ?? name\n}\n\n/**\n * The layout a slide that names none is given, from what it holds, as Pandoc's PowerPoint writer\n * chooses: the first slide is the cover; a heading alone, a section; slots beyond the first, the\n * layout of two (or three) columns that has them; a number alone as its heading, a fact; a quote\n * alone, a quote; else the default. @param {{ index: number, slots: { name: string, text: string }[] }} slide\n */\nexport function inferLayout(slide) {\n const names = slide.slots.map((slot) => slot.name)\n if (names.includes('middle')) return 'three-cols'\n if (names.includes('left')) return 'two-cols-header'\n if (names.includes('right')) return 'two-cols'\n if (slide.index === 0) return 'cover'\n const text = slide.slots.map((slot) => slot.text).join('\\n').trim()\n const lines = text.split('\\n').filter((line) => line.trim())\n if (lines.length === 1 && /^#{1,2}\\s+\\S/.test(lines[0])) return 'section'\n if (/^#\\s+[^\\s]*\\d[\\d\\s.,%€$£¥]*\\S*\\s*$/u.test(lines[0] ?? '') && lines.length <= 3 && !/^\\s*[-*\\d]+[.)]?\\s/m.test(lines.slice(1).join('\\n'))) return 'fact'\n if (lines.length && lines.every((line, i) => line.startsWith('>') || (i === lines.length - 1 && !line.startsWith('#')))) return lines[0].startsWith('>') ? 'quote' : 'default'\n return 'default'\n}\n", "// A slide drawn from its Markdown: marked's tokens made into elements with the DOM's own calls, so\n// nothing here needs innerHTML, a style attribute or a Trusted Types policy, and a page under any\n// policy can draw a deck. Each block that can be changed by hand says where its words are in the\n// source (data-edit, offsets), so an edit made on the slide goes back into the Markdown. HTML a\n// deck holds is not drawn: Slidev's <v-click> and <v-clicks> become steps, <br> a line break, and\n// any other tag gives up its words alone. ```echarts and ```mermaid go to the host's drawers.\nimport { STANDARD, inferLayout, ALIASES } from './kit.js'\n\n/** @typedef {import('./parse.js').Slide} Slide */\n/** @typedef {import('./parse.js').Slot} Slot */\n/** @typedef {(element: HTMLElement, source: string) => void | Promise<void>} Drawer */\n/** @typedef {{ blocks: Record<string, Drawer>, resolve: (src: string) => string | null, headings: 'real' | 'aria', number: (n: number) => string, total: number, kit: import('./kit.js').Kit, lex: (markdown: string) => any[], slide: string }} Context */\n\n/**\n * @param {string} tag @param {Record<string, string | number | boolean | undefined>} [attributes]\n * @param {(Node | string | null | undefined | false)[]} [children]\n */\nexport function h(tag, attributes = {}, children = []) {\n const element = document.createElement(tag)\n for (const [name, value] of Object.entries(attributes)) if (value !== undefined && value !== false) element.setAttribute(name, value === true ? '' : String(value))\n for (const child of children) if (child || child === '') element.append(child)\n return element\n}\n\n/** An address a slide may show: the web's, a picture held in the file, or one beside it. @param {string} href */\nexport function safeUrl(href) {\n const url = String(href ?? '').trim()\n if (/^(https?:|mailto:|blob:|#)/i.test(url) || /^data:image\\/(png|jpe?g|gif|webp|avif|svg\\+xml);/i.test(url)) return url\n if (/^[a-z][\\w+.-]*:/i.test(url)) return null\n return url\n}\n\n/**\n * A slide, laid out by its layout, with its slots, steps and number.\n * @param {Slide} slide @param {Context} context @returns {{ element: HTMLElement, steps: number }}\n */\nexport function renderSlide(slide, context) {\n // The layout the slide names, by its name or a name brains give it, else the one its content suits.\n const asked = String(slide.settings.layout ?? '').trim().toLowerCase()\n const layout = context.kit.layouts[asked] ? asked : context.kit.layouts[ALIASES[asked]] ? ALIASES[asked] : inferLayout(slide)\n const definition = context.kit.layouts[layout] ?? STANDARD.layouts.default\n const classes = String(slide.settings.class ?? '').split(/\\s+/).filter((name) => ['invert', 'text-center', 'text-left'].includes(name))\n const counter = { step: 0 }\n const slots = new Map(slide.slots.map((slot) => [slot.name, slot]))\n const names = definition.slots\n const section = h('section', {\n class: ['deck-slide', `deck-layout-${layout}`, ...classes.map((name) => `deck-class-${name}`)].join(' '),\n 'data-index': slide.index, 'data-layout': layout, 'data-paper': definition.paper, 'data-align': definition.align, 'data-justify': definition.justify, 'data-title': definition.title,\n 'aria-roledescription': context.slide, role: 'group',\n })\n // Its grid, from the layout's definition, through the CSSOM: areas named s-<slot>, as `default` is no name CSS allows.\n const canvas = h('div', { class: 'deck-canvas' })\n canvas.style.setProperty('grid-template-areas', definition.areas.map((row) => `\"${row.map((cell) => (cell === '.' ? '.' : `s-${cell}`)).join(' ')}\"`).join(' '))\n canvas.style.setProperty('grid-template-columns', definition.columns.join(' '))\n canvas.style.setProperty('grid-template-rows', definition.rows.join(' '))\n section.append(canvas)\n const image = slide.settings.image ?? slide.settings.background\n if (typeof image === 'string' && ['image-left', 'image-right', 'image', 'cover'].includes(layout)) {\n const url = context.resolve(image)\n if (url) {\n const picture = h('div', { class: 'deck-image', role: 'img', 'aria-label': String(slide.settings.alt ?? '') || undefined })\n picture.style.setProperty('--deck-image', `url(\"${url.replace(/[\"\\\\\\n]/g, encodeURIComponent)}\")`)\n canvas.append(picture)\n section.classList.add('has-image')\n }\n }\n for (const name of names) {\n const slot = slots.get(name)\n const element = h('div', { class: 'deck-slot', 'data-slot': name }, slot ? blocks(slot, context, counter) : [])\n element.style.setProperty('grid-area', `s-${name}`)\n canvas.append(element)\n }\n // Slots a layout doesn't have still show, under the rest, rather than being lost.\n for (const slot of slide.slots) if (!names.includes(slot.name)) canvas.append(h('div', { class: 'deck-slot', 'data-slot': slot.name }, blocks(slot, context, counter)))\n if (definition.numbered && slide.settings.paginate !== false) section.append(h('span', { class: 'deck-number', 'aria-hidden': 'true' }, [context.number(slide.index + 1)]))\n return { element: section, steps: counter.step }\n}\n\n/** @param {Slot} slot @param {Context} context @param {{ step: number }} counter @returns {Node[]} */\nfunction blocks(slot, context, counter) {\n const tokens = context.lex(slot.text)\n /** @type {Node[]} */\n const out = []\n let at = slot.start, mode = /** @type {'' | 'click' | 'clicks'} */ ('')\n for (const token of tokens) {\n const start = at\n at += token.raw.length\n // Pandoc's fences: `::: incremental` shows its list a point a click, as <v-clicks> does; the others, nothing.\n const fences = token.type === 'paragraph' ? token.raw.trim().split('\\n').map((/** @type {string} */ line) => line.trim()) : []\n if (fences.length && fences.every((/** @type {string} */ line) => /^:{3,}/.test(line))) {\n for (const fence of fences) {\n if (/^:{3,}[ \\t]*\\{?[ \\t]*\\.?incremental\\b/.test(fence)) mode = 'clicks'\n else if (/^:{3,}\\s*$/.test(fence) && mode === 'clicks') mode = ''\n }\n continue\n }\n if (token.type === 'html') {\n const tag = /^\\s*<(\\/?)(v-clicks?|br)\\b[^>]*>\\s*$/i.exec(token.raw)\n if (tag && tag[2] === 'br') out.push(h('br'))\n else if (tag) mode = tag[1] ? '' : /** @type {'click' | 'clicks'} */ (tag[2].toLowerCase() === 'v-clicks' ? 'clicks' : 'click')\n else if (/<li\\b/i.test(token.raw)) {\n // A list written as HTML, as brains write Slidev's steps (<li v-click>): its items' words, each\n // a step when it asks to be one.\n const list = h(/<ol\\b/i.test(token.raw) ? 'ol' : 'ul', { dir: 'auto' })\n for (const [, attrs, inner] of token.raw.matchAll(/<li\\b([^>]*)>([\\s\\S]*?)(?=<\\/li>|<li\\b|<\\/[ou]l>|$)/gi)) {\n const words = inner.replace(/<!--[\\s\\S]*?-->/g, '').replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim()\n if (!words) continue\n const li = h('li', { dir: 'auto' }, [words])\n if (/\\bv-click\\b/.test(attrs) || mode === 'clicks') step(li, ++counter.step)\n list.append(li)\n }\n if (list.childElementCount) out.push(list)\n } else {\n const words = token.raw.replace(/<!--[\\s\\S]*?-->/g, '').replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim()\n if (words) out.push(h('p', {}, [words]))\n }\n continue\n }\n const element = block(token, start, context, mode === 'clicks' ? counter : null)\n if (!element) continue\n if (mode === 'click' || (mode === 'clicks' && token.type !== 'list')) step(element, ++counter.step)\n out.push(element)\n }\n return out\n}\n\n/** @param {Element} element @param {number} n */\nconst step = (element, n) => { element.classList.add('deck-step'); element.setAttribute('data-step', String(n)) }\n\n/**\n * @param {any} token @param {number} start where its raw starts in the source\n * @param {Context} context @param {{ step: number } | null} stepped list items each a step\n * @returns {HTMLElement | null}\n */\nfunction block(token, start, context, stepped) {\n switch (token.type) {\n case 'heading': {\n const head = /^\\s*#{1,6}[ \\t]+/.exec(token.raw)\n const edit = head ? range(start + head[0].length, start + token.raw.replace(/\\s*#*\\s*$/, '').length) : undefined\n return context.headings === 'real'\n ? h(`h${token.depth}`, { dir: 'auto', 'data-edit': edit }, inline(token.tokens, context))\n : h('p', { class: `deck-h deck-h${token.depth}`, role: 'heading', 'aria-level': Math.min(6, token.depth + 2), dir: 'auto', 'data-edit': edit }, inline(token.tokens, context))\n }\n case 'paragraph': {\n const lone = token.tokens.length === 1 && token.tokens[0].type === 'image'\n return h('p', { dir: 'auto', class: lone ? 'deck-picture' : undefined, 'data-edit': lone ? undefined : range(start, start + token.raw.trimEnd().length) }, inline(token.tokens, context))\n }\n case 'text': return h('p', { dir: 'auto' }, inline(token.tokens ?? [{ type: 'text', text: token.text }], context))\n // No dir=auto here: the browser would skip its paragraphs, which have their own, and find no letter.\n case 'blockquote': return h('blockquote', {}, children(token.tokens, start, token.raw, context))\n case 'list': {\n let from = 0\n const list = h(token.ordered ? 'ol' : 'ul', { start: token.ordered && token.start !== 1 ? token.start : undefined, class: token.items.some((/** @type {any} */ item) => item.task) ? 'deck-tasks' : undefined })\n for (const item of token.items) {\n const offset = token.raw.indexOf(item.raw, from)\n from = offset + item.raw.length\n const itemStart = start + Math.max(0, offset)\n const marker = /^\\s*(?:[-*+]|\\d+[.)])\\s+(?:\\[[ xX]\\]\\s+)?/.exec(item.raw)\n const simple = item.tokens.length === 1 && item.tokens[0].type === 'text' && !/\\n\\s*\\S/.test(item.raw.trim().split('\\n').slice(1).join('\\n'))\n const li = h('li', { dir: 'auto', 'data-edit': simple && marker ? range(itemStart + marker[0].length, itemStart + item.raw.trimEnd().length) : undefined }, [\n item.task ? h('input', { type: 'checkbox', checked: item.checked, disabled: true, 'aria-label': item.text }) : null,\n ...item.tokens.flatMap((/** @type {any} */ inner) => inner.type === 'text' ? inline(inner.tokens ?? [{ type: 'text', text: inner.text }], context)\n : [block(inner, itemStart + Math.max(0, item.raw.indexOf(inner.raw)), context, null)]),\n ])\n if (stepped) step(li, ++stepped.step)\n list.append(li)\n }\n return list\n }\n case 'code': {\n const info = /^(\\S*)\\s*(?:\\{([^}]*)\\})?/.exec(token.lang ?? '') ?? []\n const lang = (info[1] ?? '').toLowerCase()\n const drawer = context.blocks[lang]\n if (drawer) {\n const box = h('div', { class: `deck-block deck-${lang}`, 'data-source': token.text })\n box.append(h('pre', { class: 'deck-block-source', dir: 'ltr' }, [h('code', {}, [token.text])]))\n queueMicrotask(() => Promise.resolve(drawer(box, token.text)).catch(() => box.classList.add('is-failed')))\n return box\n }\n const marked = lines(info[2] ?? '')\n const code = h('code', { class: lang ? `language-${lang}` : undefined })\n for (const [i, line] of token.text.split('\\n').entries()) code.append(h('span', { class: marked.has(i + 1) ? 'deck-line is-marked' : 'deck-line' }, [line, '\\n']))\n return h('pre', { dir: 'ltr', class: marked.size ? 'has-marks' : undefined, tabindex: 0 }, [code])\n }\n case 'table': {\n const align = (/** @type {string | null} */ a) => a ?? undefined\n return h('div', { class: 'deck-table' }, [h('table', {}, [\n h('thead', {}, [h('tr', {}, token.header.map((/** @type {any} */ cell, /** @type {number} */ i) => h('th', { 'data-align': align(token.align[i]), dir: 'auto' }, inline(cell.tokens, context))))]),\n h('tbody', {}, token.rows.map((/** @type {any[]} */ row) => h('tr', {}, row.map((cell, i) => h('td', { 'data-align': align(token.align[i]), dir: 'auto' }, inline(cell.tokens, context)))))),\n ])])\n }\n default: return null\n }\n}\n\n/** @param {any[]} tokens @param {number} start @param {string} raw @param {Context} context */\nfunction children(tokens, start, raw, context) {\n let from = 0\n return tokens.map((token) => {\n const offset = raw.indexOf(token.raw, from)\n from = Math.max(from, offset + token.raw.length)\n return block(token, start + Math.max(0, offset), context, null)\n })\n}\n\n/** Line numbers as Slidev marks them, `{2,4-5}`; `|` steps are read as all their lines at once. @param {string} text */\nfunction lines(text) {\n const marked = new Set()\n for (const part of text.split(/[,|]/)) {\n const [a, b] = part.split('-').map((n) => parseInt(n, 10))\n if (Number.isFinite(a)) for (let n = a; n <= (Number.isFinite(b) ? b : a); n++) marked.add(n)\n }\n return marked\n}\n\n/** @param {number} from @param {number} to */\nconst range = (from, to) => (to > from ? `${from}-${to}` : undefined)\n\n/** @param {any[]} tokens @param {Context} context @returns {Node[]} */\nexport function inline(tokens = [], context) {\n return tokens.flatMap((token) => {\n switch (token.type) {\n case 'text': case 'escape': return token.tokens ? inline(token.tokens, context) : [token.text.replace(/&(amp|lt|gt|quot|#39);/g, (/** @type {string} */ _, /** @type {string} */ e) => ({ amp: '&', lt: '<', gt: '>', quot: '\"', '#39': \"'\" })[/** @type {'amp'} */ (e)])]\n case 'strong': return [h('strong', {}, inline(token.tokens, context))]\n case 'em': return [h('em', {}, inline(token.tokens, context))]\n case 'del': return [h('del', {}, inline(token.tokens, context))]\n case 'codespan': return [h('code', {}, [token.text.replace(/&(amp|lt|gt|quot|#39);/g, (/** @type {string} */ _, /** @type {string} */ e) => ({ amp: '&', lt: '<', gt: '>', quot: '\"', '#39': \"'\" })[/** @type {'amp'} */ (e)])])]\n case 'br': return [h('br')]\n case 'link': {\n const href = safeUrl(token.href)\n return href ? [h('a', { href, rel: 'noopener noreferrer', target: href.startsWith('#') ? undefined : '_blank' }, inline(token.tokens, context))] : inline(token.tokens, context)\n }\n case 'image': {\n const src = context.resolve(token.href)\n return src ? [h('img', { src, alt: token.text, loading: 'lazy' })] : [token.text]\n }\n case 'html': return /^<br\\s*\\/?>$/i.test(token.raw) ? [h('br')] : []\n default: return token.text ? [token.text] : []\n }\n })\n}\n", "// A deck's look: a design system's few tokens (paper, ink, primary, a voice for its type), from a\n// named look, then the project's, then the deck's own `themeConfig`, as Slidev names a theme's\n// settings. Light and dark are both worked out from them: each colour kept at its hue, deepened or\n// lightened until it reads at AA on the paper it sits on (4.5:1 for words, 3:1 for a chart's\n// marks), so a brain's or a person's colours can't make a slide unreadable. Pure.\n\n/** @typedef {{ paper: string, ink: string, primary: string, voice: string, radius: number, muted?: string, soft?: string, dark?: Record<string, string>, fonts?: { heading: string[], body: string[] } }} Tokens */\n/** @typedef {{ paper: string, ink: string, muted: string, line: string, primary: string, onPrimary: string, soft: string, series: string[] }} Scheme */\n\n/** Looks a deck can name (`theme:`), each a handful of tokens. */\nexport const LOOKS = /** @type {Record<string, Tokens>} */ ({\n default: { paper: '#fffdf8', ink: '#1d1b16', primary: '#f7c531', voice: 'calm', radius: 10 },\n ocean: { paper: '#f6fafb', ink: '#0d2530', primary: '#0f766e', voice: 'calm', radius: 6 },\n ember: { paper: '#fff8f3', ink: '#2a160c', primary: '#d9480f', voice: 'bold', radius: 2 },\n ink: { paper: '#ffffff', ink: '#111111', primary: '#3b5bdb', voice: 'elegant', radius: 0 },\n})\n\n/** Type for each voice: the device's faces, so a deck needs nothing to download to look right. */\nexport const VOICES = /** @type {Record<string, { heading: string, body: string }>} */ ({\n calm: { heading: 'ui-sans-serif, system-ui, \"Segoe UI\", Roboto, \"Noto Sans\", sans-serif', body: 'ui-sans-serif, system-ui, \"Segoe UI\", Roboto, \"Noto Sans\", sans-serif' },\n elegant: { heading: 'ui-serif, \"Iowan Old Style\", Georgia, \"Noto Serif\", serif', body: 'ui-sans-serif, system-ui, \"Segoe UI\", Roboto, sans-serif' },\n bold: { heading: '\"Avenir Next Condensed\", \"Arial Narrow\", ui-sans-serif, system-ui, sans-serif', body: 'ui-sans-serif, system-ui, \"Segoe UI\", Roboto, sans-serif' },\n friendly: { heading: 'ui-rounded, \"SF Pro Rounded\", \"Nunito\", system-ui, sans-serif', body: 'ui-rounded, \"SF Pro Rounded\", system-ui, sans-serif' },\n})\n\n/**\n * The tokens a deck's settings give, over the project's look and a named one.\n * @param {Record<string, any>} settings @param {Partial<Tokens>} [project]\n * @returns {Tokens}\n */\nexport function tokensOf(settings, project = {}) {\n const named = LOOKS[String(settings.theme ?? '')] ?? LOOKS.default\n const own = typeof settings.themeConfig === 'object' && settings.themeConfig ? settings.themeConfig : {}\n /** @type {Tokens} */\n const tokens = { ...named, ...clean(project), ...clean(own) }\n if (!VOICES[tokens.voice]) tokens.voice = 'calm'\n return tokens\n}\n\n/** @param {Record<string, any>} given @returns {Partial<Tokens>} */\nfunction clean(given) {\n /** @type {Partial<Tokens>} */\n const kept = {}\n for (const key of /** @type {const} */ (['paper', 'ink', 'primary', 'muted', 'soft'])) if (typeof given[key] === 'string' && hex(given[key])) kept[key] = given[key]\n if (given.dark && typeof given.dark === 'object') kept.dark = Object.fromEntries(Object.entries(given.dark).filter(([, v]) => typeof v === 'string' && hex(v)))\n if (given.fonts && Array.isArray(given.fonts.heading) && Array.isArray(given.fonts.body)) kept.fonts = { heading: given.fonts.heading.map(String), body: given.fonts.body.map(String) }\n if (typeof given.voice === 'string') kept.voice = given.voice\n if (typeof given.radius === 'number') kept.radius = given.radius\n return kept\n}\n\n/**\n * Light or dark, worked out from the tokens: dark swaps paper and ink and lifts the primary.\n * @param {Tokens} tokens @param {'light' | 'dark'} scheme @returns {Scheme}\n */\nexport function schemeOf(tokens, scheme) {\n const light = hex(tokens.paper) ?? [255, 253, 248], dark = hex(tokens.ink) ?? [29, 27, 22]\n // A kit's own dark colours where it gives them (a design system's dark mode), else worked out.\n const own = scheme === 'dark' ? tokens.dark ?? {} : {}\n const paper = round(hex(own.paper ?? '') ?? (scheme === 'dark' ? mix(dark, [0, 0, 0], 0.35) : light))\n const ink = round(hex(own.ink ?? '') ?? (scheme === 'dark' ? mix(light, [255, 255, 255], 0.2) : dark))\n const primary = hex(own.primary ?? tokens.primary) ?? [247, 197, 49]\n // The primary as a fill keeps its own colour; as words or marks it is made to read on the paper.\n const text = readable(primary, paper, 4.5)\n const onPrimary = contrast(ink, primary) >= contrast(paper, primary) ? ink : paper\n const series = [0, 1, 2, 3, 4, 5].map((n) => readable(rotate(primary, n * 57), paper, 3))\n return {\n paper: css(paper), ink: css(ink), muted: css(readable(round(hex(own.muted ?? (scheme === 'light' ? tokens.muted ?? '' : '')) ?? mix(ink, paper, 0.38)), paper, 4.5)), line: css(mix(ink, paper, 0.82)),\n primary: css(text), onPrimary: css(onPrimary), soft: css(hex(own.soft ?? (scheme === 'light' ? tokens.soft ?? '' : '')) ?? mix(primary, paper, 0.78)), series: series.map(css),\n }\n}\n\n/** @param {string} value @returns {[number, number, number] | null} */\nexport function hex(value) {\n const m = /^#?([\\da-f]{3}|[\\da-f]{6})$/i.exec(String(value).trim())\n if (!m) return null\n const h = m[1].length === 3 ? [...m[1]].map((c) => c + c).join('') : m[1]\n return /** @type {[number, number, number]} */ ([0, 2, 4].map((i) => parseInt(h.slice(i, i + 2), 16)))\n}\n\n/** @param {number[]} rgb */\nexport const css = (rgb) => `#${rgb.map((c) => Math.round(Math.max(0, Math.min(255, c))).toString(16).padStart(2, '0')).join('')}`\n\n/** A colour as it will be written: whole numbers, so that it reads at the ratio checked. @param {number[]} c */\nconst round = (c) => /** @type {[number, number, number]} */ (c.map((v) => Math.round(Math.max(0, Math.min(255, v)))))\n\n/** @param {number[]} a @param {number[]} b @param {number} t */\nconst mix = (a, b, t) => /** @type {[number, number, number]} */ (a.map((c, i) => c + (b[i] - c) * t))\n\n/** @param {number[]} rgb */\nfunction luminance(rgb) {\n const [r, g, b] = rgb.map((c) => { const s = c / 255; return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4 })\n return 0.2126 * r + 0.7152 * g + 0.0722 * b\n}\n\n/** WCAG's contrast ratio. @param {number[]} a @param {number[]} b */\nexport function contrast(a, b) {\n const [x, y] = [luminance(a), luminance(b)].sort((p, q) => q - p)\n return (x + 0.05) / (y + 0.05)\n}\n\n/**\n * The colour, its hue kept, deepened or lightened toward black or white until it reads at the\n * ratio on the paper. @param {number[]} colour @param {number[]} paper @param {number} ratio\n */\nexport function readable(colour, paper, ratio) {\n const toward = luminance(paper) > 0.18 ? [0, 0, 0] : [255, 255, 255]\n let t = 0, out = round(colour)\n while (contrast(out, paper) < ratio && t < 1) out = round(mix(colour, toward, (t = Math.min(1, t + 0.02))))\n return out\n}\n\n/** The colour turned round the colour wheel. @param {number[]} rgb @param {number} degrees */\nfunction rotate(rgb, degrees) {\n const [r, g, b] = rgb.map((c) => c / 255)\n const max = Math.max(r, g, b), min = Math.min(r, g, b), l = (max + min) / 2\n const d = max - min\n const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1))\n let h = d === 0 ? 0 : max === r ? ((g - b) / d) % 6 : max === g ? (b - r) / d + 2 : (r - g) / d + 4\n h = (h * 60 + degrees + 360) % 360\n const c = (1 - Math.abs(2 * l - 1)) * Math.max(s, 0.55), x = c * (1 - Math.abs(((h / 60) % 2) - 1)), m = l - c / 2\n const [p, q, u] = h < 60 ? [c, x, 0] : h < 120 ? [x, c, 0] : h < 180 ? [0, c, x] : h < 240 ? [0, x, c] : h < 300 ? [x, 0, c] : [c, 0, x]\n return [p + m, q + m, u + m].map((v) => v * 255)\n}\n", "// The deck's own words, for a deck opened on its own; a host gives its own instead (options.strings).\nconst STRINGS = /** @type {Record<string, Record<string, string>>} */ ({\n en: { deck: 'Slides', slide: 'slide', carousel: 'carousel', previous: 'Previous', next: 'Next', present: 'Present full screen', presenter: 'Presenter view', overview: 'All slides', edit: 'Change', scheme: 'Light or dark', export: 'Save as PowerPoint', source: 'The deck as text', notes: 'Notes', noNotes: 'No notes for this slide.', upNext: 'Next', last: 'Last slide', where: 'Slide {n} of {count}', saved: 'Saved' },\n fr: { deck: 'Diapositives', slide: 'diapositive', carousel: 'carrousel', previous: 'Précédente', next: 'Suivante', present: 'Présenter en plein écran', presenter: 'Vue présentateur', overview: 'Toutes les diapositives', edit: 'Modifier', scheme: 'Clair ou sombre', export: 'Enregistrer en PowerPoint', source: 'La présentation en texte', notes: 'Notes', noNotes: 'Pas de notes pour cette diapositive.', upNext: 'Ensuite', last: 'Dernière diapositive', where: 'Diapositive {n} sur {count}', saved: 'Enregistré' },\n ar: { deck: 'الشرائح', slide: 'شريحة', carousel: 'عرض شرائح', previous: 'السابقة', next: 'التالية', present: 'العرض بملء الشاشة', presenter: 'عرض المقدّم', overview: 'كل الشرائح', edit: 'تعديل', scheme: 'فاتح أو داكن', export: 'الحفظ بصيغة PowerPoint', source: 'العرض كنص', notes: 'الملاحظات', noNotes: 'لا ملاحظات لهذه الشريحة.', upNext: 'التالية', last: 'الشريحة الأخيرة', where: 'الشريحة {n} من {count}', saved: 'تم الحفظ' },\n ja: { deck: 'スライド', slide: 'スライド', carousel: 'カルーセル', previous: '前へ', next: '次へ', present: '全画面で発表', presenter: '発表者ビュー', overview: 'すべてのスライド', edit: '編集', scheme: 'ライトまたはダーク', export: 'PowerPoint で保存', source: 'テキストとしてのスライド', notes: 'メモ', noNotes: 'このスライドにメモはありません。', upNext: '次', last: '最後のスライド', where: 'スライド {n} / {count}', saved: '保存しました' },\n})\n\n/** @param {string} lang */\nexport const stringsFor = (lang) => STRINGS[lang.split('-')[0].toLowerCase()] ?? STRINGS.en\n", "// A deck on a page: its slides drawn into the element given, paged with the bar, the keys a\n// presenter's clicker sends, a click or a swipe; each step shown in turn; moved between with the\n// transition its settings name, through the View Transitions API; presented full screen, with\n// the presenter's view (this slide, the next, the notes, the time) and all slides at once; light\n// or dark; changed as Markdown beside the slides, or in place on a slide, live. Host-agnostic:\n// the host gives the drawers of ```echarts and ```mermaid, how a picture's address resolves, its\n// words, how a slide's Markdown is read (its own marked, with its extensions), and what to do when\n// the deck changes or is saved.\nimport { parseDeck } from './parse.js'\nimport { renderSlide, h } from './render.js'\nimport { tokensOf, schemeOf, VOICES } from './look.js'\nimport { mergeKits } from './kit.js'\nimport { stringsFor } from './strings.js'\nimport { Lexer } from 'marked'\n\n/** @typedef {import('./parse.js').Deck} Deck */\n/**\n * @typedef {{\n * source: string, lang?: string, dir?: string, kit?: Record<string, any>, scheme?: 'light' | 'dark' | 'auto',\n * blocks?: Record<string, import('./render.js').Drawer>, resolve?: (src: string) => string | null,\n * strings?: Record<string, string>, headings?: 'real' | 'aria', editable?: boolean, lex?: (markdown: string) => any[],\n * onChange?: (source: string) => void, onSave?: (source: string) => void, onExport?: (deck: DeckView) => void,\n * }} Options\n */\n\nconst RTL = /^(ar|he|fa|ur|ps|sd|ug|yi|dv|ckb)\\b/i\nconst ICONS = {\n back: 'M15 5l-7 7 7 7', next: 'M9 5l7 7-7 7', present: 'M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5',\n presenter: 'M3 5h12v9H3zM18 8h3M18 12h3M6 19h6', grid: 'M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4zM14 14h6v6h-6z',\n edit: 'M4 20h4L19 9l-4-4L4 16zM13.5 6.5l4 4', scheme: 'M12 3a9 9 0 1 0 9 9 7 7 0 0 1-9-9z', export: 'M12 4v11M7 10l5 5 5-5M5 20h14',\n}\n\n/** @param {string} name */\nfunction icon(name) {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('viewBox', '0 0 24 24')\n svg.setAttribute('aria-hidden', 'true')\n if (name === 'back' || name === 'next') svg.setAttribute('class', 'deck-flip')\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n path.setAttribute('d', ICONS[/** @type {keyof typeof ICONS} */ (name)])\n svg.append(path)\n return svg\n}\n\n/** @typedef {ReturnType<typeof createDeck>} DeckView */\n\n/** @param {HTMLElement} root @param {Options} options */\nexport function createDeck(root, options) {\n let source = options.source.replace(/\\r\\n?/g, '\\n')\n let deck = parseDeck(source)\n let at = 0, stepAt = 0\n /** @type {{ element: HTMLElement, steps: number }[]} */\n let drawn = []\n const lang = String(options.lang ?? deck.settings.lang ?? document.documentElement.lang ?? 'en') || 'en'\n const dir = String(options.dir ?? deck.settings.dir ?? (RTL.test(lang) ? 'rtl' : 'ltr'))\n const words = { ...stringsFor(lang), ...options.strings }\n const number = new Intl.NumberFormat(lang).format\n const dark = matchMedia('(prefers-color-scheme: dark)')\n let scheme = /** @type {'light' | 'dark'} */ ('light')\n const started = Date.now()\n\n root.classList.add('deck')\n root.lang = lang\n root.dir = dir\n const stage = h('div', { class: 'deck-stage', tabindex: 0, role: 'region', 'aria-roledescription': words.carousel, 'aria-label': words.deck })\n const where = h('span', { class: 'deck-where', 'aria-live': 'polite' })\n const button = (/** @type {string} */ name, /** @type {string} */ label, /** @type {() => void} */ act) => {\n const b = h('button', { type: 'button', 'aria-label': label, 'data-act': name }, [icon(name)])\n b.addEventListener('click', act)\n return b\n }\n const back = button('back', words.previous, () => move(-1))\n const next = button('next', words.next, () => move(1))\n const editButton = button('edit', words.edit, () => toggle('is-editing'))\n const presenterButton = button('presenter', words.presenter, () => toggle('is-presenting'))\n const overviewButton = button('grid', words.overview, () => toggle('is-overview'))\n const bar = h('div', { class: 'deck-bar' }, [back, where, next, h('span', { class: 'deck-gap' }),\n overviewButton, presenterButton, options.editable === false ? null : editButton,\n button('scheme', words.scheme, () => { scheme = scheme === 'dark' ? 'light' : 'dark'; paintLook() }),\n options.onExport ? button('export', words.export, () => options.onExport?.(view)) : null,\n document.fullscreenEnabled ? button('present', words.present, () => present()) : null])\n const sourceBox = /** @type {HTMLTextAreaElement} */ (h('textarea', { class: 'deck-source', spellcheck: 'false', 'aria-label': words.source, dir: 'auto' }))\n const nextBox = h('div', { class: 'deck-next' })\n const notes = h('div', { class: 'deck-notes', dir: 'auto', 'aria-label': words.notes })\n const clock = h('span', { class: 'deck-clock' })\n const presenter = h('div', { class: 'deck-presenter' }, [nextBox, notes])\n root.replaceChildren(sourceBox, stage, presenter, bar)\n bar.insertBefore(clock, bar.querySelector('.deck-gap'))\n\n // The kit: deck's own, under the host's (an organisation's, a project's), under the file's own.\n let kitProblems = /** @type {string[]} */ ([])\n const kitOf = () => {\n const merged = mergeKits(options.kit, deck.settings.kit)\n kitProblems = merged.problems\n return merged.kit\n }\n\n function paintLook() {\n context.kit = kitOf()\n const tokens = tokensOf(deck.settings, context.kit.tokens)\n const colours = schemeOf(tokens, scheme)\n const stack = (/** @type {string[]} */ faces) => faces.map((f) => (/^[\\w-]+$/.test(f) ? f : `\"${f.replace(/[\"\\\\]/g, '')}\"`)).join(', ')\n const voice = tokens.fonts ? { heading: stack(tokens.fonts.heading), body: stack(tokens.fonts.body) } : VOICES[tokens.voice]\n for (const [name, value] of Object.entries({\n paper: colours.paper, ink: colours.ink, muted: colours.muted, line: colours.line, primary: colours.primary,\n fill: tokens.primary, 'on-fill': colours.onPrimary, soft: colours.soft, heading: voice.heading, body: voice.body, radius: `${tokens.radius}px`,\n ...Object.fromEntries(colours.series.map((colour, n) => [`series-${n + 1}`, colour])),\n })) root.style.setProperty(`--deck-${name}`, value)\n root.dataset.scheme = scheme\n root.dispatchEvent(new CustomEvent('deck-scheme', { detail: { scheme, colours, tokens } }))\n }\n const chooseScheme = () => {\n const asked = options.scheme ?? deck.settings.colorSchema ?? 'auto'\n scheme = asked === 'dark' || (asked === 'auto' && dark.matches) ? 'dark' : 'light'\n }\n\n /** @type {import('./render.js').Context} */\n const context = {\n blocks: options.blocks ?? {}, resolve: options.resolve ?? ((src) => src), headings: options.headings ?? 'real', number: (n) => number(n), total: 0, kit: mergeKits().kit,\n lex: options.lex ?? ((markdown) => new Lexer({ gfm: true }).lex(markdown)), slide: words.slide,\n }\n\n function draw() {\n context.total = deck.slides.length\n drawn = deck.slides.map((slide) => renderSlide(slide, context))\n for (const [i, { element }] of drawn.entries()) {\n element.setAttribute('aria-label', words.where.replace('{n}', number(i + 1)).replace('{count}', number(drawn.length)))\n element.addEventListener('click', () => { if (root.classList.contains('is-overview')) { toggle('is-overview'); go(i, 0) } })\n }\n stage.replaceChildren(...drawn.map(({ element }) => element))\n at = Math.min(at, drawn.length - 1)\n show()\n requestAnimationFrame(() => fitAll())\n }\n\n /** Each slot's type shrunk, down to six tenths, until it holds what it says; a slide still over is marked. */\n function fitAll() {\n for (const { element } of drawn) fit(element)\n }\n /** @param {HTMLElement} slide */\n function fit(slide) {\n let over = false\n for (const slot of /** @type {NodeListOf<HTMLElement>} */ (slide.querySelectorAll('.deck-slot'))) {\n let scale = 1\n slot.style.setProperty('--deck-fit', '1')\n while (slot.scrollHeight > slot.clientHeight + 1 && scale > 0.6) slot.style.setProperty('--deck-fit', String((scale = Math.round((scale - 0.05) * 100) / 100)))\n if (slot.scrollHeight > slot.clientHeight + 1) over = true\n }\n if (over) slide.dataset.overflow = 'true'\n else delete slide.dataset.overflow\n }\n\n function show() {\n for (const [i, { element, steps }] of drawn.entries()) {\n element.classList.toggle('is-shown', i === at)\n element.inert = i !== at && !root.classList.contains('is-overview')\n for (const one of element.querySelectorAll('.deck-step')) one.classList.toggle('is-on', i < at || (i === at && Number(one.getAttribute('data-step')) <= stepAt) || steps === 0)\n }\n where.textContent = `${number(at + 1)} / ${number(drawn.length)}`\n back.toggleAttribute('disabled', at === 0 && stepAt === 0)\n next.toggleAttribute('disabled', at >= drawn.length - 1 && stepAt >= (drawn[at]?.steps ?? 0))\n notes.textContent = deck.slides[at]?.notes || words.noNotes\n const following = deck.slides[at + 1]\n nextBox.replaceChildren(h('span', {}, [following ? words.upNext : words.last]), ...(following ? [renderSlide(following, context).element] : []))\n root.dispatchEvent(new CustomEvent('deck-move', { detail: { at, step: stepAt } }))\n }\n\n /** A click on, or the next key: the next step, else the next slide. @param {number} by */\n function move(by) {\n const steps = drawn[at]?.steps ?? 0\n if (by > 0 && stepAt < steps) { stepAt++; show(); return }\n if (by < 0 && stepAt > 0) { stepAt--; show(); return }\n const to = at + by\n if (to < 0 || to >= drawn.length) return\n go(to, by > 0 ? 0 : drawn[to].steps)\n }\n\n /** @param {number} to @param {number} [toStep] */\n function go(to, toStep = 0) {\n if (to === at) { stepAt = toStep; show(); return }\n const forward = to > at\n const settings = deck.slides[forward ? to : at]?.settings ?? {}\n const named = String(settings.transition ?? deck.settings.transition ?? 'none')\n // Slidev's `a | b`: one going forward, the other going back.\n const [ahead, behind] = named.split('|').map((part) => part.trim())\n let kind = forward ? ahead : behind ?? ahead\n if (dir === 'rtl') kind = kind.replace(/-(left|right)$/, (_, side) => (side === 'left' ? '-right' : '-left'))\n if (kind === 'view-transition') kind = 'morph'\n const update = () => { at = to; stepAt = toStep; if (kind === 'morph') name(drawn[to].element); show() }\n const reduced = matchMedia('(prefers-reduced-motion: reduce)').matches\n if (!document.startViewTransition || kind === 'none' || reduced || root.classList.contains('is-overview')) return update()\n if (kind === 'morph') name(drawn[at].element, drawn[to].element)\n document.documentElement.dataset.deckTransition = kind\n const transition = document.startViewTransition(update)\n // A transition skipped by the next one, as a clicker pressed twice does, is no error.\n transition.ready.catch(() => {})\n transition.finished.finally(() => {\n delete document.documentElement.dataset.deckTransition\n for (const { element } of drawn) for (const one of element.querySelectorAll('[data-morph]')) { /** @type {HTMLElement} */ (one).style.removeProperty('view-transition-name'); one.removeAttribute('data-morph') }\n })\n }\n\n /**\n * Morph, as Keynote's Magic Move and PowerPoint's Morph do it, with nothing to write: what two\n * slides share (a heading's words, a list item's, a picture, a chart) gets one name on each,\n * so the browser moves it from where it was to where it goes. Called with the slide shown and\n * the next, then with the next alone once it shows. @param {HTMLElement} slide @param {HTMLElement} [toward]\n */\n function name(slide, toward) {\n const key = (/** @type {Element} */ el) => `${el.tagName}:${el.tagName === 'IMG' ? el.getAttribute('src') : (el.textContent ?? '').trim().slice(0, 80)}`\n const parts = (/** @type {HTMLElement} */ s) => /** @type {HTMLElement[]} */ ([...s.querySelectorAll('h1, h2, h3, h4, .deck-h, li, p, img, .deck-block, blockquote, .deck-image')])\n if (toward) {\n const there = new Map(parts(toward).map((el) => [key(el), el]))\n let n = 0\n for (const el of parts(slide)) {\n const match = there.get(key(el))\n if (!match || match.dataset.morph || el.closest('[data-morph]')) continue\n const id = `deck-m${n++}`\n el.dataset.morph = match.dataset.morph = id\n el.style.setProperty('view-transition-name', id)\n }\n return\n }\n for (const el of /** @type {NodeListOf<HTMLElement>} */ (slide.querySelectorAll('[data-morph]'))) {\n const id = /** @type {string} */ (el.dataset.morph)\n for (const old of /** @type {NodeListOf<HTMLElement>} */ (stage.querySelectorAll(`[data-morph=\"${id}\"]`))) if (old !== el) old.style.removeProperty('view-transition-name')\n el.style.setProperty('view-transition-name', id)\n }\n }\n\n /** @param {string} mode */\n function toggle(mode) {\n for (const other of ['is-editing', 'is-presenting', 'is-overview']) if (other !== mode) root.classList.remove(other)\n root.classList.toggle(mode)\n editButton.setAttribute('aria-pressed', String(root.classList.contains('is-editing')))\n presenterButton.setAttribute('aria-pressed', String(root.classList.contains('is-presenting')))\n overviewButton.setAttribute('aria-pressed', String(root.classList.contains('is-overview')))\n if (root.classList.contains('is-editing')) { sourceBox.value = source; sourceBox.focus() }\n show()\n requestAnimationFrame(() => fitAll())\n }\n\n function present() {\n stage.requestFullscreen?.().then(() => stage.focus(), () => {})\n }\n\n /** The source changed, by the Markdown or on a slide: read again, drawn again, where the user is. @param {string} text */\n function setSource(text) {\n source = text.replace(/\\r\\n?/g, '\\n')\n deck = parseDeck(source)\n paintLook()\n draw()\n options.onChange?.(source)\n }\n\n // Changed as Markdown: drawn again as the user types, the slide under the caret shown.\n let pending = 0\n sourceBox.addEventListener('input', (event) => {\n if (/** @type {InputEvent} */ (event).isComposing) return\n clearTimeout(pending)\n pending = setTimeout(() => setSource(sourceBox.value), 120)\n })\n const followCaret = () => {\n const caret = sourceBox.selectionStart\n const found = deck.slides.findIndex((slide) => caret >= slide.start && caret <= slide.end + 1)\n if (found >= 0 && found !== at) { at = found; stepAt = drawn[found]?.steps ?? 0; show() }\n }\n sourceBox.addEventListener('keyup', followCaret)\n sourceBox.addEventListener('click', followCaret)\n\n // Changed in place: a double click on words makes them editable; Enter or leaving keeps them.\n stage.addEventListener('dblclick', (event) => {\n if (options.editable === false || document.fullscreenElement) return\n const target = /** @type {HTMLElement | null} */ (/** @type {Element} */ (event.target).closest('[data-edit]'))\n if (!target) return\n const [from, to] = /** @type {string} */ (target.dataset.edit).split('-').map(Number)\n target.contentEditable = 'true'\n target.focus()\n const done = (/** @type {boolean} */ keep) => {\n target.removeEventListener('keydown', key)\n target.removeEventListener('blur', blur)\n target.contentEditable = 'false'\n const words = markdownOf(target)\n if (keep && words !== source.slice(from, to)) setSource(source.slice(0, from) + words + source.slice(to))\n else draw()\n }\n const key = (/** @type {KeyboardEvent} */ e) => {\n if (e.isComposing) return\n if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); done(true) }\n if (e.key === 'Escape') { e.preventDefault(); done(false) }\n }\n const blur = () => done(true)\n target.addEventListener('keydown', key)\n target.addEventListener('blur', blur)\n })\n\n // The keys a clicker sends, and the deck's own.\n root.addEventListener('keydown', (event) => {\n const target = /** @type {HTMLElement} */ (event.target)\n if (target.isContentEditable || target === sourceBox || (target.tagName === 'BUTTON' && (event.key === ' ' || event.key === 'Enter'))) {\n if ((event.metaKey || event.ctrlKey) && event.key === 's') { event.preventDefault(); options.onSave?.(source) }\n return\n }\n const forward = dir === 'rtl' ? 'ArrowLeft' : 'ArrowRight', backward = dir === 'rtl' ? 'ArrowRight' : 'ArrowLeft'\n if (event.altKey || event.ctrlKey || event.metaKey) {\n if ((event.metaKey || event.ctrlKey) && event.key === 's') { event.preventDefault(); options.onSave?.(source) }\n return\n }\n const acts = /** @type {Record<string, () => void>} */ ({\n [forward]: () => move(1), [backward]: () => move(-1), ArrowDown: () => move(1), ArrowUp: () => move(-1), PageDown: () => move(1), PageUp: () => move(-1), ' ': () => move(1),\n Home: () => go(0), End: () => go(drawn.length - 1, drawn.at(-1)?.steps ?? 0), f: present, p: () => toggle('is-presenting'), o: () => toggle('is-overview'), e: () => toggle('is-editing'),\n })\n const act = acts[event.key]\n if (!act) return\n event.preventDefault()\n act()\n })\n stage.addEventListener('click', (event) => {\n if (document.fullscreenElement && !(/** @type {Element} */ (event.target).closest('a, button, input'))) move(1)\n })\n let touch = 0\n stage.addEventListener('touchstart', (event) => { touch = event.touches[0].clientX }, { passive: true })\n stage.addEventListener('touchend', (event) => {\n const dx = event.changedTouches[0].clientX - touch\n if (Math.abs(dx) > 50) move((dx < 0) === (dir !== 'rtl') ? 1 : -1)\n })\n dark.addEventListener('change', () => { chooseScheme(); paintLook() })\n const tick = setInterval(() => {\n const s = Math.floor((Date.now() - started) / 1000)\n clock.textContent = root.classList.contains('is-presenting') ? `${String(Math.floor(s / 60)).padStart(2, '0')}:${String(s % 60).padStart(2, '0')}` : ''\n }, 1000)\n\n chooseScheme()\n paintLook()\n draw()\n document.fonts?.ready.then(() => fitAll())\n\n const view = {\n root, stage, get source() { return source }, get deck() { return deck }, get at() { return at }, get scheme() { return scheme }, get kit() { return context.kit }, get kitProblems() { return kitProblems }, lang, dir,\n slides: () => drawn.map(({ element }) => element), setSource, go, toggle, present, fitAll,\n setScheme: (/** @type {'light' | 'dark'} */ value) => { scheme = value; paintLook() },\n destroy: () => clearInterval(tick),\n }\n return view\n}\n\n/** The Markdown of words changed in place: bold, italics, code and links kept as Markdown writes them. @param {Node} node @returns {string} */\nexport function markdownOf(node) {\n let out = ''\n for (const child of node.childNodes) {\n if (child.nodeType === Node.TEXT_NODE) out += (child.textContent ?? '').replace(/([*_`[\\]\\\\])/g, '\\\\$1')\n else if (child instanceof HTMLElement) {\n const inner = markdownOf(child)\n out += ({ STRONG: `**${inner}**`, B: `**${inner}**`, EM: `*${inner}*`, I: `*${inner}*`, CODE: `\\`${child.textContent}\\``, DEL: `~~${inner}~~`, BR: ' \\n',\n A: `[${inner}](${child.getAttribute('href') ?? ''})` })[child.tagName] ?? inner\n }\n }\n return out.replace(/ /g, ' ').replace(/\\n+$/, '')\n}\n", "// deck's version, which a linked file names in its renderer's address. Kept equal to package.json's by a test.\nexport const VERSION = '0.1.1'\n", "// A deck file, `.deck.html`: a web page any browser opens, whose Markdown sits whole in one\n// element, <script type=\"text/markdown\" id=\"deck\">, which no browser runs. Read and written here\n// as text, never parsed as HTML, so a host can read a deck without running anything in it.\n// The one escape: `<script` and `</script`, in any case, gain a backslash after their `<` (and\n// one more for each already there), which reading takes away again: the HTML parser ends the\n// element at `</script`, and a `<script` after `<!--` would keep it from ending. Pure.\n\nimport { VERSION } from './version.js'\n\nexport const OPEN = '<script type=\"text/markdown\" id=\"deck\">'\nconst CLOSE = '</script>'\n\n/** @param {string} markdown */\nexport const escape = (markdown) => markdown.replace(/<(\\\\*)(\\/?script)/gi, '<\\\\$1$2')\n/** @param {string} text */\nexport const unescape = (text) => text.replace(/<\\\\(\\\\*)(\\/?script)/gi, '<$1$2')\n\n/** @param {string} text */\nconst attribute = (text) => text.replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;')\n/** @param {string} text */\nconst content = (text) => text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n\n/**\n * Code held whole in the file: `</script`, `<script` and `<!--`, which only a string or a regular\n * expression of a bundle holds, written with `\\x3C` for their `<`, which reads the same there.\n * @param {string} code\n */\nexport function inlineCode(code) {\n if (/\\\\<(!--|\\/?script)/i.test(code)) throw new Error('This code cannot be held in a page as it is.')\n return code.replace(/<(!--|\\/?script)/gi, '\\\\x3C$1')\n}\n\n/**\n * A deck's Markdown, from a file's text, or null when it holds none.\n * @param {string} html @returns {string | null}\n */\nexport function readDeckFile(html) {\n const at = html.indexOf(OPEN)\n if (at < 0) return null\n const from = at + OPEN.length\n const end = html.slice(from).search(/<\\/script/i)\n if (end < 0) return null\n return unescape(html.slice(from, from + end).replace(/^\\n/, '').replace(/\\n$/, ''))\n}\n\n/** Where a linked file finds its renderer: this version of the package, on jsDelivr's npm mirror. @param {string} [version] */\nexport const rendererUrl = (version = VERSION) => `https://cdn.jsdelivr.net/npm/@codename/deck@${version}/dist/deck.js`\n\n/**\n * A deck file around its Markdown: its title, language and direction in the page's head for\n * whatever reads it before the renderer does, then the Markdown, in the body (the head is never shown), readable as it is when no\n * renderer comes, then the renderer: linked by default, to this version's address, or held whole;\n * `base` tells it where to load the libraries a slide needs (a CDN's npm mirror, or a node_modules).\n * @param {string} markdown\n * @param {{ title?: string, lang?: string, dir?: string, renderer?: { src: string } | { code: string }, base?: string, generator?: string }} [options]\n */\nexport function writeDeckFile(markdown, { title = '', lang = 'en', dir = 'auto', renderer = { src: rendererUrl() }, base, generator = `deck ${VERSION}` } = {}) {\n const data = base ? ` data-base=\"${attribute(base)}\"` : ''\n const script = 'src' in renderer ? `<script src=\"${attribute(renderer.src)}\"${data}></script>` : `<script${data}>${inlineCode(renderer.code)}</script>`\n return /* html */ `<!doctype html>\n<html lang=\"${attribute(lang)}\" dir=\"${attribute(dir)}\">\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<meta name=\"generator\" content=\"${attribute(generator)}\">\n<title>${content(title)}</title>\n<style>#deck{display:block;white-space:pre-wrap;overflow-wrap:anywhere;font:1rem/1.6 ui-monospace,Menlo,Consolas,monospace;max-width:72ch;margin:2rem auto;padding:0 1rem}</style>\n<body>\n${OPEN}\n${escape(markdown)}\n${CLOSE}\n${script}\n</html>\n`\n}\n", "// A deck as a PowerPoint file to change in PowerPoint, Keynote or Google Slides: each layout a\n// slide layout of its own (a master, in PptxGenJS's words) with a placeholder for its title and\n// each of its slots, so a slide added there looks like the deck's; words as PowerPoint's own text,\n// a list's levels as its levels; a table as a table; a chart of bars, lines, areas, pies, rings,\n// points or a radar as PowerPoint's own chart, its numbers in the file to change; anything else (a\n// diagram, another chart, a picture) as a picture; the speaker's notes as notes; each slide's\n// transition as PowerPoint's (Morph where it has one, a fade where it hasn't); the look's colours\n// as the file's theme. Read from the deck as drawn, each box where the browser put it, so the file\n// looks like the slides, in the scheme shown. PptxGenJS (with its JSZip) is the host's to load.\n\nimport { labelOf } from './kit.js'\n\nconst W = 13.333, H = 7.5\nconst TEXT = 'h1, h2, h3, h4, h5, h6, .deck-h, p, ul, ol, blockquote'\n\n/** @param {string} value rgb(…) or #… @returns {string} six hex digits */\nfunction hexOf(value) {\n const m = /rgba?\\(\\s*([\\d.]+)[,\\s]+([\\d.]+)[,\\s]+([\\d.]+)/.exec(value)\n if (m) return [m[1], m[2], m[3]].map((n) => Math.round(Number(n)).toString(16).padStart(2, '0')).join('').toUpperCase()\n return value.replace('#', '').toUpperCase().slice(0, 6) || '000000'\n}\n/** @param {string} value */\nconst opaque = (value) => !/rgba\\([^)]*,\\s*0\\)|transparent/.test(value)\n\n/**\n * @param {import('./deck.js').DeckView} view\n * @param {{ PptxGenJS: any, JSZip: any }} libraries\n * @returns {Promise<{ blob: Blob, report: { slides: number, charts: number, pictures: number, tables: number, placeholders: number } }>}\n */\nexport async function toPptx(view, { PptxGenJS, JSZip }) {\n const pres = new PptxGenJS()\n pres.layout = 'LAYOUT_WIDE'\n pres.title = view.deck.slides[0]?.title ?? ''\n pres.rtlMode = view.dir === 'rtl'\n const rootStyle = getComputedStyle(view.root)\n const firstFont = (/** @type {string} */ stack) => stack.split(',').map((f) => f.trim().replace(/^[\"']|[\"']$/g, '')).find((f) => !/^(ui-|system-ui|-apple|sans-serif|serif|monospace)/.test(f)) ?? 'Arial'\n pres.theme = { headFontFace: firstFont(rootStyle.getPropertyValue('--deck-heading')), bodyFontFace: firstFont(rootStyle.getPropertyValue('--deck-body')) }\n const report = { slides: 0, charts: 0, pictures: 0, tables: 0, placeholders: 0 }\n const rtl = view.dir === 'rtl'\n const slides = view.slides()\n const masters = new Map()\n const transitions = []\n\n for (const [i, element] of slides.entries()) {\n const box = element.getBoundingClientRect()\n const sx = W / box.width\n const place = (/** @type {Element} */ el) => {\n const r = el.getBoundingClientRect()\n return { x: (r.left - box.left) * sx, y: (r.top - box.top) * sx, w: r.width * sx, h: r.height * sx }\n }\n // Words as wide as their slot, never as their line: PowerPoint sets type a little wider than a browser.\n const across = (/** @type {Element} */ el) => {\n const slot = el.closest('.deck-slot') ?? el\n const { x, w } = place(slot), { y, h } = place(el)\n const pad = getComputedStyle(slot)\n const start = parseFloat(pad.paddingInlineStart) * sx, end = parseFloat(pad.paddingInlineEnd) * sx\n return { x: x + (rtl ? end : start), y, w: w - start - end, h: h * 1.08 }\n }\n // Where a layout centres its words, PowerPoint's box centres them too.\n const anchor = (/** @type {Element} */ slot) => (getComputedStyle(slot).justifyContent === 'center' ? 'middle' : 'top')\n const pt = (/** @type {number} */ px) => Math.round(px * sx * 72 * 10) / 10\n const style = getComputedStyle(element)\n const layout = element.dataset.layout ?? 'default'\n const slots = /** @type {HTMLElement[]} */ ([...element.querySelectorAll('.deck-slot')])\n const firstBlock = slots[0]?.firstElementChild\n const title = firstBlock && firstBlock.matches('h1, h2, h3, .deck-h') ? firstBlock : null\n\n // One master a layout, its placeholders where the first slide of it has its title and slots.\n // Named as the kit names the layout, in the deck's language, so PowerPoint's Layout menu reads it.\n const definition = view.kit.layouts[layout]\n const masterName = `${definition ? labelOf(definition, layout, view.lang) : layout}${element.classList.contains('deck-class-invert') ? ' (dark)' : ''}`\n if (!masters.has(masterName)) {\n const objects = []\n if (title) objects.push({ placeholder: { options: { name: 'title', type: 'title', ...across(title), valign: 'bottom', margin: 0, fontFace: pres.theme.headFontFace, color: hexOf(getComputedStyle(title).color), align: rtl ? 'right' : 'left' }, text: '' } })\n for (const slot of slots) {\n const r = place(slot)\n const top = title && slot === slots[0] ? place(title).y + place(title).h : r.y\n const inner = slot.firstElementChild && slot.firstElementChild !== title ? across(slot.firstElementChild) : { x: r.x, w: r.w }\n objects.push({ placeholder: { options: { name: `body-${slot.dataset.slot}`, type: 'body', x: inner.x, y: top + 0.08, w: inner.w, h: Math.max(0.3, r.y + r.h - top - 0.08), margin: 0, valign: anchor(slot), color: hexOf(getComputedStyle(slot).color) }, text: '' } })\n }\n pres.defineSlideMaster({\n title: masterName, background: { color: hexOf(style.backgroundColor) }, objects,\n slideNumber: definition?.numbered !== false ? { x: rtl ? 0.3 : W - 0.9, y: H - 0.55, w: 0.6, h: 0.3, fontSize: 10, color: hexOf(rootStyle.getPropertyValue('--deck-muted').trim() || '#666666') } : undefined,\n })\n masters.set(masterName, new Set(objects.map((o) => o.placeholder.options.name)))\n }\n const names = masters.get(masterName)\n const slide = pres.addSlide({ masterName })\n report.slides++\n\n const background = element.querySelector('.deck-image')\n if (background) {\n const url = /url\\(\"?(.*?)\"?\\)/.exec(getComputedStyle(background).backgroundImage)?.[1]\n const data = url && await pictureOf(url, background.clientWidth * 2, background.clientHeight * 2, true)\n if (data) { slide.addImage({ data, ...place(background) }); report.pictures++ }\n }\n if (title && names.has('title')) {\n slide.addText(runs(title, { pt, rtl, lang: view.lang }), { placeholder: 'title' })\n report.placeholders++\n }\n for (const slot of slots) {\n const blocks = [...slot.children].filter((child) => child !== title)\n const textOnly = blocks.length > 0 && blocks.every((child) => child.matches(TEXT))\n if (textOnly && names.has(`body-${slot.dataset.slot}`)) {\n slide.addText(blocks.flatMap((block) => runs(block, { pt, rtl, lang: view.lang })), { placeholder: `body-${slot.dataset.slot}`, valign: anchor(slot), ...(spaced(slot)) })\n report.placeholders++\n continue\n }\n for (const block of blocks) {\n const at = place(block)\n if (block.matches(TEXT)) slide.addText(runs(block, { pt, rtl, lang: view.lang }), { ...across(block), valign: 'top', margin: 0, ...(spaced(slot)) })\n else if (block.matches('pre')) {\n slide.addText(block.textContent?.replace(/\\n$/, '') ?? '', { ...at, fontFace: 'Consolas', fontSize: pt(parseFloat(getComputedStyle(block).fontSize)), color: hexOf(getComputedStyle(block).color), fill: { color: hexOf(getComputedStyle(block).backgroundColor) }, valign: 'top', margin: 6, rtlMode: false, align: 'left' })\n } else if (block.matches('.deck-table')) {\n table(slide, block, at, { pt, rtl, lang: view.lang })\n report.tables++\n } else if (block.matches('.deck-echarts') && /** @type {any} */ (block).chart) {\n const chart = /** @type {any} */ (block).chart\n if (nativeChart(pres, slide, chart, at, { pt, rtl, lang: view.lang, ink: hexOf(style.color) })) report.charts++\n else { slide.addImage({ data: await pictureOf(`data:image/svg+xml;charset=utf-8,${encodeURIComponent(chart.renderToSVGString())}`, at.w / sx * 2, at.h / sx * 2), ...at }); report.pictures++ }\n } else {\n const img = block.querySelector('img')\n if (img) {\n const data = await pictureOf(img.src, img.clientWidth * 2, img.clientHeight * 2)\n if (data) { slide.addImage({ data, ...place(img), altText: img.alt }); report.pictures++ }\n }\n }\n }\n }\n const notes = view.deck.slides[i]?.notes\n if (notes) slide.addNotes(notes)\n const settings = view.deck.slides[i]?.settings ?? {}\n transitions.push(String(settings.transition ?? view.deck.settings.transition ?? 'none').split('|')[0].trim())\n }\n\n // What PptxGenJS doesn't write: each slide's transition, and the look's colours as the theme.\n const zip = await JSZip.loadAsync(await pres.write({ outputType: 'arraybuffer', compression: true }))\n for (const [i, kind] of transitions.entries()) {\n const path = `ppt/slides/slide${i + 1}.xml`\n const xml = await zip.file(path)?.async('string')\n if (!xml || kind === 'none') continue\n zip.file(path, xml.replace(/<\\/p:clrMapOvr>|(?=<p:timing|<\\/p:sld>)/, (/** @type {string} */ found) => `${found}${transitionXml(kind, rtl)}`))\n }\n const theme = await zip.file('ppt/theme/theme1.xml')?.async('string')\n if (theme) {\n const colour = (/** @type {string} */ name) => hexOf(rootStyle.getPropertyValue(`--deck-${name}`).trim())\n const series = [colour('fill'), ...[2, 3, 4, 5, 6].map((n) => colour(`series-${n}`))]\n const scheme = `<a:clrScheme name=\"Deck\"><a:dk1><a:srgbClr val=\"${colour('ink')}\"/></a:dk1><a:lt1><a:srgbClr val=\"${colour('paper')}\"/></a:lt1><a:dk2><a:srgbClr val=\"${colour('ink')}\"/></a:dk2><a:lt2><a:srgbClr val=\"${colour('soft')}\"/></a:lt2>${series.map((c, n) => `<a:accent${n + 1}><a:srgbClr val=\"${c}\"/></a:accent${n + 1}>`).join('')}<a:hlink><a:srgbClr val=\"${colour('primary')}\"/></a:hlink><a:folHlink><a:srgbClr val=\"${colour('primary')}\"/></a:folHlink></a:clrScheme>`\n zip.file('ppt/theme/theme1.xml', theme.replace(/<a:clrScheme[\\s\\S]*?<\\/a:clrScheme>/, scheme))\n }\n const blob = await zip.generateAsync({ type: 'blob', compression: 'DEFLATE', mimeType: 'application/vnd.openxmlformats-officedocument.presentationml.presentation' })\n return { blob, report }\n}\n\n/** A slot's paragraphs' spacing, from the space under its first block. @param {HTMLElement} slot */\nfunction spaced(slot) {\n const first = slot.firstElementChild\n const after = first ? parseFloat(getComputedStyle(first).marginBlockEnd) : 0\n return { paraSpaceAfter: Math.round(after * 0.5) }\n}\n\n/**\n * A block's words as PowerPoint's runs: each paragraph or list item ends its line; bold, italics,\n * code and links kept; a list's level as its indent level.\n * @param {Element} block @param {{ pt: (px: number) => number, rtl: boolean, lang: string }} how @returns {any[]}\n */\nfunction runs(block, how) {\n /** @type {any[]} */\n const out = []\n const paragraph = (/** @type {Element} */ el, /** @type {Record<string, any>} */ extra) => {\n const style = getComputedStyle(el)\n const base = { fontSize: how.pt(parseFloat(style.fontSize)), color: hexOf(style.color), bold: Number(style.fontWeight) >= 600, lang: how.lang, rtlMode: how.rtl, align: style.textAlign === 'center' ? 'center' : how.rtl ? 'right' : 'left', ...extra }\n const pieces = inlineRuns(el, base)\n if (!pieces.length) return\n pieces[pieces.length - 1].options.breakLine = true\n out.push(...pieces)\n }\n const list = (/** @type {Element} */ el, /** @type {number} */ level) => {\n let n = 0\n for (const li of el.children) {\n n++\n const nested = [...li.children].filter((c) => c.matches('ul, ol'))\n const clone = /** @type {Element} */ (li.cloneNode(true))\n for (const c of [...clone.children]) if (c.matches('ul, ol, input')) c.remove()\n li.after(clone)\n paragraph(clone, { bullet: el.tagName === 'OL' ? { type: 'number', startAt: n === 1 ? Number(el.getAttribute('start') ?? 1) : undefined } : true, indentLevel: level })\n clone.remove()\n for (const sub of nested) list(sub, level + 1)\n }\n }\n if (block.matches('ul, ol')) list(block, 0)\n else if (block.matches('blockquote')) for (const p of block.children) paragraph(p, { italic: getComputedStyle(p).fontStyle === 'italic' })\n else paragraph(block, {})\n return out\n}\n\n/** @param {Node} node @param {Record<string, any>} base @returns {any[]} */\nfunction inlineRuns(node, base) {\n /** @type {any[]} */\n const out = []\n const walk = (/** @type {Node} */ n, /** @type {Record<string, any>} */ options) => {\n if (n.nodeType === Node.TEXT_NODE) {\n const text = (n.textContent ?? '').replace(/\\s+/g, ' ')\n if (text) out.push({ text, options: { ...options } })\n return\n }\n if (!(n instanceof HTMLElement)) return\n if (n.tagName === 'BR') { if (out.length) out[out.length - 1].options.breakLine = true; return }\n const own = { ...options }\n if (n.matches('strong, b')) { own.bold = true; own.color = hexOf(getComputedStyle(n).color) }\n if (n.matches('em, i')) own.italic = true\n if (n.matches('del, s')) own.strike = 'sngStrike'\n if (n.matches('code')) own.fontFace = 'Consolas'\n if (n.matches('a[href]')) own.hyperlink = { url: n.getAttribute('href') }\n for (const child of n.childNodes) walk(child, own)\n }\n for (const child of node.childNodes) walk(child, base)\n if (out.length) { out[0].text = out[0].text.trimStart(); out[out.length - 1].text = out[out.length - 1].text.trimEnd() }\n return out.filter((run) => run.text)\n}\n\n/** @param {any} slide @param {Element} block @param {{ x: number, y: number, w: number, h: number }} at @param {{ pt: (px: number) => number, rtl: boolean, lang: string }} how */\nfunction table(slide, block, at, how) {\n const rows = [...block.querySelectorAll('tr')].map((tr) => [...tr.children].map((cell) => {\n const style = getComputedStyle(cell)\n const align = cell.getAttribute('data-align')\n return { text: cell.textContent?.trim() ?? '', options: {\n bold: cell.tagName === 'TH', fontSize: how.pt(parseFloat(style.fontSize)), color: hexOf(style.color), lang: how.lang, rtlMode: how.rtl,\n align: align === 'center' ? 'center' : (align === 'right') !== how.rtl ? 'right' : 'left',\n border: [{ type: 'none' }, { type: 'none' }, { type: 'solid', pt: cell.tagName === 'TH' ? 1.5 : 0.75, color: hexOf(style.borderBlockEndColor) }, { type: 'none' }],\n } }\n }))\n const widths = [...(block.querySelector('tr')?.children ?? [])].map((cell) => cell.getBoundingClientRect().width)\n const total = widths.reduce((a, b) => a + b, 0) || 1\n slide.addTable(how.rtl ? rows.map((r) => r.reverse()) : rows, { ...at, colW: (how.rtl ? widths.reverse() : widths).map((w) => (w / total) * at.w), margin: 0.06 })\n}\n\n/**\n * An ECharts chart as PowerPoint's own, when it is one PowerPoint draws: bars, lines, areas, a pie\n * or a ring, points, a radar; false when it isn't. @returns {boolean}\n */\nfunction nativeChart(/** @type {any} */ pres, /** @type {any} */ slide, /** @type {any} */ chart, /** @type {{ x: number, y: number, w: number, h: number }} */ at, /** @type {{ pt: (px: number) => number, rtl: boolean, lang: string, ink: string }} */ how) {\n const option = chart.getOption()\n const series = /** @type {any[]} */ (option.series ?? [])\n if (!series.length) return false\n const types = new Set(series.map((s) => s.type))\n const colours = /** @type {string[]} */ (option.color ?? []).map(hexOf)\n const value = (/** @type {any} */ v) => (Array.isArray(v) ? Number(v.at(-1)) : typeof v === 'object' && v !== null ? Number(v.value) : Number(v))\n const common = { ...at, showLegend: series.length > 1 || types.has('pie'), legendPos: 'b', legendFontSize: 12, legendColor: how.ink, chartColors: colours, showTitle: Boolean(option.title?.[0]?.text), title: option.title?.[0]?.text, titleFontSize: 16, titleColor: how.ink, catAxisLabelColor: how.ink, valAxisLabelColor: how.ink, dataLabelColor: how.ink, lang: how.lang }\n if (types.size === 1 && (types.has('pie'))) {\n const pie = series[0]\n const ring = Array.isArray(pie.radius) && parseFloat(pie.radius[0]) > 0\n slide.addChart(ring ? pres.charts.DOUGHNUT : pres.charts.PIE, [{ name: pie.name ?? '', labels: pie.data.map((/** @type {any} */ d) => d.name), values: pie.data.map(value) }], { ...common, showPercent: true, showLegend: true, holeSize: ring ? 55 : undefined })\n return true\n }\n if ([...types].every((t) => t === 'bar' || t === 'line')) {\n const horizontal = option.yAxis?.[0]?.type === 'category'\n const labels = (horizontal ? option.yAxis : option.xAxis)?.[0]?.data ?? []\n const of = (/** @type {any} */ s) => [{ name: s.name ?? '', labels: labels.map(String), values: s.data.map(value) }]\n const kind = (/** @type {any} */ s) => (s.type === 'bar' ? pres.charts.BAR : s.areaStyle ? pres.charts.AREA : pres.charts.LINE)\n const axes = { catAxisLabelFontSize: 11, valAxisLabelFontSize: 11, valGridLine: { color: 'D9D9D9', size: 0.5 }, catAxisOrientation: how.rtl && !horizontal ? 'maxMin' : 'minMax', valAxisLabelFormatCode: '#,##0' }\n if (types.size === 1) {\n const data = series.flatMap(of)\n slide.addChart(kind(series[0]), data, { ...common, ...axes, barDir: horizontal ? 'bar' : 'col', barGrouping: series.some((s) => s.stack) ? 'stacked' : 'clustered', lineDataSymbol: 'circle', lineSize: 2 })\n } else slide.addChart(series.map((s) => ({ type: kind(s), data: of(s), options: { barDir: horizontal ? 'bar' : 'col', chartColors: [colours[series.indexOf(s) % colours.length]] } })), { ...common, ...axes })\n return true\n }\n if (types.size === 1 && types.has('scatter')) {\n const points = series[0].data.map((/** @type {any} */ d) => (Array.isArray(d) ? d : [d.value?.[0], d.value?.[1]]))\n slide.addChart(pres.charts.SCATTER, [{ name: 'X', values: points.map((/** @type {any[]} */ p) => p[0]) }, { name: series[0].name ?? 'Y', values: points.map((/** @type {any[]} */ p) => p[1]) }], { ...common, lineSize: 0, lineDataSymbolSize: 8 })\n return true\n }\n if (types.size === 1 && types.has('radar')) {\n const indicators = option.radar?.[0]?.indicator ?? []\n slide.addChart(pres.charts.RADAR, series[0].data.map((/** @type {any} */ d) => ({ name: d.name ?? '', labels: indicators.map((/** @type {any} */ i) => i.name), values: d.value })), { ...common, showLegend: true, radarStyle: 'standard' })\n return true\n }\n return false\n}\n\n/** PowerPoint's transition for Slidev's name: Morph (with a fade where it isn't known), a fade, a push. @param {string} kind @param {boolean} rtl */\nfunction transitionXml(kind, rtl) {\n const push = (/** @type {string} */ dir) => `<p:transition spd=\"med\"><p:push dir=\"${dir}\"/></p:transition>`\n if (kind === 'view-transition' || kind === 'morph') return '<mc:AlternateContent xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"><mc:Choice xmlns:p159=\"http://schemas.microsoft.com/office/powerpoint/2015/09/main\" Requires=\"p159\"><p:transition spd=\"slow\"><p159:morph option=\"byObject\"/></p:transition></mc:Choice><mc:Fallback><p:transition spd=\"slow\"><p:fade/></p:transition></mc:Fallback></mc:AlternateContent>'\n if (kind === 'slide-left') return push(rtl ? 'r' : 'l')\n if (kind === 'slide-right') return push(rtl ? 'l' : 'r')\n if (kind === 'slide-up') return push('u')\n if (kind === 'slide-down') return push('d')\n return '<p:transition spd=\"med\"><p:fade/></p:transition>'\n}\n\n/** A picture's data as PNG, drawn at a size; null when it can't be read (another site's, unshared). @param {string} src @param {number} w @param {number} h @param {boolean} [cover] */\nasync function pictureOf(src, w, h, cover = false) {\n try {\n const img = new Image()\n img.crossOrigin = 'anonymous'\n img.src = src\n await img.decode()\n const canvas = document.createElement('canvas')\n canvas.width = Math.max(1, Math.round(w))\n canvas.height = Math.max(1, Math.round(h))\n const ctx = /** @type {CanvasRenderingContext2D} */ (canvas.getContext('2d'))\n const iw = img.naturalWidth || w, ih = img.naturalHeight || h\n const scale = cover ? Math.max(canvas.width / iw, canvas.height / ih) : Math.min(canvas.width / iw, canvas.height / ih)\n ctx.drawImage(img, (canvas.width - iw * scale) / 2, (canvas.height - ih * scale) / 2, iw * scale, ih * scale)\n return canvas.toDataURL('image/png')\n } catch {\n return null\n }\n}\n", "// The drawers a deck opened on its own uses for ```echarts and ```mermaid, each library loaded\n// from `base` (a CDN by default) the first time a slide needs it, never before. A chart is data,\n// read with JSON.parse; it takes the deck's colours and type, light or dark, and is drawn as SVG.\n// A diagram is drawn by Pele from Mermaid's language as SVG, then shown as a picture, so nothing it\n// makes runs or joins the page; its words are its picture's text for whoever can't see it. A host (Jean) gives\n// its own drawers instead.\n\n/** @typedef {{ base: string, root: HTMLElement, versions?: { echarts?: string, pele?: string } }} Where */\n\n/** @type {Map<string, Promise<any>>} */\nconst loading = new Map()\n\n/** A classic script, loaded once: from a file:// page, modules from elsewhere are not always let in. @param {string} src @param {string} global */\nfunction script(src, global) {\n if (!loading.has(src)) loading.set(src, new Promise((resolve, reject) => {\n const tag = document.createElement('script')\n tag.src = src\n tag.onload = () => resolve(/** @type {any} */ (globalThis)[global])\n tag.onerror = reject\n document.head.append(tag)\n }))\n return /** @type {Promise<any>} */ (loading.get(src))\n}\n\n/**\n * A library's file: from a CDN's npm mirror, at its version (`https://…/npm/name@1.2.3/file`), or from a\n * node_modules folder, which holds one version (`…/node_modules/name/file`).\n * @param {string} base @param {string} name @param {string} version @param {string} file\n */\nexport const libraryAt = (base, name, version, file) => (/node_modules\\/$/.test(base) ? `${base}${name}/${file}` : `${base}${name}@${version}/${file}`)\n\n/** @param {Where} where */\nexport function defaultBlocks({ base, root, versions = {} }) {\n const { echarts: chartsAt = '6.1.0', pele: diagramsAt = '1.10.0' } = versions\n /** @type {Set<{ chart: any, option: any, box: HTMLElement }>} */\n const charts = new Set()\n /** @type {any} */\n let colours = null\n root.addEventListener('deck-scheme', (event) => {\n colours = /** @type {CustomEvent} */ (event).detail.colours\n for (const one of charts) one.chart.setOption(themed(one.option, one.box), true)\n })\n // Its type sized with the slide's, its category axis read from the right in a language written so.\n const themed = (/** @type {any} */ option, /** @type {HTMLElement} */ box) => {\n const size = parseFloat(getComputedStyle(box).fontSize) || 16\n const rtl = getComputedStyle(box).direction === 'rtl'\n const small = Math.round(size * 0.6)\n const axis = (/** @type {any} */ given, /** @type {boolean} */ across) => given === undefined ? undefined : [given].flat().map((one) => ({\n axisLabel: { color: colours?.muted, fontSize: small }, axisLine: { lineStyle: { color: colours?.line } }, splitLine: { lineStyle: { color: colours?.line } },\n nameTextStyle: { color: colours?.muted, fontSize: small }, ...(rtl && across && one.type === 'category' ? { inverse: true } : {}), ...(rtl && !across ? { position: 'right' } : {}), ...one,\n }))\n return {\n color: colours?.series, backgroundColor: 'transparent', animation: !matchMedia('(prefers-reduced-motion: reduce)').matches,\n textStyle: { fontFamily: getComputedStyle(root).getPropertyValue('--deck-body') || 'system-ui', color: colours?.ink, fontSize: small },\n ...option,\n title: option.title ? { ...option.title, textStyle: { color: colours?.ink, fontSize: Math.round(size * 0.8), ...option.title?.textStyle } } : undefined,\n legend: option.legend ? { itemWidth: small * 1.6, itemHeight: small, ...option.legend, textStyle: { color: colours?.ink, fontSize: small, ...option.legend?.textStyle } } : undefined,\n grid: { containLabel: true, left: small, right: small, top: option.title ? size * 1.8 : small, bottom: option.legend ? size * 1.6 : small, ...option.grid },\n xAxis: axis(option.xAxis, true), yAxis: axis(option.yAxis, false), toolbox: undefined,\n series: [option.series ?? []].flat().map((one) => (one.type === 'pie' ? { label: { color: colours?.ink, fontSize: small }, ...one } : one)),\n }\n }\n return {\n /** @param {HTMLElement} box @param {string} source */\n async echarts(box, source) {\n const option = JSON.parse(source)\n const echarts = await script(libraryAt(base, 'echarts', chartsAt, 'dist/echarts.min.js'), 'echarts')\n const place = document.createElement('div')\n place.className = 'deck-chart'\n place.setAttribute('role', 'img')\n place.setAttribute('aria-label', String(option.title?.text ?? ''))\n box.append(place)\n const chart = echarts.init(place, null, { renderer: 'svg', locale: document.documentElement.lang?.startsWith('ja') ? 'JA' : 'EN' })\n const one = { chart, option, box }\n charts.add(one)\n chart.setOption(themed(option, box))\n new ResizeObserver(() => { chart.resize(); chart.setOption(themed(option, box), true) }).observe(place)\n Object.assign(box, { chart })\n },\n /**\n * A diagram written in Mermaid's language, drawn by Pele (Obsidian's, MIT): every kind Mermaid\n * 12.1 has, no DOM needed, an SVG with no script or HTML in it. Shown as a picture, its colours\n * the deck's, set as Pele's variables inside it. @param {HTMLElement} box @param {string} source\n */\n async mermaid(box, source) {\n const pele = await script(libraryAt(base, 'pele', diagramsAt, 'dist/pele.global.js'), 'pele')\n const font = getComputedStyle(root).getPropertyValue('--deck-body') || 'system-ui, sans-serif'\n const { svg } = pele.render(source, { fontFamily: font, links: false, images: false, autoDirection: true, maxWidth: Math.max(320, box.clientWidth * 1.4) })\n const look = `--pele-bg:transparent;--pele-fg:${colours?.ink};--pele-muted:${colours?.muted};--pele-line:${colours?.muted};--pele-surface:${colours?.soft};--pele-surface-alt:${colours?.line};--pele-border:${colours?.primary};--pele-accent:${colours?.primary};--pele-font:${font.replace(/[<>\"]/g, '')}`\n const picture = document.createElement('img')\n picture.alt = source\n picture.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg.replace(/^(<svg\\b[^>]*>)/, `$1<style>svg{${look}}</style>`))}`\n const place = document.createElement('div')\n place.className = 'deck-diagram'\n place.append(picture)\n box.append(place)\n },\n }\n}\n", "// Pictures held inside a deck, for a file that leaves its host: each picture the deck names by an\n// address of the host's own (a project's file, a relative path) becomes a data: address holding the\n// picture itself, in the Markdown's images (`![words](place)`) and in a slide's settings (`image`,\n// `background`, `backgroundImage`). Pictures on the web stay links unless asked for, and nothing else\n// in the text moves. Pure but for the host's `read`, which gives a picture's bytes and type.\n\nconst SETTINGS = /^(\\s*(?:image|background|backgroundImage)\\s*:\\s*)(['\"]?)([^'\"\\n#]+?)\\2(\\s*(?:#.*)?)$/gm\nconst IMAGE = /(!\\[[^\\]\\n]*\\]\\()(<[^>\\n]+>|[^\\s)\\n]+)((?:\\s+(?:\"[^\"\\n]*\"|'[^'\\n]*'))?\\))/g\n\n/** @param {string} place */\nconst held = (place) => /^data:/i.test(place)\n/** @param {string} place */\nconst web = (place) => /^(https?:)?\\/\\//i.test(place)\n\n/** @param {Uint8Array} bytes */\nfunction base64(bytes) {\n let text = ''\n for (let i = 0; i < bytes.length; i += 0x8000) text += String.fromCharCode(...bytes.subarray(i, i + 0x8000))\n return btoa(text)\n}\n\n/**\n * The deck with its pictures inside it.\n * @param {string} source\n * @param {(place: string) => Promise<{ type: string, bytes: Uint8Array } | null>} read\n * @param {{ web?: boolean, largest?: number }} [options] `web`: pictures on the web too; `largest`: bytes past which a picture stays a link\n * @returns {Promise<{ source: string, inlined: string[], missing: string[], kept: string[] }>}\n */\nexport async function inlinePictures(source, read, { web: fromWeb = false, largest = 8 * 1024 * 1024 } = {}) {\n /** @type {Map<string, string | null>} */\n const found = new Map()\n const places = [...source.matchAll(IMAGE)].map((m) => m[2].replace(/^<|>$/g, '')).concat([...source.matchAll(SETTINGS)].map((m) => m[3].trim()))\n const inlined = [], missing = [], kept = []\n for (const place of new Set(places)) {\n if (held(place) || (web(place) && !fromWeb) || /^(#|mailto:|javascript:)/i.test(place)) continue\n const picture = await read(place).catch(() => null)\n if (!picture || !/^image\\/(png|jpeg|gif|webp|avif|svg\\+xml)$/.test(picture.type)) { missing.push(place); found.set(place, null); continue }\n if (picture.bytes.length > largest) { kept.push(place); found.set(place, null); continue }\n found.set(place, `data:${picture.type};base64,${base64(picture.bytes)}`)\n inlined.push(place)\n }\n const swap = (/** @type {string} */ place) => found.get(place) ?? null\n const out = source\n .replace(IMAGE, (all, open, place, close) => { const data = swap(place.replace(/^<|>$/g, '')); return data ? `${open}${data}${close}` : all })\n .replace(SETTINGS, (all, key, quote, place, rest) => { const data = swap(place.trim()); return data ? `${key}${quote}${data}${quote}${rest}` : all })\n return { source: out, inlined, missing, kept }\n}\n", "// What brains get wrong when they write a deck, mended before it is read:\n// - a deck fenced as ```markdown, ```md, ```slidev or with nothing, three backticks around a\n// chart's three (an inner block is closed by the next bare fence);\n// - a slide's settings written after an empty line (`---`, ``, `layout: fact`, `---`), which\n// Slidev would show as words;\n// - <v-clicks> and </v-clicks> without the empty lines that keep the list a list;\n// - a chart fenced as ```json (an ECharts option: it has `series`);\n// - a slot's marker with words after it on its line (`::right:: The canal`).\n// Pure. Returns the deck and what was mended, so a test set can count both.\n\nconst OUTER = /^(`{3,}|~{3,})[ \\t]*(deck|slidev|markdown|md)?[ \\t]*$/\nconst KEYS = 'layout|transition|class|image|background|clicks|title|level|hide|zoom|theme|colorSchema|lang|themeConfig|paginate|alt'\n\n/** The deck an answer holds, or null. @param {string} answer @returns {{ source: string, mended: string[] } | null} */\nexport function deckIn(answer) {\n const lines = answer.replace(/\\r\\n?/g, '\\n').split('\\n')\n /** @type {{ tag: string, body: string[] }[]} */\n const found = []\n for (let i = 0; i < lines.length; i++) {\n const open = OUTER.exec(lines[i])\n if (!open) continue\n const fence = open[1]\n let j = i + 1, inner = false\n const body = []\n for (; j < lines.length; j++) {\n const line = lines[j].trimEnd()\n if (!inner && line === fence) break\n if (/^(`{3,}|~{3,})\\s*\\S/.test(line) && !inner) inner = true\n else if (inner && /^(`{3,}|~{3,})\\s*$/.test(line)) inner = false\n body.push(lines[j])\n }\n found.push({ tag: open[2] ?? '', body })\n i = j\n }\n const deck = found.find((f) => f.tag === 'deck') ?? found.find((f) => f.body.filter((l) => /^---\\s*$/.test(l)).length >= 2)\n if (!deck) return null\n /** @type {string[]} */\n const mended = []\n if (deck.tag !== 'deck') mended.push(`fenced as ${deck.tag || 'nothing'}`)\n let source = deck.body.join('\\n')\n const mend = (/** @type {string} */ what, /** @type {RegExp} */ pattern, /** @type {string} */ by) => {\n const next = source.replace(pattern, by)\n if (next !== source) { mended.push(what); source = next }\n }\n mend('settings after an empty line', new RegExp(`^---[ \\\\t]*\\\\n\\\\s*\\\\n((?:(?:${KEYS})\\\\s*:.*\\\\n(?:[ \\\\t]+\\\\S.*\\\\n)*)+)---[ \\\\t]*$`, 'gm'), '---\\n$1---')\n mend('steps without empty lines', /^[ \\t]*(<\\/?v-clicks?>)[ \\t]*$/gm, '\\n$1\\n')\n const charts = source.replace(/^```json[ \\t]*\\n([\\s\\S]*?)^```/gm, (block, body) => (body.includes('\"series\"') ? `\\`\\`\\`echarts\\n${body}\\`\\`\\`` : block))\n if (charts !== source) { mended.push('a chart fenced as json'); source = charts }\n mend('words after a slot marker', /^::([\\w-]+)::[ \\t]+(\\S.*)$/gm, '::$1::\\n\\n$2')\n return { source, mended }\n}\n"],
5
- "mappings": "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",
6
- "names": ["parseYaml", "text", "lines", "raw", "uncomment", "value", "block", "line", "quote", "i", "c", "at", "min", "indent", "list", "rest", "width", "scalar", "map", "entry", "key", "blockScalar", "folded", "taken", "read", "flow", "space", "item", "start", "q", "open", "SLOT", "parseDeck", "source", "lines", "offsets", "line", "ranges", "start", "matter", "comment", "i", "commentGoesOn", "j", "fence", "last", "heads", "mark", "cuts", "at", "k", "slides", "end", "index", "slide", "one", "slot", "columnsOf", "starts", "open", "close", "cols", "names", "_", "begin", "from", "to", "settings", "parseYaml", "top", "body", "notes", "after", "all", "text", "slots", "name", "first", "taken", "push", "columns", "marker", "kept", "heading", "NAME", "TRACK", "PPTX", "ENUMS", "ALIASES", "STANDARD", "name", "given", "layoutOf", "problems", "budgets", "named", "budget", "clean", "slots", "slot", "rows", "row", "width", "cell", "cells", "y", "x", "xs", "c", "ys", "tracks", "value", "count", "list", "t", "columns", "rowTracks", "pick", "key", "fallback", "label", "words", "v", "kept", "tokensFrom", "colour", "face", "NAMES", "group", "g", "k", "colours", "tokens", "dark", "fonts", "heading", "body", "mergeKits", "kits", "kit", "definition", "layout", "found", "p", "labelOf", "lang", "inferLayout", "slide", "names", "lines", "line", "i", "h", "tag", "attributes", "children", "element", "name", "value", "child", "safeUrl", "href", "url", "renderSlide", "slide", "context", "asked", "layout", "ALIASES", "inferLayout", "definition", "STANDARD", "classes", "counter", "slots", "slot", "names", "section", "canvas", "row", "cell", "image", "picture", "blocks", "tokens", "out", "at", "mode", "token", "start", "fences", "line", "fence", "list", "attrs", "inner", "words", "li", "step", "block", "n", "stepped", "head", "edit", "range", "inline", "lone", "from", "item", "offset", "itemStart", "marker", "simple", "info", "lang", "drawer", "box", "marked", "lines", "code", "i", "align", "a", "raw", "text", "part", "b", "to", "_", "e", "src", "LOOKS", "VOICES", "tokensOf", "settings", "project", "named", "own", "tokens", "clean", "given", "kept", "key", "hex", "v", "schemeOf", "scheme", "light", "dark", "paper", "round", "mix", "ink", "primary", "text", "readable", "onPrimary", "contrast", "series", "n", "rotate", "css", "value", "m", "h", "c", "i", "rgb", "a", "b", "t", "luminance", "r", "g", "s", "x", "y", "p", "q", "colour", "ratio", "toward", "out", "degrees", "max", "min", "d", "u", "STRINGS", "stringsFor", "lang", "Lexer", "RTL", "ICONS", "icon", "name", "svg", "path", "createDeck", "root", "options", "source", "deck", "parseDeck", "at", "stepAt", "drawn", "lang", "dir", "words", "stringsFor", "number", "dark", "scheme", "started", "stage", "h", "where", "button", "label", "act", "b", "back", "move", "next", "editButton", "toggle", "presenterButton", "overviewButton", "bar", "paintLook", "view", "present", "sourceBox", "nextBox", "notes", "clock", "presenter", "kitProblems", "kitOf", "merged", "mergeKits", "context", "tokens", "tokensOf", "colours", "schemeOf", "stack", "faces", "f", "voice", "VOICES", "value", "colour", "n", "chooseScheme", "asked", "src", "markdown", "draw", "slide", "renderSlide", "i", "element", "go", "show", "fitAll", "fit", "over", "slot", "scale", "steps", "one", "following", "by", "to", "toStep", "forward", "settings", "named", "ahead", "behind", "part", "kind", "_", "side", "update", "reduced", "transition", "toward", "key", "el", "parts", "s", "there", "match", "id", "old", "mode", "other", "setSource", "text", "pending", "event", "followCaret", "caret", "found", "target", "from", "done", "keep", "blur", "markdownOf", "e", "backward", "touch", "dx", "tick", "node", "out", "child", "inner", "VERSION", "OPEN", "CLOSE", "escape", "markdown", "unescape", "text", "attribute", "content", "inlineCode", "code", "readDeckFile", "html", "at", "from", "end", "rendererUrl", "version", "VERSION", "writeDeckFile", "title", "lang", "dir", "renderer", "base", "generator", "data", "script", "W", "H", "TEXT", "hexOf", "value", "m", "toPptx", "view", "PptxGenJS", "JSZip", "pres", "rootStyle", "firstFont", "stack", "f", "report", "rtl", "slides", "masters", "transitions", "i", "element", "box", "sx", "W", "place", "el", "r", "across", "slot", "x", "w", "y", "h", "pad", "start", "end", "anchor", "pt", "px", "style", "layout", "slots", "firstBlock", "title", "definition", "masterName", "labelOf", "objects", "hexOf", "top", "inner", "H", "o", "names", "slide", "background", "url", "data", "pictureOf", "runs", "blocks", "child", "TEXT", "block", "spaced", "at", "table", "chart", "nativeChart", "img", "notes", "settings", "zip", "kind", "path", "xml", "found", "transitionXml", "theme", "colour", "name", "series", "n", "scheme", "c", "first", "after", "how", "out", "paragraph", "extra", "base", "pieces", "inlineRuns", "list", "level", "li", "nested", "clone", "sub", "p", "node", "walk", "options", "text", "own", "run", "rows", "tr", "cell", "align", "widths", "total", "a", "b", "option", "types", "s", "colours", "value", "v", "common", "pie", "ring", "d", "t", "horizontal", "labels", "of", "axes", "points", "indicators", "push", "dir", "src", "cover", "canvas", "ctx", "iw", "ih", "scale", "loading", "script", "src", "global", "resolve", "reject", "tag", "libraryAt", "base", "name", "version", "file", "defaultBlocks", "root", "versions", "chartsAt", "diagramsAt", "charts", "colours", "event", "one", "themed", "option", "box", "size", "rtl", "small", "axis", "given", "across", "source", "echarts", "place", "chart", "pele", "font", "svg", "look", "picture", "SETTINGS", "IMAGE", "held", "place", "web", "base64", "bytes", "text", "i", "inlinePictures", "source", "read", "fromWeb", "largest", "found", "places", "m", "inlined", "missing", "kept", "picture", "swap", "all", "open", "close", "data", "key", "quote", "rest", "OUTER", "KEYS", "deckIn", "answer", "lines", "found", "i", "open", "fence", "j", "inner", "body", "line", "deck", "f", "l", "mended", "source", "mend", "what", "pattern", "by", "next", "charts", "block"]
4
+ "sourcesContent": ["// Front matter as brains and Slidev write it: the YAML a deck needs, maps by their indent, lists\n// in blocks and in brackets, quoted and plain scalars, block scalars (| and >) and comments. What\n// it can't read stays a string, so a deck never fails to open over its settings. Pure.\n\n/** @param {string} text @returns {Record<string, any>} */\nexport function parseYaml(text) {\n const lines = text.replace(/\\r\\n?/g, '\\n').split('\\n').map((raw) => ({ indent: raw.length - raw.trimStart().length, text: uncomment(raw).trimEnd(), raw }))\n const at = { i: 0 }\n const value = block(lines, at, 0)\n return value && typeof value === 'object' && !Array.isArray(value) ? value : {}\n}\n\n/** A line without its comment: a # at its start or after a space, outside quotes. @param {string} line */\nfunction uncomment(line) {\n let quote = ''\n for (let i = 0; i < line.length; i++) {\n const c = line[i]\n if (quote) { if (c === quote) quote = '' }\n else if (c === '\"' || c === \"'\") quote = c\n else if (c === '#' && (i === 0 || /\\s/.test(line[i - 1]))) return line.slice(0, i)\n }\n return line\n}\n\n/** @param {{ indent: number, text: string, raw: string }[]} lines @param {{ i: number }} at @param {number} min @returns {any} */\nfunction block(lines, at, min) {\n while (at.i < lines.length && !lines[at.i].text.trim()) at.i++\n if (at.i >= lines.length || lines[at.i].indent < min) return null\n const indent = lines[at.i].indent\n if (/^-(\\s|$)/.test(lines[at.i].text.trim())) {\n const list = []\n while (at.i < lines.length) {\n const line = lines[at.i]\n if (!line.text.trim()) { at.i++; continue }\n if (line.indent !== indent || !/^-(\\s|$)/.test(line.text.trim())) break\n const rest = line.text.trim().slice(1).trim()\n at.i++\n if (!rest) list.push(block(lines, at, indent + 1))\n else if (/^[^'\"[{][^:]*:(\\s|$)/.test(rest)) {\n // A map that starts on the dash's line: its first key there, the rest below it.\n const width = line.raw.indexOf(rest)\n lines.splice(at.i, 0, { indent: width, text: ' '.repeat(width) + rest, raw: ' '.repeat(width) + rest })\n list.push(block(lines, at, width))\n } else list.push(scalar(rest))\n }\n return list\n }\n /** @type {Record<string, any>} */\n const map = {}\n while (at.i < lines.length) {\n const line = lines[at.i]\n if (!line.text.trim()) { at.i++; continue }\n if (line.indent !== indent) break\n const entry = /^(\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^']|'')*'|[^:]+?)\\s*:(?:\\s+(.*))?$/.exec(line.text.trim())\n at.i++\n if (!entry) continue\n const key = String(scalar(entry[1]))\n const rest = (entry[2] ?? '').trim()\n if (rest === '|' || rest === '>' || /^[|>][+-]$/.test(rest)) map[key] = blockScalar(lines, at, indent, rest[0] === '>')\n else if (rest) map[key] = scalar(rest)\n else map[key] = block(lines, at, indent + 1)\n }\n return map\n}\n\n/** @param {{ indent: number, text: string, raw: string }[]} lines @param {{ i: number }} at @param {number} indent @param {boolean} folded */\nfunction blockScalar(lines, at, indent, folded) {\n const taken = []\n while (at.i < lines.length && (!lines[at.i].raw.trim() || lines[at.i].indent > indent)) taken.push(lines[at.i++].raw)\n while (taken.length && !taken.at(-1)?.trim()) taken.pop()\n const width = Math.min(...taken.filter((line) => line.trim()).map((line) => line.length - line.trimStart().length))\n const text = taken.map((line) => line.slice(width)).join('\\n')\n return folded ? text.replace(/([^\\n])\\n(?=[^\\n])/g, '$1 ') : text\n}\n\n/** A scalar, or a list or map in brackets. @param {string} text @returns {any} */\nfunction scalar(text) {\n const t = text.trim()\n if (t.startsWith('[') || t.startsWith('{')) {\n const read = flow(t, { i: 0 })\n if (read !== undefined) return read\n }\n if (/^\"(?:[^\"\\\\]|\\\\.)*\"$/.test(t)) {\n try { return JSON.parse(t) } catch { return t.slice(1, -1) }\n }\n if (/^'(?:[^']|'')*'$/.test(t)) return t.slice(1, -1).replace(/''/g, \"'\")\n if (/^(true|yes|on)$/i.test(t)) return true\n if (/^(false|no|off)$/i.test(t)) return false\n if (/^(null|~)$/i.test(t) || t === '') return null\n if (/^[-+]?(\\d+\\.?\\d*|\\.\\d+)(e[-+]?\\d+)?$/i.test(t)) return Number(t)\n return t\n}\n\n/** A list or map in brackets, or undefined when it isn't one. @param {string} text @param {{ i: number }} at @returns {any} */\nfunction flow(text, at) {\n const space = () => { while (/\\s/.test(text[at.i] ?? '')) at.i++ }\n const item = () => {\n space()\n if (text[at.i] === '[' || text[at.i] === '{') return flow(text, at)\n const start = at.i\n if (text[at.i] === '\"' || text[at.i] === \"'\") {\n const q = text[at.i++]\n while (at.i < text.length && !(text[at.i] === q && text[at.i - 1] !== '\\\\')) at.i++\n at.i++\n } else while (at.i < text.length && !/[,\\]}]/.test(text[at.i]) && !(text[at.i] === ':' && /^[\\s,\\]}]?$/.test(text[at.i + 1] ?? ''))) at.i++\n return scalar(text.slice(start, at.i))\n }\n const open = text[at.i++]\n space()\n if (open === '[') {\n const list = []\n while (at.i < text.length && text[at.i] !== ']') {\n list.push(item())\n space()\n if (text[at.i] === ',') at.i++\n else if (text[at.i] !== ']') return undefined\n space()\n }\n at.i++\n return list\n }\n /** @type {Record<string, any>} */\n const map = {}\n while (at.i < text.length && text[at.i] !== '}') {\n const key = item()\n space()\n if (text[at.i] !== ':') return undefined\n at.i++\n map[String(key)] = item()\n space()\n if (text[at.i] === ',') at.i++\n else if (text[at.i] !== '}') return undefined\n space()\n }\n at.i++\n return map\n}\n", "// A deck's Markdown read as Slidev reads it (@slidev/parser's rules): slides between `---` lines;\n// a `---` line followed by a line that isn't empty opens that slide's settings, YAML up to the next\n// `---` line (or a ```yaml block at the slide's top); the first slide's settings are the deck's\n// too (its headmatter); the last HTML comment at a slide's end is the speaker's notes; `::name::`\n// on its own line starts a layout's slot. Fenced code and comments never split a slide. Every slide\n// and slot keeps where it starts in the source, so an edit made on a slide goes back to its words.\n// Read too, as brains write them even when asked for Slidev: Pandoc's and Quarto's fenced divs,\n// `::: notes` as the notes, and `:::: columns` holding `::: column`s as slots (what is above them\n// the heading, each column a slot, what is under them the foot), never rewritten.\n// Pure: no DOM, no Markdown parser.\nimport { parseYaml } from './yaml.js'\n\n/** @typedef {{ name: string, text: string, start: number }} Slot */\n/** @typedef {{ index: number, start: number, end: number, settings: Record<string, any>, slots: Slot[], notes: string, title: string }} Slide */\n/** @typedef {{ settings: Record<string, any>, slides: Slide[] }} Deck */\n\nconst SLOT = /^::([\\w-]+)::\\s*$/\n\n/** @param {string} source @returns {Deck} */\nexport function parseDeck(source) {\n const text = source.replace(/\\r\\n?/g, '\\n')\n const lines = text.split('\\n')\n const offsets = [0]\n for (const line of lines) offsets.push(/** @type {number} */ (offsets.at(-1)) + line.length + 1)\n /** @type {{ start: number, end: number, matter: [number, number] | null }[]} */\n const ranges = []\n let start = 0, matter = /** @type {[number, number] | null} */ (null), comment = false\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trimEnd()\n if (comment) { comment = commentGoesOn(line, true); continue }\n if (line.startsWith('---') && !/^---\\s*-/.test(line)) {\n if (i > start || matter) ranges.push({ start, end: i, matter })\n matter = null\n start = i + 1\n // Settings only when settings follow (a `key:` line), not words: Slidev would take a heading\n // there for settings and lose the slide, as decks brains write often start `---`, `# Title`.\n if (line[3] !== '-' && lines[i + 1]?.trim() && /^\\s*([\\w-]+\\s*:|#\\s)/.test(lines[i + 1]) && !/^#{1,6}\\s/.test(lines[i + 1])) {\n let j = i + 1\n while (j < lines.length && lines[j].trimEnd() !== '---') j++\n matter = [i + 1, j]\n i = j\n start = j + 1\n }\n } else if (/^\\s*(`{3,}|~{3,})/.test(line)) {\n const fence = /** @type {RegExpExecArray} */ (/^\\s*(`{3,}|~{3,})/.exec(line))[1]\n let j = i + 1\n while (j < lines.length && !lines[j].trimStart().startsWith(fence)) j++\n if (j < lines.length) i = j\n } else comment = commentGoesOn(line, false)\n }\n if (start < lines.length || matter) ranges.push({ start, end: lines.length, matter })\n // No `---` at all, as a document or a Pandoc deck is written: a slide at each heading of the first\n // two levels, as Pandoc's slide level does, the headmatter staying with the first.\n const last = /** @type {{ start: number, end: number, matter: [number, number] | null }} */ (ranges.at(-1))\n if (ranges.length === 1 && last) {\n let fence = ''\n const heads = []\n for (let i = last.start; i < last.end; i++) {\n const mark = /^\\s*(`{3,}|~{3,})/.exec(lines[i])?.[1]\n if (fence) { if (mark && lines[i].trimStart().startsWith(fence)) fence = '' }\n else if (mark) fence = mark\n else if (/^#{1,2}\\s+\\S/.test(lines[i])) heads.push(i)\n }\n if (heads.length >= 2) {\n ranges.pop()\n const cuts = heads[0] > last.start && !lines.slice(last.start, heads[0]).some((line) => line.trim()) ? heads : [last.start, ...heads.slice(heads[0] === last.start ? 1 : 0)]\n cuts.forEach((at, k) => ranges.push({ start: k === 0 ? last.start : at, end: cuts[k + 1] ?? last.end, matter: k === 0 ? last.matter : null }))\n }\n }\n const slides = ranges.map(({ start, end, matter }, index) => slide(lines, offsets, start, end, matter, index))\n .filter((one, i) => i === 0 || one.slots.some((slot) => slot.text.trim()) || Object.keys(one.settings).length)\n slides.forEach((one, i) => { one.index = i })\n return { settings: slides[0]?.settings ?? {}, slides }\n}\n\n/**\n * Pandoc's columns, as the lines where each slot starts: the first column `left`, the next `right`\n * (or `middle`, then `right`, for three), the line after the columns `bottom`. The fences' own lines\n * are left as they are and drawn as nothing. @param {string[]} lines @returns {Map<number, string>}\n */\nfunction columnsOf(lines) {\n /** @type {Map<number, string>} */\n const starts = new Map()\n const open = lines.findIndex((line) => /^:{3,}[ \\t]*\\{?[ \\t]*\\.?columns\\b/.test(line))\n if (open < 0) return starts\n const fence = /** @type {RegExpExecArray} */ (/^:+/.exec(lines[open]))[0]\n const close = lines.findIndex((line, i) => i > open && line.trim() === fence)\n const cols = lines.map((line, i) => [line, i]).filter(([line, i]) => Number(i) > open && (close < 0 || Number(i) < close) && /^:{3,}[ \\t]*\\{?[ \\t]*\\.?col(umn)?\\b/.test(String(line))).map(([, i]) => Number(i))\n if (cols.length < 2) return starts\n const names = cols.length === 2 ? ['left', 'right'] : ['left', 'middle', 'right', ...cols.slice(3).map((_, k) => `col-${k + 4}`)]\n cols.forEach((at, k) => starts.set(at, names[k]))\n if (close > 0 && lines.slice(close + 1).some((line) => line.trim())) starts.set(close, 'bottom')\n return starts\n}\n\n/** Whether a comment is still open at this line's end. @param {string} line @param {boolean} open */\nfunction commentGoesOn(line, open) {\n let at = 0\n for (;;) {\n if (open) {\n const end = line.indexOf('-->', at)\n if (end < 0) return true\n open = false\n at = end + 3\n } else {\n const begin = line.indexOf('<!--', at)\n if (begin < 0) return false\n const end = line.indexOf('-->', begin + 4)\n if (end < 0) return true\n at = end + 3\n }\n }\n}\n\n/**\n * @param {string[]} lines @param {number[]} offsets @param {number} from @param {number} to\n * @param {[number, number] | null} matter @param {number} index @returns {Slide}\n */\nfunction slide(lines, offsets, from, to, matter, index) {\n let settings = matter ? parseYaml(lines.slice(matter[0], matter[1]).join('\\n')) : {}\n let top = from\n // Slidev's other way to write settings: a ```yaml block at the slide's top.\n while (top < to && !lines[top].trim()) top++\n if (!matter && /^```ya?ml\\s*$/.test(lines[top] ?? '')) {\n let j = top + 1\n while (j < to && !lines[j].startsWith('```')) j++\n settings = parseYaml(lines.slice(top + 1, j).join('\\n'))\n from = j + 1\n }\n let body = lines.slice(from, to).join('\\n')\n let notes = ''\n // remark's `???` and reveal.js's `Note:`: what follows, to the slide's end, is the notes.\n const after = /^(\\?\\?\\?|Notes?:)[ \\t]*(.*)$/m.exec(body)\n if (after && after.index !== undefined && !/^```/m.test(body.slice(after.index))) {\n notes = [after[2], body.slice(after.index + after[0].length)].join('\\n').trim()\n body = body.slice(0, after.index)\n }\n // reveal.js's <aside class=\"notes\">, wherever on the slide, as Pandoc's below.\n body = body.replace(/<aside\\b[^>]*class=[\"']?notes[\"']?[^>]*>([\\s\\S]*?)<\\/aside>/gi, (all, text) => {\n notes += (notes ? '\\n' : '') + text.replace(/<[^>]*>/g, ' ').replace(/[ \\t]+/g, ' ').trim()\n return all.replace(/[^\\n]/g, ' ')\n })\n // Pandoc's notes, wherever on the slide: kept as the notes, blanked in place so offsets stay.\n body = body.replace(/^(:{3,})[ \\t]*\\{?[ \\t]*\\.?notes[ \\t]*\\}?[ \\t]*\\n([\\s\\S]*?)\\n\\1[ \\t]*$/gm, (all, _, text) => {\n notes += (notes ? '\\n' : '') + text.trim()\n return all.replace(/[^\\n]/g, ' ')\n })\n const comments = [...body.matchAll(/<!--([\\s\\S]*?)-->/g)]\n const last = comments.at(-1)\n if (last && last.index !== undefined && !body.slice(last.index + last[0].length).trim()) {\n notes = [last[1].trim(), notes].filter(Boolean).join('\\n')\n body = body.slice(0, last.index)\n }\n // Each slot's text is the source's own, from where it starts, so offsets in it are the source's.\n /** @type {Slot[]} */\n const slots = []\n let name = 'default', first = from, fence = ''\n /** @type {string[]} */\n let taken = []\n const push = () => slots.push({ name, text: taken.join('\\n'), start: offsets[first] })\n const columns = columnsOf(body.split('\\n'))\n for (const [i, line] of body.split('\\n').entries()) {\n const mark = /^\\s*(`{3,}|~{3,})/.exec(line)?.[1]\n const marker = SLOT.exec(line) ?? (columns.has(i) ? [line, /** @type {string} */ (columns.get(i))] : null)\n if (fence) { if (mark && line.trimStart().startsWith(fence)) fence = '' }\n else if (mark) fence = mark\n else if (marker) {\n push()\n name = marker[1]\n taken = []\n first = from + i + 1\n continue\n }\n taken.push(line)\n }\n push()\n const kept = slots.filter((slot, i) => i > 0 || slot.text.trim() || slots.length === 1)\n const heading = /^#{1,6}\\s+(.+)$/m.exec(body.replace(/^```[\\s\\S]*?^```/gm, ''))\n return { index, start: offsets[matter ? matter[0] - 1 : from], end: offsets[to] - 1, settings, slots: kept, notes, title: String(settings.title ?? heading?.[1] ?? '').trim() }\n}\n", "// A kit: a design system and the layouts that go with it, as data and never as CSS or code, so a\n// person, an organisation or a brain can make one and no kit can do more than lay out a slide.\n// deck's own kit holds the usual layouts; a host's (an organisation's, a project's) and the deck\n// file's own `kit:` go over it, in that order. A layout is a grid: its slots by name, the areas\n// they take, its tracks, how its words sit, what paper it is on, how big its logo shows, and the\n// PowerPoint layout it is nearest to; a kit may turn one of the usual layouts off. Its tokens may\n// hold a logo, a picture inside the kit and never an address. Everything is checked against a small\n// grammar; what fails is dropped, with a reason. Pure.\n\n/** @typedef {{ required?: boolean, max_words?: number, max_chars?: number, items?: [number, number], item_max_words?: number, heading_max_words?: number, kind?: string }} Budget */\n/** @typedef {{ label?: Record<string, string> | string, intent?: string, use_when?: string, avoid_when?: string, slots: string[], budgets: Record<string, Budget>, areas: string[][], columns: string[], rows: string[], align: 'start' | 'center' | 'end', justify: 'start' | 'center' | 'end', paper: 'paper' | 'fill' | 'ink' | 'soft', title: 'normal' | 'large' | 'huge', logo: 'big' | 'small' | 'none', pptx: string, numbered: boolean }} Layout */\n/** @typedef {{ name?: string, tokens: Record<string, any>, layouts: Record<string, Layout> }} Kit */\n\nconst NAME = /^[a-z][a-z0-9-]{0,31}$/\nconst TRACK = /^(auto|min-content|max-content|\\d{1,2}(\\.\\d)?fr|\\d{1,3}%)$/\nconst PPTX = ['Title Slide', 'Title and Content', 'Section Header', 'Two Content', 'Comparison', 'Title Only', 'Blank', 'Content with Caption', 'Picture with Caption']\nconst ENUMS = /** @type {const} */ ({ align: ['start', 'center', 'end'], justify: ['start', 'center', 'end'], paper: ['paper', 'fill', 'ink', 'soft'], title: ['normal', 'large', 'huge'], logo: ['small', 'big', 'none'] })\n/** The corners a logo sits in, as `logoAt` names them, the first by default. */\nexport const CORNERS = ['top-end', 'top-start', 'bottom-end', 'bottom-start']\n\n/**\n * A logo as a kit holds it: a picture inside the kit, PNG, JPEG, GIF, WebP or SVG as a data: address of 512 KB at most,\n * never an address to fetch; else null. @param {unknown} value\n */\nexport const logoOf = (value) => (typeof value === 'string' && value.length <= 700_000 && /^data:image\\/(png|jpeg|gif|webp|svg\\+xml);base64,[a-z0-9+/]+=*$/i.test(value) ? value : null)\n\n/** The names brains give the usual layouts, for the ones deck has. */\nexport const ALIASES = /** @type {Record<string, string>} */ ({\n title: 'cover', 'title-slide': 'cover', 'two-columns': 'two-cols', 'two-column': 'two-cols', columns: 'two-cols', comparison: 'two-cols-header',\n 'three-columns': 'three-cols', 'section-header': 'section', divider: 'section', big: 'fact', number: 'fact', 'image-text': 'image-right', closing: 'end', thanks: 'end',\n})\n\n/** deck's own kit: the usual layouts, the ones Slidev names and the ones PowerPoint has, as data. */\nexport const STANDARD = /** @type {Kit} */ ({\n name: 'standard',\n tokens: {},\n layouts: Object.fromEntries(Object.entries(/** @type {Record<string, any>} */ ({\n default: { label: { en: 'Title and content', fr: 'Titre et contenu' }, pptx: 'Title and Content' },\n cover: { label: { en: 'Cover', fr: 'Couverture' }, justify: 'center', paper: 'fill', title: 'huge', logo: 'big', pptx: 'Title Slide', numbered: false },\n intro: { label: { en: 'Introduction', fr: 'Introduction' }, justify: 'center', paper: 'fill', title: 'large', logo: 'big', pptx: 'Title Slide', numbered: false },\n section: { label: { en: 'Section', fr: 'Section' }, justify: 'center', paper: 'ink', title: 'huge', pptx: 'Section Header', numbered: false },\n center: { label: { en: 'Centred', fr: 'Centré' }, justify: 'center', align: 'center', pptx: 'Title Only' },\n statement: { label: { en: 'Statement', fr: 'Affirmation' }, justify: 'center', align: 'center', title: 'large', pptx: 'Title Only' },\n fact: { label: { en: 'Big number', fr: 'Grand chiffre' }, justify: 'center', align: 'center', title: 'huge', pptx: 'Title Only' },\n quote: { label: { en: 'Quote', fr: 'Citation' }, justify: 'center', pptx: 'Title Only' },\n end: { label: { en: 'Closing', fr: 'Clôture' }, justify: 'center', align: 'center', paper: 'fill', title: 'large', logo: 'big', pptx: 'Title Slide', numbered: false },\n full: { label: { en: 'Full', fr: 'Plein cadre' }, logo: 'none', pptx: 'Blank', numbered: false },\n none: { label: { en: 'Blank', fr: 'Vide' }, logo: 'none', pptx: 'Blank', numbered: false },\n 'two-cols': { label: { en: 'Two columns', fr: 'Deux colonnes' }, slots: ['default', 'right'], areas: 'default right', columns: '1fr 1fr', pptx: 'Two Content' },\n 'two-cols-header': { label: { en: 'Comparison', fr: 'Comparaison' }, slots: ['default', 'left', 'right', 'bottom'], areas: 'default default | left right | bottom bottom', columns: '1fr 1fr', rows: 'auto 1fr auto', pptx: 'Comparison' },\n 'three-cols': { label: { en: 'Three columns', fr: 'Trois colonnes' }, slots: ['default', 'left', 'middle', 'right'], areas: 'default default default | left middle right', columns: '1fr 1fr 1fr', rows: 'auto 1fr', pptx: 'Comparison' },\n 'image-left': { label: { en: 'Picture left', fr: 'Image à gauche' }, pptx: 'Picture with Caption', justify: 'center' },\n 'image-right': { label: { en: 'Picture right', fr: 'Image à droite' }, pptx: 'Picture with Caption', justify: 'center' },\n image: { label: { en: 'Picture', fr: 'Image' }, logo: 'none', pptx: 'Blank', numbered: false },\n })).map(([name, given]) => [name, /** @type {Layout} */ (layoutOf(given).layout)])),\n})\n\n/**\n * A layout as given, checked: its slots, areas and tracks in the grammar, its words' place, paper\n * and size among their names. @param {any} given @returns {{ layout: Layout | null, problems: string[] }}\n */\nexport function layoutOf(given) {\n const problems = []\n if (!given || typeof given !== 'object') return { layout: null, problems: ['not a layout'] }\n // Slots as names, or as a catalog writes them: each a budget, `title` being the heading the\n // default slot opens with rather than a slot of its own.\n /** @type {Record<string, Budget>} */\n const budgets = {}\n const named = Array.isArray(given.slots) || typeof given.slots === 'string' ? [given.slots].flat().map(String)\n : given.slots && typeof given.slots === 'object' ? Object.entries(given.slots).map(([name, budget]) => {\n if (budget && typeof budget === 'object') budgets[name] = clean(budget)\n return name === 'title' ? 'default' : name\n }) : ['default']\n const slots = [...new Set(named)]\n if (!slots.every((slot) => NAME.test(slot))) return { layout: null, problems: ['a slot name is not a-z, 0-9 and -'] }\n if (!slots.includes('default')) slots.unshift('default')\n // Areas as Slidev's and CSS's grid write them, rows split by | or new lines.\n /** @type {string[]} */\n const lines = Array.isArray(given.areas) ? given.areas.map((/** @type {any} */ row) => [row].flat().join(' ')) : String(given.areas ?? slots.join(' ')).split(/\\||\\n/)\n const rows = lines.map((row) => row.trim().replace(/^\"|\"$/g, '').split(/\\s+/)).filter((row) => row.length && row[0])\n const width = rows[0]?.length ?? 0\n if (!rows.length || rows.some((row) => row.length !== width) || rows.flat().some((cell) => cell !== '.' && !slots.includes(cell))) return { layout: null, problems: ['areas are not a rectangle of its slots'] }\n for (const slot of slots) {\n const cells = rows.flatMap((row, y) => row.map((cell, x) => /** @type {[string, number, number]} */ ([cell, x, y]))).filter(([cell]) => cell === slot)\n if (!cells.length) { if (slot !== 'default') problems.push(`slot ${slot} has no area`); continue }\n const xs = cells.map((c) => c[1]), ys = cells.map((c) => c[2])\n if (cells.length !== (Math.max(...xs) - Math.min(...xs) + 1) * (Math.max(...ys) - Math.min(...ys) + 1)) return { layout: null, problems: [`slot ${slot} is not a rectangle`] }\n }\n const tracks = (/** @type {any} */ value, /** @type {number} */ count) => {\n const list = value === undefined ? Array(count).fill('1fr') : (Array.isArray(value) ? value : String(value).split(/\\s+/)).map(String)\n return list.length === count && list.every((t) => TRACK.test(t)) ? list : null\n }\n const columns = tracks(given.columns, width), rowTracks = tracks(given.rows, rows.length)\n if (!columns || !rowTracks) return { layout: null, problems: ['columns or rows are not tracks deck knows (auto, 1fr, 40%…), one per column or row'] }\n const pick = (/** @type {keyof typeof ENUMS} */ key, /** @type {string} */ fallback) => {\n const value = String(given[key] ?? fallback)\n if (!(/** @type {readonly string[]} */ (ENUMS[key])).includes(value)) { problems.push(`${key} ${value} is not one of ${ENUMS[key].join(', ')}`); return fallback }\n return value\n }\n const label = typeof given.label === 'string' || (given.label && typeof given.label === 'object') ? given.label : undefined\n const words = (/** @type {any} */ v) => (typeof v === 'string' ? v.slice(0, 300) : undefined)\n return {\n layout: /** @type {Layout} */ ({\n label, intent: words(given.intent), use_when: words(given.use_when), avoid_when: words(given.avoid_when), slots, budgets, areas: rows, columns, rows: rowTracks,\n align: pick('align', 'start'), justify: pick('justify', 'start'), paper: pick('paper', 'paper'), title: pick('title', 'normal'), logo: pick('logo', 'small'),\n pptx: PPTX.includes(given.pptx) ? given.pptx : slots.length > 1 ? 'Comparison' : 'Title and Content', numbered: given.numbered !== false,\n }),\n problems,\n }\n}\n\n/** A slot's budget, its numbers only. @param {Record<string, any>} given @returns {Budget} */\nfunction clean(given) {\n /** @type {Record<string, any>} */\n const kept = {}\n for (const key of ['max_words', 'max_chars', 'item_max_words', 'heading_max_words']) if (Number.isInteger(given[key]) && given[key] > 0) kept[key] = given[key]\n if (Array.isArray(given.items) && given.items.length === 2 && given.items.every(Number.isInteger)) kept.items = given.items\n if (typeof given.required === 'boolean') kept.required = given.required\n if (typeof given.kind === 'string' && /^[a-z-]{1,20}$/.test(given.kind)) kept.kind = given.kind\n return kept\n}\n\n/**\n * Design tokens as the W3C's Design Tokens format (DTCG 2025.10) writes them, read into a kit's:\n * `color.light` and `color.dark` groups (bg, surface, fg, muted, accent) or flat colours, `font.sans`\n * and the like; each `$value` a hex string or a colour object with its `hex`. Tokens already flat\n * pass through. @param {any} given @returns {Record<string, any>}\n */\nexport function tokensFrom(given) {\n if (!given || typeof given !== 'object') return {}\n if (!JSON.stringify(given).includes('\"$value\"')) return given\n const value = (/** @type {any} */ t) => (t && typeof t === 'object' && '$value' in t ? t.$value : t)\n const colour = (/** @type {any} */ t) => { const v = value(t); return typeof v === 'string' ? v : typeof v?.hex === 'string' ? v.hex : undefined }\n const face = (/** @type {any} */ t) => { const v = value(t); return Array.isArray(v) ? v.map(String) : typeof v === 'string' ? [v] : undefined }\n const NAMES = /** @type {const} */ ({ bg: 'paper', background: 'paper', paper: 'paper', fg: 'ink', text: 'ink', ink: 'ink', accent: 'primary', primary: 'primary', muted: 'muted', surface: 'soft', soft: 'soft' })\n const group = (/** @type {any} */ g) => Object.fromEntries(Object.entries(g ?? {}).filter(([k]) => k in NAMES).map(([k, t]) => [NAMES[/** @type {keyof typeof NAMES} */ (k)], colour(t)]).filter(([, v]) => v))\n const colours = given.color ?? given.colour ?? {}\n /** @type {Record<string, any>} */\n const tokens = { ...group(colours), ...group(colours.light) }\n const dark = group(colours.dark)\n if (Object.keys(dark).length) tokens.dark = dark\n const fonts = given.font ?? given.fontFamily ?? {}\n const heading = face(fonts.heading ?? fonts.display ?? fonts.sans), body = face(fonts.body ?? fonts.text ?? fonts.sans)\n if (heading || body) tokens.fonts = { heading: heading ?? body, body: body ?? heading }\n return tokens\n}\n\n/**\n * Kits merged, the later over the earlier: their tokens, their dark ones within theirs, and their layouts by name, each\n * checked; a layout given as false is taken away, but the default. A logo that isn't a picture inside the kit is dropped.\n * @param {...any} kits @returns {{ kit: Kit, problems: string[] }}\n */\nexport function mergeKits(...kits) {\n /** @type {Kit} */\n const kit = { name: 'standard', tokens: {}, layouts: { ...STANDARD.layouts } }\n const problems = []\n for (const given of kits) {\n if (!given || typeof given !== 'object') continue\n if (typeof given.name === 'string') kit.name = given.name\n if (given.tokens && typeof given.tokens === 'object') {\n const next = tokensFrom(given.tokens), dark = next.dark && typeof next.dark === 'object' ? { ...kit.tokens.dark, ...next.dark } : kit.tokens.dark\n kit.tokens = { ...kit.tokens, ...next, ...(dark && { dark }) }\n }\n for (const [name, definition] of Object.entries(given.layouts ?? given.types ?? {})) {\n if (!NAME.test(name)) { problems.push(`layout ${name}: not a-z, 0-9 and -`); continue }\n if (definition === false) { if (name !== 'default') delete kit.layouts[name]; continue }\n const { layout, problems: found } = layoutOf(definition)\n problems.push(...found.map((p) => `layout ${name}: ${p}`))\n if (layout) kit.layouts[name] = layout\n }\n }\n for (const [where, tokens] of /** @type {[string, Record<string, any> | undefined][]} */ ([['logo', kit.tokens], ['dark logo', kit.tokens.dark]])) {\n if (tokens?.logo !== undefined && !logoOf(tokens.logo)) { problems.push(`${where}: not a picture inside the kit (PNG, JPEG, GIF, WebP or SVG as data:, 512 KB at most)`); delete tokens.logo }\n }\n if (kit.tokens.logoAt !== undefined && !CORNERS.includes(kit.tokens.logoAt)) { problems.push(`logoAt ${kit.tokens.logoAt} is not one of ${CORNERS.join(', ')}`); delete kit.tokens.logoAt }\n return { kit, problems }\n}\n\n/** A layout's name in a language, else its own name. @param {Layout} layout @param {string} name @param {string} lang */\nexport function labelOf(layout, name, lang) {\n if (typeof layout.label === 'string') return layout.label\n return layout.label?.[lang] ?? layout.label?.[lang.split('-')[0]] ?? layout.label?.en ?? name\n}\n\n/**\n * The layout a slide that names none is given, from what it holds, as Pandoc's PowerPoint writer\n * chooses: the first slide is the cover; a heading alone, a section; slots beyond the first, the\n * layout of two (or three) columns that has them; a number alone as its heading, a fact; a quote\n * alone, a quote; else the default. @param {{ index: number, slots: { name: string, text: string }[] }} slide\n */\nexport function inferLayout(slide) {\n const names = slide.slots.map((slot) => slot.name)\n if (names.includes('middle')) return 'three-cols'\n if (names.includes('left')) return 'two-cols-header'\n if (names.includes('right')) return 'two-cols'\n if (slide.index === 0) return 'cover'\n const text = slide.slots.map((slot) => slot.text).join('\\n').trim()\n const lines = text.split('\\n').filter((line) => line.trim())\n if (lines.length === 1 && /^#{1,2}\\s+\\S/.test(lines[0])) return 'section'\n if (/^#\\s+[^\\s]*\\d[\\d\\s.,%€$£¥]*\\S*\\s*$/u.test(lines[0] ?? '') && lines.length <= 3 && !/^\\s*[-*\\d]+[.)]?\\s/m.test(lines.slice(1).join('\\n'))) return 'fact'\n if (lines.length && lines.every((line, i) => line.startsWith('>') || (i === lines.length - 1 && !line.startsWith('#')))) return lines[0].startsWith('>') ? 'quote' : 'default'\n return 'default'\n}\n", "// A slide drawn from its Markdown: marked's tokens made into elements with the DOM's own calls, so\n// nothing here needs innerHTML, a style attribute or a Trusted Types policy, and a page under any\n// policy can draw a deck. Each block that can be changed by hand says where its words are in the\n// source (data-edit, offsets), so an edit made on the slide goes back into the Markdown. HTML a\n// deck holds is not drawn: Slidev's <v-click> and <v-clicks> become steps, <br> a line break, and\n// any other tag gives up its words alone. ```echarts and ```mermaid go to the host's drawers.\nimport { STANDARD, CORNERS, inferLayout, ALIASES } from './kit.js'\n\n/** @typedef {import('./parse.js').Slide} Slide */\n/** @typedef {import('./parse.js').Slot} Slot */\n/** @typedef {(element: HTMLElement, source: string) => void | Promise<void>} Drawer */\n/** @typedef {{ blocks: Record<string, Drawer>, resolve: (src: string) => string | null, headings: 'real' | 'aria', number: (n: number) => string, total: number, kit: import('./kit.js').Kit, lex: (markdown: string) => any[], slide: string }} Context */\n\n/**\n * @param {string} tag @param {Record<string, string | number | boolean | undefined>} [attributes]\n * @param {(Node | string | null | undefined | false)[]} [children]\n */\nexport function h(tag, attributes = {}, children = []) {\n const element = document.createElement(tag)\n for (const [name, value] of Object.entries(attributes)) if (value !== undefined && value !== false) element.setAttribute(name, value === true ? '' : String(value))\n for (const child of children) if (child || child === '') element.append(child)\n return element\n}\n\n/** An address a slide may show: the web's, a picture held in the file, or one beside it. @param {string} href */\nexport function safeUrl(href) {\n const url = String(href ?? '').trim()\n if (/^(https?:|mailto:|blob:|#)/i.test(url) || /^data:image\\/(png|jpe?g|gif|webp|avif|svg\\+xml);/i.test(url)) return url\n if (/^[a-z][\\w+.-]*:/i.test(url)) return null\n return url\n}\n\n/**\n * A slide, laid out by its layout, with its slots, steps and number.\n * @param {Slide} slide @param {Context} context @returns {{ element: HTMLElement, steps: number }}\n */\nexport function renderSlide(slide, context) {\n // The layout the slide names, by its name or a name brains give it, else the one its content suits.\n const asked = String(slide.settings.layout ?? '').trim().toLowerCase()\n const layout = context.kit.layouts[asked] ? asked : context.kit.layouts[ALIASES[asked]] ? ALIASES[asked] : inferLayout(slide)\n const definition = context.kit.layouts[layout] ?? STANDARD.layouts.default\n const classes = String(slide.settings.class ?? '').split(/\\s+/).filter((name) => ['invert', 'text-center', 'text-left'].includes(name))\n const counter = { step: 0 }\n const slots = new Map(slide.slots.map((slot) => [slot.name, slot]))\n const names = definition.slots\n const section = h('section', {\n class: ['deck-slide', `deck-layout-${layout}`, ...classes.map((name) => `deck-class-${name}`)].join(' '),\n 'data-index': slide.index, 'data-layout': layout, 'data-paper': definition.paper, 'data-align': definition.align, 'data-justify': definition.justify, 'data-title': definition.title,\n 'aria-roledescription': context.slide, role: 'group',\n })\n // Its grid, from the layout's definition, through the CSSOM: areas named s-<slot>, as `default` is no name CSS allows.\n const canvas = h('div', { class: 'deck-canvas' })\n canvas.style.setProperty('grid-template-areas', definition.areas.map((row) => `\"${row.map((cell) => (cell === '.' ? '.' : `s-${cell}`)).join(' ')}\"`).join(' '))\n canvas.style.setProperty('grid-template-columns', definition.columns.join(' '))\n canvas.style.setProperty('grid-template-rows', definition.rows.join(' '))\n section.append(canvas)\n const image = slide.settings.image ?? slide.settings.background\n if (typeof image === 'string' && ['image-left', 'image-right', 'image', 'cover'].includes(layout)) {\n const url = context.resolve(image)\n if (url) {\n const picture = h('div', { class: 'deck-image', role: 'img', 'aria-label': String(slide.settings.alt ?? '') || undefined })\n picture.style.setProperty('--deck-image', `url(\"${url.replace(/[\"\\\\\\n]/g, encodeURIComponent)}\")`)\n canvas.append(picture)\n section.classList.add('has-image')\n }\n }\n for (const name of names) {\n const slot = slots.get(name)\n const element = h('div', { class: 'deck-slot', 'data-slot': name }, slot ? blocks(slot, context, counter) : [])\n element.style.setProperty('grid-area', `s-${name}`)\n canvas.append(element)\n }\n // Slots a layout doesn't have still show, under the rest, rather than being lost.\n for (const slot of slide.slots) if (!names.includes(slot.name)) canvas.append(h('div', { class: 'deck-slot', 'data-slot': slot.name }, blocks(slot, context, counter)))\n if (definition.numbered && slide.settings.paginate !== false) section.append(h('span', { class: 'deck-number', 'aria-hidden': 'true' }, [context.number(slide.index + 1)]))\n // The kit's logo in its corner, small, or big where the layout says (a cover, the end); its dark one beside it, which the\n // stylesheet shows on dark paper, where without one the logo sits on a light plate.\n const { logo, logoAt, dark } = context.kit.tokens, at = CORNERS.includes(logoAt) ? logoAt : CORNERS[0]\n if (logo && definition.logo !== 'none') {\n for (const [src, kind] of [[logo, dark?.logo ? 'has-dark' : ''], [dark?.logo, 'is-dark']]) {\n if (src) section.append(h('img', { class: `deck-logo ${kind}`.trim(), src, alt: '', 'aria-hidden': 'true', 'data-size': definition.logo, 'data-at': at }))\n }\n }\n return { element: section, steps: counter.step }\n}\n\n/** @param {Slot} slot @param {Context} context @param {{ step: number }} counter @returns {Node[]} */\nfunction blocks(slot, context, counter) {\n const tokens = context.lex(slot.text)\n /** @type {Node[]} */\n const out = []\n let at = slot.start, mode = /** @type {'' | 'click' | 'clicks'} */ ('')\n for (const token of tokens) {\n const start = at\n at += token.raw.length\n // Pandoc's fences: `::: incremental` shows its list a point a click, as <v-clicks> does; the others, nothing.\n const fences = token.type === 'paragraph' ? token.raw.trim().split('\\n').map((/** @type {string} */ line) => line.trim()) : []\n if (fences.length && fences.every((/** @type {string} */ line) => /^:{3,}/.test(line))) {\n for (const fence of fences) {\n if (/^:{3,}[ \\t]*\\{?[ \\t]*\\.?incremental\\b/.test(fence)) mode = 'clicks'\n else if (/^:{3,}\\s*$/.test(fence) && mode === 'clicks') mode = ''\n }\n continue\n }\n if (token.type === 'html') {\n const tag = /^\\s*<(\\/?)(v-clicks?|br)\\b[^>]*>\\s*$/i.exec(token.raw)\n if (tag && tag[2] === 'br') out.push(h('br'))\n else if (tag) mode = tag[1] ? '' : /** @type {'click' | 'clicks'} */ (tag[2].toLowerCase() === 'v-clicks' ? 'clicks' : 'click')\n else if (/<li\\b/i.test(token.raw)) {\n // A list written as HTML, as brains write Slidev's steps (<li v-click>): its items' words, each\n // a step when it asks to be one.\n const list = h(/<ol\\b/i.test(token.raw) ? 'ol' : 'ul', { dir: 'auto' })\n for (const [, attrs, inner] of token.raw.matchAll(/<li\\b([^>]*)>([\\s\\S]*?)(?=<\\/li>|<li\\b|<\\/[ou]l>|$)/gi)) {\n const words = inner.replace(/<!--[\\s\\S]*?-->/g, '').replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim()\n if (!words) continue\n const li = h('li', { dir: 'auto' }, [words])\n if (/\\bv-click\\b/.test(attrs) || mode === 'clicks') step(li, ++counter.step)\n list.append(li)\n }\n if (list.childElementCount) out.push(list)\n } else {\n const words = token.raw.replace(/<!--[\\s\\S]*?-->/g, '').replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim()\n if (words) out.push(h('p', {}, [words]))\n }\n continue\n }\n const element = block(token, start, context, mode === 'clicks' ? counter : null)\n if (!element) continue\n if (mode === 'click' || (mode === 'clicks' && token.type !== 'list')) step(element, ++counter.step)\n out.push(element)\n }\n return out\n}\n\n/** @param {Element} element @param {number} n */\nconst step = (element, n) => { element.classList.add('deck-step'); element.setAttribute('data-step', String(n)) }\n\n/**\n * @param {any} token @param {number} start where its raw starts in the source\n * @param {Context} context @param {{ step: number } | null} stepped list items each a step\n * @returns {HTMLElement | null}\n */\nfunction block(token, start, context, stepped) {\n switch (token.type) {\n case 'heading': {\n const head = /^\\s*#{1,6}[ \\t]+/.exec(token.raw)\n const edit = head ? range(start + head[0].length, start + token.raw.replace(/\\s*#*\\s*$/, '').length) : undefined\n return context.headings === 'real'\n ? h(`h${token.depth}`, { dir: 'auto', 'data-edit': edit }, inline(token.tokens, context))\n : h('p', { class: `deck-h deck-h${token.depth}`, role: 'heading', 'aria-level': Math.min(6, token.depth + 2), dir: 'auto', 'data-edit': edit }, inline(token.tokens, context))\n }\n case 'paragraph': {\n const lone = token.tokens.length === 1 && token.tokens[0].type === 'image'\n return h('p', { dir: 'auto', class: lone ? 'deck-picture' : undefined, 'data-edit': lone ? undefined : range(start, start + token.raw.trimEnd().length) }, inline(token.tokens, context))\n }\n case 'text': return h('p', { dir: 'auto' }, inline(token.tokens ?? [{ type: 'text', text: token.text }], context))\n // No dir=auto here: the browser would skip its paragraphs, which have their own, and find no letter.\n case 'blockquote': return h('blockquote', {}, children(token.tokens, start, token.raw, context))\n case 'list': {\n let from = 0\n const list = h(token.ordered ? 'ol' : 'ul', { start: token.ordered && token.start !== 1 ? token.start : undefined, class: token.items.some((/** @type {any} */ item) => item.task) ? 'deck-tasks' : undefined })\n for (const item of token.items) {\n const offset = token.raw.indexOf(item.raw, from)\n from = offset + item.raw.length\n const itemStart = start + Math.max(0, offset)\n const marker = /^\\s*(?:[-*+]|\\d+[.)])\\s+(?:\\[[ xX]\\]\\s+)?/.exec(item.raw)\n const simple = item.tokens.length === 1 && item.tokens[0].type === 'text' && !/\\n\\s*\\S/.test(item.raw.trim().split('\\n').slice(1).join('\\n'))\n const li = h('li', { dir: 'auto', 'data-edit': simple && marker ? range(itemStart + marker[0].length, itemStart + item.raw.trimEnd().length) : undefined }, [\n item.task ? h('input', { type: 'checkbox', checked: item.checked, disabled: true, 'aria-label': item.text }) : null,\n ...item.tokens.flatMap((/** @type {any} */ inner) => inner.type === 'text' ? inline(inner.tokens ?? [{ type: 'text', text: inner.text }], context)\n : [block(inner, itemStart + Math.max(0, item.raw.indexOf(inner.raw)), context, null)]),\n ])\n if (stepped) step(li, ++stepped.step)\n list.append(li)\n }\n return list\n }\n case 'code': {\n const info = /^(\\S*)\\s*(?:\\{([^}]*)\\})?/.exec(token.lang ?? '') ?? []\n const lang = (info[1] ?? '').toLowerCase()\n const drawer = context.blocks[lang]\n if (drawer) {\n const box = h('div', { class: `deck-block deck-${lang}`, 'data-source': token.text })\n box.append(h('pre', { class: 'deck-block-source', dir: 'ltr' }, [h('code', {}, [token.text])]))\n queueMicrotask(() => Promise.resolve(drawer(box, token.text)).catch(() => box.classList.add('is-failed')))\n return box\n }\n const marked = lines(info[2] ?? '')\n const code = h('code', { class: lang ? `language-${lang}` : undefined })\n for (const [i, line] of token.text.split('\\n').entries()) code.append(h('span', { class: marked.has(i + 1) ? 'deck-line is-marked' : 'deck-line' }, [line, '\\n']))\n return h('pre', { dir: 'ltr', class: marked.size ? 'has-marks' : undefined, tabindex: 0 }, [code])\n }\n case 'table': {\n const align = (/** @type {string | null} */ a) => a ?? undefined\n return h('div', { class: 'deck-table' }, [h('table', {}, [\n h('thead', {}, [h('tr', {}, token.header.map((/** @type {any} */ cell, /** @type {number} */ i) => h('th', { 'data-align': align(token.align[i]), dir: 'auto' }, inline(cell.tokens, context))))]),\n h('tbody', {}, token.rows.map((/** @type {any[]} */ row) => h('tr', {}, row.map((cell, i) => h('td', { 'data-align': align(token.align[i]), dir: 'auto' }, inline(cell.tokens, context)))))),\n ])])\n }\n default: return null\n }\n}\n\n/** @param {any[]} tokens @param {number} start @param {string} raw @param {Context} context */\nfunction children(tokens, start, raw, context) {\n let from = 0\n return tokens.map((token) => {\n const offset = raw.indexOf(token.raw, from)\n from = Math.max(from, offset + token.raw.length)\n return block(token, start + Math.max(0, offset), context, null)\n })\n}\n\n/** Line numbers as Slidev marks them, `{2,4-5}`; `|` steps are read as all their lines at once. @param {string} text */\nfunction lines(text) {\n const marked = new Set()\n for (const part of text.split(/[,|]/)) {\n const [a, b] = part.split('-').map((n) => parseInt(n, 10))\n if (Number.isFinite(a)) for (let n = a; n <= (Number.isFinite(b) ? b : a); n++) marked.add(n)\n }\n return marked\n}\n\n/** @param {number} from @param {number} to */\nconst range = (from, to) => (to > from ? `${from}-${to}` : undefined)\n\n/** @param {any[]} tokens @param {Context} context @returns {Node[]} */\nexport function inline(tokens = [], context) {\n return tokens.flatMap((token) => {\n switch (token.type) {\n case 'text': case 'escape': return token.tokens ? inline(token.tokens, context) : [token.text.replace(/&(amp|lt|gt|quot|#39);/g, (/** @type {string} */ _, /** @type {string} */ e) => ({ amp: '&', lt: '<', gt: '>', quot: '\"', '#39': \"'\" })[/** @type {'amp'} */ (e)])]\n case 'strong': return [h('strong', {}, inline(token.tokens, context))]\n case 'em': return [h('em', {}, inline(token.tokens, context))]\n case 'del': return [h('del', {}, inline(token.tokens, context))]\n case 'codespan': return [h('code', {}, [token.text.replace(/&(amp|lt|gt|quot|#39);/g, (/** @type {string} */ _, /** @type {string} */ e) => ({ amp: '&', lt: '<', gt: '>', quot: '\"', '#39': \"'\" })[/** @type {'amp'} */ (e)])])]\n case 'br': return [h('br')]\n case 'link': {\n const href = safeUrl(token.href)\n return href ? [h('a', { href, rel: 'noopener noreferrer', target: href.startsWith('#') ? undefined : '_blank' }, inline(token.tokens, context))] : inline(token.tokens, context)\n }\n case 'image': {\n const src = context.resolve(token.href)\n return src ? [h('img', { src, alt: token.text, loading: 'lazy' })] : [token.text]\n }\n case 'html': return /^<br\\s*\\/?>$/i.test(token.raw) ? [h('br')] : []\n default: return token.text ? [token.text] : []\n }\n })\n}\n", "// A deck's look: a design system's few tokens (paper, ink, primary, a voice for its type), from a\n// named look, then the project's, then the deck's own `themeConfig`, as Slidev names a theme's\n// settings. Light and dark are both worked out from them: each colour kept at its hue, deepened or\n// lightened until it reads at AA on the paper it sits on (4.5:1 for words, 3:1 for a chart's\n// marks), so a brain's or a person's colours can't make a slide unreadable. Pure.\n\n/** @typedef {{ paper: string, ink: string, primary: string, voice: string, radius: number, muted?: string, soft?: string, series?: string[], dark?: Record<string, string>, fonts?: { heading: string[], body: string[] } }} Tokens */\n/** @typedef {{ paper: string, ink: string, muted: string, line: string, primary: string, onPrimary: string, soft: string, series: string[] }} Scheme */\n\n/** Looks a deck can name (`theme:`), each a handful of tokens. */\nexport const LOOKS = /** @type {Record<string, Tokens>} */ ({\n default: { paper: '#fffdf8', ink: '#1d1b16', primary: '#f7c531', voice: 'calm', radius: 10 },\n ocean: { paper: '#f6fafb', ink: '#0d2530', primary: '#0f766e', voice: 'calm', radius: 6 },\n ember: { paper: '#fff8f3', ink: '#2a160c', primary: '#d9480f', voice: 'bold', radius: 2 },\n ink: { paper: '#ffffff', ink: '#111111', primary: '#3b5bdb', voice: 'elegant', radius: 0 },\n})\n\n/** Type for each voice: the device's faces, so a deck needs nothing to download to look right. */\nexport const VOICES = /** @type {Record<string, { heading: string, body: string }>} */ ({\n calm: { heading: 'ui-sans-serif, system-ui, \"Segoe UI\", Roboto, \"Noto Sans\", sans-serif', body: 'ui-sans-serif, system-ui, \"Segoe UI\", Roboto, \"Noto Sans\", sans-serif' },\n elegant: { heading: 'ui-serif, \"Iowan Old Style\", Georgia, \"Noto Serif\", serif', body: 'ui-sans-serif, system-ui, \"Segoe UI\", Roboto, sans-serif' },\n bold: { heading: '\"Avenir Next Condensed\", \"Arial Narrow\", ui-sans-serif, system-ui, sans-serif', body: 'ui-sans-serif, system-ui, \"Segoe UI\", Roboto, sans-serif' },\n friendly: { heading: 'ui-rounded, \"SF Pro Rounded\", \"Nunito\", system-ui, sans-serif', body: 'ui-rounded, \"SF Pro Rounded\", system-ui, sans-serif' },\n})\n\n/**\n * The tokens a deck's settings give, over the project's look and a named one.\n * @param {Record<string, any>} settings @param {Partial<Tokens>} [project]\n * @returns {Tokens}\n */\nexport function tokensOf(settings, project = {}) {\n const named = LOOKS[String(settings.theme ?? '')] ?? LOOKS.default\n const own = typeof settings.themeConfig === 'object' && settings.themeConfig ? settings.themeConfig : {}\n /** @type {Tokens} */\n const tokens = { ...named, ...clean(project), ...clean(own) }\n if (!VOICES[tokens.voice]) tokens.voice = 'calm'\n return tokens\n}\n\n/** @param {Record<string, any>} given @returns {Partial<Tokens>} */\nfunction clean(given) {\n /** @type {Partial<Tokens>} */\n const kept = {}\n for (const key of /** @type {const} */ (['paper', 'ink', 'primary', 'muted', 'soft'])) if (typeof given[key] === 'string' && hex(given[key])) kept[key] = given[key]\n if (given.dark && typeof given.dark === 'object') kept.dark = Object.fromEntries(Object.entries(given.dark).filter(([, v]) => typeof v === 'string' && hex(v)))\n if (given.fonts && Array.isArray(given.fonts.heading) && Array.isArray(given.fonts.body)) kept.fonts = { heading: given.fonts.heading.map(String), body: given.fonts.body.map(String) }\n if (typeof given.voice === 'string') kept.voice = given.voice\n if (typeof given.radius === 'number') kept.radius = given.radius\n if (Array.isArray(given.series) && given.series.length && given.series.every((/** @type {unknown} */ c) => typeof c === 'string' && hex(c))) kept.series = given.series.slice(0, 6)\n return kept\n}\n\n/**\n * Light or dark, worked out from the tokens: dark swaps paper and ink and lifts the primary.\n * @param {Tokens} tokens @param {'light' | 'dark'} scheme @returns {Scheme}\n */\nexport function schemeOf(tokens, scheme) {\n const light = hex(tokens.paper) ?? [255, 253, 248], dark = hex(tokens.ink) ?? [29, 27, 22]\n // A kit's own dark colours where it gives them (a design system's dark mode), else worked out.\n const own = scheme === 'dark' ? tokens.dark ?? {} : {}\n const paper = round(hex(own.paper ?? '') ?? (scheme === 'dark' ? mix(dark, [0, 0, 0], 0.35) : light))\n const ink = round(hex(own.ink ?? '') ?? (scheme === 'dark' ? mix(light, [255, 255, 255], 0.2) : dark))\n const primary = hex(own.primary ?? tokens.primary) ?? [247, 197, 49]\n // The primary as a fill keeps its own colour; as words or marks it is made to read on the paper.\n const text = readable(primary, paper, 4.5)\n const onPrimary = contrast(ink, primary) >= contrast(paper, primary) ? ink : paper\n // A chart's colours: the kit's own (a template's accents), else the primary turned round the wheel; each made to read at 3:1.\n const given = (tokens.series ?? []).map(hex).filter((c) => c !== null)\n const series = [0, 1, 2, 3, 4, 5].map((n) => readable(/** @type {number[]} */ (given[n % (given.length || 1)] ?? rotate(primary, n * 57)), paper, 3))\n return {\n paper: css(paper), ink: css(ink), muted: css(readable(round(hex(own.muted ?? (scheme === 'light' ? tokens.muted ?? '' : '')) ?? mix(ink, paper, 0.38)), paper, 4.5)), line: css(mix(ink, paper, 0.82)),\n primary: css(text), onPrimary: css(onPrimary), soft: css(hex(own.soft ?? (scheme === 'light' ? tokens.soft ?? '' : '')) ?? mix(primary, paper, 0.78)), series: series.map(css),\n }\n}\n\n/** @param {string} value @returns {[number, number, number] | null} */\nexport function hex(value) {\n const m = /^#?([\\da-f]{3}|[\\da-f]{6})$/i.exec(String(value).trim())\n if (!m) return null\n const h = m[1].length === 3 ? [...m[1]].map((c) => c + c).join('') : m[1]\n return /** @type {[number, number, number]} */ ([0, 2, 4].map((i) => parseInt(h.slice(i, i + 2), 16)))\n}\n\n/** @param {number[]} rgb */\nexport const css = (rgb) => `#${rgb.map((c) => Math.round(Math.max(0, Math.min(255, c))).toString(16).padStart(2, '0')).join('')}`\n\n/** A colour as it will be written: whole numbers, so that it reads at the ratio checked. @param {number[]} c */\nconst round = (c) => /** @type {[number, number, number]} */ (c.map((v) => Math.round(Math.max(0, Math.min(255, v)))))\n\n/** @param {number[]} a @param {number[]} b @param {number} t */\nconst mix = (a, b, t) => /** @type {[number, number, number]} */ (a.map((c, i) => c + (b[i] - c) * t))\n\n/** @param {number[]} rgb */\nfunction luminance(rgb) {\n const [r, g, b] = rgb.map((c) => { const s = c / 255; return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4 })\n return 0.2126 * r + 0.7152 * g + 0.0722 * b\n}\n\n/** WCAG's contrast ratio. @param {number[]} a @param {number[]} b */\nexport function contrast(a, b) {\n const [x, y] = [luminance(a), luminance(b)].sort((p, q) => q - p)\n return (x + 0.05) / (y + 0.05)\n}\n\n/**\n * The colour, its hue kept, deepened or lightened toward black or white until it reads at the\n * ratio on the paper. @param {number[]} colour @param {number[]} paper @param {number} ratio\n */\nexport function readable(colour, paper, ratio) {\n const toward = luminance(paper) > 0.18 ? [0, 0, 0] : [255, 255, 255]\n let t = 0, out = round(colour)\n while (contrast(out, paper) < ratio && t < 1) out = round(mix(colour, toward, (t = Math.min(1, t + 0.02))))\n return out\n}\n\n/** The colour turned round the colour wheel. @param {number[]} rgb @param {number} degrees */\nfunction rotate(rgb, degrees) {\n const [r, g, b] = rgb.map((c) => c / 255)\n const max = Math.max(r, g, b), min = Math.min(r, g, b), l = (max + min) / 2\n const d = max - min\n const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1))\n let h = d === 0 ? 0 : max === r ? ((g - b) / d) % 6 : max === g ? (b - r) / d + 2 : (r - g) / d + 4\n h = (h * 60 + degrees + 360) % 360\n const c = (1 - Math.abs(2 * l - 1)) * Math.max(s, 0.55), x = c * (1 - Math.abs(((h / 60) % 2) - 1)), m = l - c / 2\n const [p, q, u] = h < 60 ? [c, x, 0] : h < 120 ? [x, c, 0] : h < 180 ? [0, c, x] : h < 240 ? [0, x, c] : h < 300 ? [x, 0, c] : [c, 0, x]\n return [p + m, q + m, u + m].map((v) => v * 255)\n}\n", "// The deck's own words, for a deck opened on its own; a host gives its own instead (options.strings).\nconst STRINGS = /** @type {Record<string, Record<string, string>>} */ ({\n en: { deck: 'Slides', slide: 'slide', carousel: 'carousel', previous: 'Previous', next: 'Next', present: 'Present full screen', presenter: 'Presenter view', overview: 'All slides', edit: 'Change', scheme: 'Light or dark', export: 'Save as PowerPoint', source: 'The deck as text', notes: 'Notes', noNotes: 'No notes for this slide.', upNext: 'Next', last: 'Last slide', where: 'Slide {n} of {count}', saved: 'Saved' },\n fr: { deck: 'Diapositives', slide: 'diapositive', carousel: 'carrousel', previous: 'Précédente', next: 'Suivante', present: 'Présenter en plein écran', presenter: 'Vue présentateur', overview: 'Toutes les diapositives', edit: 'Modifier', scheme: 'Clair ou sombre', export: 'Enregistrer en PowerPoint', source: 'La présentation en texte', notes: 'Notes', noNotes: 'Pas de notes pour cette diapositive.', upNext: 'Ensuite', last: 'Dernière diapositive', where: 'Diapositive {n} sur {count}', saved: 'Enregistré' },\n ar: { deck: 'الشرائح', slide: 'شريحة', carousel: 'عرض شرائح', previous: 'السابقة', next: 'التالية', present: 'العرض بملء الشاشة', presenter: 'عرض المقدّم', overview: 'كل الشرائح', edit: 'تعديل', scheme: 'فاتح أو داكن', export: 'الحفظ بصيغة PowerPoint', source: 'العرض كنص', notes: 'الملاحظات', noNotes: 'لا ملاحظات لهذه الشريحة.', upNext: 'التالية', last: 'الشريحة الأخيرة', where: 'الشريحة {n} من {count}', saved: 'تم الحفظ' },\n ja: { deck: 'スライド', slide: 'スライド', carousel: 'カルーセル', previous: '前へ', next: '次へ', present: '全画面で発表', presenter: '発表者ビュー', overview: 'すべてのスライド', edit: '編集', scheme: 'ライトまたはダーク', export: 'PowerPoint で保存', source: 'テキストとしてのスライド', notes: 'メモ', noNotes: 'このスライドにメモはありません。', upNext: '次', last: '最後のスライド', where: 'スライド {n} / {count}', saved: '保存しました' },\n})\n\n/** @param {string} lang */\nexport const stringsFor = (lang) => STRINGS[lang.split('-')[0].toLowerCase()] ?? STRINGS.en\n", "// A deck on a page: its slides drawn into the element given, paged with the bar, the keys a\n// presenter's clicker sends, a click or a swipe; each step shown in turn; moved between with the\n// transition its settings name, through the View Transitions API; presented full screen, with\n// the presenter's view (this slide, the next, the notes, the time) and all slides at once; light\n// or dark; changed as Markdown beside the slides, or in place on a slide, live. Host-agnostic:\n// the host gives the drawers of ```echarts and ```mermaid, how a picture's address resolves, its\n// words, how a slide's Markdown is read (its own marked, with its extensions), and what to do when\n// the deck changes or is saved.\nimport { parseDeck } from './parse.js'\nimport { renderSlide, h } from './render.js'\nimport { tokensOf, schemeOf, VOICES, hex, contrast } from './look.js'\nimport { mergeKits } from './kit.js'\nimport { stringsFor } from './strings.js'\nimport { Lexer } from 'marked'\n\n/** @typedef {import('./parse.js').Deck} Deck */\n/**\n * @typedef {{\n * source: string, lang?: string, dir?: string, kit?: Record<string, any>, scheme?: 'light' | 'dark' | 'auto',\n * blocks?: Record<string, import('./render.js').Drawer>, resolve?: (src: string) => string | null,\n * strings?: Record<string, string>, headings?: 'real' | 'aria', editable?: boolean, lex?: (markdown: string) => any[],\n * onChange?: (source: string) => void, onSave?: (source: string) => void, onExport?: (deck: DeckView) => void,\n * }} Options\n */\n\nconst RTL = /^(ar|he|fa|ur|ps|sd|ug|yi|dv|ckb)\\b/i\nconst ICONS = {\n back: 'M15 5l-7 7 7 7', next: 'M9 5l7 7-7 7', present: 'M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5',\n presenter: 'M3 5h12v9H3zM18 8h3M18 12h3M6 19h6', grid: 'M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4zM14 14h6v6h-6z',\n edit: 'M4 20h4L19 9l-4-4L4 16zM13.5 6.5l4 4', scheme: 'M12 3a9 9 0 1 0 9 9 7 7 0 0 1-9-9z', export: 'M12 4v11M7 10l5 5 5-5M5 20h14',\n}\n\n/** @param {string} name */\nfunction icon(name) {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('viewBox', '0 0 24 24')\n svg.setAttribute('aria-hidden', 'true')\n if (name === 'back' || name === 'next') svg.setAttribute('class', 'deck-flip')\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n path.setAttribute('d', ICONS[/** @type {keyof typeof ICONS} */ (name)])\n svg.append(path)\n return svg\n}\n\n/** @typedef {ReturnType<typeof createDeck>} DeckView */\n\n/** @param {HTMLElement} root @param {Options} options */\nexport function createDeck(root, options) {\n let source = options.source.replace(/\\r\\n?/g, '\\n')\n let deck = parseDeck(source)\n let at = 0, stepAt = 0\n /** @type {{ element: HTMLElement, steps: number }[]} */\n let drawn = []\n const lang = String(options.lang ?? deck.settings.lang ?? document.documentElement.lang ?? 'en') || 'en'\n const dir = String(options.dir ?? deck.settings.dir ?? (RTL.test(lang) ? 'rtl' : 'ltr'))\n const words = { ...stringsFor(lang), ...options.strings }\n const number = new Intl.NumberFormat(lang).format\n const dark = matchMedia('(prefers-color-scheme: dark)')\n let scheme = /** @type {'light' | 'dark'} */ ('light')\n const started = Date.now()\n\n root.classList.add('deck')\n root.lang = lang\n root.dir = dir\n const stage = h('div', { class: 'deck-stage', tabindex: 0, role: 'region', 'aria-roledescription': words.carousel, 'aria-label': words.deck })\n const where = h('span', { class: 'deck-where', 'aria-live': 'polite' })\n const button = (/** @type {string} */ name, /** @type {string} */ label, /** @type {() => void} */ act) => {\n const b = h('button', { type: 'button', 'aria-label': label, 'data-act': name }, [icon(name)])\n b.addEventListener('click', act)\n return b\n }\n const back = button('back', words.previous, () => move(-1))\n const next = button('next', words.next, () => move(1))\n const editButton = button('edit', words.edit, () => toggle('is-editing'))\n const presenterButton = button('presenter', words.presenter, () => toggle('is-presenting'))\n const overviewButton = button('grid', words.overview, () => toggle('is-overview'))\n const bar = h('div', { class: 'deck-bar' }, [back, where, next, h('span', { class: 'deck-gap' }),\n overviewButton, presenterButton, options.editable === false ? null : editButton,\n button('scheme', words.scheme, () => { scheme = scheme === 'dark' ? 'light' : 'dark'; paintLook() }),\n options.onExport ? button('export', words.export, () => options.onExport?.(view)) : null,\n document.fullscreenEnabled ? button('present', words.present, () => present()) : null])\n const sourceBox = /** @type {HTMLTextAreaElement} */ (h('textarea', { class: 'deck-source', spellcheck: 'false', 'aria-label': words.source, dir: 'auto' }))\n const nextBox = h('div', { class: 'deck-next' })\n const notes = h('div', { class: 'deck-notes', dir: 'auto', 'aria-label': words.notes })\n const clock = h('span', { class: 'deck-clock' })\n const presenter = h('div', { class: 'deck-presenter' }, [nextBox, notes])\n root.replaceChildren(sourceBox, stage, presenter, bar)\n bar.insertBefore(clock, bar.querySelector('.deck-gap'))\n\n // The kit: deck's own, under the host's (an organisation's, a project's), under the file's own.\n let kitProblems = /** @type {string[]} */ ([])\n const kitOf = () => {\n const merged = mergeKits(options.kit, deck.settings.kit)\n kitProblems = merged.problems\n return merged.kit\n }\n\n function paintLook() {\n context.kit = kitOf()\n const tokens = tokensOf(deck.settings, context.kit.tokens)\n const colours = schemeOf(tokens, scheme)\n const stack = (/** @type {string[]} */ faces) => faces.map((f) => (/^[\\w-]+$/.test(f) ? f : `\"${f.replace(/[\"\\\\]/g, '')}\"`)).join(', ')\n const voice = tokens.fonts ? { heading: stack(tokens.fonts.heading), body: stack(tokens.fonts.body) } : VOICES[tokens.voice]\n for (const [name, value] of Object.entries({\n paper: colours.paper, ink: colours.ink, muted: colours.muted, line: colours.line, primary: colours.primary,\n fill: tokens.primary, 'on-fill': colours.onPrimary, soft: colours.soft, heading: voice.heading, body: voice.body, radius: `${tokens.radius}px`,\n ...Object.fromEntries(colours.series.map((colour, n) => [`series-${n + 1}`, colour])),\n })) root.style.setProperty(`--deck-${name}`, value)\n root.dataset.scheme = scheme\n // Whether the primary as a fill is dark, for a logo's dark one there.\n root.dataset.fill = ((fill) => (contrast(fill, [255, 255, 255]) > contrast(fill, [0, 0, 0]) ? 'dark' : 'light'))(hex(tokens.primary) ?? [247, 197, 49])\n root.dispatchEvent(new CustomEvent('deck-scheme', { detail: { scheme, colours, tokens } }))\n }\n const chooseScheme = () => {\n const asked = options.scheme ?? deck.settings.colorSchema ?? 'auto'\n scheme = asked === 'dark' || (asked === 'auto' && dark.matches) ? 'dark' : 'light'\n }\n\n /** @type {import('./render.js').Context} */\n const context = {\n blocks: options.blocks ?? {}, resolve: options.resolve ?? ((src) => src), headings: options.headings ?? 'real', number: (n) => number(n), total: 0, kit: mergeKits().kit,\n lex: options.lex ?? ((markdown) => new Lexer({ gfm: true }).lex(markdown)), slide: words.slide,\n }\n\n function draw() {\n context.total = deck.slides.length\n drawn = deck.slides.map((slide) => renderSlide(slide, context))\n for (const [i, { element }] of drawn.entries()) {\n element.setAttribute('aria-label', words.where.replace('{n}', number(i + 1)).replace('{count}', number(drawn.length)))\n element.addEventListener('click', () => { if (root.classList.contains('is-overview')) { toggle('is-overview'); go(i, 0) } })\n }\n stage.replaceChildren(...drawn.map(({ element }) => element))\n at = Math.min(at, drawn.length - 1)\n show()\n requestAnimationFrame(() => fitAll())\n }\n\n /** Each slot's type shrunk, down to six tenths, until it holds what it says; a slide still over is marked. */\n function fitAll() {\n for (const { element } of drawn) fit(element)\n }\n /** @param {HTMLElement} slide */\n function fit(slide) {\n let over = false\n for (const slot of /** @type {NodeListOf<HTMLElement>} */ (slide.querySelectorAll('.deck-slot'))) {\n let scale = 1\n slot.style.setProperty('--deck-fit', '1')\n while (slot.scrollHeight > slot.clientHeight + 1 && scale > 0.6) slot.style.setProperty('--deck-fit', String((scale = Math.round((scale - 0.05) * 100) / 100)))\n if (slot.scrollHeight > slot.clientHeight + 1) over = true\n }\n if (over) slide.dataset.overflow = 'true'\n else delete slide.dataset.overflow\n }\n\n function show() {\n for (const [i, { element, steps }] of drawn.entries()) {\n element.classList.toggle('is-shown', i === at)\n element.inert = i !== at && !root.classList.contains('is-overview')\n for (const one of element.querySelectorAll('.deck-step')) one.classList.toggle('is-on', i < at || (i === at && Number(one.getAttribute('data-step')) <= stepAt) || steps === 0)\n }\n where.textContent = `${number(at + 1)} / ${number(drawn.length)}`\n back.toggleAttribute('disabled', at === 0 && stepAt === 0)\n next.toggleAttribute('disabled', at >= drawn.length - 1 && stepAt >= (drawn[at]?.steps ?? 0))\n notes.textContent = deck.slides[at]?.notes || words.noNotes\n const following = deck.slides[at + 1]\n nextBox.replaceChildren(h('span', {}, [following ? words.upNext : words.last]), ...(following ? [renderSlide(following, context).element] : []))\n root.dispatchEvent(new CustomEvent('deck-move', { detail: { at, step: stepAt } }))\n }\n\n /** A click on, or the next key: the next step, else the next slide. @param {number} by */\n function move(by) {\n const steps = drawn[at]?.steps ?? 0\n if (by > 0 && stepAt < steps) { stepAt++; show(); return }\n if (by < 0 && stepAt > 0) { stepAt--; show(); return }\n const to = at + by\n if (to < 0 || to >= drawn.length) return\n go(to, by > 0 ? 0 : drawn[to].steps)\n }\n\n /** @param {number} to @param {number} [toStep] */\n function go(to, toStep = 0) {\n if (to === at) { stepAt = toStep; show(); return }\n const forward = to > at\n const settings = deck.slides[forward ? to : at]?.settings ?? {}\n const named = String(settings.transition ?? deck.settings.transition ?? 'none')\n // Slidev's `a | b`: one going forward, the other going back.\n const [ahead, behind] = named.split('|').map((part) => part.trim())\n let kind = forward ? ahead : behind ?? ahead\n if (dir === 'rtl') kind = kind.replace(/-(left|right)$/, (_, side) => (side === 'left' ? '-right' : '-left'))\n if (kind === 'view-transition') kind = 'morph'\n const update = () => { at = to; stepAt = toStep; if (kind === 'morph') name(drawn[to].element); show() }\n const reduced = matchMedia('(prefers-reduced-motion: reduce)').matches\n if (!document.startViewTransition || kind === 'none' || reduced || root.classList.contains('is-overview')) return update()\n if (kind === 'morph') name(drawn[at].element, drawn[to].element)\n document.documentElement.dataset.deckTransition = kind\n const transition = document.startViewTransition(update)\n // A transition skipped by the next one, as a clicker pressed twice does, is no error.\n transition.ready.catch(() => {})\n transition.finished.finally(() => {\n delete document.documentElement.dataset.deckTransition\n for (const { element } of drawn) for (const one of element.querySelectorAll('[data-morph]')) { /** @type {HTMLElement} */ (one).style.removeProperty('view-transition-name'); one.removeAttribute('data-morph') }\n })\n }\n\n /**\n * Morph, as Keynote's Magic Move and PowerPoint's Morph do it, with nothing to write: what two\n * slides share (a heading's words, a list item's, a picture, a chart) gets one name on each,\n * so the browser moves it from where it was to where it goes. Called with the slide shown and\n * the next, then with the next alone once it shows. @param {HTMLElement} slide @param {HTMLElement} [toward]\n */\n function name(slide, toward) {\n const key = (/** @type {Element} */ el) => `${el.tagName}:${el.tagName === 'IMG' ? el.getAttribute('src') : (el.textContent ?? '').trim().slice(0, 80)}`\n const parts = (/** @type {HTMLElement} */ s) => /** @type {HTMLElement[]} */ ([...s.querySelectorAll('h1, h2, h3, h4, .deck-h, li, p, img, .deck-block, blockquote, .deck-image')])\n if (toward) {\n const there = new Map(parts(toward).map((el) => [key(el), el]))\n let n = 0\n for (const el of parts(slide)) {\n const match = there.get(key(el))\n if (!match || match.dataset.morph || el.closest('[data-morph]')) continue\n const id = `deck-m${n++}`\n el.dataset.morph = match.dataset.morph = id\n el.style.setProperty('view-transition-name', id)\n }\n return\n }\n for (const el of /** @type {NodeListOf<HTMLElement>} */ (slide.querySelectorAll('[data-morph]'))) {\n const id = /** @type {string} */ (el.dataset.morph)\n for (const old of /** @type {NodeListOf<HTMLElement>} */ (stage.querySelectorAll(`[data-morph=\"${id}\"]`))) if (old !== el) old.style.removeProperty('view-transition-name')\n el.style.setProperty('view-transition-name', id)\n }\n }\n\n /** @param {string} mode */\n function toggle(mode) {\n for (const other of ['is-editing', 'is-presenting', 'is-overview']) if (other !== mode) root.classList.remove(other)\n root.classList.toggle(mode)\n editButton.setAttribute('aria-pressed', String(root.classList.contains('is-editing')))\n presenterButton.setAttribute('aria-pressed', String(root.classList.contains('is-presenting')))\n overviewButton.setAttribute('aria-pressed', String(root.classList.contains('is-overview')))\n if (root.classList.contains('is-editing')) { sourceBox.value = source; sourceBox.focus() }\n show()\n requestAnimationFrame(() => fitAll())\n }\n\n function present() {\n stage.requestFullscreen?.().then(() => stage.focus(), () => {})\n }\n\n /** The source changed, by the Markdown or on a slide: read again, drawn again, where the user is. @param {string} text */\n function setSource(text) {\n source = text.replace(/\\r\\n?/g, '\\n')\n deck = parseDeck(source)\n paintLook()\n draw()\n options.onChange?.(source)\n }\n\n // Changed as Markdown: drawn again as the user types, the slide under the caret shown.\n let pending = 0\n sourceBox.addEventListener('input', (event) => {\n if (/** @type {InputEvent} */ (event).isComposing) return\n clearTimeout(pending)\n pending = setTimeout(() => setSource(sourceBox.value), 120)\n })\n const followCaret = () => {\n const caret = sourceBox.selectionStart\n const found = deck.slides.findIndex((slide) => caret >= slide.start && caret <= slide.end + 1)\n if (found >= 0 && found !== at) { at = found; stepAt = drawn[found]?.steps ?? 0; show() }\n }\n sourceBox.addEventListener('keyup', followCaret)\n sourceBox.addEventListener('click', followCaret)\n\n // Changed in place: a double click on words makes them editable; Enter or leaving keeps them.\n stage.addEventListener('dblclick', (event) => {\n if (options.editable === false || document.fullscreenElement) return\n const target = /** @type {HTMLElement | null} */ (/** @type {Element} */ (event.target).closest('[data-edit]'))\n if (!target) return\n const [from, to] = /** @type {string} */ (target.dataset.edit).split('-').map(Number)\n target.contentEditable = 'true'\n target.focus()\n const done = (/** @type {boolean} */ keep) => {\n target.removeEventListener('keydown', key)\n target.removeEventListener('blur', blur)\n target.contentEditable = 'false'\n const words = markdownOf(target)\n if (keep && words !== source.slice(from, to)) setSource(source.slice(0, from) + words + source.slice(to))\n else draw()\n }\n const key = (/** @type {KeyboardEvent} */ e) => {\n if (e.isComposing) return\n if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); done(true) }\n if (e.key === 'Escape') { e.preventDefault(); done(false) }\n }\n const blur = () => done(true)\n target.addEventListener('keydown', key)\n target.addEventListener('blur', blur)\n })\n\n // The keys a clicker sends, and the deck's own.\n root.addEventListener('keydown', (event) => {\n const target = /** @type {HTMLElement} */ (event.target)\n if (target.isContentEditable || target === sourceBox || (target.tagName === 'BUTTON' && (event.key === ' ' || event.key === 'Enter'))) {\n if ((event.metaKey || event.ctrlKey) && event.key === 's') { event.preventDefault(); options.onSave?.(source) }\n return\n }\n const forward = dir === 'rtl' ? 'ArrowLeft' : 'ArrowRight', backward = dir === 'rtl' ? 'ArrowRight' : 'ArrowLeft'\n if (event.altKey || event.ctrlKey || event.metaKey) {\n if ((event.metaKey || event.ctrlKey) && event.key === 's') { event.preventDefault(); options.onSave?.(source) }\n return\n }\n const acts = /** @type {Record<string, () => void>} */ ({\n [forward]: () => move(1), [backward]: () => move(-1), ArrowDown: () => move(1), ArrowUp: () => move(-1), PageDown: () => move(1), PageUp: () => move(-1), ' ': () => move(1),\n Home: () => go(0), End: () => go(drawn.length - 1, drawn.at(-1)?.steps ?? 0), f: present, p: () => toggle('is-presenting'), o: () => toggle('is-overview'), e: () => toggle('is-editing'),\n })\n const act = acts[event.key]\n if (!act) return\n event.preventDefault()\n act()\n })\n stage.addEventListener('click', (event) => {\n if (document.fullscreenElement && !(/** @type {Element} */ (event.target).closest('a, button, input'))) move(1)\n })\n let touch = 0\n stage.addEventListener('touchstart', (event) => { touch = event.touches[0].clientX }, { passive: true })\n stage.addEventListener('touchend', (event) => {\n const dx = event.changedTouches[0].clientX - touch\n if (Math.abs(dx) > 50) move((dx < 0) === (dir !== 'rtl') ? 1 : -1)\n })\n dark.addEventListener('change', () => { chooseScheme(); paintLook() })\n const tick = setInterval(() => {\n const s = Math.floor((Date.now() - started) / 1000)\n clock.textContent = root.classList.contains('is-presenting') ? `${String(Math.floor(s / 60)).padStart(2, '0')}:${String(s % 60).padStart(2, '0')}` : ''\n }, 1000)\n\n chooseScheme()\n paintLook()\n draw()\n document.fonts?.ready.then(() => fitAll())\n\n const view = {\n root, stage, get source() { return source }, get deck() { return deck }, get at() { return at }, get scheme() { return scheme }, get kit() { return context.kit }, get kitProblems() { return kitProblems }, lang, dir,\n slides: () => drawn.map(({ element }) => element), setSource, go, toggle, present, fitAll,\n setScheme: (/** @type {'light' | 'dark'} */ value) => { scheme = value; paintLook() },\n destroy: () => clearInterval(tick),\n }\n return view\n}\n\n/** The Markdown of words changed in place: bold, italics, code and links kept as Markdown writes them. @param {Node} node @returns {string} */\nexport function markdownOf(node) {\n let out = ''\n for (const child of node.childNodes) {\n if (child.nodeType === Node.TEXT_NODE) out += (child.textContent ?? '').replace(/([*_`[\\]\\\\])/g, '\\\\$1')\n else if (child instanceof HTMLElement) {\n const inner = markdownOf(child)\n out += ({ STRONG: `**${inner}**`, B: `**${inner}**`, EM: `*${inner}*`, I: `*${inner}*`, CODE: `\\`${child.textContent}\\``, DEL: `~~${inner}~~`, BR: ' \\n',\n A: `[${inner}](${child.getAttribute('href') ?? ''})` })[child.tagName] ?? inner\n }\n }\n return out.replace(/ /g, ' ').replace(/\\n+$/, '')\n}\n", "// deck's version, which a linked file names in its renderer's address. Kept equal to package.json's by a test.\nexport const VERSION = '0.2.0'\n", "// A deck file, `.deck.html`: a web page any browser opens, whose Markdown sits whole in one\n// element, <script type=\"text/markdown\" id=\"deck\">, which no browser runs. Read and written here\n// as text, never parsed as HTML, so a host can read a deck without running anything in it.\n// The one escape: `<script` and `</script`, in any case, gain a backslash after their `<` (and\n// one more for each already there), which reading takes away again: the HTML parser ends the\n// element at `</script`, and a `<script` after `<!--` would keep it from ending. Pure.\n\nimport { VERSION } from './version.js'\n\nexport const OPEN = '<script type=\"text/markdown\" id=\"deck\">'\nconst CLOSE = '</script>'\n\n/** @param {string} markdown */\nexport const escape = (markdown) => markdown.replace(/<(\\\\*)(\\/?script)/gi, '<\\\\$1$2')\n/** @param {string} text */\nexport const unescape = (text) => text.replace(/<\\\\(\\\\*)(\\/?script)/gi, '<$1$2')\n\n/** @param {string} text */\nconst attribute = (text) => text.replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;')\n/** @param {string} text */\nconst content = (text) => text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n\n/**\n * Code held whole in the file: `</script`, `<script` and `<!--`, which only a string or a regular\n * expression of a bundle holds, written with `\\x3C` for their `<`, which reads the same there.\n * @param {string} code\n */\nexport function inlineCode(code) {\n if (/\\\\<(!--|\\/?script)/i.test(code)) throw new Error('This code cannot be held in a page as it is.')\n return code.replace(/<(!--|\\/?script)/gi, '\\\\x3C$1')\n}\n\n/**\n * A deck's Markdown, from a file's text, or null when it holds none.\n * @param {string} html @returns {string | null}\n */\nexport function readDeckFile(html) {\n const at = html.indexOf(OPEN)\n if (at < 0) return null\n const from = at + OPEN.length\n const end = html.slice(from).search(/<\\/script/i)\n if (end < 0) return null\n return unescape(html.slice(from, from + end).replace(/^\\n/, '').replace(/\\n$/, ''))\n}\n\n/** Where a linked file finds its renderer: this version of the package, on jsDelivr's npm mirror. @param {string} [version] */\nexport const rendererUrl = (version = VERSION) => `https://cdn.jsdelivr.net/npm/@codename/deck@${version}/dist/deck.js`\n\n/**\n * A deck file around its Markdown: its title, language and direction in the page's head for\n * whatever reads it before the renderer does, then the Markdown, in the body (the head is never shown), readable as it is when no\n * renderer comes, then the renderer: linked by default, to this version's address, or held whole;\n * `base` tells it where to load the libraries a slide needs (a CDN's npm mirror, or a node_modules).\n * @param {string} markdown\n * @param {{ title?: string, lang?: string, dir?: string, renderer?: { src: string } | { code: string }, base?: string, generator?: string }} [options]\n */\nexport function writeDeckFile(markdown, { title = '', lang = 'en', dir = 'auto', renderer = { src: rendererUrl() }, base, generator = `deck ${VERSION}` } = {}) {\n const data = base ? ` data-base=\"${attribute(base)}\"` : ''\n const script = 'src' in renderer ? `<script src=\"${attribute(renderer.src)}\"${data}></script>` : `<script${data}>${inlineCode(renderer.code)}</script>`\n return /* html */ `<!doctype html>\n<html lang=\"${attribute(lang)}\" dir=\"${attribute(dir)}\">\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<meta name=\"generator\" content=\"${attribute(generator)}\">\n<title>${content(title)}</title>\n<style>#deck{display:block;white-space:pre-wrap;overflow-wrap:anywhere;font:1rem/1.6 ui-monospace,Menlo,Consolas,monospace;max-width:72ch;margin:2rem auto;padding:0 1rem}</style>\n<body>\n${OPEN}\n${escape(markdown)}\n${CLOSE}\n${script}\n</html>\n`\n}\n", "// A deck as a PowerPoint file to change in PowerPoint, Keynote or Google Slides: each layout a\n// slide layout of its own (a master, in PptxGenJS's words) with a placeholder for its title and\n// each of its slots, so a slide added there looks like the deck's; words as PowerPoint's own text,\n// a list's levels as its levels; a table as a table; a chart of bars, lines, areas, pies, rings,\n// points or a radar as PowerPoint's own chart, its numbers in the file to change; anything else (a\n// diagram, another chart, a picture) as a picture; the speaker's notes as notes; each slide's\n// transition as PowerPoint's (Morph where it has one, a fade where it hasn't); the look's colours\n// as the file's theme. Read from the deck as drawn, each box where the browser put it, so the file\n// looks like the slides, in the scheme shown. PptxGenJS (with its JSZip) is the host's to load.\n\nimport { labelOf } from './kit.js'\n\nconst W = 13.333, H = 7.5\n// Words: a paragraph that is a picture alone on its line is the picture.\nconst TEXT = 'h1, h2, h3, h4, h5, h6, .deck-h, p:not(.deck-picture), ul, ol, blockquote'\n\n/** @param {string} value rgb(…) or #… @returns {string} six hex digits */\nfunction hexOf(value) {\n const m = /rgba?\\(\\s*([\\d.]+)[,\\s]+([\\d.]+)[,\\s]+([\\d.]+)/.exec(value)\n if (m) return [m[1], m[2], m[3]].map((n) => Math.round(Number(n)).toString(16).padStart(2, '0')).join('').toUpperCase()\n return value.replace('#', '').toUpperCase().slice(0, 6) || '000000'\n}\n/** @param {string} value */\nconst opaque = (value) => !/rgba\\([^)]*,\\s*0\\)|transparent/.test(value)\n\n/**\n * @param {import('./deck.js').DeckView} view\n * @param {{ PptxGenJS: any, JSZip: any }} libraries\n * @returns {Promise<{ blob: Blob, report: { slides: number, charts: number, pictures: number, tables: number, placeholders: number } }>}\n */\nexport async function toPptx(view, { PptxGenJS, JSZip }) {\n const pres = new PptxGenJS()\n pres.layout = 'LAYOUT_WIDE'\n pres.title = view.deck.slides[0]?.title ?? ''\n pres.rtlMode = view.dir === 'rtl'\n const rootStyle = getComputedStyle(view.root)\n const firstFont = (/** @type {string} */ stack) => stack.split(',').map((f) => f.trim().replace(/^[\"']|[\"']$/g, '')).find((f) => !/^(ui-|system-ui|-apple|sans-serif|serif|monospace)/.test(f)) ?? 'Arial'\n pres.theme = { headFontFace: firstFont(rootStyle.getPropertyValue('--deck-heading')), bodyFontFace: firstFont(rootStyle.getPropertyValue('--deck-body')) }\n const report = { slides: 0, charts: 0, pictures: 0, tables: 0, placeholders: 0 }\n const rtl = view.dir === 'rtl'\n const slides = view.slides()\n const masters = new Map()\n const transitions = []\n\n for (const [i, element] of slides.entries()) {\n const box = element.getBoundingClientRect()\n const sx = W / box.width\n const place = (/** @type {Element} */ el) => {\n const r = el.getBoundingClientRect()\n return { x: (r.left - box.left) * sx, y: (r.top - box.top) * sx, w: r.width * sx, h: r.height * sx }\n }\n // Words as wide as their slot, never as their line: PowerPoint sets type a little wider than a browser.\n const across = (/** @type {Element} */ el) => {\n const slot = el.closest('.deck-slot') ?? el\n const { x, w } = place(slot), { y, h } = place(el)\n const pad = getComputedStyle(slot)\n const start = parseFloat(pad.paddingInlineStart) * sx, end = parseFloat(pad.paddingInlineEnd) * sx\n return { x: x + (rtl ? end : start), y, w: w - start - end, h: h * 1.08 }\n }\n // Where a layout centres its words, PowerPoint's box centres them too.\n const anchor = (/** @type {Element} */ slot) => (getComputedStyle(slot).justifyContent === 'center' ? 'middle' : 'top')\n const pt = (/** @type {number} */ px) => Math.round(px * sx * 72 * 10) / 10\n const style = getComputedStyle(element)\n const layout = element.dataset.layout ?? 'default'\n const slots = /** @type {HTMLElement[]} */ ([...element.querySelectorAll('.deck-slot')])\n const firstBlock = slots[0]?.firstElementChild\n const title = firstBlock && firstBlock.matches('h1, h2, h3, .deck-h') ? firstBlock : null\n\n // One master a layout, its placeholders where the first slide of it has its title and slots.\n // Named as the kit names the layout, in the deck's language, so PowerPoint's Layout menu reads it.\n const definition = view.kit.layouts[layout]\n const masterName = `${definition ? labelOf(definition, layout, view.lang) : layout}${element.classList.contains('deck-class-invert') ? ' (dark)' : ''}`\n if (!masters.has(masterName)) {\n const objects = []\n if (title) objects.push({ placeholder: { options: { name: 'title', type: 'title', ...across(title), valign: 'bottom', margin: 0, fontFace: pres.theme.headFontFace, color: hexOf(getComputedStyle(title).color), align: rtl ? 'right' : 'left' }, text: '' } })\n for (const slot of slots) {\n const r = place(slot)\n const top = title && slot === slots[0] ? place(title).y + place(title).h : r.y\n const inner = slot.firstElementChild && slot.firstElementChild !== title ? across(slot.firstElementChild) : { x: r.x, w: r.w }\n objects.push({ placeholder: { options: { name: `body-${slot.dataset.slot}`, type: 'body', x: inner.x, y: top + 0.08, w: inner.w, h: Math.max(0.3, r.y + r.h - top - 0.08), margin: 0, valign: anchor(slot), color: hexOf(getComputedStyle(slot).color) }, text: '' } })\n }\n // The kit's logo as the slide shows it, the one that reads on its paper, on the master: a slide added in PowerPoint has it too.\n const logo = /** @type {HTMLImageElement | undefined} */ ([...element.querySelectorAll('.deck-logo')].find((one) => getComputedStyle(one).display !== 'none'))\n const mark = logo && await pictureOf(logo.src, logo.clientWidth * 3, logo.clientHeight * 3)\n if (logo && mark) { objects.push({ image: { data: mark, ...place(logo) } }); report.pictures++ }\n pres.defineSlideMaster({\n title: masterName, background: { color: hexOf(style.backgroundColor) }, objects,\n slideNumber: definition?.numbered !== false ? { x: rtl ? 0.3 : W - 0.9, y: H - 0.55, w: 0.6, h: 0.3, fontSize: 10, color: hexOf(rootStyle.getPropertyValue('--deck-muted').trim() || '#666666') } : undefined,\n })\n masters.set(masterName, new Set(objects.flatMap((o) => (o.placeholder ? [o.placeholder.options.name] : []))))\n }\n const names = masters.get(masterName)\n const slide = pres.addSlide({ masterName })\n report.slides++\n\n const background = element.querySelector('.deck-image')\n if (background) {\n const url = /url\\(\"?(.*?)\"?\\)/.exec(getComputedStyle(background).backgroundImage)?.[1]\n const data = url && await pictureOf(url, background.clientWidth * 2, background.clientHeight * 2, true)\n if (data) { slide.addImage({ data, ...place(background) }); report.pictures++ }\n }\n if (title && names.has('title')) {\n slide.addText(runs(title, { pt, rtl, lang: view.lang }), { placeholder: 'title' })\n report.placeholders++\n }\n for (const slot of slots) {\n const blocks = [...slot.children].filter((child) => child !== title)\n const textOnly = blocks.length > 0 && blocks.every((child) => child.matches(TEXT))\n if (textOnly && names.has(`body-${slot.dataset.slot}`)) {\n slide.addText(blocks.flatMap((block) => runs(block, { pt, rtl, lang: view.lang })), { placeholder: `body-${slot.dataset.slot}`, valign: anchor(slot), ...(spaced(slot)) })\n report.placeholders++\n continue\n }\n for (const block of blocks) {\n const at = place(block)\n if (block.matches(TEXT)) slide.addText(runs(block, { pt, rtl, lang: view.lang }), { ...across(block), valign: 'top', margin: 0, ...(spaced(slot)) })\n else if (block.matches('pre')) {\n slide.addText(block.textContent?.replace(/\\n$/, '') ?? '', { ...at, fontFace: 'Consolas', fontSize: pt(parseFloat(getComputedStyle(block).fontSize)), color: hexOf(getComputedStyle(block).color), fill: { color: hexOf(getComputedStyle(block).backgroundColor) }, valign: 'top', margin: 6, rtlMode: false, align: 'left' })\n } else if (block.matches('.deck-table')) {\n table(slide, block, at, { pt, rtl, lang: view.lang })\n report.tables++\n } else if (block.matches('.deck-echarts') && /** @type {any} */ (block).chart) {\n const chart = /** @type {any} */ (block).chart\n if (nativeChart(pres, slide, chart, at, { pt, rtl, lang: view.lang, ink: hexOf(style.color) })) report.charts++\n else { slide.addImage({ data: await pictureOf(`data:image/svg+xml;charset=utf-8,${encodeURIComponent(chart.renderToSVGString())}`, at.w / sx * 2, at.h / sx * 2), ...at }); report.pictures++ }\n } else {\n const img = block.querySelector('img')\n if (img) {\n // A slide's pictures are read as they come near the screen: one not read yet is read now, so that it has its size.\n if (!img.complete) { img.loading = 'eager'; await img.decode().catch(() => {}) }\n const data = await pictureOf(img.src, img.clientWidth * 2, img.clientHeight * 2)\n if (data) { slide.addImage({ data, ...place(img), altText: img.alt }); report.pictures++ }\n }\n }\n }\n }\n const notes = view.deck.slides[i]?.notes\n if (notes) slide.addNotes(notes)\n const settings = view.deck.slides[i]?.settings ?? {}\n transitions.push(String(settings.transition ?? view.deck.settings.transition ?? 'none').split('|')[0].trim())\n }\n\n // What PptxGenJS doesn't write: each slide's transition, and the look's colours as the theme.\n const zip = await JSZip.loadAsync(await pres.write({ outputType: 'arraybuffer', compression: true }))\n for (const [i, kind] of transitions.entries()) {\n const path = `ppt/slides/slide${i + 1}.xml`\n const xml = await zip.file(path)?.async('string')\n if (!xml || kind === 'none') continue\n zip.file(path, xml.replace(/<\\/p:clrMapOvr>|(?=<p:timing|<\\/p:sld>)/, (/** @type {string} */ found) => `${found}${transitionXml(kind, rtl)}`))\n }\n const theme = await zip.file('ppt/theme/theme1.xml')?.async('string')\n if (theme) {\n const colour = (/** @type {string} */ name) => hexOf(rootStyle.getPropertyValue(`--deck-${name}`).trim())\n const series = [colour('fill'), ...[2, 3, 4, 5, 6].map((n) => colour(`series-${n}`))]\n const scheme = /* xml */ `<a:clrScheme name=\"Deck\"><a:dk1><a:srgbClr val=\"${colour('ink')}\"/></a:dk1><a:lt1><a:srgbClr val=\"${colour('paper')}\"/></a:lt1><a:dk2><a:srgbClr val=\"${colour('ink')}\"/></a:dk2><a:lt2><a:srgbClr val=\"${colour('soft')}\"/></a:lt2>${series.map((c, n) => `<a:accent${n + 1}><a:srgbClr val=\"${c}\"/></a:accent${n + 1}>`).join('')}<a:hlink><a:srgbClr val=\"${colour('primary')}\"/></a:hlink><a:folHlink><a:srgbClr val=\"${colour('primary')}\"/></a:folHlink></a:clrScheme>`\n zip.file('ppt/theme/theme1.xml', theme.replace(/<a:clrScheme[\\s\\S]*?<\\/a:clrScheme>/, scheme))\n }\n const blob = await zip.generateAsync({ type: 'blob', compression: 'DEFLATE', mimeType: 'application/vnd.openxmlformats-officedocument.presentationml.presentation' })\n return { blob, report }\n}\n\n/** A slot's paragraphs' spacing, from the space under its first block. @param {HTMLElement} slot */\nfunction spaced(slot) {\n const first = slot.firstElementChild\n const after = first ? parseFloat(getComputedStyle(first).marginBlockEnd) : 0\n return { paraSpaceAfter: Math.round(after * 0.5) }\n}\n\n/**\n * A block's words as PowerPoint's runs: each paragraph or list item ends its line; bold, italics,\n * code and links kept; a list's level as its indent level.\n * @param {Element} block @param {{ pt: (px: number) => number, rtl: boolean, lang: string }} how @returns {any[]}\n */\nfunction runs(block, how) {\n /** @type {any[]} */\n const out = []\n const paragraph = (/** @type {Element} */ el, /** @type {Record<string, any>} */ extra) => {\n const style = getComputedStyle(el)\n const base = { fontSize: how.pt(parseFloat(style.fontSize)), color: hexOf(style.color), bold: Number(style.fontWeight) >= 600, lang: how.lang, rtlMode: how.rtl, align: style.textAlign === 'center' ? 'center' : how.rtl ? 'right' : 'left', ...extra }\n const pieces = inlineRuns(el, base)\n if (!pieces.length) return\n pieces[pieces.length - 1].options.breakLine = true\n out.push(...pieces)\n }\n const list = (/** @type {Element} */ el, /** @type {number} */ level) => {\n let n = 0\n for (const li of el.children) {\n n++\n const nested = [...li.children].filter((c) => c.matches('ul, ol'))\n const clone = /** @type {Element} */ (li.cloneNode(true))\n for (const c of [...clone.children]) if (c.matches('ul, ol, input')) c.remove()\n li.after(clone)\n paragraph(clone, { bullet: el.tagName === 'OL' ? { type: 'number', startAt: n === 1 ? Number(el.getAttribute('start') ?? 1) : undefined } : true, indentLevel: level })\n clone.remove()\n for (const sub of nested) list(sub, level + 1)\n }\n }\n if (block.matches('ul, ol')) list(block, 0)\n else if (block.matches('blockquote')) for (const p of block.children) paragraph(p, { italic: getComputedStyle(p).fontStyle === 'italic' })\n else paragraph(block, {})\n return out\n}\n\n/** @param {Node} node @param {Record<string, any>} base @returns {any[]} */\nfunction inlineRuns(node, base) {\n /** @type {any[]} */\n const out = []\n const walk = (/** @type {Node} */ n, /** @type {Record<string, any>} */ options) => {\n if (n.nodeType === Node.TEXT_NODE) {\n const text = (n.textContent ?? '').replace(/\\s+/g, ' ')\n if (text) out.push({ text, options: { ...options } })\n return\n }\n if (!(n instanceof HTMLElement)) return\n if (n.tagName === 'BR') { if (out.length) out[out.length - 1].options.breakLine = true; return }\n const own = { ...options }\n if (n.matches('strong, b')) { own.bold = true; own.color = hexOf(getComputedStyle(n).color) }\n if (n.matches('em, i')) own.italic = true\n if (n.matches('del, s')) own.strike = 'sngStrike'\n if (n.matches('code')) own.fontFace = 'Consolas'\n if (n.matches('a[href]')) own.hyperlink = { url: n.getAttribute('href') }\n for (const child of n.childNodes) walk(child, own)\n }\n for (const child of node.childNodes) walk(child, base)\n if (out.length) { out[0].text = out[0].text.trimStart(); out[out.length - 1].text = out[out.length - 1].text.trimEnd() }\n return out.filter((run) => run.text)\n}\n\n/** @param {any} slide @param {Element} block @param {{ x: number, y: number, w: number, h: number }} at @param {{ pt: (px: number) => number, rtl: boolean, lang: string }} how */\nfunction table(slide, block, at, how) {\n const rows = [...block.querySelectorAll('tr')].map((tr) => [...tr.children].map((cell) => {\n const style = getComputedStyle(cell)\n const align = cell.getAttribute('data-align')\n return { text: cell.textContent?.trim() ?? '', options: {\n bold: cell.tagName === 'TH', fontSize: how.pt(parseFloat(style.fontSize)), color: hexOf(style.color), lang: how.lang, rtlMode: how.rtl,\n align: align === 'center' ? 'center' : (align === 'right') !== how.rtl ? 'right' : 'left',\n border: [{ type: 'none' }, { type: 'none' }, { type: 'solid', pt: cell.tagName === 'TH' ? 1.5 : 0.75, color: hexOf(style.borderBlockEndColor) }, { type: 'none' }],\n } }\n }))\n const widths = [...(block.querySelector('tr')?.children ?? [])].map((cell) => cell.getBoundingClientRect().width)\n const total = widths.reduce((a, b) => a + b, 0) || 1\n slide.addTable(how.rtl ? rows.map((r) => r.reverse()) : rows, { ...at, colW: (how.rtl ? widths.reverse() : widths).map((w) => (w / total) * at.w), margin: 0.06 })\n}\n\n/**\n * An ECharts chart as PowerPoint's own, when it is one PowerPoint draws: bars, lines, areas, a pie\n * or a ring, points, a radar; false when it isn't. @returns {boolean}\n */\nfunction nativeChart(/** @type {any} */ pres, /** @type {any} */ slide, /** @type {any} */ chart, /** @type {{ x: number, y: number, w: number, h: number }} */ at, /** @type {{ pt: (px: number) => number, rtl: boolean, lang: string, ink: string }} */ how) {\n const option = chart.getOption()\n const series = /** @type {any[]} */ (option.series ?? [])\n if (!series.length) return false\n const types = new Set(series.map((s) => s.type))\n const colours = /** @type {string[]} */ (option.color ?? []).map(hexOf)\n const value = (/** @type {any} */ v) => (Array.isArray(v) ? Number(v.at(-1)) : typeof v === 'object' && v !== null ? Number(v.value) : Number(v))\n const common = { ...at, showLegend: series.length > 1 || types.has('pie'), legendPos: 'b', legendFontSize: 12, legendColor: how.ink, chartColors: colours, showTitle: Boolean(option.title?.[0]?.text), title: option.title?.[0]?.text, titleFontSize: 16, titleColor: how.ink, catAxisLabelColor: how.ink, valAxisLabelColor: how.ink, dataLabelColor: how.ink, lang: how.lang }\n if (types.size === 1 && (types.has('pie'))) {\n const pie = series[0]\n const ring = Array.isArray(pie.radius) && parseFloat(pie.radius[0]) > 0\n slide.addChart(ring ? pres.charts.DOUGHNUT : pres.charts.PIE, [{ name: pie.name ?? '', labels: pie.data.map((/** @type {any} */ d) => d.name), values: pie.data.map(value) }], { ...common, showPercent: true, showLegend: true, holeSize: ring ? 55 : undefined })\n return true\n }\n if ([...types].every((t) => t === 'bar' || t === 'line')) {\n const horizontal = option.yAxis?.[0]?.type === 'category'\n const labels = (horizontal ? option.yAxis : option.xAxis)?.[0]?.data ?? []\n const of = (/** @type {any} */ s) => [{ name: s.name ?? '', labels: labels.map(String), values: s.data.map(value) }]\n const kind = (/** @type {any} */ s) => (s.type === 'bar' ? pres.charts.BAR : s.areaStyle ? pres.charts.AREA : pres.charts.LINE)\n const axes = { catAxisLabelFontSize: 11, valAxisLabelFontSize: 11, valGridLine: { color: 'D9D9D9', size: 0.5 }, catAxisOrientation: how.rtl && !horizontal ? 'maxMin' : 'minMax', valAxisLabelFormatCode: '#,##0' }\n if (types.size === 1) {\n const data = series.flatMap(of)\n slide.addChart(kind(series[0]), data, { ...common, ...axes, barDir: horizontal ? 'bar' : 'col', barGrouping: series.some((s) => s.stack) ? 'stacked' : 'clustered', lineDataSymbol: 'circle', lineSize: 2 })\n } else slide.addChart(series.map((s) => ({ type: kind(s), data: of(s), options: { barDir: horizontal ? 'bar' : 'col', chartColors: [colours[series.indexOf(s) % colours.length]] } })), { ...common, ...axes })\n return true\n }\n if (types.size === 1 && types.has('scatter')) {\n const points = series[0].data.map((/** @type {any} */ d) => (Array.isArray(d) ? d : [d.value?.[0], d.value?.[1]]))\n slide.addChart(pres.charts.SCATTER, [{ name: 'X', values: points.map((/** @type {any[]} */ p) => p[0]) }, { name: series[0].name ?? 'Y', values: points.map((/** @type {any[]} */ p) => p[1]) }], { ...common, lineSize: 0, lineDataSymbolSize: 8 })\n return true\n }\n if (types.size === 1 && types.has('radar')) {\n const indicators = option.radar?.[0]?.indicator ?? []\n slide.addChart(pres.charts.RADAR, series[0].data.map((/** @type {any} */ d) => ({ name: d.name ?? '', labels: indicators.map((/** @type {any} */ i) => i.name), values: d.value })), { ...common, showLegend: true, radarStyle: 'standard' })\n return true\n }\n return false\n}\n\n/** PowerPoint's transition for Slidev's name: Morph (with a fade where it isn't known), a fade, a push. @param {string} kind @param {boolean} rtl */\nfunction transitionXml(kind, rtl) {\n const push = (/** @type {string} */ dir) => `<p:transition spd=\"med\"><p:push dir=\"${dir}\"/></p:transition>`\n if (kind === 'view-transition' || kind === 'morph') return '<mc:AlternateContent xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"><mc:Choice xmlns:p159=\"http://schemas.microsoft.com/office/powerpoint/2015/09/main\" Requires=\"p159\"><p:transition spd=\"slow\"><p159:morph option=\"byObject\"/></p:transition></mc:Choice><mc:Fallback><p:transition spd=\"slow\"><p:fade/></p:transition></mc:Fallback></mc:AlternateContent>'\n if (kind === 'slide-left') return push(rtl ? 'r' : 'l')\n if (kind === 'slide-right') return push(rtl ? 'l' : 'r')\n if (kind === 'slide-up') return push('u')\n if (kind === 'slide-down') return push('d')\n return '<p:transition spd=\"med\"><p:fade/></p:transition>'\n}\n\n/** A picture's data as PNG, drawn at a size; null when it can't be read (another site's, unshared). @param {string} src @param {number} w @param {number} h @param {boolean} [cover] */\nasync function pictureOf(src, w, h, cover = false) {\n try {\n const img = new Image()\n img.crossOrigin = 'anonymous'\n img.src = src\n await img.decode()\n const canvas = document.createElement('canvas')\n canvas.width = Math.max(1, Math.round(w))\n canvas.height = Math.max(1, Math.round(h))\n const ctx = /** @type {CanvasRenderingContext2D} */ (canvas.getContext('2d'))\n const iw = img.naturalWidth || w, ih = img.naturalHeight || h\n const scale = cover ? Math.max(canvas.width / iw, canvas.height / ih) : Math.min(canvas.width / iw, canvas.height / ih)\n ctx.drawImage(img, (canvas.width - iw * scale) / 2, (canvas.height - ih * scale) / 2, iw * scale, ih * scale)\n return canvas.toDataURL('image/png')\n } catch {\n return null\n }\n}\n", "// The drawers a deck opened on its own uses for ```echarts and ```mermaid, each library loaded\n// from `base` (a CDN by default) the first time a slide needs it, never before. A chart is data,\n// read with JSON.parse; it takes the deck's colours and type, light or dark, and is drawn as SVG.\n// A diagram is drawn by Pele from Mermaid's language as SVG, then shown as a picture, so nothing it\n// makes runs or joins the page; its words are its picture's text for whoever can't see it. A host gives\n// its own drawers instead.\n\n/** @typedef {{ base: string, root: HTMLElement, versions?: { echarts?: string, pele?: string } }} Where */\n\n/** @type {Map<string, Promise<any>>} */\nconst loading = new Map()\n\n/** A classic script, loaded once: from a file:// page, modules from elsewhere are not always let in. @param {string} src @param {string} global */\nfunction script(src, global) {\n if (!loading.has(src)) loading.set(src, new Promise((resolve, reject) => {\n const tag = document.createElement('script')\n tag.src = src\n tag.onload = () => resolve(/** @type {any} */ (globalThis)[global])\n tag.onerror = reject\n document.head.append(tag)\n }))\n return /** @type {Promise<any>} */ (loading.get(src))\n}\n\n/**\n * A library's file: from a CDN's npm mirror, at its version (`https://…/npm/name@1.2.3/file`), or from a\n * node_modules folder, which holds one version (`…/node_modules/name/file`).\n * @param {string} base @param {string} name @param {string} version @param {string} file\n */\nexport const libraryAt = (base, name, version, file) => (/node_modules\\/$/.test(base) ? `${base}${name}/${file}` : `${base}${name}@${version}/${file}`)\n\n/** @param {Where} where */\nexport function defaultBlocks({ base, root, versions = {} }) {\n const { echarts: chartsAt = '6.1.0', pele: diagramsAt = '1.10.0' } = versions\n /** @type {Set<{ chart: any, option: any, box: HTMLElement }>} */\n const charts = new Set()\n /** @type {any} */\n let colours = null\n root.addEventListener('deck-scheme', (event) => {\n colours = /** @type {CustomEvent} */ (event).detail.colours\n for (const one of charts) one.chart.setOption(themed(one.option, one.box), true)\n })\n // Its type sized with the slide's, its category axis read from the right in a language written so.\n const themed = (/** @type {any} */ option, /** @type {HTMLElement} */ box) => {\n const size = parseFloat(getComputedStyle(box).fontSize) || 16\n const rtl = getComputedStyle(box).direction === 'rtl'\n const small = Math.round(size * 0.6)\n const axis = (/** @type {any} */ given, /** @type {boolean} */ across) => given === undefined ? undefined : [given].flat().map((one) => ({\n axisLabel: { color: colours?.muted, fontSize: small }, axisLine: { lineStyle: { color: colours?.line } }, splitLine: { lineStyle: { color: colours?.line } },\n nameTextStyle: { color: colours?.muted, fontSize: small }, ...(rtl && across && one.type === 'category' ? { inverse: true } : {}), ...(rtl && !across ? { position: 'right' } : {}), ...one,\n }))\n return {\n color: colours?.series, backgroundColor: 'transparent', animation: !matchMedia('(prefers-reduced-motion: reduce)').matches,\n textStyle: { fontFamily: getComputedStyle(root).getPropertyValue('--deck-body') || 'system-ui', color: colours?.ink, fontSize: small },\n ...option,\n title: option.title ? { ...option.title, textStyle: { color: colours?.ink, fontSize: Math.round(size * 0.8), ...option.title?.textStyle } } : undefined,\n legend: option.legend ? { itemWidth: small * 1.6, itemHeight: small, ...option.legend, textStyle: { color: colours?.ink, fontSize: small, ...option.legend?.textStyle } } : undefined,\n grid: { containLabel: true, left: small, right: small, top: option.title ? size * 1.8 : small, bottom: option.legend ? size * 1.6 : small, ...option.grid },\n xAxis: axis(option.xAxis, true), yAxis: axis(option.yAxis, false), toolbox: undefined,\n series: [option.series ?? []].flat().map((one) => (one.type === 'pie' ? { label: { color: colours?.ink, fontSize: small }, ...one } : one)),\n }\n }\n return {\n /** @param {HTMLElement} box @param {string} source */\n async echarts(box, source) {\n const option = JSON.parse(source)\n const echarts = await script(libraryAt(base, 'echarts', chartsAt, 'dist/echarts.min.js'), 'echarts')\n const place = document.createElement('div')\n place.className = 'deck-chart'\n place.setAttribute('role', 'img')\n place.setAttribute('aria-label', String(option.title?.text ?? ''))\n box.append(place)\n const chart = echarts.init(place, null, { renderer: 'svg', locale: document.documentElement.lang?.startsWith('ja') ? 'JA' : 'EN' })\n const one = { chart, option, box }\n charts.add(one)\n chart.setOption(themed(option, box))\n new ResizeObserver(() => { chart.resize(); chart.setOption(themed(option, box), true) }).observe(place)\n Object.assign(box, { chart })\n },\n /**\n * A diagram written in Mermaid's language, drawn by Pele (Obsidian's, MIT): every kind Mermaid\n * 12.1 has, no DOM needed, an SVG with no script or HTML in it. Shown as a picture, its colours\n * the deck's, set as Pele's variables inside it. @param {HTMLElement} box @param {string} source\n */\n async mermaid(box, source) {\n const pele = await script(libraryAt(base, 'pele', diagramsAt, 'dist/pele.global.js'), 'pele')\n const font = getComputedStyle(root).getPropertyValue('--deck-body') || 'system-ui, sans-serif'\n const { svg } = pele.render(source, { fontFamily: font, links: false, images: false, autoDirection: true, maxWidth: Math.max(320, box.clientWidth * 1.4) })\n const look = `--pele-bg:transparent;--pele-fg:${colours?.ink};--pele-muted:${colours?.muted};--pele-line:${colours?.muted};--pele-surface:${colours?.soft};--pele-surface-alt:${colours?.line};--pele-border:${colours?.primary};--pele-accent:${colours?.primary};--pele-font:${font.replace(/[<>\"]/g, '')}`\n const picture = document.createElement('img')\n picture.alt = source\n picture.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg.replace(/^(<svg\\b[^>]*>)/, `$1<style>svg{${look}}</style>`))}`\n const place = document.createElement('div')\n place.className = 'deck-diagram'\n place.append(picture)\n box.append(place)\n },\n }\n}\n", "// Pictures held inside a deck, for a file that leaves its host: each picture the deck names by an\n// address of the host's own (a project's file, a relative path) becomes a data: address holding the\n// picture itself, in the Markdown's images (`![words](place)`) and in a slide's settings (`image`,\n// `background`, `backgroundImage`). Pictures on the web stay links unless asked for, and nothing else\n// in the text moves. Pure but for the host's `read`, which gives a picture's bytes and type.\n\nconst SETTINGS = /^(\\s*(?:image|background|backgroundImage)\\s*:\\s*)(['\"]?)([^'\"\\n#]+?)\\2(\\s*(?:#.*)?)$/gm\nconst IMAGE = /(!\\[[^\\]\\n]*\\]\\()(<[^>\\n]+>|[^\\s)\\n]+)((?:\\s+(?:\"[^\"\\n]*\"|'[^'\\n]*'))?\\))/g\n\n/** @param {string} place */\nconst held = (place) => /^data:/i.test(place)\n/** @param {string} place */\nconst web = (place) => /^(https?:)?\\/\\//i.test(place)\n\n/** @param {Uint8Array} bytes */\nfunction base64(bytes) {\n let text = ''\n for (let i = 0; i < bytes.length; i += 0x8000) text += String.fromCharCode(...bytes.subarray(i, i + 0x8000))\n return btoa(text)\n}\n\n/**\n * The deck with its pictures inside it.\n * @param {string} source\n * @param {(place: string) => Promise<{ type: string, bytes: Uint8Array } | null>} read\n * @param {{ web?: boolean, largest?: number }} [options] `web`: pictures on the web too; `largest`: bytes past which a picture stays a link\n * @returns {Promise<{ source: string, inlined: string[], missing: string[], kept: string[] }>}\n */\nexport async function inlinePictures(source, read, { web: fromWeb = false, largest = 8 * 1024 * 1024 } = {}) {\n /** @type {Map<string, string | null>} */\n const found = new Map()\n const places = [...source.matchAll(IMAGE)].map((m) => m[2].replace(/^<|>$/g, '')).concat([...source.matchAll(SETTINGS)].map((m) => m[3].trim()))\n const inlined = [], missing = [], kept = []\n for (const place of new Set(places)) {\n if (held(place) || (web(place) && !fromWeb) || /^(#|mailto:|javascript:)/i.test(place)) continue\n const picture = await read(place).catch(() => null)\n if (!picture || !/^image\\/(png|jpeg|gif|webp|avif|svg\\+xml)$/.test(picture.type)) { missing.push(place); found.set(place, null); continue }\n if (picture.bytes.length > largest) { kept.push(place); found.set(place, null); continue }\n found.set(place, `data:${picture.type};base64,${base64(picture.bytes)}`)\n inlined.push(place)\n }\n const swap = (/** @type {string} */ place) => found.get(place) ?? null\n const out = source\n .replace(IMAGE, (all, open, place, close) => { const data = swap(place.replace(/^<|>$/g, '')); return data ? `${open}${data}${close}` : all })\n .replace(SETTINGS, (all, key, quote, place, rest) => { const data = swap(place.trim()); return data ? `${key}${quote}${data}${quote}${rest}` : all })\n return { source: out, inlined, missing, kept }\n}\n", "// What brains get wrong when they write a deck, mended before it is read:\n// - a deck fenced as ```markdown, ```md, ```slidev or with nothing, three backticks around a\n// chart's three (an inner block is closed by the next bare fence);\n// - a slide's settings written after an empty line (`---`, ``, `layout: fact`, `---`), which\n// Slidev would show as words;\n// - <v-clicks> and </v-clicks> without the empty lines that keep the list a list;\n// - a chart fenced as ```json (an ECharts option: it has `series`);\n// - a slot's marker with words after it on its line (`::right:: The canal`).\n// Pure. Returns the deck and what was mended, so a test set can count both.\n\nconst OUTER = /^(`{3,}|~{3,})[ \\t]*(deck|slidev|markdown|md)?[ \\t]*$/\nconst KEYS = 'layout|transition|class|image|background|clicks|title|level|hide|zoom|theme|colorSchema|lang|themeConfig|paginate|alt'\n\n/** The deck an answer holds, or null. @param {string} answer @returns {{ source: string, mended: string[] } | null} */\nexport function deckIn(answer) {\n const lines = answer.replace(/\\r\\n?/g, '\\n').split('\\n')\n /** @type {{ tag: string, body: string[] }[]} */\n const found = []\n for (let i = 0; i < lines.length; i++) {\n const open = OUTER.exec(lines[i])\n if (!open) continue\n const fence = open[1]\n let j = i + 1, inner = false\n const body = []\n for (; j < lines.length; j++) {\n const line = lines[j].trimEnd()\n if (!inner && line === fence) break\n if (/^(`{3,}|~{3,})\\s*\\S/.test(line) && !inner) inner = true\n else if (inner && /^(`{3,}|~{3,})\\s*$/.test(line)) inner = false\n body.push(lines[j])\n }\n found.push({ tag: open[2] ?? '', body })\n i = j\n }\n const deck = found.find((f) => f.tag === 'deck') ?? found.find((f) => f.body.filter((l) => /^---\\s*$/.test(l)).length >= 2)\n if (!deck) return null\n /** @type {string[]} */\n const mended = []\n if (deck.tag !== 'deck') mended.push(`fenced as ${deck.tag || 'nothing'}`)\n let source = deck.body.join('\\n')\n const mend = (/** @type {string} */ what, /** @type {RegExp} */ pattern, /** @type {string} */ by) => {\n const next = source.replace(pattern, by)\n if (next !== source) { mended.push(what); source = next }\n }\n mend('settings after an empty line', new RegExp(`^---[ \\\\t]*\\\\n\\\\s*\\\\n((?:(?:${KEYS})\\\\s*:.*\\\\n(?:[ \\\\t]+\\\\S.*\\\\n)*)+)---[ \\\\t]*$`, 'gm'), '---\\n$1---')\n mend('steps without empty lines', /^[ \\t]*(<\\/?v-clicks?>)[ \\t]*$/gm, '\\n$1\\n')\n const charts = source.replace(/^```json[ \\t]*\\n([\\s\\S]*?)^```/gm, (block, body) => (body.includes('\"series\"') ? `\\`\\`\\`echarts\\n${body}\\`\\`\\`` : block))\n if (charts !== source) { mended.push('a chart fenced as json'); source = charts }\n mend('words after a slot marker', /^::([\\w-]+)::[ \\t]+(\\S.*)$/gm, '::$1::\\n\\n$2')\n return { source, mended }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["parseYaml", "text", "lines", "raw", "uncomment", "value", "block", "line", "quote", "i", "c", "at", "min", "indent", "list", "rest", "width", "scalar", "map", "entry", "key", "blockScalar", "folded", "taken", "read", "flow", "space", "item", "start", "q", "open", "SLOT", "parseDeck", "source", "lines", "offsets", "line", "ranges", "start", "matter", "comment", "i", "commentGoesOn", "j", "fence", "last", "heads", "mark", "cuts", "at", "k", "slides", "end", "index", "slide", "one", "slot", "columnsOf", "starts", "open", "close", "cols", "names", "_", "begin", "from", "to", "settings", "parseYaml", "top", "body", "notes", "after", "all", "text", "slots", "name", "first", "taken", "push", "columns", "marker", "kept", "heading", "NAME", "TRACK", "PPTX", "ENUMS", "CORNERS", "logoOf", "value", "ALIASES", "STANDARD", "name", "given", "layoutOf", "problems", "budgets", "named", "budget", "clean", "slots", "slot", "rows", "row", "width", "cell", "cells", "y", "x", "xs", "c", "ys", "tracks", "count", "list", "t", "columns", "rowTracks", "pick", "key", "fallback", "label", "words", "v", "kept", "tokensFrom", "colour", "face", "NAMES", "group", "g", "k", "colours", "tokens", "dark", "fonts", "heading", "body", "mergeKits", "kits", "kit", "next", "definition", "layout", "found", "p", "where", "labelOf", "lang", "inferLayout", "slide", "names", "lines", "line", "h", "tag", "attributes", "children", "element", "name", "value", "child", "safeUrl", "href", "url", "renderSlide", "slide", "context", "asked", "layout", "ALIASES", "inferLayout", "definition", "STANDARD", "classes", "counter", "slots", "slot", "names", "section", "canvas", "row", "cell", "image", "picture", "blocks", "logo", "logoAt", "dark", "at", "CORNERS", "src", "kind", "tokens", "out", "mode", "token", "start", "fences", "line", "fence", "list", "attrs", "inner", "words", "li", "step", "block", "n", "stepped", "head", "edit", "range", "inline", "lone", "from", "item", "offset", "itemStart", "marker", "simple", "info", "lang", "drawer", "box", "marked", "lines", "code", "i", "align", "a", "raw", "text", "part", "b", "to", "_", "e", "LOOKS", "VOICES", "tokensOf", "settings", "project", "named", "own", "tokens", "clean", "given", "kept", "key", "hex", "v", "c", "schemeOf", "scheme", "light", "dark", "paper", "round", "mix", "ink", "primary", "text", "readable", "onPrimary", "contrast", "series", "n", "rotate", "css", "value", "m", "h", "i", "rgb", "a", "b", "t", "luminance", "r", "g", "s", "x", "y", "p", "q", "colour", "ratio", "toward", "out", "degrees", "max", "min", "d", "u", "STRINGS", "stringsFor", "lang", "Lexer", "RTL", "ICONS", "icon", "name", "svg", "path", "createDeck", "root", "options", "source", "deck", "parseDeck", "at", "stepAt", "drawn", "lang", "dir", "words", "stringsFor", "number", "dark", "scheme", "started", "stage", "h", "where", "button", "label", "act", "b", "back", "move", "next", "editButton", "toggle", "presenterButton", "overviewButton", "bar", "paintLook", "view", "present", "sourceBox", "nextBox", "notes", "clock", "presenter", "kitProblems", "kitOf", "merged", "mergeKits", "context", "tokens", "tokensOf", "colours", "schemeOf", "stack", "faces", "f", "voice", "VOICES", "value", "colour", "n", "fill", "contrast", "hex", "chooseScheme", "asked", "src", "markdown", "draw", "slide", "renderSlide", "i", "element", "go", "show", "fitAll", "fit", "over", "slot", "scale", "steps", "one", "following", "by", "to", "toStep", "forward", "settings", "named", "ahead", "behind", "part", "kind", "_", "side", "update", "reduced", "transition", "toward", "key", "el", "parts", "s", "there", "match", "id", "old", "mode", "other", "setSource", "text", "pending", "event", "followCaret", "caret", "found", "target", "from", "done", "keep", "blur", "markdownOf", "e", "backward", "touch", "dx", "tick", "node", "out", "child", "inner", "VERSION", "OPEN", "CLOSE", "escape", "markdown", "unescape", "text", "attribute", "content", "inlineCode", "code", "readDeckFile", "html", "at", "from", "end", "rendererUrl", "version", "VERSION", "writeDeckFile", "title", "lang", "dir", "renderer", "base", "generator", "data", "script", "W", "H", "TEXT", "hexOf", "value", "m", "n", "toPptx", "view", "PptxGenJS", "JSZip", "pres", "rootStyle", "firstFont", "stack", "f", "report", "rtl", "slides", "masters", "transitions", "i", "element", "box", "sx", "W", "place", "el", "r", "across", "slot", "x", "w", "y", "h", "pad", "start", "end", "anchor", "pt", "px", "style", "layout", "slots", "firstBlock", "title", "definition", "masterName", "labelOf", "objects", "hexOf", "top", "inner", "logo", "one", "mark", "pictureOf", "H", "o", "names", "slide", "background", "url", "data", "runs", "blocks", "child", "TEXT", "block", "spaced", "at", "table", "chart", "nativeChart", "img", "notes", "settings", "zip", "kind", "path", "xml", "found", "transitionXml", "theme", "colour", "name", "series", "n", "scheme", "c", "first", "after", "how", "out", "paragraph", "extra", "base", "pieces", "inlineRuns", "list", "level", "li", "nested", "clone", "sub", "p", "node", "walk", "options", "text", "own", "run", "rows", "tr", "cell", "align", "widths", "total", "a", "b", "option", "types", "s", "colours", "value", "v", "common", "pie", "ring", "d", "t", "horizontal", "labels", "of", "axes", "points", "indicators", "push", "dir", "src", "cover", "canvas", "ctx", "iw", "ih", "scale", "loading", "script", "src", "global", "resolve", "reject", "tag", "libraryAt", "base", "name", "version", "file", "defaultBlocks", "root", "versions", "chartsAt", "diagramsAt", "charts", "colours", "event", "one", "themed", "option", "box", "size", "rtl", "small", "axis", "given", "across", "source", "echarts", "place", "chart", "pele", "font", "svg", "look", "picture", "SETTINGS", "IMAGE", "held", "place", "web", "base64", "bytes", "text", "i", "inlinePictures", "source", "read", "fromWeb", "largest", "found", "places", "m", "inlined", "missing", "kept", "picture", "swap", "all", "open", "close", "data", "key", "quote", "rest", "OUTER", "KEYS", "deckIn", "answer", "lines", "found", "i", "open", "fence", "j", "inner", "body", "line", "deck", "f", "l", "mended", "source", "mend", "what", "pattern", "by", "next", "charts", "block"]
7
7
  }