@bendyline/squisq 2.12.2 → 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-BJSPtsQD.d.ts → Doc-DaUT9d7i.d.ts} +8 -1
  2. package/dist/{ImageEditDoc-QIzn1qK5.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-TFMDVOUQ.js → chunk-HFDYPPNJ.js} +174 -94
  7. package/dist/{chunk-5VFC5T4N.js → chunk-I3ENXLAN.js} +7 -16
  8. package/dist/{chunk-DTAYI7AV.js → chunk-LCMQCRRX.js} +12 -8
  9. package/dist/{chunk-YZ66VMBB.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-DYnmh8X1.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-IHAirzT-.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.
@@ -3117,6 +3117,13 @@ interface TextStyle {
3117
3117
  * vertical baseline is derived from `position.anchor` (legacy behavior).
3118
3118
  */
3119
3119
  verticalAlign?: 'top' | 'middle' | 'bottom';
3120
+ /**
3121
+ * Shift the drawn text down by this many em of its rendered size (negative
3122
+ * shifts it up), without moving the layer's box. For optical centering:
3123
+ * vertically centred text aligns its lowercase middle on the anchor, so
3124
+ * capitals in a mixed-case line sit visibly high; ~0.07 balances them.
3125
+ */
3126
+ baselineShift?: number;
3120
3127
  /** Line height multiplier */
3121
3128
  lineHeight?: number;
3122
3129
  /** Add drop shadow for readability over images */
@@ -1,4 +1,4 @@
1
- import { a2 as ImageLayer, bv as TextLayer, bh as ShapeLayer, aX as PathLayer } from './Doc-BJSPtsQD.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-5VFC5T4N.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,
@@ -724,6 +724,7 @@ function getTemplateHint(context, templateName, key, fallback) {
724
724
 
725
725
  // src/doc/templates/captionUtils.ts
726
726
  var TRAILING_PUNCT_RE = /[.;:!?]+$/;
727
+ var CAPTION_BASELINE_SHIFT_EM = 0.055;
727
728
  function cleanCaption(text) {
728
729
  return text.replace(TRAILING_PUNCT_RE, "").trim();
729
730
  }
@@ -1435,21 +1436,7 @@ var ESCAPE_RE = /\{\{([^{}]*)\}\}/g;
1435
1436
  var ESCAPED_OPEN = " ESC_OPEN ";
1436
1437
  var ESCAPED_CLOSE = " ESC_CLOSE ";
1437
1438
  function collectImages(block) {
1438
- if (!block.contents) return [];
1439
- const out = [];
1440
- const visit = (node) => {
1441
- if (node.type === "image") {
1442
- const img = node;
1443
- out.push({ url: img.url ?? "", alt: img.alt ?? "" });
1444
- }
1445
- };
1446
- for (const node of block.contents) {
1447
- walkMarkdownTree(node, (n) => {
1448
- visit(n);
1449
- return;
1450
- });
1451
- }
1452
- return out;
1439
+ return extractImages(block.contents).map((image) => ({ url: image.src, alt: image.alt }));
1453
1440
  }
1454
1441
  function collectListItems(block) {
1455
1442
  if (!block.contents) return [];
@@ -2728,6 +2715,8 @@ function imageWithCaption(input, context) {
2728
2715
  textAlign: "center",
2729
2716
  shadow: shouldUseShadow(context),
2730
2717
  lineHeight: 1.18,
2718
+ // Capitals read as centred on the band (CAPTION_BASELINE_SHIFT_EM)
2719
+ baselineShift: CAPTION_BASELINE_SHIFT_EM,
2731
2720
  maxLines: 2,
2732
2721
  // A two-line caption centres on the band instead of hanging its
2733
2722
  // second line below it (the block centres on the anchor).
@@ -4138,6 +4127,8 @@ function videoWithCaption(input, context) {
4138
4127
  textAlign: "center",
4139
4128
  shadow: shouldUseShadow(context),
4140
4129
  lineHeight: 1.18,
4130
+ // Capitals read as centred on the band (CAPTION_BASELINE_SHIFT_EM)
4131
+ baselineShift: CAPTION_BASELINE_SHIFT_EM,
4141
4132
  maxLines: 2
4142
4133
  }
4143
4134
  },
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-FTN6SGW5.js";
4
4
  import {
5
5
  applySavedPresentation
6
- } from "./chunk-TFMDVOUQ.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-5VFC5T4N.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-5VFC5T4N.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-BJSPtsQD.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-BJSPtsQD.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-DYnmh8X1.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-DYnmh8X1.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-IHAirzT-.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-DTAYI7AV.js";
77
+ } from "../chunk-LCMQCRRX.js";
78
78
  import "../chunk-FTN6SGW5.js";
79
- import "../chunk-TFMDVOUQ.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-5VFC5T4N.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-BJSPtsQD.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-BJSPtsQD.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-QIzn1qK5.js';
2
- export { E as EditorLayerMeta, I as ImageEditCanvas, c as ImageEditLayerKind, d as ImageEditMeta } from '../ImageEditDoc-QIzn1qK5.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-BJSPtsQD.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-BJSPtsQD.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-IHAirzT-.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-QIzn1qK5.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-DYnmh8X1.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-YZ66VMBB.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-DTAYI7AV.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-TFMDVOUQ.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-5VFC5T4N.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-BJSPtsQD.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-BJSPtsQD.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-BJSPtsQD.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-BJSPtsQD.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-BJSPtsQD.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-YZ66VMBB.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-5VFC5T4N.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-BJSPtsQD.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-BJSPtsQD.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-IHAirzT-.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-QIzn1qK5.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-BJSPtsQD.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-BJSPtsQD.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-BJSPtsQD.js';
2
- import { i as PageTransformHints } from '../materializePageSection-DYnmh8X1.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-TFMDVOUQ.js";
28
- import "../chunk-5VFC5T4N.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.2",
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",