@bendyline/squisq 2.2.0 → 2.3.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 (35) hide show
  1. package/NOTICE.md +3 -3
  2. package/README.md +8 -8
  3. package/dist/{Doc-BubIpWsp.d.ts → Doc-COe-rPQB.d.ts} +6 -4
  4. package/dist/{ImageEditDoc-CGxk5CHc.d.ts → ImageEditDoc-dtKahVyD.d.ts} +1 -1
  5. package/dist/{chunk-DYPMOPIW.js → chunk-EK446BUE.js} +1 -1
  6. package/dist/{chunk-7ARJZYQY.js → chunk-GIIOY6XR.js} +2048 -1200
  7. package/dist/{chunk-I2O6W7DX.js → chunk-QNTQIEIV.js} +16 -5
  8. package/dist/{chunk-FDYDYL77.js → chunk-QWCFK5FN.js} +1 -0
  9. package/dist/{chunk-CB45YGAM.js → chunk-SPTY4C6F.js} +134 -2
  10. package/dist/doc/index.d.ts +289 -6
  11. package/dist/doc/index.js +13 -4
  12. package/dist/generate/index.d.ts +1 -1
  13. package/dist/generate/index.js +0 -1
  14. package/dist/icons/index.js +0 -1
  15. package/dist/imageEdit/index.d.ts +3 -3
  16. package/dist/index.d.ts +6 -6
  17. package/dist/index.js +17 -10
  18. package/dist/jsonForm/index.d.ts +1 -1
  19. package/dist/jsonForm/index.js +1 -1
  20. package/dist/{materializePageSection-wSLA2A1g.d.ts → materializePageSection-BSMOocve.d.ts} +1 -1
  21. package/dist/narration/index.d.ts +1 -1
  22. package/dist/narration/index.js +3 -4
  23. package/dist/random/index.js +0 -1
  24. package/dist/recommend/index.js +1 -2
  25. package/dist/schemas/index.d.ts +17 -5
  26. package/dist/schemas/index.js +3 -1
  27. package/dist/{themeLibrary-DU9mUmVl.d.ts → themeLibrary-BUTWjufL.d.ts} +1 -1
  28. package/dist/timing/index.js +0 -1
  29. package/dist/transform/index.d.ts +2 -2
  30. package/package.json +5 -2
  31. package/dist/chunk-2L55443L.js +0 -0
  32. package/dist/chunk-QKPXHDLR.js +0 -0
  33. package/dist/chunk-WV5ARNDA.js +0 -0
  34. package/dist/chunk-XWNNA3KE.js +0 -0
  35. package/dist/chunk-YZNGMV3G.js +0 -0
