@bendyline/squisq 2.12.3 → 2.12.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/{Doc-BkSiCJnM.d.ts → Doc-DaUT9d7i.d.ts} +1 -1
  2. package/dist/{ImageEditDoc-UjQv8q3j.d.ts → ImageEditDoc-vFCJ_bT1.d.ts} +1 -1
  3. package/dist/{annotationCoercion-TxFucMtA.d.ts → annotationCoercion-m2qN3r1k.d.ts} +1 -1
  4. package/dist/{chunk-ZKDJHO6Y.js → chunk-7GVUWJQN.js} +1 -1
  5. package/dist/{chunk-MPEGJKFJ.js → chunk-GGZCJ2MS.js} +7 -1
  6. package/dist/{chunk-ZBPWNH4L.js → chunk-HFDYPPNJ.js} +174 -94
  7. package/dist/{chunk-VTVBSZXB.js → chunk-I3ENXLAN.js} +2 -16
  8. package/dist/{chunk-SK5TQSYN.js → chunk-LCMQCRRX.js} +12 -8
  9. package/dist/{chunk-J6AGNXFO.js → chunk-XFE6WYDK.js} +1 -1
  10. package/dist/{chunk-EX75I5HX.js → chunk-XZZFXXXR.js} +86 -8
  11. package/dist/doc/index.d.ts +7 -7
  12. package/dist/doc/index.js +5 -5
  13. package/dist/fence/index.d.ts +2 -2
  14. package/dist/generate/index.d.ts +2 -2
  15. package/dist/imageEdit/index.d.ts +4 -4
  16. package/dist/index.d.ts +6 -6
  17. package/dist/index.js +7 -7
  18. package/dist/jsonForm/index.d.ts +2 -2
  19. package/dist/markdown/index.d.ts +3 -3
  20. package/dist/markdown/index.js +2 -2
  21. package/dist/{materializePageSection-DEXohgVt.d.ts → materializePageSection-Kj9ROls1.d.ts} +2 -2
  22. package/dist/mediaEdit/index.d.ts +3 -3
  23. package/dist/narration/index.d.ts +2 -2
  24. package/dist/narration/index.js +3 -3
  25. package/dist/recommend/index.d.ts +1 -1
  26. package/dist/recommend/index.js +1 -1
  27. package/dist/schemas/index.d.ts +5 -5
  28. package/dist/{themeLibrary-BrBc0mrP.d.ts → themeLibrary-BRRm1Hna.d.ts} +1 -1
  29. package/dist/timing/index.d.ts +2 -2
  30. package/dist/transform/index.d.ts +3 -3
  31. package/dist/transform/index.js +4 -4
  32. package/dist/{types-BmEHcL3l.d.ts → types--c_Uqmlh.d.ts} +20 -1
  33. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { f as BuildSpec, h as BuildTiming, ac as Transition, ae as TransitionType, g as BuildStep, M as MarkdownBlockNode, z as MarkdownHeading, d as BuildAdvance } from './types-BmEHcL3l.js';
1
+ import { f as BuildSpec, h as BuildTiming, ac as Transition, ae as TransitionType, g as BuildStep, M as MarkdownBlockNode, z as MarkdownHeading, d as BuildAdvance } from './types--c_Uqmlh.js';
2
2
 
3
3
  /**
4
4
  * Media-edit recipes — the non-destructive edit list a media reference carries.
@@ -1,4 +1,4 @@
1
- import { a2 as ImageLayer, bv as TextLayer, bh as ShapeLayer, aX as PathLayer } from './Doc-BkSiCJnM.js';
1
+ import { a2 as ImageLayer, bv as TextLayer, bh as ShapeLayer, aX as PathLayer } from './Doc-DaUT9d7i.js';
2
2
 
3
3
  /**
4
4
  * ImageEditDoc — JSON document describing a layered, editable image.
@@ -1,4 +1,4 @@
1
- import { f as BuildSpec, aq as BlockConnection, ae as TransitionType, ad as TransitionDirection } from './types-BmEHcL3l.js';
1
+ import { f as BuildSpec, aq as BlockConnection, ae as TransitionType, ad as TransitionDirection } from './types--c_Uqmlh.js';
2
2
 
3
3
  /**
4
4
  * Registry of known block-meta keys and their coercion strategies.
@@ -2,7 +2,7 @@ import {
2
2
  assertMarkdownDocumentWithinLimits,
3
3
  parseMarkdown,
4
4
  toMdast
5
- } from "./chunk-EX75I5HX.js";
5
+ } from "./chunk-XZZFXXXR.js";
6
6
  import {
7
7
  formatFrontmatterYaml,
8
8
  getChildren,
@@ -3045,7 +3045,13 @@ function extractImages(contents, limit = Infinity) {
3045
3045
  const n = node;
3046
3046
  if (n.type === "image" && typeof n.url === "string" && n.url) {
3047
3047
  if (!mediaKindForUrl(n.url)) {
3048
- found.push({ src: n.url, alt: typeof n.alt === "string" ? n.alt : "" });
3048
+ found.push({
3049
+ src: n.url,
3050
+ alt: typeof n.alt === "string" ? n.alt : "",
3051
+ // A resized image parses with the size it was given in the editor.
3052
+ ...typeof n.width === "number" ? { width: n.width } : {},
3053
+ ...typeof n.height === "number" ? { height: n.height } : {}
3054
+ });
3049
3055
  }
3050
3056
  return;
3051
3057
  }
@@ -4,14 +4,15 @@ import {
4
4
  flattenRenderableBlocks,
5
5
  getPinnedBlockMeta,
6
6
  markdownToDoc
7
- } from "./chunk-VTVBSZXB.js";
7
+ } from "./chunk-I3ENXLAN.js";
8
8
  import {
9
9
  deriveTemplateInputs,
10
+ extractImages,
10
11
  isAsciiDiagramFence,
11
12
  isAsciiTimelineFence,
12
13
  isPictureFence,
13
14
  isTreeFence
14
- } from "./chunk-MPEGJKFJ.js";
15
+ } from "./chunk-GGZCJ2MS.js";
15
16
  import {
16
17
  extractContent,
17
18
  mapElementToBlock,
@@ -23,7 +24,7 @@ import {
23
24
  } from "./chunk-HYJ63N6V.js";
24
25
  import {
25
26
  parseMarkdown
26
- } from "./chunk-EX75I5HX.js";
27
+ } from "./chunk-XZZFXXXR.js";
27
28
  import {
28
29
  isContainerTemplate
29
30
  } from "./chunk-Y25EJEZN.js";
@@ -241,42 +242,22 @@ function maskNonProse(stripped, contents) {
241
242
  }
242
243
  return masked;
243
244
  }
244
- function collectImages(node) {
245
- const results = [];
246
- if ("type" in node && node.type === "image" && "url" in node) {
247
- const img = node;
248
- if (img.url) {
249
- results.push({ src: img.url, alt: img.alt ?? "" });
250
- }
251
- }
252
- for (const child of getChildren(node)) {
253
- results.push(...collectImages(child));
254
- }
255
- return results;
256
- }
257
245
  function extractBlockImages(block, blockIndex) {
258
- if (!block.contents || block.contents.length === 0) return [];
259
- const images = [];
260
- for (const node of block.contents) {
261
- for (const img of collectImages(node)) {
262
- images.push({ ...img, sourceBlockIndex: blockIndex });
263
- }
264
- }
265
- return images;
246
+ return extractImages(block.contents).map(({ src, alt }) => ({
247
+ src,
248
+ alt,
249
+ sourceBlockIndex: blockIndex
250
+ }));
266
251
  }
267
252
  function extractDocImages(blocks) {
268
253
  const seen = /* @__PURE__ */ new Set();
269
254
  const images = [];
