claude-presentation-master 7.2.1 → 7.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -354,6 +354,8 @@ interface ContentAnalysis$1 {
354
354
  detectedType: PresentationType$1;
355
355
  /** Main title */
356
356
  title: string;
357
+ /** Subtitle (line after title) */
358
+ subtitle?: string;
357
359
  /** Content sections */
358
360
  sections: ContentSection$1[];
359
361
  /** SCQA structure extracted */
@@ -950,6 +952,7 @@ interface ContentSection {
950
952
  interface ContentAnalysis {
951
953
  detectedType: PresentationType;
952
954
  title: string;
955
+ subtitle: string;
953
956
  sections: ContentSection[];
954
957
  keyMessages: string[];
955
958
  dataPoints: Array<{
@@ -990,7 +993,12 @@ declare class ContentAnalyzer {
990
993
  */
991
994
  private parseContent;
992
995
  /**
993
- * Extract the main title from content
996
+ * Extract the main title AND subtitle from content
997
+ * Subtitle is the line immediately after the H1 title (if not another header)
998
+ */
999
+ private extractTitleAndSubtitle;
1000
+ /**
1001
+ * Extract the main title from content (legacy wrapper)
994
1002
  */
995
1003
  private extractTitle;
996
1004
  /**
package/dist/index.d.ts CHANGED
@@ -354,6 +354,8 @@ interface ContentAnalysis$1 {
354
354
  detectedType: PresentationType$1;
355
355
  /** Main title */
356
356
  title: string;
357
+ /** Subtitle (line after title) */
358
+ subtitle?: string;
357
359
  /** Content sections */
358
360
  sections: ContentSection$1[];
359
361
  /** SCQA structure extracted */
@@ -950,6 +952,7 @@ interface ContentSection {
950
952
  interface ContentAnalysis {
951
953
  detectedType: PresentationType;
952
954
  title: string;
955
+ subtitle: string;
953
956
  sections: ContentSection[];
954
957
  keyMessages: string[];
955
958
  dataPoints: Array<{
@@ -990,7 +993,12 @@ declare class ContentAnalyzer {
990
993
  */
991
994
  private parseContent;
992
995
  /**
993
- * Extract the main title from content
996
+ * Extract the main title AND subtitle from content
997
+ * Subtitle is the line immediately after the H1 title (if not another header)
998
+ */
999
+ private extractTitleAndSubtitle;
1000
+ /**
1001
+ * Extract the main title from content (legacy wrapper)
994
1002
  */
995
1003
  private extractTitle;
996
1004
  /**
package/dist/index.js CHANGED
@@ -961,7 +961,8 @@ var ContentAnalyzer = class {
961
961
  async analyze(content, contentType) {
962
962
  await this.initialize();
963
963
  const text = this.parseContent(content, contentType);
964
- const title = this.extractTitle(text);
964
+ const { title, subtitle } = this.extractTitleAndSubtitle(text);
965
+ logger.step(`Title: "${title}", Subtitle: "${subtitle || "(none)"}"`);
965
966
  const detectedType = this.detectPresentationType(text);
966
967
  logger.step(`Detected type: ${detectedType}`);
967
968
  const sections = this.extractSections(text);
@@ -974,9 +975,13 @@ var ContentAnalyzer = class {
974
975
  const titles = sections.map((s) => s.header).filter((h) => h.length > 0);
975
976
  const starMoments = this.extractStarMoments(text);
976
977
  const estimatedSlideCount = Math.max(5, sections.length + 3);
978
+ const whatIsContent = scqa.situation ? [scqa.situation] : [];
979
+ const whatCouldBeContent = scqa.answer ? [scqa.answer] : keyMessages.slice(0, 2);
977
980
  return {
978
981
  detectedType,
979
982
  title,
983
+ subtitle,
984
+ // NEW: Use explicit subtitle from content
980
985
  sections,
981
986
  keyMessages,
982
987
  dataPoints,
@@ -987,8 +992,10 @@ var ContentAnalyzer = class {
987
992
  answer: scqa.answer || ""
988
993
  },
989
994
  sparkline: {
990
- whatIs: sparkline.callToAction ? [sparkline.callToAction] : [],
991
- whatCouldBe: keyMessages,
995
+ whatIs: whatIsContent,
996
+ // FIX: Use situation, not CTA
997
+ whatCouldBe: whatCouldBeContent,
998
+ // FIX: Use answer/vision, not random messages
992
999
  callToAdventure: sparkline.callToAction || ""
993
1000
  },
994
1001
  titles,
@@ -1016,18 +1023,46 @@ var ContentAnalyzer = class {
1016
1023
  return text;
1017
1024
  }
1018
1025
  /**
1019
- * Extract the main title from content
1026
+ * Extract the main title AND subtitle from content
1027
+ * Subtitle is the line immediately after the H1 title (if not another header)
1020
1028
  */
1021
- extractTitle(text) {
1022
- const h1Match = text.match(/^#\s+(.+)$/m);
1023
- if (h1Match && h1Match[1]) {
1024
- return h1Match[1].replace(/\*\*/g, "").trim();
1029
+ extractTitleAndSubtitle(text) {
1030
+ const lines = text.split("\n");
1031
+ let title = "Presentation";
1032
+ let subtitle = "";
1033
+ let foundTitle = false;
1034
+ let titleLineIndex = -1;
1035
+ for (let i = 0; i < lines.length; i++) {
1036
+ const rawLine = lines[i];
1037
+ if (!rawLine) continue;
1038
+ const line = rawLine.trim();
1039
+ const h1Match = line.match(/^#\s+(.+)$/);
1040
+ if (h1Match && h1Match[1] && !foundTitle) {
1041
+ title = h1Match[1].replace(/\*\*/g, "").trim();
1042
+ foundTitle = true;
1043
+ titleLineIndex = i;
1044
+ continue;
1045
+ }
1046
+ if (foundTitle && i > titleLineIndex && line.length > 0) {
1047
+ if (line.startsWith("#")) break;
1048
+ if (line.startsWith("-") || line.startsWith("*") || /^\d+\./.test(line)) break;
1049
+ subtitle = line.replace(/\*\*/g, "").trim().slice(0, 100);
1050
+ break;
1051
+ }
1025
1052
  }
1026
- const lines = text.split("\n").filter((l) => l.trim().length > 0);
1027
- if (lines.length > 0 && lines[0]) {
1028
- return lines[0].replace(/^#+\s*/, "").replace(/\*\*/g, "").trim().slice(0, 80);
1053
+ if (!foundTitle) {
1054
+ const firstLine = lines.find((l) => l.trim().length > 0);
1055
+ if (firstLine) {
1056
+ title = firstLine.replace(/^#+\s*/, "").replace(/\*\*/g, "").trim().slice(0, 80);
1057
+ }
1029
1058
  }
1030
- return "Presentation";
1059
+ return { title, subtitle };
1060
+ }
1061
+ /**
1062
+ * Extract the main title from content (legacy wrapper)
1063
+ */
1064
+ extractTitle(text) {
1065
+ return this.extractTitleAndSubtitle(text).title;
1031
1066
  }
1032
1067
  /**
1033
1068
  * Detect presentation type from content signals
@@ -1830,9 +1865,10 @@ var SlideFactory = class {
1830
1865
  const data = {
1831
1866
  title: this.truncateText(analysis.title, this.config.rules.wordsPerSlide.max)
1832
1867
  };
1833
- if (analysis.keyMessages[0]) {
1868
+ const subtitleSource = analysis.subtitle || analysis.keyMessages[0] || "";
1869
+ if (subtitleSource) {
1834
1870
  data.subtitle = this.truncateText(
1835
- analysis.keyMessages[0],
1871
+ subtitleSource,
1836
1872
  this.config.defaults.subtitle.maxWords
1837
1873
  // FROM KB
1838
1874
  );
@@ -1876,7 +1912,9 @@ var SlideFactory = class {
1876
1912
  addSCQASlides(slides, analysis) {
1877
1913
  const scqa = analysis.scqa;
1878
1914
  const titles = this.config.scqaTitles;
1879
- if (scqa?.situation && !this.usedContent.has("scqa-situation")) {
1915
+ const minBodyLength = 20;
1916
+ const situationBody = scqa?.situation ? this.truncateText(scqa.situation, this.config.rules.wordsPerSlide.max) : "";
1917
+ if (situationBody.length >= minBodyLength && !this.usedContent.has("scqa-situation")) {
1880
1918
  this.usedContent.add("scqa-situation");
1881
1919
  slides.push({
1882
1920
  index: slides.length,
@@ -1884,12 +1922,13 @@ var SlideFactory = class {
1884
1922
  data: {
1885
1923
  title: titles.situation,
1886
1924
  // FROM KB - not hardcoded 'Current Situation'
1887
- body: this.truncateText(scqa.situation, this.config.rules.wordsPerSlide.max)
1925
+ body: situationBody
1888
1926
  },
1889
1927
  classes: ["situation-slide"]
1890
1928
  });
1891
1929
  }
1892
- if (scqa?.complication && !this.usedContent.has("scqa-complication")) {
1930
+ const complicationBody = scqa?.complication ? this.truncateText(scqa.complication, this.config.rules.wordsPerSlide.max) : "";
1931
+ if (complicationBody.length >= minBodyLength && !this.usedContent.has("scqa-complication")) {
1893
1932
  this.usedContent.add("scqa-complication");
1894
1933
  slides.push({
1895
1934
  index: slides.length,
@@ -1897,12 +1936,13 @@ var SlideFactory = class {
1897
1936
  data: {
1898
1937
  title: titles.complication,
1899
1938
  // FROM KB - not hardcoded 'The Challenge'
1900
- body: this.truncateText(scqa.complication, this.config.rules.wordsPerSlide.max)
1939
+ body: complicationBody
1901
1940
  },
1902
1941
  classes: ["complication-slide"]
1903
1942
  });
1904
1943
  }
1905
- if (scqa?.question && !this.usedContent.has("scqa-question")) {
1944
+ const questionBody = scqa?.question ? this.truncateText(scqa.question, this.config.rules.wordsPerSlide.max) : "";
1945
+ if (questionBody.length >= minBodyLength && !this.usedContent.has("scqa-question")) {
1906
1946
  this.usedContent.add("scqa-question");
1907
1947
  slides.push({
1908
1948
  index: slides.length,
@@ -1910,7 +1950,7 @@ var SlideFactory = class {
1910
1950
  data: {
1911
1951
  title: titles.question,
1912
1952
  // FROM KB - not hardcoded 'The Question'
1913
- body: this.truncateText(scqa.question, this.config.rules.wordsPerSlide.max)
1953
+ body: questionBody
1914
1954
  },
1915
1955
  classes: ["question-slide"]
1916
1956
  });
@@ -1920,7 +1960,8 @@ var SlideFactory = class {
1920
1960
  const spark = analysis.sparkline;
1921
1961
  const titles = this.config.sparklineTitles;
1922
1962
  const whatIsFirst = spark?.whatIs?.[0];
1923
- if (whatIsFirst && !this.usedContent.has("spark-what-is")) {
1963
+ const whatIsBody = whatIsFirst ? this.truncateText(whatIsFirst, this.config.rules.wordsPerSlide.max) : "";
1964
+ if (whatIsBody.length >= 20 && !this.usedContent.has("spark-what-is")) {
1924
1965
  this.usedContent.add("spark-what-is");
1925
1966
  slides.push({
1926
1967
  index: slides.length,
@@ -1928,13 +1969,14 @@ var SlideFactory = class {
1928
1969
  data: {
1929
1970
  title: titles.whatIs,
1930
1971
  // FROM KB - not hardcoded 'Where We Are Today'
1931
- body: this.truncateText(whatIsFirst, this.config.rules.wordsPerSlide.max)
1972
+ body: whatIsBody
1932
1973
  },
1933
1974
  classes: ["what-is-slide"]
1934
1975
  });
1935
1976
  }
1936
1977
  const whatCouldBeFirst = spark?.whatCouldBe?.[0];
1937
- if (whatCouldBeFirst && !this.usedContent.has("spark-could-be")) {
1978
+ const whatCouldBeBody = whatCouldBeFirst ? this.truncateText(whatCouldBeFirst, this.config.rules.wordsPerSlide.max) : "";
1979
+ if (whatCouldBeBody.length >= 20 && !this.usedContent.has("spark-could-be")) {
1938
1980
  this.usedContent.add("spark-could-be");
1939
1981
  slides.push({
1940
1982
  index: slides.length,
@@ -1942,7 +1984,7 @@ var SlideFactory = class {
1942
1984
  data: {
1943
1985
  title: titles.whatCouldBe,
1944
1986
  // FROM KB - not hardcoded 'What Could Be'
1945
- body: this.truncateText(whatCouldBeFirst, this.config.rules.wordsPerSlide.max)
1987
+ body: whatCouldBeBody
1946
1988
  },
1947
1989
  classes: ["what-could-be-slide"]
1948
1990
  });
@@ -2151,16 +2193,18 @@ var SlideFactory = class {
2151
2193
  };
2152
2194
  }
2153
2195
  createSingleStatementSlide(index, section) {
2196
+ const bodyContent = section.content || section.bullets.join(" ") || "";
2197
+ const truncatedBody = this.truncateText(bodyContent, this.config.rules.wordsPerSlide.max);
2198
+ if (truncatedBody.length < 15 && section.bullets.length > 0) {
2199
+ return this.createBulletSlide(index, section);
2200
+ }
2154
2201
  return {
2155
2202
  index,
2156
2203
  type: "single-statement",
2157
2204
  data: {
2158
2205
  title: this.createTitle(section.header, section),
2159
- body: this.truncateText(
2160
- section.content || section.bullets[0] || "",
2161
- this.config.rules.wordsPerSlide.max
2162
- // FROM KB
2163
- )
2206
+ body: truncatedBody || section.header
2207
+ // Fallback to header if no body
2164
2208
  },
2165
2209
  classes: ["single-statement-slide"]
2166
2210
  };
package/dist/index.mjs CHANGED
@@ -889,7 +889,8 @@ var ContentAnalyzer = class {
889
889
  async analyze(content, contentType) {
890
890
  await this.initialize();
891
891
  const text = this.parseContent(content, contentType);
892
- const title = this.extractTitle(text);
892
+ const { title, subtitle } = this.extractTitleAndSubtitle(text);
893
+ logger.step(`Title: "${title}", Subtitle: "${subtitle || "(none)"}"`);
893
894
  const detectedType = this.detectPresentationType(text);
894
895
  logger.step(`Detected type: ${detectedType}`);
895
896
  const sections = this.extractSections(text);
@@ -902,9 +903,13 @@ var ContentAnalyzer = class {
902
903
  const titles = sections.map((s) => s.header).filter((h) => h.length > 0);
903
904
  const starMoments = this.extractStarMoments(text);
904
905
  const estimatedSlideCount = Math.max(5, sections.length + 3);
906
+ const whatIsContent = scqa.situation ? [scqa.situation] : [];
907
+ const whatCouldBeContent = scqa.answer ? [scqa.answer] : keyMessages.slice(0, 2);
905
908
  return {
906
909
  detectedType,
907
910
  title,
911
+ subtitle,
912
+ // NEW: Use explicit subtitle from content
908
913
  sections,
909
914
  keyMessages,
910
915
  dataPoints,
@@ -915,8 +920,10 @@ var ContentAnalyzer = class {
915
920
  answer: scqa.answer || ""
916
921
  },
917
922
  sparkline: {
918
- whatIs: sparkline.callToAction ? [sparkline.callToAction] : [],
919
- whatCouldBe: keyMessages,
923
+ whatIs: whatIsContent,
924
+ // FIX: Use situation, not CTA
925
+ whatCouldBe: whatCouldBeContent,
926
+ // FIX: Use answer/vision, not random messages
920
927
  callToAdventure: sparkline.callToAction || ""
921
928
  },
922
929
  titles,
@@ -944,18 +951,46 @@ var ContentAnalyzer = class {
944
951
  return text;
945
952
  }
946
953
  /**
947
- * Extract the main title from content
954
+ * Extract the main title AND subtitle from content
955
+ * Subtitle is the line immediately after the H1 title (if not another header)
948
956
  */
949
- extractTitle(text) {
950
- const h1Match = text.match(/^#\s+(.+)$/m);
951
- if (h1Match && h1Match[1]) {
952
- return h1Match[1].replace(/\*\*/g, "").trim();
957
+ extractTitleAndSubtitle(text) {
958
+ const lines = text.split("\n");
959
+ let title = "Presentation";
960
+ let subtitle = "";
961
+ let foundTitle = false;
962
+ let titleLineIndex = -1;
963
+ for (let i = 0; i < lines.length; i++) {
964
+ const rawLine = lines[i];
965
+ if (!rawLine) continue;
966
+ const line = rawLine.trim();
967
+ const h1Match = line.match(/^#\s+(.+)$/);
968
+ if (h1Match && h1Match[1] && !foundTitle) {
969
+ title = h1Match[1].replace(/\*\*/g, "").trim();
970
+ foundTitle = true;
971
+ titleLineIndex = i;
972
+ continue;
973
+ }
974
+ if (foundTitle && i > titleLineIndex && line.length > 0) {
975
+ if (line.startsWith("#")) break;
976
+ if (line.startsWith("-") || line.startsWith("*") || /^\d+\./.test(line)) break;
977
+ subtitle = line.replace(/\*\*/g, "").trim().slice(0, 100);
978
+ break;
979
+ }
953
980
  }
954
- const lines = text.split("\n").filter((l) => l.trim().length > 0);
955
- if (lines.length > 0 && lines[0]) {
956
- return lines[0].replace(/^#+\s*/, "").replace(/\*\*/g, "").trim().slice(0, 80);
981
+ if (!foundTitle) {
982
+ const firstLine = lines.find((l) => l.trim().length > 0);
983
+ if (firstLine) {
984
+ title = firstLine.replace(/^#+\s*/, "").replace(/\*\*/g, "").trim().slice(0, 80);
985
+ }
957
986
  }
958
- return "Presentation";
987
+ return { title, subtitle };
988
+ }
989
+ /**
990
+ * Extract the main title from content (legacy wrapper)
991
+ */
992
+ extractTitle(text) {
993
+ return this.extractTitleAndSubtitle(text).title;
959
994
  }
960
995
  /**
961
996
  * Detect presentation type from content signals
@@ -1758,9 +1793,10 @@ var SlideFactory = class {
1758
1793
  const data = {
1759
1794
  title: this.truncateText(analysis.title, this.config.rules.wordsPerSlide.max)
1760
1795
  };
1761
- if (analysis.keyMessages[0]) {
1796
+ const subtitleSource = analysis.subtitle || analysis.keyMessages[0] || "";
1797
+ if (subtitleSource) {
1762
1798
  data.subtitle = this.truncateText(
1763
- analysis.keyMessages[0],
1799
+ subtitleSource,
1764
1800
  this.config.defaults.subtitle.maxWords
1765
1801
  // FROM KB
1766
1802
  );
@@ -1804,7 +1840,9 @@ var SlideFactory = class {
1804
1840
  addSCQASlides(slides, analysis) {
1805
1841
  const scqa = analysis.scqa;
1806
1842
  const titles = this.config.scqaTitles;
1807
- if (scqa?.situation && !this.usedContent.has("scqa-situation")) {
1843
+ const minBodyLength = 20;
1844
+ const situationBody = scqa?.situation ? this.truncateText(scqa.situation, this.config.rules.wordsPerSlide.max) : "";
1845
+ if (situationBody.length >= minBodyLength && !this.usedContent.has("scqa-situation")) {
1808
1846
  this.usedContent.add("scqa-situation");
1809
1847
  slides.push({
1810
1848
  index: slides.length,
@@ -1812,12 +1850,13 @@ var SlideFactory = class {
1812
1850
  data: {
1813
1851
  title: titles.situation,
1814
1852
  // FROM KB - not hardcoded 'Current Situation'
1815
- body: this.truncateText(scqa.situation, this.config.rules.wordsPerSlide.max)
1853
+ body: situationBody
1816
1854
  },
1817
1855
  classes: ["situation-slide"]
1818
1856
  });
1819
1857
  }
1820
- if (scqa?.complication && !this.usedContent.has("scqa-complication")) {
1858
+ const complicationBody = scqa?.complication ? this.truncateText(scqa.complication, this.config.rules.wordsPerSlide.max) : "";
1859
+ if (complicationBody.length >= minBodyLength && !this.usedContent.has("scqa-complication")) {
1821
1860
  this.usedContent.add("scqa-complication");
1822
1861
  slides.push({
1823
1862
  index: slides.length,
@@ -1825,12 +1864,13 @@ var SlideFactory = class {
1825
1864
  data: {
1826
1865
  title: titles.complication,
1827
1866
  // FROM KB - not hardcoded 'The Challenge'
1828
- body: this.truncateText(scqa.complication, this.config.rules.wordsPerSlide.max)
1867
+ body: complicationBody
1829
1868
  },
1830
1869
  classes: ["complication-slide"]
1831
1870
  });
1832
1871
  }
1833
- if (scqa?.question && !this.usedContent.has("scqa-question")) {
1872
+ const questionBody = scqa?.question ? this.truncateText(scqa.question, this.config.rules.wordsPerSlide.max) : "";
1873
+ if (questionBody.length >= minBodyLength && !this.usedContent.has("scqa-question")) {
1834
1874
  this.usedContent.add("scqa-question");
1835
1875
  slides.push({
1836
1876
  index: slides.length,
@@ -1838,7 +1878,7 @@ var SlideFactory = class {
1838
1878
  data: {
1839
1879
  title: titles.question,
1840
1880
  // FROM KB - not hardcoded 'The Question'
1841
- body: this.truncateText(scqa.question, this.config.rules.wordsPerSlide.max)
1881
+ body: questionBody
1842
1882
  },
1843
1883
  classes: ["question-slide"]
1844
1884
  });
@@ -1848,7 +1888,8 @@ var SlideFactory = class {
1848
1888
  const spark = analysis.sparkline;
1849
1889
  const titles = this.config.sparklineTitles;
1850
1890
  const whatIsFirst = spark?.whatIs?.[0];
1851
- if (whatIsFirst && !this.usedContent.has("spark-what-is")) {
1891
+ const whatIsBody = whatIsFirst ? this.truncateText(whatIsFirst, this.config.rules.wordsPerSlide.max) : "";
1892
+ if (whatIsBody.length >= 20 && !this.usedContent.has("spark-what-is")) {
1852
1893
  this.usedContent.add("spark-what-is");
1853
1894
  slides.push({
1854
1895
  index: slides.length,
@@ -1856,13 +1897,14 @@ var SlideFactory = class {
1856
1897
  data: {
1857
1898
  title: titles.whatIs,
1858
1899
  // FROM KB - not hardcoded 'Where We Are Today'
1859
- body: this.truncateText(whatIsFirst, this.config.rules.wordsPerSlide.max)
1900
+ body: whatIsBody
1860
1901
  },
1861
1902
  classes: ["what-is-slide"]
1862
1903
  });
1863
1904
  }
1864
1905
  const whatCouldBeFirst = spark?.whatCouldBe?.[0];
1865
- if (whatCouldBeFirst && !this.usedContent.has("spark-could-be")) {
1906
+ const whatCouldBeBody = whatCouldBeFirst ? this.truncateText(whatCouldBeFirst, this.config.rules.wordsPerSlide.max) : "";
1907
+ if (whatCouldBeBody.length >= 20 && !this.usedContent.has("spark-could-be")) {
1866
1908
  this.usedContent.add("spark-could-be");
1867
1909
  slides.push({
1868
1910
  index: slides.length,
@@ -1870,7 +1912,7 @@ var SlideFactory = class {
1870
1912
  data: {
1871
1913
  title: titles.whatCouldBe,
1872
1914
  // FROM KB - not hardcoded 'What Could Be'
1873
- body: this.truncateText(whatCouldBeFirst, this.config.rules.wordsPerSlide.max)
1915
+ body: whatCouldBeBody
1874
1916
  },
1875
1917
  classes: ["what-could-be-slide"]
1876
1918
  });
@@ -2079,16 +2121,18 @@ var SlideFactory = class {
2079
2121
  };
2080
2122
  }
2081
2123
  createSingleStatementSlide(index, section) {
2124
+ const bodyContent = section.content || section.bullets.join(" ") || "";
2125
+ const truncatedBody = this.truncateText(bodyContent, this.config.rules.wordsPerSlide.max);
2126
+ if (truncatedBody.length < 15 && section.bullets.length > 0) {
2127
+ return this.createBulletSlide(index, section);
2128
+ }
2082
2129
  return {
2083
2130
  index,
2084
2131
  type: "single-statement",
2085
2132
  data: {
2086
2133
  title: this.createTitle(section.header, section),
2087
- body: this.truncateText(
2088
- section.content || section.bullets[0] || "",
2089
- this.config.rules.wordsPerSlide.max
2090
- // FROM KB
2091
- )
2134
+ body: truncatedBody || section.header
2135
+ // Fallback to header if no body
2092
2136
  },
2093
2137
  classes: ["single-statement-slide"]
2094
2138
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-presentation-master",
3
- "version": "7.2.1",
3
+ "version": "7.3.0",
4
4
  "description": "Generate world-class presentations using expert methodologies from Duarte, Reynolds, Gallo, and Anderson. Enforces rigorous quality standards through real visual validation.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",