@bendyline/squisq 2.13.1 → 2.13.2

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.
@@ -2302,6 +2302,14 @@ interface StartBlockConfig {
2302
2302
  heroCredit?: string;
2303
2303
  /** License identifier for the hero image */
2304
2304
  heroLicense?: string;
2305
+ /**
2306
+ * How a hero cover keeps its title legible. `'scrim'` (default): a gradient tinted from
2307
+ * the theme background darkens the lower frame, with the title low and wide.
2308
+ * `'frosted'`: the photo stays clear; the title sits on a frosted-glass plate near the
2309
+ * bottom that grows upward for longer titles, kept within the frame's centre square
2310
+ * (so a square crop, such as a social link card, shows all of it).
2311
+ */
2312
+ coverStyle?: 'scrim' | 'frosted';
2305
2313
  }
2306
2314
  /**
2307
2315
  * A structural problem detected while converting or validating a document.
@@ -2833,6 +2841,18 @@ interface ShapeLayer extends BaseLayer {
2833
2841
  borderStyle?: BorderStyle;
2834
2842
  /** Corner radius for rect */
2835
2843
  borderRadius?: number;
2844
+ /**
2845
+ * Frosted glass: blur what lies behind a rect by this radius in px (CSS
2846
+ * `backdrop-filter`), under its fill. Use a translucent fill for the tint.
2847
+ */
2848
+ backdropBlur?: number;
2849
+ /**
2850
+ * Frosted glass: scale the contrast of what lies behind a rect toward mid-grey (CSS
2851
+ * `backdrop-filter: contrast()`), with `backdropBlur`. Below 1 it pulls bright snow
2852
+ * or sky down (and deep shadow up) while mid-tones barely move, so light text stays
2853
+ * legible on glass over any photo without darkening the glass overall.
2854
+ */
2855
+ backdropContrast?: number;
2836
2856
  };
2837
2857
  }
