@squadbase/vantage 0.6.2-dev1.0017a4d → 0.6.2-dev1.02aab78

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 (80) hide show
  1. package/dist/{build-X5NVCQKT.js → build-YOPOGPQB.js} +7 -7
  2. package/dist/{build-X5NVCQKT.js.map → build-YOPOGPQB.js.map} +1 -1
  3. package/dist/{check-ZBIH422T.js → check-FBHT6W6J.js} +5 -5
  4. package/dist/{check-ZBIH422T.js.map → check-FBHT6W6J.js.map} +1 -1
  5. package/dist/{chunk-7DZGJQ3P.js → chunk-5C2SEDPH.js} +21 -4
  6. package/dist/chunk-5C2SEDPH.js.map +1 -0
  7. package/dist/chunk-6OTTGAPO.js +44 -0
  8. package/dist/chunk-6OTTGAPO.js.map +1 -0
  9. package/dist/{chunk-2ICNHUG6.js → chunk-7652CGJJ.js} +10 -3
  10. package/dist/{chunk-2ICNHUG6.js.map → chunk-7652CGJJ.js.map} +1 -1
  11. package/dist/{chunk-RU6WKEOG.js → chunk-QOXXOFGL.js} +7 -4
  12. package/dist/chunk-QOXXOFGL.js.map +1 -0
  13. package/dist/{chunk-WAMZWZJB.js → chunk-R6MTJAHX.js} +6 -6
  14. package/dist/chunk-R6MTJAHX.js.map +1 -0
  15. package/dist/{chunk-CEXAQQ5W.js → chunk-S5MDTHH7.js} +180 -18
  16. package/dist/chunk-S5MDTHH7.js.map +1 -0
  17. package/dist/{chunk-JKLLFVEU.js → chunk-UWSQUHX6.js} +4 -99
  18. package/dist/chunk-UWSQUHX6.js.map +1 -0
  19. package/dist/cli.js +6 -6
  20. package/dist/components/index.d.ts +8 -4
  21. package/dist/components/index.js +1 -1
  22. package/dist/delta-text-CvwBGJ95.d.ts +15 -0
  23. package/dist/{dev-4XEDTELV.js → dev-GUKQT6U6.js} +7 -7
  24. package/dist/{dev-4XEDTELV.js.map → dev-GUKQT6U6.js.map} +1 -1
  25. package/dist/doc/index.d.ts +22 -1
  26. package/dist/doc/index.js +45 -72
  27. package/dist/doc/index.js.map +1 -1
  28. package/dist/{doctor-5E2VEZPK.js → doctor-B2O3GJDU.js} +5 -5
  29. package/dist/{doctor-5E2VEZPK.js.map → doctor-B2O3GJDU.js.map} +1 -1
  30. package/dist/{routes-3SGAFDMC.js → routes-PVKNT777.js} +4 -4
  31. package/dist/{routes-3SGAFDMC.js.map → routes-PVKNT777.js.map} +1 -1
  32. package/dist/slide/index.d.ts +96 -1
  33. package/dist/slide/index.js +414 -297
  34. package/dist/slide/index.js.map +1 -1
  35. package/dist/table/index.js +1 -1
  36. package/dist/{upgrade-JHXZBGQS.js → upgrade-7ZXMCTTR.js} +4 -4
  37. package/dist/{upgrade-JHXZBGQS.js.map → upgrade-7ZXMCTTR.js.map} +1 -1
  38. package/dist/vite/index.js +3 -3
  39. package/docs/en/changelog.md +2 -0
  40. package/docs/en/components.md +4 -2
  41. package/docs/en/doc/delta-text.md +40 -0
  42. package/docs/en/doc/doc-notes-and-sources.md +43 -0
  43. package/docs/en/pages-and-metadata.md +15 -0
  44. package/docs/en/parts/delta.md +4 -3
  45. package/docs/en/parts/kpi-card.md +2 -1
  46. package/docs/en/slide/slide-chart-full.md +48 -0
  47. package/docs/en/slide/slide-columns.md +46 -0
  48. package/docs/en/slide/slide-comparison.md +68 -0
  49. package/docs/en/slide/slide-heading.md +38 -0
  50. package/docs/en/slide/slide-section.md +44 -0
  51. package/docs/en/slide/slide-source-line.md +34 -0
  52. package/docs/index.json +208 -48
  53. package/docs/ja/changelog.md +2 -0
  54. package/docs/ja/components.md +4 -2
  55. package/docs/ja/doc/delta-text.md +40 -0
  56. package/docs/ja/doc/doc-notes-and-sources.md +43 -0
  57. package/docs/ja/page-types/slide.md +1 -0
  58. package/docs/ja/pages-and-metadata.md +15 -0
  59. package/docs/ja/parts/delta.md +5 -4
  60. package/docs/ja/parts/kpi-card.md +2 -1
  61. package/docs/ja/slide/slide-chart-full.md +48 -0
  62. package/docs/ja/slide/slide-columns.md +46 -0
  63. package/docs/ja/slide/slide-comparison.md +68 -0
  64. package/docs/ja/slide/slide-heading.md +38 -0
  65. package/docs/ja/slide/slide-section.md +44 -0
  66. package/docs/ja/slide/slide-source-line.md +34 -0
  67. package/package.json +2 -2
  68. package/registry/ui/delta.tsx +7 -4
  69. package/registry/ui/kpi-card.tsx +9 -4
  70. package/skills/vantage-pitfalls/SKILL.md +5 -0
  71. package/skills/vantage-slide/SKILL.md +2 -2
  72. package/templates/AGENTS.md +4 -2
  73. package/templates/agents/doc.md +3 -0
  74. package/templates/agents/slide.md +16 -1
  75. package/theme.css +7 -4
  76. package/dist/chunk-7DZGJQ3P.js.map +0 -1
  77. package/dist/chunk-CEXAQQ5W.js.map +0 -1
  78. package/dist/chunk-JKLLFVEU.js.map +0 -1
  79. package/dist/chunk-RU6WKEOG.js.map +0 -1
  80. package/dist/chunk-WAMZWZJB.js.map +0 -1
@@ -1,3 +1,5 @@
1
+ import { DeltaText } from '../chunk-6OTTGAPO.js';
2
+ export { DeltaText } from '../chunk-6OTTGAPO.js';
1
3
  import { useSearchState } from '../chunk-ZO62C6T4.js';
2
4
  import '../chunk-6S4BAIGV.js';
3
5
  import { EChart } from '../chunk-JXFCSF3K.js';