270
255
  function walk(blockList) {
271
256
  for (const block of blockList) {
272
- if (block.contents) {
273
- for (const node of block.contents) {
274
- for (const img of collectImages(node)) {
275
- if (!seen.has(img.src)) {
276
- seen.add(img.src);
277
- images.push({ src: img.src, alt: img.alt });
278
- }
279
- }
257
+ for (const img of extractImages(block.contents)) {
258
+ if (!seen.has(img.src)) {
259
+ seen.add(img.src);
260
+ images.push({ src: img.src, alt: img.alt });
280
261
  }
281
262
  }
282
263
  if (block.children) {
@@ -1658,13 +1639,83 @@ function videoBlock(video, index, segmentId, duration) {
1658
1639
  }
1659
1640
 
1660
1641
  // src/transform/presentationPlanner.ts
1661
- function clip(text3, words = 12) {
1662
- const clean = text3.replace(/\s+/g, " ").trim();
1642
+ var SENTENCE_END = /[.!?][”"')\]]?$/u;
1643
+ var SENTENCE_START = /^[\p{Lu}\p{N}"“‘'([]/u;
1644
+ var SEQUENCE_CUE = /^(?:(?:first|second|third|fourth)(?:ly)?|then|next|after that|afterwards|finally|lastly)\b|^\d+[.)]\s/iu;
1645
+ function clip(text3, words, characters) {
1646
+ const clean = text3.replace(/\s+/gu, " ").trim();
1663
1647
  const parts = clean.split(" ");
1664
- return (parts.length > words ? parts.slice(0, words).join(" ") + "\u2026" : clean).slice(
1665
- 0,
1666
- words === 12 ? 110 : 180
1667
- );
1648
+ let result = parts.length > words ? parts.slice(0, words).join(" ") : clean;
1649
+ if (result.length > characters - 1) {
1650
+ const cut = result.slice(0, characters - 1);
1651
+ const space = cut.lastIndexOf(" ");
1652
+ result = space > characters / 2 ? cut.slice(0, space) : cut;
1653
+ }
1654
+ return result === clean ? clean : result.replace(/[\s,;:–—-]+$/u, "") + "\u2026";
1655
+ }
1656
+ var headlineText = (text3) => clip(text3, 12, 110);
1657
+ var pointText = (text3) => clip(text3, Infinity, 180);
1658
+ var captionText = (text3) => clip(text3, 18, 110);
1659
+ function sentencesIn(sourceText, start, end) {
1660
+ const passage = sourceText.slice(start, end);
1661
+ const sentences = [];
1662
+ let cursor = 0;
1663
+ const add = (to) => {
1664
+ const raw = passage.slice(cursor, to);
1665
+ const text3 = raw.trim();
1666
+ if (!text3) return;
1667
+ const from = start + cursor + raw.indexOf(text3);
1668
+ sentences.push({ text: text3, start: from, end: from + text3.length });
1669
+ };
1670
+ for (const match of passage.matchAll(/(?<=[.!?][”"')\]]?)\s+(?=[\p{Lu}\p{N}"“‘'([])|\n+/gu)) {
1671
+ add(match.index);
1672
+ cursor = match.index + match[0].length;
1673
+ }
1674
+ add(passage.length);
1675
+ return sentences;
1676
+ }
1677
+ var comparable = (text3) => text3.toLowerCase().replace(/\s+/gu, " ").replace(/[\s….!?,;:]+$/u, "").trim();
1678
+ function repeats(sentence, headline) {
1679
+ const body = comparable(sentence);
1680
+ const head = comparable(headline);
1681
+ return body === head || head.includes(body) || head.length >= 24 && body.startsWith(head);
1682
+ }
1683
+ function chunkWords(words, limit) {
1684
+ const chunks = [];
1685
+ const ends = (count) => SENTENCE_END.test(words[count - 1][0]) && (count >= words.length || SENTENCE_START.test(words[count][0]));
1686
+ let first = 0;
1687
+ while (first < words.length) {
1688
+ let last = Math.min(first + limit, words.length);
1689
+ if (last < words.length) {
1690
+ let cut = 0;
1691
+ for (let cursor = last; cursor > first + 18 && !cut; cursor--) if (ends(cursor)) cut = cursor;
1692
+ const reach = Math.min(words.length, first + Math.ceil(limit * 1.5));
1693
+ for (let cursor = last + 1; cursor <= reach && !cut; cursor++) if (ends(cursor)) cut = cursor;
1694
+ if (cut) last = cut;
1695
+ }
1696
+ chunks.push([first, last]);
1697
+ first = last;
1698
+ }
1699
+ return chunks;
1700
+ }
1701
+ function imagesBySection(doc, sectionIds) {
1702
+ const flat = flattenRenderableBlocks(doc.blocks);
1703
+ const own = /* @__PURE__ */ new Map();
1704
+ const seen = /* @__PURE__ */ new Set();
1705
+ for (const block of [...flat].reverse()) {
1706
+ const images = extractDocImages([block]).filter((image) => !seen.has(image.src));
1707
+ for (const image of images) seen.add(image.src);
1708
+ own.set(block.id, images);
1709
+ }
1710
+ const sections = new Set(sectionIds);
1711
+ const result = /* @__PURE__ */ new Map();
1712
+ let owner = sectionIds[0];
1713
+ for (const block of flat) {
1714
+ if (sections.has(block.id)) owner = block.id;
1715
+ if (!owner) continue;
1716
+ result.set(owner, [...result.get(owner) ?? [], ...own.get(block.id) ?? []]);
1717
+ }
1718
+ return result;
1668
1719
  }
1669
1720
  function field(block, key) {
1670
1721
  if (!block || typeof block !== "object") return void 0;
@@ -1679,7 +1730,10 @@ function createPresentationPlan(doc, hints = defaultPresentationHints()) {
1679
1730
  throw new Error(
1680
1731
  "This document is too long for one presentation. Split it into shorter documents."
1681
1732
  );
1682
- const images = extractDocImages(doc.blocks);
1733
+ const sectionImages = imagesBySection(
1734
+ doc,
1735
+ script.blocks.map((block) => block.blockId)
1736
+ );
1683
1737
  const beats = [];
1684
1738
  const supportingOpeners = /* @__PURE__ */ new Set();
1685
1739
  const wordLimit = { concise: 28, balanced: 42, detailed: 64 }[hints.density];
@@ -1689,53 +1743,59 @@ function createPresentationPlan(doc, hints = defaultPresentationHints()) {
1689
1743
  const hint = hints.blocks.find((item) => item.blockId === block.blockId);
1690
1744
  const wording = hint?.wording?.source === source ? hint.wording : void 0;
1691
1745
  const inbetweens = hint?.inbetweens ?? hints.inbetweens;
1692
- let first = 0;
1693
- while (first < words.length) {
1694
- let last = Math.min(first + wordLimit, words.length);
1695
- if (last < words.length) {
1696
- for (let cursor = last; cursor > first + 18; cursor--) {
1697
- if (/[.!?][”"')\]]?$/u.test(words[cursor - 1][0])) {
1698
- last = cursor;
1699
- break;
1700
- }
1701
- }
1702
- }
1746
+ const heading = block.heading?.trim();
1747
+ const headingEnd = block.charStart + (heading?.length ?? 0);
1748
+ const chunks = chunkWords(words, wordLimit);
1749
+ const images = sectionImages.get(block.blockId) ?? [];
1750
+ const opensDeck = beats.length === 0;
1751
+ for (const [chunk, [first, last]] of chunks.entries()) {
1752
+ const fromEnd = chunks.length - 1 - chunk;
1753
+ const image = opensDeck && chunk === 0 ? void 0 : images[fromEnd];
1703
1754
  const start = block.charStart + words[first].index;
1704
1755
  const end = block.charStart + words[last - 1].index + words[last - 1][0].length;
1705
1756
  const passage = script.sourceText.slice(start, end);
1706
1757
  const index = beats.length;
1707
- const suggested = transformNarratedSegment(
1708
- {
1709
- articleId: doc.articleId,
1710
- segmentId: `presentation-${index}`,
1711
- title: block.heading ?? "",
1712
- text: passage,
1713
- duration: Math.max(4, (last - first) / 2.5),
1714
- audioSrc: "",
1715
- includeTitleBlock: false
1716
- },
1717
- { slidesPerMinute: 4, minConfidence: 0.25, style: "documentary" }
1718
- ).doc.blocks[0];
1719
- const sentences = passage.split(/(?<=[.!?])\s+|\n+/u).map((part) => part.trim()).filter(Boolean);
1720
- const bodySentences = sentences.filter((part) => part !== block.heading);
1721
- let points = (bodySentences.length ? bodySentences : sentences).slice(0, 3).map((part) => clip(part, 22));
1722
- let headline = clip(
1723
- first === 0 && block.heading ? block.heading : field(suggested, "fact") ?? field(suggested, "description") ?? field(suggested, "quote") ?? sentences[0] ?? passage
1724
- );
1725
- if (!headline) headline = clip(passage);
1726
- let layout = index === 0 ? "title" : points.length >= 2 && index % 3 === 1 ? "list" : "statement";
1727
- if (points.length >= 2 && /\b(first|then|finally|steps?|next)\b/iu.test(passage))
1728
- layout = "steps";
1729
- if (points.length === 2 && /\b(versus|whereas|compared|instead)\b/iu.test(passage))
1758
+ const sentences = sentencesIn(script.sourceText, start, end);
1759
+ const body = sentences.filter((sentence) => sentence.start >= headingEnd);
1760
+ let headline;
1761
+ let shown;
1762
+ if (heading) {
1763
+ headline = headlineText(heading);
1764
+ shown = body.filter((sentence) => comparable(sentence.text) !== comparable(heading));
1765
+ } else {
1766
+ const suggested = transformNarratedSegment(
1767
+ {
1768
+ articleId: doc.articleId,
1769
+ segmentId: `presentation-${index}`,
1770
+ title: "",
1771
+ text: passage,
1772
+ duration: Math.max(4, (last - first) / 2.5),
1773
+ audioSrc: "",
1774
+ includeTitleBlock: false
1775
+ },
1776
+ { slidesPerMinute: 4, minConfidence: 0.25, style: "documentary" }
1777
+ ).doc.blocks[0];
1778
+ headline = headlineText(
1779
+ field(suggested, "fact") ?? field(suggested, "description") ?? field(suggested, "quote") ?? sentences[0]?.text ?? passage
1780
+ );
1781
+ if (!headline) headline = headlineText(passage);
1782
+ shown = body.filter((sentence) => !repeats(sentence.text, headline));
1783
+ }
1784
+ const steps = shown.filter((sentence) => SEQUENCE_CUE.test(sentence.text));
1785
+ const sequence = steps.length >= 2;
1786
+ const textPoints = shown.slice(0, 3).map((item) => pointText(item.text));
1787
+ const stepPoints = sequence ? steps.slice(0, 3).map((item) => pointText(item.text)) : textPoints;
1788
+ const custom = chunk === 0 ? wording : void 0;
1789
+ if (custom?.headline) headline = custom.headline;
1790
+ const pointsFor = (layout2) => custom?.points ?? (layout2 === "steps" ? stepPoints : textPoints);
1791
+ let layout = index === 0 ? "title" : textPoints.length >= 2 && index % 3 === 1 ? "list" : "statement";
1792
+ if (sequence) layout = "steps";
1793
+ else if (textPoints.length === 2 && /\b(versus|whereas|compared|instead)\b/iu.test(passage))
1730
1794
  layout = "comparison";
1731
- const image = images.length && index > 0 && index % 3 === 2 ? images[Math.floor(index / 3) % images.length] : void 0;
1732
1795
  if (image) layout = "image";
1733
- if (first === 0 && wording) {
1734
- headline = wording.headline ?? headline;
1735
- points = wording.points ?? points;
1736
- }
1737
1796
  if (hint?.layout) {
1738
- const eligible = hint.layout === "image" ? !!image : hint.layout === "comparison" ? points.length === 2 : ["steps", "list"].includes(hint.layout) ? points.length >= 2 : true;
1797
+ const count = pointsFor(hint.layout).length;
1798
+ const eligible = hint.layout === "image" ? !!image : hint.layout === "comparison" ? count === 2 : ["steps", "list"].includes(hint.layout) ? count >= 2 : true;
1739
1799
  if (eligible) layout = hint.layout;
1740
1800
  }
1741
1801
  const beat = {
@@ -1744,23 +1804,43 @@ function createPresentationPlan(doc, hints = defaultPresentationHints()) {
1744
1804
  sourceEnd: end,
1745
1805
  layout,
1746
1806
  headline,
1747
- points,
1807
+ points: pointsFor(layout),
1748
1808
  ...layout === "image" && image ? { imageSrc: image.src } : {}
1749
1809
  };
1750
- const explainer = inbetweens && last - first >= 24 && (layout === "steps" || layout === "comparison" || !!image);
1751
- if (explainer) {
1752
- const split = block.charStart + words[first + Math.floor((last - first) / 2)].index;
1753
- const { imageSrc: _image, ...textBeat } = beat;
1754
- supportingOpeners.add(`beat-${beats.length + 1}`);
1755
- beats.push({
1756
- ...textBeat,
1757
- id: `beat-${beats.length + 1}`,
1758
- layout: "statement",
1759
- sourceEnd: split
1760
- });
1761
- beats.push({ ...beat, id: `beat-${beats.length + 1}`, sourceStart: split });
1762
- } else beats.push(beat);
1763
- first = last;
1810
+ let split;
1811
+ if (inbetweens && !custom?.points && layout === "steps" && sequence) {
1812
+ if (shown.some((sentence) => sentence.end <= steps[0].start)) split = steps[0].start;
1813
+ } else if (inbetweens && layout === "image" && body.length >= 2 && last - first >= 24) {
1814
+ const middle = block.charStart + words[first + Math.floor((last - first) / 2)].index;
1815
+ split = body.slice(1).map((sentence) => sentence.start).reduce(
1816
+ (best, candidate) => Math.abs(candidate - middle) < Math.abs(best - middle) ? candidate : best
1817
+ );
1818
+ }
1819
+ if (split === void 0) {
1820
+ beats.push(beat);
1821
+ continue;
1822
+ }
1823
+ const before = shown.filter((sentence) => sentence.end <= split);
1824
+ const after = shown.filter((sentence) => sentence.start >= split);
1825
+ const caption = after[0] && after[0].text.length <= 110 ? after[0].text : heading ?? (after[0] ? captionText(after[0].text) : headline);
1826
+ const { imageSrc: _image, ...textBeat } = beat;
1827
+ supportingOpeners.add(`beat-${beats.length + 1}`);
1828
+ beats.push({
1829
+ ...textBeat,
1830
+ id: `beat-${beats.length + 1}`,
1831
+ layout: "statement",
1832
+ sourceEnd: split,
1833
+ points: before.slice(0, 3).map((item) => pointText(item.text))
1834
+ });
1835
+ beats.push({
1836
+ ...beat,
1837
+ id: `beat-${beats.length + 1}`,
1838
+ sourceStart: split,
1839
+ ...layout === "image" ? {
1840
+ headline: caption,
1841
+ points: after.filter((sentence) => !repeats(sentence.text, caption)).slice(0, 3).map((item) => pointText(item.text))
1842
+ } : {}
1843
+ });
1764
1844
  }
1765
1845
  }
1766
1846
  if (beats.length > PRESENTATION_LIMITS.beats)
@@ -27,7 +27,7 @@ import {
27
27
  profileBlockContents,
28
28
  renderMarkdownBlocksHtml,
29
29
  treeToTemplateData
30
- } from "./chunk-MPEGJKFJ.js";
30
+ } from "./chunk-GGZCJ2MS.js";
31
31
  import {
32
32
  anchorPoint,
33
33
  base64ToUtf8,
@@ -1436,21 +1436,7 @@ var ESCAPE_RE = /\{\{([^{}]*)\}\}/g;
1436
1436
  var ESCAPED_OPEN = " ESC_OPEN ";
1437
1437
  var ESCAPED_CLOSE = " ESC_CLOSE ";
1438
1438
  function collectImages(block) {
1439
- if (!block.contents) return [];
1440
- const out = [];
1441
- const visit = (node) => {
1442
- if (node.type === "image") {
1443
- const img = node;
1444
- out.push({ url: img.url ?? "", alt: img.alt ?? "" });
1445
- }
1446
- };
1447
- for (const node of block.contents) {
1448
- walkMarkdownTree(node, (n) => {
1449
- visit(n);
1450
- return;
1451
- });
1452
- }
1453
- return out;
1439
+ return extractImages(block.contents).map((image) => ({ url: image.src, alt: image.alt }));
1454
1440
  }
1455
1441
  function collectListItems(block) {
1456
1442
  if (!block.contents) return [];
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-FTN6SGW5.js";
4
4
  import {
5
5
  applySavedPresentation
6
- } from "./chunk-ZBPWNH4L.js";
6
+ } from "./chunk-HFDYPPNJ.js";
7
7
  import {
8
8
  SHAPE_NAMES,
9
9
  buildChartData,
@@ -32,7 +32,7 @@ import {
32
32
  templateRegistry,
33
33
  writeCustomTemplatesToFrontmatter,
34
34
  writeCustomThemesToFrontmatter
35
- } from "./chunk-VTVBSZXB.js";
35
+ } from "./chunk-I3ENXLAN.js";
36
36
  import {
37
37
  ASCII_TREE_VOCAB,
38
38
  ASCII_VOCAB,
@@ -53,7 +53,7 @@ import {
53
53
  toCells,
54
54
  toGrid,
55
55
  traceBoxes
56
- } from "./chunk-MPEGJKFJ.js";
56
+ } from "./chunk-GGZCJ2MS.js";
57
57
  import {
58
58
  iconMarker
59
59
  } from "./chunk-7ZAAICW4.js";
@@ -86,7 +86,7 @@ import {
86
86
  } from "./chunk-L7QZORLB.js";
87
87
  import {
88
88
  parseMarkdown
89
- } from "./chunk-EX75I5HX.js";
89
+ } from "./chunk-XZZFXXXR.js";
90
90
  import {
91
91
  TABLE_FED_TEMPLATES,
92
92
  TEMPLATE_ALIASES,
@@ -877,10 +877,14 @@ function extractBlockImages(contents) {
877
877
  }
878
878
  }
879
879
  function walk(node) {
880
- if ("type" in node && node.type === "image" && "url" in node) {
881
- const img = node;
882
- if (img.url) {
883
- images.push({ src: img.url, alt: img.alt ?? "" });
880
+ if (node.type === "image") {
881
+ if (node.url) {
882
+ images.push({
883
+ src: node.url,
884
+ alt: node.alt ?? "",
885
+ ...node.width !== void 0 ? { width: node.width } : {},
886
+ ...node.height !== void 0 ? { height: node.height } : {}
887
+ });
884
888
  }
885
889
  }
886
890
  if ("type" in node && (node.type === "htmlBlock" || node.type === "htmlInline")) {
@@ -8,7 +8,7 @@ import {
8
8
  expectedSyllablesAt,
9
9
  flattenRenderableBlocks,
10
10
  wordPosAtExpectedSyllables
11
- } from "./chunk-VTVBSZXB.js";
11
+ } from "./chunk-I3ENXLAN.js";
12
12
 
13
13
  // src/narration/types.ts
14
14
  var DEFAULT_FEATURE_CONFIG = Object.freeze({
@@ -51,6 +51,46 @@ function posField(pos) {
51
51
  function mdastPosField(pos) {
52
52
  return pos ? { position: toMdastPosition(pos) } : {};
53
53
  }
54
+ var PLAIN_IMAGE_ATTRIBUTES = /* @__PURE__ */ new Set(["src", "alt", "title", "width", "height"]);
55
+ function htmlPixels(value) {
56
+ if (value === void 0) return void 0;
57
+ const size = value.trim();
58
+ return /^\d+(?:\.\d+)?$/.test(size) && Number(size) > 0 ? Number(size) : null;
59
+ }
60
+ function imageFromHtml(rawHtml, htmlChildren) {
61
+ const nodes = htmlChildren.filter((node) => node.type !== "htmlText" || node.value.trim());
62
+ const img = nodes.length === 1 ? nodes[0] : void 0;
63
+ if (img?.type !== "htmlElement" || img.tagName !== "img" || img.children.length) return null;
64
+ const { src, alt, title } = img.attributes;
65
+ if (!src || Object.keys(img.attributes).some((name) => !PLAIN_IMAGE_ATTRIBUTES.has(name)))
66
+ return null;
67
+ const width = htmlPixels(img.attributes.width);
68
+ const height = htmlPixels(img.attributes.height);
69
+ if (width === null || height === null) return null;
70
+ return {
71
+ type: "image",
72
+ url: src,
73
+ ...alt !== void 0 ? { alt } : {},
74
+ ...title !== void 0 ? { title } : {},
75
+ ...width !== void 0 ? { width } : {},
76
+ ...height !== void 0 ? { height } : {},
77
+ rawHtml
78
+ };
79
+ }
80
+ function sameImage(a, b) {
81
+ return a.url === b.url && (a.alt ?? "") === (b.alt ?? "") && (a.title ?? null) === (b.title ?? null) && a.width === b.width && a.height === b.height;
82
+ }
83
+ function escapeHtmlAttribute(value) {
84
+ return value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
85
+ }
86
+ function imageToHtml(node) {
87
+ if (node.rawHtml !== void 0) {
88
+ const written = imageFromHtml(node.rawHtml, parseHtmlToNodes(node.rawHtml));
89
+ if (written && sameImage(written, node)) return node.rawHtml;
90
+ }
91
+ const attribute = (name, value) => value === void 0 || value === null ? "" : ` ${name}="${escapeHtmlAttribute(String(value))}"`;
92
+ return `<img${attribute("alt", node.alt ?? "")}${attribute("src", node.url)}${attribute("width", node.width)}${attribute("height", node.height)}${attribute("title", node.title)}>`;
93
+ }
54
94
  function extractText(node) {
55
95
  if (node.value != null) return node.value;
56
96
  if (node.children) {
@@ -261,7 +301,42 @@ function convertInlineChildren(children, parseHtml, applyIconSplit = true) {
261
301
  const mentioned = coalesceMentions(result);
262
302
  const repaired = recombineDirectiveTokens(mentioned);
263
303
  const split = applyIconSplit ? splitInlineIcons(repaired) : repaired;
264
- return foldPairedInlineHtml(split);
304
+ return foldPairedInlineHtml(parseHtml ? foldLoneInlineImages(split) : split);
305
+ }
306
+ var VOID_HTML_ELEMENTS = /* @__PURE__ */ new Set([
307
+ "area",
308
+ "base",
309
+ "br",
310
+ "col",
311
+ "embed",
312
+ "hr",
313
+ "img",
314
+ "input",
315
+ "link",
316
+ "meta",
317
+ "source",
318
+ "track",
319
+ "wbr"
320
+ ]);
321
+ function foldLoneInlineImages(nodes) {
322
+ if (!nodes.some((n) => n.type === "htmlInline")) return nodes;
323
+ let open = 0;
324
+ return nodes.map((node) => {
325
+ if (node.type !== "htmlInline") return node;
326
+ const tag = /^<(\/?)([a-zA-Z][a-zA-Z0-9-]*)\b[^>]*?(\/?)>$/.exec(node.rawHtml.trim());
327
+ if (!tag) return node;
328
+ const [, closing, name, selfClosing] = tag;
329
+ if (closing) {
330
+ open = Math.max(0, open - 1);
331
+ return node;
332
+ }
333
+ if (!VOID_HTML_ELEMENTS.has(name.toLowerCase()) && !selfClosing) {
334
+ open++;
335
+ return node;
336
+ }
337
+ const image = open === 0 ? imageFromHtml(node.rawHtml, node.htmlChildren) : null;
338
+ return image ? { ...image, ...posField(node.position) } : node;
339
+ });
265
340
  }
266
341
  var PAIRED_INLINE_HTML = /* @__PURE__ */ new Map([
267
342
  ["sup", "superscript"],
@@ -535,13 +610,14 @@ function convertBlockNode(node, parseHtml) {
535
610
  children: (node.children ?? []).map((row, i) => convertTableRow(row, i === 0, parseHtml)),
536
611
  ...posField(pos)
537
612
  };
538
- case "html":
539
- return {
540
- type: "htmlBlock",
541
- rawHtml: node.value ?? "",
542
- htmlChildren: parseHtml ? parseHtmlToNodes(node.value ?? "") : [],
543
- ...posField(pos)
544
- };
613
+ case "html": {
614
+ const rawHtml = node.value ?? "";
615
+ const htmlChildren = parseHtml ? parseHtmlToNodes(rawHtml) : [];
616
+ const image = parseHtml ? imageFromHtml(rawHtml, htmlChildren) : null;
617
+ if (image)
618
+ return { type: "paragraph", children: [{ ...image, ...posField(pos) }], ...posField(pos) };
619
+ return { type: "htmlBlock", rawHtml, htmlChildren, ...posField(pos) };
620
+ }
545
621
  case "math":
546
622
  return {
547
623
  type: "math",
@@ -964,6 +1040,8 @@ function inlineToMdast(node) {
964
1040
  ...mdastPosField(node.position)
965
1041
  };
966
1042
  case "image":
1043
+ if (node.rawHtml !== void 0 || node.width !== void 0 || node.height !== void 0)
1044
+ return { type: "html", value: imageToHtml(node), ...mdastPosField(node.position) };
967
1045
  return {
968
1046
  type: "image",
969
1047
  url: node.url,
@@ -1,12 +1,12 @@
1
- import { a6 as Layer, k as Block, Q as Doc, br as TemplateBlock, bs as TemplateContext, y as CustomTemplateDefinition, bu as TemplateRegistry, bx as Theme, c1 as ViewportConfig, a_ as PersistentLayerConfig, at as MotionSpec, R as DocBlock, c2 as ViewportOrientation, aZ as PersistentLayer, bK as TitleBlockInput, bf as SectionHeaderInput, j as BigTextInput, u as ContentBlockInput, bl as StatHighlightInput, b9 as QuoteBlockInput, Y as FactCardInput, bS as TwoColumnInput, J as DateEventInput, a4 as ImageWithCaptionInput, a9 as LeftFeatureInput, bc as RightFeatureInput, ae as MapBlockInput, bk as StartBlockConfig, $ as FullBleedQuoteInput, ac as ListBlockInput, b2 as PhotoGridInput, L as DefinitionCardInput, t as ComparisonBarInput, b8 as PullQuoteInput, c0 as VideoWithCaptionInput, b$ as VideoPullQuoteInput, I as DataTableInput, M as DiagramBlockInput, bN as TreeBlockInput, bG as TimelineBlockInput, U as DrawingBlockInput, ai as MarkerStyle, A as AccentImage, a3 as ImageTreatment, a as AccentPosition, c as Animation, d as AnimationType, au as MotionState, ar as MotionProfile, bz as ThemeColorScheme, w as CountUpSpec, bB as ThemeRegistry, aR as PageEmphasis, bA as ThemePageStyle, S as DocDiagnostic, P as DiagramTemplateNode, O as DiagramTemplateEdge, bJ as TimelineTemplateTrack, bI as TimelineTemplateLink } from '../Doc-BkSiCJnM.js';
2
- export { V as FRONTMATTER_CUSTOM_TEMPLATES_KEY, W as FRONTMATTER_CUSTOM_THEMES_KEY, a8 as LayoutHints, bb as RenderStyle, by as ThemeColorPalette, bE as ThemeStyle, bF as ThemeTypography, bT as VIEWPORT_PRESETS, c3 as ViewportPreset, c8 as createTemplateContext, cf as getLayoutHints, ci as getTwoColumnPositions, cj as getViewport, ck as getViewportOrientation, co as isTemplateBlock, cu as scaledFontSize } from '../Doc-BkSiCJnM.js';
3
- import { g as BuildStep, M as MarkdownBlockNode, S as MarkdownListItem, f as BuildSpec, e as BuildCursor, h as BuildTiming, V as MarkdownNode, ae as TransitionType, ad as TransitionDirection, z as MarkdownHeading, v as MarkdownDocument, a2 as MarkdownTable, q as MarkdownCodeBlock, R as MarkdownList } from '../types-BmEHcL3l.js';
4
- import { C as CoercedBlockMeta } from '../annotationCoercion-TxFucMtA.js';
5
- import { c as PageSection } from '../materializePageSection-DEXohgVt.js';
6
- export { M as MaterializePageSectionOptions, a as MaterializePageSectionsOptions, P as PageMedia, b as PageRichText, d as PageSectionDiagnostic, e as PageSectionItem, f as PageSectionMaterialization, g as PageSectionSource, h as PageSpatialKind, i as PageTransformHints, m as materializePageSection, j as materializePageSections, r as resolvePageStyle } from '../materializePageSection-DEXohgVt.js';
1
+ import { a6 as Layer, k as Block, Q as Doc, br as TemplateBlock, bs as TemplateContext, y as CustomTemplateDefinition, bu as TemplateRegistry, bx as Theme, c1 as ViewportConfig, a_ as PersistentLayerConfig, at as MotionSpec, R as DocBlock, c2 as ViewportOrientation, aZ as PersistentLayer, bK as TitleBlockInput, bf as SectionHeaderInput, j as BigTextInput, u as ContentBlockInput, bl as StatHighlightInput, b9 as QuoteBlockInput, Y as FactCardInput, bS as TwoColumnInput, J as DateEventInput, a4 as ImageWithCaptionInput, a9 as LeftFeatureInput, bc as RightFeatureInput, ae as MapBlockInput, bk as StartBlockConfig, $ as FullBleedQuoteInput, ac as ListBlockInput, b2 as PhotoGridInput, L as DefinitionCardInput, t as ComparisonBarInput, b8 as PullQuoteInput, c0 as VideoWithCaptionInput, b$ as VideoPullQuoteInput, I as DataTableInput, M as DiagramBlockInput, bN as TreeBlockInput, bG as TimelineBlockInput, U as DrawingBlockInput, ai as MarkerStyle, A as AccentImage, a3 as ImageTreatment, a as AccentPosition, c as Animation, d as AnimationType, au as MotionState, ar as MotionProfile, bz as ThemeColorScheme, w as CountUpSpec, bB as ThemeRegistry, aR as PageEmphasis, bA as ThemePageStyle, S as DocDiagnostic, P as DiagramTemplateNode, O as DiagramTemplateEdge, bJ as TimelineTemplateTrack, bI as TimelineTemplateLink } from '../Doc-DaUT9d7i.js';
2
+ export { V as FRONTMATTER_CUSTOM_TEMPLATES_KEY, W as FRONTMATTER_CUSTOM_THEMES_KEY, a8 as LayoutHints, bb as RenderStyle, by as ThemeColorPalette, bE as ThemeStyle, bF as ThemeTypography, bT as VIEWPORT_PRESETS, c3 as ViewportPreset, c8 as createTemplateContext, cf as getLayoutHints, ci as getTwoColumnPositions, cj as getViewport, ck as getViewportOrientation, co as isTemplateBlock, cu as scaledFontSize } from '../Doc-DaUT9d7i.js';
3
+ import { g as BuildStep, M as MarkdownBlockNode, S as MarkdownListItem, f as BuildSpec, e as BuildCursor, h as BuildTiming, V as MarkdownNode, ae as TransitionType, ad as TransitionDirection, z as MarkdownHeading, v as MarkdownDocument, a2 as MarkdownTable, q as MarkdownCodeBlock, R as MarkdownList } from '../types--c_Uqmlh.js';
4
+ import { C as CoercedBlockMeta } from '../annotationCoercion-m2qN3r1k.js';
5
+ import { c as PageSection } from '../materializePageSection-Kj9ROls1.js';
6
+ export { M as MaterializePageSectionOptions, a as MaterializePageSectionsOptions, P as PageMedia, b as PageRichText, d as PageSectionDiagnostic, e as PageSectionItem, f as PageSectionMaterialization, g as PageSectionSource, h as PageSpatialKind, i as PageTransformHints, m as materializePageSection, j as materializePageSections, r as resolvePageStyle } from '../materializePageSection-Kj9ROls1.js';
7
7
  import { C as ContentContainer } from '../ContentContainer-B2w9sUoL.js';
8
8
  import { V as ViewIssue } from '../viewState-lTZS-hP_.js';
9
- export { D as DEFAULT_THEME, g as getAvailableThemes, b as getThemeSummaries, r as resolveTheme } from '../themeLibrary-BrBc0mrP.js';
9
+ export { D as DEFAULT_THEME, g as getAvailableThemes, b as getThemeSummaries, r as resolveTheme } from '../themeLibrary-BRRm1Hna.js';
10
10
 
11
11
  /** Pure build planning and evaluation, shared by interactive slides and frame export. */
12
12
 
package/dist/doc/index.js CHANGED
@@ -74,9 +74,9 @@ import {
74
74
  validateMarkdownSource,
75
75
  wordRevealDelay,
76
76
  writeDashboardLayoutsToFrontmatter
77
- } from "../chunk-SK5TQSYN.js";
77
+ } from "../chunk-LCMQCRRX.js";
78
78
  import "../chunk-FTN6SGW5.js";
79
- import "../chunk-ZBPWNH4L.js";
79
+ import "../chunk-HFDYPPNJ.js";
80
80
  import {
81
81
  BASE_INPUT_DESCRIPTORS,
82
82
  BLOCK_MEDIA_LAYOUT_POLICIES,
@@ -190,7 +190,7 @@ import {
190
190
  wrapWithPersistentLayers,
191
191
  writeCustomTemplatesToFrontmatter,
192
192
  writeCustomThemesToFrontmatter
193
- } from "../chunk-VTVBSZXB.js";
193
+ } from "../chunk-I3ENXLAN.js";
194
194
  import {
195
195
  ASCII_CHAR_H,
196
196
  ASCII_CHAR_W,
@@ -242,7 +242,7 @@ import {
242
242
  treeFromMarkdownList,
243
243
  treeFromTemplateData,
244
244
  treeToTemplateData
245
- } from "../chunk-MPEGJKFJ.js";
245
+ } from "../chunk-GGZCJ2MS.js";
246
246
  import "../chunk-SVN7T6BK.js";
247
247
  import {
248
248
  PATH_SHAPE_KINDS,
@@ -277,7 +277,7 @@ import {
277
277
  } from "../chunk-HYJ63N6V.js";
278
278
  import "../chunk-JSGIWW35.js";
279
279
  import "../chunk-L7QZORLB.js";
280
- import "../chunk-EX75I5HX.js";
280
+ import "../chunk-XZZFXXXR.js";
281
281
  import {
282
282
  CONTAINER_TEMPLATES,
283
283
  TABLE_FED_TEMPLATES,
@@ -1,5 +1,5 @@
1
- import { bx as Theme } from '../Doc-BkSiCJnM.js';
2
- import '../types-BmEHcL3l.js';
1
+ import { bx as Theme } from '../Doc-DaUT9d7i.js';
2
+ import '../types--c_Uqmlh.js';
3
3
 
4
4
  /**
5
5
  * Host-pluggable fence renderers — the contract shared by the read path
@@ -1,7 +1,7 @@
1
1
  import { E as ExtractedElement } from '../contentExtractor-BNfVJV2U.js';
2
2
  export { C as ComparisonData, D as DateData, a as DefinitionData, b as ExtractionOptions, c as ExtractionResult, d as ExtractionType, F as FactData, I as ImpactLineData, L as ListData, Q as QuoteData, S as StatData, e as extractContent, s as stripMarkdown } from '../contentExtractor-BNfVJV2U.js';
3
- import { r as ColorScheme, A as AccentImage, br as TemplateBlock } from '../Doc-BkSiCJnM.js';
4
- import '../types-BmEHcL3l.js';
3
+ import { r as ColorScheme, A as AccentImage, br as TemplateBlock } from '../Doc-DaUT9d7i.js';
4
+ import '../types--c_Uqmlh.js';
5
5
 
6
6
  /**
7
7
  * Template Mapper
@@ -1,9 +1,9 @@
1
- import { a as ImageEditDoc, b as ImageEditLayer } from '../ImageEditDoc-UjQv8q3j.js';
2
- export { E as EditorLayerMeta, I as ImageEditCanvas, c as ImageEditLayerKind, d as ImageEditMeta } from '../ImageEditDoc-UjQv8q3j.js';
1
+ import { a as ImageEditDoc, b as ImageEditLayer } from '../ImageEditDoc-vFCJ_bT1.js';
2
+ export { E as EditorLayerMeta, I as ImageEditCanvas, c as ImageEditLayerKind, d as ImageEditMeta } from '../ImageEditDoc-vFCJ_bT1.js';
3
3
  import { C as ContentContainer } from '../ContentContainer-B2w9sUoL.js';
4
4
  import { V as Version, C as CoalesceOptions, P as PrunePolicy } from '../types-8QjefM9J.js';
5
- import '../Doc-BkSiCJnM.js';
6
- import '../types-BmEHcL3l.js';
5
+ import '../Doc-DaUT9d7i.js';
6
+ import '../types--c_Uqmlh.js';
7
7
 
8
8
  /**
9
9
  * Pure helpers for constructing and mutating {@link ImageEditDoc} values.
package/dist/index.d.ts CHANGED
@@ -1,17 +1,17 @@
1
- export { B as BUILD_EFFECTS, a as BUILD_MODES, b as BUILD_PARAM_KEYS, c as BUILD_PREVIOUS, d as BuildAdvance, e as BuildCursor, f as BuildSpec, g as BuildStep, h as BuildTiming, D as DEFAULT_MARKDOWN_SAFETY_LIMITS, i as DEFAULT_TRANSITION_DURATION_SECONDS, H as HeadingAttributes, j as HeadingTemplateAnnotation, k as HtmlComment, l as HtmlElement, m as HtmlNode, n as HtmlText, M as MarkdownBlockNode, o as MarkdownBlockquote, p as MarkdownBreak, q as MarkdownCodeBlock, r as MarkdownContainerDirective, s as MarkdownDefinitionDescription, t as MarkdownDefinitionList, u as MarkdownDefinitionTerm, v as MarkdownDocument, w as MarkdownEmphasis, x as MarkdownFootnoteDefinition, y as MarkdownFootnoteReference, z as MarkdownHeading, A as MarkdownHtmlBlock, C as MarkdownImage, E as MarkdownImageReference, F as MarkdownInlineCode, G as MarkdownInlineHtml, I as MarkdownInlineIcon, J as MarkdownInlineMath, K as MarkdownInlineNode, L as MarkdownLeafDirective, N as MarkdownLimitError, O as MarkdownLink, P as MarkdownLinkDefinition, Q as MarkdownLinkReference, R as MarkdownList, S as MarkdownListItem, T as MarkdownMathBlock, U as MarkdownMention, V as MarkdownNode, W as MarkdownParagraph, X as MarkdownPoint, Y as MarkdownSafetyLimits, Z as MarkdownSourcePosition, _ as MarkdownStrikethrough, $ as MarkdownStrong, a0 as MarkdownSubscript, a1 as MarkdownSuperscript, a2 as MarkdownTable, a3 as MarkdownTableCell, a4 as MarkdownTableRow, a5 as MarkdownText, a6 as MarkdownTextDirective, a7 as MarkdownThematicBreak, a8 as ParseOptions, a9 as StringifyOptions, aa as TRANSITION_DIRECTIONS, ab as TRANSITION_TYPES, ac as Transition, ad as TransitionDirection, ae as TransitionType, af as assertMarkdownDocumentWithinLimits, ag as assertMarkdownSourceWithinLimits, ah as buildSpecParams, ai as isTransitionType, aj as normalizeTransitionDirection, ak as normalizeTransitionType, al as parseBuildSpec, am as recordBuildAdvance, an as resolveBlockTransition, ao as resolveMarkdownSafetyLimits, ap as resolveTransitionDuration } from './types-BmEHcL3l.js';
1
+ export { B as BUILD_EFFECTS, a as BUILD_MODES, b as BUILD_PARAM_KEYS, c as BUILD_PREVIOUS, d as BuildAdvance, e as BuildCursor, f as BuildSpec, g as BuildStep, h as BuildTiming, D as DEFAULT_MARKDOWN_SAFETY_LIMITS, i as DEFAULT_TRANSITION_DURATION_SECONDS, H as HeadingAttributes, j as HeadingTemplateAnnotation, k as HtmlComment, l as HtmlElement, m as HtmlNode, n as HtmlText, M as MarkdownBlockNode, o as MarkdownBlockquote, p as MarkdownBreak, q as MarkdownCodeBlock, r as MarkdownContainerDirective, s as MarkdownDefinitionDescription, t as MarkdownDefinitionList, u as MarkdownDefinitionTerm, v as MarkdownDocument, w as MarkdownEmphasis, x as MarkdownFootnoteDefinition, y as MarkdownFootnoteReference, z as MarkdownHeading, A as MarkdownHtmlBlock, C as MarkdownImage, E as MarkdownImageReference, F as MarkdownInlineCode, G as MarkdownInlineHtml, I as MarkdownInlineIcon, J as MarkdownInlineMath, K as MarkdownInlineNode, L as MarkdownLeafDirective, N as MarkdownLimitError, O as MarkdownLink, P as MarkdownLinkDefinition, Q as MarkdownLinkReference, R as MarkdownList, S as MarkdownListItem, T as MarkdownMathBlock, U as MarkdownMention, V as MarkdownNode, W as MarkdownParagraph, X as MarkdownPoint, Y as MarkdownSafetyLimits, Z as MarkdownSourcePosition, _ as MarkdownStrikethrough, $ as MarkdownStrong, a0 as MarkdownSubscript, a1 as MarkdownSuperscript, a2 as MarkdownTable, a3 as MarkdownTableCell, a4 as MarkdownTableRow, a5 as MarkdownText, a6 as MarkdownTextDirective, a7 as MarkdownThematicBreak, a8 as ParseOptions, a9 as StringifyOptions, aa as TRANSITION_DIRECTIONS, ab as TRANSITION_TYPES, ac as Transition, ad as TransitionDirection, ae as TransitionType, af as assertMarkdownDocumentWithinLimits, ag as assertMarkdownSourceWithinLimits, ah as buildSpecParams, ai as isTransitionType, aj as normalizeTransitionDirection, ak as normalizeTransitionType, al as parseBuildSpec, am as recordBuildAdvance, an as resolveBlockTransition, ao as resolveMarkdownSafetyLimits, ap as resolveTransitionDuration } from './types--c_Uqmlh.js';
2
2
  export { B as BoundingBox, C as Coordinates } from './Types-sh2VRxfo.js';
3
- export { A as AccentImage, a as AccentPosition, b as AmbientGradientConfig, c as Animation, d as AnimationType, e as AreaChartInput, f as AudioBookmark, g as AudioSegment, h as AudioTimingData, i as AudioTrack, B as BarChartInput, j as BigTextInput, k as Block, l as BlockConnection, m as BorderStyle, C as CaptionPhrase, n as CaptionTrack, o as CaptionWord, p as ChartBaseFields, q as ChartTemplateInput, r as ColorScheme, s as ColumnChartInput, t as ComparisonBarInput, u as ContentBlockInput, v as CornerBrandingConfig, w as CountUpSpec, x as CreateTemplateContextOptions, y as CustomTemplateDefinition, z as CustomTemplateLayer, D as CustomTemplateValidationError, E as CustomTemplateValidationResult, F as DARK_SURFACE, G as DEFAULT_DOC_FONT, H as DEFAULT_TITLE_FONT, I as DataTableInput, J as DateEventInput, K as DeepPartial, L as DefinitionCardInput, M as DiagramBlockInput, N as DiagramEdgeAnchor, O as DiagramTemplateEdge, P as DiagramTemplateNode, Q as Doc, R as DocBlock, S as DocDiagnostic, T as DonutChartInput, U as DrawingBlockInput, V as FRONTMATTER_CUSTOM_TEMPLATES_KEY, W as FRONTMATTER_CUSTOM_THEMES_KEY, X as FRONTMATTER_MOTION_KEY, Y as FactCardInput, Z as FontFamily, _ as FontFamilyKind, $ as FullBleedQuoteInput, a0 as GradientBackgroundConfig, a1 as ImageBackgroundConfig, a2 as ImageLayer, a3 as ImageTreatment, a4 as ImageWithCaptionInput, a5 as LIGHT_SURFACE, a6 as Layer, a7 as LayerRepeat, a8 as LayoutHints, a9 as LeftFeatureInput, aa as LineChartInput, ab as LinearGradient, ac as ListBlockInput, ad as MOTION_PROFILES, ae as MapBlockInput, af as MapLayer, ag as MapMarker, ah as MapTileStyle, ai as MarkerStyle, aj as MediaClip, ak as MediaCrop, al as MediaCut, am as MediaEdits, an as MediaScheduleOptions, ao as MermaidLayer, ap as MotionEntrance, aq as MotionOrigin, ar as MotionProfile, as as MotionProfileName, at as MotionSpec, au as MotionState, av as PAGE_ACCENT_STRATEGIES, aw as PAGE_BACKGROUNDS, ax as PAGE_BACKGROUND_RHYTHMS, ay as PAGE_DESIGN_FAMILIES, az as PAGE_DIVIDERS, aA as PAGE_EMPHASES, aB as PAGE_EYEBROWS, aC as PAGE_HEADING_CASES, aD as PAGE_HEADING_SCALES, aE as PAGE_HEADING_UNDERLINES, aF as PAGE_HERO_STYLES, aG as PAGE_IMAGE_FRAMINGS, aH as PAGE_NUMERAL_STYLES, aI as PAGE_PATTERNS, aJ as PAGE_QUOTE_MARKS, aK as PAGE_SECTION_KINDS, aL as PAGE_SECTION_SPACINGS, aM as PAGE_SHADOWS, aN as PAGE_VARIANTS, aO as PageAccentRotation, aP as PageBackground, aQ as PageDesignFamily, aR as PageEmphasis, aS as PageHeadingTreatment, aT as PageSectionKind, aU as PageSectionOverride, aV as PageTokens, aW as PageVariant, aX as PathLayer, aY as PatternBackgroundConfig, aZ as PersistentLayer, a_ as PersistentLayerConfig, a$ as PersistentLayerTemplate, b0 as PersistentLayerTemplateConfig, b1 as PersistentLayerTemplateType, b2 as PhotoGridInput, b3 as PieChartInput, b4 as PipStyle, b5 as Position, b6 as ProgressIndicatorConfig, b7 as PromotedBodyAnnotation, b8 as PullQuoteInput, b9 as QuoteBlockInput, ba as RawLayersInput, bb as RenderStyle, bc as RightFeatureInput, bd as ScatterChartInput, be as ScheduledClip, bf as SectionHeaderInput, bg as ShapeFilter, bh as ShapeLayer, bi as ShapePattern, bj as SolidBackgroundConfig, bk as StartBlockConfig, bl as StatHighlightInput, bm as SurfaceScheme, bn as SvgLayer, bo as THEME_SCHEMA_VERSION, bp as TableLayer, bq as TableLayerStyle, br as TemplateBlock, bs as TemplateContext, bt as TemplateFunction, bu as TemplateRegistry, bv as TextLayer, bw as TextStyle, bx as Theme, by as ThemeColorPalette, bz as ThemeColorScheme, bA as ThemePageStyle, bB as ThemeRegistry, bC as ThemeSchemaVersion, bD as ThemeSeedColors, bE as ThemeStyle, bF as ThemeTypography, bG as TimelineBlockInput, bH as TimelineTemplateEvent, bI as TimelineTemplateLink, bJ as TimelineTemplateTrack, bK as TitleBlockInput, bL as TitleCaptionConfig, bM as TranscriptBlockInput, bN as TreeBlockInput, bO as TreeLayer, bP as TreeLayerItem, bQ as TreeLayerStyle, bR as TreeTemplateItem, bS as TwoColumnInput, bT as VIEWPORT_PRESETS, bU as VideoEmbedLayer, bV as VideoLayer, bW as VideoPipPosition, bX as VideoPipShape, bY as VideoPipSize, bZ as VideoPlacement, b_ as VideoPresentation, b$ as VideoPullQuoteInput, c0 as VideoWithCaptionInput, c1 as ViewportConfig, c2 as ViewportOrientation, c3 as ViewportPreset, c4 as VignetteConfig, c5 as applySurface, c6 as calculateDuration, c7 as calculateFontScale, c8 as createTemplateContext, c9 as createTheme, ca as createThemeRegistry, cb as getAspectRatioString, cc as getBlockAtTime, cd as getCaptionAtTime, ce as getDocPlaybackDuration, cf as getLayoutHints, cg as getSafeTextBounds, ch as getSegmentAtTime, ci as getTwoColumnPositions, cj as getViewport, ck as getViewportOrientation, cl as isCustomTemplateDefinition, cm as isMotionProfileName, cn as isPersistentLayerTemplate, co as isTemplateBlock, cp as layoutScaledFontSize, cq as readFrontmatterMotion, cr as resolveMediaSchedule, cs as resolveMotionForDoc, ct as resolveMotionProfile, cu as scaledFontSize, cv as scheduleMediaClip, cw as validateCustomTemplateDefinition } from './Doc-BkSiCJnM.js';
3
+ export { A as AccentImage, a as AccentPosition, b as AmbientGradientConfig, c as Animation, d as AnimationType, e as AreaChartInput, f as AudioBookmark, g as AudioSegment, h as AudioTimingData, i as AudioTrack, B as BarChartInput, j as BigTextInput, k as Block, l as BlockConnection, m as BorderStyle, C as CaptionPhrase, n as CaptionTrack, o as CaptionWord, p as ChartBaseFields, q as ChartTemplateInput, r as ColorScheme, s as ColumnChartInput, t as ComparisonBarInput, u as ContentBlockInput, v as CornerBrandingConfig, w as CountUpSpec, x as CreateTemplateContextOptions, y as CustomTemplateDefinition, z as CustomTemplateLayer, D as CustomTemplateValidationError, E as CustomTemplateValidationResult, F as DARK_SURFACE, G as DEFAULT_DOC_FONT, H as DEFAULT_TITLE_FONT, I as DataTableInput, J as DateEventInput, K as DeepPartial, L as DefinitionCardInput, M as DiagramBlockInput, N as DiagramEdgeAnchor, O as DiagramTemplateEdge, P as DiagramTemplateNode, Q as Doc, R as DocBlock, S as DocDiagnostic, T as DonutChartInput, U as DrawingBlockInput, V as FRONTMATTER_CUSTOM_TEMPLATES_KEY, W as FRONTMATTER_CUSTOM_THEMES_KEY, X as FRONTMATTER_MOTION_KEY, Y as FactCardInput, Z as FontFamily, _ as FontFamilyKind, $ as FullBleedQuoteInput, a0 as GradientBackgroundConfig, a1 as ImageBackgroundConfig, a2 as ImageLayer, a3 as ImageTreatment, a4 as ImageWithCaptionInput, a5 as LIGHT_SURFACE, a6 as Layer, a7 as LayerRepeat, a8 as LayoutHints, a9 as LeftFeatureInput, aa as LineChartInput, ab as LinearGradient, ac as ListBlockInput, ad as MOTION_PROFILES, ae as MapBlockInput, af as MapLayer, ag as MapMarker, ah as MapTileStyle, ai as MarkerStyle, aj as MediaClip, ak as MediaCrop, al as MediaCut, am as MediaEdits, an as MediaScheduleOptions, ao as MermaidLayer, ap as MotionEntrance, aq as MotionOrigin, ar as MotionProfile, as as MotionProfileName, at as MotionSpec, au as MotionState, av as PAGE_ACCENT_STRATEGIES, aw as PAGE_BACKGROUNDS, ax as PAGE_BACKGROUND_RHYTHMS, ay as PAGE_DESIGN_FAMILIES, az as PAGE_DIVIDERS, aA as PAGE_EMPHASES, aB as PAGE_EYEBROWS, aC as PAGE_HEADING_CASES, aD as PAGE_HEADING_SCALES, aE as PAGE_HEADING_UNDERLINES, aF as PAGE_HERO_STYLES, aG as PAGE_IMAGE_FRAMINGS, aH as PAGE_NUMERAL_STYLES, aI as PAGE_PATTERNS, aJ as PAGE_QUOTE_MARKS, aK as PAGE_SECTION_KINDS, aL as PAGE_SECTION_SPACINGS, aM as PAGE_SHADOWS, aN as PAGE_VARIANTS, aO as PageAccentRotation, aP as PageBackground, aQ as PageDesignFamily, aR as PageEmphasis, aS as PageHeadingTreatment, aT as PageSectionKind, aU as PageSectionOverride, aV as PageTokens, aW as PageVariant, aX as PathLayer, aY as PatternBackgroundConfig, aZ as PersistentLayer, a_ as PersistentLayerConfig, a$ as PersistentLayerTemplate, b0 as PersistentLayerTemplateConfig, b1 as PersistentLayerTemplateType, b2 as PhotoGridInput, b3 as PieChartInput, b4 as PipStyle, b5 as Position, b6 as ProgressIndicatorConfig, b7 as PromotedBodyAnnotation, b8 as PullQuoteInput, b9 as QuoteBlockInput, ba as RawLayersInput, bb as RenderStyle, bc as RightFeatureInput, bd as ScatterChartInput, be as ScheduledClip, bf as SectionHeaderInput, bg as ShapeFilter, bh as ShapeLayer, bi as ShapePattern, bj as SolidBackgroundConfig, bk as StartBlockConfig, bl as StatHighlightInput, bm as SurfaceScheme, bn as SvgLayer, bo as THEME_SCHEMA_VERSION, bp as TableLayer, bq as TableLayerStyle, br as TemplateBlock, bs as TemplateContext, bt as TemplateFunction, bu as TemplateRegistry, bv as TextLayer, bw as TextStyle, bx as Theme, by as ThemeColorPalette, bz as ThemeColorScheme, bA as ThemePageStyle, bB as ThemeRegistry, bC as ThemeSchemaVersion, bD as ThemeSeedColors, bE as ThemeStyle, bF as ThemeTypography, bG as TimelineBlockInput, bH as TimelineTemplateEvent, bI as TimelineTemplateLink, bJ as TimelineTemplateTrack, bK as TitleBlockInput, bL as TitleCaptionConfig, bM as TranscriptBlockInput, bN as TreeBlockInput, bO as TreeLayer, bP as TreeLayerItem, bQ as TreeLayerStyle, bR as TreeTemplateItem, bS as TwoColumnInput, bT as VIEWPORT_PRESETS, bU as VideoEmbedLayer, bV as VideoLayer, bW as VideoPipPosition, bX as VideoPipShape, bY as VideoPipSize, bZ as VideoPlacement, b_ as VideoPresentation, b$ as VideoPullQuoteInput, c0 as VideoWithCaptionInput, c1 as ViewportConfig, c2 as ViewportOrientation, c3 as ViewportPreset, c4 as VignetteConfig, c5 as applySurface, c6 as calculateDuration, c7 as calculateFontScale, c8 as createTemplateContext, c9 as createTheme, ca as createThemeRegistry, cb as getAspectRatioString, cc as getBlockAtTime, cd as getCaptionAtTime, ce as getDocPlaybackDuration, cf as getLayoutHints, cg as getSafeTextBounds, ch as getSegmentAtTime, ci as getTwoColumnPositions, cj as getViewport, ck as getViewportOrientation, cl as isCustomTemplateDefinition, cm as isMotionProfileName, cn as isPersistentLayerTemplate, co as isTemplateBlock, cp as layoutScaledFontSize, cq as readFrontmatterMotion, cr as resolveMediaSchedule, cs as resolveMotionForDoc, ct as resolveMotionProfile, cu as scaledFontSize, cv as scheduleMediaClip, cw as validateCustomTemplateDefinition } from './Doc-DaUT9d7i.js';
4
4
  export { AVAILABLE_FONT_STACKS, CompileOptions, ContrastPreset, DocSchemaIssue, FONT_FALLBACKS, FontStack, MermaidThemeVariables, PipStyleVars, STARTER_THEME, ValidationError, ValidationResult, accentToColorScheme, assertDocSchema, assertTheme, buildGoogleFontsUrl, buildMermaidThemeVariables, compileTheme, contrastRatio, defaultPageStyle, deriveColorPalette, deriveScale, fontStack, getFontStack, guessFontFallback, hexHueDegrees, isHex, matchFontFamily, oklchDarken, oklchLighten, oklchSetChroma, parseTheme, pickContrastingText, pipStyleVars, relativeLuminance, resolveFontFamily, serializeTheme, validateDocSchema, validateTheme, withAlpha } from './schemas/index.js';
5
- export { D as DEFAULT_THEME, a as DEFAULT_THEME_ID, T as THEMES, g as getAvailableThemes, b as getThemeSummaries, r as resolveTheme } from './themeLibrary-BrBc0mrP.js';
5
+ export { D as DEFAULT_THEME, a as DEFAULT_THEME_ID, T as THEMES, g as getAvailableThemes, b as getThemeSummaries, r as resolveTheme } from './themeLibrary-BRRm1Hna.js';
6
6
  export { M as MediaEntry, a as MediaProvider } from './MediaProvider-wpSe21B3.js';
7
- export { E as EditorLayerMeta, I as ImageEditCanvas, a as ImageEditDoc, b as ImageEditLayer, c as ImageEditLayerKind, d as ImageEditMeta } from './ImageEditDoc-UjQv8q3j.js';
7
+ export { E as EditorLayerMeta, I as ImageEditCanvas, a as ImageEditDoc, b as ImageEditLayer, c as ImageEditLayerKind, d as ImageEditMeta } from './ImageEditDoc-vFCJ_bT1.js';
8
8
  export { ASCII_CHAR_H, ASCII_CHAR_W, ASCII_DIAGRAM_FENCE_LANGS, ASCII_TIMELINE_FENCE_LANGS, AccentLayout, AsciiDiagram, AsciiDiagramDetection, AsciiDiagramEdge, AsciiDiagramNode, AsciiTimeline, AsciiTimelineDetection, AsciiTimelineEvent, AsciiTimelineLink, AsciiTimelineMarker, AsciiTimelineSide, AsciiTimelineStats, AsciiTimelineStyle, AsciiTimelineTrack, AudioSegmentTiming, BASE_INPUT_DESCRIPTORS, BLOCK_MEDIA_LAYOUT_POLICIES, BUILTIN_DASHBOARD_LAYOUTS, BlockLayerMaterialization, BlockMediaLayoutPolicy, BuildPreviewDocOptions, BuildTimeline, BuiltInTemplateName, CONTAINER_TEMPLATES, COVER_SLIDE_FRONTMATTER_KEYS, COVER_SLIDE_TEMPLATE_OPTIONS, ClipBox, ConnectorAnchor, ConnectorPort, ConnectorRouting, ConnectorSnapPoint, ContentBuildPlan, CoverBlockInput, CoverSlidePlayback, CoverSlideSettings, CoverSlideTemplate, CoverSlideTemplateOption, DASHBOARD_AUTO_LAYOUT_ID, DASHBOARD_FRONTMATTER_KEYS, DASHBOARD_STYLES, DASHBOARD_STYLE_IDS, DASHBOARD_ZOOM_LEVELS, DATA_FILE_EXTENSIONS, DEFAULT_COVER_SLIDE_SETTINGS, DEFAULT_DASHBOARD_SETTINGS, DEFAULT_DASHBOARD_STYLE, DEFAULT_LAYOUT, DEFAULT_WORD_STAGGER, DIAGRAM_LABEL_HORIZONTAL_PADDING, DIAGRAM_LABEL_LINE_HEIGHT, DIAGRAM_LABEL_MIN_FONT_SIZE, DIAGRAM_LABEL_VERTICAL_PADDING, DashboardCell, DashboardCellChrome, DashboardCellDefinition, DashboardCellFrame, DashboardDiagnostic, DashboardLayoutDefinition, DashboardLayoutSummary, DashboardLayoutValidationError, DashboardLayoutValidationResult, DashboardMaterialization, DashboardRectPct, DashboardSettings, DashboardSettingsOverrides, DashboardStyleId, DashboardStyleSummary, DashboardTitle, DashboardTitleSlotDefinition, DashboardZoomCandidate, DashboardZoomLevel, DashboardZoomMode, DataFenceParseResult, DataSourceReadOptions, DataSourceReader, DataSourceStats, DataSourceTable, DeriveTemplateInputsOptions, DetectAsciiTimelineOptions, DiagramEdge, DiagramLabelFit, DiagramLayout, DiagramLayoutOptions, DiagramNodePosition, DrawingConnector, DrawingLayout, DrawingLayoutOptions, DrawingShape, DrawingShapeKind, EmbeddedVideo, ExpandDocBlocksOptions, ExtractedTableData, FRONTMATTER_DASHBOARD_LAYOUTS_KEY, FirstImage, Flashcard, FlashcardChoice, FlashcardDeck, FlashcardDiagnostic, FlashcardDiagnosticCode, FlashcardFace, FlashcardKind, FlashcardSourceMode, GEOMETRY_BOUND_TEMPLATES, HostedVideo, InputCoercion, LayerMaterializationDiagnostic, LayerMaterializationFailureMode, LayerMaterializationSource, LayoutLayerDefaults, LayoutLayersResult, MAX_COVER_SLIDE_DURATION_SECONDS, MarkdownToDocOptions, MarkdownValidationResult, MaterializeBlockLayersOptions, MaterializeDashboardOptions, MaterializeFlashcardsOptions, NarrationResolution, NativeMediaLayout, NoMediaLayout, PAGE_BASE_CSS, PATH_SHAPE_KINDS, PageSectionContext, PageSectionDraft, ParsedStat, RenderAsciiDiagramOptions, RenderAsciiTimelineOptions, RenderTreeOptions, RepairResult, ResolveDataReferencesOptions, ResolvedDashboardCell, ResolvedDataReferences, ResolvedPageBlock, RichListItem, RuntimeTemplateRegistry, SHAPE_NAMES, SectionExtractor, SupplementalMediaLayoutVariant, SupplementalMediaShape, SupplementalMediaVariantMatrix, TABLE_FED_TEMPLATES, TEMPLATE_AUTHORING_METADATA, TEMPLATE_INPUT_DESCRIPTORS, TEMPLATE_METADATA, TREE_FENCE_LANGS, TemplateAuthoringMetadata, TemplateAuthoringRole, TemplateBodyPolicy, TemplateInputDescriptor, TemplateMediaOwnership, TemplateMetadata, TemplateParamFinding, Tree, TreeDetection, TreeItem, TreeNode, UnconsumedMediaBehavior, ValidateOptions, accentForViewport, adjustY, anchorPoint, applyNarrationTiming, applyRenderStyleToLayers, asciiCellToCanvas, asciiDiagramFromBlocks, asciiDiagramFromTemplateData, asciiDiagramToTemplateData, asciiTimelineToTemplateData, autoTemplatePreservesContent, bigText, blockBuildSteps, buildCursorAtTime, buildDashboardCellChrome, buildPageCss, buildPageCssVars, buildPreviewDoc, buildRegistry, buildSourceText, buildTargetState, canvasToAsciiCell, chooseDashboardLayout, clipEndpoints, clipPoint, coerceTemplateParams, comparisonBar, composeDashboardLayers, computeDiagramLayout, computeDrawingLayout, computeLayoutLayers, connectorPath, contentBlock, countBlocks, countUpSpecFor, coverBlock, createAccentLayers, cssFilterForTreatment, dashboardCanvasFill, dashboardCellAccent, dataSidecarPrefix, dataTable, dateEvent, definitionCard, deriveTemplateInputs, desiredCellZoom, detectAsciiDiagram, detectAsciiTimeline, detectTree, diagramBlock, docToMarkdown, documentTitleFromFileName, drawingBlock, expandCoverBlock, expandDocBlocks, expandPersistentLayers, extractBlockquoteText, extractBodyPlainText, extractEmbeddedVideos, extractFirstEmbeddedVideo, extractFirstImage, extractHostedVideos, extractImages, extractListItems, extractRichListItems, extractTableData, extractTableFromContents, factCard, fallbackBlockLayers, findFirstList, findFirstTable, fitBigTextSize, fitDiagramLabel, flattenBlocks, flattenRenderableBlocks, formatCountUp, formatCountValue, fullBleedQuote, getAccentLayout, getAnimationProgress, getAnimationStyle, getAvailableTemplates, getBlockBodyText, getBlockDepth, getBlockMediaLayoutPolicy, getDashboardLayoutSummaries, getDefaultAnimation, getDefaultAnimationDuration, getMotionProfile, getOverlayOpacity, getPersistentLayersFromTheme, getPinnedBlockMeta, getTemplateHint, getThemeFont, getTransitionClass, hasBlockBuilds, hasTemplate, imageWithCaption, isAsciiDiagramFence, isAsciiTimelineFence, isContainerTemplate, isDataFence, isDataFilePath, isEligibleAsciiFenceLang, isEligibleAsciiTimelineFenceLang, isEligibleTreeFenceLang, isExplicitDiagramLang, isExplicitTimelineLang, isExplicitTreeLang, isGeometryBoundTemplate, isMaterializedMediaNode, isPictureFence, isRepairableDiagram, isShapeName, isTemplatedPageBlock, isTreeFence, isWrappedFlowTimelineSource, layoutBlock, layoutCapacity, leftFeature, lineStyleDasharray, lintTemplateParams, listBlock, listDashboardLayouts, mapBlock, markdownBlockSeparatorLines, markdownToDoc, markerPath, materializeBlockLayers, materializeDashboard, materializeFlashcards, motionDelay, motionEntrance, motionStateTransform, nearestSnapPoint, normalizeDashboardZoom, normalizeShapeKind, pageStyleDataAttributes, parseAsciiDiagram, parseAsciiTimeline, parseAsciiTimelineWithStats, parseDataFence, parseStatNumber, parseTree, parseWrappedFlowTimeline, parseYamlSubset, photoGrid, planContentBuilds, pullQuote, quoteBlock, readCustomTemplatesFromFrontmatter, readCustomThemesFromFrontmatter, readDashboardLayoutsFromFrontmatter, renderAsciiDiagram, renderAsciiTimeline, renderMarkdownBlocksHtml, renderTree, repairAsciiDiagram, replaceDataFence, resolveAudioMapping, resolveBuildTimeline, resolveColorScheme, resolveCoverSlideSettings, resolveDashboardLayoutDefinition, resolveDashboardSettings, resolveDashboardStyleId, resolveDashboardZooms, resolveDataReferences, resolveDocBuildTiming, resolveFlashcardMarker, resolveLayoutCells, resolvePageBlock, resolvePersistentLayers, resolveTemplateName, resolveThemeForDoc, rightFeature, scaleAnimationDuration, scoreTextSimilarity, sectionExtractors, sectionHeader, shapePath, shouldUseShadow, snapEndpoints, snapPoints, statHighlight, stripBlockBackdropLayer, stripsBlockBackdrop, templateRegistry, themeWantsAmbientMotion, themedEntrance, themedFontSize, themedImageTreatment, themedScrim, themedSurfaceGradient, timelineBlock, titleBlock, transformOriginFor, transposeCells, treeBlock, treeFromMarkdownList, treeFromTemplateData, treeToTemplateData, twoColumn, validateDashboardLayoutDefinition, validateMarkdownDoc, validateMarkdownSource, videoPullQuote, videoWithCaption, wordRevealDelay, wrapWithPersistentLayers, writeCustomTemplatesToFrontmatter, writeCustomThemesToFrontmatter, writeDashboardLayoutsToFrontmatter } from './doc/index.js';
9
- export { M as MaterializePageSectionOptions, a as MaterializePageSectionsOptions, P as PageMedia, b as PageRichText, c as PageSection, d as PageSectionDiagnostic, e as PageSectionItem, f as PageSectionMaterialization, g as PageSectionSource, h as PageSpatialKind, i as PageTransformHints, m as materializePageSection, j as materializePageSections, r as resolvePageStyle } from './materializePageSection-DEXohgVt.js';
9
+ export { M as MaterializePageSectionOptions, a as MaterializePageSectionsOptions, P as PageMedia, b as PageRichText, c as PageSection, d as PageSectionDiagnostic, e as PageSectionItem, f as PageSectionMaterialization, g as PageSectionSource, h as PageSpatialKind, i as PageTransformHints, m as materializePageSection, j as materializePageSections, r as resolvePageStyle } from './materializePageSection-Kj9ROls1.js';
10
10
  export { calculateBearing, decodeGeohash, destinationPoint, encodeGeohash, geohashOverlapsBounds, geohashToHierarchicalPath, getGeohash4Neighbors, getGeohashPath, getGeohashPrefix, getNeighbors, haversineDistance, interpolateGreatCircle, sampleGreatCircle } from './spatial/index.js';
11
11
  export { LocalForageAdapter, LocalForageAdapterOptions, LocalStorageAdapter, MemoryStorageAdapter, ScopedContentContainer, StorageAdapter, createMediaProviderFromContainer, scopeContainer } from './storage/index.js';
12
12
  export { C as ContentContainer, a as ContentEntry, M as MemoryContentContainer, f as findDocumentPath } from './ContentContainer-B2w9sUoL.js';
13
13
  export { BlockVideoEmbed, DEFAULT_INTERACTIVE_RESOURCE_POLICY, DEFAULT_RESOURCE_MAX_BYTES, DEFAULT_RESOURCE_TIMEOUT_MS, DEFAULT_WRAP_WIDTH, DocfxMarkdownOptions, FetchResourceBytesOptions, FetchedResource, HtmlPolicy, LOCAL_ONLY_RESOURCE_POLICY, MARKDOWN_SOURCE_TRANSFORMS, MarkdownReferenceOptions, MarkdownSourceEdit, MarkdownSourceTransform, MarkdownSourceTransformId, MarkdownSourceTransformOptions, MarkdownSourceTransformResult, MarkdownWrapState, MediaReferenceKind, ParseSvgIslandOptions, ResourcePolicy, ResourcePolicyError, SVG_ISLAND_LIMITS, SanitizeUrlOptions, SvgIsland, SvgIslandDiagnostic, SvgIslandFailureReason, SvgIslandMarkupOptions, SvgIslandResult, TrailingAnnotationMatch, UrlKind, VIDEO_EMBED_IFRAME_ALLOW, VIDEO_EMBED_PROVIDERS, VideoEmbed, VideoEmbedProviderId, VideoEmbedProviderInfo, applyMarkdownSourceTransform, cleanupMarkdownSource, condenseMarkdownSource, countNodes, createDocument, detectMarkdownWrapState, extractPlainText, fetchResourceBytes, findBlockVideoEmbed, findNodesByType, formatBlockScalar, formatFrontmatterValue, formatFrontmatterYaml, fromMdast, getChildren, inferDocumentTitle, isResourceUrlAllowed, isSvgImageSource, isSvgIslandFence, isSvgIslandLang, isVideoEmbedUrl, matchTrailingPandocAttr, matchTrailingTemplateAnnotation, mediaKindForUrl, needsQuoting, normalizeDocfxMarkdown, parseFrontmatter, parseHtmlToNodes, parseMarkdown, parsePandocAttrTokens, parseSvgIsland, parseVideoEmbedInput, parseVideoEmbedUrl, parseVideoStartTime, plainTextFromInlineHtml, quoteAttrValue, readFrontmatterThemeId, rewriteMarkdownReferences, sanitizeHtmlNodes, sanitizeUrl, serializePandocAttributes, setFrontmatterValues, splitFrontmatterBlock, splitKeyValueToken, stringifyHtmlNodes, stringifyMarkdown, svgIslandDataUrl, svgIslandMarkup, svgSourceFromBytes, svgSourceFromDataUrl, toMdast, tokenizeAttrTokens, unquoteAttrValue, unwrapMarkdownSource, videoEmbedFromIframe, videoEmbedIframeAttributes, walkMarkdownTree, wrapMarkdownSource } from './markdown/index.js';
14
- export { B as BLOCK_META_KEY_DESCRIPTORS, a as BlockMetaKeyDescriptor, K as KNOWN_BLOCK_META_KEYS, b as KnownBlockMetaKey, p as parseTimeSeconds } from './annotationCoercion-TxFucMtA.js';
14
+ export { B as BLOCK_META_KEY_DESCRIPTORS, a as BlockMetaKeyDescriptor, K as KNOWN_BLOCK_META_KEYS, b as KnownBlockMetaKey, p as parseTimeSeconds } from './annotationCoercion-m2qN3r1k.js';
15
15
  export { BuildCaptionTrackOptions, CaptionSegmentSource, DEFAULT_WORDS_PER_SECOND, NarrationTimeEstimate, NarrationTimeOptions, ReadingTimeEstimate, ReadingTimeOptions, buildCaptionTrack, calculatePrefixDuration, countSpokenWords, estimateNarrationDuration, estimateNarrationTime, estimateReadingTime, estimateSpokenWordCount, estimateTimeFromText } from './timing/index.js';
16
16
  export { SeededRandom, hashString } from './random/index.js';
17
17
  export { C as ComparisonData, D as DateData, a as DefinitionData, E as ExtractedElement, b as ExtractionOptions, c as ExtractionResult, d as ExtractionType, F as FactData, I as ImpactLineData, L as ListData, Q as QuoteData, S as StatData, e as extractContent, s as stripMarkdown } from './contentExtractor-BNfVJV2U.js';
package/dist/index.js CHANGED
@@ -27,7 +27,7 @@ import {
27
27
  recordSlideShown,
28
28
  traceWordPosAt,
29
29
  vadStep
30
- } from "./chunk-J6AGNXFO.js";
30
+ } from "./chunk-XFE6WYDK.js";
31
31
  import {
32
32
  fenceRendererLangs
33
33
  } from "./chunk-PGI7HSWE.js";
@@ -229,7 +229,7 @@ import {
229
229
  validateMarkdownSource,
230
230
  wordRevealDelay,
231
231
  writeDashboardLayoutsToFrontmatter
232
- } from "./chunk-SK5TQSYN.js";
232
+ } from "./chunk-LCMQCRRX.js";
233
233
  import {
234
234
  buildNarrationTimingJson,
235
235
  parseNarrationTimingJson,
@@ -261,7 +261,7 @@ import {
261
261
  serializePresentationPlan,
262
262
  transformNarratedSegment,
263
263
  usesDynamicPresentation
264
- } from "./chunk-ZBPWNH4L.js";
264
+ } from "./chunk-HFDYPPNJ.js";
265
265
  import {
266
266
  BASE_INPUT_DESCRIPTORS,
267
267
  BLOCK_MEDIA_LAYOUT_POLICIES,
@@ -381,7 +381,7 @@ import {
381
381
  wrapWithPersistentLayers,
382
382
  writeCustomTemplatesToFrontmatter,
383
383
  writeCustomThemesToFrontmatter
384
- } from "./chunk-VTVBSZXB.js";
384
+ } from "./chunk-I3ENXLAN.js";
385
385
  import {
386
386
  ASCII_CHAR_H,
387
387
  ASCII_CHAR_W,
@@ -435,7 +435,7 @@ import {
435
435
  treeFromMarkdownList,
436
436
  treeFromTemplateData,
437
437
  treeToTemplateData
438
- } from "./chunk-MPEGJKFJ.js";
438
+ } from "./chunk-GGZCJ2MS.js";
439
439
  import {
440
440
  extractContent,
441
441
  mapElementToBlock,
@@ -576,7 +576,7 @@ import {
576
576
  stringifyMarkdown,
577
577
  unwrapMarkdownSource,
578
578
  wrapMarkdownSource
579
- } from "./chunk-ZKDJHO6Y.js";
579
+ } from "./chunk-7GVUWJQN.js";
580
580
  import {
581
581
  DEFAULT_MARKDOWN_SAFETY_LIMITS,
582
582
  MarkdownLimitError,
@@ -588,7 +588,7 @@ import {
588
588
  resolveMarkdownSafetyLimits,
589
589
  serializePandocAttributes,
590
590
  toMdast
591
- } from "./chunk-EX75I5HX.js";
591
+ } from "./chunk-XZZFXXXR.js";
592
592
  import {
593
593
  CONTAINER_TEMPLATES,
594
594
  TABLE_FED_TEMPLATES,
@@ -1,5 +1,5 @@
1
- import { bx as Theme, bm as SurfaceScheme } from '../Doc-BkSiCJnM.js';
2
- import '../types-BmEHcL3l.js';
1
+ import { bx as Theme, bm as SurfaceScheme } from '../Doc-DaUT9d7i.js';
2
+ import '../types--c_Uqmlh.js';
3
3
 
4
4
  /**
5
5
  * JSON Form types — Squisq's hint vocabulary layered on JSON Schema.
@@ -1,6 +1,6 @@
1
- import { a8 as ParseOptions, v as MarkdownDocument, a9 as StringifyOptions, H as HeadingAttributes, m as HtmlNode, M as MarkdownBlockNode, l as HtmlElement, V as MarkdownNode } from '../types-BmEHcL3l.js';
2
- export { D as DEFAULT_MARKDOWN_SAFETY_LIMITS, j as HeadingTemplateAnnotation, k as HtmlComment, n as HtmlText, o as MarkdownBlockquote, p as MarkdownBreak, q as MarkdownCodeBlock, r as MarkdownContainerDirective, s as MarkdownDefinitionDescription, t as MarkdownDefinitionList, u as MarkdownDefinitionTerm, w as MarkdownEmphasis, x as MarkdownFootnoteDefinition, y as MarkdownFootnoteReference, z as MarkdownHeading, A as MarkdownHtmlBlock, C as MarkdownImage, E as MarkdownImageReference, F as MarkdownInlineCode, G as MarkdownInlineHtml, I as MarkdownInlineIcon, J as MarkdownInlineMath, K as MarkdownInlineNode, L as MarkdownLeafDirective, N as MarkdownLimitError, O as MarkdownLink, P as MarkdownLinkDefinition, Q as MarkdownLinkReference, R as MarkdownList, S as MarkdownListItem, T as MarkdownMathBlock, U as MarkdownMention, W as MarkdownParagraph, X as MarkdownPoint, Y as MarkdownSafetyLimits, Z as MarkdownSourcePosition, _ as MarkdownStrikethrough, $ as MarkdownStrong, a0 as MarkdownSubscript, a1 as MarkdownSuperscript, a2 as MarkdownTable, a3 as MarkdownTableCell, a4 as MarkdownTableRow, a5 as MarkdownText, a6 as MarkdownTextDirective, a7 as MarkdownThematicBreak, af as assertMarkdownDocumentWithinLimits, ag as assertMarkdownSourceWithinLimits, ao as resolveMarkdownSafetyLimits } from '../types-BmEHcL3l.js';
3
- export { B as BLOCK_META_KEY_DESCRIPTORS, a as BlockMetaKeyDescriptor, K as KNOWN_BLOCK_META_KEYS, b as KnownBlockMetaKey, p as parseTimeSeconds } from '../annotationCoercion-TxFucMtA.js';
1
+ import { a8 as ParseOptions, v as MarkdownDocument, a9 as StringifyOptions, H as HeadingAttributes, m as HtmlNode, M as MarkdownBlockNode, l as HtmlElement, V as MarkdownNode } from '../types--c_Uqmlh.js';
2
+ export { D as DEFAULT_MARKDOWN_SAFETY_LIMITS, j as HeadingTemplateAnnotation, k as HtmlComment, n as HtmlText, o as MarkdownBlockquote, p as MarkdownBreak, q as MarkdownCodeBlock, r as MarkdownContainerDirective, s as MarkdownDefinitionDescription, t as MarkdownDefinitionList, u as MarkdownDefinitionTerm, w as MarkdownEmphasis, x as MarkdownFootnoteDefinition, y as MarkdownFootnoteReference, z as MarkdownHeading, A as MarkdownHtmlBlock, C as MarkdownImage, E as MarkdownImageReference, F as MarkdownInlineCode, G as MarkdownInlineHtml, I as MarkdownInlineIcon, J as MarkdownInlineMath, K as MarkdownInlineNode, L as MarkdownLeafDirective, N as MarkdownLimitError, O as MarkdownLink, P as MarkdownLinkDefinition, Q as MarkdownLinkReference, R as MarkdownList, S as MarkdownListItem, T as MarkdownMathBlock, U as MarkdownMention, W as MarkdownParagraph, X as MarkdownPoint, Y as MarkdownSafetyLimits, Z as MarkdownSourcePosition, _ as MarkdownStrikethrough, $ as MarkdownStrong, a0 as MarkdownSubscript, a1 as MarkdownSuperscript, a2 as MarkdownTable, a3 as MarkdownTableCell, a4 as MarkdownTableRow, a5 as MarkdownText, a6 as MarkdownTextDirective, a7 as MarkdownThematicBreak, af as assertMarkdownDocumentWithinLimits, ag as assertMarkdownSourceWithinLimits, ao as resolveMarkdownSafetyLimits } from '../types--c_Uqmlh.js';
3
+ export { B as BLOCK_META_KEY_DESCRIPTORS, a as BlockMetaKeyDescriptor, K as KNOWN_BLOCK_META_KEYS, b as KnownBlockMetaKey, p as parseTimeSeconds } from '../annotationCoercion-m2qN3r1k.js';
4
4
 
5
5
  /**
6
6
  * Markdown → JSON Parser
@@ -17,7 +17,7 @@ import {
17
17
  stringifyMarkdown,
18
18
  unwrapMarkdownSource,
19
19
  wrapMarkdownSource
20
- } from "../chunk-ZKDJHO6Y.js";
20
+ } from "../chunk-7GVUWJQN.js";
21
21
  import {
22
22
  DEFAULT_MARKDOWN_SAFETY_LIMITS,
23
23
  MarkdownLimitError,
@@ -29,7 +29,7 @@ import {
29
29
  resolveMarkdownSafetyLimits,
30
30
  serializePandocAttributes,
31
31
  toMdast
32
- } from "../chunk-EX75I5HX.js";
32
+ } from "../chunk-XZZFXXXR.js";
33
33
  import {
34
34
  matchTrailingPandocAttr,
35
35
  matchTrailingTemplateAnnotation,
@@ -1,5 +1,5 @@
1
- import { k as Block, aT as PageSectionKind, aR as PageEmphasis, bz as ThemeColorScheme, aP as PageBackground, bx as Theme, c1 as ViewportConfig, y as CustomTemplateDefinition, aW as PageVariant, bk as StartBlockConfig, Q as Doc, bA as ThemePageStyle } from './Doc-BkSiCJnM.js';
2
- import { M as MarkdownBlockNode } from './types-BmEHcL3l.js';
1
+ import { k as Block, aT as PageSectionKind, aR as PageEmphasis, bz as ThemeColorScheme, aP as PageBackground, bx as Theme, c1 as ViewportConfig, y as CustomTemplateDefinition, aW as PageVariant, bk as StartBlockConfig, Q as Doc, bA as ThemePageStyle } from './Doc-DaUT9d7i.js';
2
+ import { M as MarkdownBlockNode } from './types--c_Uqmlh.js';
3
3
 
4
4
  /**
5
5
  * PageSection — the framework-agnostic block model for Page (linear) mode.
@@ -1,6 +1,6 @@
1
- import { al as MediaCut, Q as Doc, aj as MediaClip, cx as MediaFxOpId, cy as MediaFxChain } from '../Doc-BkSiCJnM.js';
2
- export { cz as MEDIA_EDIT_PARAMS, cA as MEDIA_FX_ORDER, cB as MEDIA_FX_SPECS, ak as MediaCrop, cC as MediaEditParamKey, cD as MediaEditParamValues, am as MediaEdits, cE as MediaFxOp, cF as formatMediaNumber, cG as hasRenderableFx, cH as mediaEditHtmlAttribute, cI as mediaEditValuesFromAttributes, cJ as mediaEditValuesFromParams, cK as mediaRenderKey, cL as normalizeMediaCrop, cM as normalizeMediaCuts, cN as parseMediaCrop, cO as parseMediaCuts, cP as parseMediaEdits, cQ as parseMediaFx, cR as serializeMediaCrop, cS as serializeMediaCuts, cT as serializeMediaEdits, cU as serializeMediaFx } from '../Doc-BkSiCJnM.js';
3
- import '../types-BmEHcL3l.js';
1
+ import { al as MediaCut, Q as Doc, aj as MediaClip, cx as MediaFxOpId, cy as MediaFxChain } from '../Doc-DaUT9d7i.js';
2
+ export { cz as MEDIA_EDIT_PARAMS, cA as MEDIA_FX_ORDER, cB as MEDIA_FX_SPECS, ak as MediaCrop, cC as MediaEditParamKey, cD as MediaEditParamValues, am as MediaEdits, cE as MediaFxOp, cF as formatMediaNumber, cG as hasRenderableFx, cH as mediaEditHtmlAttribute, cI as mediaEditValuesFromAttributes, cJ as mediaEditValuesFromParams, cK as mediaRenderKey, cL as normalizeMediaCrop, cM as normalizeMediaCuts, cN as parseMediaCrop, cO as parseMediaCuts, cP as parseMediaEdits, cQ as parseMediaFx, cR as serializeMediaCrop, cS as serializeMediaCuts, cT as serializeMediaEdits, cU as serializeMediaFx } from '../Doc-DaUT9d7i.js';
3
+ import '../types--c_Uqmlh.js';
4
4
 
5
5
  /**
6
6
  * Source time ↔ played time for a media clip with a trim window and cuts.
@@ -1,5 +1,5 @@
1
- import { Q as Doc, f as AudioBookmark } from '../Doc-BkSiCJnM.js';
2
- import { d as BuildAdvance } from '../types-BmEHcL3l.js';
1
+ import { Q as Doc, f as AudioBookmark } from '../Doc-DaUT9d7i.js';
2
+ import { d as BuildAdvance } from '../types--c_Uqmlh.js';
3
3
 
4
4
  /**
5
5
  * Shared types + tuning configs for the narration engine.
@@ -27,7 +27,7 @@ import {
27
27
  recordSlideShown,
28
28
  traceWordPosAt,
29
29
  vadStep
30
- } from "../chunk-J6AGNXFO.js";
30
+ } from "../chunk-XFE6WYDK.js";
31
31
  import "../chunk-NEWNNLWN.js";
32
32
  import {
33
33
  buildNarrationTimingJson,
@@ -41,8 +41,8 @@ import {
41
41
  wordIndexAtChar,
42
42
  wordIndexAtTime,
43
43
  wordPosAtExpectedSyllables
44
- } from "../chunk-VTVBSZXB.js";
45
- import "../chunk-MPEGJKFJ.js";
44
+ } from "../chunk-I3ENXLAN.js";
45
+ import "../chunk-GGZCJ2MS.js";
46
46
  import "../chunk-FUBMT6SJ.js";
47
47
  import "../chunk-HYJ63N6V.js";
48
48
  import "../chunk-L7QZORLB.js";
@@ -1,4 +1,4 @@
1
- import { M as MarkdownBlockNode } from '../types-BmEHcL3l.js';
1
+ import { M as MarkdownBlockNode } from '../types--c_Uqmlh.js';
2
2
 
3
3
  /**
4
4
  * Block template recommendations.
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  profileBlockContents,
3
3
  recommendTemplatesForBlock
4
- } from "../chunk-MPEGJKFJ.js";
4
+ } from "../chunk-GGZCJ2MS.js";
5
5
  import "../chunk-MWSGNEH6.js";
6
6
  import "../chunk-P53Z4RYC.js";
7
7
  export {
@@ -1,10 +1,10 @@
1
- export { B as BUILD_EFFECTS, a as BUILD_MODES, b as BUILD_PARAM_KEYS, c as BUILD_PREVIOUS, d as BuildAdvance, e as BuildCursor, f as BuildSpec, g as BuildStep, h as BuildTiming, i as DEFAULT_TRANSITION_DURATION_SECONDS, aa as TRANSITION_DIRECTIONS, ab as TRANSITION_TYPES, ac as Transition, ad as TransitionDirection, ae as TransitionType, ah as buildSpecParams, ai as isTransitionType, aj as normalizeTransitionDirection, ak as normalizeTransitionType, al as parseBuildSpec, am as recordBuildAdvance, an as resolveBlockTransition, ap as resolveTransitionDuration } from '../types-BmEHcL3l.js';
1
+ export { B as BUILD_EFFECTS, a as BUILD_MODES, b as BUILD_PARAM_KEYS, c as BUILD_PREVIOUS, d as BuildAdvance, e as BuildCursor, f as BuildSpec, g as BuildStep, h as BuildTiming, i as DEFAULT_TRANSITION_DURATION_SECONDS, aa as TRANSITION_DIRECTIONS, ab as TRANSITION_TYPES, ac as Transition, ad as TransitionDirection, ae as TransitionType, ah as buildSpecParams, ai as isTransitionType, aj as normalizeTransitionDirection, ak as normalizeTransitionType, al as parseBuildSpec, am as recordBuildAdvance, an as resolveBlockTransition, ap as resolveTransitionDuration } from '../types--c_Uqmlh.js';
2
2
  export { B as BoundingBox, C as Coordinates } from '../Types-sh2VRxfo.js';
3
- import { Q as Doc, bx as Theme, bA as ThemePageStyle, bz as ThemeColorScheme, K as DeepPartial, bD as ThemeSeedColors, by as ThemeColorPalette, _ as FontFamilyKind, Z as FontFamily } from '../Doc-BkSiCJnM.js';
4
- export { A as AccentImage, a as AccentPosition, b as AmbientGradientConfig, c as Animation, d as AnimationType, e as AreaChartInput, f as AudioBookmark, g as AudioSegment, h as AudioTimingData, i as AudioTrack, B as BarChartInput, j as BigTextInput, k as Block, l as BlockConnection, m as BorderStyle, C as CaptionPhrase, n as CaptionTrack, o as CaptionWord, p as ChartBaseFields, q as ChartTemplateInput, r as ColorScheme, s as ColumnChartInput, t as ComparisonBarInput, u as ContentBlockInput, v as CornerBrandingConfig, w as CountUpSpec, x as CreateTemplateContextOptions, y as CustomTemplateDefinition, z as CustomTemplateLayer, D as CustomTemplateValidationError, E as CustomTemplateValidationResult, F as DARK_SURFACE, G as DEFAULT_DOC_FONT, H as DEFAULT_TITLE_FONT, I as DataTableInput, J as DateEventInput, L as DefinitionCardInput, M as DiagramBlockInput, N as DiagramEdgeAnchor, O as DiagramTemplateEdge, P as DiagramTemplateNode, R as DocBlock, S as DocDiagnostic, T as DonutChartInput, U as DrawingBlockInput, V as FRONTMATTER_CUSTOM_TEMPLATES_KEY, W as FRONTMATTER_CUSTOM_THEMES_KEY, X as FRONTMATTER_MOTION_KEY, Y as FactCardInput, $ as FullBleedQuoteInput, a0 as GradientBackgroundConfig, a1 as ImageBackgroundConfig, a2 as ImageLayer, a3 as ImageTreatment, a4 as ImageWithCaptionInput, a5 as LIGHT_SURFACE, a6 as Layer, a7 as LayerRepeat, a8 as LayoutHints, a9 as LeftFeatureInput, aa as LineChartInput, ab as LinearGradient, ac as ListBlockInput, ad as MOTION_PROFILES, ae as MapBlockInput, af as MapLayer, ag as MapMarker, ah as MapTileStyle, ai as MarkerStyle, aj as MediaClip, ak as MediaCrop, al as MediaCut, am as MediaEdits, an as MediaScheduleOptions, ao as MermaidLayer, ap as MotionEntrance, aq as MotionOrigin, ar as MotionProfile, as as MotionProfileName, at as MotionSpec, au as MotionState, av as PAGE_ACCENT_STRATEGIES, aw as PAGE_BACKGROUNDS, ax as PAGE_BACKGROUND_RHYTHMS, ay as PAGE_DESIGN_FAMILIES, az as PAGE_DIVIDERS, aA as PAGE_EMPHASES, aB as PAGE_EYEBROWS, aC as PAGE_HEADING_CASES, aD as PAGE_HEADING_SCALES, aE as PAGE_HEADING_UNDERLINES, aF as PAGE_HERO_STYLES, aG as PAGE_IMAGE_FRAMINGS, aH as PAGE_NUMERAL_STYLES, aI as PAGE_PATTERNS, aJ as PAGE_QUOTE_MARKS, aK as PAGE_SECTION_KINDS, aL as PAGE_SECTION_SPACINGS, aM as PAGE_SHADOWS, aN as PAGE_VARIANTS, aO as PageAccentRotation, aP as PageBackground, aQ as PageDesignFamily, aR as PageEmphasis, aS as PageHeadingTreatment, aT as PageSectionKind, aU as PageSectionOverride, aV as PageTokens, aW as PageVariant, aX as PathLayer, aY as PatternBackgroundConfig, aZ as PersistentLayer, a_ as PersistentLayerConfig, a$ as PersistentLayerTemplate, b0 as PersistentLayerTemplateConfig, b1 as PersistentLayerTemplateType, b2 as PhotoGridInput, b3 as PieChartInput, b4 as PipStyle, b5 as Position, b6 as ProgressIndicatorConfig, b7 as PromotedBodyAnnotation, b8 as PullQuoteInput, b9 as QuoteBlockInput, ba as RawLayersInput, bb as RenderStyle, bc as RightFeatureInput, bd as ScatterChartInput, be as ScheduledClip, bf as SectionHeaderInput, bg as ShapeFilter, bh as ShapeLayer, bi as ShapePattern, bj as SolidBackgroundConfig, bk as StartBlockConfig, bl as StatHighlightInput, bm as SurfaceScheme, bn as SvgLayer, bo as THEME_SCHEMA_VERSION, bp as TableLayer, bq as TableLayerStyle, br as TemplateBlock, bs as TemplateContext, bt as TemplateFunction, bu as TemplateRegistry, bv as TextLayer, bw as TextStyle, bB as ThemeRegistry, bC as ThemeSchemaVersion, bE as ThemeStyle, bF as ThemeTypography, bG as TimelineBlockInput, bH as TimelineTemplateEvent, bI as TimelineTemplateLink, bJ as TimelineTemplateTrack, bK as TitleBlockInput, bL as TitleCaptionConfig, bM as TranscriptBlockInput, bN as TreeBlockInput, bO as TreeLayer, bP as TreeLayerItem, bQ as TreeLayerStyle, bR as TreeTemplateItem, bS as TwoColumnInput, bT as VIEWPORT_PRESETS, bU as VideoEmbedLayer, bV as VideoLayer, bW as VideoPipPosition, bX as VideoPipShape, bY as VideoPipSize, bZ as VideoPlacement, b_ as VideoPresentation, b$ as VideoPullQuoteInput, c0 as VideoWithCaptionInput, c1 as ViewportConfig, c2 as ViewportOrientation, c3 as ViewportPreset, c4 as VignetteConfig, c5 as applySurface, c6 as calculateDuration, c7 as calculateFontScale, c8 as createTemplateContext, c9 as createTheme, ca as createThemeRegistry, cb as getAspectRatioString, cc as getBlockAtTime, cd as getCaptionAtTime, ce as getDocPlaybackDuration, cf as getLayoutHints, cg as getSafeTextBounds, ch as getSegmentAtTime, ci as getTwoColumnPositions, cj as getViewport, ck as getViewportOrientation, cl as isCustomTemplateDefinition, cm as isMotionProfileName, cn as isPersistentLayerTemplate, co as isTemplateBlock, cp as layoutScaledFontSize, cq as readFrontmatterMotion, cr as resolveMediaSchedule, cs as resolveMotionForDoc, ct as resolveMotionProfile, cu as scaledFontSize, cv as scheduleMediaClip, cw as validateCustomTemplateDefinition } from '../Doc-BkSiCJnM.js';
5
- export { D as DEFAULT_THEME, a as DEFAULT_THEME_ID, T as THEMES, g as getAvailableThemes, b as getThemeSummaries, r as resolveTheme } from '../themeLibrary-BrBc0mrP.js';
3
+ import { Q as Doc, bx as Theme, bA as ThemePageStyle, bz as ThemeColorScheme, K as DeepPartial, bD as ThemeSeedColors, by as ThemeColorPalette, _ as FontFamilyKind, Z as FontFamily } from '../Doc-DaUT9d7i.js';
4
+ export { A as AccentImage, a as AccentPosition, b as AmbientGradientConfig, c as Animation, d as AnimationType, e as AreaChartInput, f as AudioBookmark, g as AudioSegment, h as AudioTimingData, i as AudioTrack, B as BarChartInput, j as BigTextInput, k as Block, l as BlockConnection, m as BorderStyle, C as CaptionPhrase, n as CaptionTrack, o as CaptionWord, p as ChartBaseFields, q as ChartTemplateInput, r as ColorScheme, s as ColumnChartInput, t as ComparisonBarInput, u as ContentBlockInput, v as CornerBrandingConfig, w as CountUpSpec, x as CreateTemplateContextOptions, y as CustomTemplateDefinition, z as CustomTemplateLayer, D as CustomTemplateValidationError, E as CustomTemplateValidationResult, F as DARK_SURFACE, G as DEFAULT_DOC_FONT, H as DEFAULT_TITLE_FONT, I as DataTableInput, J as DateEventInput, L as DefinitionCardInput, M as DiagramBlockInput, N as DiagramEdgeAnchor, O as DiagramTemplateEdge, P as DiagramTemplateNode, R as DocBlock, S as DocDiagnostic, T as DonutChartInput, U as DrawingBlockInput, V as FRONTMATTER_CUSTOM_TEMPLATES_KEY, W as FRONTMATTER_CUSTOM_THEMES_KEY, X as FRONTMATTER_MOTION_KEY, Y as FactCardInput, $ as FullBleedQuoteInput, a0 as GradientBackgroundConfig, a1 as ImageBackgroundConfig, a2 as ImageLayer, a3 as ImageTreatment, a4 as ImageWithCaptionInput, a5 as LIGHT_SURFACE, a6 as Layer, a7 as LayerRepeat, a8 as LayoutHints, a9 as LeftFeatureInput, aa as LineChartInput, ab as LinearGradient, ac as ListBlockInput, ad as MOTION_PROFILES, ae as MapBlockInput, af as MapLayer, ag as MapMarker, ah as MapTileStyle, ai as MarkerStyle, aj as MediaClip, ak as MediaCrop, al as MediaCut, am as MediaEdits, an as MediaScheduleOptions, ao as MermaidLayer, ap as MotionEntrance, aq as MotionOrigin, ar as MotionProfile, as as MotionProfileName, at as MotionSpec, au as MotionState, av as PAGE_ACCENT_STRATEGIES, aw as PAGE_BACKGROUNDS, ax as PAGE_BACKGROUND_RHYTHMS, ay as PAGE_DESIGN_FAMILIES, az as PAGE_DIVIDERS, aA as PAGE_EMPHASES, aB as PAGE_EYEBROWS, aC as PAGE_HEADING_CASES, aD as PAGE_HEADING_SCALES, aE as PAGE_HEADING_UNDERLINES, aF as PAGE_HERO_STYLES, aG as PAGE_IMAGE_FRAMINGS, aH as PAGE_NUMERAL_STYLES, aI as PAGE_PATTERNS, aJ as PAGE_QUOTE_MARKS, aK as PAGE_SECTION_KINDS, aL as PAGE_SECTION_SPACINGS, aM as PAGE_SHADOWS, aN as PAGE_VARIANTS, aO as PageAccentRotation, aP as PageBackground, aQ as PageDesignFamily, aR as PageEmphasis, aS as PageHeadingTreatment, aT as PageSectionKind, aU as PageSectionOverride, aV as PageTokens, aW as PageVariant, aX as PathLayer, aY as PatternBackgroundConfig, aZ as PersistentLayer, a_ as PersistentLayerConfig, a$ as PersistentLayerTemplate, b0 as PersistentLayerTemplateConfig, b1 as PersistentLayerTemplateType, b2 as PhotoGridInput, b3 as PieChartInput, b4 as PipStyle, b5 as Position, b6 as ProgressIndicatorConfig, b7 as PromotedBodyAnnotation, b8 as PullQuoteInput, b9 as QuoteBlockInput, ba as RawLayersInput, bb as RenderStyle, bc as RightFeatureInput, bd as ScatterChartInput, be as ScheduledClip, bf as SectionHeaderInput, bg as ShapeFilter, bh as ShapeLayer, bi as ShapePattern, bj as SolidBackgroundConfig, bk as StartBlockConfig, bl as StatHighlightInput, bm as SurfaceScheme, bn as SvgLayer, bo as THEME_SCHEMA_VERSION, bp as TableLayer, bq as TableLayerStyle, br as TemplateBlock, bs as TemplateContext, bt as TemplateFunction, bu as TemplateRegistry, bv as TextLayer, bw as TextStyle, bB as ThemeRegistry, bC as ThemeSchemaVersion, bE as ThemeStyle, bF as ThemeTypography, bG as TimelineBlockInput, bH as TimelineTemplateEvent, bI as TimelineTemplateLink, bJ as TimelineTemplateTrack, bK as TitleBlockInput, bL as TitleCaptionConfig, bM as TranscriptBlockInput, bN as TreeBlockInput, bO as TreeLayer, bP as TreeLayerItem, bQ as TreeLayerStyle, bR as TreeTemplateItem, bS as TwoColumnInput, bT as VIEWPORT_PRESETS, bU as VideoEmbedLayer, bV as VideoLayer, bW as VideoPipPosition, bX as VideoPipShape, bY as VideoPipSize, bZ as VideoPlacement, b_ as VideoPresentation, b$ as VideoPullQuoteInput, c0 as VideoWithCaptionInput, c1 as ViewportConfig, c2 as ViewportOrientation, c3 as ViewportPreset, c4 as VignetteConfig, c5 as applySurface, c6 as calculateDuration, c7 as calculateFontScale, c8 as createTemplateContext, c9 as createTheme, ca as createThemeRegistry, cb as getAspectRatioString, cc as getBlockAtTime, cd as getCaptionAtTime, ce as getDocPlaybackDuration, cf as getLayoutHints, cg as getSafeTextBounds, ch as getSegmentAtTime, ci as getTwoColumnPositions, cj as getViewport, ck as getViewportOrientation, cl as isCustomTemplateDefinition, cm as isMotionProfileName, cn as isPersistentLayerTemplate, co as isTemplateBlock, cp as layoutScaledFontSize, cq as readFrontmatterMotion, cr as resolveMediaSchedule, cs as resolveMotionForDoc, ct as resolveMotionProfile, cu as scaledFontSize, cv as scheduleMediaClip, cw as validateCustomTemplateDefinition } from '../Doc-DaUT9d7i.js';
5
+ export { D as DEFAULT_THEME, a as DEFAULT_THEME_ID, T as THEMES, g as getAvailableThemes, b as getThemeSummaries, r as resolveTheme } from '../themeLibrary-BRRm1Hna.js';
6
6
  export { M as MediaEntry, a as MediaProvider } from '../MediaProvider-wpSe21B3.js';
7
- export { E as EditorLayerMeta, I as ImageEditCanvas, a as ImageEditDoc, b as ImageEditLayer, c as ImageEditLayerKind, d as ImageEditMeta } from '../ImageEditDoc-UjQv8q3j.js';
7
+ export { E as EditorLayerMeta, I as ImageEditCanvas, a as ImageEditDoc, b as ImageEditLayer, c as ImageEditLayerKind, d as ImageEditMeta } from '../ImageEditDoc-vFCJ_bT1.js';
8
8
 
9
9
  /**
10
10
  * Runtime validation for the canonical {@link Doc} JSON shape.
@@ -1,4 +1,4 @@
1
- import { bx as Theme, bB as ThemeRegistry } from './Doc-BkSiCJnM.js';
1
+ import { bx as Theme, bB as ThemeRegistry } from './Doc-DaUT9d7i.js';
2
2
 
3
3
  /**
4
4
  * Built-in Theme Library
@@ -1,5 +1,5 @@
1
- import { g as AudioSegment, h as AudioTimingData, n as CaptionTrack } from '../Doc-BkSiCJnM.js';
2
- import '../types-BmEHcL3l.js';
1
+ import { g as AudioSegment, h as AudioTimingData, n as CaptionTrack } from '../Doc-DaUT9d7i.js';
2
+ import '../types--c_Uqmlh.js';
3
3
 
4
4
  /**
5
5
  * Narration timing estimation.
@@ -1,7 +1,7 @@
1
- import { Q as Doc, r as ColorScheme, k as Block, br as TemplateBlock } from '../Doc-BkSiCJnM.js';
2
- import { i as PageTransformHints } from '../materializePageSection-DEXohgVt.js';
1
+ import { Q as Doc, r as ColorScheme, k as Block, br as TemplateBlock } from '../Doc-DaUT9d7i.js';
2
+ import { i as PageTransformHints } from '../materializePageSection-Kj9ROls1.js';
3
3
  import { d as ExtractionType, E as ExtractedElement, b as ExtractionOptions } from '../contentExtractor-BNfVJV2U.js';
4
- import { f as BuildSpec } from '../types-BmEHcL3l.js';
4
+ import { f as BuildSpec } from '../types--c_Uqmlh.js';
5
5
 
6
6
  /** Identifier for a built-in or caller-registered transform style. */
7
7
  type TransformStyleId = string;
@@ -24,14 +24,14 @@ import {
24
24
  serializePresentationPlan,
25
25
  transformNarratedSegment,
26
26
  usesDynamicPresentation
27
- } from "../chunk-ZBPWNH4L.js";
28
- import "../chunk-VTVBSZXB.js";
29
- import "../chunk-MPEGJKFJ.js";
27
+ } from "../chunk-HFDYPPNJ.js";
28
+ import "../chunk-I3ENXLAN.js";
29
+ import "../chunk-GGZCJ2MS.js";
30
30
  import "../chunk-SVN7T6BK.js";
31
31
  import "../chunk-FUBMT6SJ.js";
32
32
  import "../chunk-HYJ63N6V.js";
33
33
  import "../chunk-L7QZORLB.js";
34
- import "../chunk-EX75I5HX.js";
34
+ import "../chunk-XZZFXXXR.js";
35
35
  import "../chunk-Y25EJEZN.js";
36
36
  import "../chunk-MWSGNEH6.js";
37
37
  import "../chunk-CZ7AUSLI.js";
@@ -551,6 +551,11 @@ interface MarkdownLink extends MarkdownNodeBase {
551
551
  }
552
552
  /**
553
553
  * An image ![alt](url "title").
554
+ *
555
+ * A lone HTML `<img>` that carries nothing beyond `src`, `alt`, `title`,
556
+ * `width` and `height` parses to this node too. The WYSIWYG editor writes a
557
+ * resized image that way, because `![alt](url)` has no size syntax, so every
558
+ * consumer sees one kind of image either way.
554
559
  */
555
560
  interface MarkdownImage extends MarkdownNodeBase {
556
561
  type: 'image';
@@ -560,6 +565,17 @@ interface MarkdownImage extends MarkdownNodeBase {
560
565
  alt?: string;
561
566
  /** Optional title */
562
567
  title?: string | null;
568
+ /** Display width in CSS pixels, from `<img width>`. */
569
+ width?: number;
570
+ /** Display height in CSS pixels, from `<img height>`. */
571
+ height?: number;
572
+ /**
573
+ * The `<img>` tag this image was written as. Serialization reuses it
574
+ * verbatim while it still describes the node, writes a fresh `<img>` when
575
+ * the URL, alt, title or size has changed, and writes `<img>` (never
576
+ * `![alt](url)`) whenever the node has a size.
577
+ */
578
+ rawHtml?: string;
563
579
  }
564
580
  /**
565
581
  * A hard line break (two trailing spaces or backslash before newline).
@@ -701,7 +717,10 @@ interface ParseOptions {
701
717
  math?: boolean;
702
718
  /** Enable directive extensions (:::container, ::leaf, :text). Default: true */
703
719
  directive?: boolean;
704
- /** Parse raw HTML into HtmlNode sub-DOM trees. Default: true */
720
+ /**
721
+ * Parse raw HTML into HtmlNode sub-DOM trees, and read a lone plain `<img>`
722
+ * as an image node. Default: true. When false, all HTML stays raw.
723
+ */
705
724
  parseHtml?: boolean;
706
725
  /** Enable YAML frontmatter parsing (--- blocks at top of document). Default: true */
707
726
  frontmatter?: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bendyline/squisq",
3
- "version": "2.12.3",
3
+ "version": "2.12.4",
4
4
  "description": "Headless utilities for doc/block rendering, spatial math, Markdown, and storage",
5
5
  "license": "MIT",
6
6
  "author": "Bendyline",