2838
2858
  /**
@@ -1,4 +1,4 @@
1
- import { a2 as ImageLayer, bw as TextLayer, bh as ShapeLayer, aX as PathLayer } from './Doc-C7iCmmmF.js';
1
+ import { a2 as ImageLayer, bw as TextLayer, bh as ShapeLayer, aX as PathLayer } from './Doc-CYTLtFEu.js';
2
2
 
3
3
  /**
4
4
  * ImageEditDoc — JSON document describing a layered, editable image.
@@ -8,7 +8,7 @@ import {
8
8
  expectedSyllablesAt,
9
9
  flattenRenderableBlocks,
10
10
  wordPosAtExpectedSyllables
11
- } from "./chunk-ITLJQG7Z.js";
11
+ } from "./chunk-YY3OQ3MI.js";
12
12
 
13
13
  // src/narration/types.ts
14
14
  var DEFAULT_FEATURE_CONFIG = Object.freeze({
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-FTN6SGW5.js";
4
4
  import {
5
5
  applySavedPresentation
6
- } from "./chunk-DCO5GYVW.js";
6
+ } from "./chunk-FUQYQWQR.js";
7
7
  import {
8
8
  SHAPE_NAMES,
9
9
  buildChartData,
@@ -32,7 +32,7 @@ import {
32
32
  templateRegistry,
33
33
  writeCustomTemplatesToFrontmatter,
34
34
  writeCustomThemesToFrontmatter
35
- } from "./chunk-ITLJQG7Z.js";
35
+ } from "./chunk-YY3OQ3MI.js";
36
36
  import {
37
37
  ASCII_TREE_VOCAB,
38
38
  ASCII_VOCAB,
@@ -4,7 +4,7 @@ import {
4
4
  flattenRenderableBlocks,
5
5
  getPinnedBlockMeta,
6
6
  markdownToDoc
7
- } from "./chunk-ITLJQG7Z.js";
7
+ } from "./chunk-YY3OQ3MI.js";
8
8
  import {
9
9
  deriveTemplateInputs,
10
10
  extractImages,
@@ -306,6 +306,9 @@ function validateStartBlock(value, issues) {
306
306
  optionalString(value, "heroSrc", "startBlock.heroSrc", issues);
307
307
  optionalString(value, "heroAlt", "startBlock.heroAlt", issues);
308
308
  optionalString(value, "subtitle", "startBlock.subtitle", issues);
309
+ if (value.coverStyle !== void 0 && value.coverStyle !== "scrim" && value.coverStyle !== "frosted") {
310
+ add(issues, "startBlock.coverStyle", 'must be "scrim" or "frosted"', value.coverStyle);
311
+ }
309
312
  }
310
313
  function validateCaptions(value, issues) {
311
314
  if (!isRecord(value)) {
@@ -1791,12 +1791,12 @@ function statHighlight(input, context) {
1791
1791
  const statTop = groupTop;
1792
1792
  const descTop = statTop + statBoxH + gap;
1793
1793
  const detailTop = descTop + descBoxH + detailGap;
1794
- const pct = (px) => `${Number((px / frameH * 100).toFixed(3))}%`;
1794
+ const pct2 = (px) => `${Number((px / frameH * 100).toFixed(3))}%`;
1795
1795
  const box = (top, height) => ({
1796
1796
  x: accentLayout.textCenterX,
1797
- y: pct(top + height / 2),
1797
+ y: pct2(top + height / 2),
1798
1798
  width: accentLayout.textWidth,
1799
- height: pct(height),
1799
+ height: pct2(height),
1800
1800
  anchor: "center"
1801
1801
  });
1802
1802
  layers.push({
@@ -1880,7 +1880,7 @@ function quoteBlock(input, context) {
1880
1880
  const accentImage = accentForViewport(input.accentImage, viewport);
1881
1881
  const H = viewport.height;
1882
1882
  const W = viewport.width;
1883
- const pct = (px) => `${Number((px / H * 100).toFixed(3))}%`;
1883
+ const pct2 = (px) => `${Number((px / H * 100).toFixed(3))}%`;
1884
1884
  const accentLayout = accentImage ? getAccentLayout(accentImage.position) : DEFAULT_LAYOUT;
1885
1885
  const yShiftPx = accentLayout.adjustY ? accentLayout.textYAdjust / 100 * H : 0;
1886
1886
  const colWidthPct = parseFloat(accentLayout.textWidth);
@@ -1938,9 +1938,9 @@ function quoteBlock(input, context) {
1938
1938
  },
1939
1939
  position: {
1940
1940
  x: colLeft,
1941
- y: pct(bandTopPx),
1941
+ y: pct2(bandTopPx),
1942
1942
  width: accentLayout.textWidth,
1943
- height: pct(titleFit.heightPx),
1943
+ height: pct2(titleFit.heightPx),
1944
1944
  anchor: "top-left"
1945
1945
  },
1946
1946
  animation: { type: "fadeIn", duration: 0.8 }
@@ -1994,7 +1994,7 @@ function quoteBlock(input, context) {
1994
1994
  },
1995
1995
  position: {
1996
1996
  x: accentLayout.textCenterX,
1997
- y: pct(quoteTopPx - decoMarginPx - decoFontSize * 0.6),
1997
+ y: pct2(quoteTopPx - decoMarginPx - decoFontSize * 0.6),
1998
1998
  anchor: "center"
1999
1999
  }
2000
2000
  });
@@ -2020,9 +2020,9 @@ function quoteBlock(input, context) {
2020
2020
  },
2021
2021
  position: {
2022
2022
  x: colLeft,
2023
- y: pct(quoteTopPx),
2023
+ y: pct2(quoteTopPx),
2024
2024
  width: accentLayout.textWidth,
2025
- height: pct(quoteFit.heightPx),
2025
+ height: pct2(quoteFit.heightPx),
2026
2026
  anchor: "top-left"
2027
2027
  },
2028
2028
  animation: motionEntrance(context, { type: "fadeIn", duration: 2 })
@@ -2047,9 +2047,9 @@ function quoteBlock(input, context) {
2047
2047
  },
2048
2048
  position: {
2049
2049
  x: colLeft,
2050
- y: pct(quoteBottomPx + attrGapPx),
2050
+ y: pct2(quoteBottomPx + attrGapPx),
2051
2051
  width: accentLayout.textWidth,
2052
- height: pct(attrFit.heightPx),
2052
+ height: pct2(attrFit.heightPx),
2053
2053
  anchor: "top-left"
2054
2054
  },
2055
2055
  animation: { type: "fadeIn", duration: 1, delay: 1.5 }
@@ -2133,12 +2133,12 @@ function factCard(input, context) {
2133
2133
  const factTop = groupTop;
2134
2134
  const explainTop = factTop + factBoxH + gap;
2135
2135
  const sourceTop = explainTop + explainBoxH + sourceGap;
2136
- const pct = (px) => `${Number((px / frameH * 100).toFixed(3))}%`;
2136
+ const pct2 = (px) => `${Number((px / frameH * 100).toFixed(3))}%`;
2137
2137
  const box = (top, height) => ({
2138
2138
  x: accentLayout.textCenterX,
2139
- y: pct(top + height / 2),
2139
+ y: pct2(top + height / 2),
2140
2140
  width: accentLayout.textWidth,
2141
- height: pct(height),
2141
+ height: pct2(height),
2142
2142
  anchor: "center"
2143
2143
  });
2144
2144
  layers.push({
@@ -3090,7 +3090,7 @@ function fullBleedQuote(input, context) {
3090
3090
  const colors = resolveColorScheme(context, colorScheme);
3091
3091
  const H = viewport.height;
3092
3092
  const W = viewport.width;
3093
- const pct = (px) => `${Number((px / H * 100).toFixed(3))}%`;
3093
+ const pct2 = (px) => `${Number((px / H * 100).toFixed(3))}%`;
3094
3094
  const impactFontSize = themedFontSize(120, context, true);
3095
3095
  const baseFontSize = Math.round(impactFontSize * lengthFactor(text));
3096
3096
  const bandHeightPx = (BAND_BOTTOM3 - BAND_TOP3) * H;
@@ -3141,9 +3141,9 @@ function fullBleedQuote(input, context) {
3141
3141
  },
3142
3142
  position: {
3143
3143
  x: `${COLUMN_LEFT * 100}%`,
3144
- y: pct(topPx),
3144
+ y: pct2(topPx),
3145
3145
  width: `${COLUMN_WIDTH * 100}%`,
3146
- height: pct(fit.heightPx),
3146
+ height: pct2(fit.heightPx),
3147
3147
  anchor: "top-left"
3148
3148
  },
3149
3149
  animation: motionEntrance(
@@ -3605,12 +3605,12 @@ function definitionCard(input, context) {
3605
3605
  const ruleTop = termTop + termH + ruleGap;
3606
3606
  const defTop = ruleTop + RULE_HEIGHT_PX + defGap;
3607
3607
  const originTop = defTop + defH + originGap;
3608
- const pct = (px) => `${(px / viewport.height * 100).toFixed(3)}%`;
3608
+ const pct2 = (px) => `${(px / viewport.height * 100).toFixed(3)}%`;
3609
3609
  const box = (topPx, heightPx) => {
3610
3610
  const height = Math.round(heightPx);
3611
3611
  return {
3612
3612
  x: accentLayout.textCenterX,
3613
- y: pct(topPx + height / 2),
3613
+ y: pct2(topPx + height / 2),
3614
3614
  width: accentLayout.textWidth,
3615
3615
  height,
3616
3616
  anchor: "center"
@@ -3657,7 +3657,7 @@ function definitionCard(input, context) {
3657
3657
  },
3658
3658
  position: {
3659
3659
  x: columnLeft,
3660
- y: pct(ruleTop),
3660
+ y: pct2(ruleTop),
3661
3661
  width: "30%",
3662
3662
  height: `${RULE_HEIGHT_PX}px`,
3663
3663
  anchor: "top-left"
@@ -3883,7 +3883,7 @@ var ATTR_LINE_HEIGHT = 1.4;
3883
3883
  function pullQuoteLockup(options, context) {
3884
3884
  const { text, attribution, overMedia } = options;
3885
3885
  const { theme, viewport } = context;
3886
- const pct = (px) => px / viewport.height * 100;
3886
+ const pct2 = (px) => px / viewport.height * 100;
3887
3887
  const quoteBaseSize = themedFontSize(52, context, true);
3888
3888
  const quoteMinSize = Math.max(18, themedFontSize(24, context, true));
3889
3889
  const attrFontSize = themedFontSize(26, context, false);
@@ -3910,12 +3910,12 @@ function pullQuoteLockup(options, context) {
3910
3910
  const gapPx = attribution ? Math.max(16, fit.fontSize * 0.6) : 0;
3911
3911
  const stackHeightPx = fit.heightPx + gapPx + attrHeightPx;
3912
3912
  const stackTopPx = Math.max(frameTopPx, viewport.height / 2 - stackHeightPx / 2);
3913
- const quoteTopPct = pct(stackTopPx);
3914
- const attrTopPct = pct(stackTopPx + fit.heightPx + gapPx);
3913
+ const quoteTopPct = pct2(stackTopPx);
3914
+ const attrTopPct = pct2(stackTopPx + fit.heightPx + gapPx);
3915
3915
  const decoHeadroomPx = stackTopPx - 0.03 * viewport.height;
3916
3916
  const decoFontSize = Math.min(decoBaseSize, Math.floor(decoHeadroomPx / 0.6));
3917
3917
  const showDeco = decoFontSize >= decoMinSize;
3918
- const decoYPct = quoteTopPct - pct(decoFontSize * 0.55);
3918
+ const decoYPct = quoteTopPct - pct2(decoFontSize * 0.55);
3919
3919
  const shadow = overMedia ? true : shouldUseShadow(context);
3920
3920
  const quoteColor = overMedia ? "#ffffff" : theme.colors.text;
3921
3921
  const attrColor = overMedia ? "rgba(255, 255, 255, 0.85)" : theme.colors.textMuted;
@@ -6884,6 +6884,35 @@ var BOLD_CHAR_WIDTH_EM = 0.66;
6884
6884
  function estimateTextWidth(text, fontSize, charWidthEm = AVERAGE_CHAR_WIDTH_EM) {
6885
6885
  return text.length * fontSize * charWidthEm;
6886
6886
  }
6887
+ var DISPLAY_CHAR_EM = {
6888
+ space: 0.27,
6889
+ narrowLower: 0.36,
6890
+ wideLower: 0.86,
6891
+ lower: 0.57,
6892
+ narrowUpper: 0.4,
6893
+ wideUpper: 0.95,
6894
+ upper: 0.7,
6895
+ digit: 0.57,
6896
+ punct: 0.34,
6897
+ other: 0.62
6898
+ };
6899
+ function displayCharEm(ch) {
6900
+ if (ch === " ") return DISPLAY_CHAR_EM.space;
6901
+ if ("fijlrt".includes(ch)) return DISPLAY_CHAR_EM.narrowLower;
6902
+ if (ch === "m" || ch === "w") return DISPLAY_CHAR_EM.wideLower;
6903
+ if (ch >= "a" && ch <= "z") return DISPLAY_CHAR_EM.lower;
6904
+ if (ch === "I" || ch === "J") return DISPLAY_CHAR_EM.narrowUpper;
6905
+ if (ch === "M" || ch === "W") return DISPLAY_CHAR_EM.wideUpper;
6906
+ if (ch >= "A" && ch <= "Z") return DISPLAY_CHAR_EM.upper;
6907
+ if (ch >= "0" && ch <= "9") return DISPLAY_CHAR_EM.digit;
6908
+ if (".,:;-/'\u2019!?()".includes(ch)) return DISPLAY_CHAR_EM.punct;
6909
+ return DISPLAY_CHAR_EM.other;
6910
+ }
6911
+ function estimateDisplayTextWidth(text, fontSize) {
6912
+ let em = 0;
6913
+ for (const ch of text.normalize("NFD").replace(/\p{M}/gu, "")) em += displayCharEm(ch);
6914
+ return em * fontSize;
6915
+ }
6887
6916
 
6888
6917
  // src/doc/templates/timelineBlock.ts
6889
6918
  var clamp01 = (value) => Math.max(0, Math.min(1, value));
@@ -9921,13 +9950,227 @@ function coverScrimGradient(background) {
9921
9950
  const stops = COVER_SCRIM_STOPS.map((s) => `${withAlpha(background, s.alpha)} ${s.pos}%`);
9922
9951
  return `linear-gradient(0deg, ${stops.join(", ")})`;
9923
9952
  }
9953
+ var FROSTED_LINE_HEIGHT = 1.12;
9954
+ var FROSTED_MAX_LINES = 3;
9955
+ var FROSTED_SQUARE_SHARE = 0.9;
9956
+ var FROSTED_PAD_X_EM = 0.45;
9957
+ var FROSTED_PAD_Y_EM = 0.3;
9958
+ var FROSTED_RADIUS_EM = 0.3;
9959
+ var FROSTED_BLUR_SHARE = 0.0167;
9960
+ var FROSTED_BOTTOM_MARGIN_PCT = { wide: 7, tall: 17 };
9961
+ var FROSTED_TINT_UNDER_LIGHT_TEXT = "rgba(12, 12, 14, 0.26)";
9962
+ var FROSTED_TINT_UNDER_DARK_TEXT = "rgba(250, 250, 250, 0.5)";
9963
+ var FROSTED_BACKDROP_CONTRAST = 0.65;
9964
+ var COVER_SUBTITLE_BASE_PX = 40;
9965
+ var INK_EM = { xHeight: 0.45, ascent: 0.71, accentedCapital: 0.8, descent: 0.165 };
9966
+ function opticalCentreShiftEm(lines) {
9967
+ const first = (lines[0] ?? "").normalize("NFD");
9968
+ const last = lines[lines.length - 1] ?? "";
9969
+ const top = /[A-Z]\p{M}/u.test(first) ? INK_EM.accentedCapital : /[A-Zbdfhklt0-9]|[a-z]\p{M}/u.test(first) ? INK_EM.ascent : INK_EM.xHeight;
9970
+ const bottom = /[gjpqyQ,;]/.test(last) ? INK_EM.descent : 0;
9971
+ return Math.round(((top - bottom) / 2 - INK_EM.xHeight / 2) * 1e3) / 1e3;
9972
+ }
9973
+ function wrapDisplayLine(line, fontSize, maxWidth) {
9974
+ const lines = [];
9975
+ let current = "";
9976
+ for (const word of line.trim().split(/\s+/).filter(Boolean)) {
9977
+ const candidate = current ? `${current} ${word}` : word;
9978
+ if (!current || estimateDisplayTextWidth(candidate, fontSize) <= maxWidth) {
9979
+ current = candidate;
9980
+ } else {
9981
+ lines.push(current);
9982
+ current = word;
9983
+ }
9984
+ }
9985
+ if (current) lines.push(current);
9986
+ return lines.length > 0 ? lines : [""];
9987
+ }
9988
+ function balancedDisplayLines(line, fontSize, maxWidth) {
9989
+ const greedy = wrapDisplayLine(line, fontSize, maxWidth);
9990
+ if (greedy.length < 2) return greedy;
9991
+ let lo = Math.max(
9992
+ ...line.split(/\s+/).filter(Boolean).map((word) => estimateDisplayTextWidth(word, fontSize))
9993
+ );
9994
+ let hi = maxWidth;
9995
+ if (lo >= hi) return greedy;
9996
+ while (hi - lo > 0.5) {
9997
+ const mid = (lo + hi) / 2;
9998
+ if (wrapDisplayLine(line, fontSize, mid).length <= greedy.length) hi = mid;
9999
+ else lo = mid;
10000
+ }
10001
+ return wrapDisplayLine(line, fontSize, hi);
10002
+ }
10003
+ function frostedCoverLayout(title, subtitle, context) {
10004
+ const { width: frameW, height: frameH } = context.viewport;
10005
+ const shortSide = Math.min(frameW, frameH);
10006
+ const maxPlateWidth = FROSTED_SQUARE_SHARE * shortSide;
10007
+ const minSize = themedFontSize(COVER_TITLE_MIN_BASE_PX, context, true);
10008
+ const wrapAt = (size) => {
10009
+ const column2 = maxPlateWidth - 2 * FROSTED_PAD_X_EM * size;
10010
+ const lines2 = title.split("\n").flatMap((line) => balancedDisplayLines(line, size, column2));
10011
+ const width = Math.max(...lines2.map((line) => estimateDisplayTextWidth(line, size)));
10012
+ return { lines: lines2, width, column: column2 };
10013
+ };
10014
+ let fontSize = themedFontSize(fitCoverTitleSize(title), context, true);
10015
+ let wrapped = wrapAt(fontSize);
10016
+ while ((wrapped.lines.length > FROSTED_MAX_LINES || wrapped.width > wrapped.column) && fontSize > minSize) {
10017
+ fontSize = Math.max(minSize, Math.floor(fontSize * 0.95));
10018
+ wrapped = wrapAt(fontSize);
10019
+ }
10020
+ const { lines, column } = wrapped;
10021
+ const textWidth = Math.min(wrapped.width, column);
10022
+ const textHeight = lines.length * fontSize * FROSTED_LINE_HEIGHT;
10023
+ const padX = FROSTED_PAD_X_EM * fontSize;
10024
+ const padY = FROSTED_PAD_Y_EM * fontSize;
10025
+ let sub;
10026
+ if (subtitle?.trim()) {
10027
+ const subSize = themedFontSize(COVER_SUBTITLE_BASE_PX, context, false);
10028
+ const subLines = subtitle.split("\n").flatMap((line) => wrapDisplayLine(line, subSize, column));
10029
+ sub = {
10030
+ lines: subLines,
10031
+ width: Math.min(
10032
+ column,
10033
+ Math.max(...subLines.map((l) => estimateDisplayTextWidth(l, subSize)))
10034
+ ),
10035
+ height: subLines.length * subSize * 1.3,
10036
+ fontSize: subSize,
10037
+ gap: 0.3 * fontSize
10038
+ };
10039
+ }
10040
+ const plateWidth = Math.max(textWidth, sub?.width ?? 0) + 2 * padX;
10041
+ const plateHeight = textHeight + (sub ? sub.gap + sub.height : 0) + 2 * padY;
10042
+ const marginPct = frameH > frameW ? FROSTED_BOTTOM_MARGIN_PCT.tall : FROSTED_BOTTOM_MARGIN_PCT.wide;
10043
+ const plateBottom = frameH * (1 - marginPct / 100);
10044
+ const plateY = plateBottom - plateHeight;
10045
+ const cx = frameW / 2;
10046
+ const longestChars = Math.max(...lines.map((line) => line.length));
10047
+ const titleBoxWidth = Math.max(textWidth, longestChars * fontSize * 0.5 + 1);
10048
+ return {
10049
+ fontSize,
10050
+ lines,
10051
+ plate: {
10052
+ x: cx - plateWidth / 2,
10053
+ y: plateY,
10054
+ width: plateWidth,
10055
+ height: plateHeight,
10056
+ radius: FROSTED_RADIUS_EM * fontSize
10057
+ },
10058
+ // The box spans the plate's padding too: shrink-to-fit measures the font's whole
10059
+ // ascent and descent (about 1.3 em), which overflows a box of 1.12 em lines and
10060
+ // would scale every title down by up to 14%.
10061
+ title: {
10062
+ cx,
10063
+ cy: plateY + padY + textHeight / 2,
10064
+ width: titleBoxWidth,
10065
+ height: textHeight + 2 * padY
10066
+ },
10067
+ ...sub ? {
10068
+ subtitle: {
10069
+ cx,
10070
+ cy: plateY + padY + textHeight + sub.gap + sub.height / 2,
10071
+ width: Math.max(
10072
+ sub.width,
10073
+ Math.max(...sub.lines.map((l) => l.length)) * sub.fontSize * 0.5 + 1
10074
+ ),
10075
+ height: sub.height,
10076
+ fontSize: sub.fontSize,
10077
+ lines: sub.lines
10078
+ }
10079
+ } : {},
10080
+ baselineShift: opticalCentreShiftEm(lines),
10081
+ blur: Math.round(FROSTED_BLUR_SHARE * shortSide)
10082
+ };
10083
+ }
10084
+ function pct(value, total) {
10085
+ return `${Math.round(value / total * 1e4) / 100}%`;
10086
+ }
10087
+ function frostedCoverLayers(input, context) {
10088
+ const { theme, viewport } = context;
10089
+ const layout = frostedCoverLayout(input.title, input.subtitle, context);
10090
+ const lightText = relativeLuminance(theme.colors.text) > 0.5;
10091
+ const { plate } = layout;
10092
+ const layers = [
10093
+ {
10094
+ type: "shape",
10095
+ id: "cover-plate",
10096
+ content: {
10097
+ shape: "rect",
10098
+ fill: lightText ? FROSTED_TINT_UNDER_LIGHT_TEXT : FROSTED_TINT_UNDER_DARK_TEXT,
10099
+ borderRadius: Math.round(plate.radius),
10100
+ backdropBlur: layout.blur,
10101
+ ...lightText ? { backdropContrast: FROSTED_BACKDROP_CONTRAST } : {}
10102
+ },
10103
+ position: {
10104
+ x: pct(plate.x, viewport.width),
10105
+ y: pct(plate.y, viewport.height),
10106
+ width: pct(plate.width, viewport.width),
10107
+ height: pct(plate.height, viewport.height)
10108
+ }
10109
+ },
10110
+ {
10111
+ type: "text",
10112
+ id: "cover-title",
10113
+ content: {
10114
+ text: layout.lines.join("\n"),
10115
+ style: {
10116
+ fontSize: layout.fontSize,
10117
+ fontFamily: getThemeFont(context, "title"),
10118
+ fontWeight: "bold",
10119
+ color: theme.colors.text,
10120
+ textAlign: "center",
10121
+ verticalAlign: "middle",
10122
+ lineHeight: FROSTED_LINE_HEIGHT,
10123
+ baselineShift: layout.baselineShift,
10124
+ shadow: lightText,
10125
+ shrinkToFit: true
10126
+ }
10127
+ },
10128
+ position: {
10129
+ x: "50%",
10130
+ y: pct(layout.title.cy, viewport.height),
10131
+ anchor: "center",
10132
+ width: pct(layout.title.width, viewport.width),
10133
+ height: pct(layout.title.height, viewport.height)
10134
+ },
10135
+ animation: getMotionProfile(context).coverWordReveal ? { type: "wordReveal", duration: 0.5, delay: 0.1, stagger: 0.12 } : { type: "fadeIn", duration: 0.8 }
10136
+ }
10137
+ ];
10138
+ if (layout.subtitle) {
10139
+ layers.push({
10140
+ type: "text",
10141
+ id: "cover-subtitle",
10142
+ content: {
10143
+ text: layout.subtitle.lines.join("\n"),
10144
+ style: {
10145
+ fontSize: layout.subtitle.fontSize,
10146
+ fontFamily: getThemeFont(context, "body"),
10147
+ fontWeight: "normal",
10148
+ color: lightText ? withAlpha(theme.colors.text, 0.86) : theme.colors.textMuted,
10149
+ textAlign: "center",
10150
+ verticalAlign: "middle",
10151
+ lineHeight: 1.3,
10152
+ shrinkToFit: true
10153
+ }
10154
+ },
10155
+ position: {
10156
+ x: "50%",
10157
+ y: pct(layout.subtitle.cy, viewport.height),
10158
+ anchor: "center",
10159
+ width: pct(layout.subtitle.width, viewport.width),
10160
+ height: pct(layout.subtitle.height, viewport.height)
10161
+ },
10162
+ animation: motionEntrance(context, { type: "fadeIn", duration: 0.8, delay: 0.2 })
10163
+ });
10164
+ }
10165
+ return layers;
10166
+ }
9924
10167
  function coverBlock(input, context) {
9925
10168
  const treatment = themedImageTreatment(context, input.imageTreatment);
9926
10169
  const { heroSrc, heroAlt, title, subtitle, ambientMotion, heroCredit, heroLicense } = input;
9927
10170
  const { theme, layout, viewport } = context;
9928
10171
  const standardLightCover = !heroSrc && isStandardLightCover(context);
9929
10172
  const titleFontSize = themedFontSize(fitCoverTitleSize(title), context, true);
9930
- const subtitleFontSize = themedFontSize(40, context, false);
10173
+ const subtitleFontSize = themedFontSize(COVER_SUBTITLE_BASE_PX, context, false);
9931
10174
  const titleYPct = subtitle ? parseFloat(layout.primaryY) : 50;
9932
10175
  const maxWidthPx = parseFloat(layout.maxTextWidth) / 100 * viewport.width;
9933
10176
  const titleH = Math.max(
@@ -9951,31 +10194,30 @@ function coverBlock(input, context) {
9951
10194
  const layers = [];
9952
10195
  if (heroSrc) {
9953
10196
  const imageAnimation = mapAmbientMotion(ambientMotion);
9954
- layers.push(
9955
- {
9956
- type: "image",
9957
- id: "cover-hero",
9958
- content: {
9959
- src: heroSrc,
9960
- alt: heroAlt || title,
9961
- fit: "cover",
9962
- credit: heroCredit,
9963
- license: heroLicense,
9964
- ...treatment ? { treatment } : {}
9965
- },
9966
- position: { x: 0, y: 0, width: "100%", height: "100%" },
9967
- animation: imageAnimation
10197
+ layers.push({
10198
+ type: "image",
10199
+ id: "cover-hero",
10200
+ content: {
10201
+ src: heroSrc,
10202
+ alt: heroAlt || title,
10203
+ fit: "cover",
10204
+ credit: heroCredit,
10205
+ license: heroLicense,
10206
+ ...treatment ? { treatment } : {}
9968
10207
  },
9969
- {
9970
- type: "shape",
9971
- id: "cover-gradient",
9972
- content: {
9973
- shape: "rect",
9974
- fill: coverScrimGradient(theme.colors.background)
9975
- },
9976
- position: { x: 0, y: 0, width: "100%", height: "100%" }
9977
- }
9978
- );
10208
+ position: { x: 0, y: 0, width: "100%", height: "100%" },
10209
+ animation: imageAnimation
10210
+ });
10211
+ if (input.coverStyle === "frosted") return [...layers, ...frostedCoverLayers(input, context)];
10212
+ layers.push({
10213
+ type: "shape",
10214
+ id: "cover-gradient",
10215
+ content: {
10216
+ shape: "rect",
10217
+ fill: coverScrimGradient(theme.colors.background)
10218
+ },
10219
+ position: { x: 0, y: 0, width: "100%", height: "100%" }
10220
+ });
9979
10221
  } else {
9980
10222
  if (standardLightCover) {
9981
10223
  layers.push(
@@ -10084,7 +10326,8 @@ function startBlockToCoverInput(config) {
10084
10326
  subtitle: config.subtitle,
10085
10327
  ambientMotion: config.ambientMotion,
10086
10328
  heroCredit: config.heroCredit,
10087
- heroLicense: config.heroLicense
10329
+ heroLicense: config.heroLicense,
10330
+ ...config.coverStyle ? { coverStyle: config.coverStyle } : {}
10088
10331
  };
10089
10332
  }
10090
10333
  function expandCoverBlock(config, context, template = "cover") {
@@ -1,12 +1,12 @@
1
- import { a6 as Layer, k as Block, Q as Doc, br as TemplateBlock, bs as TemplateContext, y as CustomTemplateDefinition, bu as TemplateRegistry, bA as Theme, c4 as ViewportConfig, a_ as PersistentLayerConfig, at as MotionSpec, R as DocBlock, c5 as ViewportOrientation, aZ as PersistentLayer, bN as TitleBlockInput, bf as SectionHeaderInput, j as BigTextInput, u as ContentBlockInput, bl as StatHighlightInput, b9 as QuoteBlockInput, Y as FactCardInput, bV as TwoColumnInput, J as DateEventInput, a4 as ImageWithCaptionInput, a9 as LeftFeatureInput, bc as RightFeatureInput, ae as MapBlockInput, bk as StartBlockConfig, $ as FullBleedQuoteInput, ac as ListBlockInput, b2 as PhotoGridInput, L as DefinitionCardInput, t as ComparisonBarInput, b8 as PullQuoteInput, c3 as VideoWithCaptionInput, c2 as VideoPullQuoteInput, I as DataTableInput, M as DiagramBlockInput, bQ as TreeBlockInput, bJ as TimelineBlockInput, U as DrawingBlockInput, ai as MarkerStyle, A as AccentImage, a3 as ImageTreatment, a as AccentPosition, c as Animation, d as AnimationType, au as MotionState, ar as MotionProfile, bC as ThemeColorScheme, w as CountUpSpec, bE as ThemeRegistry, aR as PageEmphasis, bD as ThemePageStyle, S as DocDiagnostic, P as DiagramTemplateNode, O as DiagramTemplateEdge, bM as TimelineTemplateTrack, bL as TimelineTemplateLink } from '../Doc-C7iCmmmF.js';
2
- export { V as FRONTMATTER_CUSTOM_TEMPLATES_KEY, W as FRONTMATTER_CUSTOM_THEMES_KEY, a8 as LayoutHints, bb as RenderStyle, bB as ThemeColorPalette, bH as ThemeStyle, bI as ThemeTypography, bW as VIEWPORT_PRESETS, c6 as ViewportPreset, cb as createTemplateContext, ci as getLayoutHints, cl as getTwoColumnPositions, cm as getViewport, cn as getViewportOrientation, cr as isTemplateBlock, cx as scaledFontSize } from '../Doc-C7iCmmmF.js';
1
+ import { a6 as Layer, k as Block, Q as Doc, br as TemplateBlock, bs as TemplateContext, y as CustomTemplateDefinition, bu as TemplateRegistry, bA as Theme, c4 as ViewportConfig, a_ as PersistentLayerConfig, at as MotionSpec, R as DocBlock, c5 as ViewportOrientation, aZ as PersistentLayer, bN as TitleBlockInput, bf as SectionHeaderInput, j as BigTextInput, u as ContentBlockInput, bl as StatHighlightInput, b9 as QuoteBlockInput, Y as FactCardInput, bV as TwoColumnInput, J as DateEventInput, a4 as ImageWithCaptionInput, a9 as LeftFeatureInput, bc as RightFeatureInput, ae as MapBlockInput, bk as StartBlockConfig, $ as FullBleedQuoteInput, ac as ListBlockInput, b2 as PhotoGridInput, L as DefinitionCardInput, t as ComparisonBarInput, b8 as PullQuoteInput, c3 as VideoWithCaptionInput, c2 as VideoPullQuoteInput, I as DataTableInput, M as DiagramBlockInput, bQ as TreeBlockInput, bJ as TimelineBlockInput, U as DrawingBlockInput, ai as MarkerStyle, A as AccentImage, a3 as ImageTreatment, a as AccentPosition, c as Animation, d as AnimationType, au as MotionState, ar as MotionProfile, bC as ThemeColorScheme, w as CountUpSpec, bE as ThemeRegistry, aR as PageEmphasis, bD as ThemePageStyle, S as DocDiagnostic, P as DiagramTemplateNode, O as DiagramTemplateEdge, bM as TimelineTemplateTrack, bL as TimelineTemplateLink } from '../Doc-CYTLtFEu.js';
2
+ export { V as FRONTMATTER_CUSTOM_TEMPLATES_KEY, W as FRONTMATTER_CUSTOM_THEMES_KEY, a8 as LayoutHints, bb as RenderStyle, bB as ThemeColorPalette, bH as ThemeStyle, bI as ThemeTypography, bW as VIEWPORT_PRESETS, c6 as ViewportPreset, cb as createTemplateContext, ci as getLayoutHints, cl as getTwoColumnPositions, cm as getViewport, cn as getViewportOrientation, cr as isTemplateBlock, cx as scaledFontSize } from '../Doc-CYTLtFEu.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 { c as PageSection } from '../materializePageSection-_5uQrEYP.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-_5uQrEYP.js';
5
+ import { c as PageSection } from '../materializePageSection-CDps_xUd.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-CDps_xUd.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-DsntZLoa.js';
9
+ export { D as DEFAULT_THEME, g as getAvailableThemes, b as getThemeSummaries, r as resolveTheme } from '../themeLibrary-CMm_jh3a.js';
10
10
 
11
11
  /** Pure build planning and evaluation, shared by interactive slides and frame export. */
