@bendyline/squisq 2.13.15 → 2.13.17

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 (38) hide show
  1. package/dist/{Doc-C_Sh49ot.d.ts → Doc-DLfTam0R.d.ts} +24 -1
  2. package/dist/{ImageEditDoc-Sqw3Tw-R.d.ts → ImageEditDoc-DdSHb6sj.d.ts} +1 -1
  3. package/dist/{chunk-L7QZORLB.js → chunk-37RLFDIT.js} +11 -4
  4. package/dist/{chunk-4HQ7QZKB.js → chunk-46QZDTMH.js} +184 -45
  5. package/dist/chunk-4R3YZTPX.js +42 -0
  6. package/dist/{chunk-DBVCSVNV.js → chunk-A4ZFYGU6.js} +13 -38
  7. package/dist/{chunk-2SRF5III.js → chunk-BVL3F64S.js} +1 -1
  8. package/dist/{chunk-FYP7GNER.js → chunk-GDJGWFTY.js} +7 -7
  9. package/dist/{chunk-2CB37BOU.js → chunk-LQCLNOCY.js} +1 -1
  10. package/dist/{chunk-JSGIWW35.js → chunk-MTIR5PWF.js} +1 -1
  11. package/dist/{chunk-DDJHIZED.js → chunk-NBDF6SQ5.js} +21 -1
  12. package/dist/{chunk-OJCAKUHW.js → chunk-RXVY5GNN.js} +12 -6
  13. package/dist/{chunk-N3FQSUVT.js → chunk-SPLTVGQY.js} +2 -2
  14. package/dist/{chunk-OFE5RZWW.js → chunk-W3CMIAHG.js} +35 -7
  15. package/dist/{chunk-Y34KYMAS.js → chunk-Z73DG6IL.js} +1 -1
  16. package/dist/doc/index.d.ts +98 -10
  17. package/dist/doc/index.js +17 -8
  18. package/dist/fence/index.d.ts +1 -1
  19. package/dist/generate/index.d.ts +1 -1
  20. package/dist/imageEdit/index.d.ts +3 -3
  21. package/dist/index.d.ts +6 -6
  22. package/dist/index.js +30 -16
  23. package/dist/jsonForm/index.d.ts +1 -1
  24. package/dist/jsonForm/index.js +5 -4
  25. package/dist/markdown/index.js +2 -2
  26. package/dist/{materializePageSection-Dmf-rf1b.d.ts → materializePageSection-HIoRYiZu.d.ts} +1 -1
  27. package/dist/mediaEdit/index.d.ts +154 -3
  28. package/dist/mediaEdit/index.js +241 -2
  29. package/dist/narration/index.d.ts +1 -1
  30. package/dist/narration/index.js +6 -4
  31. package/dist/recommend/index.js +3 -2
  32. package/dist/schemas/index.d.ts +26 -7
  33. package/dist/schemas/index.js +14 -8
  34. package/dist/{themeLibrary-B4VLovhW.d.ts → themeLibrary-B2K-aAOy.d.ts} +1 -1
  35. package/dist/timing/index.d.ts +1 -1
  36. package/dist/transform/index.d.ts +3 -3
  37. package/dist/transform/index.js +8 -6
  38. package/package.json +1 -1
@@ -730,14 +730,24 @@ function convertBlockNode(node, parseHtml) {
730
730
  }
731
731
  function convertListItem(node, parseHtml) {
732
732
  const pos = convertPosition(node.position);
733
+ const emptyTask = node.checked == null ? emptyTaskMarker(node) : null;
733
734
  return {
734
735
  type: "listItem",
735
736
  ...node.checked != null ? { checked: node.checked } : {},
737
+ ...emptyTask !== null ? { checked: emptyTask } : {},
736
738
  ...node.spread != null ? { spread: node.spread } : {},
737
- children: convertBlockChildren(node.children ?? [], parseHtml),
739
+ children: emptyTask !== null ? [] : convertBlockChildren(node.children ?? [], parseHtml),
738
740
  ...posField(pos)
739
741
  };
740
742
  }
