@bendyline/squisq 2.11.8 → 2.11.10

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 (31) hide show
  1. package/dist/{Doc-CynsGqL4.d.ts → Doc-BWtfp7dT.d.ts} +218 -3
  2. package/dist/{ImageEditDoc-BVZe_5y4.d.ts → ImageEditDoc-CYRQK8so.d.ts} +1 -1
  3. package/dist/{chunk-YNO6JV36.js → chunk-2SRF5III.js} +4 -4
  4. package/dist/{chunk-VU4T74LI.js → chunk-7WN7DDMI.js} +1 -1
  5. package/dist/{chunk-5FBI3ZW4.js → chunk-BVQZCKXN.js} +2 -2
  6. package/dist/{chunk-JM2QARY2.js → chunk-CPQCZUBW.js} +311 -19
  7. package/dist/{chunk-JJO6JFNZ.js → chunk-HVJ6VFDX.js} +2 -2
  8. package/dist/{chunk-Y4D6TDZT.js → chunk-PFH3WV6J.js} +145 -3
  9. package/dist/{chunk-ZEONJCP3.js → chunk-PWCIJHZH.js} +1 -1
  10. package/dist/{chunk-KFZOCWPK.js → chunk-RV5OOBSV.js} +2 -2
  11. package/dist/{chunk-RMCUZDW5.js → chunk-TYW5VMNP.js} +366 -111
  12. package/dist/doc/index.d.ts +108 -7
  13. package/dist/doc/index.js +31 -5
  14. package/dist/fence/index.d.ts +1 -1
  15. package/dist/generate/index.d.ts +1 -1
  16. package/dist/imageEdit/index.d.ts +3 -3
  17. package/dist/index.d.ts +5 -5
  18. package/dist/index.js +49 -9
  19. package/dist/jsonForm/index.d.ts +1 -1
  20. package/dist/jsonForm/index.js +4 -4
  21. package/dist/{materializePageSection-CAJoa8fh.d.ts → materializePageSection-Db7pABI0.d.ts} +6 -3
  22. package/dist/mediaEdit/index.d.ts +2 -2
  23. package/dist/narration/index.d.ts +1 -1
  24. package/dist/narration/index.js +4 -4
  25. package/dist/schemas/index.d.ts +4 -4
  26. package/dist/schemas/index.js +17 -3
  27. package/dist/{themeLibrary-z7t3x5CU.d.ts → themeLibrary-Bphz1CRp.d.ts} +1 -1
  28. package/dist/timing/index.d.ts +1 -1
  29. package/dist/transform/index.d.ts +2 -2
  30. package/dist/transform/index.js +3 -3
  31. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  buildNarrationScript,
3
3
  parseNarrationTimingJson
4
- } from "./chunk-ZEONJCP3.js";
4
+ } from "./chunk-PWCIJHZH.js";
5
5
  import {
6
6
  SHAPE_NAMES,
7
7
  buildChartData,
@@ -32,7 +32,7 @@ import {
32
32
  templateRegistry,
33
33
  writeCustomTemplatesToFrontmatter,
34
34
  writeCustomThemesToFrontmatter
35
- } from "./chunk-RMCUZDW5.js";
35
+ } from "./chunk-TYW5VMNP.js";
36
36
  import {
37
37
  ASCII_TREE_VOCAB,
38
38
  ASCII_VOCAB,
@@ -56,7 +56,7 @@ import {
56
56
  import {
57
57
  defaultPageStyle,
58
58
  resolveMediaSchedule
59
- } from "./chunk-YNO6JV36.js";
59
+ } from "./chunk-2SRF5III.js";
60
60
  import {
61
61
  DEFAULT_THEME,
62
62
  FRONTMATTER_CUSTOM_TEMPLATES_KEY,
@@ -73,7 +73,7 @@ import {
73
73
  resolveFontFamily,
74
74
  resolveTheme,
75
75
  withAlpha
76
- } from "./chunk-Y4D6TDZT.js";
76
+ } from "./chunk-PFH3WV6J.js";
77
77
  import {
78
78
  createMediaTimeMap
79
79
  } from "./chunk-JSGIWW35.js";
@@ -133,10 +133,63 @@ function getAnimationClassName(animation) {
133
133
  return "anim-panRight";
134
134
  case "typewriter":
135
135
  return "anim-typewriter";
136
+ case "fadeInUp":
137
+ return "anim-fadeInUp";
138
+ case "slideIn":
139
+ return `anim-slideIn-${animation.origin && animation.origin !== "center" ? animation.origin : "left"}`;
140
+ case "wordReveal":
141
+ return "anim-wordReveal";
142
+ case "countUp":
143
+ return "anim-countUp";
144
+ case "drawOn":
145
+ return "anim-drawOn";
146
+ case "grow":
147
+ return growClassName(animation.origin);
148
+ case "reveal":
149
+ if (animation.shape === "iris") return "anim-reveal-iris";
150
+ return `anim-reveal-${animation.origin && animation.origin !== "center" ? animation.origin : "left"}`;
151
+ case "drift":
152
+ return "anim-drift";
153
+ case "tween":
154
+ return "anim-tween";
136
155
  default:
137
156
  return "";
138
157
  }
139
158
  }
