@bendyline/squisq 2.8.0 → 2.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/{Doc-DBadkoP4.d.ts → Doc-DTyeaFuW.d.ts} +1 -1
  2. package/dist/{ImageEditDoc-Cq2a3c30.d.ts → ImageEditDoc-dFEclQ9l.d.ts} +1 -1
  3. package/dist/{annotationCoercion-CPHEggo3.d.ts → annotationCoercion-Ckqpu33y.d.ts} +1 -1
  4. package/dist/{chunk-V6NV4GDE.js → chunk-DRFJU4MK.js} +1948 -1832
  5. package/dist/{chunk-HXMV7WQB.js → chunk-IO5XO6XH.js} +1 -1
  6. package/dist/{chunk-6MVWWZHL.js → chunk-MIKKUKOD.js} +88 -2
  7. package/dist/{chunk-KEAU5NEM.js → chunk-NFHMHYUV.js} +107 -2
  8. package/dist/chunk-T3B4WJBR.js +167 -0
  9. package/dist/{chunk-PTK2SW2V.js → chunk-XSW4QTMB.js} +272 -4
  10. package/dist/doc/index.d.ts +88 -10
  11. package/dist/doc/index.js +11 -3
  12. package/dist/fence/index.d.ts +2 -2
  13. package/dist/generate/index.d.ts +2 -2
  14. package/dist/imageEdit/index.d.ts +4 -4
  15. package/dist/index.d.ts +9 -8
  16. package/dist/index.js +51 -5
  17. package/dist/jsonForm/index.d.ts +2 -2
  18. package/dist/markdown/index.d.ts +3 -3
  19. package/dist/markdown/index.js +2 -2
  20. package/dist/{materializePageSection-Rss5thAj.d.ts → materializePageSection-BRNIINlU.d.ts} +2 -2
  21. package/dist/narration/index.d.ts +109 -4
  22. package/dist/narration/index.js +10 -2
  23. package/dist/proof/index.d.ts +179 -0
  24. package/dist/proof/index.js +32 -0
  25. package/dist/recommend/index.d.ts +1 -1
  26. package/dist/schemas/index.d.ts +5 -5
  27. package/dist/{themeLibrary-8BQMY2HV.d.ts → themeLibrary-xaxN5UYu.d.ts} +1 -1
  28. package/dist/transform/index.d.ts +3 -3
  29. package/dist/{types-CcrDFdWH.d.ts → types-Be6sBUBx.d.ts} +28 -2
  30. package/package.json +6 -1
@@ -30,7 +30,7 @@ import {
30
30
  templateRegistry,
31
31
  writeCustomTemplatesToFrontmatter,
32
32
  writeCustomThemesToFrontmatter
33
- } from "./chunk-V6NV4GDE.js";
33
+ } from "./chunk-DRFJU4MK.js";
34
34
  import {
35
35
  iconMarker
36
36
  } from "./chunk-7ZAAICW4.js";
@@ -75,7 +75,7 @@ import {
75
75
  } from "./chunk-BAOV476U.js";