743
+ function emptyTaskMarker(node) {
744
+ const [paragraph, ...rest] = node.children ?? [];
745
+ if (!paragraph || rest.length > 0 || paragraph.type !== "paragraph") return null;
746
+ const [text, ...more] = paragraph.children ?? [];
747
+ if (!text || more.length > 0 || text.type !== "text") return null;
748
+ const match = /^\[( |x|X)\]$/.exec(String(text.value ?? "").trim());
749
+ return match ? match[1] !== " " : null;
750
+ }
741
751
  function convertTableRow(node, isHeader, parseHtml) {
742
752
  const pos = convertPosition(node.position);
743
753
  return {
@@ -1019,6 +1029,16 @@ function blockToMdast(node) {
1019
1029
  }
1020
1030
  }
1021
1031
  function listItemToMdast(item) {
1032
+ if (item.checked != null && item.children.length === 0) {
1033
+ return {
1034
+ type: "listItem",
1035
+ ...item.spread != null ? { spread: item.spread } : {},
1036
+ children: [
1037
+ { type: "paragraph", children: [{ type: "html", value: item.checked ? "[x]" : "[ ]" }] }
1038
+ ],
1039
+ ...mdastPosField(item.position)
1040
+ };
1041
+ }
1022
1042
  return {
1023
1043
  type: "listItem",
1024
1044
  ...item.checked != null ? { checked: item.checked } : {},
@@ -15,7 +15,7 @@ import {
15
15
  presentationBeatExtras,
16
16
  presentationLayoutFits,
17
17
  presentationStat
18
- } from "./chunk-4HQ7QZKB.js";
18
+ } from "./chunk-46QZDTMH.js";
19
19
  import {
20
20
  deriveTemplateInputs,
21
21
  extractConceptItems,
@@ -32,7 +32,7 @@ import {
32
32
  isTreeFence,
33
33
  matchNumberHighlight,
34
34
  shapeIsStated
35
- } from "./chunk-OFE5RZWW.js";
35
+ } from "./chunk-W3CMIAHG.js";
36
36
  import {
37
37
  extractContent,
38
38
  mapElementToBlock,
@@ -45,9 +45,10 @@ import {
45
45
  } from "./chunk-JNUNNQ74.js";
46
46
  import {
47
47
  parseMarkdown
48
- } from "./chunk-DDJHIZED.js";
48
+ } from "./chunk-NBDF6SQ5.js";
49
49
  import {
50
- isContainerTemplate
50
+ isContainerTemplate,
51
+ resolveTemplateName
51
52
  } from "./chunk-UDPPWYYM.js";
52
53
  import {
53
54
  extractPlainText,
@@ -1769,6 +1770,7 @@ var pointText = (text2) => clip(text2, Infinity, 180);
1769
1770
  var captionText = (text2) => clip(text2, 18, 110);
1770
1771
  var FEATURE_POINTS = 2;
1771
1772
  var FEATURE_POINT_CHARACTERS = 100;
1773
+ var HAND_DRAWN_TEMPLATES = /* @__PURE__ */ new Set(["drawing", "layout"]);
1772
1774
  function featurePointText(text2) {
1773
1775
  const clean = text2.replace(/\s+/gu, " ").trim();
1774
1776
  if (clean.length <= FEATURE_POINT_CHARACTERS) return clean;
@@ -1878,7 +1880,7 @@ function createPresentationPlan(doc, hints = defaultPresentationHints()) {
1878
1880
  );
1879
1881
  const drawnLists = new Set(
1880
1882
  flattenRenderableBlocks(doc.blocks).filter(
1881
- (block) => !!conceptTemplate(block.template ?? "") && block.contents?.length === 1 && block.contents[0].type === "list"
1883
+ (block) => !!conceptTemplate(block.template ?? "") && block.contents?.length === 1 && block.contents[0].type === "list" || !block.autoTemplate && HAND_DRAWN_TEMPLATES.has(resolveTemplateName(block.template ?? "")) && !!block.children?.length
1882
1884
  ).map((block) => block.id)
1883
1885
  );
1884
1886
  const beats = [];
@@ -2131,9 +2133,13 @@ function createPresentationPlan(doc, hints = defaultPresentationHints()) {
2131
2133
  if (refs.length) beat.media = refs;
2132
2134
  });
2133
2135
  }
2136
+ const mediaKinds = new Map(
2137
+ [...sectionMedia.values()].flatMap((items) => items.map((item) => [item.ref, item.kind]))
2138
+ );
2134
2139
  for (const beat of beats) {
2135
2140
  if (!beat.media) continue;
2136
- if (!worded.has(beat.id)) {
2141
+ const drawn = !!conceptTemplate(beat.layout) && !beat.media.some((ref) => mediaKinds.get(ref) === "table");
2142
+ if (!worded.has(beat.id) && !drawn) {
2137
2143
  const points = beat.points.slice(0, FEATURE_POINTS);
2138
2144
  beat.points = suggested.has(beat.id) ? points : points.map(featurePointText);
2139
2145
  }
@@ -10,7 +10,7 @@ import {
10
10
  presentationBeatExtras,
11
11
  presentationLayoutProblem,
12
12
  presentationStat
13
- } from "./chunk-4HQ7QZKB.js";
13
+ } from "./chunk-46QZDTMH.js";
14
14
  import {
15
15
  classifyListShape,
16
16
  matchNumberHighlight,
@@ -18,7 +18,7 @@ import {
18
18
  shapeIsStated,
19
19
  splitStatItem,
20
20
  unstatedShapeFallback
21
- } from "./chunk-OFE5RZWW.js";
21
+ } from "./chunk-W3CMIAHG.js";
22
22
 
23
23
  // src/transform/grounding.ts
24
24
  var NUMBER = /\d[\d,]*(?:\.\d+)?/gu;
@@ -1,8 +1,11 @@
1
+ import {
2
+ taskMarker
3
+ } from "./chunk-4R3YZTPX.js";
1
4
  import {
2
5
  mediaEditValuesFromAttributes,
3
6
  mediaEditValuesFromParams,
4
7
  parseMediaEdits
5
- } from "./chunk-L7QZORLB.js";
8
+ } from "./chunk-37RLFDIT.js";
6
9
  import {
7
10
  extractPlainText,
8
11
  findBlockVideoEmbed,
@@ -3248,8 +3251,19 @@ function isPictureFence(node) {
3248
3251
  if (node.type !== "code") return false;
3249
3252
  return node.lang?.trim().toLowerCase() === "mermaid" || isSvgIslandLang(node.lang);
3250
3253
  }
3254
+ function isSpatialPictureFence(node) {
3255
+ if (node.type !== "code") return false;
3256
+ if (isExplicitDiagramLang(node.lang)) {
3257
+ return detectAsciiDiagram(node.value, { explicit: true }).isDiagram;
3258
+ }
3259
+ if (isExplicitTreeLang(node.lang)) return detectTree(node.value, { explicit: true }).isTree;
3260
+ if (isExplicitTimelineLang(node.lang)) {
3261
+ return detectAsciiTimeline(node.value, { explicit: true }).isTimeline;
3262
+ }
3263
+ return false;
3264
+ }
3251
3265
  function isMaterializedMediaNode(node) {
3252
- if (node.type === "code") return isPictureFence(node);
3266
+ if (node.type === "code") return isPictureFence(node) || isSpatialPictureFence(node);
3253
3267
  return findBlockVideoEmbed(node) !== null || isStandaloneHtmlVideo(node);
3254
3268
  }
3255
3269
  function isPictureParagraph(node) {
@@ -3342,8 +3356,11 @@ function renderInlineHtml(nodes) {
3342
3356
  return escapeInlineHtml(node.alt ?? "");
3343
3357
  case "inlineMath":
3344
3358
  return escapeInlineHtml(`$${node.value}$`);
3359
+ // A slide shows no footnote marker: the footnote goes to the speaker
3360
+ // notes (PPTX export), and `[^note]` printed as text told the
3361
+ // audience nothing.
3345
3362
  case "footnoteReference":
3346
- return escapeInlineHtml(`[^${node.label ?? node.identifier}]`);
3363
+ return "";
3347
3364
  case "linkReference":
3348
3365
  case "textDirective":
3349
3366
  return renderInlineHtml(node.children);
@@ -3374,10 +3391,12 @@ function renderMarkdownBlocksHtml(nodes, builds) {
3374
3391
  const tag = node.ordered ? "ol" : "ul";
3375
3392
  const start = node.ordered && node.start != null ? ` start="${node.start}"` : "";
3376
3393
  const items = node.children.map((item, index) => {
3377
- const taskMarker = item.checked == null ? "" : `<span>${item.checked ? "[x]" : "[ ]"} </span>`;
3394
+ const task = item.checked == null ? null : taskMarker(item.checked);
3378
3395
  const step = builds?.targets.get(item);
3379
- if (step === void 0) return `<li>${taskMarker}${renderBlocks(item.children)}</li>`;
3380
- const marker = item.checked == null ? node.ordered ? `${(node.start ?? 1) + index}.` : "\u2022" : item.checked ? "[x]" : "[ ]";
3396
+ if (step === void 0) {
3397
+ return task === null ? `<li>${renderBlocks(item.children)}</li>` : `<li data-squisq-task><span aria-hidden="true">${task} </span>${renderBlocks(item.children)}</li>`;
3398
+ }
3399
+ const marker = task ?? (node.ordered ? `${(node.start ?? 1) + index}.` : "\u2022");
3381
3400
  let first = true;
3382
3401
  let own = [];
3383
3402
  const fragments = [];
@@ -3430,6 +3449,10 @@ function renderMarkdownBlocksHtml(nodes, builds) {
3430
3449
  return `<pre><code>${escapeInlineHtml(node.value)}</code></pre>`;
3431
3450
  case "definition":
3432
3451
  return "";
3452
+ // Footnotes belong in the presenter's notes, not on the slide, as in
3453
+ // the PPTX export; drawn here, the definition read as stray body text.
3454
+ case "footnoteDefinition":
3455
+ return "";
3433
3456
  default: {
3434
3457
  const text = extractPlainText(node).trim();
3435
3458
  return text ? `<p>${escapeInlineHtml(text)}</p>` : "";
@@ -3562,13 +3585,17 @@ function extractEmbeddedVideos(contents, limit = Infinity) {
3562
3585
  const startAt = attrs?.["data-squisq-video-start-at"] ? parseTimeSeconds(attrs["data-squisq-video-start-at"]) : null;
3563
3586
  const clipStart = attrs?.["data-squisq-video-clip-start"] ? parseTimeSeconds(attrs["data-squisq-video-clip-start"]) : null;
3564
3587
  const clipEnd = attrs?.["data-squisq-video-clip-end"] ? parseTimeSeconds(attrs["data-squisq-video-clip-end"]) : null;
3588
+ const edits = parseMediaEdits(mediaEditValuesFromAttributes("video", attrs ?? {}));
3589
+ const cuts = edits?.cuts;
3565
3590
  add({
3566
3591
  src,
3567
3592
  ...attrs?.poster ? { posterSrc: attrs.poster } : {},
3568
3593
  alt: attrs?.["aria-label"] || attrs?.title || attrs?.alt || "",
3569
3594
  ...startAt != null ? { startAt } : {},
3570
3595
  ...clipStart != null ? { clipStart } : {},
3571
- ...clipEnd != null ? { clipEnd } : {}
3596
+ ...clipEnd != null ? { clipEnd } : {},
3597
+ ...cuts?.length ? { cuts } : {},
3598
+ ...edits ? { edits } : {}
3572
3599
  });
3573
3600
  }
3574
3601
  } else if ((n.type === "link" || n.type === "image") && typeof n.url === "string" && VIDEO_FILE_RE.test(n.url)) {
@@ -4571,6 +4598,7 @@ export {
4571
4598
  findFirstList,
4572
4599
  extractHostedVideos,
4573
4600
  isPictureFence,
4601
+ isSpatialPictureFence,
4574
4602
  isMaterializedMediaNode,
4575
4603
  isPictureParagraph,
4576
4604
  extractBodyPlainText,
@@ -3,7 +3,7 @@ import {
3
3
  parseMarkdown,
4
4
  remarkWikiLinks,
5
5
  toMdast
6
- } from "./chunk-DDJHIZED.js";
6
+ } from "./chunk-NBDF6SQ5.js";
7
7
  import {
8
8
  formatFrontmatterYaml,
9
9
  getChildren,
@@ -1,12 +1,12 @@
1
- import { ac as Layer, k as Block, U as Doc, bE as TemplateBlock, bF as TemplateContext, D as CustomTemplateDefinition, bH as TemplateRegistry, bN as Theme, cj as ViewportConfig, b7 as PersistentLayerConfig, aC as MotionSpec, V as DocBlock, ck as ViewportOrientation, b6 as PersistentLayer, b_ as TitleBlockInput, br as SectionHeaderInput, j as BigTextInput, w as ContentBlockInput, bx as StatHighlightInput, bl as QuoteBlockInput, a0 as FactCardInput, c7 as TwoColumnInput, M as DateEventInput, aa as ImageWithCaptionInput, ag as LeftFeatureInput, bo as RightFeatureInput, n as BottomFeatureInput, av as MediaOnlyInput, c0 as TopFeatureInput, al as MapBlockInput, bw as StartBlockConfig, a3 as FullBleedQuoteInput, aj as ListBlockInput, q as CardsBlockInput, H as CycleBlockInput, ae as LayersBlockInput, bg as ProcessBlockInput, a4 as FunnelBlockInput, a6 as HubBlockInput, aq as MatrixBlockInput, bk as PyramidBlockInput, by as StatsBlockInput, c9 as VennBlockInput, bb as PhotoGridInput, O as DefinitionCardInput, v as ComparisonBarInput, bj as PullQuoteInput, ci as VideoWithCaptionInput, ch as VideoPullQuoteInput, L as DataTableInput, P as DiagramBlockInput, c2 as TreeBlockInput, bW as TimelineBlockInput, Y as DrawingBlockInput, ap as MarkerStyle, A as AccentImage, a9 as ImageTreatment, a as AccentPosition, c as Animation, d as AnimationType, aD as MotionState, aA as MotionProfile, bP as ThemeColorScheme, y as CountUpSpec, bR as ThemeRegistry, a_ as PageEmphasis, bQ as ThemePageStyle, W as DocDiagnostic, bi as PromotedBodyAnnotation, S as DiagramTemplateNode, R as DiagramTemplateEdge, bZ as TimelineTemplateTrack, bY as TimelineTemplateLink } from '../Doc-C_Sh49ot.js';
2
- export { Z as FRONTMATTER_CUSTOM_TEMPLATES_KEY, _ as FRONTMATTER_CUSTOM_THEMES_KEY, af as LayoutHints, bn as RenderStyle, bO as ThemeColorPalette, bU as ThemeStyle, bV as ThemeTypography, c8 as VIEWPORT_PRESETS, cl as ViewportPreset, cq as createTemplateContext, cx as getLayoutHints, cA as getTwoColumnPositions, cB as getViewport, cC as getViewportOrientation, cG as isTemplateBlock, cM as scaledFontSize } from '../Doc-C_Sh49ot.js';
1
+ import { ac as Layer, k as Block, U as Doc, bE as TemplateBlock, bF as TemplateContext, D as CustomTemplateDefinition, bH as TemplateRegistry, bN as Theme, cj as ViewportConfig, b7 as PersistentLayerConfig, aC as MotionSpec, V as DocBlock, ck as ViewportOrientation, b6 as PersistentLayer, b_ as TitleBlockInput, br as SectionHeaderInput, j as BigTextInput, w as ContentBlockInput, bx as StatHighlightInput, bl as QuoteBlockInput, a0 as FactCardInput, c7 as TwoColumnInput, M as DateEventInput, aa as ImageWithCaptionInput, ag as LeftFeatureInput, bo as RightFeatureInput, n as BottomFeatureInput, av as MediaOnlyInput, c0 as TopFeatureInput, al as MapBlockInput, bw as StartBlockConfig, a3 as FullBleedQuoteInput, aj as ListBlockInput, q as CardsBlockInput, H as CycleBlockInput, ae as LayersBlockInput, bg as ProcessBlockInput, a4 as FunnelBlockInput, a6 as HubBlockInput, aq as MatrixBlockInput, bk as PyramidBlockInput, by as StatsBlockInput, c9 as VennBlockInput, bb as PhotoGridInput, O as DefinitionCardInput, v as ComparisonBarInput, bj as PullQuoteInput, ci as VideoWithCaptionInput, ch as VideoPullQuoteInput, L as DataTableInput, P as DiagramBlockInput, c2 as TreeBlockInput, bW as TimelineBlockInput, Y as DrawingBlockInput, ap as MarkerStyle, A as AccentImage, a9 as ImageTreatment, a as AccentPosition, c as Animation, d as AnimationType, aD as MotionState, aA as MotionProfile, bP as ThemeColorScheme, y as CountUpSpec, at as MediaCut, au as MediaEdits, bR as ThemeRegistry, a_ as PageEmphasis, bQ as ThemePageStyle, W as DocDiagnostic, bi as PromotedBodyAnnotation, S as DiagramTemplateNode, R as DiagramTemplateEdge, bZ as TimelineTemplateTrack, bY as TimelineTemplateLink } from '../Doc-DLfTam0R.js';
2
+ export { Z as FRONTMATTER_CUSTOM_TEMPLATES_KEY, _ as FRONTMATTER_CUSTOM_THEMES_KEY, af as LayoutHints, bn as RenderStyle, bO as ThemeColorPalette, bU as ThemeStyle, bV as ThemeTypography, c8 as VIEWPORT_PRESETS, cl as ViewportPreset, cq as createTemplateContext, cx as getLayoutHints, cA as getTwoColumnPositions, cB as getViewport, cC as getViewportOrientation, cG as isTemplateBlock, cM as scaledFontSize } from '../Doc-DLfTam0R.js';
3
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-Zk8qYuaT.js';
4
4
  import { C as CoercedBlockMeta } from '../annotationCoercion-hTvELpIN.js';
5
- import { w as PresentationLayout, g as ConceptTemplateName, m as PageSection } from '../materializePageSection-Dmf-rf1b.js';
6
- export { C as CONCEPT_MAX_DRAWN, a as CONCEPT_SPECS, c as ConceptDowngrade, d as ConceptItemsOptions, e as ConceptSpec, f as ConceptSpecInput, M as MaterializePageSectionOptions, h as MaterializePageSectionsOptions, k as PageMedia, l as PageRichText, n as PageSectionDiagnostic, o as PageSectionItem, p as PageSectionMaterialization, q as PageSectionSource, r as PageSpatialKind, s as PageTransformHints, y as conceptDowngrade, z as conceptDrawsAs, B as conceptItemCount, D as conceptItemsProblem, F as materializePageSection, G as materializePageSections, O as resolvePageStyle } from '../materializePageSection-Dmf-rf1b.js';
5
+ import { w as PresentationLayout, g as ConceptTemplateName, m as PageSection } from '../materializePageSection-HIoRYiZu.js';
6
+ export { C as CONCEPT_MAX_DRAWN, a as CONCEPT_SPECS, c as ConceptDowngrade, d as ConceptItemsOptions, e as ConceptSpec, f as ConceptSpecInput, M as MaterializePageSectionOptions, h as MaterializePageSectionsOptions, k as PageMedia, l as PageRichText, n as PageSectionDiagnostic, o as PageSectionItem, p as PageSectionMaterialization, q as PageSectionSource, r as PageSpatialKind, s as PageTransformHints, y as conceptDowngrade, z as conceptDrawsAs, B as conceptItemCount, D as conceptItemsProblem, F as materializePageSection, G as materializePageSections, O as resolvePageStyle } from '../materializePageSection-HIoRYiZu.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-B4VLovhW.js';
9
+ export { D as DEFAULT_THEME, g as getAvailableThemes, b as getThemeSummaries, r as resolveTheme } from '../themeLibrary-B2K-aAOy.js';
10
10
 
11
11
  /** Pure build planning and evaluation, shared by interactive slides and frame export. */
12
12
 
@@ -2745,6 +2745,10 @@ interface EmbeddedVideo {
2745
2745
  /** Source-media in/out points carried by inline video data attributes. */
2746
2746
  clipStart?: number;
2747
2747
  clipEnd?: number;
2748
+ /** Source ranges the clip's edit recipe removes (`data-squisq-video-cuts`). */
2749
+ cuts?: MediaCut[];
2750
+ /** The clip's whole edit recipe (`data-squisq-video-*`), when it has one. */
2751
+ edits?: MediaEdits;
2748
2752
  }
2749
2753
  /** A hosted video (YouTube, Vimeo, …) a block body stands for. */
2750
2754
  interface HostedVideo {
@@ -2769,12 +2773,22 @@ declare function extractHostedVideos(contents: readonly MarkdownBlockNode[] | un
2769
2773
  * captions and reading time must not speak diagram source or SVG markup.
2770
2774
  */
2771
2775
  declare function isPictureFence(node: MarkdownNode): boolean;
2776
+ /**
2777
+ * A fence the author tagged ```diagram, ```tree or ```timeline whose art
2778
+ * parses: `appendRichContentLayers` draws it as its own picture beside the
2779
+ * block's words. Its source is box-drawing and marker art (`● Start {#start}
2780
+ * ─────●`), so as prose it would print on the slide next to the picture it
2781
+ * became and be read aloud by narration. An untagged fence stays code; one
2782
+ * whose art does not parse stays visible rather than disappearing.
2783
+ */
2784
+ declare function isSpatialPictureFence(node: MarkdownNode): boolean;
2772
2785
  /**
2773
2786
  * Body nodes that render as their own visual layer rather than as prose: a
2774
- * picture fence ({@link isPictureFence}), a hosted-video paragraph and a
2775
- * standalone `<video>` (players, via `appendRichContentLayers`). Repeating
2776
- * them as body text would print the diagram source, the video's link or its
2777
- * raw tag under the very thing they became.
2787
+ * picture fence ({@link isPictureFence}), a tagged diagram, tree or timeline
2788
+ * ({@link isSpatialPictureFence}), a hosted-video paragraph and a standalone
2789
+ * `<video>` (players, via `appendRichContentLayers`). Repeating them as body
2790
+ * text would print the diagram source, the video's link or its raw tag under
2791
+ * the very thing they became.
2778
2792
  */
2779
2793
  declare function isMaterializedMediaNode(node: MarkdownBlockNode): boolean;
2780
2794
  /**
@@ -2909,6 +2923,63 @@ declare function deriveTemplateInputs(templateName: string, headingText: string,
2909
2923
  */
2910
2924
  declare function coverRepeatsLeadingBlock(doc: Doc): boolean;
2911
2925
 
2926
+ /**
2927
+ * A block's video sets the floor on its length.
2928
+ *
2929
+ * `markdownToDoc` estimates a block's duration from its text. That is right
2930
+ * for prose and wrong for a slide that is a short caption over a clip: a
2931
+ * heading, a line of text and a 1:40 screen recording read in three seconds,
2932
+ * so the slide advanced — and its video, whose out-point is the block's end,
2933
+ * stopped — three seconds in. A video plays to its own length, so the block's
2934
+ * duration is at least the longest video it plays, measured from the block's
2935
+ * start (a `startAt` delay counts) through the clip's played length (trim
2936
+ * window minus cuts).
2937
+ *
2938
+ * ## Which videos count
2939
+ *
2940
+ * - Video in the block's body: a `<video>` tag, or a markdown link/image to a
2941
+ * video file (what {@link extractEmbeddedVideos} finds).
2942
+ * - Video clips anchored to the block (`block.media`) that stop at its end —
2943
+ * not `spillover` clips (they run past the block on purpose) and not
2944
+ * unlocked clips (`lockToBlock: false`; those are document-timed).
2945
+ *
2946
+ * Audio does not count: a block over a long music bed should not hold for the
2947
+ * whole track.
2948
+ *
2949
+ * ## Where a video's length comes from
2950
+ *
2951
+ * An authored out-point (`data-squisq-video-clip-end` / `clipEnd=`) is enough
2952
+ * on its own. Otherwise the length is the media file's, which the pure model
2953
+ * cannot read: hosts that can (a browser decoding the file's metadata) pass a
2954
+ * {@link VideoDurationLookup}. Without either, the video sets no floor and the
2955
+ * block keeps its text estimate.
2956
+ *
2957
+ * ## Precedence
2958
+ *
2959
+ * An author-pinned `duration=` wins outright. Recorded narration
2960
+ * (`applyNarrationTiming`, run later by `resolveAudioMapping`) overwrites the
2961
+ * blocks it times. Below both, a block lasts the longer of its reading time and
2962
+ * its video.
2963
+ */
2964
+
2965
+ /**
2966
+ * A media file's own length in seconds, keyed by the `src` the document
2967
+ * names it with. Return undefined when the length is not known (yet).
2968
+ */
2969
+ type VideoDurationLookup = (src: string) => number | undefined;
2970
+ /**
2971
+ * The shortest duration that lets every video in `block` play to its end, or
2972
+ * null when the block plays no video of known length. Ignores the block's own
2973
+ * duration and any pin — callers decide whether the floor applies.
2974
+ */
2975
+ declare function blockVideoLength(block: Block, lookup?: VideoDurationLookup): number | null;
2976
+ /**
2977
+ * The video sources in `doc` whose length only the media file can tell — those
2978
+ * with no authored out-point — in document order, without duplicates. A host
2979
+ * measures these and passes the results to `applyVideoDurations`.
2980
+ */
2981
+ declare function collectVideoDurationSources(doc: Doc): string[];
2982
+
2912
2983
  /**
2913
2984
  * Markdown → Doc Conversion
2914
2985
  *
@@ -2995,6 +3066,23 @@ interface MarkdownToDocOptions {
2995
3066
  */
2996
3067
  declare function getPinnedBlockMeta(block: Block): CoercedBlockMeta;
2997
3068
  declare function markdownToDoc(markdownDoc: MarkdownDocument, options?: MarkdownToDocOptions): Doc;
3069
+ /**
3070
+ * Hold each block open for the videos it plays, using media lengths the pure
3071
+ * conversion could not know (see `doc/videoTiming.ts`). `markdownToDoc`
3072
+ * already floors blocks with an authored out-point; this adds the files'
3073
+ * own lengths — typically measured in a browser — and re-lays the timeline
3074
+ * (start times, caption phrases, document-timed videos, `doc.duration`)
3075
+ * exactly as conversion does.
3076
+ *
3077
+ * Run it on `markdownToDoc` output, BEFORE `resolveAudioMapping`: recorded
3078
+ * narration then re-times the blocks it covers and keeps precedence, and the
3079
+ * re-layout here cannot disturb it. A block with a pinned `duration=` keeps it.
3080
+ *
3081
+ * Pure: returns `doc` itself when no block needs to grow (so memoized
3082
+ * consumers see no change), otherwise a new Doc whose block tree is copied —
3083
+ * the input is never mutated.
3084
+ */
3085
+ declare function applyVideoDurations(doc: Doc, lookup: VideoDurationLookup): Doc;
2998
3086
  /**
2999
3087
  * Flatten a nested block tree into a depth-first ordered array.
3000
3088
  * Useful for calculating sequential timing or iterating all blocks.
@@ -5150,4 +5238,4 @@ declare function treeFromMarkdownList(list: MarkdownList): Tree;
5150
5238
  /** Find the first top-level markdown list in a block's body, if any. */
5151
5239
  declare function findFirstList(contents: MarkdownBlockNode[] | undefined): MarkdownList | undefined;
5152
5240
 
5153
- export { ASCII_CHAR_H, ASCII_CHAR_W, ASCII_DIAGRAM_FENCE_LANGS, ASCII_TIMELINE_FENCE_LANGS, AUTHORING_TRICKS, type AccentLayout, type ArrangeAsciiDiagramOptions, type AsciiDiagram, type AsciiDiagramDetection, type AsciiDiagramEdge, type AsciiDiagramNode, type AsciiTimeline, type AsciiTimelineDetection, type AsciiTimelineEvent, type AsciiTimelineLink, type AsciiTimelineMarker, type AsciiTimelineSide, type AsciiTimelineStats, type AsciiTimelineStyle, type AsciiTimelineTrack, type AudioSegmentTiming, type AuthoringTrick, type AuthoringTrickOptions, BASE_INPUT_DESCRIPTORS, BLOCK_MEDIA_LAYOUT_POLICIES, BUILTIN_DASHBOARD_LAYOUTS, type BlockLayerMaterialization, type BlockMediaLayoutPolicy, type BuildPreviewDocOptions, type BuildTimeline, type BuiltInTemplateName, CONTAINER_TEMPLATES, COVER_SLIDE_FRONTMATTER_KEYS, COVER_SLIDE_TEMPLATE_OPTIONS, type ChartData, type ChartTableData, type ClipBox, type ConceptItem, ConceptTemplateName, type ConnectorAnchor, type ConnectorPort, type ConnectorRouting, type ConnectorSnapPoint, type ContentBuildPlan, type CoverBlockInput, type CoverSlidePlayback, type CoverSlideSettings, type CoverSlideTemplate, type 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, type DashboardCell, type DashboardCellChrome, type DashboardCellDefinition, type DashboardCellFrame, type DashboardDiagnostic, type DashboardLayoutDefinition, type DashboardLayoutSummary, type DashboardLayoutValidationError, type DashboardLayoutValidationResult, type DashboardMaterialization, type DashboardRectPct, type DashboardSettings, type DashboardSettingsOverrides, type DashboardStyleId, type DashboardStyleSummary, type DashboardTitle, type DashboardTitleSlotDefinition, type DashboardZoomCandidate, type DashboardZoomLevel, type DashboardZoomMode, type DataFenceParseResult, type DataSourceReadOptions, type DataSourceReader, type DataSourceStats, type DataSourceTable, type DeriveTemplateInputsOptions, type DetectAsciiTimelineOptions, type DiagramEdge, type DiagramLabelFit, type DiagramLayout, type DiagramLayoutOptions, type DiagramNodePosition, DocBlock, type DrawingConnector, type DrawingLayout, type DrawingLayoutOptions, type DrawingShape, type DrawingShapeKind, type EmbeddedVideo, type ExpandDocBlocksOptions, type ExtractedTableData, FRONTMATTER_DASHBOARD_LAYOUTS_KEY, type FirstImage, type Flashcard, type FlashcardChoice, type FlashcardDeck, type FlashcardDiagnostic, type FlashcardDiagnosticCode, type FlashcardFace, type FlashcardKind, type FlashcardSourceMode, type FrostedBigTextLayout, GEOMETRY_BOUND_TEMPLATES, type GuideWording, type GuidedTemplate, type HostedVideo, type InputCoercion, type LayerMaterializationDiagnostic, type LayerMaterializationFailureMode, type LayerMaterializationSource, type LayoutLayerDefaults, type LayoutLayersResult, MARKDOWN_SHAPE_EXAMPLES, MAX_COVER_SLIDE_DURATION_SECONDS, type MarkdownShapeExample, type MarkdownToDocOptions, type MarkdownValidationResult, type MaterializeBlockLayersOptions, type MaterializeDashboardOptions, type MaterializeFlashcardsOptions, type MatrixReading, type NarrationResolution, type NativeMediaLayout, type NoMediaLayout, PAGE_BASE_CSS, PATH_SHAPE_KINDS, PRESENTATION_LAYOUT_GUIDE, PRESENTATION_LAYOUT_LABELS, PageSection, type PageSectionContext, type PageSectionDraft, type ParsedAnnotation, type ParsedStat, PersistentLayerConfig, type PromotableDetection, type RenderAsciiDiagramOptions, type RenderAsciiTimelineOptions, type RenderTreeOptions, type RepairResult, type ResolveDataReferencesOptions, type ResolvedDashboardCell, type ResolvedDataReferences, type ResolvedPageBlock, type RichListItem, type RuntimeTemplateRegistry, SHAPE_NAMES, type SectionExtractor, type StatItem, type SupplementalMediaLayoutVariant, type SupplementalMediaShape, type SupplementalMediaVariantMatrix, TABLE_FED_TEMPLATES, TEMPLATE_AUTHORING_METADATA, TEMPLATE_GUIDES, TEMPLATE_INPUT_DESCRIPTORS, TEMPLATE_METADATA, TREE_FENCE_LANGS, type TemplateAuthoringMetadata, type TemplateAuthoringRole, TemplateBlock, type TemplateBodyPolicy, type TemplateCatalogEntry, TemplateContext, type TemplateGuide, type TemplateInputDescriptor, type TemplateMediaOwnership, type TemplateMetadata, type TemplateParamFinding, Theme, ThemeColorScheme, type Tree, type TreeDetection, type TreeItem, type TreeNode, type UnconsumedMediaBehavior, type ValidateOptions, ViewportConfig, ViewportOrientation, accentForViewport, adjustY, anchorPoint, applyNarrationTiming, applyRenderStyleToLayers, arrangeAsciiDiagram, asciiCellToCanvas, asciiDiagramFromBlocks, asciiDiagramFromTemplateData, asciiDiagramToTemplateData, asciiTimelineToTemplateData, authoringTricks, autoTemplatePreservesContent, bigText, blockBuildSteps, bottomFeature, buildChartData, buildCursorAtTime, buildDashboardCellChrome, buildPageCss, buildPageCssVars, buildPreviewDoc, buildRegistry, buildSourceText, buildTargetState, canvasToAsciiCell, cardsBlock, chooseDashboardLayout, clipEndpoints, clipPoint, coerceTemplateParams, comparisonBar, composeDashboardLayers, computeDiagramLayout, computeDrawingLayout, computeLayoutLayers, conceptBuildStepTexts, connectorPath, contentBlock, countBlocks, countUpSpecFor, coverBlock, coverRepeatsLeadingBlock, createAccentLayers, cssFilterForTreatment, cycleBlock, dashboardCanvasFill, dashboardCellAccent, dataSidecarPrefix, dataTable, dateEvent, definitionCard, deriveTemplateInputs, desiredCellZoom, detectAsciiDiagram, detectAsciiTimeline, detectPromotableBodyAnnotation, detectTree, diagramBlock, docToMarkdown, documentTitleFromFileName, drawingBlock, expandCoverBlock, expandDocBlocks, expandPersistentLayers, extractBlockquote, extractBlockquoteText, extractBodyPlainText, extractConceptItems, extractEmbeddedVideos, extractFirstEmbeddedVideo, extractFirstImage, extractHostedVideos, extractImages, extractListItems, extractRichListItems, extractTableData, extractTableFromContents, factCard, fallbackBlockLayers, findFirstList, findFirstTable, fitBigTextSize, fitDiagramLabel, flattenBlocks, flattenRenderableBlocks, formatCountUp, formatCountValue, frostedBigTextLayout, fullBleedQuote, funnelBlock, getAccentLayout, getAnimationProgress, getAnimationStyle, getAvailableTemplates, getBlockBodyText, getBlockDepth, getBlockMediaLayoutPolicy, getDashboardLayoutSummaries, getDefaultAnimation, getDefaultAnimationDuration, getMotionProfile, getOverlayOpacity, getPersistentLayersFromTheme, getPinnedBlockMeta, getTemplateHint, getThemeFont, getTransitionClass, guideText, hasBlockBuilds, hasTemplate, hubBlock, imageWithCaption, isAsciiDiagramFence, isAsciiTimelineFence, isContainerTemplate, isDataFence, isDataFilePath, isEligibleAsciiFenceLang, isEligibleAsciiTimelineFenceLang, isEligibleTreeFenceLang, isExplicitDiagramLang, isExplicitTimelineLang, isExplicitTreeLang, isFigureText, isGeometryBoundTemplate, isMaterializedMediaNode, isMediaAnnotationName, isPictureFence, isPictureParagraph, isRepairableDiagram, isShapeName, isTemplatedPageBlock, isTreeFence, isWrappedFlowTimelineSource, layersBlock, layoutBlock, layoutCapacity, leftFeature, lineStyleDasharray, lintTemplateParams, listBlock, listDashboardLayouts, mapBlock, markdownBlockSeparatorLines, markdownShapeExample, markdownShapeGuide, markdownShapeSummary, markdownToDoc, markerPath, materializeBlockLayers, materializeDashboard, materializeFlashcards, matrixBlock, mediaOnly, motionDelay, motionEntrance, motionStateTransform, nearestSnapPoint, normalizeChartTable, normalizeDashboardZoom, normalizeShapeKind, pageStyleDataAttributes, parseAsciiDiagram, parseAsciiTimeline, parseAsciiTimelineWithStats, parseDataFence, parseStandaloneAnnotation, parseStatNumber, parseTree, parseWrappedFlowTimeline, parseYamlSubset, photoGrid, planContentBuilds, previewBlockTemplate, processBlock, pullQuote, pyramidBlock, quoteBlock, readCustomTemplatesFromFrontmatter, readCustomThemesFromFrontmatter, readDashboardLayoutsFromFrontmatter, readMatrixItems, 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, splitConceptItem, splitStatItem, statHighlight, statsBlock, stripBlockBackdropLayer, stripsBlockBackdrop, templateCatalog, templateRegistry, themeWantsAmbientMotion, themedEntrance, themedFontSize, themedImageTreatment, themedScrim, themedSurfaceGradient, timelineBlock, titleBlock, topFeature, transformOriginFor, transposeCells, treeBlock, treeFromMarkdownList, treeFromTemplateData, treeToTemplateData, twoColumn, validateDashboardLayoutDefinition, validateMarkdownDoc, validateMarkdownSource, vennBlock, vennOverlapIndex, videoPullQuote, videoWithCaption, wordRevealDelay, wrapWithPersistentLayers, writeCustomTemplatesToFrontmatter, writeCustomThemesToFrontmatter, writeDashboardLayoutsToFrontmatter };
5241
+ export { ASCII_CHAR_H, ASCII_CHAR_W, ASCII_DIAGRAM_FENCE_LANGS, ASCII_TIMELINE_FENCE_LANGS, AUTHORING_TRICKS, type AccentLayout, type ArrangeAsciiDiagramOptions, type AsciiDiagram, type AsciiDiagramDetection, type AsciiDiagramEdge, type AsciiDiagramNode, type AsciiTimeline, type AsciiTimelineDetection, type AsciiTimelineEvent, type AsciiTimelineLink, type AsciiTimelineMarker, type AsciiTimelineSide, type AsciiTimelineStats, type AsciiTimelineStyle, type AsciiTimelineTrack, type AudioSegmentTiming, type AuthoringTrick, type AuthoringTrickOptions, BASE_INPUT_DESCRIPTORS, BLOCK_MEDIA_LAYOUT_POLICIES, BUILTIN_DASHBOARD_LAYOUTS, type BlockLayerMaterialization, type BlockMediaLayoutPolicy, type BuildPreviewDocOptions, type BuildTimeline, type BuiltInTemplateName, CONTAINER_TEMPLATES, COVER_SLIDE_FRONTMATTER_KEYS, COVER_SLIDE_TEMPLATE_OPTIONS, type ChartData, type ChartTableData, type ClipBox, type ConceptItem, ConceptTemplateName, type ConnectorAnchor, type ConnectorPort, type ConnectorRouting, type ConnectorSnapPoint, type ContentBuildPlan, type CoverBlockInput, type CoverSlidePlayback, type CoverSlideSettings, type CoverSlideTemplate, type 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, type DashboardCell, type DashboardCellChrome, type DashboardCellDefinition, type DashboardCellFrame, type DashboardDiagnostic, type DashboardLayoutDefinition, type DashboardLayoutSummary, type DashboardLayoutValidationError, type DashboardLayoutValidationResult, type DashboardMaterialization, type DashboardRectPct, type DashboardSettings, type DashboardSettingsOverrides, type DashboardStyleId, type DashboardStyleSummary, type DashboardTitle, type DashboardTitleSlotDefinition, type DashboardZoomCandidate, type DashboardZoomLevel, type DashboardZoomMode, type DataFenceParseResult, type DataSourceReadOptions, type DataSourceReader, type DataSourceStats, type DataSourceTable, type DeriveTemplateInputsOptions, type DetectAsciiTimelineOptions, type DiagramEdge, type DiagramLabelFit, type DiagramLayout, type DiagramLayoutOptions, type DiagramNodePosition, DocBlock, type DrawingConnector, type DrawingLayout, type DrawingLayoutOptions, type DrawingShape, type DrawingShapeKind, type EmbeddedVideo, type ExpandDocBlocksOptions, type ExtractedTableData, FRONTMATTER_DASHBOARD_LAYOUTS_KEY, type FirstImage, type Flashcard, type FlashcardChoice, type FlashcardDeck, type FlashcardDiagnostic, type FlashcardDiagnosticCode, type FlashcardFace, type FlashcardKind, type FlashcardSourceMode, type FrostedBigTextLayout, GEOMETRY_BOUND_TEMPLATES, type GuideWording, type GuidedTemplate, type HostedVideo, type InputCoercion, type LayerMaterializationDiagnostic, type LayerMaterializationFailureMode, type LayerMaterializationSource, type LayoutLayerDefaults, type LayoutLayersResult, MARKDOWN_SHAPE_EXAMPLES, MAX_COVER_SLIDE_DURATION_SECONDS, type MarkdownShapeExample, type MarkdownToDocOptions, type MarkdownValidationResult, type MaterializeBlockLayersOptions, type MaterializeDashboardOptions, type MaterializeFlashcardsOptions, type MatrixReading, type NarrationResolution, type NativeMediaLayout, type NoMediaLayout, PAGE_BASE_CSS, PATH_SHAPE_KINDS, PRESENTATION_LAYOUT_GUIDE, PRESENTATION_LAYOUT_LABELS, PageSection, type PageSectionContext, type PageSectionDraft, type ParsedAnnotation, type ParsedStat, PersistentLayerConfig, type PromotableDetection, type RenderAsciiDiagramOptions, type RenderAsciiTimelineOptions, type RenderTreeOptions, type RepairResult, type ResolveDataReferencesOptions, type ResolvedDashboardCell, type ResolvedDataReferences, type ResolvedPageBlock, type RichListItem, type RuntimeTemplateRegistry, SHAPE_NAMES, type SectionExtractor, type StatItem, type SupplementalMediaLayoutVariant, type SupplementalMediaShape, type SupplementalMediaVariantMatrix, TABLE_FED_TEMPLATES, TEMPLATE_AUTHORING_METADATA, TEMPLATE_GUIDES, TEMPLATE_INPUT_DESCRIPTORS, TEMPLATE_METADATA, TREE_FENCE_LANGS, type TemplateAuthoringMetadata, type TemplateAuthoringRole, TemplateBlock, type TemplateBodyPolicy, type TemplateCatalogEntry, TemplateContext, type TemplateGuide, type TemplateInputDescriptor, type TemplateMediaOwnership, type TemplateMetadata, type TemplateParamFinding, Theme, ThemeColorScheme, type Tree, type TreeDetection, type TreeItem, type TreeNode, type UnconsumedMediaBehavior, type ValidateOptions, type VideoDurationLookup, ViewportConfig, ViewportOrientation, accentForViewport, adjustY, anchorPoint, applyNarrationTiming, applyRenderStyleToLayers, applyVideoDurations, arrangeAsciiDiagram, asciiCellToCanvas, asciiDiagramFromBlocks, asciiDiagramFromTemplateData, asciiDiagramToTemplateData, asciiTimelineToTemplateData, authoringTricks, autoTemplatePreservesContent, bigText, blockBuildSteps, blockVideoLength, bottomFeature, buildChartData, buildCursorAtTime, buildDashboardCellChrome, buildPageCss, buildPageCssVars, buildPreviewDoc, buildRegistry, buildSourceText, buildTargetState, canvasToAsciiCell, cardsBlock, chooseDashboardLayout, clipEndpoints, clipPoint, coerceTemplateParams, collectVideoDurationSources, comparisonBar, composeDashboardLayers, computeDiagramLayout, computeDrawingLayout, computeLayoutLayers, conceptBuildStepTexts, connectorPath, contentBlock, countBlocks, countUpSpecFor, coverBlock, coverRepeatsLeadingBlock, createAccentLayers, cssFilterForTreatment, cycleBlock, dashboardCanvasFill, dashboardCellAccent, dataSidecarPrefix, dataTable, dateEvent, definitionCard, deriveTemplateInputs, desiredCellZoom, detectAsciiDiagram, detectAsciiTimeline, detectPromotableBodyAnnotation, detectTree, diagramBlock, docToMarkdown, documentTitleFromFileName, drawingBlock, expandCoverBlock, expandDocBlocks, expandPersistentLayers, extractBlockquote, extractBlockquoteText, extractBodyPlainText, extractConceptItems, extractEmbeddedVideos, extractFirstEmbeddedVideo, extractFirstImage, extractHostedVideos, extractImages, extractListItems, extractRichListItems, extractTableData, extractTableFromContents, factCard, fallbackBlockLayers, findFirstList, findFirstTable, fitBigTextSize, fitDiagramLabel, flattenBlocks, flattenRenderableBlocks, formatCountUp, formatCountValue, frostedBigTextLayout, fullBleedQuote, funnelBlock, getAccentLayout, getAnimationProgress, getAnimationStyle, getAvailableTemplates, getBlockBodyText, getBlockDepth, getBlockMediaLayoutPolicy, getDashboardLayoutSummaries, getDefaultAnimation, getDefaultAnimationDuration, getMotionProfile, getOverlayOpacity, getPersistentLayersFromTheme, getPinnedBlockMeta, getTemplateHint, getThemeFont, getTransitionClass, guideText, hasBlockBuilds, hasTemplate, hubBlock, imageWithCaption, isAsciiDiagramFence, isAsciiTimelineFence, isContainerTemplate, isDataFence, isDataFilePath, isEligibleAsciiFenceLang, isEligibleAsciiTimelineFenceLang, isEligibleTreeFenceLang, isExplicitDiagramLang, isExplicitTimelineLang, isExplicitTreeLang, isFigureText, isGeometryBoundTemplate, isMaterializedMediaNode, isMediaAnnotationName, isPictureFence, isPictureParagraph, isRepairableDiagram, isShapeName, isSpatialPictureFence, isTemplatedPageBlock, isTreeFence, isWrappedFlowTimelineSource, layersBlock, layoutBlock, layoutCapacity, leftFeature, lineStyleDasharray, lintTemplateParams, listBlock, listDashboardLayouts, mapBlock, markdownBlockSeparatorLines, markdownShapeExample, markdownShapeGuide, markdownShapeSummary, markdownToDoc, markerPath, materializeBlockLayers, materializeDashboard, materializeFlashcards, matrixBlock, mediaOnly, motionDelay, motionEntrance, motionStateTransform, nearestSnapPoint, normalizeChartTable, normalizeDashboardZoom, normalizeShapeKind, pageStyleDataAttributes, parseAsciiDiagram, parseAsciiTimeline, parseAsciiTimelineWithStats, parseDataFence, parseStandaloneAnnotation, parseStatNumber, parseTree, parseWrappedFlowTimeline, parseYamlSubset, photoGrid, planContentBuilds, previewBlockTemplate, processBlock, pullQuote, pyramidBlock, quoteBlock, readCustomTemplatesFromFrontmatter, readCustomThemesFromFrontmatter, readDashboardLayoutsFromFrontmatter, readMatrixItems, 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, splitConceptItem, splitStatItem, statHighlight, statsBlock, stripBlockBackdropLayer, stripsBlockBackdrop, templateCatalog, templateRegistry, themeWantsAmbientMotion, themedEntrance, themedFontSize, themedImageTreatment, themedScrim, themedSurfaceGradient, timelineBlock, titleBlock, topFeature, transformOriginFor, transposeCells, treeBlock, treeFromMarkdownList, treeFromTemplateData, treeToTemplateData, twoColumn, validateDashboardLayoutDefinition, validateMarkdownDoc, validateMarkdownSource, vennBlock, vennOverlapIndex, videoPullQuote, videoWithCaption, wordRevealDelay, wrapWithPersistentLayers, writeCustomTemplatesToFrontmatter, writeCustomThemesToFrontmatter, writeDashboardLayoutsToFrontmatter };
package/dist/doc/index.js CHANGED
@@ -77,9 +77,9 @@ import {
77
77
  validateMarkdownSource,
78
78
  wordRevealDelay,
79
79
  writeDashboardLayoutsToFrontmatter
80
- } from "../chunk-FYP7GNER.js";
80
+ } from "../chunk-GDJGWFTY.js";
81
81
  import "../chunk-HKHOFTGM.js";
82
- import "../chunk-OJCAKUHW.js";
82
+ import "../chunk-RXVY5GNN.js";
83
83
  import {
84
84
  AUTHORING_TRICKS,
85
85
  BASE_INPUT_DESCRIPTORS,
@@ -103,9 +103,11 @@ import {
103
103
  accentForViewport,
104
104
  adjustY,
105
105
  applyRenderStyleToLayers,
106
+ applyVideoDurations,
106
107
  authoringTricks,
107
108
  bigText,
108
109
  blockBuildSteps,
110
+ blockVideoLength,
109
111
  bottomFeature,
110
112
  buildChartData,
111
113
  buildCursorAtTime,
@@ -114,6 +116,7 @@ import {
114
116
  buildTargetState,
115
117
  cardsBlock,
116
118
  coerceTemplateParams,
119
+ collectVideoDurationSources,
117
120
  comparisonBar,
118
121
  computeDrawingLayout,
119
122
  computeLayoutLayers,
@@ -228,7 +231,7 @@ import {
228
231
  wrapWithPersistentLayers,
229
232
  writeCustomTemplatesToFrontmatter,
230
233
  writeCustomThemesToFrontmatter
231
- } from "../chunk-4HQ7QZKB.js";
234
+ } from "../chunk-46QZDTMH.js";
232
235
  import {
233
236
  ASCII_CHAR_H,
234
237
  ASCII_CHAR_W,
@@ -273,6 +276,7 @@ import {
273
276
  isMediaAnnotationName,
274
277
  isPictureFence,
275
278
  isPictureParagraph,
279
+ isSpatialPictureFence,
276
280
  isTreeFence,
277
281
  isWrappedFlowTimelineSource,
278
282
  markdownBlockSeparatorLines,
@@ -290,7 +294,7 @@ import {
290
294
  treeFromTemplateData,
291
295
  treeToTemplateData,
292
296
  vennOverlapIndex
293
- } from "../chunk-OFE5RZWW.js";
297
+ } from "../chunk-W3CMIAHG.js";
294
298
  import "../chunk-SVN7T6BK.js";
295
299
  import {
296
300
  PATH_SHAPE_KINDS,
@@ -306,7 +310,7 @@ import {
306
310
  snapPoints
307
311
  } from "../chunk-FUBMT6SJ.js";
308
312
  import "../chunk-7ZAAICW4.js";
309
- import "../chunk-2SRF5III.js";
313
+ import "../chunk-BVL3F64S.js";
310
314
  import {
311
315
  DEFAULT_THEME,
312
316
  FRONTMATTER_CUSTOM_TEMPLATES_KEY,
@@ -323,9 +327,10 @@ import {
323
327
  resolveTheme,
324
328
  scaledFontSize2 as scaledFontSize
325
329
  } from "../chunk-JNUNNQ74.js";
326
- import "../chunk-JSGIWW35.js";
327
- import "../chunk-L7QZORLB.js";
328
- import "../chunk-DDJHIZED.js";
330
+ import "../chunk-4R3YZTPX.js";
331
+ import "../chunk-MTIR5PWF.js";
332
+ import "../chunk-37RLFDIT.js";
333
+ import "../chunk-NBDF6SQ5.js";
329
334
  import {
330
335
  CONTAINER_TEMPLATES,
331
336
  TABLE_FED_TEMPLATES,
@@ -392,6 +397,7 @@ export {
392
397
  anchorPoint,
393
398
  applyNarrationTiming,
394
399
  applyRenderStyleToLayers,
400
+ applyVideoDurations,
395
401
  arrangeAsciiDiagram,
396
402
  asciiCellToCanvas,
397
403
  asciiDiagramFromBlocks,
@@ -402,6 +408,7 @@ export {
402
408
  autoTemplatePreservesContent,
403
409
  bigText,
404
410
  blockBuildSteps,
411
+ blockVideoLength,
405
412
  bottomFeature,
406
413
  buildChartData,
407
414
  buildCursorAtTime,
@@ -418,6 +425,7 @@ export {
418
425
  clipEndpoints,
419
426
  clipPoint,
420
427
  coerceTemplateParams,
428
+ collectVideoDurationSources,
421
429
  comparisonBar,
422
430
  composeDashboardLayers,
423
431
  computeDiagramLayout,
@@ -530,6 +538,7 @@ export {
530
538
  isPictureParagraph,
531
539
  isRepairableDiagram,
532
540
  isShapeName,
541
+ isSpatialPictureFence,
533
542
  isTemplateBlock,
534
543
  isTemplatedPageBlock,
535
544
  isTreeFence,
@@ -1,4 +1,4 @@
1
- import { bN as Theme } from '../Doc-C_Sh49ot.js';
1
+ import { bN as Theme } from '../Doc-DLfTam0R.js';
2
2
  import '../types-Zk8qYuaT.js';
3
3
 
4
4
  /**
@@ -1,6 +1,6 @@
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 { t as ColorScheme, A as AccentImage, bE as TemplateBlock } from '../Doc-C_Sh49ot.js';
3
+ import { t as ColorScheme, A as AccentImage, bE as TemplateBlock } from '../Doc-DLfTam0R.js';
4
4
  import '../types-Zk8qYuaT.js';
5
5
 
6
6
  /**
@@ -1,8 +1,8 @@
1
- import { a as ImageEditDoc, b as ImageEditLayer } from '../ImageEditDoc-Sqw3Tw-R.js';
2
- export { E as EditorLayerMeta, I as ImageEditCanvas, c as ImageEditLayerKind, d as ImageEditMeta } from '../ImageEditDoc-Sqw3Tw-R.js';
1
+ import { a as ImageEditDoc, b as ImageEditLayer } from '../ImageEditDoc-DdSHb6sj.js';
2
+ export { E as EditorLayerMeta, I as ImageEditCanvas, c as ImageEditLayerKind, d as ImageEditMeta } from '../ImageEditDoc-DdSHb6sj.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-C_Sh49ot.js';
5
+ import '../Doc-DLfTam0R.js';
6
6
  import '../types-Zk8qYuaT.js';
7
7
 
8
8
  /**