12
12
 
@@ -1075,7 +1075,10 @@ declare function resolveCoverSlideSettings(frontmatter: Record<string, unknown>
1075
1075
  *
1076
1076
  * Features:
1077
1077
  * - Full-screen hero image with Ken Burns ambient motion
1078
- * - Gradient overlay for text readability
1078
+ * - Gradient overlay for text readability (default `coverStyle: 'scrim'`), or a clear
1079
+ * photo with the title on a frosted-glass plate (`'frosted'`): the plate rests near
1080
+ * the bottom, grows upward for longer titles, and stays inside the frame's centre
1081
+ * square so a square crop (a social link card) still shows the whole title
1079
1082
  * - Large centered title with optional subtitle
1080
1083
  * - No animation delays (shown at rest, not during playback)
1081
1084
  *
@@ -1102,6 +1105,8 @@ interface CoverBlockInput {
1102
1105
  heroLicense?: string;
1103
1106
  /** Per-block override for the theme's photographic image grade. */
1104
1107
  imageTreatment?: 'none' | 'mono' | 'duotone' | 'warm' | 'cool';
1108
+ /** How a hero cover keeps its title legible (see StartBlockConfig.coverStyle). */
1109
+ coverStyle?: 'scrim' | 'frosted';
1105
1110
  }
1106
1111
  /**
1107
1112
  * Generate cover block layers from StartBlockConfig.
package/dist/doc/index.js CHANGED
@@ -75,9 +75,9 @@ import {
75
75
  validateMarkdownSource,
76
76
  wordRevealDelay,
77
77
  writeDashboardLayoutsToFrontmatter
78
- } from "../chunk-2LTALYXX.js";
78
+ } from "../chunk-56TW6HE6.js";
79
79
  import "../chunk-FTN6SGW5.js";
80
- import "../chunk-DCO5GYVW.js";
80
+ import "../chunk-FUQYQWQR.js";
81
81
  import {
82
82
  BASE_INPUT_DESCRIPTORS,
83
83
  BLOCK_MEDIA_LAYOUT_POLICIES,
@@ -191,7 +191,7 @@ import {
191
191
  wrapWithPersistentLayers,
192
192
  writeCustomTemplatesToFrontmatter,
193
193
  writeCustomThemesToFrontmatter
194
- } from "../chunk-ITLJQG7Z.js";
194
+ } from "../chunk-YY3OQ3MI.js";
195
195
  import {
196
196
  ASCII_CHAR_H,
197
197
  ASCII_CHAR_W,
@@ -1,4 +1,4 @@
1
- import { bA as Theme } from '../Doc-C7iCmmmF.js';
1
+ import { bA as Theme } from '../Doc-CYTLtFEu.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 { r as ColorScheme, A as AccentImage, br as TemplateBlock } from '../Doc-C7iCmmmF.js';
3
+ import { r as ColorScheme, A as AccentImage, br as TemplateBlock } from '../Doc-CYTLtFEu.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-CxRHe41J.js';
2
- export { E as EditorLayerMeta, I as ImageEditCanvas, c as ImageEditLayerKind, d as ImageEditMeta } from '../ImageEditDoc-CxRHe41J.js';
1
+ import { a as ImageEditDoc, b as ImageEditLayer } from '../ImageEditDoc-DZ4k_O10.js';
2
+ export { E as EditorLayerMeta, I as ImageEditCanvas, c as ImageEditLayerKind, d as ImageEditMeta } from '../ImageEditDoc-DZ4k_O10.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-C7iCmmmF.js';
5
+ import '../Doc-CYTLtFEu.js';
6
6
  import '../types-Zk8qYuaT.js';
7
7
 
8
8
  /**
package/dist/index.d.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  export { B as BUILD_EFFECTS, a as BUILD_MODES, b as BUILD_PARAM_KEYS, c as BUILD_PREVIOUS, d as BuildAdvance, e as BuildCursor, f as BuildSpec, g as BuildStep, h as BuildTiming, D as DEFAULT_MARKDOWN_SAFETY_LIMITS, i as DEFAULT_TRANSITION_DURATION_SECONDS, H as HeadingAttributes, j as HeadingTemplateAnnotation, k as HtmlComment, l as HtmlElement, m as HtmlNode, n as HtmlText, M as MarkdownBlockNode, o as MarkdownBlockquote, p as MarkdownBreak, q as MarkdownCodeBlock, r as MarkdownContainerDirective, s as MarkdownDefinitionDescription, t as MarkdownDefinitionList, u as MarkdownDefinitionTerm, v as MarkdownDocument, w as MarkdownEmphasis, x as MarkdownFootnoteDefinition, y as MarkdownFootnoteReference, z as MarkdownHeading, A as MarkdownHtmlBlock, C as MarkdownImage, E as MarkdownImageReference, F as MarkdownInlineCode, G as MarkdownInlineHtml, I as MarkdownInlineIcon, J as MarkdownInlineMath, K as MarkdownInlineNode, L as MarkdownLeafDirective, N as MarkdownLimitError, O as MarkdownLink, P as MarkdownLinkDefinition, Q as MarkdownLinkReference, R as MarkdownList, S as MarkdownListItem, T as MarkdownMathBlock, U as MarkdownMention, V as MarkdownNode, W as MarkdownParagraph, X as MarkdownPoint, Y as MarkdownSafetyLimits, Z as MarkdownSourcePosition, _ as MarkdownStrikethrough, $ as MarkdownStrong, a0 as MarkdownSubscript, a1 as MarkdownSuperscript, a2 as MarkdownTable, a3 as MarkdownTableCell, a4 as MarkdownTableRow, a5 as MarkdownText, a6 as MarkdownTextDirective, a7 as MarkdownThematicBreak, a8 as ParseOptions, a9 as StringifyOptions, aa as TRANSITION_DIRECTIONS, ab as TRANSITION_TYPES, ac as Transition, ad as TransitionDirection, ae as TransitionType, af as assertMarkdownDocumentWithinLimits, ag as assertMarkdownSourceWithinLimits, ah as buildSpecParams, ai as isTransitionType, aj as normalizeTransitionDirection, ak as normalizeTransitionType, al as parseBuildSpec, am as recordBuildAdvance, an as resolveBlockTransition, ao as resolveMarkdownSafetyLimits, ap as resolveTransitionDuration } from './types-Zk8qYuaT.js';
2
2
  export { B as BoundingBox, C as Coordinates } from './Types-sh2VRxfo.js';
3
- export { A as AccentImage, a as AccentPosition, b as AmbientGradientConfig, c as Animation, d as AnimationType, e as AreaChartInput, f as AudioBookmark, g as AudioSegment, h as AudioTimingData, i as AudioTrack, B as BarChartInput, j as BigTextInput, k as Block, l as BlockConnection, m as BorderStyle, C as CaptionPhrase, n as CaptionTrack, o as CaptionWord, p as ChartBaseFields, q as ChartTemplateInput, r as ColorScheme, s as ColumnChartInput, t as ComparisonBarInput, u as ContentBlockInput, v as CornerBrandingConfig, w as CountUpSpec, x as CreateTemplateContextOptions, y as CustomTemplateDefinition, z as CustomTemplateLayer, D as CustomTemplateValidationError, E as CustomTemplateValidationResult, F as DARK_SURFACE, G as DEFAULT_DOC_FONT, H as DEFAULT_TITLE_FONT, I as DataTableInput, J as DateEventInput, K as DeepPartial, L as DefinitionCardInput, M as DiagramBlockInput, N as DiagramEdgeAnchor, O as DiagramTemplateEdge, P as DiagramTemplateNode, Q as Doc, R as DocBlock, S as DocDiagnostic, T as DonutChartInput, U as DrawingBlockInput, V as FRONTMATTER_CUSTOM_TEMPLATES_KEY, W as FRONTMATTER_CUSTOM_THEMES_KEY, X as FRONTMATTER_MOTION_KEY, Y as FactCardInput, Z as FontFamily, _ as FontFamilyKind, $ as FullBleedQuoteInput, a0 as GradientBackgroundConfig, a1 as ImageBackgroundConfig, a2 as ImageLayer, a3 as ImageTreatment, a4 as ImageWithCaptionInput, a5 as LIGHT_SURFACE, a6 as Layer, a7 as LayerRepeat, a8 as LayoutHints, a9 as LeftFeatureInput, aa as LineChartInput, ab as LinearGradient, ac as ListBlockInput, ad as MOTION_PROFILES, ae as MapBlockInput, af as MapLayer, ag as MapMarker, ah as MapTileStyle, ai as MarkerStyle, aj as MediaClip, ak as MediaCrop, al as MediaCut, am as MediaEdits, an as MediaScheduleOptions, ao as MermaidLayer, ap as MotionEntrance, aq as MotionOrigin, ar as MotionProfile, as as MotionProfileName, at as MotionSpec, au as MotionState, av as PAGE_ACCENT_STRATEGIES, aw as PAGE_BACKGROUNDS, ax as PAGE_BACKGROUND_RHYTHMS, ay as PAGE_DESIGN_FAMILIES, az as PAGE_DIVIDERS, aA as PAGE_EMPHASES, aB as PAGE_EYEBROWS, aC as PAGE_HEADING_CASES, aD as PAGE_HEADING_SCALES, aE as PAGE_HEADING_UNDERLINES, aF as PAGE_HERO_STYLES, aG as PAGE_IMAGE_FRAMINGS, aH as PAGE_NUMERAL_STYLES, aI as PAGE_PATTERNS, aJ as PAGE_QUOTE_MARKS, aK as PAGE_SECTION_KINDS, aL as PAGE_SECTION_SPACINGS, aM as PAGE_SHADOWS, aN as PAGE_VARIANTS, aO as PageAccentRotation, aP as PageBackground, aQ as PageDesignFamily, aR as PageEmphasis, aS as PageHeadingTreatment, aT as PageSectionKind, aU as PageSectionOverride, aV as PageTokens, aW as PageVariant, aX as PathLayer, aY as PatternBackgroundConfig, aZ as PersistentLayer, a_ as PersistentLayerConfig, a$ as PersistentLayerTemplate, b0 as PersistentLayerTemplateConfig, b1 as PersistentLayerTemplateType, b2 as PhotoGridInput, b3 as PieChartInput, b4 as PipStyle, b5 as Position, b6 as ProgressIndicatorConfig, b7 as PromotedBodyAnnotation, b8 as PullQuoteInput, b9 as QuoteBlockInput, ba as RawLayersInput, bb as RenderStyle, bc as RightFeatureInput, bd as ScatterChartInput, be as ScheduledClip, bf as SectionHeaderInput, bg as ShapeFilter, bh as ShapeLayer, bi as ShapePattern, bj as SolidBackgroundConfig, bk as StartBlockConfig, bl as StatHighlightInput, bm as SurfaceScheme, bn as SvgLayer, bo as THEME_SCHEMA_VERSION, bp as TableLayer, bq as TableLayerStyle, br as TemplateBlock, bs as TemplateContext, bt as TemplateFunction, bu as TemplateRegistry, bv as TextFlow, bw as TextLayer, bx as TextParagraph, by as TextParagraphList, bz as TextStyle, bA as Theme, bB as ThemeColorPalette, bC as ThemeColorScheme, bD as ThemePageStyle, bE as ThemeRegistry, bF as ThemeSchemaVersion, bG as ThemeSeedColors, bH as ThemeStyle, bI as ThemeTypography, bJ as TimelineBlockInput, bK as TimelineTemplateEvent, bL as TimelineTemplateLink, bM as TimelineTemplateTrack, bN as TitleBlockInput, bO as TitleCaptionConfig, bP as TranscriptBlockInput, bQ as TreeBlockInput, bR as TreeLayer, bS as TreeLayerItem, bT as TreeLayerStyle, bU as TreeTemplateItem, bV as TwoColumnInput, bW as VIEWPORT_PRESETS, bX as VideoEmbedLayer, bY as VideoLayer, bZ as VideoPipPosition, b_ as VideoPipShape, b$ as VideoPipSize, c0 as VideoPlacement, c1 as VideoPresentation, c2 as VideoPullQuoteInput, c3 as VideoWithCaptionInput, c4 as ViewportConfig, c5 as ViewportOrientation, c6 as ViewportPreset, c7 as VignetteConfig, c8 as applySurface, c9 as calculateDuration, ca as calculateFontScale, cb as createTemplateContext, cc as createTheme, cd as createThemeRegistry, ce as getAspectRatioString, cf as getBlockAtTime, cg as getCaptionAtTime, ch as getDocPlaybackDuration, ci as getLayoutHints, cj as getSafeTextBounds, ck as getSegmentAtTime, cl as getTwoColumnPositions, cm as getViewport, cn as getViewportOrientation, co as isCustomTemplateDefinition, cp as isMotionProfileName, cq as isPersistentLayerTemplate, cr as isTemplateBlock, cs as layoutScaledFontSize, ct as readFrontmatterMotion, cu as resolveMediaSchedule, cv as resolveMotionForDoc, cw as resolveMotionProfile, cx as scaledFontSize, cy as scheduleMediaClip, cz as validateCustomTemplateDefinition } from './Doc-C7iCmmmF.js';
3
+ export { A as AccentImage, a as AccentPosition, b as AmbientGradientConfig, c as Animation, d as AnimationType, e as AreaChartInput, f as AudioBookmark, g as AudioSegment, h as AudioTimingData, i as AudioTrack, B as BarChartInput, j as BigTextInput, k as Block, l as BlockConnection, m as BorderStyle, C as CaptionPhrase, n as CaptionTrack, o as CaptionWord, p as ChartBaseFields, q as ChartTemplateInput, r as ColorScheme, s as ColumnChartInput, t as ComparisonBarInput, u as ContentBlockInput, v as CornerBrandingConfig, w as CountUpSpec, x as CreateTemplateContextOptions, y as CustomTemplateDefinition, z as CustomTemplateLayer, D as CustomTemplateValidationError, E as CustomTemplateValidationResult, F as DARK_SURFACE, G as DEFAULT_DOC_FONT, H as DEFAULT_TITLE_FONT, I as DataTableInput, J as DateEventInput, K as DeepPartial, L as DefinitionCardInput, M as DiagramBlockInput, N as DiagramEdgeAnchor, O as DiagramTemplateEdge, P as DiagramTemplateNode, Q as Doc, R as DocBlock, S as DocDiagnostic, T as DonutChartInput, U as DrawingBlockInput, V as FRONTMATTER_CUSTOM_TEMPLATES_KEY, W as FRONTMATTER_CUSTOM_THEMES_KEY, X as FRONTMATTER_MOTION_KEY, Y as FactCardInput, Z as FontFamily, _ as FontFamilyKind, $ as FullBleedQuoteInput, a0 as GradientBackgroundConfig, a1 as ImageBackgroundConfig, a2 as ImageLayer, a3 as ImageTreatment, a4 as ImageWithCaptionInput, a5 as LIGHT_SURFACE, a6 as Layer, a7 as LayerRepeat, a8 as LayoutHints, a9 as LeftFeatureInput, aa as LineChartInput, ab as LinearGradient, ac as ListBlockInput, ad as MOTION_PROFILES, ae as MapBlockInput, af as MapLayer, ag as MapMarker, ah as MapTileStyle, ai as MarkerStyle, aj as MediaClip, ak as MediaCrop, al as MediaCut, am as MediaEdits, an as MediaScheduleOptions, ao as MermaidLayer, ap as MotionEntrance, aq as MotionOrigin, ar as MotionProfile, as as MotionProfileName, at as MotionSpec, au as MotionState, av as PAGE_ACCENT_STRATEGIES, aw as PAGE_BACKGROUNDS, ax as PAGE_BACKGROUND_RHYTHMS, ay as PAGE_DESIGN_FAMILIES, az as PAGE_DIVIDERS, aA as PAGE_EMPHASES, aB as PAGE_EYEBROWS, aC as PAGE_HEADING_CASES, aD as PAGE_HEADING_SCALES, aE as PAGE_HEADING_UNDERLINES, aF as PAGE_HERO_STYLES, aG as PAGE_IMAGE_FRAMINGS, aH as PAGE_NUMERAL_STYLES, aI as PAGE_PATTERNS, aJ as PAGE_QUOTE_MARKS, aK as PAGE_SECTION_KINDS, aL as PAGE_SECTION_SPACINGS, aM as PAGE_SHADOWS, aN as PAGE_VARIANTS, aO as PageAccentRotation, aP as PageBackground, aQ as PageDesignFamily, aR as PageEmphasis, aS as PageHeadingTreatment, aT as PageSectionKind, aU as PageSectionOverride, aV as PageTokens, aW as PageVariant, aX as PathLayer, aY as PatternBackgroundConfig, aZ as PersistentLayer, a_ as PersistentLayerConfig, a$ as PersistentLayerTemplate, b0 as PersistentLayerTemplateConfig, b1 as PersistentLayerTemplateType, b2 as PhotoGridInput, b3 as PieChartInput, b4 as PipStyle, b5 as Position, b6 as ProgressIndicatorConfig, b7 as PromotedBodyAnnotation, b8 as PullQuoteInput, b9 as QuoteBlockInput, ba as RawLayersInput, bb as RenderStyle, bc as RightFeatureInput, bd as ScatterChartInput, be as ScheduledClip, bf as SectionHeaderInput, bg as ShapeFilter, bh as ShapeLayer, bi as ShapePattern, bj as SolidBackgroundConfig, bk as StartBlockConfig, bl as StatHighlightInput, bm as SurfaceScheme, bn as SvgLayer, bo as THEME_SCHEMA_VERSION, bp as TableLayer, bq as TableLayerStyle, br as TemplateBlock, bs as TemplateContext, bt as TemplateFunction, bu as TemplateRegistry, bv as TextFlow, bw as TextLayer, bx as TextParagraph, by as TextParagraphList, bz as TextStyle, bA as Theme, bB as ThemeColorPalette, bC as ThemeColorScheme, bD as ThemePageStyle, bE as ThemeRegistry, bF as ThemeSchemaVersion, bG as ThemeSeedColors, bH as ThemeStyle, bI as ThemeTypography, bJ as TimelineBlockInput, bK as TimelineTemplateEvent, bL as TimelineTemplateLink, bM as TimelineTemplateTrack, bN as TitleBlockInput, bO as TitleCaptionConfig, bP as TranscriptBlockInput, bQ as TreeBlockInput, bR as TreeLayer, bS as TreeLayerItem, bT as TreeLayerStyle, bU as TreeTemplateItem, bV as TwoColumnInput, bW as VIEWPORT_PRESETS, bX as VideoEmbedLayer, bY as VideoLayer, bZ as VideoPipPosition, b_ as VideoPipShape, b$ as VideoPipSize, c0 as VideoPlacement, c1 as VideoPresentation, c2 as VideoPullQuoteInput, c3 as VideoWithCaptionInput, c4 as ViewportConfig, c5 as ViewportOrientation, c6 as ViewportPreset, c7 as VignetteConfig, c8 as applySurface, c9 as calculateDuration, ca as calculateFontScale, cb as createTemplateContext, cc as createTheme, cd as createThemeRegistry, ce as getAspectRatioString, cf as getBlockAtTime, cg as getCaptionAtTime, ch as getDocPlaybackDuration, ci as getLayoutHints, cj as getSafeTextBounds, ck as getSegmentAtTime, cl as getTwoColumnPositions, cm as getViewport, cn as getViewportOrientation, co as isCustomTemplateDefinition, cp as isMotionProfileName, cq as isPersistentLayerTemplate, cr as isTemplateBlock, cs as layoutScaledFontSize, ct as readFrontmatterMotion, cu as resolveMediaSchedule, cv as resolveMotionForDoc, cw as resolveMotionProfile, cx as scaledFontSize, cy as scheduleMediaClip, cz as validateCustomTemplateDefinition } from './Doc-CYTLtFEu.js';
4
4
  export { AVAILABLE_FONT_STACKS, CompileOptions, ContrastPreset, DocSchemaIssue, FONT_FALLBACKS, FontStack, MermaidThemeVariables, PipStyleVars, STARTER_THEME, ValidationError, ValidationResult, accentToColorScheme, assertDocSchema, assertTheme, buildGoogleFontsUrl, buildMermaidThemeVariables, compileTheme, contrastRatio, defaultPageStyle, deriveColorPalette, deriveScale, fontStack, getFontStack, guessFontFallback, hexHueDegrees, isHex, matchFontFamily, oklchDarken, oklchLighten, oklchSetChroma, parseTheme, pickContrastingText, pipStyleVars, relativeLuminance, resolveFontFamily, serializeTheme, validateDocSchema, validateTheme, withAlpha } from './schemas/index.js';
5
- export { D as DEFAULT_THEME, a as DEFAULT_THEME_ID, T as THEMES, g as getAvailableThemes, b as getThemeSummaries, r as resolveTheme } from './themeLibrary-DsntZLoa.js';
5
+ export { D as DEFAULT_THEME, a as DEFAULT_THEME_ID, T as THEMES, g as getAvailableThemes, b as getThemeSummaries, r as resolveTheme } from './themeLibrary-CMm_jh3a.js';
6
6
  export { M as MediaEntry, a as MediaProvider } from './MediaProvider-wpSe21B3.js';
7
- export { E as EditorLayerMeta, I as ImageEditCanvas, a as ImageEditDoc, b as ImageEditLayer, c as ImageEditLayerKind, d as ImageEditMeta } from './ImageEditDoc-CxRHe41J.js';
7
+ export { E as EditorLayerMeta, I as ImageEditCanvas, a as ImageEditDoc, b as ImageEditLayer, c as ImageEditLayerKind, d as ImageEditMeta } from './ImageEditDoc-DZ4k_O10.js';
8
8
  export { ASCII_CHAR_H, ASCII_CHAR_W, ASCII_DIAGRAM_FENCE_LANGS, ASCII_TIMELINE_FENCE_LANGS, AccentLayout, ArrangeAsciiDiagramOptions, AsciiDiagram, AsciiDiagramDetection, AsciiDiagramEdge, AsciiDiagramNode, AsciiTimeline, AsciiTimelineDetection, AsciiTimelineEvent, AsciiTimelineLink, AsciiTimelineMarker, AsciiTimelineSide, AsciiTimelineStats, AsciiTimelineStyle, AsciiTimelineTrack, AudioSegmentTiming, BASE_INPUT_DESCRIPTORS, BLOCK_MEDIA_LAYOUT_POLICIES, BUILTIN_DASHBOARD_LAYOUTS, BlockLayerMaterialization, BlockMediaLayoutPolicy, BuildPreviewDocOptions, BuildTimeline, BuiltInTemplateName, CONTAINER_TEMPLATES, COVER_SLIDE_FRONTMATTER_KEYS, COVER_SLIDE_TEMPLATE_OPTIONS, ClipBox, ConnectorAnchor, ConnectorPort, ConnectorRouting, ConnectorSnapPoint, ContentBuildPlan, CoverBlockInput, CoverSlidePlayback, CoverSlideSettings, CoverSlideTemplate, CoverSlideTemplateOption, DASHBOARD_AUTO_LAYOUT_ID, DASHBOARD_FRONTMATTER_KEYS, DASHBOARD_STYLES, DASHBOARD_STYLE_IDS, DASHBOARD_ZOOM_LEVELS, DATA_FILE_EXTENSIONS, DEFAULT_COVER_SLIDE_SETTINGS, DEFAULT_DASHBOARD_SETTINGS, DEFAULT_DASHBOARD_STYLE, DEFAULT_LAYOUT, DEFAULT_WORD_STAGGER, DIAGRAM_LABEL_HORIZONTAL_PADDING, DIAGRAM_LABEL_LINE_HEIGHT, DIAGRAM_LABEL_MIN_FONT_SIZE, DIAGRAM_LABEL_VERTICAL_PADDING, DashboardCell, DashboardCellChrome, DashboardCellDefinition, DashboardCellFrame, DashboardDiagnostic, DashboardLayoutDefinition, DashboardLayoutSummary, DashboardLayoutValidationError, DashboardLayoutValidationResult, DashboardMaterialization, DashboardRectPct, DashboardSettings, DashboardSettingsOverrides, DashboardStyleId, DashboardStyleSummary, DashboardTitle, DashboardTitleSlotDefinition, DashboardZoomCandidate, DashboardZoomLevel, DashboardZoomMode, DataFenceParseResult, DataSourceReadOptions, DataSourceReader, DataSourceStats, DataSourceTable, DeriveTemplateInputsOptions, DetectAsciiTimelineOptions, DiagramEdge, DiagramLabelFit, DiagramLayout, DiagramLayoutOptions, DiagramNodePosition, DrawingConnector, DrawingLayout, DrawingLayoutOptions, DrawingShape, DrawingShapeKind, EmbeddedVideo, ExpandDocBlocksOptions, ExtractedTableData, FRONTMATTER_DASHBOARD_LAYOUTS_KEY, FirstImage, Flashcard, FlashcardChoice, FlashcardDeck, FlashcardDiagnostic, FlashcardDiagnosticCode, FlashcardFace, FlashcardKind, FlashcardSourceMode, GEOMETRY_BOUND_TEMPLATES, HostedVideo, InputCoercion, LayerMaterializationDiagnostic, LayerMaterializationFailureMode, LayerMaterializationSource, LayoutLayerDefaults, LayoutLayersResult, MAX_COVER_SLIDE_DURATION_SECONDS, MarkdownToDocOptions, MarkdownValidationResult, MaterializeBlockLayersOptions, MaterializeDashboardOptions, MaterializeFlashcardsOptions, NarrationResolution, NativeMediaLayout, NoMediaLayout, PAGE_BASE_CSS, PATH_SHAPE_KINDS, PageSectionContext, PageSectionDraft, ParsedStat, RenderAsciiDiagramOptions, RenderAsciiTimelineOptions, RenderTreeOptions, RepairResult, ResolveDataReferencesOptions, ResolvedDashboardCell, ResolvedDataReferences, ResolvedPageBlock, RichListItem, RuntimeTemplateRegistry, SHAPE_NAMES, SectionExtractor, SupplementalMediaLayoutVariant, SupplementalMediaShape, SupplementalMediaVariantMatrix, TABLE_FED_TEMPLATES, TEMPLATE_AUTHORING_METADATA, TEMPLATE_INPUT_DESCRIPTORS, TEMPLATE_METADATA, TREE_FENCE_LANGS, TemplateAuthoringMetadata, TemplateAuthoringRole, TemplateBodyPolicy, TemplateInputDescriptor, TemplateMediaOwnership, TemplateMetadata, TemplateParamFinding, Tree, TreeDetection, TreeItem, TreeNode, UnconsumedMediaBehavior, ValidateOptions, accentForViewport, adjustY, anchorPoint, applyNarrationTiming, applyRenderStyleToLayers, arrangeAsciiDiagram, asciiCellToCanvas, asciiDiagramFromBlocks, asciiDiagramFromTemplateData, asciiDiagramToTemplateData, asciiTimelineToTemplateData, autoTemplatePreservesContent, bigText, blockBuildSteps, buildCursorAtTime, buildDashboardCellChrome, buildPageCss, buildPageCssVars, buildPreviewDoc, buildRegistry, buildSourceText, buildTargetState, canvasToAsciiCell, chooseDashboardLayout, clipEndpoints, clipPoint, coerceTemplateParams, comparisonBar, composeDashboardLayers, computeDiagramLayout, computeDrawingLayout, computeLayoutLayers, connectorPath, contentBlock, countBlocks, countUpSpecFor, coverBlock, createAccentLayers, cssFilterForTreatment, dashboardCanvasFill, dashboardCellAccent, dataSidecarPrefix, dataTable, dateEvent, definitionCard, deriveTemplateInputs, desiredCellZoom, detectAsciiDiagram, detectAsciiTimeline, detectTree, diagramBlock, docToMarkdown, documentTitleFromFileName, drawingBlock, expandCoverBlock, expandDocBlocks, expandPersistentLayers, extractBlockquoteText, extractBodyPlainText, extractEmbeddedVideos, extractFirstEmbeddedVideo, extractFirstImage, extractHostedVideos, extractImages, extractListItems, extractRichListItems, extractTableData, extractTableFromContents, factCard, fallbackBlockLayers, findFirstList, findFirstTable, fitBigTextSize, fitDiagramLabel, flattenBlocks, flattenRenderableBlocks, formatCountUp, formatCountValue, fullBleedQuote, getAccentLayout, getAnimationProgress, getAnimationStyle, getAvailableTemplates, getBlockBodyText, getBlockDepth, getBlockMediaLayoutPolicy, getDashboardLayoutSummaries, getDefaultAnimation, getDefaultAnimationDuration, getMotionProfile, getOverlayOpacity, getPersistentLayersFromTheme, getPinnedBlockMeta, getTemplateHint, getThemeFont, getTransitionClass, hasBlockBuilds, hasTemplate, imageWithCaption, isAsciiDiagramFence, isAsciiTimelineFence, isContainerTemplate, isDataFence, isDataFilePath, isEligibleAsciiFenceLang, isEligibleAsciiTimelineFenceLang, isEligibleTreeFenceLang, isExplicitDiagramLang, isExplicitTimelineLang, isExplicitTreeLang, isGeometryBoundTemplate, isMaterializedMediaNode, isPictureFence, isRepairableDiagram, isShapeName, isTemplatedPageBlock, isTreeFence, isWrappedFlowTimelineSource, layoutBlock, layoutCapacity, leftFeature, lineStyleDasharray, lintTemplateParams, listBlock, listDashboardLayouts, mapBlock, markdownBlockSeparatorLines, markdownToDoc, markerPath, materializeBlockLayers, materializeDashboard, materializeFlashcards, motionDelay, motionEntrance, motionStateTransform, nearestSnapPoint, normalizeDashboardZoom, normalizeShapeKind, pageStyleDataAttributes, parseAsciiDiagram, parseAsciiTimeline, parseAsciiTimelineWithStats, parseDataFence, parseStatNumber, parseTree, parseWrappedFlowTimeline, parseYamlSubset, photoGrid, planContentBuilds, pullQuote, quoteBlock, readCustomTemplatesFromFrontmatter, readCustomThemesFromFrontmatter, readDashboardLayoutsFromFrontmatter, renderAsciiDiagram, renderAsciiTimeline, renderMarkdownBlocksHtml, renderTree, repairAsciiDiagram, replaceDataFence, resolveAudioMapping, resolveBuildTimeline, resolveColorScheme, resolveCoverSlideSettings, resolveDashboardLayoutDefinition, resolveDashboardSettings, resolveDashboardStyleId, resolveDashboardZooms, resolveDataReferences, resolveDocBuildTiming, resolveFlashcardMarker, resolveLayoutCells, resolvePageBlock, resolvePersistentLayers, resolveTemplateName, resolveThemeForDoc, rightFeature, scaleAnimationDuration, scoreTextSimilarity, sectionExtractors, sectionHeader, shapePath, shouldUseShadow, snapEndpoints, snapPoints, statHighlight, stripBlockBackdropLayer, stripsBlockBackdrop, templateRegistry, themeWantsAmbientMotion, themedEntrance, themedFontSize, themedImageTreatment, themedScrim, themedSurfaceGradient, timelineBlock, titleBlock, transformOriginFor, transposeCells, treeBlock, treeFromMarkdownList, treeFromTemplateData, treeToTemplateData, twoColumn, validateDashboardLayoutDefinition, validateMarkdownDoc, validateMarkdownSource, videoPullQuote, videoWithCaption, wordRevealDelay, wrapWithPersistentLayers, writeCustomTemplatesToFrontmatter, writeCustomThemesToFrontmatter, writeDashboardLayoutsToFrontmatter } from './doc/index.js';
9
- export { M as MaterializePageSectionOptions, a as MaterializePageSectionsOptions, P as PageMedia, b as PageRichText, c as PageSection, d as PageSectionDiagnostic, e as PageSectionItem, f as PageSectionMaterialization, g as PageSectionSource, h as PageSpatialKind, i as PageTransformHints, m as materializePageSection, j as materializePageSections, r as resolvePageStyle } from './materializePageSection-_5uQrEYP.js';
9
+ export { M as MaterializePageSectionOptions, a as MaterializePageSectionsOptions, P as PageMedia, b as PageRichText, c as PageSection, d as PageSectionDiagnostic, e as PageSectionItem, f as PageSectionMaterialization, g as PageSectionSource, h as PageSpatialKind, i as PageTransformHints, m as materializePageSection, j as materializePageSections, r as resolvePageStyle } from './materializePageSection-CDps_xUd.js';
10
10
  export { calculateBearing, decodeGeohash, destinationPoint, encodeGeohash, geohashOverlapsBounds, geohashToHierarchicalPath, getGeohash4Neighbors, getGeohashPath, getGeohashPrefix, getNeighbors, haversineDistance, interpolateGreatCircle, sampleGreatCircle } from './spatial/index.js';
11
11
  export { LocalForageAdapter, LocalForageAdapterOptions, LocalStorageAdapter, MemoryStorageAdapter, ScopedContentContainer, StorageAdapter, createMediaProviderFromContainer, scopeContainer } from './storage/index.js';
12
12
  export { C as ContentContainer, a as ContentEntry, M as MemoryContentContainer, f as findDocumentPath } from './ContentContainer-B2w9sUoL.js';
package/dist/index.js CHANGED
@@ -27,7 +27,7 @@ import {
27
27
  recordSlideShown,
28
28
  traceWordPosAt,
29
29
  vadStep
30
- } from "./chunk-V4USYYYO.js";
30
+ } from "./chunk-2GN67Q2T.js";
31
31
  import {
32
32
  fenceRendererLangs
33
33
  } from "./chunk-PGI7HSWE.js";
@@ -137,7 +137,7 @@ import {
137
137
  pipStyleVars,
138
138
  serializeTheme,
139
139
  validateDocSchema
140
- } from "./chunk-5SVFLLOD.js";
140
+ } from "./chunk-ISVJ42I3.js";
141
141
  import {
142
142
  calculateBearing,
143
143
  decodeGeohash,
@@ -230,7 +230,7 @@ import {
230
230
  validateMarkdownSource,
231
231
  wordRevealDelay,
232
232
  writeDashboardLayoutsToFrontmatter
233
- } from "./chunk-2LTALYXX.js";
233
+ } from "./chunk-56TW6HE6.js";
234
234
  import {
235
235
  buildNarrationTimingJson,
236
236
  parseNarrationTimingJson,
@@ -262,7 +262,7 @@ import {
262
262
  serializePresentationPlan,
263
263
  transformNarratedSegment,
264
264
  usesDynamicPresentation
265
- } from "./chunk-DCO5GYVW.js";
265
+ } from "./chunk-FUQYQWQR.js";
266
266
  import {
267
267
  BASE_INPUT_DESCRIPTORS,
268
268
  BLOCK_MEDIA_LAYOUT_POLICIES,
@@ -382,7 +382,7 @@ import {
382
382
  wrapWithPersistentLayers,
383
383
  writeCustomTemplatesToFrontmatter,
384
384
  writeCustomThemesToFrontmatter
385
- } from "./chunk-ITLJQG7Z.js";
385
+ } from "./chunk-YY3OQ3MI.js";
386
386
  import {
387
387
  ASCII_CHAR_H,
388
388
  ASCII_CHAR_W,
@@ -1,4 +1,4 @@
1
- import { bA as Theme, bm as SurfaceScheme } from '../Doc-C7iCmmmF.js';
1
+ import { bA as Theme, bm as SurfaceScheme } from '../Doc-CYTLtFEu.js';
2
2
  import '../types-Zk8qYuaT.js';
3
3
 
4
4
  /**
@@ -16,7 +16,7 @@ import {
16
16
  setByPointer,
17
17
  toPointer
18
18
  } from "../chunk-GLWQTZ4C.js";
19
- import "../chunk-5SVFLLOD.js";
19
+ import "../chunk-ISVJ42I3.js";
20
20
  import "../chunk-2SRF5III.js";
21
21
  import "../chunk-WNEH3BZP.js";
22
22
  import "../chunk-JSGIWW35.js";
@@ -1,4 +1,4 @@
1
- import { k as Block, aT as PageSectionKind, aR as PageEmphasis, bC as ThemeColorScheme, aP as PageBackground, bA as Theme, c4 as ViewportConfig, y as CustomTemplateDefinition, aW as PageVariant, bk as StartBlockConfig, Q as Doc, bD as ThemePageStyle } from './Doc-C7iCmmmF.js';
1
+ import { k as Block, aT as PageSectionKind, aR as PageEmphasis, bC as ThemeColorScheme, aP as PageBackground, bA as Theme, c4 as ViewportConfig, y as CustomTemplateDefinition, aW as PageVariant, bk as StartBlockConfig, Q as Doc, bD as ThemePageStyle } from './Doc-CYTLtFEu.js';
2
2
  import { M as MarkdownBlockNode } from './types-Zk8qYuaT.js';
3
3
 
4
4
  /**
@@ -1,5 +1,5 @@
1
- import { al as MediaCut, Q as Doc, aj as MediaClip, cA as MediaFxOpId, cB as MediaFxChain } from '../Doc-C7iCmmmF.js';
2
- export { cC as MEDIA_EDIT_PARAMS, cD as MEDIA_FX_ORDER, cE as MEDIA_FX_SPECS, ak as MediaCrop, cF as MediaEditParamKey, cG as MediaEditParamValues, am as MediaEdits, cH as MediaFxOp, cI as formatMediaNumber, cJ as hasRenderableFx, cK as mediaEditHtmlAttribute, cL as mediaEditValuesFromAttributes, cM as mediaEditValuesFromParams, cN as mediaRenderKey, cO as normalizeMediaCrop, cP as normalizeMediaCuts, cQ as parseMediaCrop, cR as parseMediaCuts, cS as parseMediaEdits, cT as parseMediaFx, cU as serializeMediaCrop, cV as serializeMediaCuts, cW as serializeMediaEdits, cX as serializeMediaFx } from '../Doc-C7iCmmmF.js';
1
+ import { al as MediaCut, Q as Doc, aj as MediaClip, cA as MediaFxOpId, cB as MediaFxChain } from '../Doc-CYTLtFEu.js';
2
+ export { cC as MEDIA_EDIT_PARAMS, cD as MEDIA_FX_ORDER, cE as MEDIA_FX_SPECS, ak as MediaCrop, cF as MediaEditParamKey, cG as MediaEditParamValues, am as MediaEdits, cH as MediaFxOp, cI as formatMediaNumber, cJ as hasRenderableFx, cK as mediaEditHtmlAttribute, cL as mediaEditValuesFromAttributes, cM as mediaEditValuesFromParams, cN as mediaRenderKey, cO as normalizeMediaCrop, cP as normalizeMediaCuts, cQ as parseMediaCrop, cR as parseMediaCuts, cS as parseMediaEdits, cT as parseMediaFx, cU as serializeMediaCrop, cV as serializeMediaCuts, cW as serializeMediaEdits, cX as serializeMediaFx } from '../Doc-CYTLtFEu.js';
3
3
  import '../types-Zk8qYuaT.js';
4
4
 
5
5
  /**
@@ -1,4 +1,4 @@
1
- import { Q as Doc, f as AudioBookmark } from '../Doc-C7iCmmmF.js';
1
+ import { Q as Doc, f as AudioBookmark } from '../Doc-CYTLtFEu.js';
2
2
  import { d as BuildAdvance } from '../types-Zk8qYuaT.js';
3
3
 
4
4
  /**
@@ -27,7 +27,7 @@ import {
27
27
  recordSlideShown,
28
28
  traceWordPosAt,
29
29
  vadStep
30
- } from "../chunk-V4USYYYO.js";
30
+ } from "../chunk-2GN67Q2T.js";
31
31
  import "../chunk-NEWNNLWN.js";
32
32
  import {
33
33
  buildNarrationTimingJson,
@@ -41,7 +41,7 @@ import {
41
41
  wordIndexAtChar,
42
42
  wordIndexAtTime,
43
43
  wordPosAtExpectedSyllables
44
- } from "../chunk-ITLJQG7Z.js";
44
+ } from "../chunk-YY3OQ3MI.js";
45
45
  import "../chunk-HGCIIXHP.js";
46
46
  import "../chunk-FUBMT6SJ.js";
47
47
  import "../chunk-WNEH3BZP.js";
@@ -1,10 +1,10 @@
1
1
  export { B as BUILD_EFFECTS, a as BUILD_MODES, b as BUILD_PARAM_KEYS, c as BUILD_PREVIOUS, d as BuildAdvance, e as BuildCursor, f as BuildSpec, g as BuildStep, h as BuildTiming, i as DEFAULT_TRANSITION_DURATION_SECONDS, aa as TRANSITION_DIRECTIONS, ab as TRANSITION_TYPES, ac as Transition, ad as TransitionDirection, ae as TransitionType, ah as buildSpecParams, ai as isTransitionType, aj as normalizeTransitionDirection, ak as normalizeTransitionType, al as parseBuildSpec, am as recordBuildAdvance, an as resolveBlockTransition, ap as resolveTransitionDuration } from '../types-Zk8qYuaT.js';
2
2
  export { B as BoundingBox, C as Coordinates } from '../Types-sh2VRxfo.js';
3
- import { Q as Doc, bA as Theme, bD as ThemePageStyle, bC as ThemeColorScheme, K as DeepPartial, bG as ThemeSeedColors, bB as ThemeColorPalette, _ as FontFamilyKind, Z as FontFamily } from '../Doc-C7iCmmmF.js';
4
- export { A as AccentImage, a as AccentPosition, b as AmbientGradientConfig, c as Animation, d as AnimationType, e as AreaChartInput, f as AudioBookmark, g as AudioSegment, h as AudioTimingData, i as AudioTrack, B as BarChartInput, j as BigTextInput, k as Block, l as BlockConnection, m as BorderStyle, C as CaptionPhrase, n as CaptionTrack, o as CaptionWord, p as ChartBaseFields, q as ChartTemplateInput, r as ColorScheme, s as ColumnChartInput, t as ComparisonBarInput, u as ContentBlockInput, v as CornerBrandingConfig, w as CountUpSpec, x as CreateTemplateContextOptions, y as CustomTemplateDefinition, z as CustomTemplateLayer, D as CustomTemplateValidationError, E as CustomTemplateValidationResult, F as DARK_SURFACE, G as DEFAULT_DOC_FONT, H as DEFAULT_TITLE_FONT, I as DataTableInput, J as DateEventInput, L as DefinitionCardInput, M as DiagramBlockInput, N as DiagramEdgeAnchor, O as DiagramTemplateEdge, P as DiagramTemplateNode, R as DocBlock, S as DocDiagnostic, T as DonutChartInput, U as DrawingBlockInput, V as FRONTMATTER_CUSTOM_TEMPLATES_KEY, W as FRONTMATTER_CUSTOM_THEMES_KEY, X as FRONTMATTER_MOTION_KEY, Y as FactCardInput, $ as FullBleedQuoteInput, a0 as GradientBackgroundConfig, a1 as ImageBackgroundConfig, a2 as ImageLayer, a3 as ImageTreatment, a4 as ImageWithCaptionInput, a5 as LIGHT_SURFACE, a6 as Layer, a7 as LayerRepeat, a8 as LayoutHints, a9 as LeftFeatureInput, aa as LineChartInput, ab as LinearGradient, ac as ListBlockInput, ad as MOTION_PROFILES, ae as MapBlockInput, af as MapLayer, ag as MapMarker, ah as MapTileStyle, ai as MarkerStyle, aj as MediaClip, ak as MediaCrop, al as MediaCut, am as MediaEdits, an as MediaScheduleOptions, ao as MermaidLayer, ap as MotionEntrance, aq as MotionOrigin, ar as MotionProfile, as as MotionProfileName, at as MotionSpec, au as MotionState, av as PAGE_ACCENT_STRATEGIES, aw as PAGE_BACKGROUNDS, ax as PAGE_BACKGROUND_RHYTHMS, ay as PAGE_DESIGN_FAMILIES, az as PAGE_DIVIDERS, aA as PAGE_EMPHASES, aB as PAGE_EYEBROWS, aC as PAGE_HEADING_CASES, aD as PAGE_HEADING_SCALES, aE as PAGE_HEADING_UNDERLINES, aF as PAGE_HERO_STYLES, aG as PAGE_IMAGE_FRAMINGS, aH as PAGE_NUMERAL_STYLES, aI as PAGE_PATTERNS, aJ as PAGE_QUOTE_MARKS, aK as PAGE_SECTION_KINDS, aL as PAGE_SECTION_SPACINGS, aM as PAGE_SHADOWS, aN as PAGE_VARIANTS, aO as PageAccentRotation, aP as PageBackground, aQ as PageDesignFamily, aR as PageEmphasis, aS as PageHeadingTreatment, aT as PageSectionKind, aU as PageSectionOverride, aV as PageTokens, aW as PageVariant, aX as PathLayer, aY as PatternBackgroundConfig, aZ as PersistentLayer, a_ as PersistentLayerConfig, a$ as PersistentLayerTemplate, b0 as PersistentLayerTemplateConfig, b1 as PersistentLayerTemplateType, b2 as PhotoGridInput, b3 as PieChartInput, b4 as PipStyle, b5 as Position, b6 as ProgressIndicatorConfig, b7 as PromotedBodyAnnotation, b8 as PullQuoteInput, b9 as QuoteBlockInput, ba as RawLayersInput, bb as RenderStyle, bc as RightFeatureInput, bd as ScatterChartInput, be as ScheduledClip, bf as SectionHeaderInput, bg as ShapeFilter, bh as ShapeLayer, bi as ShapePattern, bj as SolidBackgroundConfig, bk as StartBlockConfig, bl as StatHighlightInput, bm as SurfaceScheme, bn as SvgLayer, bo as THEME_SCHEMA_VERSION, bp as TableLayer, bq as TableLayerStyle, br as TemplateBlock, bs as TemplateContext, bt as TemplateFunction, bu as TemplateRegistry, bv as TextFlow, bw as TextLayer, bx as TextParagraph, by as TextParagraphList, bz as TextStyle, bE as ThemeRegistry, bF as ThemeSchemaVersion, bH as ThemeStyle, bI as ThemeTypography, bJ as TimelineBlockInput, bK as TimelineTemplateEvent, bL as TimelineTemplateLink, bM as TimelineTemplateTrack, bN as TitleBlockInput, bO as TitleCaptionConfig, bP as TranscriptBlockInput, bQ as TreeBlockInput, bR as TreeLayer, bS as TreeLayerItem, bT as TreeLayerStyle, bU as TreeTemplateItem, bV as TwoColumnInput, bW as VIEWPORT_PRESETS, bX as VideoEmbedLayer, bY as VideoLayer, bZ as VideoPipPosition, b_ as VideoPipShape, b$ as VideoPipSize, c0 as VideoPlacement, c1 as VideoPresentation, c2 as VideoPullQuoteInput, c3 as VideoWithCaptionInput, c4 as ViewportConfig, c5 as ViewportOrientation, c6 as ViewportPreset, c7 as VignetteConfig, c8 as applySurface, c9 as calculateDuration, ca as calculateFontScale, cb as createTemplateContext, cc as createTheme, cd as createThemeRegistry, ce as getAspectRatioString, cf as getBlockAtTime, cg as getCaptionAtTime, ch as getDocPlaybackDuration, ci as getLayoutHints, cj as getSafeTextBounds, ck as getSegmentAtTime, cl as getTwoColumnPositions, cm as getViewport, cn as getViewportOrientation, co as isCustomTemplateDefinition, cp as isMotionProfileName, cq as isPersistentLayerTemplate, cr as isTemplateBlock, cs as layoutScaledFontSize, ct as readFrontmatterMotion, cu as resolveMediaSchedule, cv as resolveMotionForDoc, cw as resolveMotionProfile, cx as scaledFontSize, cy as scheduleMediaClip, cz as validateCustomTemplateDefinition } from '../Doc-C7iCmmmF.js';
5
- export { D as DEFAULT_THEME, a as DEFAULT_THEME_ID, T as THEMES, g as getAvailableThemes, b as getThemeSummaries, r as resolveTheme } from '../themeLibrary-DsntZLoa.js';
3
+ import { Q as Doc, bA as Theme, bD as ThemePageStyle, bC as ThemeColorScheme, K as DeepPartial, bG as ThemeSeedColors, bB as ThemeColorPalette, _ as FontFamilyKind, Z as FontFamily } from '../Doc-CYTLtFEu.js';
4
+ export { A as AccentImage, a as AccentPosition, b as AmbientGradientConfig, c as Animation, d as AnimationType, e as AreaChartInput, f as AudioBookmark, g as AudioSegment, h as AudioTimingData, i as AudioTrack, B as BarChartInput, j as BigTextInput, k as Block, l as BlockConnection, m as BorderStyle, C as CaptionPhrase, n as CaptionTrack, o as CaptionWord, p as ChartBaseFields, q as ChartTemplateInput, r as ColorScheme, s as ColumnChartInput, t as ComparisonBarInput, u as ContentBlockInput, v as CornerBrandingConfig, w as CountUpSpec, x as CreateTemplateContextOptions, y as CustomTemplateDefinition, z as CustomTemplateLayer, D as CustomTemplateValidationError, E as CustomTemplateValidationResult, F as DARK_SURFACE, G as DEFAULT_DOC_FONT, H as DEFAULT_TITLE_FONT, I as DataTableInput, J as DateEventInput, L as DefinitionCardInput, M as DiagramBlockInput, N as DiagramEdgeAnchor, O as DiagramTemplateEdge, P as DiagramTemplateNode, R as DocBlock, S as DocDiagnostic, T as DonutChartInput, U as DrawingBlockInput, V as FRONTMATTER_CUSTOM_TEMPLATES_KEY, W as FRONTMATTER_CUSTOM_THEMES_KEY, X as FRONTMATTER_MOTION_KEY, Y as FactCardInput, $ as FullBleedQuoteInput, a0 as GradientBackgroundConfig, a1 as ImageBackgroundConfig, a2 as ImageLayer, a3 as ImageTreatment, a4 as ImageWithCaptionInput, a5 as LIGHT_SURFACE, a6 as Layer, a7 as LayerRepeat, a8 as LayoutHints, a9 as LeftFeatureInput, aa as LineChartInput, ab as LinearGradient, ac as ListBlockInput, ad as MOTION_PROFILES, ae as MapBlockInput, af as MapLayer, ag as MapMarker, ah as MapTileStyle, ai as MarkerStyle, aj as MediaClip, ak as MediaCrop, al as MediaCut, am as MediaEdits, an as MediaScheduleOptions, ao as MermaidLayer, ap as MotionEntrance, aq as MotionOrigin, ar as MotionProfile, as as MotionProfileName, at as MotionSpec, au as MotionState, av as PAGE_ACCENT_STRATEGIES, aw as PAGE_BACKGROUNDS, ax as PAGE_BACKGROUND_RHYTHMS, ay as PAGE_DESIGN_FAMILIES, az as PAGE_DIVIDERS, aA as PAGE_EMPHASES, aB as PAGE_EYEBROWS, aC as PAGE_HEADING_CASES, aD as PAGE_HEADING_SCALES, aE as PAGE_HEADING_UNDERLINES, aF as PAGE_HERO_STYLES, aG as PAGE_IMAGE_FRAMINGS, aH as PAGE_NUMERAL_STYLES, aI as PAGE_PATTERNS, aJ as PAGE_QUOTE_MARKS, aK as PAGE_SECTION_KINDS, aL as PAGE_SECTION_SPACINGS, aM as PAGE_SHADOWS, aN as PAGE_VARIANTS, aO as PageAccentRotation, aP as PageBackground, aQ as PageDesignFamily, aR as PageEmphasis, aS as PageHeadingTreatment, aT as PageSectionKind, aU as PageSectionOverride, aV as PageTokens, aW as PageVariant, aX as PathLayer, aY as PatternBackgroundConfig, aZ as PersistentLayer, a_ as PersistentLayerConfig, a$ as PersistentLayerTemplate, b0 as PersistentLayerTemplateConfig, b1 as PersistentLayerTemplateType, b2 as PhotoGridInput, b3 as PieChartInput, b4 as PipStyle, b5 as Position, b6 as ProgressIndicatorConfig, b7 as PromotedBodyAnnotation, b8 as PullQuoteInput, b9 as QuoteBlockInput, ba as RawLayersInput, bb as RenderStyle, bc as RightFeatureInput, bd as ScatterChartInput, be as ScheduledClip, bf as SectionHeaderInput, bg as ShapeFilter, bh as ShapeLayer, bi as ShapePattern, bj as SolidBackgroundConfig, bk as StartBlockConfig, bl as StatHighlightInput, bm as SurfaceScheme, bn as SvgLayer, bo as THEME_SCHEMA_VERSION, bp as TableLayer, bq as TableLayerStyle, br as TemplateBlock, bs as TemplateContext, bt as TemplateFunction, bu as TemplateRegistry, bv as TextFlow, bw as TextLayer, bx as TextParagraph, by as TextParagraphList, bz as TextStyle, bE as ThemeRegistry, bF as ThemeSchemaVersion, bH as ThemeStyle, bI as ThemeTypography, bJ as TimelineBlockInput, bK as TimelineTemplateEvent, bL as TimelineTemplateLink, bM as TimelineTemplateTrack, bN as TitleBlockInput, bO as TitleCaptionConfig, bP as TranscriptBlockInput, bQ as TreeBlockInput, bR as TreeLayer, bS as TreeLayerItem, bT as TreeLayerStyle, bU as TreeTemplateItem, bV as TwoColumnInput, bW as VIEWPORT_PRESETS, bX as VideoEmbedLayer, bY as VideoLayer, bZ as VideoPipPosition, b_ as VideoPipShape, b$ as VideoPipSize, c0 as VideoPlacement, c1 as VideoPresentation, c2 as VideoPullQuoteInput, c3 as VideoWithCaptionInput, c4 as ViewportConfig, c5 as ViewportOrientation, c6 as ViewportPreset, c7 as VignetteConfig, c8 as applySurface, c9 as calculateDuration, ca as calculateFontScale, cb as createTemplateContext, cc as createTheme, cd as createThemeRegistry, ce as getAspectRatioString, cf as getBlockAtTime, cg as getCaptionAtTime, ch as getDocPlaybackDuration, ci as getLayoutHints, cj as getSafeTextBounds, ck as getSegmentAtTime, cl as getTwoColumnPositions, cm as getViewport, cn as getViewportOrientation, co as isCustomTemplateDefinition, cp as isMotionProfileName, cq as isPersistentLayerTemplate, cr as isTemplateBlock, cs as layoutScaledFontSize, ct as readFrontmatterMotion, cu as resolveMediaSchedule, cv as resolveMotionForDoc, cw as resolveMotionProfile, cx as scaledFontSize, cy as scheduleMediaClip, cz as validateCustomTemplateDefinition } from '../Doc-CYTLtFEu.js';
5
+ export { D as DEFAULT_THEME, a as DEFAULT_THEME_ID, T as THEMES, g as getAvailableThemes, b as getThemeSummaries, r as resolveTheme } from '../themeLibrary-CMm_jh3a.js';
6
6
  export { M as MediaEntry, a as MediaProvider } from '../MediaProvider-wpSe21B3.js';
7
- export { E as EditorLayerMeta, I as ImageEditCanvas, a as ImageEditDoc, b as ImageEditLayer, c as ImageEditLayerKind, d as ImageEditMeta } from '../ImageEditDoc-CxRHe41J.js';
7
+ export { E as EditorLayerMeta, I as ImageEditCanvas, a as ImageEditDoc, b as ImageEditLayer, c as ImageEditLayerKind, d as ImageEditMeta } from '../ImageEditDoc-DZ4k_O10.js';
8
8
 
9
9
  /**
10
10
  * Runtime validation for the canonical {@link Doc} JSON shape.
@@ -13,7 +13,7 @@ import {
13
13
  pipStyleVars,
14
14
  serializeTheme,
15
15
  validateDocSchema
16
- } from "../chunk-5SVFLLOD.js";
16
+ } from "../chunk-ISVJ42I3.js";
17
17
  import {
18
18
  defaultPageStyle,
19
19
  getDocPlaybackDuration,
@@ -1,4 +1,4 @@
1
- import { bA as Theme, bE as ThemeRegistry } from './Doc-C7iCmmmF.js';
1
+ import { bA as Theme, bE as ThemeRegistry } from './Doc-CYTLtFEu.js';
2
2
 
3
3
  /**
4
4
  * Built-in Theme Library
@@ -1,4 +1,4 @@
1
- import { g as AudioSegment, h as AudioTimingData, n as CaptionTrack } from '../Doc-C7iCmmmF.js';
1
+ import { g as AudioSegment, h as AudioTimingData, n as CaptionTrack } from '../Doc-CYTLtFEu.js';
2
2
  import '../types-Zk8qYuaT.js';
3
3
 
4
4
  /**
@@ -1,5 +1,5 @@
1
- import { Q as Doc, r as ColorScheme, k as Block, br as TemplateBlock } from '../Doc-C7iCmmmF.js';
2
- import { i as PageTransformHints } from '../materializePageSection-_5uQrEYP.js';
1
+ import { Q as Doc, r as ColorScheme, k as Block, br as TemplateBlock } from '../Doc-CYTLtFEu.js';
2
+ import { i as PageTransformHints } from '../materializePageSection-CDps_xUd.js';
3
3
  import { d as ExtractionType, E as ExtractedElement, b as ExtractionOptions } from '../contentExtractor-BNfVJV2U.js';
4
4
  import { f as BuildSpec } from '../types-Zk8qYuaT.js';
5
5
 
@@ -24,8 +24,8 @@ import {
24
24
  serializePresentationPlan,
25
25
  transformNarratedSegment,
26
26
  usesDynamicPresentation
27
- } from "../chunk-DCO5GYVW.js";
28
- import "../chunk-ITLJQG7Z.js";
27
+ } from "../chunk-FUQYQWQR.js";
28
+ import "../chunk-YY3OQ3MI.js";
29
29
  import "../chunk-HGCIIXHP.js";
30
30
  import "../chunk-SVN7T6BK.js";
31
31
  import "../chunk-FUBMT6SJ.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bendyline/squisq",
3
- "version": "2.13.1",
3
+ "version": "2.13.2",
4
4
  "description": "Headless utilities for doc/block rendering, spatial math, Markdown, and storage",
5
5
  "license": "MIT",
6
6
  "author": "Bendyline",