159
+ function growClassName(origin) {
160
+ switch (origin) {
161
+ case "left":
162
+ case "right":
163
+ return "anim-grow-x";
164
+ case "top":
165
+ case "bottom":
166
+ return "anim-grow-y";
167
+ default:
168
+ return "anim-grow";
169
+ }
170
+ }
171
+ function transformOriginFor(origin) {
172
+ switch (origin) {
173
+ case "left":
174
+ return "left center";
175
+ case "right":
176
+ return "right center";
177
+ case "top":
178
+ return "center top";
179
+ case "bottom":
180
+ return "center bottom";
181
+ default:
182
+ return "center center";
183
+ }
184
+ }
185
+ function motionStateTransform(state) {
186
+ if (!state) return "none";
187
+ const parts = [];
188
+ if (state.x || state.y) parts.push(`translate(${state.x ?? 0}px, ${state.y ?? 0}px)`);
189
+ if (state.rotate) parts.push(`rotate(${state.rotate}deg)`);
190
+ if (state.scale != null && state.scale !== 1) parts.push(`scale(${state.scale})`);
191
+ return parts.length > 0 ? parts.join(" ") : "none";
192
+ }
140
193
  function getAnimationCSSVars(animation) {
141
194
  const vars = {};
142
195
  if (animation.duration !== void 0) {
@@ -148,8 +201,32 @@ function getAnimationCSSVars(animation) {
148
201
  if (animation.easing) {
149
202
  vars["--anim-easing"] = animation.easing;
150
203
  }
204
+ if (animation.type === "grow" || animation.type === "reveal") {
205
+ vars["--anim-origin"] = transformOriginFor(animation.origin);
206
+ }
207
+ if (animation.type === "wordReveal") {
208
+ vars["--anim-stagger"] = `${animation.stagger ?? DEFAULT_WORD_STAGGER}s`;
209
+ }
210
+ if (animation.type === "tween") {
211
+ vars["--tween-from-transform"] = motionStateTransform(animation.fromState);
212
+ vars["--tween-to-transform"] = motionStateTransform(animation.toState);
213
+ vars["--tween-from-opacity"] = `${animation.fromState?.opacity ?? 1}`;
214
+ vars["--tween-to-opacity"] = `${animation.toState?.opacity ?? 1}`;
215
+ }
151
216
  return vars;
152
217
  }
218
+ var DEFAULT_WORD_STAGGER = 0.08;
219
+ function wordRevealDelay(animation, index) {
220
+ const base = animation.delay ?? 0;
221
+ const times = animation.wordTimes;
222
+ if (times && times.length > 0) {
223
+ if (index < times.length) return times[index];
224
+ const last = times[times.length - 1];
225
+ const step = times.length > 1 ? Math.max(0.02, last - times[times.length - 2]) : animation.stagger ?? DEFAULT_WORD_STAGGER;
226
+ return last + step * (index - times.length + 1);
227
+ }
228
+ return base + (animation.stagger ?? DEFAULT_WORD_STAGGER) * index;
229
+ }
153
230
  function getDefaultAnimationDuration(type) {
154
231
  switch (type) {
155
232
  case "slowZoom":
@@ -165,6 +242,19 @@ function getDefaultAnimationDuration(type) {
165
242
  case "zoomIn":
166
243
  case "zoomOut":
167
244
  return 0.5;
245
+ case "fadeInUp":
246
+ case "slideIn":
247
+ case "reveal":
248
+ return 0.7;
249
+ case "grow":
250
+ case "drawOn":
251
+ return 1;
252
+ case "countUp":
253
+ return 1.5;
254
+ case "wordReveal":
255
+ return 0.4;
256
+ case "drift":
257
+ return 12;
168
258
  default:
169
259
  return 1;
170
260
  }
@@ -1472,10 +1562,42 @@ var sectionExtractors = {
1472
1562
  };
1473
1563
 
1474
1564
  // src/doc/page/materializePageSection.ts
1475
- function resolvePageStyle(theme, hints) {
1565
+ function resolvePageStyle(theme, hints, variant = "page") {
1476
1566
  const base = theme?.pageStyle ?? defaultPageStyle(theme ?? DEFAULT_THEME);
1477
- if (!hints?.spacing || hints.spacing === base.tokens.sectionSpacing) return base;
1478
- return { ...base, tokens: { ...base.tokens, sectionSpacing: hints.spacing } };
1567
+ const spaced = !hints?.spacing || hints.spacing === base.tokens.sectionSpacing ? base : { ...base, tokens: { ...base.tokens, sectionSpacing: hints.spacing } };
1568
+ return variant === "document" ? documentPageStyle(spaced) : spaced;
1569
+ }
1570
+ function withoutBackgrounds(overrides) {
1571
+ const out = {};
1572
+ for (const [key, override] of Object.entries(overrides)) {
1573
+ if (!override) continue;
1574
+ const { background: _background, ...rest } = override;
1575
+ out[key] = rest;
1576
+ }
1577
+ return out;
1578
+ }
1579
+ function documentPageStyle(style) {
1580
+ return {
1581
+ family: style.family,
1582
+ tokens: {
1583
+ ...style.tokens,
1584
+ cornerRadius: Math.min(style.tokens.cornerRadius, 6),
1585
+ sectionSpacing: "compact",
1586
+ divider: "none",
1587
+ backgroundRhythm: "flat",
1588
+ headingTreatment: { eyebrow: "kicker", scale: "regular", case: "none", underline: "none" },
1589
+ shadow: "none",
1590
+ quoteMark: "accent-bar",
1591
+ numeralStyle: "plain",
1592
+ pattern: "none"
1593
+ },
1594
+ ...style.sections ? { sections: withoutBackgrounds(style.sections) } : {},
1595
+ ...style.templates ? { templates: withoutBackgrounds(style.templates) } : {},
1596
+ accentRotation: { strategy: "primary-only" }
1597
+ };
1598
+ }
1599
+ function isAutoPickedOnly(block) {
1600
+ return block.autoTemplate === true && !block.sourceHeading?.templateAnnotation?.template && !block.promotedBodyAnnotation;
1479
1601
  }
1480
1602
  var ACCENT_KINDS = /* @__PURE__ */ new Set([
1481
1603
  "banner",
@@ -1547,8 +1669,9 @@ function preserveRichContent(block, draft, widgetFenceLangs) {
1547
1669
  const richContent = unconsumedRichContent(block, draft, widgetFenceLangs);
1548
1670
  return richContent ? { ...draft, slots: { ...draft.slots, richContent } } : draft;
1549
1671
  }
1550
- function draftForBlock(block, viewport, customTemplates, widgetFenceLangs) {
1551
- if (isTemplatedPageBlock(block)) {
1672
+ function draftForBlock(block, viewport, customTemplates, widgetFenceLangs, variant = "page") {
1673
+ const autoPickedInDocument = variant === "document" && isAutoPickedOnly(block);
1674
+ if (isTemplatedPageBlock(block) && !autoPickedInDocument) {
1552
1675
  const resolved = resolvePageBlock(block);
1553
1676
  const templateName = resolved.templateName;
1554
1677
  const extractor = sectionExtractors[templateName];
@@ -1684,8 +1807,14 @@ function rotationSchemeNames(pageStyle, theme) {
1684
1807
  function materializePageSection(block, options = {}) {
1685
1808
  const theme = options.theme ?? DEFAULT_THEME;
1686
1809
  const viewport = options.viewport ?? VIEWPORT_PRESETS.landscape;
1687
- const pageStyle = resolvePageStyle(theme);
1688
- const result = draftForBlock(block, viewport, options.customTemplates, options.widgetFenceLangs);
1810
+ const pageStyle = resolvePageStyle(theme, void 0, options.variant);
1811
+ const result = draftForBlock(
1812
+ block,
1813
+ viewport,
1814
+ options.customTemplates,
1815
+ options.widgetFenceLangs,
1816
+ options.variant
1817
+ );
1689
1818
  const override = overrideFor(pageStyle, result.draft.kind, result.templateName);
1690
1819
  const background = override?.background ?? (result.draft.mediaBackground ? "media" : "base");
1691
1820
  const emphasis = override?.emphasis ?? result.draft.emphasis ?? "standard";
@@ -1709,14 +1838,39 @@ function materializePageSection(block, options = {}) {
1709
1838
  diagnostic: result.diagnostic
1710
1839
  };
1711
1840
  }
1841
+ function dedupeDocumentMasthead(seeds) {
1842
+ const cover = seeds[0];
1843
+ const first = seeds[1];
1844
+ const slots = { ...first.draft.slots };
1845
+ if ((slots.headingLevel ?? 1) > 1) {
1846
+ seeds.splice(0, 1);
1847
+ return;
1848
+ }
1849
+ const markdown = slots.body?.markdown;
1850
+ const lead = markdown?.[0];
1851
+ const subtitle = cover.draft.slots.subtitle;
1852
+ if (subtitle && lead?.type === "paragraph" && extractPlainText(lead) === subtitle) {
1853
+ const { subtitle: _mirrored, ...coverSlots } = cover.draft.slots;
1854
+ cover.draft = { ...cover.draft, slots: coverSlots };
1855
+ }
1856
+ delete slots.title;
1857
+ delete slots.headingLevel;
1858
+ if (markdown && markdown.length > 0) {
1859
+ first.draft = { ...first.draft, slots };
1860
+ } else {
1861
+ seeds.splice(1, 1);
1862
+ }
1863
+ }
1712
1864
  function materializePageSections(doc, options = {}) {
1713
1865
  const theme = options.theme ?? DEFAULT_THEME;
1714
1866
  const viewport = options.viewport ?? VIEWPORT_PRESETS.landscape;
1715
- const pageStyle = resolvePageStyle(theme, options.transformPage);
1867
+ const variant = options.variant ?? "page";
1868
+ const pageStyle = resolvePageStyle(theme, options.transformPage, variant);
1716
1869
  const customTemplates = options.customTemplates ?? doc.customTemplates;
1717
1870
  const seeds = [];
1718
1871
  if (options.cover) {
1719
1872
  const cover = options.cover;
1873
+ const heroSrc = variant === "document" ? void 0 : cover.heroSrc;
1720
1874
  seeds.push({
1721
1875
  draft: {
1722
1876
  kind: "hero",
@@ -1724,16 +1878,16 @@ function materializePageSections(doc, options = {}) {
1724
1878
  slots: {
1725
1879
  title: cover.title,
1726
1880
  subtitle: cover.subtitle,
1727
- media: cover.heroSrc ? {
1881
+ media: heroSrc ? {
1728
1882
  type: "image",
1729
- src: cover.heroSrc,
1883
+ src: heroSrc,
1730
1884
  alt: cover.heroAlt ?? "",
1731
1885
  credit: cover.heroCredit,
1732
1886
  license: cover.heroLicense
1733
1887
  } : void 0
1734
1888
  },
1735
1889
  emphasis: "lead",
1736
- mediaBackground: !!cover.heroSrc
1890
+ mediaBackground: !!heroSrc
1737
1891
  },
1738
1892
  source: "cover",
1739
1893
  depth: 0
@@ -1741,7 +1895,13 @@ function materializePageSections(doc, options = {}) {
1741
1895
  }
1742
1896
  const walk = (blocks, depth) => {
1743
1897
  for (const block of blocks) {
1744
- const result = draftForBlock(block, viewport, customTemplates, options.widgetFenceLangs);
1898
+ const result = draftForBlock(
1899
+ block,
1900
+ viewport,
1901
+ customTemplates,
1902
+ options.widgetFenceLangs,
1903
+ variant
1904
+ );
1745
1905
  seeds.push({ ...result, block, depth });
1746
1906
  const consumed = result.draft.kind === "canvas-embed" && isContainerTemplate(result.templateName);
1747
1907
  if (!consumed && block.children && block.children.length > 0) {
@@ -1764,6 +1924,8 @@ function materializePageSections(doc, options = {}) {
1764
1924
  };
1765
1925
  }
1766
1926
  seeds.splice(0, 1);
1927
+ } else if (variant === "document" && first.draft.kind === "prose" && first.draft.slots.title === cover.title) {
1928
+ dedupeDocumentMasthead(seeds);
1767
1929
  } else if (first.draft.kind === "prose" && first.draft.slots.title === cover.title) {
1768
1930
  const slots = { ...first.draft.slots };
1769
1931
  delete slots.title;
@@ -1921,6 +2083,7 @@ var NARROW_RULES = `
1921
2083
  .squisq-page-feature { grid-template-columns: 1fr; }
1922
2084
  .squisq-page-feature--media-right .squisq-page-feature-media { order: 0; }
1923
2085
  .squisq-page-stats { flex-direction: column; gap: 1.75rem; }
2086
+ .squisq-page-stats > .squisq-page-stat { flex: 0 0 auto; max-width: none; }
1924
2087
  .squisq-page-cards { grid-template-columns: 1fr; }
1925
2088
  .squisq-page-gallery { grid-template-columns: repeat(2, 1fr); }
1926
2089
  .squisq-page-milestone { grid-template-columns: 1fr; gap: 0.5rem; }
@@ -2288,10 +2451,14 @@ var PAGE_BASE_CSS = `
2288
2451
  font-size: 1.15em;
2289
2452
  }
2290
2453
  /* Item bodies are rendered markdown: neutralize UA paragraph margins (which
2291
- would otherwise push the first line below the marker) and space blocks. */
2454
+ would otherwise push the first line below the marker) and space blocks.
2455
+ MarkdownRenderer wraps its blocks in a .squisq-md div, so the paragraphs
2456
+ are grandchildren. */
2292
2457
  .squisq-page-item-body { min-width: 0; }
2293
- .squisq-page-item-body > * { margin: 0; }
2294
- .squisq-page-item-body > * + * { margin-top: 0.6em; }
2458
+ .squisq-page-item-body > *,
2459
+ .squisq-page-item-body > .squisq-md > * { margin: 0; }
2460
+ .squisq-page-item-body > * + *,
2461
+ .squisq-page-item-body > .squisq-md > * + * { margin-top: 0.6em; }
2295
2462
  .squisq-page[data-numerals='mono'] .squisq-page-items li::before { font-family: var(--squisq-page-mono-font); }
2296
2463
  .squisq-page-items-title { font-size: 1.9rem; }
2297
2464
 
@@ -2439,6 +2606,127 @@ var PAGE_BASE_CSS = `
2439
2606
  .squisq-page--thumbnail-images .squisq-page-prose img,
2440
2607
  .squisq-page--thumbnail-images .squisq-page-figure img { max-width: 100px; max-height: 100px; object-fit: cover; }
2441
2608
 
2609
+ /* \u2500\u2500 Document variant \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
2610
+ /* The working-document register (reports, notes, previews). Sizes are in em
2611
+ * so one host font-size scales the whole page, and a section's title is
2612
+ * sized by its markdown heading level (data-heading-level), never by which
2613
+ * section kind happens to carry it. Rules that must beat a page rule keyed
2614
+ * on a token attribute repeat .squisq-page for specificity. */
2615
+ .squisq-page--document { --squisq-page-divider-color: color-mix(in srgb, var(--squisq-page-text) 14%, transparent); }
2616
+ .squisq-page--document .squisq-page-section { padding-block: 0.4em; }
2617
+ .squisq-page--document .squisq-page-section .squisq-page-section-inner { max-width: var(--squisq-page-content-max); }
2618
+ .squisq-page--document > .squisq-page-section:is([data-heading-level='3'], [data-heading-level='4'], [data-heading-level='5'], [data-heading-level='6']) { padding-top: 1em; }
2619
+ /* A top-level heading opens with a hairline set in the text column, like the
2620
+ * masthead's, rather than a full-bleed section border. */
2621
+ .squisq-page.squisq-page--document > .squisq-page-section:is([data-heading-level='1'], [data-heading-level='2']) { margin-top: 0.8em; }
2622
+ .squisq-page.squisq-page--document > .squisq-page-section:is([data-heading-level='1'], [data-heading-level='2']) > .squisq-page-section-inner::before {
2623
+ content: '';
2624
+ display: block;
2625
+ margin-bottom: 1.1em;
2626
+ border-top: 1px solid var(--squisq-page-divider-color);
2627
+ }
2628
+ .squisq-page.squisq-page--document > .squisq-page-section:first-of-type,
2629
+ .squisq-page.squisq-page--document > .squisq-page-section--hero + .squisq-page-section { margin-top: 0; }
2630
+ .squisq-page.squisq-page--document > .squisq-page-section:first-of-type > .squisq-page-section-inner::before,
2631
+ .squisq-page.squisq-page--document > .squisq-page-section--hero + .squisq-page-section > .squisq-page-section-inner::before { display: none; }
2632
+ .squisq-page--document > .squisq-page-section:first-of-type { padding-top: 1em; }
2633
+ .squisq-page--document > .squisq-page-section:last-of-type { padding-bottom: 1.25em; }
2634
+ /* Thin margins hug the host's container, which supplies the outer inset. */
2635
+ .squisq-page--document.squisq-page--thin > .squisq-page-section:first-of-type { padding-top: 0; }
2636
+ .squisq-page--document.squisq-page--thin > .squisq-page-section:last-of-type { padding-bottom: 0; }
2637
+
2638
+ /* Masthead: the cover as a left-aligned document title over a hairline. */
2639
+ .squisq-page.squisq-page--document .squisq-page-section--hero { padding-block: 1em 0.6em; }
2640
+ .squisq-page.squisq-page--document .squisq-page-hero-body {
2641
+ text-align: left;
2642
+ padding-bottom: 0.55em;
2643
+ border-bottom: 1px solid var(--squisq-page-divider-color);
2644
+ }
2645
+ .squisq-page.squisq-page--document .squisq-page-hero-title { font-size: 1.6em; line-height: 1.2; letter-spacing: normal; text-transform: none; }
2646
+ .squisq-page.squisq-page--document .squisq-page-hero-subtitle { margin: 0.35em 0 0; font-size: 1em; max-width: none; }
2647
+ .squisq-page.squisq-page--document .squisq-page-section--hero-media { min-height: 12em; }
2648
+ .squisq-page.squisq-page--document .squisq-page-section--hero-media .squisq-page-section-inner { padding-block: 1.25em; }
2649
+ .squisq-page.squisq-page--document .squisq-page-section--hero-media .squisq-page-hero-body { border-bottom: none; }
2650
+
2651
+ /* One heading scale for prose headings and typed-section titles alike. */
2652
+ .squisq-page--document .squisq-page-section-title { font-size: 1.3em; line-height: 1.25; margin: 0 0 0.45em; text-align: left; }
2653
+ .squisq-page--document [data-heading-level='1'] .squisq-page-section-title { font-size: 1.6em; }
2654
+ .squisq-page--document [data-heading-level='3'] .squisq-page-section-title { font-size: 1.1em; }
2655
+ .squisq-page--document :is([data-heading-level='4'], [data-heading-level='5'], [data-heading-level='6']) .squisq-page-section-title { font-size: 1em; }
2656
+ .squisq-page--document .squisq-page-prose :is(h1, h2, h3, h4, h5, h6) { line-height: 1.25; margin: 0; }
2657
+ .squisq-page--document .squisq-page-prose h1 { font-size: 1.6em; }
2658
+ .squisq-page--document .squisq-page-prose h2 { font-size: 1.3em; }
2659
+ .squisq-page--document .squisq-page-prose h3 { font-size: 1.1em; }
2660
+ .squisq-page--document .squisq-page-prose :is(h4, h5, h6) { font-size: 1em; }
2661
+ .squisq-page--document .squisq-page-eyebrow { font-size: 0.72em; letter-spacing: 0.1em; margin-bottom: 0.5em; }
2662
+
2663
+ /* Prose */
2664
+ .squisq-page--document .squisq-page-prose { font-size: 1em; }
2665
+ /* A prose section is a heading wrapper then a body wrapper (.squisq-md each). */
2666
+ .squisq-page--document .squisq-page-prose > .squisq-md + .squisq-md { margin-top: 0.4em; }
2667
+ .squisq-page--document .squisq-page-prose > .squisq-md > * + * { margin-top: 0.75em; }
2668
+ .squisq-page--document .squisq-page-prose > .squisq-md > :last-child { margin-bottom: 0; }
2669
+ .squisq-page--document .squisq-page-prose p + p { margin-top: 0.75em; }
2670
+ .squisq-page--document .squisq-page-prose li + li { margin-top: 0.25em; }
2671
+ .squisq-page--document .squisq-page-prose :is(ul, ol) :is(ul, ol) { margin-top: 0.25em; }
2672
+ .squisq-page--document .squisq-page-prose code { font-size: 0.88em; }
2673
+ .squisq-page--document .squisq-page-prose pre { padding: 0.7em 0.9em; }
2674
+ .squisq-page--document .squisq-md-code-frame { margin: 0.75em 0; }
2675
+ .squisq-page--document .squisq-page-prose blockquote { border-left-width: 3px; padding-left: 1em; }
2676
+ .squisq-page--document .squisq-page-prose hr { margin-block: 1.25em; }
2677
+ .squisq-page--document :is(.squisq-page-prose, .squisq-page-table-section) table { font-size: 0.93em; }
2678
+ .squisq-page--document .squisq-page-prose th,
2679
+ .squisq-page--document .squisq-page-table th {
2680
+ font-family: var(--squisq-page-body-font);
2681
+ font-weight: 600;
2682
+ padding: 0.45em 0.7em;
2683
+ }
2684
+ .squisq-page--document .squisq-page-prose td,
2685
+ .squisq-page--document .squisq-page-table td { padding: 0.4em 0.7em; }
2686
+ .squisq-page--document .squisq-page-rich-content { margin-top: 1em; padding-top: 0.75em; }
2687
+
2688
+ /* Typed sections an author asked for, at document scale. */
2689
+ .squisq-page--document .squisq-page-section-inner > :first-child { margin-top: 0; }
2690
+ .squisq-page--document .squisq-page-stats { justify-content: flex-start; text-align: left; gap: 1.5em; }
2691
+ .squisq-page--document .squisq-page-stat { flex: 1 1 10em; }
2692
+ .squisq-page.squisq-page--document .squisq-page-stat-value { font-size: 1.9em; }
2693
+ .squisq-page--document .squisq-page-stat-title { margin-top: 0.35em; font-size: 1em; }
2694
+ .squisq-page--document .squisq-page-stat-body { margin-top: 0.2em; font-size: 0.9em; }
2695
+ .squisq-page--document .squisq-page-stat-meta { margin-top: 0.75em; text-align: left; font-size: 0.85em; }
2696
+ .squisq-page.squisq-page--document .squisq-page-quote { font-size: 1.15em; line-height: 1.45; }
2697
+ .squisq-page.squisq-page--document .squisq-page-quote-figure {
2698
+ border: none;
2699
+ border-left: 3px solid var(--squisq-page-accent);
2700
+ padding: 0 0 0 1em;
2701
+ text-align: left;
2702
+ }
2703
+ .squisq-page--document .squisq-page-quote-attribution { margin-top: 0.6em; font-size: 0.9em; }
2704
+ .squisq-page.squisq-page--document .squisq-page-section--quote-band.squisq-page-section--bg-media { min-height: 10em; }
2705
+ .squisq-page.squisq-page--document .squisq-page-section--banner.squisq-page-section--bg-media { min-height: 9em; }
2706
+ .squisq-page--document .squisq-page-feature { gap: 1.5em; }
2707
+ .squisq-page--document .squisq-page-feature-body { font-size: 1em; }
2708
+ .squisq-page--document .squisq-page-figure figcaption,
2709
+ .squisq-page--document .squisq-page-gallery-caption { margin-top: 0.6em; font-size: 0.85em; }
2710
+ .squisq-page--document .squisq-page-gallery { gap: 0.75em; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); }
2711
+ .squisq-page--document .squisq-page-callout { padding: 0.85em 1.1em; gap: 1em; border-left-width: 3px; }
2712
+ .squisq-page--document .squisq-page-callout-title { font-size: 1.05em; margin-bottom: 0.35em; }
2713
+ .squisq-page--document .squisq-page-callout-meta { margin-top: 0.6em; font-size: 0.82em; }
2714
+ .squisq-page--document .squisq-page-callout .squisq-page-media-frame { flex-basis: 5.5em; }
2715
+ .squisq-page--document .squisq-page-callout .squisq-page-media-frame img { width: 5.5em; height: 5.5em; }
2716
+ .squisq-page--document .squisq-page-cards { gap: 0.9em; grid-template-columns: repeat(auto-fit, minmax(12em, 1fr)); }
2717
+ .squisq-page--document .squisq-page-card { padding: 0.9em 1em 1em; border-top-width: 3px; }
2718
+ .squisq-page--document .squisq-page-card-title { font-size: 1.05em; }
2719
+ .squisq-page--document .squisq-page-cards-title { margin-bottom: 0.6em; }
2720
+ .squisq-page--document .squisq-page-items { max-width: none; }
2721
+ .squisq-page--document .squisq-page-items li { grid-template-columns: 2.2em 1fr; padding: 0.45em 0; font-size: 1em; }
2722
+ .squisq-page--document .squisq-page-items li::before { font-size: 1em; }
2723
+ .squisq-page--document .squisq-page-section--timeline-rail { padding-block: 0.5em; }
2724
+ .squisq-page--document .squisq-page-milestone { grid-template-columns: 7em 1fr; gap: 1.25em; }
2725
+ .squisq-page--document .squisq-page-milestone-date { font-size: 1em; }
2726
+ .squisq-page--document .squisq-page-milestone-rail { left: calc(7em + 0.62em); top: -0.5em; bottom: -0.5em; }
2727
+ .squisq-page--document .squisq-page-milestone-body { padding-left: 1.25em; }
2728
+ .squisq-page--document .squisq-page-milestone-footer { font-size: 0.85em; }
2729
+
2442
2730
  /* \u2500\u2500 Reveal animation (progressive enhancement) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
2443
2731
  @media (prefers-reduced-motion: no-preference) {
2444
2732
  .squisq-page-reveal { opacity: 0; transform: translateY(14px); transition: opacity 0.55s ease, transform 0.55s ease; }
@@ -6053,6 +6341,10 @@ function renderTree(tree2, options = {}) {
6053
6341
 
6054
6342
  export {
6055
6343
  getAnimationStyle,
6344
+ transformOriginFor,
6345
+ motionStateTransform,
6346
+ DEFAULT_WORD_STAGGER,
6347
+ wordRevealDelay,
6056
6348
  getDefaultAnimationDuration,
6057
6349
  getTransitionClass,
6058
6350
  getAnimationProgress,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  defaultPageStyle
3
- } from "./chunk-YNO6JV36.js";
3
+ } from "./chunk-2SRF5III.js";
4
4
  import {
5
5
  FONT_FALLBACKS,
6
6
  THEME_SCHEMA_VERSION,
@@ -15,7 +15,7 @@ import {
15
15
  relativeLuminance,
16
16
  resolveFontFamily,
17
17
  withAlpha
18
- } from "./chunk-Y4D6TDZT.js";
18
+ } from "./chunk-PFH3WV6J.js";
19
19
 
20
20
  // src/schemas/Doc.ts
21
21
  function calculateDuration(audio) {