@@ -226,8 +228,13 @@ async function exportDeckAsPptx({
226
228
  background: "var(--slide-bg)",
227
229
  color: "var(--slide-fg)",
228
230
  fontFamily: "var(--slide-font-body)",
229
- fontSize: "var(--slide-size-body)"
231
+ fontSize: "var(--slide-size-body)",
232
+ // Same phrase-aware line breaking as the on-screen canvas (see canvas.tsx).
233
+ wordBreak: "auto-phrase",
234
+ lineBreak: "strict",
235
+ overflowWrap: "break-word"
230
236
  });
237
+ if (document.documentElement.lang) host.lang = document.documentElement.lang;
231
238
  if (themeVars) {
232
239
  for (const [key, value] of Object.entries(themeVars)) {
233
240
  host.style.setProperty(key, String(value));
@@ -1636,16 +1643,32 @@ var SLIDE_SPEC = {
1636
1643
  /** Gaps between elements, in canvas px. */
1637
1644
  space: { sm: 32, md: 48, lg: 64 }
1638
1645
  };
1639
- var MAX_INSIGHTS = 3;
1640
- var MAX_INSIGHT_CHARS = 40;
1641
- var LINE_TYPES = ["solid", "dashed", "dotted"];
1642
- var SYMBOLS = ["circle", "rect", "triangle", "diamond"];
1643
- function SlideHeading({ title }) {
1646
+ function SlideColumns({ children, align = "stretch" }) {
1644
1647
  return /* @__PURE__ */ jsx(
1645
- "h2",
1648
+ "div",
1646
1649
  {
1647
1650
  style: {
1648
1651
  gridColumn: "1 / -1",
1652
+ minHeight: 0,
1653
+ display: "grid",
1654
+ gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,
1655
+ gridTemplateRows: "minmax(0, 1fr)",
1656
+ columnGap: SLIDE_SPEC.grid.gutter,
1657
+ alignItems: align
1658
+ },
1659
+ children
1660
+ }
1661
+ );
1662
+ }
1663
+ function SlideColumn({ span, children }) {
1664
+ return /* @__PURE__ */ jsx("div", { style: { gridColumn: `span ${span}`, minWidth: 0, minHeight: 0 }, children });
1665
+ }
1666
+ function SlideHeading({ title, eyebrow }) {
1667
+ const heading = /* @__PURE__ */ jsx(
1668
+ "h2",
1669
+ {
1670
+ style: {
1671
+ ...eyebrow ? {} : { gridColumn: "1 / -1" },
1649
1672
  margin: 0,
1650
1673
  fontFamily: "var(--slide-font-display)",
1651
1674
  fontSize: SLIDE_SPEC.fontSize.page,
@@ -1659,8 +1682,27 @@ function SlideHeading({ title }) {
1659
1682
  children: title
1660
1683
  }
1661
1684
  );
1685
+ if (!eyebrow) return heading;
1686
+ return /* @__PURE__ */ jsxs("div", { style: { gridColumn: "1 / -1", display: "flex", flexDirection: "column", gap: SLIDE_SPEC.space.sm }, children: [
1687
+ /* @__PURE__ */ jsx(
1688
+ "p",
1689
+ {
1690
+ style: {
1691
+ margin: 0,
1692
+ fontSize: SLIDE_SPEC.fontSize.caption,
1693
+ lineHeight: SLIDE_SPEC.lineHeight.body,
1694
+ fontWeight: 700,
1695
+ color: "var(--slide-accent)"
1696
+ },
1697
+ children: eyebrow
1698
+ }
1699
+ ),
1700
+ heading
1701
+ ] });
1662
1702
  }
1663
- function SlideSourceLine({ asOf, source }) {
1703
+ function SlideSourceLine({ asOf, source, page }) {
1704
+ const text = [asOf ? `${asOf} \u6642\u70B9` : null, source ? `\u51FA\u5178: ${source}` : null].filter(Boolean).join(" / ");
1705
+ if (!text && !page) return null;
1664
1706
  return /* @__PURE__ */ jsx(
1665
1707
  "p",
1666
1708
  {
@@ -1669,49 +1711,110 @@ function SlideSourceLine({ asOf, source }) {
1669
1711
  margin: 0,
1670
1712
  fontSize: SLIDE_SPEC.fontSize.caption,
1671
1713
  lineHeight: SLIDE_SPEC.lineHeight.body,
1672
- color: "var(--slide-muted)"
1714
+ color: "var(--slide-muted)",
1715
+ ...page ? { display: "flex", justifyContent: "space-between", gap: SLIDE_SPEC.space.md } : {}
1673
1716
  },
1674
- children: [asOf ? `${asOf} \u6642\u70B9` : null, source ? `\u51FA\u5178: ${source}` : null].filter(Boolean).join(" / ")
1717
+ children: page ? /* @__PURE__ */ jsxs(Fragment, { children: [
1718
+ /* @__PURE__ */ jsx("span", { children: text }),
1719
+ /* @__PURE__ */ jsx("span", { style: { fontVariantNumeric: "tabular-nums" }, children: `${page.current} / ${page.total}` })
1720
+ ] }) : text
1675
1721
  }
1676
1722
  );
1677
1723
  }
1724
+ var MAX_INSIGHTS = 3;
1725
+ var MAX_INSIGHT_CHARS = 40;
1726
+ var LINE_TYPES = ["solid", "dashed", "dotted"];
1727
+ var SYMBOLS = ["circle", "rect", "triangle", "diamond"];
1728
+ function buildSlideChartOption(chart) {
1729
+ return {
1730
+ animation: false,
1731
+ textStyle: { fontSize: SLIDE_SPEC.fontSize.caption },
1732
+ grid: {
1733
+ left: 0,
1734
+ right: SLIDE_SPEC.space.sm,
1735
+ top: chart.series.length > 1 ? SLIDE_SPEC.space.lg : SLIDE_SPEC.space.sm,
1736
+ bottom: 0,
1737
+ containLabel: true
1738
+ },
1739
+ legend: chart.series.length > 1 ? {
1740
+ top: 0,
1741
+ left: 0,
1742
+ textStyle: { fontSize: SLIDE_SPEC.fontSize.caption }
1743
+ } : { show: false },
1744
+ // The first x label and the lowest y label meet at the corner: the margin keeps the x labels clear of the axis, and
1745
+ // `hideOverlap` drops whichever still collides.
1746
+ xAxis: {
1747
+ type: "category",
1748
+ data: chart.categories,
1749
+ // Half a category of room on both sides keeps the first point off the y-axis labels (a line from the axis touches them).
1750
+ boundaryGap: true,
1751
+ axisLabel: {
1752
+ fontSize: SLIDE_SPEC.fontSize.caption,
1753
+ margin: SLIDE_SPEC.space.sm,
1754
+ hideOverlap: true
1755
+ }
1756
+ },
1757
+ yAxis: {
1758
+ type: "value",
1759
+ // A line from 0 hugs the top when the values sit in a narrow band; bars must keep their zero baseline.
1760
+ scale: chart.type !== "bar",
1761
+ axisLabel: {
1762
+ fontSize: SLIDE_SPEC.fontSize.caption,
1763
+ hideOverlap: true,
1764
+ formatter: (v) => formatValue(v, "compact")
1765
+ }
1766
+ },
1767
+ ...chart.type === "bar" && chart.series.length > 1 ? { aria: { enabled: true, decal: { show: true } } } : {},
1768
+ series: chart.series.map((s, i) => ({
1769
+ name: s.name,
1770
+ type: chart.type === "bar" ? "bar" : "line",
1771
+ data: s.data,
1772
+ ...chart.type === "bar" ? {} : {
1773
+ symbol: SYMBOLS[i % SYMBOLS.length],
1774
+ symbolSize: SLIDE_SPEC.space.sm / 2,
1775
+ lineStyle: { width: 6, type: LINE_TYPES[i % LINE_TYPES.length] }
1776
+ },
1777
+ ...chart.type === "area" ? { areaStyle: { opacity: 0.16 } } : {}
1778
+ }))
1779
+ };
1780
+ }
1678
1781
  function SlideChartInsight({ title, chart, insights, chartSide = "left", asOf, source }) {
1679
1782
  const hasSource = Boolean(asOf || source);
1680
1783
  if (insights.some((t) => t.length > MAX_INSIGHT_CHARS)) console.warn(`SlideChartInsight: an insight is over ${MAX_INSIGHT_CHARS} characters; the column is narrow. Shorten it.`);
1681
1784
  if (insights.length > MAX_INSIGHTS) console.warn(`SlideChartInsight: ${insights.length} insights; ${MAX_INSIGHTS} fit beside the chart. Split the slide.`);
1682
- const option = useMemo(
1683
- () => ({
1684
- animation: false,
1685
- textStyle: { fontSize: SLIDE_SPEC.fontSize.caption },
1686
- grid: { left: 0, right: SLIDE_SPEC.space.sm, top: chart.series.length > 1 ? SLIDE_SPEC.space.lg : SLIDE_SPEC.space.sm, bottom: 0, containLabel: true },
1687
- legend: chart.series.length > 1 ? { top: 0, left: 0, textStyle: { fontSize: SLIDE_SPEC.fontSize.caption } } : { show: false },
1688
- // The first x label and the lowest y label meet at the corner: the margin keeps the x labels clear of the axis, and
1689
- // `hideOverlap` drops whichever still collides.
1690
- xAxis: {
1691
- type: "category",
1692
- data: chart.categories,
1693
- // Half a category of room on both sides keeps the first point off the y-axis labels (a line from the axis touches them).
1694
- boundaryGap: true,
1695
- axisLabel: { fontSize: SLIDE_SPEC.fontSize.caption, margin: SLIDE_SPEC.space.sm, hideOverlap: true }
1696
- },
1697
- yAxis: {
1698
- type: "value",
1699
- // A line from 0 hugs the top when the values sit in a narrow band; bars must keep their zero baseline.
1700
- scale: chart.type !== "bar",
1701
- axisLabel: { fontSize: SLIDE_SPEC.fontSize.caption, hideOverlap: true, formatter: (v) => formatValue(v, "compact") }
1702
- },
1703
- ...chart.type === "bar" && chart.series.length > 1 ? { aria: { enabled: true, decal: { show: true } } } : {},
1704
- series: chart.series.map((s, i) => ({
1705
- name: s.name,
1706
- type: chart.type === "bar" ? "bar" : "line",
1707
- data: s.data,
1708
- ...chart.type === "bar" ? {} : { symbol: SYMBOLS[i % SYMBOLS.length], symbolSize: SLIDE_SPEC.space.sm / 2, lineStyle: { width: 6, type: LINE_TYPES[i % LINE_TYPES.length] } },
1709
- ...chart.type === "area" ? { areaStyle: { opacity: 0.16 } } : {}
1710
- }))
1711
- }),
1712
- [chart]
1713
- );
1785
+ const option = useMemo(() => buildSlideChartOption(chart), [chart]);
1714
1786
  const chartFirst = chartSide === "left";
1787
+ const chartColumn = /* @__PURE__ */ jsx(SlideColumn, { span: 7, children: /* @__PURE__ */ jsx("div", { "data-waitfor": "canvas", style: { minHeight: 0, height: "100%" }, children: /* @__PURE__ */ jsx(EChart, { option, height: "100%", ariaLabel: title }) }) });
1788
+ const insightsColumn = /* @__PURE__ */ jsx(SlideColumn, { span: 5, children: /* @__PURE__ */ jsx(
1789
+ "ul",
1790
+ {
1791
+ style: {
1792
+ height: "100%",
1793
+ boxSizing: "border-box",
1794
+ margin: 0,
1795
+ padding: 0,
1796
+ listStyle: "none",
1797
+ minHeight: 0,
1798
+ display: "flex",
1799
+ flexDirection: "column",
1800
+ justifyContent: "center",
1801
+ gap: SLIDE_SPEC.space.md
1802
+ },
1803
+ children: insights.map((text, i) => /* @__PURE__ */ jsx(
1804
+ "li",
1805
+ {
1806
+ style: {
1807
+ paddingLeft: SLIDE_SPEC.space.sm,
1808
+ borderLeft: "4px solid var(--slide-accent)",
1809
+ fontSize: "var(--slide-size-body)",
1810
+ lineHeight: SLIDE_SPEC.lineHeight.body
1811
+ },
1812
+ children: text
1813
+ },
1814
+ i
1815
+ ))
1816
+ }
1817
+ ) });
1715
1818
  return /* @__PURE__ */ jsxs(
1716
1819
  "section",
1717
1820
  {
@@ -1731,37 +1834,10 @@ function SlideChartInsight({ title, chart, insights, chartSide = "left", asOf, s
1731
1834
  },
1732
1835
  children: [
1733
1836
  /* @__PURE__ */ jsx(SlideHeading, { title }),
1734
- /* @__PURE__ */ jsx("div", { "data-waitfor": "canvas", style: { gridColumn: chartFirst ? "1 / span 7" : "6 / span 7", gridRow: 2, minHeight: 0, height: "100%" }, children: /* @__PURE__ */ jsx(EChart, { option, height: "100%", ariaLabel: title }) }),
1735
- /* @__PURE__ */ jsx(
1736
- "ul",
1737
- {
1738
- style: {
1739
- gridColumn: chartFirst ? "8 / span 5" : "1 / span 5",
1740
- gridRow: 2,
1741
- margin: 0,
1742
- padding: 0,
1743
- listStyle: "none",
1744
- minHeight: 0,
1745
- display: "flex",
1746
- flexDirection: "column",
1747
- justifyContent: "center",
1748
- gap: SLIDE_SPEC.space.md
1749
- },
1750
- children: insights.map((text, i) => /* @__PURE__ */ jsx(
1751
- "li",
1752
- {
1753
- style: {
1754
- paddingLeft: SLIDE_SPEC.space.sm,
1755
- borderLeft: "4px solid var(--slide-accent)",
1756
- fontSize: "var(--slide-size-body)",
1757
- lineHeight: SLIDE_SPEC.lineHeight.body
1758
- },
1759
- children: text
1760
- },
1761
- i
1762
- ))
1763
- }
1764
- ),
1837
+ /* @__PURE__ */ jsxs(SlideColumns, { children: [
1838
+ chartFirst ? chartColumn : insightsColumn,
1839
+ chartFirst ? insightsColumn : chartColumn
1840
+ ] }),
1765
1841
  hasSource && /* @__PURE__ */ jsx(SlideSourceLine, { asOf, source })
1766
1842
  ]
1767
1843
  }
@@ -1791,11 +1867,12 @@ function SlideCover({ title, subtitle, period, author, asOf, source }) {
1791
1867
  fontFamily: "var(--slide-font-body)"
1792
1868
  },
1793
1869
  children: [
1794
- /* @__PURE__ */ jsxs(
1870
+ /* @__PURE__ */ jsx(SlideColumns, { children: /* @__PURE__ */ jsx(SlideColumn, { span: 8, children: /* @__PURE__ */ jsxs(
1795
1871
  "div",
1796
1872
  {
1797
1873
  style: {
1798
- gridColumn: "1 / span 8",
1874
+ height: "100%",
1875
+ boxSizing: "border-box",
1799
1876
  display: "flex",
1800
1877
  flexDirection: "column",
1801
1878
  justifyContent: "center",
@@ -1821,7 +1898,7 @@ function SlideCover({ title, subtitle, period, author, asOf, source }) {
1821
1898
  subtitle && /* @__PURE__ */ jsx("p", { style: { margin: 0, fontSize: "var(--slide-size-body)", lineHeight: SLIDE_SPEC.lineHeight.body, color: "var(--slide-muted)" }, children: subtitle })
1822
1899
  ]
1823
1900
  }
1824
- ),
1901
+ ) }) }),
1825
1902
  meta.length > 0 && /* @__PURE__ */ jsx(
1826
1903
  "p",
1827
1904
  {
@@ -1840,41 +1917,6 @@ function SlideCover({ title, subtitle, period, author, asOf, source }) {
1840
1917
  );
1841
1918
  }
1842
1919
  var MAX_POINTS = 5;
1843
- function SlideHeading2({ title }) {
1844
- return /* @__PURE__ */ jsx(
1845
- "h2",
1846
- {
1847
- style: {
1848
- gridColumn: "1 / -1",
1849
- margin: 0,
1850
- fontFamily: "var(--slide-font-display)",
1851
- fontSize: SLIDE_SPEC.fontSize.page,
1852
- lineHeight: SLIDE_SPEC.lineHeight.heading,
1853
- fontWeight: 700,
1854
- display: "-webkit-box",
1855
- WebkitBoxOrient: "vertical",
1856
- WebkitLineClamp: 2,
1857
- overflow: "hidden"
1858
- },
1859
- children: title
1860
- }
1861
- );
1862
- }
1863
- function SlideSourceLine2({ asOf, source }) {
1864
- return /* @__PURE__ */ jsx(
1865
- "p",
1866
- {
1867
- style: {
1868
- gridColumn: "1 / -1",
1869
- margin: 0,
1870
- fontSize: SLIDE_SPEC.fontSize.caption,
1871
- lineHeight: SLIDE_SPEC.lineHeight.body,
1872
- color: "var(--slide-muted)"
1873
- },
1874
- children: [asOf ? `${asOf} \u6642\u70B9` : null, source ? `\u51FA\u5178: ${source}` : null].filter(Boolean).join(" / ")
1875
- }
1876
- );
1877
- }
1878
1920
  function SlideExecSummary({ title, points, layout = "rows", asOf, source }) {
1879
1921
  const hasSource = Boolean(asOf || source);
1880
1922
  if (points.length > MAX_POINTS) console.warn(`SlideExecSummary: ${points.length} points; ${MAX_POINTS} fit the canvas. Split the slide.`);
@@ -1897,7 +1939,7 @@ function SlideExecSummary({ title, points, layout = "rows", asOf, source }) {
1897
1939
  fontFamily: "var(--slide-font-body)"
1898
1940
  },
1899
1941
  children: [
1900
- /* @__PURE__ */ jsx(SlideHeading2, { title }),
1942
+ /* @__PURE__ */ jsx(SlideHeading, { title }),
1901
1943
  layout === "columns" ? /* @__PURE__ */ jsx(
1902
1944
  "ol",
1903
1945
  {
@@ -1965,47 +2007,12 @@ function SlideExecSummary({ title, points, layout = "rows", asOf, source }) {
1965
2007
  ))
1966
2008
  }
1967
2009
  ),
1968
- hasSource && /* @__PURE__ */ jsx(SlideSourceLine2, { asOf, source })
2010
+ hasSource && /* @__PURE__ */ jsx(SlideSourceLine, { asOf, source })
1969
2011
  ]
1970
2012
  }
1971
2013
  );
1972
2014
  }
1973
2015
  var MAX_ITEMS = 4;
1974
- function SlideHeading3({ title }) {
1975
- return /* @__PURE__ */ jsx(
1976
- "h2",
1977
- {
1978
- style: {
1979
- gridColumn: "1 / -1",
1980
- margin: 0,
1981
- fontFamily: "var(--slide-font-display)",
1982
- fontSize: SLIDE_SPEC.fontSize.page,
1983
- lineHeight: SLIDE_SPEC.lineHeight.heading,
1984
- fontWeight: 700,
1985
- display: "-webkit-box",
1986
- WebkitBoxOrient: "vertical",
1987
- WebkitLineClamp: 2,
1988
- overflow: "hidden"
1989
- },
1990
- children: title
1991
- }
1992
- );
1993
- }
1994
- function SlideSourceLine3({ asOf, source }) {
1995
- return /* @__PURE__ */ jsx(
1996
- "p",
1997
- {
1998
- style: {
1999
- gridColumn: "1 / -1",
2000
- margin: 0,
2001
- fontSize: SLIDE_SPEC.fontSize.caption,
2002
- lineHeight: SLIDE_SPEC.lineHeight.body,
2003
- color: "var(--slide-muted)"
2004
- },
2005
- children: [asOf ? `${asOf} \u6642\u70B9` : null, source ? `\u51FA\u5178: ${source}` : null].filter(Boolean).join(" / ")
2006
- }
2007
- );
2008
- }
2009
2016
  var ARROW = { up: "\u25B2", down: "\u25BC", flat: "\u25AC" };
2010
2017
  var WORD = { up: "\u5897", down: "\u6E1B", flat: "\u6A2A\u3070\u3044" };
2011
2018
  function deltaView(delta, betterWhen) {
@@ -2042,7 +2049,7 @@ function SlideKpiGrid({ title, items, asOf, source }) {
2042
2049
  fontFamily: "var(--slide-font-body)"
2043
2050
  },
2044
2051
  children: [
2045
- /* @__PURE__ */ jsx(SlideHeading3, { title }),
2052
+ /* @__PURE__ */ jsx(SlideHeading, { title }),
2046
2053
  /* @__PURE__ */ jsx(
2047
2054
  "div",
2048
2055
  {
@@ -2100,46 +2107,11 @@ function SlideKpiGrid({ title, items, asOf, source }) {
2100
2107
  })
2101
2108
  }
2102
2109
  ),
2103
- hasSource && /* @__PURE__ */ jsx(SlideSourceLine3, { asOf, source })
2110
+ hasSource && /* @__PURE__ */ jsx(SlideSourceLine, { asOf, source })
2104
2111
  ]
2105
2112
  }
2106
2113
  );
2107
2114
  }
2108
- function SlideHeading4({ title }) {
2109
- return /* @__PURE__ */ jsx(
2110
- "h2",
2111
- {
2112
- style: {
2113
- gridColumn: "1 / -1",
2114
- margin: 0,
2115
- fontFamily: "var(--slide-font-display)",
2116
- fontSize: SLIDE_SPEC.fontSize.page,
2117
- lineHeight: SLIDE_SPEC.lineHeight.heading,
2118
- fontWeight: 700,
2119
- display: "-webkit-box",
2120
- WebkitBoxOrient: "vertical",
2121
- WebkitLineClamp: 2,
2122
- overflow: "hidden"
2123
- },
2124
- children: title
2125
- }
2126
- );
2127
- }
2128
- function SlideSourceLine4({ asOf, source }) {
2129
- return /* @__PURE__ */ jsx(
2130
- "p",
2131
- {
2132
- style: {
2133
- gridColumn: "1 / -1",
2134
- margin: 0,
2135
- fontSize: SLIDE_SPEC.fontSize.caption,
2136
- lineHeight: SLIDE_SPEC.lineHeight.body,
2137
- color: "var(--slide-muted)"
2138
- },
2139
- children: [asOf ? `${asOf} \u6642\u70B9` : null, source ? `\u51FA\u5178: ${source}` : null].filter(Boolean).join(" / ")
2140
- }
2141
- );
2142
- }
2143
2115
  var ARROW2 = { up: "\u25B2", down: "\u25BC", flat: "\u25AC" };
2144
2116
  var WORD2 = { up: "\u5897", down: "\u6E1B", flat: "\u6A2A\u3070\u3044" };
2145
2117
  function deltaView2(delta, betterWhen) {
@@ -2200,84 +2172,51 @@ function SlideKpiHero({ title, label, value, format, display, delta, betterWhen
2200
2172
  fontFamily: "var(--slide-font-body)"
2201
2173
  },
2202
2174
  children: [
2203
- /* @__PURE__ */ jsx(SlideHeading4, { title }),
2204
- /* @__PURE__ */ jsxs(
2205
- "div",
2206
- {
2207
- style: {
2208
- gridColumn: option ? "1 / span 6" : "1 / -1",
2209
- minHeight: 0,
2210
- display: "flex",
2211
- flexDirection: "column",
2212
- justifyContent: "center",
2213
- gap: SLIDE_SPEC.space.sm
2214
- },
2215
- children: [
2216
- /* @__PURE__ */ jsx("span", { style: { fontSize: "var(--slide-size-body)", lineHeight: SLIDE_SPEC.lineHeight.heading, color: "var(--slide-muted)" }, children: label }),
2217
- /* @__PURE__ */ jsx(
2218
- "span",
2219
- {
2220
- "data-raw": value ?? void 0,
2221
- style: {
2222
- fontFamily: "var(--slide-font-display)",
2223
- fontSize: "var(--slide-size-hero)",
2224
- lineHeight: SLIDE_SPEC.lineHeight.heading,
2225
- fontWeight: 700,
2226
- fontVariantNumeric: "tabular-nums"
2227
- },
2228
- children: display ?? formatValue(value, format)
2229
- }
2230
- ),
2231
- (deltaShown || comparisonLabel) && /* @__PURE__ */ jsxs("span", { style: { display: "flex", flexWrap: "wrap", alignItems: "baseline", gap: SLIDE_SPEC.space.sm, fontSize: "var(--slide-size-body)", lineHeight: SLIDE_SPEC.lineHeight.heading }, children: [
2232
- deltaShown && /* @__PURE__ */ jsx("span", { style: { color: deltaShown.color, fontWeight: 700 }, children: deltaShown.text }),
2233
- comparisonLabel && /* @__PURE__ */ jsx("span", { style: { fontSize: SLIDE_SPEC.fontSize.caption, color: "var(--slide-muted)" }, children: comparisonLabel })
2234
- ] })
2235
- ]
2236
- }
2237
- ),
2238
- option && /* @__PURE__ */ jsx("div", { "data-waitfor": "canvas", style: { gridColumn: "7 / span 6", minHeight: 0, height: "100%" }, children: /* @__PURE__ */ jsx(EChart, { option, height: "100%", ariaLabel: `${label}\u306E\u63A8\u79FB` }) }),
2239
- hasSource && /* @__PURE__ */ jsx(SlideSourceLine4, { asOf, source })
2175
+ /* @__PURE__ */ jsx(SlideHeading, { title }),
2176
+ /* @__PURE__ */ jsxs(SlideColumns, { children: [
2177
+ /* @__PURE__ */ jsx(SlideColumn, { span: option ? 6 : 12, children: /* @__PURE__ */ jsxs(
2178
+ "div",
2179
+ {
2180
+ style: {
2181
+ height: "100%",
2182
+ boxSizing: "border-box",
2183
+ display: "flex",
2184
+ flexDirection: "column",
2185
+ justifyContent: "center",
2186
+ gap: SLIDE_SPEC.space.sm
2187
+ },
2188
+ children: [
2189
+ /* @__PURE__ */ jsx("span", { style: { fontSize: "var(--slide-size-body)", lineHeight: SLIDE_SPEC.lineHeight.heading, color: "var(--slide-muted)" }, children: label }),
2190
+ /* @__PURE__ */ jsx(
2191
+ "span",
2192
+ {
2193
+ "data-raw": value ?? void 0,
2194
+ style: {
2195
+ fontFamily: "var(--slide-font-display)",
2196
+ fontSize: "var(--slide-size-hero)",
2197
+ lineHeight: SLIDE_SPEC.lineHeight.heading,
2198
+ fontWeight: 700,
2199
+ fontVariantNumeric: "tabular-nums"
2200
+ },
2201
+ children: display ?? formatValue(value, format)
2202
+ }
2203
+ ),
2204
+ (deltaShown || comparisonLabel) && /* @__PURE__ */ jsxs("span", { style: { display: "flex", flexWrap: "wrap", alignItems: "baseline", gap: SLIDE_SPEC.space.sm, fontSize: "var(--slide-size-body)", lineHeight: SLIDE_SPEC.lineHeight.heading }, children: [
2205
+ deltaShown && /* @__PURE__ */ jsx("span", { style: { color: deltaShown.color, fontWeight: 700 }, children: deltaShown.text }),
2206
+ comparisonLabel && /* @__PURE__ */ jsx("span", { style: { fontSize: SLIDE_SPEC.fontSize.caption, color: "var(--slide-muted)" }, children: comparisonLabel })
2207
+ ] })
2208
+ ]
2209
+ }
2210
+ ) }),
2211
+ option && /* @__PURE__ */ jsx(SlideColumn, { span: 6, children: /* @__PURE__ */ jsx("div", { "data-waitfor": "canvas", style: { minHeight: 0, height: "100%" }, children: /* @__PURE__ */ jsx(EChart, { option, height: "100%", ariaLabel: `${label}\u306E\u63A8\u79FB` }) }) })
2212
+ ] }),
2213
+ hasSource && /* @__PURE__ */ jsx(SlideSourceLine, { asOf, source })
2240
2214
  ]
2241
2215
  }
2242
2216
  );
2243
2217
  }
2244
2218
  var MAX_ITEMS2 = 5;
2245
2219
  var MAX_DUE_CHARS = 10;
2246
- function SlideHeading5({ title }) {
2247
- return /* @__PURE__ */ jsx(
2248
- "h2",
2249
- {
2250
- style: {
2251
- gridColumn: "1 / -1",
2252
- margin: 0,
2253
- fontFamily: "var(--slide-font-display)",
2254
- fontSize: SLIDE_SPEC.fontSize.page,
2255
- lineHeight: SLIDE_SPEC.lineHeight.heading,
2256
- fontWeight: 700,
2257
- display: "-webkit-box",
2258
- WebkitBoxOrient: "vertical",
2259
- WebkitLineClamp: 2,
2260
- overflow: "hidden"
2261
- },
2262
- children: title
2263
- }
2264
- );
2265
- }
2266
- function SlideSourceLine5({ asOf, source }) {
2267
- return /* @__PURE__ */ jsx(
2268
- "p",
2269
- {
2270
- style: {
2271
- gridColumn: "1 / -1",
2272
- margin: 0,
2273
- fontSize: SLIDE_SPEC.fontSize.caption,
2274
- lineHeight: SLIDE_SPEC.lineHeight.body,
2275
- color: "var(--slide-muted)"
2276
- },
2277
- children: [asOf ? `${asOf} \u6642\u70B9` : null, source ? `\u51FA\u5178: ${source}` : null].filter(Boolean).join(" / ")
2278
- }
2279
- );
2280
- }
2281
2220
  function SlideNextActions({ title, items, asOf, source }) {
2282
2221
  const hasSource = Boolean(asOf || source);
2283
2222
  if (items.length > MAX_ITEMS2) console.warn(`SlideNextActions: ${items.length} items; ${MAX_ITEMS2} fit the canvas. Split the slide.`);
@@ -2308,7 +2247,7 @@ function SlideNextActions({ title, items, asOf, source }) {
2308
2247
  fontFamily: "var(--slide-font-body)"
2309
2248
  },
2310
2249
  children: [
2311
- /* @__PURE__ */ jsx(SlideHeading5, { title }),
2250
+ /* @__PURE__ */ jsx(SlideHeading, { title }),
2312
2251
  /* @__PURE__ */ jsxs("div", { style: { gridColumn: "1 / -1", minHeight: 0, display: "flex", flexDirection: "column", justifyContent: "center" }, children: [
2313
2252
  shown.length > 0 && /* @__PURE__ */ jsxs(
2314
2253
  "div",
@@ -2354,48 +2293,13 @@ function SlideNextActions({ title, items, asOf, source }) {
2354
2293
  i
2355
2294
  )) })
2356
2295
  ] }),
2357
- hasSource && /* @__PURE__ */ jsx(SlideSourceLine5, { asOf, source })
2296
+ hasSource && /* @__PURE__ */ jsx(SlideSourceLine, { asOf, source })
2358
2297
  ]
2359
2298
  }
2360
2299
  );
2361
2300
  }
2362
2301
  var MAX_ROWS = 8;
2363
2302
  var DENSE_ROWS = 6;
2364
- function SlideHeading6({ title }) {
2365
- return /* @__PURE__ */ jsx(
2366
- "h2",
2367
- {
2368
- style: {
2369
- gridColumn: "1 / -1",
2370
- margin: 0,
2371
- fontFamily: "var(--slide-font-display)",
2372
- fontSize: SLIDE_SPEC.fontSize.page,
2373
- lineHeight: SLIDE_SPEC.lineHeight.heading,
2374
- fontWeight: 700,
2375
- display: "-webkit-box",
2376
- WebkitBoxOrient: "vertical",
2377
- WebkitLineClamp: 2,
2378
- overflow: "hidden"
2379
- },
2380
- children: title
2381
- }
2382
- );
2383
- }
2384
- function SlideSourceLine6({ asOf, source }) {
2385
- return /* @__PURE__ */ jsx(
2386
- "p",
2387
- {
2388
- style: {
2389
- gridColumn: "1 / -1",
2390
- margin: 0,
2391
- fontSize: SLIDE_SPEC.fontSize.caption,
2392
- lineHeight: SLIDE_SPEC.lineHeight.body,
2393
- color: "var(--slide-muted)"
2394
- },
2395
- children: [asOf ? `${asOf} \u6642\u70B9` : null, source ? `\u51FA\u5178: ${source}` : null].filter(Boolean).join(" / ")
2396
- }
2397
- );
2398
- }
2399
2303
  var STATUS = {
2400
2304
  on: { label: "\u9806\u8ABF", color: "var(--positive)" },
2401
2305
  risk: { label: "\u8981\u6CE8\u610F", color: "var(--warning)" },
@@ -2438,7 +2342,7 @@ function SlideScorecardTable({ title, rows, columns, asOf, source }) {
2438
2342
  fontFamily: "var(--slide-font-body)"
2439
2343
  },
2440
2344
  children: [
2441
- /* @__PURE__ */ jsx(SlideHeading6, { title }),
2345
+ /* @__PURE__ */ jsx(SlideHeading, { title }),
2442
2346
  /* @__PURE__ */ jsx("div", { style: { gridColumn: "1 / -1", minHeight: 0 }, children: /* @__PURE__ */ jsxs("table", { style: { width: "100%", borderCollapse: "collapse", fontSize: cellSize, lineHeight: SLIDE_SPEC.lineHeight.body }, children: [
2443
2347
  /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { style: { color: "var(--slide-muted)", fontSize: SLIDE_SPEC.fontSize.caption }, children: [
2444
2348
  /* @__PURE__ */ jsx("th", { style: { ...cell, fontWeight: 700 }, children: head.metric }),
@@ -2459,12 +2363,225 @@ function SlideScorecardTable({ title, rows, columns, asOf, source }) {
2459
2363
  ] })
2460
2364
  ] }, i)) })
2461
2365
  ] }) }),
