From de290281eb1f22b1d46fc9924bd1d03c122dca70 Mon Sep 17 00:00:00 2001 From: shiva raj badu Date: Thu, 9 Apr 2026 13:09:49 +0545 Subject: [PATCH] feat: font support in new templates --- electron/servers/nextjs/app/globals.css | 34 + .../Code/CodeSlide01RoadmapCover.tsx | 4 +- .../Code/CodeSlide02CodeExplanationSplit.tsx | 93 +-- .../Code/CodeSlide03ApiRequestResponse.tsx | 139 ++-- .../Code/CodeSlide04FeatureGrid.tsx | 103 +-- .../Code/CodeSlide05ComparisonTable.tsx | 123 ++-- .../Code/CodeSlide06Workflow.tsx | 111 +-- .../Code/CodeSlide07UseCaseList.tsx | 91 +-- .../Code/CodeSlide08CodeExplanationText.tsx | 45 +- .../Code/CodeSlide09TableOfContent.tsx | 51 +- .../Code/CodeSlide10MetricsSplit.tsx | 85 +-- .../Code/CodeSlide11MetricsGrid.tsx | 79 +- .../Education/EducationContentSplitSlide.tsx | 10 +- .../EducationStatisticsGridSlide.tsx | 14 +- .../BusinessChallengesCardsSlide.tsx | 127 ++-- .../BusinessChallengesGridSlide.tsx | 73 +- .../ProductOverview/ComparisonChartSlide.tsx | 163 ++-- .../ComparisonTableWithTextSlide.tsx | 147 ++-- .../ProductOverview/CoverSlide.tsx | 107 +-- .../ProductOverview/ImageGallerySlide.tsx | 99 +-- .../ProductOverview/IntroductionSlide.tsx | 95 +-- .../ProductOverview/KpiCardsSlide.tsx | 115 +-- .../MarketOpportunitySlide.tsx | 137 ++-- .../ProductOverview/MeetTeamSlide.tsx | 139 ++-- .../ProductOverview/MissionVisionSlide.tsx | 121 +-- .../ProductOverview/OurServicesSlide.tsx | 155 ++-- .../ProductOverview/PricingPlanSlide.tsx | 143 ++-- .../ProductOverview/ProcessSlide.tsx | 205 +++--- .../ProductOverview/ReportSnapshotSlide.tsx | 693 +++++++++--------- .../ProductOverview/TableOfContentSlide.tsx | 93 +-- .../Report/DataAnalysisBarSlide.tsx | 10 +- .../Report/DataAnalysisDashboardSlide.tsx | 19 +- .../Report/DataAnalysisInsightBarSlide.tsx | 5 +- .../Report/DataAnalysisLineStatsSlide.tsx | 29 +- .../Report/DataAnalysisListSlide.tsx | 2 +- .../Report/IntroSlide.tsx | 2 +- .../Report/IntroductionImageSlide.tsx | 14 +- .../Report/IntroductionStatsSlide.tsx | 30 +- .../Report/MilestoneSlide.tsx | 2 +- .../Report/PerformanceSnapshotSlide.tsx | 24 +- .../Report/ServicesSlide.tsx | 2 +- .../Report/SolutionSlide.tsx | 2 +- .../Report/TeamSlide.tsx | 2 +- .../Report/flexibleReportChart.tsx | 4 +- 44 files changed, 1925 insertions(+), 1816 deletions(-) diff --git a/electron/servers/nextjs/app/globals.css b/electron/servers/nextjs/app/globals.css index ac589850..137382cc 100644 --- a/electron/servers/nextjs/app/globals.css +++ b/electron/servers/nextjs/app/globals.css @@ -82,6 +82,40 @@ strong { } +@font-face { + font-family: 'Times New Roman'; + src: url('https: //presenton-public.s3.ap-southeast-1.amazonaws.com/static/fonts/times.ttf') format('truetype'); + font-style: normal; + font-display: swap; + +} + +@font-face { + font-family: 'Helvetica Neue'; + src: url('https: //presenton-public.s3.ap-southeast-1.amazonaws.com/static/fonts/HelveticaNeueBold.otf') format('truetype'); + font-weight: 600; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Helvetica Neue'; + src: url('https: //presenton-public.s3.ap-southeast-1.amazonaws.com/static/fonts/HelveticaNeueMedium.otf') format('truetype'); + font-weight: 500; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Helvetica Neue'; + src: url('https: //presenton-public.s3.ap-southeast-1.amazonaws.com/static/fonts/HelveticaNeueRoman.otf') format('truetype'); + font-weight: 400; + font-style: normal; + font-display: swap; +} + + + ::selection { background-color: hsl(var(--chart-1)); diff --git a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide01RoadmapCover.tsx b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide01RoadmapCover.tsx index 7c0ff024..4e100bca 100644 --- a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide01RoadmapCover.tsx +++ b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide01RoadmapCover.tsx @@ -31,7 +31,8 @@ export type SchemaType = z.infer; const CodeSlide01RoadmapCover = ({ data }: { data: Partial }) => { - return ( + return (<> +
}) => { {data.pageLabel}
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide02CodeExplanationSplit.tsx b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide02CodeExplanationSplit.tsx index eda51568..cef31779 100644 --- a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide02CodeExplanationSplit.tsx +++ b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide02CodeExplanationSplit.tsx @@ -64,63 +64,66 @@ const CodeSlide02CodeExplanationSplit = ({ }) => { return ( -
+ <> + +
-
-

{data.title}

+
+

{data.title}

-
-
-

+

- {data.codeSnippet?.fileName} -

-
+              

+ {data.codeSnippet?.fileName} +

+
 
-              
-                {data.codeSnippet?.content}
-              
-            
-
+ + {data.codeSnippet?.content} + + +
-
-

{data.explanationTitle}

-

- {data.explanation} -

+
+

{data.explanationTitle}

+

+ {data.explanation} +

+
-
-
- {data.pageLabel} +
+ {data.pageLabel} +
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide03ApiRequestResponse.tsx b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide03ApiRequestResponse.tsx index 3c8c74d6..784b30a7 100644 --- a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide03ApiRequestResponse.tsx +++ b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide03ApiRequestResponse.tsx @@ -73,43 +73,71 @@ const CodeSlide03ApiRequestResponse = ({ }) => { return ( -
+ <> + +
-
-

{data.title}

+
+

{data.title}

-
-
-
-
+
+
+
+
+

+ {data.method} +

+

{data.endpoint}

+
+

Headers

+
+ {data.headers?.map((item) => ( +

{item}

+ ))} +
+
+ +

- {data.method} + {data.requestSnippet?.fileName}

-

{data.endpoint}

-
-

Headers

-
- {data.headers?.map((item) => ( -

{item}

- ))} +
+
+                  
+                    {data.requestSnippet?.content}
+                  
+                
@@ -128,55 +156,30 @@ const CodeSlide03ApiRequestResponse = ({ borderColor: "var(--stroke,#1D293D80)", }} > - {data.requestSnippet?.fileName} + {data.responseSnippet?.fileName}

 
                 
-                  {data.requestSnippet?.content}
+                  {data.responseSnippet?.content}
                 
               
+
-
-

- {data.responseSnippet?.fileName} -

-
-
-              
-                {data.responseSnippet?.content}
-              
-            
-
+
+ {data.pageLabel}
- -
- {data.pageLabel} -
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide04FeatureGrid.tsx b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide04FeatureGrid.tsx index 5062cd8c..6416862c 100644 --- a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide04FeatureGrid.tsx +++ b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide04FeatureGrid.tsx @@ -99,61 +99,64 @@ const CodeSlide04FeatureGrid = ({ data }: { data: Partial }) => { return ( -
- - -

{data.title}

- -
- {data?.features?.map((feature) => ( -
-
-

{feature.title}

- - {feature.icon.__icon_query__} - -
-

{feature.description}

-
- ))} -
- - + <> +
- {data.pageLabel} + + +

{data.title}

+ +
+ {data?.features?.map((feature) => ( +
+
+

{feature.title}

+ + {feature.icon.__icon_query__} + +
+

{feature.description}

+
+ ))} +
+ + +
+ {data.pageLabel} +
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide05ComparisonTable.tsx b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide05ComparisonTable.tsx index 0dbd5388..587c2615 100644 --- a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide05ComparisonTable.tsx +++ b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide05ComparisonTable.tsx @@ -50,7 +50,7 @@ export const Schema = z.object({ export type SchemaType = z.infer; function renderCell(value: string) { - if (value.toLowerCase() === "check") { + if (value && value.toLowerCase() === "check") { return ; } @@ -60,83 +60,86 @@ function renderCell(value: string) { const CodeSlide05ComparisonTable = ({ data }: { data: Partial }) => { return ( -
- -

{data.title}

- + <> +
+ +

{data.title}

+
+
- {data?.tableColumns?.map((column) => ( -

- {column} -

- ))} -
- -
- {data?.rows?.map((row) => ( -
+ {data?.tableColumns?.map((column) => (

- {row.feature} + {column}

-
{renderCell(row.column1)}
-
{renderCell(row.column2)}
-
{renderCell(row.column3)}
-
- ))} + ))} +
+ +
+ {data?.rows?.map((row) => ( +
+

+ {row.feature} +

+
{renderCell(row.column1)}
+
{renderCell(row.column2)}
+
{renderCell(row.column3)}
+
+ ))} +
+
+
+ {data.pageLabel} +
- -
- {data.pageLabel} -
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide06Workflow.tsx b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide06Workflow.tsx index 2b90ee1a..765de291 100644 --- a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide06Workflow.tsx +++ b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide06Workflow.tsx @@ -81,65 +81,68 @@ export type SchemaType = z.infer; const CodeSlide06Workflow = ({ data }: { data: Partial }) => { return ( -
- -

{data.title}

- -
- {data?.steps?.map((step, index) => ( - -
-
- {step.icon.__icon_query__} -
-

{step.title}

-

{step.description}

-
- {index < (data?.steps?.length || 0) - 1 && ( - - - - - )} -
- ))} - -
- + <> +
- {data.pageLabel} + +

{data.title}

+ +
+ {data?.steps?.map((step, index) => ( + +
+
+ {step.icon.__icon_query__} +
+

{step.title}

+

{step.description}

+
+ {index < (data?.steps?.length || 0) - 1 && ( + + + + + )} +
+ ))} + +
+ +
+ {data.pageLabel} +
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide07UseCaseList.tsx b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide07UseCaseList.tsx index 8d0f764e..5defbc5d 100644 --- a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide07UseCaseList.tsx +++ b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide07UseCaseList.tsx @@ -36,55 +36,58 @@ export type SchemaType = z.infer; const CodeSlide07UseCaseList = ({ data }: { data: Partial }) => { return ( -
- - -

{data.title}

- -
- {data?.items?.map((item, index) => ( -
- - {index + 1} - -

{item}

-
- ))} -
- - + <> +
- {data.pageLabel} + + +

{data.title}

+ +
+ {data?.items?.map((item, index) => ( +
+ + {index + 1} + +

{item}

+
+ ))} +
+ + +
+ {data.pageLabel} +
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide08CodeExplanationText.tsx b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide08CodeExplanationText.tsx index 871d2155..b4e3831c 100644 --- a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide08CodeExplanationText.tsx +++ b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide08CodeExplanationText.tsx @@ -32,32 +32,35 @@ export type SchemaType = z.infer; const CodeSlide08CodeExplanationText = ({ data }: { data: Partial }) => { return ( -
- - -

{data.title}

-
-

{data.explanationTitle}

-

{data.explanation}

-
- + <> +
- {data.pageLabel} + + +

{data.title}

+
+

{data.explanationTitle}

+

{data.explanation}

+
+ +
+ {data.pageLabel} +
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide09TableOfContent.tsx b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide09TableOfContent.tsx index a1aebc91..f37d0bea 100644 --- a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide09TableOfContent.tsx +++ b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide09TableOfContent.tsx @@ -72,35 +72,38 @@ const CodeSlide09TableOfContent = ({ data }: { data: Partial }) => { return ( -
- - -
-

{data.title}

- -
- - -
-
- + <> +
- {data.pageLabel} + + +
+

{data.title}

+ +
+ + +
+
+ +
+ {data.pageLabel} +
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide10MetricsSplit.tsx b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide10MetricsSplit.tsx index 7cfeda87..e41b3dd8 100644 --- a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide10MetricsSplit.tsx +++ b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide10MetricsSplit.tsx @@ -55,52 +55,55 @@ const CodeSlide10MetricsSplit = ({ data }: { data: Partial }) => { return ( -
- - -

{data.title}

-
-
-

{data.explanationTitle}

-

{data.explanation}

-
- -
- {data?.metrics?.map((metric, index) => ( -
-

{metric.value}

-

{metric.label}

-

{metric.period}

-
- ))} -
-
- + <> +
- {data?.pageLabel} + + +

{data.title}

+
+
+

{data.explanationTitle}

+

{data.explanation}

+
+ +
+ {data?.metrics?.map((metric, index) => ( +
+

{metric.value}

+

{metric.label}

+

{metric.period}

+
+ ))} +
+
+ +
+ {data?.pageLabel} +
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide11MetricsGrid.tsx b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide11MetricsGrid.tsx index 5e9761cc..ecce205a 100644 --- a/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide11MetricsGrid.tsx +++ b/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide11MetricsGrid.tsx @@ -46,49 +46,52 @@ export type SchemaType = z.infer; const CodeSlide11MetricsGrid = ({ data }: { data: Partial }) => { return ( -
- - - -

{data.title}

- -
- {data?.metrics?.map((metric, index) => ( -
-

{metric.value}

-

{metric.label}

-

{metric.period}

-
- ))} -
- - + <> +
- {data.pageLabel} + + + +

{data.title}

+ +
+ {data?.metrics?.map((metric, index) => ( +
+

{metric.value}

+

{metric.label}

+

{metric.period}

+
+ ))} +
+ + +
+ {data.pageLabel} +
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/Education/EducationContentSplitSlide.tsx b/electron/servers/nextjs/app/presentation-templates/Education/EducationContentSplitSlide.tsx index 500039c5..e12bb2a3 100644 --- a/electron/servers/nextjs/app/presentation-templates/Education/EducationContentSplitSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/Education/EducationContentSplitSlide.tsx @@ -52,16 +52,16 @@ const EducationContentSplitSlide = ({ data }: { data: Partial }) => className=" h-full w-full object-cover object-center" />
-
-
+
{collageImage?.__image_prompt__}
-
{collageImage?.__image_prompt__}
diff --git a/electron/servers/nextjs/app/presentation-templates/Education/EducationStatisticsGridSlide.tsx b/electron/servers/nextjs/app/presentation-templates/Education/EducationStatisticsGridSlide.tsx index ec698ea3..eefd401e 100644 --- a/electron/servers/nextjs/app/presentation-templates/Education/EducationStatisticsGridSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/Education/EducationStatisticsGridSlide.tsx @@ -7,21 +7,21 @@ export const slideLayoutDescription = const StatisticSchema = z.object({ value: z.string().min(1).max(8).meta({ - description: "Main metric value shown at the top of one card.", + description: "Main metric value shown at the top of one card. with max 8 characters", }), - label: z.string().min(3).max(22).meta({ - description: "Label shown under the value.", + label: z.string().min(3).max(20).meta({ + description: "Label shown under the value. with max 20 characters", }), }); export const Schema = z.object({ title: z.string().min(4).max(14).default("Statistics").meta({ - description: "Main title shown in the left column.", + description: "Main title shown in the left column. with max 14 characters", }), description: z.string().min(40).max(120).default( - "Lorem ipsum dolor sit amet, consectetur adipiscing elit." + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. with max 120 characters" ).meta({ - description: "Supporting line shown under the left title.", + description: "Supporting line shown under the left title. with max 120 characters", }), stats: z .array(StatisticSchema) @@ -38,7 +38,7 @@ export const Schema = z.object({ { value: "20", label: "Merchandising Team" }, ]) .meta({ - description: "Eight statistic cards shown in a 2-column, 4-row grid.", + description: "Eight statistic cards. with max 8 cards", }), }); diff --git a/electron/servers/nextjs/app/presentation-templates/ProductOverview/BusinessChallengesCardsSlide.tsx b/electron/servers/nextjs/app/presentation-templates/ProductOverview/BusinessChallengesCardsSlide.tsx index 378f8d1a..2d3e2191 100644 --- a/electron/servers/nextjs/app/presentation-templates/ProductOverview/BusinessChallengesCardsSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/ProductOverview/BusinessChallengesCardsSlide.tsx @@ -73,80 +73,83 @@ const BusinessChallengesCardsSlide = ({ data }: { data: Partial }) = const { title, taglineLabel, taglineBody, heroImage, cards } = data; return ( -
-
-

- {title} -

- -
-

+ +

+
+

- {taglineLabel} -

-

- {taglineBody} -

-

-
+ {title} + - {heroImage?.__image_url__ && ( - {heroImage.__image_prompt__} - )} - -
- {cards?.map((card, index) => ( -
+

- {card.heading} + {taglineLabel}

- {card.body} + {taglineBody}

- ))} +
+ + {heroImage?.__image_url__ && ( + {heroImage.__image_prompt__} + )} + +
+ {cards?.map((card, index) => ( +
+

+ {card.heading} +

+

+ {card.body} +

+
+ ))} +
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/ProductOverview/BusinessChallengesGridSlide.tsx b/electron/servers/nextjs/app/presentation-templates/ProductOverview/BusinessChallengesGridSlide.tsx index a3243257..df91222f 100644 --- a/electron/servers/nextjs/app/presentation-templates/ProductOverview/BusinessChallengesGridSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/ProductOverview/BusinessChallengesGridSlide.tsx @@ -51,44 +51,47 @@ const BusinessChallengesGridSlide = ({ data }: { data: Partial }) => const { title, challenges } = data; return ( -
-
-

- {title} -

-
- + <> +
- {challenges?.map((challenge, index) => ( -
-

- {challenge.heading} -

-

- {challenge.body} -

-
- ))} +
+

+ {title} +

+
+ +
+ {challenges?.map((challenge, index) => ( +
+

+ {challenge.heading} +

+

+ {challenge.body} +

+
+ ))} +
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/ProductOverview/ComparisonChartSlide.tsx b/electron/servers/nextjs/app/presentation-templates/ProductOverview/ComparisonChartSlide.tsx index 2987d3e0..a221de3e 100644 --- a/electron/servers/nextjs/app/presentation-templates/ProductOverview/ComparisonChartSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/ProductOverview/ComparisonChartSlide.tsx @@ -117,103 +117,106 @@ const ComparisonChartSlide = ({ data }: { data: Partial }) => { const { title, subtitle, columns, rows, checkIcon, crossIcon } = data; return ( -
-
-

- {title} -

-

- {subtitle} -

-
- -
-
-
- {columns?.map((column, index) => ( -
- {column} -
- ))} + <> + +
+
+

+ {title} +

+

+ {subtitle} +

- {rows?.map((row, index) => { - const cells: ("check" | "cross" | "empty")[] = [ - row.cell1, - row.cell2, - row.cell3, - row.cell4, - ]; - - return ( -
+
+
+
+ {columns?.map((column, index) => (
- {row.label} + {column}
+ ))} +
- {cells?.map((status, cellIndex) => ( + {rows?.map((row, index) => { + const cells: ("check" | "cross" | "empty")[] = [ + row.cell1, + row.cell2, + row.cell3, + row.cell4, + ]; + + return ( +
- + {row.label}
- ))} -
- ); - })} + + {cells?.map((status, cellIndex) => ( +
+ +
+ ))} +
+ ); + })} +
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/ProductOverview/ComparisonTableWithTextSlide.tsx b/electron/servers/nextjs/app/presentation-templates/ProductOverview/ComparisonTableWithTextSlide.tsx index 0da1e3a1..062d44cf 100644 --- a/electron/servers/nextjs/app/presentation-templates/ProductOverview/ComparisonTableWithTextSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/ProductOverview/ComparisonTableWithTextSlide.tsx @@ -78,72 +78,46 @@ const ComparisonTableWithTextSlide = ({ data }: { data: Partial }) = const { title, subtitle, columns, highlightedHeaderIndex, rows } = data; return ( -
-
-

- {title} -

-

- {subtitle} -

-
- + <> +
- +

+ {title} +

+

+ {subtitle} +

+ + +
-
- - {columns?.map((column, index) => { - const isHighlighted = index + 1 === highlightedHeaderIndex; - return ( - - ); - })} - - - - - {rows?.map((row, rowIndex) => { - const cells = [row.cell1, row.cell2, row.cell3, row.cell4]; - const isHighlighted = rowIndex + 1 === highlightedHeaderIndex; - - return ( - - {cells?.map((cell, cellIndex) => ( - + + {columns?.map((column, index) => { + const isHighlighted = index + 1 === highlightedHeaderIndex; + return ( + - ); - })} - -
- {column} -
+
}) = : "var(--primary-color,#123f38)", }} > - {cell} - - ))} -
+ {column} + + ); + })} + + + + + {rows?.map((row, rowIndex) => { + const cells = [row.cell1, row.cell2, row.cell3, row.cell4]; + const isHighlighted = rowIndex + 1 === highlightedHeaderIndex; + + return ( + + {cells?.map((cell, cellIndex) => ( + + {cell} + + ))} + + ); + })} + + +
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/ProductOverview/CoverSlide.tsx b/electron/servers/nextjs/app/presentation-templates/ProductOverview/CoverSlide.tsx index 87557f15..22a02183 100644 --- a/electron/servers/nextjs/app/presentation-templates/ProductOverview/CoverSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/ProductOverview/CoverSlide.tsx @@ -42,61 +42,64 @@ const CoverSlide = ({ data }: { data: Partial }) => { const { logoImage, label, titleLine1, titleLine2, backgroundImage } = data; return ( -
+ <> +
-
- - {logoImage?.__image_prompt__ - -

- {label} -

-
- -
-

- {titleLine1} -
- {titleLine2} -

-
-
- - {backgroundImage?.__image_url__ && ( - {backgroundImage.__image_prompt__ - )} - -
-
+ > +
+
+ + {logoImage?.__image_prompt__ + +

+ {label} +

+
+ +
+

+ {titleLine1} +
+ {titleLine2} +

+
+
+ + {backgroundImage?.__image_url__ && ( + {backgroundImage.__image_prompt__ + )} + +
+
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/ProductOverview/ImageGallerySlide.tsx b/electron/servers/nextjs/app/presentation-templates/ProductOverview/ImageGallerySlide.tsx index f11e7ba5..41c854b6 100644 --- a/electron/servers/nextjs/app/presentation-templates/ProductOverview/ImageGallerySlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/ProductOverview/ImageGallerySlide.tsx @@ -85,62 +85,65 @@ const ImageGallerySlide = ({ data }: { data: Partial }) => { } = data; return ( -
-
+ <> + +
+
-
-

- {title} -

-

- {description} -

+
+

+ {title} +

+

+ {description} +

+
+
+ {topCenterImage?.__image_prompt__ + {topRightImage?.__image_prompt__ +
-
+ + +
{topCenterImage?.__image_prompt__ {topRightImage?.__image_prompt__ + {bottomRightImage?.__image_prompt__}
- - -
- {bottomWideImage?.__image_prompt__} - {bottomCenterImage?.__image_prompt__} - {bottomRightImage?.__image_prompt__} -
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/ProductOverview/IntroductionSlide.tsx b/electron/servers/nextjs/app/presentation-templates/ProductOverview/IntroductionSlide.tsx index 848b7ac6..7eeae599 100644 --- a/electron/servers/nextjs/app/presentation-templates/ProductOverview/IntroductionSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/ProductOverview/IntroductionSlide.tsx @@ -55,57 +55,60 @@ const IntroductionSlide = ({ data }: { data: Partial }) => { const { title, portraitImage, blocks } = data; return ( -
-
-
- - {portraitImage?.__image_url__ && ( - {portraitImage.__image_prompt__} - )} -
- -
-

+ +
+
+
- {title} -

-
- {blocks?.map((block, index) => ( -
-

- {block.label} -

-

- {block.body} -

-
- ))} + {portraitImage?.__image_url__ && ( + {portraitImage.__image_prompt__} + )} +
+ +
+

+ {title} +

+ +
+ {blocks?.map((block, index) => ( +
+

+ {block.label} +

+

+ {block.body} +

+
+ ))} +
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/ProductOverview/KpiCardsSlide.tsx b/electron/servers/nextjs/app/presentation-templates/ProductOverview/KpiCardsSlide.tsx index 2c5d5ff0..d81f16bb 100644 --- a/electron/servers/nextjs/app/presentation-templates/ProductOverview/KpiCardsSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/ProductOverview/KpiCardsSlide.tsx @@ -62,72 +62,75 @@ const KpiCardsSlide = ({ data }: { data: Partial }) => { const { title, kpiIcon, backgroundImage, items } = data; return ( -
- {backgroundImage?.__image_url__ && ( - {backgroundImage?.__image_prompt__} - )} - + <> +
+ > + {backgroundImage?.__image_url__ && ( + {backgroundImage?.__image_prompt__} + )} -
-

- {title} -

-
+
-
- {items?.map((item, index) => ( -
+

+ {title} +

+
+ +
+ {items?.map((item, index) => (
- {kpiIcon?.__icon_query__} +
+ {kpiIcon?.__icon_query__} +
+

+ {item.value} +

+

+ {item.body} +

-

- {item.value} -

-

- {item.body} -

-
- ))} + ))} +
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/ProductOverview/MarketOpportunitySlide.tsx b/electron/servers/nextjs/app/presentation-templates/ProductOverview/MarketOpportunitySlide.tsx index 07f887f2..03738a63 100644 --- a/electron/servers/nextjs/app/presentation-templates/ProductOverview/MarketOpportunitySlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/ProductOverview/MarketOpportunitySlide.tsx @@ -56,76 +56,79 @@ const MarketOpportunitySlide = ({ data }: { data: Partial }) => { const { title, subtitle, bullets, values } = data; return ( -
-
-

- {title} -

-

- {subtitle} -

-
- -
- {bullets?.map((bullet, index) => ( -
- -

- {bullet.text} -

- - -
- ))} -
- -
- {values?.map((value, index) => ( -
+ +
+
+

-

+

+ {subtitle} +

+

+ +
+ {bullets?.map((bullet, index) => ( +
+ +

+ {bullet.text} +

+ + +
+ ))} +
+ +
+ {values?.map((value, index) => ( +
- {value} -

-
- ))} +

+ {value} +

+
+ ))} +
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/ProductOverview/MeetTeamSlide.tsx b/electron/servers/nextjs/app/presentation-templates/ProductOverview/MeetTeamSlide.tsx index 7094003a..7921e215 100644 --- a/electron/servers/nextjs/app/presentation-templates/ProductOverview/MeetTeamSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/ProductOverview/MeetTeamSlide.tsx @@ -92,78 +92,81 @@ const MeetTeamSlide = ({ data }: { data: Partial }) => { const { title, taglineLabel, taglineBody, members } = data; return ( -
-
-

- {title} -

- -
-

+ +

+
+

- {taglineLabel} -

-

- {taglineBody} -

+ {title} +

+ +
+

+ {taglineLabel} +

+

+ {taglineBody} +

+
+
+ +
+ {members?.map((member, index) => ( +
+ {member.image.__image_prompt__} +
+

+ {member.title} +

+

+ {member.name} +

+
+
+ ))}
- -
- {members?.map((member, index) => ( -
- {member.image.__image_prompt__} -
-

- {member.title} -

-

- {member.name} -

-
-
- ))} -
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/ProductOverview/MissionVisionSlide.tsx b/electron/servers/nextjs/app/presentation-templates/ProductOverview/MissionVisionSlide.tsx index ea7fd434..bf81b548 100644 --- a/electron/servers/nextjs/app/presentation-templates/ProductOverview/MissionVisionSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/ProductOverview/MissionVisionSlide.tsx @@ -44,73 +44,76 @@ const MissionVisionSlide = ({ data }: { data: Partial }) => { const { title, missionLabel, missionBody, visionLabel, visionBody, image } = data; return ( -
-
-
-

- {title} -

-
+ <> + +
+
+
+

+ {title} +

+
-
-

- {missionLabel} -

-

- {missionBody} -

-
+

+ {missionLabel} +

+

+ {missionBody} +

+
-
-

- {visionLabel} -

-

+ {visionLabel} +

+

+ {visionBody} +

+
+
- {visionBody} -

-
-
- {image?.__image_url__ && ( - {image.__image_prompt__} - )} + {image?.__image_url__ && ( + {image.__image_prompt__} + )} +
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/ProductOverview/OurServicesSlide.tsx b/electron/servers/nextjs/app/presentation-templates/ProductOverview/OurServicesSlide.tsx index 1d59b2f0..25d76baf 100644 --- a/electron/servers/nextjs/app/presentation-templates/ProductOverview/OurServicesSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/ProductOverview/OurServicesSlide.tsx @@ -61,90 +61,93 @@ const OurServicesSlide = ({ data }: { data: Partial }) => { const { title, taglineLabel, taglineBody, featureImage, services } = data; return ( -
-
-
+ <> + +
+
+
-

- {title} -

- -
-

- {taglineLabel} -

-

- {taglineBody} -

+ {title} + + +
+

+ {taglineLabel} +

+

+ {taglineBody} +

+
-
-
- - {featureImage?.__image_url__ && ( - {featureImage?.__image_prompt__} - )} -
-
- - - -
- {services?.map((service, index) => (
-

- {service.heading} -

-

- {service.body} -

+ + {featureImage?.__image_url__ && ( + {featureImage?.__image_prompt__} + )}
- ))} +
+ + + +
+ {services?.map((service, index) => ( +
+

+ {service.heading} +

+

+ {service.body} +

+
+ ))} +
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/ProductOverview/PricingPlanSlide.tsx b/electron/servers/nextjs/app/presentation-templates/ProductOverview/PricingPlanSlide.tsx index e9a4a4dd..9bcc9f87 100644 --- a/electron/servers/nextjs/app/presentation-templates/ProductOverview/PricingPlanSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/ProductOverview/PricingPlanSlide.tsx @@ -88,83 +88,86 @@ const PricingPlanSlide = ({ data }: { data: Partial }) => { const { title, featureIcon, plans } = data; return ( -
-
-

- {title} -

-
+ <> + +
+
+

+ {title} +

+
-
- {plans?.map((plan, index) => { - const active = plan.highlighted; - return ( -
-

+ {plans?.map((plan, index) => { + const active = plan.highlighted; + return ( +

- {plan.price} -

-

- {plan.description} -

+

+ {plan.price} +

+

+ {plan.description} +

-
- {plan.features.map((feature, featureIndex) => ( -
- {featureIcon?.__icon_query__} -

- {feature} -

-
- ))} +
+ {plan.features.map((feature, featureIndex) => ( +
+ {featureIcon?.__icon_query__} +

+ {feature} +

+
+ ))} +
-
- ); - })} + ); + })} +
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/ProductOverview/ProcessSlide.tsx b/electron/servers/nextjs/app/presentation-templates/ProductOverview/ProcessSlide.tsx index 5b1cae5f..21661a42 100644 --- a/electron/servers/nextjs/app/presentation-templates/ProductOverview/ProcessSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/ProductOverview/ProcessSlide.tsx @@ -78,108 +78,111 @@ const ProcessSlide = ({ data }: { data: Partial }) => { const { title, steps } = data; return ( -
-
-

- {title} -

+ <> + +
+
+

+ {title} +

+
+ + + +
+ {steps?.map((step, index) => { + if (index % 2 === 0) { + return ( +
+
+
+ {step.icon.__icon_query__} + + + +
+
+ + + +
+
+
+

+ {step.label} +

+

+ {step.body} +

+
+
+ ) + } + else { + return ( +
+
+

+ {step.label} +

+

+ {step.body} +

+
+ +
+
+ + + + {step.icon.__icon_query__} +
+
+ + + +
+
+
+ ) + } + })} +
- - - -
- {steps?.map((step, index) => { - if (index % 2 === 0) { - return ( -
-
-
- {step.icon.__icon_query__} - - - -
-
- - - -
-
-
-

- {step.label} -

-

- {step.body} -

-
-
- ) - } - else { - return ( -
-
-

- {step.label} -

-

- {step.body} -

-
- -
-
- - - - {step.icon.__icon_query__} -
-
- - - -
-
-
- ) - } - })} -
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/ProductOverview/ReportSnapshotSlide.tsx b/electron/servers/nextjs/app/presentation-templates/ProductOverview/ReportSnapshotSlide.tsx index 3b564c5b..cc33eaf3 100644 --- a/electron/servers/nextjs/app/presentation-templates/ProductOverview/ReportSnapshotSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/ProductOverview/ReportSnapshotSlide.tsx @@ -332,376 +332,379 @@ const ReportSnapshotSlide = ({ data }: { data: Partial }) => { const donutTotal = (donutData ?? []).reduce((sum, item) => sum + item.value, 0) || 1; return ( -
- {sideImage?.__image_url__ && ( - {sideImage.__image_prompt__} - )} - + <> +
-

- {title} -

- -
-

- {taglineLabel} -

-

- {taglineBody} -

-
-
- -
-

- {chartTitle} -

- - {activeChartStyle === "mini-bars" && ( - <> -
- - - - - `$${value}`} - axisLine={false} - tickLine={false} - tick={{ fill: "var(--background-text,#6C7271)", fontSize: 10 }} - /> - - - - -
- -
-

- {footerLabel} -

-

- {footerValue} -

-
- + {sideImage?.__image_url__ && ( + {sideImage.__image_prompt__} )} - {activeChartStyle === "donut" && ( -
-
- - - - {(donutData ?? []).map((entry, index) => ( - - ))} - - - -
+
+

+ {title} +

-
- {(donutData ?? []).map((entry, index) => { - const percent = Math.round((entry.value / donutTotal) * 100); - return ( -
-
- +
+

+ {taglineLabel} +

+

+ {taglineBody} +

+
+
+ +
+

+ {chartTitle} +

+ + {activeChartStyle === "mini-bars" && ( + <> +
+ + + + + `$${value}`} + axisLine={false} + tickLine={false} + tick={{ fill: "var(--background-text,#6C7271)", fontSize: 10 }} + /> + + + + +
+ +
+

+ {footerLabel} +

+

+ {footerValue} +

+
+ + )} + + {activeChartStyle === "donut" && ( +
+
+ + + + {(donutData ?? []).map((entry, index) => ( + + ))} + + + +
+ +
+ {(donutData ?? []).map((entry, index) => { + const percent = Math.round((entry.value / donutTotal) * 100); + return ( +
+
+ +

+ {legendLabels?.[index] ?? entry.name} +

+

- {legendLabels?.[index] ?? entry.name} + {percent}%

-

- {percent}% -

-
- ); - })} + ); + })} +
-
- )} + )} - {activeChartStyle === "grouped-bars" && ( -
-
- - - - - - +
+ + - + + + - - - + + + + + + + +
+ +
+
+ +

+ {legendLabels?.[0] ?? "Option A"} +

+
+
+ +

+ {legendLabels?.[1] ?? "Option B"} +

+
+
+
+ )} + + {activeChartStyle === "dual-line" && ( +
+
+ + + + - - - -
+ -
- -

- {legendLabels?.[0] ?? "Option A"} -

-
-
- -

- {legendLabels?.[1] ?? "Option B"} -

-
-
-
- )} - - {activeChartStyle === "dual-line" && ( -
-
- - - - - - - - - -
- -
-
- -

- {legendLabels?.[0] ?? "Option A"} -

-
-
- -

- {legendLabels?.[1] ?? "Option B"} -

-
-
-
- )} -
- -
-
- {visibleMetricCards.map((metric, index) => ( -
-
-
- {usePulseFallback ? ( - - ) : ( - {metricIcon?.__icon_query__} - )} + + + + +
+ +
+
+ +

+ {legendLabels?.[0] ?? "Option A"} +

+
+
+ +

+ {legendLabels?.[1] ?? "Option B"} +

+
+
+
+ )} +
+ +
+
+ {visibleMetricCards.map((metric, index) => ( +
+
+
+ {usePulseFallback ? ( + + ) : ( + {metricIcon?.__icon_query__} + )} +
+

+ {metric.value} +

- {metric.value} + {metric.body}

-

- {metric.body} -

-
- ))} + ))} +
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/ProductOverview/TableOfContentSlide.tsx b/electron/servers/nextjs/app/presentation-templates/ProductOverview/TableOfContentSlide.tsx index deb4f2ec..c028d3ab 100644 --- a/electron/servers/nextjs/app/presentation-templates/ProductOverview/TableOfContentSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/ProductOverview/TableOfContentSlide.tsx @@ -53,60 +53,63 @@ const TableOfContentSlide = ({ data }: { data: Partial }) => { const { title, description, sections } = data; return ( -
-
-
-
- {sections?.map((section, index) => ( -
-
+ <> + +
+
+
+
+ {sections?.map((section, index) => ( +
+
+

+ {section.title} +

+

+ {section.description} +

+

- {section.title} -

-

- {section.description} + {section.number}

-

- {section.number} -

-
- ))} + ))} +
+
+ +
+

+ {title} +

+

+ {description} +

- -
-

- {title} -

-

- {description} -

-
-
+ ); }; diff --git a/electron/servers/nextjs/app/presentation-templates/Report/DataAnalysisBarSlide.tsx b/electron/servers/nextjs/app/presentation-templates/Report/DataAnalysisBarSlide.tsx index cd98a65c..790f3ac0 100644 --- a/electron/servers/nextjs/app/presentation-templates/Report/DataAnalysisBarSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/Report/DataAnalysisBarSlide.tsx @@ -10,7 +10,7 @@ const InsightItemSchema = z.object({ title: z.string().min(3).max(12).meta({ description: "Short insight title shown next to the icon.", }), - description: z.string().min(20).max(84).meta({ + description: z.string().min(20).max(40).meta({ description: "Supporting text shown below the insight title.", }), }); @@ -40,7 +40,7 @@ export const Schema = z.object({ }), items: z .array(InsightItemSchema) - .min(3) + .max(3) .default([ { title: "Title 1", description: "Ut enim ad minima veniam, quis." }, @@ -48,10 +48,10 @@ export const Schema = z.object({ { title: "Title 2", description: "Ut enim ad minima veniam, quis." }, ]) .meta({ - description: "Three analysis points shown in the left column.", + description: "Three analysis points shown in the left column,maximum 3 items", }), chartData: flexibleChartDataSchema.default({ - type: "pie", + type: "bar", data: [ { name: "Mon", value: 120 }, { name: "Tue", value: 200 }, @@ -81,7 +81,7 @@ const DataAnalysisBarSlide = ({ data }: { data: Partial }) => { className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]" style={{ backgroundColor: "var(--background-color,#f9f8f8)", - fontFamily: "var(--body-font-family,Nunito Sans)", + fontFamily: "var(--body-font-family,Helvetica Neue)", }} >
; -const getChartHeight = (count: number, hasMetrics: boolean) => { - if (count <= 2) return hasMetrics ? 230 : 280; - if (count <= 3) return hasMetrics ? 210 : 260; - return hasMetrics ? 160 : 180; -}; - - function SummaryCard({ value, label, @@ -187,7 +180,7 @@ const DataAnalysisDashboardSlide = ({ data }: { data: Partial }) => className="relative flex flex-col h-[720px] w-[1280px] overflow-hidden bg-[#F9F8F8]" style={{ backgroundColor: "var(--background-color,#F9F8F8)", - fontFamily: "var(--body-font-family,Nunito Sans)", + fontFamily: "var(--body-font-family,Helvetica Neue)", }} >
}) => {halfChart && halfChart.length > 0 &&
@@ -245,9 +238,9 @@ const DataAnalysisDashboardSlide = ({ data }: { data: Partial }) =>
} {otherHalfChart && otherHalfChart.length > 0 &&
@@ -255,9 +248,7 @@ const DataAnalysisDashboardSlide = ({ data }: { data: Partial }) =>
-
diff --git a/electron/servers/nextjs/app/presentation-templates/Report/DataAnalysisInsightBarSlide.tsx b/electron/servers/nextjs/app/presentation-templates/Report/DataAnalysisInsightBarSlide.tsx index 0442e53a..3481d01a 100644 --- a/electron/servers/nextjs/app/presentation-templates/Report/DataAnalysisInsightBarSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/Report/DataAnalysisInsightBarSlide.tsx @@ -41,13 +41,14 @@ export const Schema = z.object({ description: "Featured insight paragraph shown in the left content area.", }), chartData: flexibleChartDataSchema.default({ - type: "pie", + type: "line-dual", data: [ { name: "Q1", value: 45 }, { name: "Q2", value: 72 }, { name: "Q3", value: 58 }, { name: "Q4", value: 89 }, ], + }), legendLabel: z.string().min(3).max(32).default("Traditional Workflow").meta({ description: "Legend label shown below the chart.", @@ -70,7 +71,7 @@ const DataAnalysisInsightBarSlide = ({ className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]" style={{ backgroundColor: "var(--background-color,#f9f8f8)", - fontFamily: "var(--body-font-family,Nunito Sans)", + fontFamily: "var(--body-font-family,Helvetica Neue)", }} >
; type StatMetric = { value: string; - label: string; - description: string; + label?: string; + description?: string; }; function StatPill({ metrics }: { metrics: StatMetric[] }) { @@ -96,13 +95,13 @@ function StatPill({ metrics }: { metrics: StatMetric[] }) { }} > {metrics.map((metric, index) => ( - +
-

{metric.value}

-

{metric.label}

-

+

{metric.value}

+ {metric.label &&

{metric.label}

} + {metric.description &&

{metric.description} -

+

}
{index === 0 && (
@@ -117,7 +116,7 @@ function StatPill({ metrics }: { metrics: StatMetric[] }) {
)} - +
))}
); @@ -134,7 +133,7 @@ const DataAnalysisLineStatsSlide = ({ data }: { data: Partial }) => className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]" style={{ backgroundColor: "var(--background-color,#f9f8f8)", - fontFamily: "var(--body-font-family,Nunito Sans)", + fontFamily: "var(--body-font-family,Helvetica Neue)", }} >
}) =>
-
@@ -165,7 +164,7 @@ const DataAnalysisLineStatsSlide = ({ data }: { data: Partial }) => {seriesBLabel} -
+
}
diff --git a/electron/servers/nextjs/app/presentation-templates/Report/DataAnalysisListSlide.tsx b/electron/servers/nextjs/app/presentation-templates/Report/DataAnalysisListSlide.tsx index 26260404..b94037ee 100644 --- a/electron/servers/nextjs/app/presentation-templates/Report/DataAnalysisListSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/Report/DataAnalysisListSlide.tsx @@ -56,7 +56,7 @@ const DataAnalysisListSlide = ({ data }: { data: Partial }) => { className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]" style={{ backgroundColor: "var(--background-color,#f9f8f8)", - fontFamily: "var(--body-font-family,Nunito Sans)", + fontFamily: "var(--body-font-family,Helvetica Neue)", }} >
}) => { className='relative w-[1280px] h-[720px] aspect-video flex flex-col justify-center items-center bg-white' style={{ backgroundColor: "var(--background-color,#ffffff)", - fontFamily: "var(--body-font-family,Nunito Sans)", + fontFamily: "var(--body-font-family,Helvetica Neue)", }} > diff --git a/electron/servers/nextjs/app/presentation-templates/Report/IntroductionImageSlide.tsx b/electron/servers/nextjs/app/presentation-templates/Report/IntroductionImageSlide.tsx index 16eb8267..58f572fa 100644 --- a/electron/servers/nextjs/app/presentation-templates/Report/IntroductionImageSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/Report/IntroductionImageSlide.tsx @@ -49,7 +49,7 @@ const IntroductionImageSlide = ({ data }: { data: Partial }) => { className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]" style={{ backgroundColor: "var(--background-color,#f9f8f8)", - fontFamily: "var(--body-font-family,Nunito Sans)", + fontFamily: "var(--body-font-family,Helvetica Neue)", }} >
}) => { {body}

-
    {bullets?.map((bullet, index) => ( -
  • - {bullet} -
  • +
    +

    + {bullet} +

    +
    ))} -
+
diff --git a/electron/servers/nextjs/app/presentation-templates/Report/IntroductionStatsSlide.tsx b/electron/servers/nextjs/app/presentation-templates/Report/IntroductionStatsSlide.tsx index 8acd65a6..eed933ac 100644 --- a/electron/servers/nextjs/app/presentation-templates/Report/IntroductionStatsSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/Report/IntroductionStatsSlide.tsx @@ -5,10 +5,10 @@ const MetricSchema = z.object({ value: z.string().min(1).max(6).meta({ description: "Primary metric value shown in the card.", }), - label: z.string().min(3).max(10).meta({ + label: z.string().min(3).max(10).optional().meta({ description: "Short metric label shown below the value.", }), - description: z.string().min(6).max(20).meta({ + description: z.string().min(6).max(20).optional().meta({ description: "Supporting text shown below the label.", }), }); @@ -73,8 +73,8 @@ export type SchemaType = z.infer; type StatMetric = { value: string; - label: string; - description: string; + label?: string; + description?: string; }; function StatPill({ @@ -101,13 +101,13 @@ function StatPill({ key={`${metric.value}-${metric.label}-${index}`} className={``} > -

+

{metric.value}

-

{metric.label}

-

+ {metric.label &&

{metric.label}

} + {metric.description &&

{metric.description} -

+

}
{index === 0 &&
@@ -139,7 +139,7 @@ const IntroductionStatsSlide = ({ data }: { data: Partial }) => { className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]" style={{ backgroundColor: "var(--background-color,#f9f8f8)", - fontFamily: "var(--body-font-family,Nunito Sans)", + fontFamily: "var(--body-font-family,Helvetica Neue)", }} >
}) => { {body}

-
    {bullets?.map((bullet, index) => ( -
  • - {bullet} -
  • +
    +

    + {bullet} +

    +
    ))} -
+
diff --git a/electron/servers/nextjs/app/presentation-templates/Report/MilestoneSlide.tsx b/electron/servers/nextjs/app/presentation-templates/Report/MilestoneSlide.tsx index 530a0391..6bf25f5a 100644 --- a/electron/servers/nextjs/app/presentation-templates/Report/MilestoneSlide.tsx +++ b/electron/servers/nextjs/app/presentation-templates/Report/MilestoneSlide.tsx @@ -70,7 +70,7 @@ const MilestoneSlide = ({ data }: { data: Partial }) => { className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#F9F8F8]" style={{ backgroundColor: "var(--background-color,#F9F8F8)", - fontFamily: "var(--body-font-family,Nunito Sans)", + fontFamily: "var(--body-font-family,Helvetica Neue)", }} >
; type StatMetric = { value: string; - label: string; - description: string; + label?: string; + description?: string; }; function StatPill({ @@ -94,13 +94,13 @@ function StatPill({ key={`${metric.value}-${metric.label}-${index}`} className={``} > -

+

{metric.value}

-

{metric.label}

-

+ {metric.label &&

{metric.label}

} + {metric.description &&

{metric.description} -

+

}
{index === 0 &&
@@ -131,7 +131,7 @@ const PerformanceSnapshotSlide = ({ data }: { data: Partial }) => { className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]" style={{ backgroundColor: "var(--background-color,#f9f8f8)", - fontFamily: "var(--body-font-family,Nunito Sans)", + fontFamily: "var(--body-font-family,Helvetica Neue)", }} >
}) => { className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]" style={{ backgroundColor: "var(--background-color,#f9f8f8)", - fontFamily: "var(--body-font-family,Nunito Sans)", + fontFamily: "var(--body-font-family,Helvetica Neue)", }} >
{ className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#F9F8F8]" style={{ backgroundColor: "var(--background-color,#F9F8F8)", - fontFamily: "var(--body-font-family,Nunito Sans)", + fontFamily: "var(--body-font-family,Helvetica Neue)", }} >
}) => { className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-white" style={{ backgroundColor: "var(--background-color,#ffffff)", - fontFamily: "var(--body-font-family,Nunito Sans)", + fontFamily: "var(--body-font-family,Helvetica Neue)", }} >