@@ -24,7 +24,7 @@ import {
24
24
  templateRegistry,
25
25
  writeCustomTemplatesToFrontmatter,
26
26
  writeCustomThemesToFrontmatter
27
- } from "./chunk-7ARJZYQY.js";
27
+ } from "./chunk-GIIOY6XR.js";
28
28
  import {
29
29
  ASCII_TREE_VOCAB,
30
30
  ASCII_VOCAB,
@@ -40,7 +40,7 @@ import {
40
40
  toCells,
41
41
  toGrid,
42
42
  traceBoxes
43
- } from "./chunk-FDYDYL77.js";
43
+ } from "./chunk-QWCFK5FN.js";
44
44
  import {
45
45
  defaultPageStyle,
46
46
  resolveMediaSchedule
@@ -537,8 +537,12 @@ function resolvePageBlock(block) {
537
537
  };
538
538
  const coercedParams = coerceTemplateParams(rawName, rawParams).input;
539
539
  let base;
540
+ let derivedInputs = null;
540
541
  if (annotation) {
541
542
  const headingText = extractPlainText(block.sourceHeading);
543
+ derivedInputs = deriveTemplateInputs(rawName, headingText, block.contents, {
544
+ placeholders: true
545
+ });
542
546
  base = {
543
547
  id: block.id,
544
548
  template: rawName,
@@ -548,9 +552,7 @@ function resolvePageBlock(block) {
548
552
  title: headingText,
549
553
  contents: block.contents,
550
554
  children: block.children,
551
- ...deriveTemplateInputs(rawName, headingText, block.contents, {
552
- placeholders: true
553
- }) ?? {}
555
+ ...derivedInputs ?? {}
554
556
  };
555
557
  } else {
556
558
  base = {
@@ -566,6 +568,14 @@ function resolvePageBlock(block) {
566
568
  ...block.templateData ?? {},
567
569
  ...coercedParams
568
570
  };
571
+ const explicitQuote = Object.prototype.hasOwnProperty.call(coercedParams, "quote") ? coercedParams.quote : block.templateData?.quote;
572
+ if (templateName === "quote" && derivedInputs && !Object.prototype.hasOwnProperty.call(derivedInputs, "title") && !(typeof explicitQuote === "string" && explicitQuote.trim())) {
573
+ const quoteInput = templateBlock;
574
+ quoteInput.quote = derivedInputs.quote;
575
+ if (!Object.prototype.hasOwnProperty.call(block.templateData ?? {}, "title") && !Object.prototype.hasOwnProperty.call(coercedParams, "title")) {
576
+ delete quoteInput.title;
577
+ }
578
+ }
569
579
  return { templated: true, templateName, templateBlock };
570
580
  }
571
581
 
@@ -642,6 +652,7 @@ var quote = (input) => {
642
652
  kind: "quote-band",
643
653
  variant: "plain",
644
654
  slots: {
655
+ title: q.title,
645
656
  body: { text: q.quote ?? "" },
646
657
  attribution: q.attribution,
647
658
  media: accentImageMedia(q.accentImage)
@@ -2457,6 +2457,7 @@ function pickAutoTemplate(profile, blockIndex = 0) {
2457
2457
  if (profile.hasTimeline) return "timeline";
2458
2458
  if (profile.hasTree) return "tree";
2459
2459
  if (profile.hasTable) return "dataTable";
2460
+ if (profile.hasVideo) return "videoWithCaption";
2460
2461
  if (profile.imageCount >= 2) return "photoGrid";
2461
2462
  if (profile.hasImage) return blockIndex % 2 === 0 ? "leftFeature" : "rightFeature";
2462
2463
  if (profile.hasBlockquote) return "quote";
@@ -2,6 +2,7 @@ import {
2
2
  defaultPageStyle
3
3
  } from "./chunk-2ZWIXGAC.js";
4
4
  import {
5
+ FONT_FALLBACKS,
5
6
  THEME_SCHEMA_VERSION,
6
7
  assertTheme,
7
8
  createTheme,
@@ -11,7 +12,8 @@ import {
11
12
  oklchLighten,
12
13
  oklchSetChroma,
13
14
  pickContrastingText,
14
- relativeLuminance
15
+ relativeLuminance,
16
+ resolveFontFamily
15
17
  } from "./chunk-C33GTPUZ.js";
16
18
 
17
19
  // src/schemas/Doc.ts
@@ -172,6 +174,135 @@ function serializeTheme(theme) {
172
174
  return JSON.stringify(theme, null, 2);
173
175
  }
174
176
 
177
+ // src/schemas/mermaidTheme.ts
178
+ var MERMAID_CHART_COLOR_COUNT = 12;
179
+ function uniqueColors(colors) {
180
+ return colors.filter((color, index) => color && colors.indexOf(color) === index);
181
+ }
182
+ function chartPalette(theme) {
183
+ const schemes = Object.values(theme.colorSchemes);
184
+ const seeds = uniqueColors([
185
+ theme.colors.primary,
186
+ theme.colors.secondary,
187
+ theme.colors.highlight,
188
+ ...schemes.map((scheme) => scheme.accent),
189
+ theme.colors.warning,
190
+ ...schemes.map((scheme) => scheme.bg),
191
+ theme.colors.textMuted,
192
+ theme.colors.backgroundLight
193
+ ]);
194
+ const fallback = theme.colors.primary;
195
+ return Array.from(
196
+ { length: MERMAID_CHART_COLOR_COUNT },
197
+ (_, index) => seeds[index % Math.max(1, seeds.length)] ?? fallback
198
+ );
199
+ }
200
+ function textOn(theme, background) {
201
+ return pickContrastingText(background, theme.colors.text, theme.colors.background);
202
+ }
203
+ function buildMermaidThemeVariables(theme) {
204
+ const { colors } = theme;
205
+ const primaryText = textOn(theme, colors.primary);
206
+ const secondaryText = textOn(theme, colors.secondary);
207
+ const highlightText = textOn(theme, colors.highlight);
208
+ const palette = chartPalette(theme);
209
+ const variables = {
210
+ darkMode: relativeLuminance(colors.background) < 0.5,
211
+ background: colors.background,
212
+ fontFamily: resolveFontFamily(theme.typography.bodyFont, FONT_FALLBACKS.sans),
213
+ primaryColor: colors.primary,
214
+ primaryTextColor: primaryText,
215
+ primaryBorderColor: colors.highlight,
216
+ secondaryColor: colors.secondary,
217
+ secondaryTextColor: secondaryText,
218
+ secondaryBorderColor: colors.primary,
219
+ tertiaryColor: colors.backgroundLight,
220
+ tertiaryTextColor: colors.text,
221
+ tertiaryBorderColor: colors.textMuted,
222
+ textColor: colors.text,
223
+ titleColor: colors.text,
224
+ lineColor: colors.textMuted,
225
+ arrowheadColor: colors.textMuted,
226
+ defaultLinkColor: colors.textMuted,
227
+ mainBkg: colors.primary,
228
+ nodeBkg: colors.primary,
229
+ nodeTextColor: primaryText,
230
+ nodeBorder: colors.highlight,
231
+ clusterBkg: colors.backgroundLight,
232
+ clusterBorder: colors.secondary,
233
+ edgeLabelBackground: colors.background,
234
+ actorBkg: colors.backgroundLight,
235
+ actorBorder: colors.primary,
236
+ actorTextColor: colors.text,
237
+ actorLineColor: colors.textMuted,
238
+ signalColor: colors.textMuted,
239
+ signalTextColor: colors.text,
240
+ labelBoxBkgColor: colors.backgroundLight,
241
+ labelBoxBorderColor: colors.secondary,
242
+ labelTextColor: colors.text,
243
+ loopTextColor: colors.text,
244
+ activationBkgColor: colors.secondary,
245
+ activationBorderColor: colors.primary,
246
+ sequenceNumberColor: primaryText,
247
+ noteBkgColor: colors.highlight,
248
+ noteBorderColor: colors.primary,
249
+ noteTextColor: highlightText,
250
+ sectionBkgColor: colors.backgroundLight,
251
+ altSectionBkgColor: colors.background,
252
+ sectionBkgColor2: colors.primary,
253
+ taskBkgColor: colors.primary,
254
+ taskBorderColor: colors.highlight,
255
+ taskTextColor: primaryText,
256
+ taskTextLightColor: colors.text,
257
+ taskTextDarkColor: colors.text,
258
+ taskTextOutsideColor: colors.text,
259
+ taskTextClickableColor: colors.highlight,
260
+ activeTaskBkgColor: colors.secondary,
261
+ activeTaskBorderColor: colors.highlight,
262
+ doneTaskBkgColor: colors.backgroundLight,
263
+ doneTaskBorderColor: colors.textMuted,
264
+ critBkgColor: colors.warning,
265
+ critBorderColor: colors.highlight,
266
+ todayLineColor: colors.warning,
267
+ gridColor: colors.textMuted,
268
+ pieTitleTextColor: colors.text,
269
+ pieSectionTextColor: colors.text,
270
+ pieLegendTextColor: colors.text,
271
+ pieStrokeColor: colors.background,
272
+ pieOuterStrokeColor: colors.textMuted,
273
+ quadrantPointFill: colors.highlight,
274
+ quadrantPointTextFill: highlightText,
275
+ quadrantXAxisTextFill: colors.text,
276
+ quadrantYAxisTextFill: colors.text,
277
+ quadrantTitleFill: colors.text,
278
+ requirementBackground: colors.backgroundLight,
279
+ requirementBorderColor: colors.primary,
280
+ requirementTextColor: colors.text,
281
+ relationColor: colors.textMuted,
282
+ relationLabelBackground: colors.background,
283
+ relationLabelColor: colors.text,
284
+ commitLabelColor: colors.text,
285
+ commitLabelBackground: colors.backgroundLight,
286
+ tagLabelColor: primaryText,
287
+ tagLabelBackground: colors.primary,
288
+ tagLabelBorder: colors.highlight
289
+ };
290
+ palette.forEach((color, index) => {
291
+ const label = textOn(theme, color);
292
+ variables[`cScale${index}`] = color;
293
+ variables[`cScaleInv${index}`] = label;
294
+ variables[`cScaleLabel${index}`] = label;
295
+ variables[`cScalePeer${index}`] = label;
296
+ variables[`pie${index + 1}`] = color;
297
+ if (index < 8) {
298
+ variables[`git${index}`] = color;
299
+ variables[`gitInv${index}`] = label;
300
+ variables[`gitBranchLabel${index}`] = label;
301
+ }
302
+ });
303
+ return variables;
304
+ }
305
+
175
306
  export {
176
307
  calculateDuration,
177
308
  getSegmentAtTime,
@@ -182,5 +313,6 @@ export {
182
313
  accentToColorScheme,
183
314
  compileTheme,
184
315
  parseTheme,
185
- serializeTheme
316
+ serializeTheme,
317
+ buildMermaidThemeVariables
186
318
  };
@@ -1,11 +1,11 @@
1
- import { aX as TemplateBlock, aY as TemplateContext, V as Layer, p as CustomTemplateDefinition, a_ as TemplateRegistry, b1 as Theme, bq as ViewportConfig, az as PersistentLayerConfig, G as DocBlock, ay as PersistentLayer, be as TitleBlockInput, aM as SectionHeaderInput, aS as StatHighlightInput, aH as QuoteBlockInput, L as FactCardInput, bl as TwoColumnInput, u as DateEventInput, T as ImageWithCaptionInput, Y as LeftFeatureInput, aK as RightFeatureInput, $ as MapBlockInput, aR as StartBlockConfig, O as FullBleedQuoteInput, _ as ListBlockInput, aD as PhotoGridInput, w as DefinitionCardInput, n as ComparisonBarInput, aG as PullQuoteInput, bp as VideoWithCaptionInput, bo as VideoPullQuoteInput, t as DataTableInput, x as DiagramBlockInput, bg as TreeBlockInput, ba as TimelineBlockInput, B as Block, I as DrawingBlockInput, a3 as MarkerStyle, A as AccentImage, S as ImageTreatment, a as AccentPosition, c as Animation, d as AnimationType, b3 as ThemeColorScheme, F as Doc, b5 as ThemeRegistry, ar as PageEmphasis, b4 as ThemePageStyle, H as DocDiagnostic, E as DiagramTemplateNode, z as DiagramTemplateEdge, bd as TimelineTemplateTrack, bc as TimelineTemplateLink } from '../Doc-BubIpWsp.js';
2
- export { J as FRONTMATTER_CUSTOM_TEMPLATES_KEY, K as FRONTMATTER_CUSTOM_THEMES_KEY, X as LayoutHints, aJ as RenderStyle, b2 as ThemeColorPalette, b8 as ThemeStyle, b9 as ThemeTypography, bm as VIEWPORT_PRESETS, br as ViewportOrientation, bs as ViewportPreset, bx as createTemplateContext, bE as getLayoutHints, bH as getTwoColumnPositions, bI as getViewport, bJ as getViewportOrientation, bL as isTemplateBlock, bO as scaledFontSize } from '../Doc-BubIpWsp.js';
1
+ import { aX as TemplateBlock, aY as TemplateContext, V as Layer, p as CustomTemplateDefinition, a_ as TemplateRegistry, b1 as Theme, bq as ViewportConfig, az as PersistentLayerConfig, G as DocBlock, br as ViewportOrientation, ay as PersistentLayer, be as TitleBlockInput, aM as SectionHeaderInput, aS as StatHighlightInput, aH as QuoteBlockInput, L as FactCardInput, bl as TwoColumnInput, u as DateEventInput, T as ImageWithCaptionInput, Y as LeftFeatureInput, aK as RightFeatureInput, $ as MapBlockInput, aR as StartBlockConfig, O as FullBleedQuoteInput, _ as ListBlockInput, aD as PhotoGridInput, w as DefinitionCardInput, n as ComparisonBarInput, aG as PullQuoteInput, bp as VideoWithCaptionInput, bo as VideoPullQuoteInput, t as DataTableInput, x as DiagramBlockInput, bg as TreeBlockInput, ba as TimelineBlockInput, B as Block, I as DrawingBlockInput, a3 as MarkerStyle, A as AccentImage, S as ImageTreatment, a as AccentPosition, c as Animation, d as AnimationType, b3 as ThemeColorScheme, F as Doc, b5 as ThemeRegistry, ar as PageEmphasis, b4 as ThemePageStyle, H as DocDiagnostic, E as DiagramTemplateNode, z as DiagramTemplateEdge, bd as TimelineTemplateTrack, bc as TimelineTemplateLink } from '../Doc-COe-rPQB.js';
2
+ export { J as FRONTMATTER_CUSTOM_TEMPLATES_KEY, K as FRONTMATTER_CUSTOM_THEMES_KEY, X as LayoutHints, aJ as RenderStyle, b2 as ThemeColorPalette, b8 as ThemeStyle, b9 as ThemeTypography, bm as VIEWPORT_PRESETS, bs as ViewportPreset, bx as createTemplateContext, bE as getLayoutHints, bH as getTwoColumnPositions, bI as getViewport, bJ as getViewportOrientation, bL as isTemplateBlock, bO as scaledFontSize } from '../Doc-COe-rPQB.js';
3
3
  import { K as MarkdownNode, a2 as TransitionType, a1 as TransitionDirection, M as MarkdownBlockNode, r as MarkdownHeading, n as MarkdownDocument, S as MarkdownTable, i as MarkdownCodeBlock, F as MarkdownList } from '../types-CUNc9biN.js';
4
4
  import { C as CoercedBlockMeta } from '../annotationCoercion-PtRQhk5V.js';
5
- import { c as PageSection } from '../materializePageSection-wSLA2A1g.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-wSLA2A1g.js';
5
+ import { c as PageSection } from '../materializePageSection-BSMOocve.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-BSMOocve.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-DU9mUmVl.js';
8
+ export { D as DEFAULT_THEME, g as getAvailableThemes, b as getThemeSummaries, r as resolveTheme } from '../themeLibrary-BUTWjufL.js';
9
9
 
10
10
  /** Runtime registry composition for built-in and document-scoped templates. */
11
11
 
@@ -107,6 +107,259 @@ interface TemplateMetadata {
107
107
  }
108
108
  declare const TEMPLATE_METADATA: Record<string, TemplateMetadata>;
109
109
 
110
+ /**
111
+ * Exhaustive media-layout policy for every built-in block template.
112
+ *
113
+ * A template has two independent concerns:
114
+ * 1. what it renders when no external image/video/diagram is present, and
115
+ * 2. what happens when rich body media was not already consumed by it.
116
+ *
117
+ * Keeping that declaration here prevents misleading template names (for
118
+ * example, `fullBleedQuote` is text-only) from becoming layout behavior.
119
+ * `mediaLayoutPolicy.test.ts` keeps this map exactly 1:1 with the registry.
120
+ */
121
+
122
+ type BuiltInTemplateName = TemplateBlock['template'];
123
+ /** Shape of the supplemental media set after extraction. */
124
+ type SupplementalMediaShape = 'wide' | 'tall' | 'square' | 'multiple';
125
+ /** Designed compositions understood by the framework-free layout resolver. */
126
+ type SupplementalMediaLayoutVariant = 'title-stack' | 'split' | 'text-stack' | 'dense-stack';
127
+ type SupplementalMediaVariantMatrix = Record<ViewportOrientation, Record<SupplementalMediaShape, SupplementalMediaLayoutVariant>>;
128
+ /** What the template does before supplemental rich media is considered. */
129
+ type NoMediaLayout = 'template-default' | 'template-without-optional-media' | 'unsupported' | 'intrinsic-visual';
130
+ /** Which part of the system owns the template's primary media geometry. */
131
+ type TemplateMediaOwnership = 'supplemental' | 'optional-native' | 'required-native' | 'intrinsic-visual';
132
+ /** Geometry already implemented by templates that own their primary media. */
133
+ type NativeMediaLayout = 'full-bleed-image' | 'full-bleed-video' | 'background-image' | 'accent-strip-or-inset' | 'feature-left' | 'feature-right' | 'map-canvas' | 'photo-grid' | 'spatial-canvas' | 'freeform-canvas';
134
+ /** How unconsumed body media behaves after the template renders. */
135
+ type UnconsumedMediaBehavior = 'reserved-slot' | 'reserve-when-no-native-media' | 'retain-native-layout';
136
+ interface BlockMediaLayoutPolicy {
137
+ /** Concise human-readable contract for reviewers and future template work. */
138
+ summary: string;
139
+ /** The composition used when the block has no external rich media. */
140
+ noMedia: NoMediaLayout;
141
+ /** Whether primary media is placed by this resolver or by the template. */
142
+ ownership: TemplateMediaOwnership;
143
+ /** Existing template-owned media geometry, when applicable. */
144
+ nativeLayout?: NativeMediaLayout;
145
+ /** Explicit geometry for extra media when the native composition must remain intact. */
146
+ additionalMediaLayout?: 'overlay-inset';
147
+ /** Placement policy for rich body media left over after template execution. */
148
+ unconsumedMedia: UnconsumedMediaBehavior;
149
+ /** Required whenever unconsumed media may receive a reserved rectangle. */
150
+ variants?: SupplementalMediaVariantMatrix;
151
+ }
152
+ /**
153
+ * Canonical media contract for all 25 built-in templates. Entries are kept
154
+ * in registry/gallery order to make policy reviews easy to scan.
155
+ */
156
+ declare const BLOCK_MEDIA_LAYOUT_POLICIES: {
157
+ readonly title: {
158
+ readonly summary: "Text-only by default; supplemental media gets a title band plus a reserved field.";
159
+ readonly noMedia: "template-default";
160
+ readonly ownership: "supplemental";
161
+ readonly unconsumedMedia: "reserved-slot";
162
+ readonly variants: SupplementalMediaVariantMatrix;
163
+ };
164
+ readonly sectionHeader: {
165
+ readonly summary: "Uses its authored background image when present; otherwise supplemental media receives a title composition.";
166
+ readonly noMedia: "template-without-optional-media";
167
+ readonly ownership: "optional-native";
168
+ readonly nativeLayout: "background-image";
169
+ readonly additionalMediaLayout: "overlay-inset";
170
+ readonly unconsumedMedia: "reserve-when-no-native-media";
171
+ readonly variants: SupplementalMediaVariantMatrix;
172
+ };
173
+ readonly statHighlight: {
174
+ readonly summary: "Uses its optional accent image natively; otherwise supplemental media occupies a companion field.";
175
+ readonly noMedia: "template-without-optional-media";
176
+ readonly ownership: "optional-native";
177
+ readonly nativeLayout: "accent-strip-or-inset";
178
+ readonly additionalMediaLayout: "overlay-inset";
179
+ readonly unconsumedMedia: "reserve-when-no-native-media";
180
+ readonly variants: SupplementalMediaVariantMatrix;
181
+ };
182
+ readonly quote: {
183
+ readonly summary: "Uses its optional accent image natively; otherwise supplemental media is paired with the quote.";
184
+ readonly noMedia: "template-without-optional-media";
185
+ readonly ownership: "optional-native";
186
+ readonly nativeLayout: "accent-strip-or-inset";
187
+ readonly additionalMediaLayout: "overlay-inset";
188
+ readonly unconsumedMedia: "reserve-when-no-native-media";
189
+ readonly variants: SupplementalMediaVariantMatrix;
190
+ };
191
+ readonly factCard: {
192
+ readonly summary: "Uses its optional accent image natively; otherwise supplemental media is paired with the fact card.";
193
+ readonly noMedia: "template-without-optional-media";
194
+ readonly ownership: "optional-native";
195
+ readonly nativeLayout: "accent-strip-or-inset";
196
+ readonly additionalMediaLayout: "overlay-inset";
197
+ readonly unconsumedMedia: "reserve-when-no-native-media";
198
+ readonly variants: SupplementalMediaVariantMatrix;
199
+ };
200
+ readonly twoColumn: {
201
+ readonly summary: "Text comparison by default; supplemental media stacks below the dense two-column panel.";
202
+ readonly noMedia: "template-default";
203
+ readonly ownership: "supplemental";
204
+ readonly unconsumedMedia: "reserved-slot";
205
+ readonly variants: SupplementalMediaVariantMatrix;
206
+ };
207
+ readonly dateEvent: {
208
+ readonly summary: "Uses its optional accent image natively; otherwise supplemental media is paired with the event.";
209
+ readonly noMedia: "template-without-optional-media";
210
+ readonly ownership: "optional-native";
211
+ readonly nativeLayout: "accent-strip-or-inset";
212
+ readonly additionalMediaLayout: "overlay-inset";
213
+ readonly unconsumedMedia: "reserve-when-no-native-media";
214
+ readonly variants: SupplementalMediaVariantMatrix;
215
+ };
216
+ readonly imageWithCaption: {
217
+ readonly summary: "Requires one primary image and owns its full-bleed image/caption geometry.";
218
+ readonly noMedia: "unsupported";
219
+ readonly ownership: "required-native";
220
+ readonly nativeLayout: "full-bleed-image";
221
+ readonly additionalMediaLayout: "overlay-inset";
222
+ readonly unconsumedMedia: "retain-native-layout";
223
+ };
224
+ readonly leftFeature: {
225
+ readonly summary: "Requires a primary image in the left feature cell; text occupies the right cell.";
226
+ readonly noMedia: "unsupported";
227
+ readonly ownership: "required-native";
228
+ readonly nativeLayout: "feature-left";
229
+ readonly additionalMediaLayout: "overlay-inset";
230
+ readonly unconsumedMedia: "retain-native-layout";
231
+ };
232
+ readonly rightFeature: {
233
+ readonly summary: "Requires a primary image in the right feature cell; text occupies the left cell.";
234
+ readonly noMedia: "unsupported";
235
+ readonly ownership: "required-native";
236
+ readonly nativeLayout: "feature-right";
237
+ readonly additionalMediaLayout: "overlay-inset";
238
+ readonly unconsumedMedia: "retain-native-layout";
239
+ };
240
+ readonly map: {
241
+ readonly summary: "The map canvas is the primary visual; other media must not reflow its geography.";
242
+ readonly noMedia: "intrinsic-visual";
243
+ readonly ownership: "intrinsic-visual";
244
+ readonly nativeLayout: "map-canvas";
245
+ readonly additionalMediaLayout: "overlay-inset";
246
+ readonly unconsumedMedia: "retain-native-layout";
247
+ };
248
+ readonly fullBleedQuote: {
249
+ readonly summary: "Despite its name this is text-only; supplemental media receives the same dramatic title treatment.";
250
+ readonly noMedia: "template-default";
251
+ readonly ownership: "supplemental";
252
+ readonly unconsumedMedia: "reserved-slot";
253
+ readonly variants: SupplementalMediaVariantMatrix;
254
+ };
255
+ readonly list: {
256
+ readonly summary: "Uses its optional accent image natively; otherwise supplemental media is paired with the list.";
257
+ readonly noMedia: "template-without-optional-media";
258
+ readonly ownership: "optional-native";
259
+ readonly nativeLayout: "accent-strip-or-inset";
260
+ readonly additionalMediaLayout: "overlay-inset";
261
+ readonly unconsumedMedia: "reserve-when-no-native-media";
262
+ readonly variants: SupplementalMediaVariantMatrix;
263
+ };
264
+ readonly photoGrid: {
265
+ readonly summary: "Requires a primary image collection and owns the complete tiled media field.";
266
+ readonly noMedia: "unsupported";
267
+ readonly ownership: "required-native";
268
+ readonly nativeLayout: "photo-grid";
269
+ readonly additionalMediaLayout: "overlay-inset";
270
+ readonly unconsumedMedia: "retain-native-layout";
271
+ };
272
+ readonly definitionCard: {
273
+ readonly summary: "Uses its optional accent image natively; otherwise supplemental media is paired with the definition.";
274
+ readonly noMedia: "template-without-optional-media";
275
+ readonly ownership: "optional-native";
276
+ readonly nativeLayout: "accent-strip-or-inset";
277
+ readonly additionalMediaLayout: "overlay-inset";
278
+ readonly unconsumedMedia: "reserve-when-no-native-media";
279
+ readonly variants: SupplementalMediaVariantMatrix;
280
+ };
281
+ readonly comparisonBar: {
282
+ readonly summary: "Data bars are primary; supplemental media stacks below to preserve horizontal scale.";
283
+ readonly noMedia: "template-default";
284
+ readonly ownership: "supplemental";
285
+ readonly unconsumedMedia: "reserved-slot";
286
+ readonly variants: SupplementalMediaVariantMatrix;
287
+ };
288
+ readonly pullQuote: {
289
+ readonly summary: "Requires and owns a full-bleed background image behind the quote lockup.";
290
+ readonly noMedia: "unsupported";
291
+ readonly ownership: "required-native";
292
+ readonly nativeLayout: "full-bleed-image";
293
+ readonly additionalMediaLayout: "overlay-inset";
294
+ readonly unconsumedMedia: "retain-native-layout";
295
+ };
296
+ readonly videoWithCaption: {
297
+ readonly summary: "Requires one primary video and owns its full-bleed video/caption geometry.";
298
+ readonly noMedia: "unsupported";
299
+ readonly ownership: "required-native";
300
+ readonly nativeLayout: "full-bleed-video";
301
+ readonly additionalMediaLayout: "overlay-inset";
302
+ readonly unconsumedMedia: "retain-native-layout";
303
+ };
304
+ readonly videoPullQuote: {
305
+ readonly summary: "Requires and owns a full-bleed video behind the quote lockup.";
306
+ readonly noMedia: "unsupported";
307
+ readonly ownership: "required-native";
308
+ readonly nativeLayout: "full-bleed-video";
309
+ readonly additionalMediaLayout: "overlay-inset";
310
+ readonly unconsumedMedia: "retain-native-layout";
311
+ };
312
+ readonly dataTable: {
313
+ readonly summary: "The table remains wide; supplemental media stacks below the dense data region.";
314
+ readonly noMedia: "template-default";
315
+ readonly ownership: "supplemental";
316
+ readonly unconsumedMedia: "reserved-slot";
317
+ readonly variants: SupplementalMediaVariantMatrix;
318
+ };
319
+ readonly diagram: {
320
+ readonly summary: "The node-and-edge canvas is intrinsic media and retains its spatial coordinate system.";
321
+ readonly noMedia: "intrinsic-visual";
322
+ readonly ownership: "intrinsic-visual";
323
+ readonly nativeLayout: "spatial-canvas";
324
+ readonly additionalMediaLayout: "overlay-inset";
325
+ readonly unconsumedMedia: "retain-native-layout";
326
+ };
327
+ readonly tree: {
328
+ readonly summary: "The interactive tree canvas is intrinsic media and retains its full layout region.";
329
+ readonly noMedia: "intrinsic-visual";
330
+ readonly ownership: "intrinsic-visual";
331
+ readonly nativeLayout: "spatial-canvas";
332
+ readonly additionalMediaLayout: "overlay-inset";
333
+ readonly unconsumedMedia: "retain-native-layout";
334
+ };
335
+ readonly timeline: {
336
+ readonly summary: "The track canvas is intrinsic media and retains its shared horizontal time scale.";
337
+ readonly noMedia: "intrinsic-visual";
338
+ readonly ownership: "intrinsic-visual";
339
+ readonly nativeLayout: "spatial-canvas";
340
+ readonly additionalMediaLayout: "overlay-inset";
341
+ readonly unconsumedMedia: "retain-native-layout";
342
+ };
343
+ readonly layout: {
344
+ readonly summary: "The authored layer canvas is intrinsic media and must preserve absolute placement.";
345
+ readonly noMedia: "intrinsic-visual";
346
+ readonly ownership: "intrinsic-visual";
347
+ readonly nativeLayout: "freeform-canvas";
348
+ readonly additionalMediaLayout: "overlay-inset";
349
+ readonly unconsumedMedia: "retain-native-layout";
350
+ };
351
+ readonly drawing: {
352
+ readonly summary: "The drawing canvas is intrinsic media and must preserve authored geometry.";
353
+ readonly noMedia: "intrinsic-visual";
354
+ readonly ownership: "intrinsic-visual";
355
+ readonly nativeLayout: "freeform-canvas";
356
+ readonly additionalMediaLayout: "overlay-inset";
357
+ readonly unconsumedMedia: "retain-native-layout";
358
+ };
359
+ };
360
+ /** Safe runtime lookup for built-ins; custom template ids return undefined. */
361
+ declare function getBlockMediaLayoutPolicy(template: string | undefined): BlockMediaLayoutPolicy | undefined;
362
+
110
363
  /** Resolve a historical template id to its canonical registry key. */
111
364
  declare function resolveTemplateName(name: string): string;
112
365
  /** Templates that consume their child headings rather than rendering them. */
@@ -1203,6 +1456,12 @@ interface FirstImage {
1203
1456
  width?: number;
1204
1457
  height?: number;
1205
1458
  }
1459
+ /** First-class video reference discovered in a block body. */
1460
+ interface EmbeddedVideo {
1461
+ src: string;
1462
+ posterSrc?: string;
1463
+ alt: string;
1464
+ }
1206
1465
  /** Plain text of a block's body contents (excluding the heading). */
1207
1466
  declare function extractBodyPlainText(contents?: MarkdownBlockNode[]): string;
1208
1467
  /** Extract list items as plain text. */
@@ -1219,6 +1478,17 @@ declare function extractListItems(contents?: MarkdownBlockNode[]): string[];
1219
1478
  declare function extractImages(contents: MarkdownBlockNode[] | undefined, limit?: number): FirstImage[];
1220
1479
  /** First image in a block's body, or null. */
1221
1480
  declare function extractFirstImage(contents: MarkdownBlockNode[] | undefined): FirstImage | null;
1481
+ /**
1482
+ * Find playable video references in block contents.
1483
+ *
1484
+ * Recorder output is raw HTML (`<video src="...">`), sometimes with a
1485
+ * nested `<source>`. Direct markdown links/images to video files are also
1486
+ * accepted. Hosted watch-page/iframe URLs are deliberately excluded: an
1487
+ * HTML5 VideoLayer cannot play those URLs directly.
1488
+ */
1489
+ declare function extractEmbeddedVideos(contents: MarkdownBlockNode[] | undefined, limit?: number): EmbeddedVideo[];
1490
+ /** First directly playable video in a block body, or null. */
1491
+ declare function extractFirstEmbeddedVideo(contents: MarkdownBlockNode[] | undefined): EmbeddedVideo | null;
1222
1492
  /** Extract table data (headers, rows, alignment) from block contents. */
1223
1493
  declare function extractTableFromContents(contents?: MarkdownBlockNode[]): {
1224
1494
  headers: string[];
@@ -1233,7 +1503,20 @@ interface DeriveTemplateInputsOptions {
1233
1503
  * input can't be derived (preview surfaces). Default false (strict).
1234
1504
  */
1235
1505
  placeholders?: boolean;
1506
+ /**
1507
+ * Keep the source heading visible when a template normally promotes only
1508
+ * body content. Used by automatic templates; explicit annotations retain
1509
+ * their historical input derivation.
1510
+ */
1511
+ preserveSourceHeading?: boolean;
1236
1512
  }
1513
+ /**
1514
+ * Whether an automatically selected template can represent every authored
1515
+ * node in the block. Auto-selection must be conservative: the source remains
1516
+ * round-trippable either way, but a successful render may not hide sibling
1517
+ * content that the chosen template has no slot for.
1518
+ */
1519
+ declare function autoTemplatePreservesContent(templateName: string, contents: MarkdownBlockNode[] | undefined): boolean;
1237
1520
  /**
1238
1521
  * Derive a template's inputs from a block's heading text and body nodes.
1239
1522
  * Returns the input fields to merge onto the block, or `null` in strict
@@ -2485,4 +2768,4 @@ declare function treeFromMarkdownList(list: MarkdownList): Tree;
2485
2768
  /** Find the first top-level markdown list in a block's body, if any. */
2486
2769
  declare function findFirstList(contents: MarkdownBlockNode[] | undefined): MarkdownList | undefined;
2487
2770
 
2488
- 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, type BlockLayerMaterialization, CONTAINER_TEMPLATES, type ClipBox, type ConnectorAnchor, type ConnectorPort, type ConnectorRouting, type ConnectorSnapPoint, type CoverBlockInput, DEFAULT_LAYOUT, DIAGRAM_LABEL_HORIZONTAL_PADDING, DIAGRAM_LABEL_LINE_HEIGHT, DIAGRAM_LABEL_MIN_FONT_SIZE, DIAGRAM_LABEL_VERTICAL_PADDING, 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 ExpandDocBlocksOptions, type ExtractedTableData, type FirstImage, type InputCoercion, type LayerMaterializationDiagnostic, type LayerMaterializationFailureMode, type LayerMaterializationSource, type LayoutLayerDefaults, type LayoutLayersResult, type MarkdownToDocOptions, type MarkdownValidationResult, type MaterializeBlockLayersOptions, type NarrationResolution, PAGE_BASE_CSS, PATH_SHAPE_KINDS, PageSection, type PageSectionContext, type PageSectionDraft, PersistentLayerConfig, type RenderAsciiDiagramOptions, type RenderAsciiTimelineOptions, type RenderTreeOptions, type RepairResult, type ResolvedPageBlock, type RuntimeTemplateRegistry, SHAPE_NAMES, type SectionExtractor, TEMPLATE_INPUT_DESCRIPTORS, TEMPLATE_METADATA, TREE_FENCE_LANGS, TemplateBlock, TemplateContext, type TemplateInputDescriptor, type TemplateMetadata, type TemplateParamFinding, Theme, ThemeColorScheme, type Tree, type TreeDetection, type TreeItem, type TreeNode, type ValidateOptions, ViewportConfig, adjustY, anchorPoint, applyNarrationTiming, applyRenderStyleToLayers, asciiCellToCanvas, asciiDiagramFromBlocks, asciiDiagramFromTemplateData, asciiDiagramToTemplateData, asciiTimelineToTemplateData, buildPageCss, buildPageCssVars, buildRegistry, canvasToAsciiCell, clipEndpoints, clipPoint, coerceTemplateParams, comparisonBar, computeDiagramLayout, computeDrawingLayout, computeLayoutLayers, connectorPath, countBlocks, coverBlock, createAccentLayers, cssFilterForTreatment, dataTable, dateEvent, definitionCard, deriveTemplateInputs, detectAsciiDiagram, detectAsciiTimeline, detectTree, diagramBlock, docToMarkdown, drawingBlock, expandCoverBlock, expandDocBlocks, expandPersistentLayers, extractBlockquoteText, extractBodyPlainText, extractFirstImage, extractImages, extractListItems, extractTableData, extractTableFromContents, factCard, fallbackBlockLayers, findFirstList, findFirstTable, fitDiagramLabel, flattenBlocks, flattenRenderableBlocks, fullBleedQuote, getAccentLayout, getAnimationProgress, getAnimationStyle, getAvailableTemplates, getBlockBodyText, getBlockDepth, 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, leftFeature, lineStyleDasharray, lintTemplateParams, listBlock, mapBlock, markdownToDoc, markerPath, materializeBlockLayers, nearestSnapPoint, normalizeShapeKind, pageStyleDataAttributes, parseAsciiDiagram, parseAsciiTimeline, parseAsciiTimelineWithStats, parseDataFence, parseTree, parseWrappedFlowTimeline, parseYamlSubset, photoGrid, pullQuote, quoteBlock, readCustomTemplatesFromFrontmatter, readCustomThemesFromFrontmatter, renderAsciiDiagram, renderAsciiTimeline, renderTree, repairAsciiDiagram, replaceDataFence, resolveAudioMapping, resolveColorScheme, resolvePageBlock, resolvePersistentLayers, resolveTemplateName, resolveThemeForDoc, rightFeature, scaleAnimationDuration, scoreTextSimilarity, sectionExtractors, sectionHeader, shapePath, shouldUseShadow, snapEndpoints, snapPoints, statHighlight, templateRegistry, themeWantsAmbientMotion, themedEntrance, themedFontSize, themedImageTreatment, themedScrim, themedSurfaceGradient, timelineBlock, titleBlock, treeBlock, treeFromMarkdownList, treeFromTemplateData, treeToTemplateData, twoColumn, validateMarkdownDoc, validateMarkdownSource, videoPullQuote, videoWithCaption, wrapWithPersistentLayers, writeCustomTemplatesToFrontmatter, writeCustomThemesToFrontmatter };
2771
+ 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, type BlockLayerMaterialization, type BlockMediaLayoutPolicy, type BuiltInTemplateName, CONTAINER_TEMPLATES, type ClipBox, type ConnectorAnchor, type ConnectorPort, type ConnectorRouting, type ConnectorSnapPoint, type CoverBlockInput, DEFAULT_LAYOUT, DIAGRAM_LABEL_HORIZONTAL_PADDING, DIAGRAM_LABEL_LINE_HEIGHT, DIAGRAM_LABEL_MIN_FONT_SIZE, DIAGRAM_LABEL_VERTICAL_PADDING, 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, type FirstImage, type InputCoercion, type LayerMaterializationDiagnostic, type LayerMaterializationFailureMode, type LayerMaterializationSource, type LayoutLayerDefaults, type LayoutLayersResult, type MarkdownToDocOptions, type MarkdownValidationResult, type MaterializeBlockLayersOptions, 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 ResolvedPageBlock, type RuntimeTemplateRegistry, SHAPE_NAMES, type SectionExtractor, type SupplementalMediaLayoutVariant, type SupplementalMediaShape, type SupplementalMediaVariantMatrix, TEMPLATE_INPUT_DESCRIPTORS, TEMPLATE_METADATA, TREE_FENCE_LANGS, TemplateBlock, 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, buildPageCss, buildPageCssVars, buildRegistry, canvasToAsciiCell, clipEndpoints, clipPoint, coerceTemplateParams, comparisonBar, computeDiagramLayout, computeDrawingLayout, computeLayoutLayers, connectorPath, countBlocks, coverBlock, createAccentLayers, cssFilterForTreatment, dataTable, dateEvent, definitionCard, deriveTemplateInputs, detectAsciiDiagram, detectAsciiTimeline, detectTree, diagramBlock, docToMarkdown, drawingBlock, expandCoverBlock, expandDocBlocks, expandPersistentLayers, extractBlockquoteText, extractBodyPlainText, extractEmbeddedVideos, extractFirstEmbeddedVideo, extractFirstImage, extractImages, extractListItems, extractTableData, extractTableFromContents, factCard, fallbackBlockLayers, findFirstList, findFirstTable, fitDiagramLabel, flattenBlocks, flattenRenderableBlocks, fullBleedQuote, getAccentLayout, getAnimationProgress, getAnimationStyle, getAvailableTemplates, getBlockBodyText, getBlockDepth, getBlockMediaLayoutPolicy, 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, leftFeature, lineStyleDasharray, lintTemplateParams, listBlock, mapBlock, markdownToDoc, markerPath, materializeBlockLayers, nearestSnapPoint, normalizeShapeKind, pageStyleDataAttributes, parseAsciiDiagram, parseAsciiTimeline, parseAsciiTimelineWithStats, parseDataFence, parseTree, parseWrappedFlowTimeline, parseYamlSubset, photoGrid, pullQuote, quoteBlock, readCustomTemplatesFromFrontmatter, readCustomThemesFromFrontmatter, renderAsciiDiagram, renderAsciiTimeline, renderTree, repairAsciiDiagram, replaceDataFence, resolveAudioMapping, resolveColorScheme, resolvePageBlock, resolvePersistentLayers, resolveTemplateName, resolveThemeForDoc, rightFeature, scaleAnimationDuration, scoreTextSimilarity, sectionExtractors, sectionHeader, shapePath, shouldUseShadow, snapEndpoints, snapPoints, statHighlight, templateRegistry, themeWantsAmbientMotion, themedEntrance, themedFontSize, themedImageTreatment, themedScrim, themedSurfaceGradient, timelineBlock, titleBlock, treeBlock, treeFromMarkdownList, treeFromTemplateData, treeToTemplateData, twoColumn, validateMarkdownDoc, validateMarkdownSource, videoPullQuote, videoWithCaption, wrapWithPersistentLayers, writeCustomTemplatesToFrontmatter, writeCustomThemesToFrontmatter };