2462
- hasSource && /* @__PURE__ */ jsx(SlideSourceLine6, { asOf, source })
2366
+ hasSource && /* @__PURE__ */ jsx(SlideSourceLine, { asOf, source })
2367
+ ]
2368
+ }
2369
+ );
2370
+ }
2371
+ function SlideChartFull({ title, chart, note, asOf, source }) {
2372
+ const hasSource = Boolean(asOf || source);
2373
+ const option = useMemo(() => buildSlideChartOption(chart), [chart]);
2374
+ return /* @__PURE__ */ jsxs(
2375
+ "section",
2376
+ {
2377
+ "data-slot": "slide-chart-full",
2378
+ style: {
2379
+ width: "100%",
2380
+ height: "100%",
2381
+ boxSizing: "border-box",
2382
+ display: "grid",
2383
+ gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,
2384
+ gridTemplateRows: ["auto", "1fr", note ? "auto" : null, hasSource ? "auto" : null].filter(Boolean).join(" "),
2385
+ columnGap: SLIDE_SPEC.grid.gutter,
2386
+ rowGap: SLIDE_SPEC.space.lg,
2387
+ padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,
2388
+ color: "var(--slide-fg)",
2389
+ fontFamily: "var(--slide-font-body)"
2390
+ },
2391
+ children: [
2392
+ /* @__PURE__ */ jsx(SlideHeading, { title }),
2393
+ /* @__PURE__ */ jsx(SlideColumns, { children: /* @__PURE__ */ jsx(SlideColumn, { span: 12, children: /* @__PURE__ */ jsx("div", { "data-waitfor": "canvas", style: { minHeight: 0, height: "100%" }, children: /* @__PURE__ */ jsx(EChart, { option, height: "100%", ariaLabel: title }) }) }) }),
2394
+ note && /* @__PURE__ */ jsx("p", { style: { gridColumn: "1 / -1", margin: 0, fontSize: "var(--slide-size-body)", lineHeight: SLIDE_SPEC.lineHeight.body }, children: note }),
2395
+ hasSource && /* @__PURE__ */ jsx(SlideSourceLine, { asOf, source })
2396
+ ]
2397
+ }
2398
+ );
2399
+ }
2400
+ var MAX_POINTS2 = 3;
2401
+ var MAX_POINT_CHARS = 24;
2402
+ function SlideComparison({ title, columns, verdict, asOf, source }) {
2403
+ const hasSource = Boolean(asOf || source);
2404
+ if (columns.length < 2 || columns.length > 3) console.warn(`SlideComparison: ${columns.length} columns; 2\u20133 fit. Split the slide.`);
2405
+ if (columns.some((c) => c.points.length > MAX_POINTS2 || c.points.some((t) => t.length > MAX_POINT_CHARS)))
2406
+ console.warn(`SlideComparison: a column has over ${MAX_POINTS2} points or a point over ${MAX_POINT_CHARS} characters. Shorten it.`);
2407
+ const span = Math.floor(SLIDE_SPEC.grid.columns / Math.max(columns.length, 1));
2408
+ return /* @__PURE__ */ jsxs(
2409
+ "section",
2410
+ {
2411
+ "data-slot": "slide-comparison",
2412
+ style: {
2413
+ width: "100%",
2414
+ height: "100%",
2415
+ boxSizing: "border-box",
2416
+ display: "grid",
2417
+ gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,
2418
+ gridTemplateRows: ["auto", "1fr", verdict ? "auto" : null, hasSource ? "auto" : null].filter(Boolean).join(" "),
2419
+ columnGap: SLIDE_SPEC.grid.gutter,
2420
+ rowGap: SLIDE_SPEC.space.lg,
2421
+ padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,
2422
+ color: "var(--slide-fg)",
2423
+ fontFamily: "var(--slide-font-body)"
2424
+ },
2425
+ children: [
2426
+ /* @__PURE__ */ jsx(SlideHeading, { title }),
2427
+ /* @__PURE__ */ jsx(SlideColumns, { children: columns.map((col, i) => {
2428
+ const main = col.display ?? (col.value === void 0 ? void 0 : col.value === null ? "\u2014" : formatValue(col.value, col.format));
2429
+ return /* @__PURE__ */ jsx(SlideColumn, { span, children: /* @__PURE__ */ jsxs(
2430
+ "div",
2431
+ {
2432
+ style: {
2433
+ height: "100%",
2434
+ boxSizing: "border-box",
2435
+ display: "flex",
2436
+ flexDirection: "column",
2437
+ gap: SLIDE_SPEC.space.md,
2438
+ paddingTop: SLIDE_SPEC.space.sm,
2439
+ borderTop: "4px solid var(--slide-accent)"
2440
+ },
2441
+ children: [
2442
+ /* @__PURE__ */ jsx(
2443
+ "h3",
2444
+ {
2445
+ style: {
2446
+ margin: 0,
2447
+ fontSize: "var(--slide-size-body)",
2448
+ lineHeight: SLIDE_SPEC.lineHeight.heading,
2449
+ fontWeight: 700
2450
+ },
2451
+ children: col.heading
2452
+ }
2453
+ ),
2454
+ main !== void 0 && /* @__PURE__ */ jsxs("p", { style: { margin: 0, display: "flex", flexDirection: "column", gap: SLIDE_SPEC.space.sm }, children: [
2455
+ /* @__PURE__ */ jsx(
2456
+ "span",
2457
+ {
2458
+ style: {
2459
+ fontFamily: "var(--slide-font-display)",
2460
+ fontSize: SLIDE_SPEC.fontSize.section,
2461
+ lineHeight: SLIDE_SPEC.lineHeight.heading,
2462
+ fontWeight: 700,
2463
+ fontVariantNumeric: "tabular-nums"
2464
+ },
2465
+ children: main
2466
+ }
2467
+ ),
2468
+ col.delta && /* @__PURE__ */ jsx("span", { style: { fontSize: "var(--slide-size-body)", lineHeight: SLIDE_SPEC.lineHeight.body }, children: /* @__PURE__ */ jsx(DeltaText, { value: col.delta.value, format: col.delta.format ?? col.format, betterWhen: col.betterWhen, comparisonLabel: col.comparisonLabel }) })
2469
+ ] }),
2470
+ col.points.length > 0 && /* @__PURE__ */ jsx(
2471
+ "ul",
2472
+ {
2473
+ style: {
2474
+ margin: 0,
2475
+ padding: 0,
2476
+ listStyle: "none",
2477
+ display: "flex",
2478
+ flexDirection: "column",
2479
+ gap: SLIDE_SPEC.space.sm
2480
+ },
2481
+ children: col.points.map((text, j) => /* @__PURE__ */ jsx("li", { style: { fontSize: "var(--slide-size-body)", lineHeight: SLIDE_SPEC.lineHeight.body }, children: text }, j))
2482
+ }
2483
+ )
2484
+ ]
2485
+ }
2486
+ ) }, i);
2487
+ }) }),
2488
+ verdict && /* @__PURE__ */ jsx(
2489
+ "p",
2490
+ {
2491
+ style: {
2492
+ gridColumn: "1 / -1",
2493
+ margin: 0,
2494
+ paddingLeft: SLIDE_SPEC.space.sm,
2495
+ borderLeft: "4px solid var(--slide-accent)",
2496
+ fontSize: "var(--slide-size-body)",
2497
+ lineHeight: SLIDE_SPEC.lineHeight.body,
2498
+ fontWeight: 700
2499
+ },
2500
+ children: verdict
2501
+ }
2502
+ ),
2503
+ hasSource && /* @__PURE__ */ jsx(SlideSourceLine, { asOf, source })
2463
2504
  ]
2464
2505
  }
2465
2506
  );
2466
2507
  }