76
76
  import {
77
77
  parseMarkdown
78
- } from "./chunk-6MVWWZHL.js";
78
+ } from "./chunk-MIKKUKOD.js";
79
79
  import {
80
80
  KNOWN_BLOCK_META_KEYS,
81
81
  TEMPLATE_ALIASES,
@@ -3286,8 +3286,8 @@ function dedupeLeadingTitleBlock(candidates, titleText) {
3286
3286
  if (!firstTitle || firstTitle !== titleText.trim().toLowerCase()) return candidates;
3287
3287
  const template = first.template;
3288
3288
  const titleShaped = template === "title" || template === "sectionHeader" || template === "cover";
3289
- const hasBody = Array.isArray(first.contents) && first.contents.length > 0;
3290
- return titleShaped || !hasBody ? candidates.slice(1) : candidates;
3289
+ const hasBody2 = Array.isArray(first.contents) && first.contents.length > 0;
3290
+ return titleShaped || !hasBody2 ? candidates.slice(1) : candidates;
3291
3291
  }
3292
3292
  function buildTitleLayers(titleText, bandViewport, slot, theme, canvasViewport, margin) {
3293
3293
  const context = createTemplateContext(theme, 0, 1, canvasViewport);
@@ -3632,6 +3632,272 @@ function composeDashboardLayers(materialization) {
3632
3632
  return layers;
3633
3633
  }
3634
3634
 
3635
+ // src/doc/flashcards/materializeFlashcards.ts
3636
+ var GENERIC_ANSWER_TITLES = /* @__PURE__ */ new Set([
3637
+ "answer",
3638
+ "back",
3639
+ "solution",
3640
+ "explanation",
3641
+ "correct answer",
3642
+ "correct",
3643
+ "distractor",
3644
+ "option"
3645
+ ]);
3646
+ function normalizeMarker(value) {
3647
+ return typeof value === "string" ? value.trim().toLowerCase().replace(/[\s_-]+/g, "") : "";
3648
+ }
3649
+ function markerFromValue(value) {
3650
+ const normalized = normalizeMarker(value);
3651
+ if (normalized === "flashcard" || normalized === "card" || normalized === "basicflashcard") {
3652
+ return "basic";
3653
+ }
3654
+ if (normalized === "multiplechoiceflashcard" || normalized === "multiplechoice" || normalized === "quiz") {
3655
+ return "multiple-choice";
3656
+ }
3657
+ if (normalized === "group" || normalized === "flashcardgroup" || normalized === "deck") {
3658
+ return "group";
3659
+ }
3660
+ return void 0;
3661
+ }
3662
+ function resolveFlashcardMarker(block) {
3663
+ const metadataMarker = markerFromValue(block.metadata?.study) ?? markerFromValue(block.metadata?.["study-mode"]);
3664
+ if (metadataMarker) return metadataMarker;
3665
+ for (const className of block.classes ?? []) {
3666
+ const classMarker = markerFromValue(className);
3667
+ if (classMarker) return classMarker;
3668
+ }
3669
+ return markerFromValue(block.template);
3670
+ }
3671
+ function hasTitle(block) {
3672
+ return typeof block.title === "string" && block.title.trim().length > 0;
3673
+ }
3674
+ function hasBody(block) {
3675
+ return (block.contents?.length ?? 0) > 0 || (block.media?.length ?? 0) > 0 || (block.layers?.length ?? 0) > 0;
3676
+ }
3677
+ function hasOwnContent(block) {
3678
+ return hasTitle(block) || hasBody(block);
3679
+ }
3680
+ function isGenericAnswerBlock(block) {
3681
+ return hasTitle(block) && GENERIC_ANSWER_TITLES.has(block.title.trim().toLowerCase());
3682
+ }
3683
+ function selfOnly(block) {
3684
+ const { children: _children, ...self } = block;
3685
+ return self;
3686
+ }
3687
+ function titleOnly(block) {
3688
+ const {
3689
+ children: _children,
3690
+ contents: _contents,
3691
+ media: _media,
3692
+ layers: _layers,
3693
+ ...title2
3694
+ } = block;
3695
+ return title2;
3696
+ }
3697
+ function bodyOnly(block) {
3698
+ const { children: _children, title: _title, ...body } = block;
3699
+ return body;
3700
+ }
3701
+ function face(...blocks) {
3702
+ return { blocks };
3703
+ }
3704
+ function isTrue(value) {
3705
+ if (value === true) return true;
3706
+ if (typeof value !== "string") return false;
3707
+ return ["true", "yes", "on", "1", "correct"].includes(value.trim().toLowerCase());
3708
+ }
3709
+ function isCorrectChoice(block) {
3710
+ return isTrue(block.metadata?.correct) || isTrue(block.metadata?.answer) || (block.classes ?? []).some((className) => normalizeMarker(className) === "correct");
3711
+ }
3712
+ function looksLikeCompleteCard(block) {
3713
+ const marker = resolveFlashcardMarker(block);
3714
+ if (marker === "group") return false;
3715
+ if (marker === "basic" || marker === "multiple-choice") return true;
3716
+ if (isGenericAnswerBlock(block)) return false;
3717
+ const children = block.children ?? [];
3718
+ if (children.length === 0) return hasTitle(block) && hasBody(block);
3719
+ if (children.length === 1) {
3720
+ return hasOwnContent(block) && hasOwnContent(children[0]);
3721
+ }
3722
+ return children.every(hasOwnContent);
3723
+ }
3724
+ function hasExplicitCardDescendant(block) {
3725
+ for (const child of block.children ?? []) {
3726
+ const marker = resolveFlashcardMarker(child);
3727
+ if (marker === "basic" || marker === "multiple-choice") return true;
3728
+ if (hasExplicitCardDescendant(child)) return true;
3729
+ }
3730
+ return false;
3731
+ }
3732
+ function shouldTreatAsImplicitGroup(block) {
3733
+ const children = block.children ?? [];
3734
+ if (children.length === 0) return false;
3735
+ if (hasExplicitCardDescendant(block)) return true;
3736
+ if (hasBody(block)) return false;
3737
+ if (children.length === 1) {
3738
+ return looksLikeCompleteCard(children[0]) && !isGenericAnswerBlock(children[0]);
3739
+ }
3740
+ return children.filter(looksLikeCompleteCard).length >= 2;
3741
+ }
3742
+ function explanationFor(block) {
3743
+ return hasBody(block) ? face(bodyOnly(block)) : void 0;
3744
+ }
3745
+ function materializeBasic(block, diagnostics) {
3746
+ const children = block.children ?? [];
3747
+ let front;
3748
+ let back;
3749
+ let label;
3750
+ let explanation;
3751
+ if (children.length === 0) {
3752
+ front = hasTitle(block) ? face(titleOnly(block)) : face();
3753
+ back = hasBody(block) ? face(bodyOnly(block)) : face();
3754
+ } else if (children.length === 1) {
3755
+ front = hasOwnContent(block) ? face(selfOnly(block)) : face();
3756
+ back = hasOwnContent(children[0]) ? face(children[0]) : face();
3757
+ } else {
3758
+ front = hasOwnContent(children[0]) ? face(children[0]) : face();
3759
+ back = face(...children.slice(1).filter(hasOwnContent));
3760
+ label = hasTitle(block) ? block.title.trim() : void 0;
3761
+ explanation = explanationFor(block);
3762
+ }
3763
+ if (front.blocks.length === 0) {
3764
+ diagnostics.push({
3765
+ severity: "error",
3766
+ code: "empty-front",
3767
+ message: `Flashcard "${block.id}" has no content for its front`,
3768
+ blockId: block.id
3769
+ });
3770
+ }
3771
+ if (back.blocks.length === 0) {
3772
+ diagnostics.push({
3773
+ severity: "error",
3774
+ code: "empty-back",
3775
+ message: `Flashcard "${block.id}" has no content for its answer`,
3776
+ blockId: block.id
3777
+ });
3778
+ }
3779
+ if (front.blocks.length === 0 || back.blocks.length === 0) return void 0;
3780
+ return {
3781
+ id: block.id,
3782
+ sourceBlockId: block.id,
3783
+ kind: "basic",
3784
+ ...label ? { label } : {},
3785
+ front,
3786
+ back,
3787
+ ...explanation ? { explanation } : {}
3788
+ };
3789
+ }
3790
+ function materializeMultipleChoice(block, diagnostics) {
3791
+ const children = block.children ?? [];
3792
+ const question = children[0];
3793
+ const answerBlocks = children.slice(1).filter(hasOwnContent);
3794
+ if (!question || !hasOwnContent(question)) {
3795
+ diagnostics.push({
3796
+ severity: "error",
3797
+ code: "empty-front",
3798
+ message: `Multiple-choice flashcard "${block.id}" has no question block`,
3799
+ blockId: block.id
3800
+ });
3801
+ }
3802
+ if (answerBlocks.length === 0) {
3803
+ diagnostics.push({
3804
+ severity: "error",
3805
+ code: "empty-back",
3806
+ message: `Multiple-choice flashcard "${block.id}" has no answer choices`,
3807
+ blockId: block.id
3808
+ });
3809
+ }
3810
+ if (!question || !hasOwnContent(question) || answerBlocks.length === 0) return void 0;
3811
+ const explicitlyCorrect = answerBlocks.filter(isCorrectChoice);
3812
+ if (explicitlyCorrect.length > 1) {
3813
+ diagnostics.push({
3814
+ severity: "warning",
3815
+ code: "multiple-correct-answers",
3816
+ message: `Multiple-choice flashcard "${block.id}" marks more than one answer correct; the first marker wins`,
3817
+ blockId: block.id
3818
+ });
3819
+ }
3820
+ const correctBlock = explicitlyCorrect[0] ?? answerBlocks[0];
3821
+ if (answerBlocks.length < 2) {
3822
+ diagnostics.push({
3823
+ severity: "warning",
3824
+ code: "multiple-choice-needs-distractor",
3825
+ message: `Multiple-choice flashcard "${block.id}" needs at least one distractor`,
3826
+ blockId: block.id
3827
+ });
3828
+ }
3829
+ const choices = answerBlocks.map((answer, index) => ({
3830
+ id: `${block.id}-choice-${index + 1}`,
3831
+ sourceBlockId: answer.id,
3832
+ content: face(answer),
3833
+ correct: answer === correctBlock
3834
+ }));
3835
+ const explanation = explanationFor(block);
3836
+ return {
3837
+ id: block.id,
3838
+ sourceBlockId: block.id,
3839
+ kind: "multiple-choice",
3840
+ ...hasTitle(block) ? { label: block.title.trim() } : {},
3841
+ front: face(question),
3842
+ back: face(correctBlock),
3843
+ choices,
3844
+ ...explanation ? { explanation } : {}
3845
+ };
3846
+ }
3847
+ function resolveDeckTitle(doc) {
3848
+ const frontmatterTitle = doc.frontmatter?.title;
3849
+ if (typeof frontmatterTitle === "string" && frontmatterTitle.trim()) {
3850
+ return frontmatterTitle.trim();
3851
+ }
3852
+ return doc.startBlock?.title?.trim() || void 0;
3853
+ }
3854
+ function materializeFlashcards(doc, options = {}) {
3855
+ const source = options.source ?? "auto";
3856
+ const cards = [];
3857
+ const diagnostics = [];
3858
+ const visit = (block) => {
3859
+ const marker = resolveFlashcardMarker(block);
3860
+ if (marker === "group") {
3861
+ for (const child of block.children ?? []) visit(child);
3862
+ return;
3863
+ }
3864
+ if (marker === "basic") {
3865
+ const card = materializeBasic(block, diagnostics);
3866
+ if (card) cards.push(card);
3867
+ return;
3868
+ }
3869
+ if (marker === "multiple-choice") {
3870
+ const card = materializeMultipleChoice(block, diagnostics);
3871
+ if (card) cards.push(card);
3872
+ return;
3873
+ }
3874
+ if (source === "explicit") {
3875
+ for (const child of block.children ?? []) visit(child);
3876
+ return;
3877
+ }
3878
+ if (shouldTreatAsImplicitGroup(block)) {
3879
+ for (const child of block.children ?? []) visit(child);
3880
+ return;
3881
+ }
3882
+ if (looksLikeCompleteCard(block)) {
3883
+ const card = materializeBasic(block, diagnostics);
3884
+ if (card) cards.push(card);
3885
+ return;
3886
+ }
3887
+ for (const child of block.children ?? []) visit(child);
3888
+ };
3889
+ for (const block of doc.blocks) visit(block);
3890
+ const resolvedTitle = resolveDeckTitle(doc);
3891
+ const authoredTitle = typeof doc.frontmatter?.title === "string" ? doc.frontmatter.title.trim() : "";
3892
+ const firstCardTitle = cards[0]?.front.blocks[0]?.title?.trim();
3893
+ const title2 = resolvedTitle && (authoredTitle || resolvedTitle !== firstCardTitle) ? resolvedTitle : void 0;
3894
+ return {
3895
+ ...title2 ? { title: title2 } : {},
3896
+ cards,
3897
+ diagnostics
3898
+ };
3899
+ }
3900
+
3635
3901
  // src/doc/applyNarrationTiming.ts
3636
3902
  var MIN_BLOCK_SIMILARITY = 0.5;
3637
3903
  var MIN_V1_SCRIPT_SIMILARITY = 0.8;
@@ -5603,6 +5869,8 @@ export {
5603
5869
  resolveDashboardSettings,
5604
5870
  materializeDashboard,
5605
5871
  composeDashboardLayers,
5872
+ resolveFlashcardMarker,
5873
+ materializeFlashcards,
5606
5874
  applyNarrationTiming,
5607
5875
  scoreTextSimilarity,
5608
5876
  resolveAudioMapping,
@@ -1,11 +1,11 @@
1
- import { bb as TemplateBlock, bc as TemplateContext, a3 as Layer, w as CustomTemplateDefinition, be as TemplateRegistry, bh as Theme, bL as ViewportConfig, aL as PersistentLayerConfig, P as DocBlock, bM as ViewportOrientation, aK as PersistentLayer, bu as TitleBlockInput, b0 as SectionHeaderInput, j as BigTextInput, u as ContentBlockInput, b6 as StatHighlightInput, aW as QuoteBlockInput, V as FactCardInput, bB as TwoColumnInput, H as DateEventInput, a1 as ImageWithCaptionInput, a6 as LeftFeatureInput, aZ as RightFeatureInput, aa as MapBlockInput, b5 as StartBlockConfig, Y as FullBleedQuoteInput, a9 as ListBlockInput, aP as PhotoGridInput, J as DefinitionCardInput, t as ComparisonBarInput, aV as PullQuoteInput, bK as VideoWithCaptionInput, bJ as VideoPullQuoteInput, G as DataTableInput, K as DiagramBlockInput, bw as TreeBlockInput, bq as TimelineBlockInput, k as Block, S as DrawingBlockInput, ae as MarkerStyle, A as AccentImage, a0 as ImageTreatment, a as AccentPosition, c as Animation, d as AnimationType, bj as ThemeColorScheme, O as Doc, bl as ThemeRegistry, aD as PageEmphasis, bk as ThemePageStyle, Q as DocDiagnostic, N as DiagramTemplateNode, M as DiagramTemplateEdge, bt as TimelineTemplateTrack, bs as TimelineTemplateLink } from '../Doc-DBadkoP4.js';
2
- export { T as FRONTMATTER_CUSTOM_TEMPLATES_KEY, U as FRONTMATTER_CUSTOM_THEMES_KEY, a5 as LayoutHints, aY as RenderStyle, bi as ThemeColorPalette, bo as ThemeStyle, bp as ThemeTypography, bC as VIEWPORT_PRESETS, bN as ViewportPreset, bS as createTemplateContext, bZ as getLayoutHints, c0 as getTwoColumnPositions, c1 as getViewport, c2 as getViewportOrientation, c5 as isTemplateBlock, c8 as scaledFontSize } from '../Doc-DBadkoP4.js';
3
- import { L as MarkdownNode, a3 as TransitionType, a2 as TransitionDirection, M as MarkdownBlockNode, r as MarkdownHeading, n as MarkdownDocument, T as MarkdownTable, i as MarkdownCodeBlock, G as MarkdownList } from '../types-CcrDFdWH.js';
4
- import { C as CoercedBlockMeta } from '../annotationCoercion-CPHEggo3.js';
5
- import { c as PageSection } from '../materializePageSection-Rss5thAj.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-Rss5thAj.js';
1
+ import { bb as TemplateBlock, bc as TemplateContext, a3 as Layer, w as CustomTemplateDefinition, be as TemplateRegistry, bh as Theme, bL as ViewportConfig, aL as PersistentLayerConfig, P as DocBlock, bM as ViewportOrientation, aK as PersistentLayer, bu as TitleBlockInput, b0 as SectionHeaderInput, j as BigTextInput, u as ContentBlockInput, b6 as StatHighlightInput, aW as QuoteBlockInput, V as FactCardInput, bB as TwoColumnInput, H as DateEventInput, a1 as ImageWithCaptionInput, a6 as LeftFeatureInput, aZ as RightFeatureInput, aa as MapBlockInput, b5 as StartBlockConfig, Y as FullBleedQuoteInput, a9 as ListBlockInput, aP as PhotoGridInput, J as DefinitionCardInput, t as ComparisonBarInput, aV as PullQuoteInput, bK as VideoWithCaptionInput, bJ as VideoPullQuoteInput, G as DataTableInput, K as DiagramBlockInput, bw as TreeBlockInput, bq as TimelineBlockInput, k as Block, S as DrawingBlockInput, ae as MarkerStyle, A as AccentImage, a0 as ImageTreatment, a as AccentPosition, c as Animation, d as AnimationType, bj as ThemeColorScheme, O as Doc, bl as ThemeRegistry, aD as PageEmphasis, bk as ThemePageStyle, Q as DocDiagnostic, N as DiagramTemplateNode, M as DiagramTemplateEdge, bt as TimelineTemplateTrack, bs as TimelineTemplateLink } from '../Doc-DTyeaFuW.js';
2
+ export { T as FRONTMATTER_CUSTOM_TEMPLATES_KEY, U as FRONTMATTER_CUSTOM_THEMES_KEY, a5 as LayoutHints, aY as RenderStyle, bi as ThemeColorPalette, bo as ThemeStyle, bp as ThemeTypography, bC as VIEWPORT_PRESETS, bN as ViewportPreset, bS as createTemplateContext, bZ as getLayoutHints, c0 as getTwoColumnPositions, c1 as getViewport, c2 as getViewportOrientation, c5 as isTemplateBlock, c8 as scaledFontSize } from '../Doc-DTyeaFuW.js';
3
+ import { L as MarkdownNode, a5 as TransitionType, a4 as TransitionDirection, M as MarkdownBlockNode, r as MarkdownHeading, n as MarkdownDocument, V as MarkdownTable, i as MarkdownCodeBlock, G as MarkdownList } from '../types-Be6sBUBx.js';
4
+ import { C as CoercedBlockMeta } from '../annotationCoercion-Ckqpu33y.js';
5
+ import { c as PageSection } from '../materializePageSection-BRNIINlU.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-BRNIINlU.js';
7
7
  import { C as ContentContainer } from '../ContentContainer-B2w9sUoL.js';
8
- export { D as DEFAULT_THEME, g as getAvailableThemes, b as getThemeSummaries, r as resolveTheme } from '../themeLibrary-8BQMY2HV.js';
8
+ export { D as DEFAULT_THEME, g as getAvailableThemes, b as getThemeSummaries, r as resolveTheme } from '../themeLibrary-xaxN5UYu.js';
9
9
 
10
10
  /** Runtime registry composition for built-in and document-scoped templates. */
11
11
 
@@ -1875,6 +1875,23 @@ interface RichListItem {
1875
1875
  markdown: MarkdownBlockNode[];
1876
1876
  html?: string;
1877
1877
  }
1878
+ /**
1879
+ * Render Markdown block nodes as the small, sanitized HTML subset accepted by
1880
+ * `TextLayer.content.html`. This keeps structural content (especially lists
1881
+ * and paragraph boundaries) intact when a slide template uses one rich text
1882
+ * layer instead of the full React Markdown renderer.
1883
+ *
1884
+ * Raw HTML blocks deliberately fall through to escaped plain text. The text
1885
+ * layer renderer sanitizes this projection again, but generated HTML should
1886
+ * still be safe before it reaches that boundary.
1887
+ */
1888
+ declare function renderMarkdownBlocksHtml(nodes: readonly MarkdownBlockNode[]): string;
1889
+ /**
1890
+ * Number of newline characters to retain in a plain-text projection between
1891
+ * two Markdown blocks. A normal block boundary gets the usual two newlines;
1892
+ * parsed source with additional blank lines keeps the larger authored gap.
1893
+ */
1894
+ declare function markdownBlockSeparatorLines(previous: MarkdownBlockNode, next: MarkdownBlockNode): number;
1878
1895
  /** Extract list items without discarding their inline Markdown formatting. */
1879
1896
  declare function extractRichListItems(contents?: MarkdownBlockNode[]): RichListItem[];
1880
1897
  /**
@@ -1976,8 +1993,9 @@ interface MarkdownToDocOptions {
1976
1993
  * StartBlockConfig is created with a title resolved in priority order:
1977
1994
  * frontmatter `title:`, the first occurrence of the shallowest heading
1978
1995
  * (H1, else H2, else H3, …), then {@link fileName}. If the document
1979
- * contains an image, the first image is used as the hero. Set to false to
1980
- * suppress automatic cover generation.
1996
+ * contains an image, the first image is used as the hero. A frontmatter
1997
+ * `subtitle:` overrides the usual first-paragraph subtitle. Set to false
1998
+ * to suppress automatic cover generation.
1981
1999
  */
1982
2000
  generateCoverBlock?: boolean;
1983
2001
  /**
@@ -3011,6 +3029,66 @@ declare function materializeDashboard(doc: Doc, options?: MaterializeDashboardOp
3011
3029
  */
3012
3030
  declare function composeDashboardLayers(materialization: DashboardMaterialization): Layer[];
3013
3031
 
3032
+ /**
3033
+ * Flashcard-mode projection.
3034
+ *
3035
+ * Flashcards are a study rendition of the existing heading-driven Block tree,
3036
+ * not a visual template. The projection keeps rich Markdown nodes and nested
3037
+ * blocks intact so React and future exporters can render the same authored
3038
+ * content without reducing cards to strings.
3039
+ */
3040
+
3041
+ type FlashcardKind = 'basic' | 'multiple-choice';
3042
+ type FlashcardSourceMode = 'auto' | 'explicit';
3043
+ interface FlashcardFace {
3044
+ /** Blocks rendered on this face, in source order. */
3045
+ blocks: Block[];
3046
+ }
3047
+ interface FlashcardChoice {
3048
+ id: string;
3049
+ sourceBlockId: string;
3050
+ content: FlashcardFace;
3051
+ correct: boolean;
3052
+ }
3053
+ interface Flashcard {
3054
+ id: string;
3055
+ sourceBlockId: string;
3056
+ kind: FlashcardKind;
3057
+ /** Optional parent heading used as a compact deck/category label. */
3058
+ label?: string;
3059
+ front: FlashcardFace;
3060
+ /** Basic-card answer, or the correct answer for a multiple-choice card. */
3061
+ back: FlashcardFace;
3062
+ choices?: FlashcardChoice[];
3063
+ /** Parent-owned body shown after reveal/grading for multi-child cards. */
3064
+ explanation?: FlashcardFace;
3065
+ }
3066
+ type FlashcardDiagnosticCode = 'empty-front' | 'empty-back' | 'multiple-choice-needs-distractor' | 'multiple-correct-answers';
3067
+ interface FlashcardDiagnostic {
3068
+ severity: 'warning' | 'error';
3069
+ code: FlashcardDiagnosticCode;
3070
+ message: string;
3071
+ blockId: string;
3072
+ }
3073
+ interface FlashcardDeck {
3074
+ title?: string;
3075
+ cards: Flashcard[];
3076
+ diagnostics: FlashcardDiagnostic[];
3077
+ }
3078
+ interface MaterializeFlashcardsOptions {
3079
+ /**
3080
+ * `auto` (default) discovers card-shaped blocks and honors explicit study
3081
+ * metadata. `explicit` includes only blocks marked `study=flashcard` or
3082
+ * `study=multiple-choice-flashcard` (and their class/template aliases).
3083
+ */
3084
+ source?: FlashcardSourceMode;
3085
+ }
3086
+ type FlashcardMarker = FlashcardKind | 'group';
3087
+ /** Resolve an authored study marker without changing the visual template model. */
3088
+ declare function resolveFlashcardMarker(block: Block): FlashcardMarker | undefined;
3089
+ /** Convert a nested Doc into a deterministic study deck. */
3090
+ declare function materializeFlashcards(doc: Doc, options?: MaterializeFlashcardsOptions): FlashcardDeck;
3091
+
3014
3092
  /**
3015
3093
  * Audio Mapping
3016
3094
  *
@@ -3833,4 +3911,4 @@ declare function treeFromMarkdownList(list: MarkdownList): Tree;
3833
3911
  /** Find the first top-level markdown list in a block's body, if any. */
3834
3912
  declare function findFirstList(contents: MarkdownBlockNode[] | undefined): MarkdownList | undefined;
3835
3913
 
3836
- export { ASCII_CHAR_H, ASCII_CHAR_W, ASCII_DIAGRAM_FENCE_LANGS, ASCII_TIMELINE_FENCE_LANGS, type AccentLayout, 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, BASE_INPUT_DESCRIPTORS, BLOCK_MEDIA_LAYOUT_POLICIES, BUILTIN_DASHBOARD_LAYOUTS, type BlockLayerMaterialization, type BlockMediaLayoutPolicy, type BuildPreviewDocOptions, type BuiltInTemplateName, CONTAINER_TEMPLATES, COVER_SLIDE_FRONTMATTER_KEYS, COVER_SLIDE_TEMPLATE_OPTIONS, type ClipBox, type ConnectorAnchor, type ConnectorPort, type ConnectorRouting, type ConnectorSnapPoint, 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, DEFAULT_COVER_SLIDE_SETTINGS, DEFAULT_DASHBOARD_SETTINGS, DEFAULT_DASHBOARD_STYLE, DEFAULT_LAYOUT, 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 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 InputCoercion, type LayerMaterializationDiagnostic, type LayerMaterializationFailureMode, type LayerMaterializationSource, type LayoutLayerDefaults, type LayoutLayersResult, MAX_COVER_SLIDE_DURATION_SECONDS, type MarkdownToDocOptions, type MarkdownValidationResult, type MaterializeBlockLayersOptions, type MaterializeDashboardOptions, type NarrationResolution, type NativeMediaLayout, type NoMediaLayout, PAGE_BASE_CSS, PATH_SHAPE_KINDS, PageSection, type PageSectionContext, type PageSectionDraft, PersistentLayerConfig, type RenderAsciiDiagramOptions, type RenderAsciiTimelineOptions, type RenderTreeOptions, type RepairResult, type ResolvedDashboardCell, type ResolvedPageBlock, type RichListItem, type RuntimeTemplateRegistry, SHAPE_NAMES, type SectionExtractor, type SupplementalMediaLayoutVariant, type SupplementalMediaShape, type SupplementalMediaVariantMatrix, TABLE_FED_TEMPLATES, TEMPLATE_AUTHORING_METADATA, TEMPLATE_INPUT_DESCRIPTORS, TEMPLATE_METADATA, TREE_FENCE_LANGS, type TemplateAuthoringMetadata, type TemplateAuthoringRole, TemplateBlock, type TemplateBodyPolicy, TemplateContext, type TemplateInputDescriptor, type TemplateMediaOwnership, type TemplateMetadata, type TemplateParamFinding, Theme, ThemeColorScheme, type Tree, type TreeDetection, type TreeItem, type TreeNode, type UnconsumedMediaBehavior, type ValidateOptions, ViewportConfig, ViewportOrientation, adjustY, anchorPoint, applyNarrationTiming, applyRenderStyleToLayers, asciiCellToCanvas, asciiDiagramFromBlocks, asciiDiagramFromTemplateData, asciiDiagramToTemplateData, asciiTimelineToTemplateData, autoTemplatePreservesContent, bigText, buildDashboardCellChrome, buildPageCss, buildPageCssVars, buildPreviewDoc, buildRegistry, canvasToAsciiCell, chooseDashboardLayout, clipEndpoints, clipPoint, coerceTemplateParams, comparisonBar, composeDashboardLayers, computeDiagramLayout, computeDrawingLayout, computeLayoutLayers, connectorPath, contentBlock, countBlocks, coverBlock, createAccentLayers, cssFilterForTreatment, dashboardCanvasFill, dashboardCellAccent, dataTable, dateEvent, definitionCard, deriveTemplateInputs, desiredCellZoom, detectAsciiDiagram, detectAsciiTimeline, detectTree, diagramBlock, docToMarkdown, documentTitleFromFileName, drawingBlock, expandCoverBlock, expandDocBlocks, expandPersistentLayers, extractBlockquoteText, extractBodyPlainText, extractEmbeddedVideos, extractFirstEmbeddedVideo, extractFirstImage, extractImages, extractListItems, extractRichListItems, extractTableData, extractTableFromContents, factCard, fallbackBlockLayers, findFirstList, findFirstTable, fitBigTextSize, fitDiagramLabel, flattenBlocks, flattenRenderableBlocks, fullBleedQuote, getAccentLayout, getAnimationProgress, getAnimationStyle, getAvailableTemplates, getBlockBodyText, getBlockDepth, getBlockMediaLayoutPolicy, getDashboardLayoutSummaries, getDefaultAnimation, getDefaultAnimationDuration, getOverlayOpacity, getPersistentLayersFromTheme, getPinnedBlockMeta, getTemplateHint, getThemeFont, getTransitionClass, hasTemplate, imageWithCaption, isAsciiDiagramFence, isAsciiTimelineFence, isContainerTemplate, isDataFence, isEligibleAsciiFenceLang, isEligibleAsciiTimelineFenceLang, isEligibleTreeFenceLang, isExplicitDiagramLang, isExplicitTimelineLang, isExplicitTreeLang, isRepairableDiagram, isShapeName, isTemplatedPageBlock, isTreeFence, isWrappedFlowTimelineSource, layoutBlock, layoutCapacity, leftFeature, lineStyleDasharray, lintTemplateParams, listBlock, listDashboardLayouts, mapBlock, markdownToDoc, markerPath, materializeBlockLayers, materializeDashboard, nearestSnapPoint, normalizeDashboardZoom, normalizeShapeKind, pageStyleDataAttributes, parseAsciiDiagram, parseAsciiTimeline, parseAsciiTimelineWithStats, parseDataFence, parseTree, parseWrappedFlowTimeline, parseYamlSubset, photoGrid, pullQuote, quoteBlock, readCustomTemplatesFromFrontmatter, readCustomThemesFromFrontmatter, readDashboardLayoutsFromFrontmatter, renderAsciiDiagram, renderAsciiTimeline, renderTree, repairAsciiDiagram, replaceDataFence, resolveAudioMapping, resolveColorScheme, resolveCoverSlideSettings, resolveDashboardLayoutDefinition, resolveDashboardSettings, resolveDashboardStyleId, resolveDashboardZooms, 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, transposeCells, treeBlock, treeFromMarkdownList, treeFromTemplateData, treeToTemplateData, twoColumn, validateDashboardLayoutDefinition, validateMarkdownDoc, validateMarkdownSource, videoPullQuote, videoWithCaption, wrapWithPersistentLayers, writeCustomTemplatesToFrontmatter, writeCustomThemesToFrontmatter, writeDashboardLayoutsToFrontmatter };
3914
+ export { ASCII_CHAR_H, ASCII_CHAR_W, ASCII_DIAGRAM_FENCE_LANGS, ASCII_TIMELINE_FENCE_LANGS, type AccentLayout, 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, BASE_INPUT_DESCRIPTORS, BLOCK_MEDIA_LAYOUT_POLICIES, BUILTIN_DASHBOARD_LAYOUTS, type BlockLayerMaterialization, type BlockMediaLayoutPolicy, type BuildPreviewDocOptions, type BuiltInTemplateName, CONTAINER_TEMPLATES, COVER_SLIDE_FRONTMATTER_KEYS, COVER_SLIDE_TEMPLATE_OPTIONS, type ClipBox, type ConnectorAnchor, type ConnectorPort, type ConnectorRouting, type ConnectorSnapPoint, 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, DEFAULT_COVER_SLIDE_SETTINGS, DEFAULT_DASHBOARD_SETTINGS, DEFAULT_DASHBOARD_STYLE, DEFAULT_LAYOUT, 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 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 InputCoercion, type LayerMaterializationDiagnostic, type LayerMaterializationFailureMode, type LayerMaterializationSource, type LayoutLayerDefaults, type LayoutLayersResult, MAX_COVER_SLIDE_DURATION_SECONDS, type MarkdownToDocOptions, type MarkdownValidationResult, type MaterializeBlockLayersOptions, type MaterializeDashboardOptions, type MaterializeFlashcardsOptions, type NarrationResolution, type NativeMediaLayout, type NoMediaLayout, PAGE_BASE_CSS, PATH_SHAPE_KINDS, PageSection, type PageSectionContext, type PageSectionDraft, PersistentLayerConfig, type RenderAsciiDiagramOptions, type RenderAsciiTimelineOptions, type RenderTreeOptions, type RepairResult, type ResolvedDashboardCell, type ResolvedPageBlock, type RichListItem, type RuntimeTemplateRegistry, SHAPE_NAMES, type SectionExtractor, type SupplementalMediaLayoutVariant, type SupplementalMediaShape, type SupplementalMediaVariantMatrix, TABLE_FED_TEMPLATES, TEMPLATE_AUTHORING_METADATA, TEMPLATE_INPUT_DESCRIPTORS, TEMPLATE_METADATA, TREE_FENCE_LANGS, type TemplateAuthoringMetadata, type TemplateAuthoringRole, TemplateBlock, type TemplateBodyPolicy, TemplateContext, type TemplateInputDescriptor, type TemplateMediaOwnership, type TemplateMetadata, type TemplateParamFinding, Theme, ThemeColorScheme, type Tree, type TreeDetection, type TreeItem, type TreeNode, type UnconsumedMediaBehavior, type ValidateOptions, ViewportConfig, ViewportOrientation, adjustY, anchorPoint, applyNarrationTiming, applyRenderStyleToLayers, asciiCellToCanvas, asciiDiagramFromBlocks, asciiDiagramFromTemplateData, asciiDiagramToTemplateData, asciiTimelineToTemplateData, autoTemplatePreservesContent, bigText, buildDashboardCellChrome, buildPageCss, buildPageCssVars, buildPreviewDoc, buildRegistry, canvasToAsciiCell, chooseDashboardLayout, clipEndpoints, clipPoint, coerceTemplateParams, comparisonBar, composeDashboardLayers, computeDiagramLayout, computeDrawingLayout, computeLayoutLayers, connectorPath, contentBlock, countBlocks, coverBlock, createAccentLayers, cssFilterForTreatment, dashboardCanvasFill, dashboardCellAccent, dataTable, dateEvent, definitionCard, deriveTemplateInputs, desiredCellZoom, detectAsciiDiagram, detectAsciiTimeline, detectTree, diagramBlock, docToMarkdown, documentTitleFromFileName, drawingBlock, expandCoverBlock, expandDocBlocks, expandPersistentLayers, extractBlockquoteText, extractBodyPlainText, extractEmbeddedVideos, extractFirstEmbeddedVideo, extractFirstImage, extractImages, extractListItems, extractRichListItems, extractTableData, extractTableFromContents, factCard, fallbackBlockLayers, findFirstList, findFirstTable, fitBigTextSize, fitDiagramLabel, flattenBlocks, flattenRenderableBlocks, fullBleedQuote, getAccentLayout, getAnimationProgress, getAnimationStyle, getAvailableTemplates, getBlockBodyText, getBlockDepth, getBlockMediaLayoutPolicy, getDashboardLayoutSummaries, getDefaultAnimation, getDefaultAnimationDuration, getOverlayOpacity, getPersistentLayersFromTheme, getPinnedBlockMeta, getTemplateHint, getThemeFont, getTransitionClass, hasTemplate, imageWithCaption, isAsciiDiagramFence, isAsciiTimelineFence, isContainerTemplate, isDataFence, isEligibleAsciiFenceLang, isEligibleAsciiTimelineFenceLang, isEligibleTreeFenceLang, isExplicitDiagramLang, isExplicitTimelineLang, isExplicitTreeLang, isRepairableDiagram, isShapeName, isTemplatedPageBlock, isTreeFence, isWrappedFlowTimelineSource, layoutBlock, layoutCapacity, leftFeature, lineStyleDasharray, lintTemplateParams, listBlock, listDashboardLayouts, mapBlock, markdownBlockSeparatorLines, markdownToDoc, markerPath, materializeBlockLayers, materializeDashboard, materializeFlashcards, nearestSnapPoint, normalizeDashboardZoom, normalizeShapeKind, pageStyleDataAttributes, parseAsciiDiagram, parseAsciiTimeline, parseAsciiTimelineWithStats, parseDataFence, parseTree, parseWrappedFlowTimeline, parseYamlSubset, photoGrid, pullQuote, quoteBlock, readCustomTemplatesFromFrontmatter, readCustomThemesFromFrontmatter, readDashboardLayoutsFromFrontmatter, renderAsciiDiagram, renderAsciiTimeline, renderMarkdownBlocksHtml, renderTree, repairAsciiDiagram, replaceDataFence, resolveAudioMapping, resolveColorScheme, resolveCoverSlideSettings, resolveDashboardLayoutDefinition, resolveDashboardSettings, resolveDashboardStyleId, resolveDashboardZooms, 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, transposeCells, treeBlock, treeFromMarkdownList, treeFromTemplateData, treeToTemplateData, twoColumn, validateDashboardLayoutDefinition, validateMarkdownDoc, validateMarkdownSource, videoPullQuote, videoWithCaption, wrapWithPersistentLayers, writeCustomTemplatesToFrontmatter, writeCustomThemesToFrontmatter, writeDashboardLayoutsToFrontmatter };
package/dist/doc/index.js CHANGED
@@ -36,6 +36,7 @@ import {
36
36
  layoutCapacity,
37
37
  listDashboardLayouts,
38
38
  materializeDashboard,
39
+ materializeFlashcards,
39
40
  materializePageSection,
40
41
  materializePageSections,
41
42
  normalizeDashboardZoom,
@@ -51,6 +52,7 @@ import {
51
52
  resolveDashboardSettings,
52
53
  resolveDashboardStyleId,
53
54
  resolveDashboardZooms,
55
+ resolveFlashcardMarker,
54
56
  resolveLayoutCells,
55
57
  resolvePageBlock,
56
58
  resolvePageStyle,
@@ -64,7 +66,7 @@ import {
64
66
  validateMarkdownDoc,
65
67
  validateMarkdownSource,
66
68
  writeDashboardLayoutsToFrontmatter
67
- } from "../chunk-PTK2SW2V.js";
69
+ } from "../chunk-XSW4QTMB.js";
68
70
  import {
69
71
  ASCII_CHAR_H,
70
72
  ASCII_CHAR_W,
@@ -147,6 +149,7 @@ import {
147
149
  lintTemplateParams,
148
150
  listBlock,
149
151
  mapBlock,
152
+ markdownBlockSeparatorLines,
150
153
  markdownToDoc,
151
154
  materializeBlockLayers,
152
155
  normalizeShapeKind,
@@ -157,6 +160,7 @@ import {
157
160
  quoteBlock,
158
161
  readCustomTemplatesFromFrontmatter,
159
162
  readCustomThemesFromFrontmatter,
163
+ renderMarkdownBlocksHtml,
160
164
  replaceDataFence,
161
165
  resolveColorScheme,
162
166
  resolvePersistentLayers,
@@ -184,7 +188,7 @@ import {
184
188
  wrapWithPersistentLayers,
185
189
  writeCustomTemplatesToFrontmatter,
186
190
  writeCustomThemesToFrontmatter
187
- } from "../chunk-V6NV4GDE.js";
191
+ } from "../chunk-DRFJU4MK.js";
188
192
  import {
189
193
  PATH_SHAPE_KINDS,
190
194
  anchorPoint,
@@ -241,7 +245,7 @@ import {
241
245
  isTemplateBlock,
242
246
  scaledFontSize2 as scaledFontSize
243
247
  } from "../chunk-BAOV476U.js";
244
- import "../chunk-6MVWWZHL.js";
248
+ import "../chunk-MIKKUKOD.js";
245
249
  import {
246
250
  CONTAINER_TEMPLATES,
247
251
  TABLE_FED_TEMPLATES,
@@ -409,10 +413,12 @@ export {
409
413
  listBlock,
410
414
  listDashboardLayouts,
411
415
  mapBlock,
416
+ markdownBlockSeparatorLines,
412
417
  markdownToDoc,
413
418
  markerPath,
414
419
  materializeBlockLayers,
415
420
  materializeDashboard,
421
+ materializeFlashcards,
416
422
  materializePageSection,
417
423
  materializePageSections,
418
424
  nearestSnapPoint,
@@ -434,6 +440,7 @@ export {
434
440
  readDashboardLayoutsFromFrontmatter,
435
441
  renderAsciiDiagram,
436
442
  renderAsciiTimeline,
443
+ renderMarkdownBlocksHtml,
437
444
  renderTree,
438
445
  repairAsciiDiagram,
439
446
  replaceDataFence,
@@ -444,6 +451,7 @@ export {
444
451
  resolveDashboardSettings,
445
452
  resolveDashboardStyleId,
446
453
  resolveDashboardZooms,
454
+ resolveFlashcardMarker,
447
455
  resolveLayoutCells,
448
456
  resolvePageBlock,
449
457
  resolvePageStyle,
@@ -1,5 +1,5 @@
1
- import { bh as Theme } from '../Doc-DBadkoP4.js';
2
- import '../types-CcrDFdWH.js';
1
+ import { bh as Theme } from '../Doc-DTyeaFuW.js';
2
+ import '../types-Be6sBUBx.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, bb as TemplateBlock } from '../Doc-DBadkoP4.js';
4
- import '../types-CcrDFdWH.js';
3
+ import { r as ColorScheme, A as AccentImage, bb as TemplateBlock } from '../Doc-DTyeaFuW.js';
4
+ import '../types-Be6sBUBx.js';
5
5
 
6
6
  /**
7
7
  * Template Mapper
@@ -1,9 +1,9 @@
1
- import { a as ImageEditDoc, b as ImageEditLayer } from '../ImageEditDoc-Cq2a3c30.js';
2
- export { E as EditorLayerMeta, I as ImageEditCanvas, c as ImageEditLayerKind, d as ImageEditMeta } from '../ImageEditDoc-Cq2a3c30.js';
1
+ import { a as ImageEditDoc, b as ImageEditLayer } from '../ImageEditDoc-dFEclQ9l.js';
2
+ export { E as EditorLayerMeta, I as ImageEditCanvas, c as ImageEditLayerKind, d as ImageEditMeta } from '../ImageEditDoc-dFEclQ9l.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-DBadkoP4.js';
6
- import '../types-CcrDFdWH.js';
5
+ import '../Doc-DTyeaFuW.js';
6
+ import '../types-Be6sBUBx.js';
7
7
 
8
8
  /**
9
9
  * Pure helpers for constructing and mutating {@link ImageEditDoc} values.