2508
+ function SlideSection({ index, title, lead, items, current }) {
2509
+ const hasItems = Boolean(items && items.length > 0);
2510
+ return /* @__PURE__ */ jsx(
2511
+ "section",
2512
+ {
2513
+ "data-slot": "slide-section",
2514
+ style: {
2515
+ width: "100%",
2516
+ height: "100%",
2517
+ boxSizing: "border-box",
2518
+ display: "grid",
2519
+ gridTemplateColumns: `repeat(${SLIDE_SPEC.grid.columns}, 1fr)`,
2520
+ gridTemplateRows: "minmax(0, 1fr)",
2521
+ columnGap: SLIDE_SPEC.grid.gutter,
2522
+ padding: `${SLIDE_SPEC.safeArea.y}px ${SLIDE_SPEC.safeArea.x}px`,
2523
+ color: "var(--slide-fg)",
2524
+ fontFamily: "var(--slide-font-body)"
2525
+ },
2526
+ children: /* @__PURE__ */ jsxs(SlideColumns, { align: "center", children: [
2527
+ /* @__PURE__ */ jsx(SlideColumn, { span: hasItems ? 7 : 12, children: /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: SLIDE_SPEC.space.md }, children: [
2528
+ /* @__PURE__ */ jsx("div", { style: { width: SLIDE_SPEC.grid.columnWidth, height: 8, background: "var(--slide-accent)" } }),
2529
+ index !== void 0 && /* @__PURE__ */ jsx(
2530
+ "p",
2531
+ {
2532
+ style: {
2533
+ margin: 0,
2534
+ fontSize: SLIDE_SPEC.fontSize.page,
2535
+ lineHeight: SLIDE_SPEC.lineHeight.heading,
2536
+ fontWeight: 700,
2537
+ color: "var(--slide-accent)",
2538
+ fontVariantNumeric: "tabular-nums"
2539
+ },
2540
+ children: String(index).padStart(2, "0")
2541
+ }
2542
+ ),
2543
+ /* @__PURE__ */ jsx(
2544
+ "h1",
2545
+ {
2546
+ style: {
2547
+ margin: 0,
2548
+ fontFamily: "var(--slide-font-display)",
2549
+ fontSize: SLIDE_SPEC.fontSize.section,
2550
+ lineHeight: SLIDE_SPEC.lineHeight.heading,
2551
+ fontWeight: 700
2552
+ },
2553
+ children: title
2554
+ }
2555
+ ),
2556
+ lead && /* @__PURE__ */ jsx("p", { style: { margin: 0, fontSize: "var(--slide-size-body)", lineHeight: SLIDE_SPEC.lineHeight.body, color: "var(--slide-muted)" }, children: lead })
2557
+ ] }) }),
2558
+ hasItems && /* @__PURE__ */ jsx(SlideColumn, { span: 5, children: /* @__PURE__ */ jsx("ol", { style: { margin: 0, padding: 0, listStyle: "none", display: "flex", flexDirection: "column", gap: SLIDE_SPEC.space.sm }, children: items.map((text, i) => {
2559
+ const active = current === i + 1;
2560
+ return /* @__PURE__ */ jsxs(
2561
+ "li",
2562
+ {
2563
+ "aria-current": active ? "step" : void 0,
2564
+ style: {
2565
+ display: "flex",
2566
+ gap: SLIDE_SPEC.space.sm,
2567
+ fontSize: "var(--slide-size-body)",
2568
+ lineHeight: SLIDE_SPEC.lineHeight.body,
2569
+ fontWeight: active ? 700 : 400,
2570
+ color: active ? "var(--slide-accent)" : "var(--slide-muted)"
2571
+ },
2572
+ children: [
2573
+ /* @__PURE__ */ jsx("span", { style: { fontVariantNumeric: "tabular-nums" }, children: String(i + 1).padStart(2, "0") }),
2574
+ /* @__PURE__ */ jsx("span", { children: text })
2575
+ ]
2576
+ },
2577
+ i
2578
+ );
2579
+ }) }) })
2580
+ ] })
2581
+ }
2582
+ );
2583
+ }
2467
2584
 
2468
- export { CANVAS_HEIGHT, CANVAS_WIDTH, MorphElement, Slide, SlideCanvas, SlideChartInsight, SlideCover, SlideDeck, SlideExecSummary, SlideKpiGrid, SlideKpiHero, SlideNextActions, SlideScorecardTable, Step, Steps, exportDeckAsPptx, useIsActiveSlide, useSlideNumber };
2585
+ export { CANVAS_HEIGHT, CANVAS_WIDTH, MorphElement, Slide, SlideCanvas, SlideChartFull, SlideChartInsight, SlideColumn, SlideColumns, SlideComparison, SlideCover, SlideDeck, SlideExecSummary, SlideHeading, SlideKpiGrid, SlideKpiHero, SlideNextActions, SlideScorecardTable, SlideSection, SlideSourceLine, Step, Steps, exportDeckAsPptx, useIsActiveSlide, useSlideNumber };
2469
2586
  //# sourceMappingURL=index.js.map
2470
2587
  //# sourceMappingURL=index.js.map