diff --git a/servers/nextjs/presentation-templates/general/BasicInfoSlideLayout.tsx b/servers/nextjs/presentation-templates/general/BasicInfoSlideLayout.tsx index 43b633c9..104bf971 100644 --- a/servers/nextjs/presentation-templates/general/BasicInfoSlideLayout.tsx +++ b/servers/nextjs/presentation-templates/general/BasicInfoSlideLayout.tsx @@ -35,7 +35,7 @@ const BasicInfoSlideLayout: React.FC = ({ data: slide return ( <> {/* Import Google Fonts */} - @@ -44,19 +44,9 @@ const BasicInfoSlideLayout: React.FC = ({ data: slide className="w-full rounded-sm max-w-[1280px] shadow-lg max-h-[720px] aspect-video bg-white relative z-20 mx-auto overflow-hidden" style={{ fontFamily: 'var(--heading-font-family,Inter)', - background:"var(--card-background-color,#ffffff)" + background: "var(--card-background-color,#ffffff)" }} > - {(slideData as any)?.__companyName__ && ( -
-
- - {(slideData as any)?.__companyName__ || 'Company Name'} - -
-
-
- )} {/* Main Content */} @@ -80,20 +70,20 @@ const BasicInfoSlideLayout: React.FC = ({ data: slide {/* Purple accent line */} -
+
{/* Description */} -

+

{slideData?.description || 'Our product offers customizable dashboards for real-time reporting and data-driven decisions. It integrates with third-party tools to enhance operations and scales with business growth for improved efficiency.'}

- - - + + + - + ) diff --git a/servers/nextjs/presentation-templates/general/BulletIconsOnlySlideLayout.tsx b/servers/nextjs/presentation-templates/general/BulletIconsOnlySlideLayout.tsx index 594adb54..2a93d179 100644 --- a/servers/nextjs/presentation-templates/general/BulletIconsOnlySlideLayout.tsx +++ b/servers/nextjs/presentation-templates/general/BulletIconsOnlySlideLayout.tsx @@ -91,26 +91,17 @@ const BulletIconsOnlySlideLayout: React.FC = ({ - + /> +
- {/* {(slideData as any)?.__companyName__ && ( */} -
-
- - {(slideData as any)?.__companyName__ || 'Company Name'} - -
-
-
- {/* )} */} + {/* Decorative Wave Patterns */}
@@ -142,7 +133,7 @@ const BulletIconsOnlySlideLayout: React.FC = ({ className={`flex items-start space-x-4 p-4 rounded-lg`} > {/* Icon */} -
+
= ({ {/* Content */}
-

+

{bullet.title}

{bullet.subtitle && ( -

+

{bullet.subtitle}

)} @@ -171,14 +162,14 @@ const BulletIconsOnlySlideLayout: React.FC = ({ {/* Right Section - Image */}
{/* Decorative Elements */} -
+
- + = ({ return ( <> - - -
- {(slideData as any)?.__companyName__ && ( -
-
- - {(slideData as any)?.__companyName__ || 'Company Name'} - -
-
-
- )} + {/* Main Content */} @@ -100,71 +91,71 @@ const BulletWithIconsSlideLayout: React.FC = ({
{/* Left Section - Image with Grid Pattern */}
- {/* Grid Pattern Background */} -
- - - - - - - - -
- - {/* Image Container */} -
-
- {slideData?.image?.__image_prompt__ + {/* Grid Pattern Background */} +
+ + + + + + + + +
+ + {/* Image Container */} +
+
+ {slideData?.image?.__image_prompt__ +
+
+ + {/* Decorative Sparkle */} +
+ + +
- {/* Decorative Sparkle */} -
- - - -
-
- {/* Right Section - Content */}
{/* Description */} -

+

{slideData?.description || 'Businesses face challenges with outdated technology and rising costs, limiting efficiency and growth in competitive markets.'}

- {/* Bullet Points */} -
- {bulletPoints.map((bullet, index) => ( -
- {/* Icon */} -
- + {/* Bullet Points */} +
+ {bulletPoints.map((bullet, index) => ( +
+ {/* Icon */} +
+ +
+ + {/* Content */} +
+

+ {bullet.title} +

+
+

+ {bullet.description} +

+
- - {/* Content */} -
-

- {bullet.title} -

-
-

- {bullet.description} -

-
-
- ))} + ))}
diff --git a/servers/nextjs/presentation-templates/general/ChartWithBulletsSlideLayout.tsx b/servers/nextjs/presentation-templates/general/ChartWithBulletsSlideLayout.tsx index 0546c441..a2edb3af 100644 --- a/servers/nextjs/presentation-templates/general/ChartWithBulletsSlideLayout.tsx +++ b/servers/nextjs/presentation-templates/general/ChartWithBulletsSlideLayout.tsx @@ -231,8 +231,8 @@ const ChartWithBulletsSlideLayout: React.FC = return ( <> - - @@ -241,19 +241,10 @@ const ChartWithBulletsSlideLayout: React.FC = className="w-full rounded-sm max-w-[1280px] shadow-lg max-h-[720px] aspect-video bg-white relative z-20 mx-auto overflow-hidden" style={{ fontFamily: 'var(--heading-font-family,Inter)', - background:"var(--card-background-color,#ffffff)" + background: "var(--card-background-color,#ffffff)" }} > - {(slideData as any)?.__companyName__ && ( -
-
- - {(slideData as any)?.__companyName__ || 'Company Name'} - -
-
-
- )} + {/* Main Content */}
{/* Left Section - Title, Description, Chart */} @@ -264,12 +255,12 @@ const ChartWithBulletsSlideLayout: React.FC = {/* Description */} -

+

{slideData?.description || 'Businesses face challenges with outdated technology and rising costs, limiting efficiency and growth in competitive markets.'}

{/* Chart Container */} -
+
{renderChart()} @@ -288,7 +279,7 @@ const ChartWithBulletsSlideLayout: React.FC = > {/* Icon and Title */}
-
+
= title={bullet.icon.__icon_query__} />
-

+

{bullet.title}

{/* Description */} -

+

{bullet.description}

diff --git a/servers/nextjs/presentation-templates/general/IntroSlideLayout.tsx b/servers/nextjs/presentation-templates/general/IntroSlideLayout.tsx index 9f512564..d3dbf366 100644 --- a/servers/nextjs/presentation-templates/general/IntroSlideLayout.tsx +++ b/servers/nextjs/presentation-templates/general/IntroSlideLayout.tsx @@ -44,28 +44,19 @@ const IntroSlideLayout: React.FC = ({ data: slideData }) const presenterInitials = getInitials(slideData?.presenterName || 'John Doe'); return ( <> - - -
- {(slideData as any)?.__companyName__ && ( -
-
- - {(slideData as any)?.__companyName__ || 'Company Name'} - -
-
-
- )} + {/* Main Content */} @@ -89,29 +80,29 @@ const IntroSlideLayout: React.FC = ({ data: slideData }) {/* Purple accent line */} -
+
{/* Description */} -

+

{slideData?.description || 'Our product offers customizable dashboards for real-time reporting and data-driven decisions. It integrates with third-party tools to enhance operations and scales with business growth for improved efficiency.'}

{/* Presenter Section */} -
+
{/* Custom Initials Icon */} -
- +
+ {presenterInitials}
- + {/* Presenter Info */}
- + {slideData?.presenterName || 'John Doe'} - + {slideData?.presentationDate || 'December 2024'}
diff --git a/servers/nextjs/presentation-templates/general/MetricsSlideLayout.tsx b/servers/nextjs/presentation-templates/general/MetricsSlideLayout.tsx index e7e11df9..4eeea93b 100644 --- a/servers/nextjs/presentation-templates/general/MetricsSlideLayout.tsx +++ b/servers/nextjs/presentation-templates/general/MetricsSlideLayout.tsx @@ -77,7 +77,7 @@ const MetricsSlideLayout: React.FC = ({ data: slideData return ( <> {/* Import Google Fonts */} - @@ -86,19 +86,10 @@ const MetricsSlideLayout: React.FC = ({ data: slideData className="w-full rounded-sm max-w-[1280px] shadow-lg max-h-[720px] aspect-video bg-white relative z-20 mx-auto overflow-hidden flex flex-col" style={{ fontFamily: 'var(--heading-font-family,Inter)', - background:"var(--card-background-color,#ffffff)" + background: "var(--card-background-color,#ffffff)" }} > - {(slideData as any)?.__companyName__ && ( -
-
- - {(slideData as any)?.__companyName__ || 'Company Name'} - -
-
-
- )} + {/* Decorative Wave Patterns */}
@@ -135,22 +126,22 @@ const MetricsSlideLayout: React.FC = ({ data: slideData {metrics.map((metric, index) => (
{/* Label */} -
+
{metric.label}
{/* Large Metric Value */} -
+
{metric.value}
{/* Description Box */}
-

+

{metric.description}

diff --git a/servers/nextjs/presentation-templates/general/MetricsWithImageSlideLayout.tsx b/servers/nextjs/presentation-templates/general/MetricsWithImageSlideLayout.tsx index 4bf6bfe1..629d31e7 100644 --- a/servers/nextjs/presentation-templates/general/MetricsWithImageSlideLayout.tsx +++ b/servers/nextjs/presentation-templates/general/MetricsWithImageSlideLayout.tsx @@ -7,7 +7,7 @@ export const layoutName = 'Metrics with Image' export const layoutDescription = 'A slide layout with supporting image on the left and title, description, and metrics grid on the right. Can be used alternatively with MetricSlide.' const metricsWithImageSlideSchema = z.object({ - title: z.string().min(3).max(40).default('Competitive Advantage').meta({ + title: z.string().min(3).max(40).default('Competitive Advantage').meta({ description: "Main title of the slide", }), description: z.string().min(10).max(150).default('Ginyard International Co. stands out by offering custom digital solutions tailored to client needs, alongside long-term support to ensure lasting relationships and continuous adaptation.').meta({ @@ -35,7 +35,7 @@ const metricsWithImageSlideSchema = z.object({ label: 'Client Retention Rate', value: '95%' }, - + ]).meta({ description: "List of key business metrics to display", }) @@ -58,35 +58,26 @@ const MetricsWithImageSlideLayout: React.FC = href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap" rel="stylesheet" /> - -
- {(slideData as any)?.__companyName__ && ( -
-
- - {(slideData as any)?.__companyName__ || 'Company Name'} - -
-
-
- )} + {/* Decorative Wave Patterns */}
- - + +
- +
- +
@@ -111,7 +102,7 @@ const MetricsWithImageSlideLayout: React.FC = {/* Description */} -

+

{slideData?.description || 'Ginyard International Co. stands out by offering custom digital solutions tailored to client needs, alongside long-term support to ensure lasting relationships and continuous adaptation.'}

@@ -119,10 +110,10 @@ const MetricsWithImageSlideLayout: React.FC =
{metrics.map((metric, index) => (
-
+
{metric.label}
-
+
{metric.value}
diff --git a/servers/nextjs/presentation-templates/general/NumberedBulletsSlideLayout.tsx b/servers/nextjs/presentation-templates/general/NumberedBulletsSlideLayout.tsx index 55d8e6da..a6b17420 100644 --- a/servers/nextjs/presentation-templates/general/NumberedBulletsSlideLayout.tsx +++ b/servers/nextjs/presentation-templates/general/NumberedBulletsSlideLayout.tsx @@ -58,7 +58,7 @@ const NumberedBulletsSlideLayout: React.FC = ({ return ( <> - @@ -67,19 +67,10 @@ const NumberedBulletsSlideLayout: React.FC = ({ className="w-full rounded-sm max-w-[1280px] shadow-lg max-h-[720px] aspect-video bg-white relative z-20 mx-auto overflow-hidden" style={{ fontFamily: 'var(--heading-font-family,Inter)', - background:"var(--card-background-color,#ffffff)" + background: "var(--card-background-color,#ffffff)" }} > - {(slideData as any)?.__companyName__ && ( -
-
- - {(slideData as any)?.__companyName__ || 'Company Name'} - -
-
-
- )} + {/* Main Content Container */}
@@ -91,7 +82,7 @@ const NumberedBulletsSlideLayout: React.FC = ({ {slideData?.title || 'Market Validation'} {/* Purple accent line */} -
+
{/* Image Section */} @@ -99,7 +90,7 @@ const NumberedBulletsSlideLayout: React.FC = ({ {slideData?.image?.__image_prompt__
@@ -110,17 +101,17 @@ const NumberedBulletsSlideLayout: React.FC = ({
{/* Number */}
-
+
{String(index + 1).padStart(2, '0')}
{/* Content */}
-

+

{bullet.title}

-

+

{bullet.description}

diff --git a/servers/nextjs/presentation-templates/general/QuoteSlideLayout.tsx b/servers/nextjs/presentation-templates/general/QuoteSlideLayout.tsx index c80220a4..a0381dfb 100644 --- a/servers/nextjs/presentation-templates/general/QuoteSlideLayout.tsx +++ b/servers/nextjs/presentation-templates/general/QuoteSlideLayout.tsx @@ -45,19 +45,10 @@ const QuoteSlideLayout: React.FC = ({ data: slideData }) className="w-full rounded-sm max-w-[1280px] shadow-lg max-h-[720px] aspect-video bg-white relative z-20 mx-auto overflow-hidden" style={{ fontFamily: 'var(--heading-font-family,Inter)', - background:"var(--card-background-color,#ffffff)" + background: "var(--card-background-color,#ffffff)" }} > - {(slideData as any)?.__companyName__ && ( -
-
- - {(slideData as any)?.__companyName__ || 'Company Name'} - -
-
-
- )} + {/* Background Image */}
= ({ data: slideData }) {slideData?.heading || 'Words of Wisdom'} {/* Purple accent line */} -
+
{/* Quote Section */} @@ -95,7 +86,7 @@ const QuoteSlideLayout: React.FC = ({ data: slideData }) {/* Quote Icon */}
@@ -104,17 +95,17 @@ const QuoteSlideLayout: React.FC = ({ data: slideData })
{/* Quote Text */} -
+
"{slideData?.quote || 'Success is not final, failure is not fatal: it is the courage to continue that counts. The future belongs to those who believe in the beauty of their dreams.'}"
{/* Author */}
-
+
{slideData?.author || 'Winston Churchill'} -
+
diff --git a/servers/nextjs/presentation-templates/general/TableInfoSlideLayout.tsx b/servers/nextjs/presentation-templates/general/TableInfoSlideLayout.tsx index caebf428..ef78f7e8 100644 --- a/servers/nextjs/presentation-templates/general/TableInfoSlideLayout.tsx +++ b/servers/nextjs/presentation-templates/general/TableInfoSlideLayout.tsx @@ -61,19 +61,10 @@ const TableInfoSlideLayout: React.FC = ({ data: slide className="w-full rounded-sm max-w-[1280px] shadow-lg max-h-[720px] aspect-video bg-white relative z-20 mx-auto overflow-hidden flex flex-col" style={{ fontFamily: 'var(--heading-font-family,Inter)', - background:"var(--card-background-color,#ffffff)" + background: "var(--card-background-color,#ffffff)" }} > - {(slideData as any)?.__companyName__ && ( -
-
- - {(slideData as any)?.__companyName__ || 'Company Name'} - -
-
-
- )} + {/* Decorative Wave Patterns */}
@@ -93,14 +84,14 @@ const TableInfoSlideLayout: React.FC = ({ data: slide {/* Main Content */}
- + {/* Title Section */}

{slideData?.title || 'Market Comparison'}

{/* Purple accent line */} -
+
{/* Table Section */} @@ -111,7 +102,7 @@ const TableInfoSlideLayout: React.FC = ({ data: slide
{tableHeaders.map((header, index) => ( -
+
{header}
))} @@ -121,8 +112,8 @@ const TableInfoSlideLayout: React.FC = ({ data: slide {/* Table Body */}
{tableRows.map((row, rowIndex) => ( -
@@ -145,13 +136,13 @@ const TableInfoSlideLayout: React.FC = ({ data: slide
- +
{/* Description Section */}
-

+

{slideData?.description || 'This comparison shows our competitive position in the market. While we currently have a smaller market share, our growth rate significantly exceeds competitors, indicating strong potential for future expansion.'}

diff --git a/servers/nextjs/presentation-templates/general/TableOfContentsSlideLayout.tsx b/servers/nextjs/presentation-templates/general/TableOfContentsSlideLayout.tsx index 336b6507..749e8d5f 100644 --- a/servers/nextjs/presentation-templates/general/TableOfContentsSlideLayout.tsx +++ b/servers/nextjs/presentation-templates/general/TableOfContentsSlideLayout.tsx @@ -48,28 +48,19 @@ const TableOfContentsSlideLayout: React.FC = ({ return ( <> - - -
- {(slideData as any)?.__companyName__ && ( -
-
- - {(slideData as any)?.__companyName__ || 'Company Name'} - -
-
-
- )} + {/* Title Section */}
@@ -78,7 +69,7 @@ const TableOfContentsSlideLayout: React.FC = ({ {/* Decorative Wave */}
- + = ({
{/* Number Box */} -
+
{section.number}
{/* Title */} - + {section.title}
{/* Page Number */}
- + {section.pageNumber} {/* Dotted line effect */} -
+
.....
@@ -125,21 +116,21 @@ const TableOfContentsSlideLayout: React.FC = ({
{/* Number Box */} -
+
{section.number}
{/* Title */} - + {section.title}
{/* Page Number */}
- + {section.pageNumber} {/* Dotted line effect */} -
+
.....
diff --git a/servers/nextjs/presentation-templates/general/TeamSlideLayout.tsx b/servers/nextjs/presentation-templates/general/TeamSlideLayout.tsx index 1147c3c5..3e163de9 100644 --- a/servers/nextjs/presentation-templates/general/TeamSlideLayout.tsx +++ b/servers/nextjs/presentation-templates/general/TeamSlideLayout.tsx @@ -92,28 +92,19 @@ const TeamSlideLayout: React.FC = ({ data: slideData }) => return ( <> - - +
- {(slideData as any)?.__companyName__ && ( -
-
- - {(slideData as any)?.__companyName__ || 'Company Name'} - -
-
-
- )} + {/* Decorative Wave Pattern */}
@@ -132,10 +123,10 @@ const TeamSlideLayout: React.FC = ({ data: slideData }) => {/* Purple accent line */} -
+
{/* Company Description */} -

+

{slideData?.companyDescription || 'Ginyard International Co. is a leading provider of innovative digital solutions tailored for businesses. Our mission is to empower organizations to achieve their goals through cutting-edge technology and strategic partnerships.'}

@@ -146,7 +137,7 @@ const TeamSlideLayout: React.FC = ({ data: slideData }) => {teamMembers.map((member, index) => (
{/* Member Photo */} -
+
{member.image.__image_prompt__ = ({ data: slideData }) => {/* Member Info */}
-

+

{member.name}

-

+

{member.position}

-

+

{member.description}

diff --git a/servers/nextjs/presentation-templates/standard/ChartLeftTextRightLayout.tsx b/servers/nextjs/presentation-templates/standard/ChartLeftTextRightLayout.tsx index abed05a3..a727742f 100644 --- a/servers/nextjs/presentation-templates/standard/ChartLeftTextRightLayout.tsx +++ b/servers/nextjs/presentation-templates/standard/ChartLeftTextRightLayout.tsx @@ -26,7 +26,7 @@ const ChartDatumSchema = z.object({ }) const Schema = z.object({ - + title: z .string() .min(16) @@ -92,19 +92,9 @@ const dynamicSlideLayout: React.FC = ({ data: slideData }) => />
-
-
- { (slideData as any)?.__companyName__ && - {(slideData as any)?.__companyName__ || 'Pitchdeck'} - } - - - -
- {/* page number intentionally omitted */} -
+
{/* Left: Recharts visualization */} diff --git a/servers/nextjs/presentation-templates/standard/ContactLayout.tsx b/servers/nextjs/presentation-templates/standard/ContactLayout.tsx index da1975c9..c5a17fba 100644 --- a/servers/nextjs/presentation-templates/standard/ContactLayout.tsx +++ b/servers/nextjs/presentation-templates/standard/ContactLayout.tsx @@ -1,167 +1,159 @@ import React from 'react' -import * as z from "zod"; +import * as z from "zod"; const ImageSchema = z.object({ - __image_url__: z.string().url().default("https://images.pexels.com/photos/31527637/pexels-photo-31527637.jpeg").meta({ - description: "URL to image", + __image_url__: z.string().url().default("https://images.pexels.com/photos/31527637/pexels-photo-31527637.jpeg").meta({ + description: "URL to image", + }), + __image_prompt__: z.string().min(10).max(120).default("Muted cover background image with subtle subject suitable for contact slide").meta({ + description: "Prompt used to generate the image. Max 24 words", + }), +}) + +const IconSchema = z.object({ + __icon_url__: z.string().default("data:svg+xml,placeholder").meta({ + description: "URL to icon", + }), + __icon_query__: z.string().min(3).max(24).default("photo placeholder").meta({ + description: "Query used to search the icon. Max 5 words", + }), +}) + +const layoutId = "header-left-media-contact-info-slide" +const layoutName = "ContactLayout" +const layoutDescription = "A slide with a top bar, left media with overlay and bottom bar, and right content with header and text blocks. This should only be used for contact information." + +const Schema = z.object({ + metaMaxWords: z.number().default(24).meta({ + description: "Maximum number of words in any single text field", + }), + + topBar: z.object({ + + pageNumber: z.string().min(1).max(3).default("9").meta({ + description: "Top-right number text. Max 1 word", }), - __image_prompt__: z.string().min(10).max(120).default("Muted cover background image with subtle subject suitable for contact slide").meta({ - description: "Prompt used to generate the image. Max 24 words", + }).default({ + + pageNumber: "9", + }), + + leftPanel: z.object({ + backgroundImage: ImageSchema.default({ + __image_url__: "https://images.pexels.com/photos/31527637/pexels-photo-31527637.jpeg", + __image_prompt__: "Muted cover background image with subtle subject suitable for contact slide", }), - }) - - const IconSchema = z.object({ - __icon_url__: z.string().default("data:svg+xml,placeholder").meta({ - description: "URL to icon", + centerIcon: IconSchema.default({ + __icon_url__: "data:svg+xml,placeholder", + __icon_query__: "photo placeholder", }), - __icon_query__: z.string().min(3).max(24).default("photo placeholder").meta({ - description: "Query used to search the icon. Max 5 words", - }), - }) - - const layoutId = "header-left-media-contact-info-slide" - const layoutName = "ContactLayout" - const layoutDescription = "A slide with a top bar, left media with overlay and bottom bar, and right content with header and text blocks. This should only be used for contact information." - - const Schema = z.object({ - metaMaxWords: z.number().default(24).meta({ - description: "Maximum number of words in any single text field", - }), - - topBar: z.object({ - - pageNumber: z.string().min(1).max(3).default("9").meta({ - description: "Top-right number text. Max 1 word", + websiteBar: z.object({ + websiteText: z.string().min(12).max(30).default("www.yourwebsite.com").meta({ + description: "Website text in bottom green bar. Max 4 words", + }), + actionIcon: IconSchema.default({ + __icon_url__: "data:svg+xml,plus-arrow", + __icon_query__: "plus arrow", }), }).default({ - - pageNumber: "9", - }), - - leftPanel: z.object({ - backgroundImage: ImageSchema.default({ - __image_url__: "https://images.pexels.com/photos/31527637/pexels-photo-31527637.jpeg", - __image_prompt__: "Muted cover background image with subtle subject suitable for contact slide", - }), - centerIcon: IconSchema.default({ - __icon_url__: "data:svg+xml,placeholder", - __icon_query__: "photo placeholder", - }), - websiteBar: z.object({ - websiteText: z.string().min(12).max(30).default("www.yourwebsite.com").meta({ - description: "Website text in bottom green bar. Max 4 words", - }), - actionIcon: IconSchema.default({ - __icon_url__: "data:svg+xml,plus-arrow", - __icon_query__: "plus arrow", - }), - }).default({ - websiteText: "www.yourwebsite.com", - actionIcon: { - __icon_url__: "data:svg+xml,plus-arrow", - __icon_query__: "plus arrow", - }, - }), - }).default({ - backgroundImage: { - __image_url__: "https://images.pexels.com/photos/326576/pexels-photo-326576.jpeg", - __image_prompt__: "Muted cover background image with subtle subject suitable for contact slide", - }, - centerIcon: { - __icon_url__: "data:svg+xml,placeholder", - __icon_query__: "photo placeholder", - }, - websiteBar: { - websiteText: "www.yourwebsite.com", - actionIcon: { - __icon_url__: "data:svg+xml,plus-arrow", - __icon_query__: "plus arrow", - }, + websiteText: "www.yourwebsite.com", + actionIcon: { + __icon_url__: "data:svg+xml,plus-arrow", + __icon_query__: "plus arrow", }, }), - - rightContent: z.object({ - title: z.string().min(18).max(40).default("Let’s Get in\nTouch with Us").meta({ - description: "Main heading. Max 6 words", - }), - sections: z.array(z.object({ - label: z.string().min(4).max(10).default("Label").meta({ - description: "Section label text. Max 2 words", - }), - value: z.string().min(8).max(50).default("Value text").meta({ - description: "Section value text. Max 100 characters", - }), - showDivider: z.boolean().default(true).meta({ - description: "Whether to show bottom divider", - }), - })).min(1).max(3).default([ - { - label: "Address", - value: "Boston, Downtown Main Street 233, New York, US", - showDivider: true, - }, - { - label: "Phone", - value: "+1234 2345 1234", - showDivider: true, - }, - { - label: "E-mail:", - value: "mail@company.com", - showDivider: false, - }, - ]).meta({ - description: "List of content sections", - }), - }).default({ - title: "Let’s Get in\nTouch with Us", - sections: [ - { - label: "Address", - value: "Boston, Downtown Main Street 233, New York, US", - showDivider: true, - }, - { - label: "Phone", - value: "+1234 2345 1234", - showDivider: true, - }, - { - label: "E-mail:", - value: "mail@company.com", - showDivider: false, - }, - ], + }).default({ + backgroundImage: { + __image_url__: "https://images.pexels.com/photos/326576/pexels-photo-326576.jpeg", + __image_prompt__: "Muted cover background image with subtle subject suitable for contact slide", + }, + centerIcon: { + __icon_url__: "data:svg+xml,placeholder", + __icon_query__: "photo placeholder", + }, + websiteBar: { + websiteText: "www.yourwebsite.com", + actionIcon: { + __icon_url__: "data:svg+xml,plus-arrow", + __icon_query__: "plus arrow", + }, + }, + }), + + rightContent: z.object({ + title: z.string().min(18).max(40).default("Let’s Get in\nTouch with Us").meta({ + description: "Main heading. Max 6 words", }), - }) - - type SlideData = z.infer - - interface SlideLayoutProps { - data?: Partial - } - - const dynamicSlideLayout: React.FC = ({ data: slideData }) => { - const sections = slideData?.rightContent?.sections || [] - - return ( - <> - -
-
-
- {(slideData as any)?.__companyName__ &&
- {(slideData as any)?.__companyName__ || "Pitchdeck"} -
} -
-
- {/* page number removed */} -
- + sections: z.array(z.object({ + label: z.string().min(4).max(10).default("Label").meta({ + description: "Section label text. Max 2 words", + }), + value: z.string().min(8).max(50).default("Value text").meta({ + description: "Section value text. Max 100 characters", + }), + showDivider: z.boolean().default(true).meta({ + description: "Whether to show bottom divider", + }), + })).min(1).max(3).default([ + { + label: "Address", + value: "Boston, Downtown Main Street 233, New York, US", + showDivider: true, + }, + { + label: "Phone", + value: "+1234 2345 1234", + showDivider: true, + }, + { + label: "E-mail:", + value: "mail@company.com", + showDivider: false, + }, + ]).meta({ + description: "List of content sections", + }), + }).default({ + title: "Let’s Get in\nTouch with Us", + sections: [ + { + label: "Address", + value: "Boston, Downtown Main Street 233, New York, US", + showDivider: true, + }, + { + label: "Phone", + value: "+1234 2345 1234", + showDivider: true, + }, + { + label: "E-mail:", + value: "mail@company.com", + showDivider: false, + }, + ], + }), +}) + +type SlideData = z.infer + +interface SlideLayoutProps { + data?: Partial +} + +const dynamicSlideLayout: React.FC = ({ data: slideData }) => { + const sections = slideData?.rightContent?.sections || [] + + return ( + <> + +
+ +
@@ -171,12 +163,12 @@ const ImageSchema = z.object({ className="absolute inset-0 w-full h-full object-cover" />
- +

{slideData?.rightContent?.title || "Let’s Get in\nTouch with Us"}

- +
{sections.map((sec, idx) => (
@@ -190,15 +182,15 @@ const ImageSchema = z.object({
))}
- +
- - ) - } + + ) +} - export { Schema, layoutId, layoutName, layoutDescription } - export default dynamicSlideLayout \ No newline at end of file +export { Schema, layoutId, layoutName, layoutDescription } +export default dynamicSlideLayout \ No newline at end of file diff --git a/servers/nextjs/presentation-templates/standard/HeadingBulletImageDescriptionLayout.tsx b/servers/nextjs/presentation-templates/standard/HeadingBulletImageDescriptionLayout.tsx index 0d862297..36f45716 100644 --- a/servers/nextjs/presentation-templates/standard/HeadingBulletImageDescriptionLayout.tsx +++ b/servers/nextjs/presentation-templates/standard/HeadingBulletImageDescriptionLayout.tsx @@ -3,83 +3,83 @@ import React from 'react' import * as z from "zod"; const ImageSchema = z.object({ - __image_url__: z.string().url().default("https://images.pexels.com/photos/31527637/pexels-photo-31527637.jpeg").meta({ - description: "URL to image", + __image_url__: z.string().url().default("https://images.pexels.com/photos/31527637/pexels-photo-31527637.jpeg").meta({ + description: "URL to image", + }), + __image_prompt__: z.string().min(10).max(150).default("Small decorative photo partially behind the card showing a business theme").meta({ + description: "Prompt used to generate the image. Max 30 words", + }), +}) + +const IconSchema = z.object({ + __icon_url__: z.string().default("").meta({ + description: "URL to icon", + }), + __icon_query__: z.string().min(3).max(30).default("").meta({ + description: "Query used to search the icon. Max 5 words", + }), +}) + +const layoutId = "split-left-strip-header-title-subtitle-cards-slide" +const layoutName = "Heading Bullet Image Description" +const layoutDescription = "A slide with a left strip, top label with rule, right header, right description, floating small image, and a centered card with ...cards." + +const Schema = z.object({ + metaMaxWords: z.number().default(200).meta({ + description: "Maximum number of words the text areas can handle collectively.", + }), + pageNumber: z.string().min(1).max(3).default("7").meta({ + description: "Top-right page number text. Max 3 chars", + }), + + heading: z.string().min(16).max(38).default("A Blueprint for\nSuccess").meta({ + description: "Main heading across up to 2 lines. Max 7 words", + }), + subheading: z.string().min(60).max(200).default("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna").meta({ + description: "Supporting paragraph under the heading. Max 35 words", + }), + smallImage: ImageSchema.default({ + __image_url__: "https://images.pexels.com/photos/327533/pexels-photo-327533.jpeg", + __image_prompt__: "A small landscape image suitable for a business slide" + }).meta({ + description: "Small image partially behind the main card", + }), + cards: z.array(z.object({ + title: z.string().min(8).max(16).default("Strategy 01").meta({ + description: "Card ribbon title. Max 3 words", }), - __image_prompt__: z.string().min(10).max(150).default("Small decorative photo partially behind the card showing a business theme").meta({ - description: "Prompt used to generate the image. Max 30 words", + body: z.string().min(60).max(160).default("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor").meta({ + description: "Card body text. Max 28 words", }), - }) - - const IconSchema = z.object({ - __icon_url__: z.string().default("").meta({ - description: "URL to icon", - }), - __icon_query__: z.string().min(3).max(30).default("").meta({ - description: "Query used to search the icon. Max 5 words", - }), - }) - - const layoutId = "split-left-strip-header-title-subtitle-cards-slide" - const layoutName = "Heading Bullet Image Description" - const layoutDescription = "A slide with a left strip, top label with rule, right header, right description, floating small image, and a centered card with ...cards." - - const Schema = z.object({ - metaMaxWords: z.number().default(200).meta({ - description: "Maximum number of words the text areas can handle collectively.", - }), - pageNumber: z.string().min(1).max(3).default("7").meta({ - description: "Top-right page number text. Max 3 chars", - }), - - heading: z.string().min(16).max(38).default("A Blueprint for\nSuccess").meta({ - description: "Main heading across up to 2 lines. Max 7 words", - }), - subheading: z.string().min(60).max(200).default("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna").meta({ - description: "Supporting paragraph under the heading. Max 35 words", - }), - smallImage: ImageSchema.default({ - __image_url__: "https://images.pexels.com/photos/327533/pexels-photo-327533.jpeg", - __image_prompt__: "A small landscape image suitable for a business slide" - }).meta({ - description: "Small image partially behind the main card", - }), - cards: z.array(z.object({ - title: z.string().min(8).max(16).default("Strategy 01").meta({ - description: "Card ribbon title. Max 3 words", - }), - body: z.string().min(60).max(160).default("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor").meta({ - description: "Card body text. Max 28 words", - }), - })).min(1).max(4).default([ - { title: "Strategy 01", body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor" }, - { title: "Strategy 02", body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor" }, - { title: "Strategy 03", body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor" }, - { title: "Strategy 04", body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor" }, - ]).meta({ - description: "Array of strategy cards", - }), - - }) - - type SlideData = z.infer - - interface SlideLayoutProps { - data?: Partial - } - - const dynamicSlideLayout: React.FC = ({ data: slideData }) => { - const cards = slideData?.cards || [] - - return ( - <> - -
+ })).min(1).max(4).default([ + { title: "Strategy 01", body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor" }, + { title: "Strategy 02", body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor" }, + { title: "Strategy 03", body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor" }, + { title: "Strategy 04", body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor" }, + ]).meta({ + description: "Array of strategy cards", + }), + +}) + +type SlideData = z.infer + +interface SlideLayoutProps { + data?: Partial +} + +const dynamicSlideLayout: React.FC = ({ data: slideData }) => { + const cards = slideData?.cards || [] + + return ( + <> + +
{/* page number removed */} - +
{slideData?.smallImage?.__image_url__ ? ( @@ -92,17 +92,10 @@ const ImageSchema = z.object({ {/* overlay removed */} ) : null} -
-
- { (slideData as any)?.__companyName__ && - {(slideData as any)?.__companyName__ || "Pitchdeck"} - } -
-
-
+
- +

{slideData?.heading || "A Blueprint for\nSuccess"} @@ -114,24 +107,24 @@ const ImageSchema = z.object({
- {cards.map((card, idx) => ( + {cards.map((card, idx) => (
- {card.title} -
+ {card.title} +

- {card.body} -

-
- ))} + {card.body} +

+
+ ))} +

-
- - ) - } + + ) +} - export { Schema, layoutId, layoutName, layoutDescription } - export default dynamicSlideLayout \ No newline at end of file +export { Schema, layoutId, layoutName, layoutDescription } +export default dynamicSlideLayout \ No newline at end of file diff --git a/servers/nextjs/presentation-templates/standard/IconBulletDescriptionLayout.tsx b/servers/nextjs/presentation-templates/standard/IconBulletDescriptionLayout.tsx index 99516cea..548c9fef 100644 --- a/servers/nextjs/presentation-templates/standard/IconBulletDescriptionLayout.tsx +++ b/servers/nextjs/presentation-templates/standard/IconBulletDescriptionLayout.tsx @@ -5,118 +5,110 @@ import * as z from "zod"; const ImageSchema = z.object({ - __image_url__: z.string().url().default("https://images.pexels.com/photos/31527637/pexels-photo-31527637.jpeg").meta({ - description: "URL to image", + __image_url__: z.string().url().default("https://images.pexels.com/photos/31527637/pexels-photo-31527637.jpeg").meta({ + description: "URL to image", + }), + __image_prompt__: z.string().min(10).max(180).default("Decorative abstract office scene photo placed at lower right on the band").meta({ + description: "Prompt used to generate the image. Max 30 words", + }), +}) + +const IconSchema = z.object({ + __icon_url__: z.string().default("https://presenton-public.s3.ap-southeast-1.amazonaws.com/static/icons/bold/fediverse-logo-bold.svg").meta({ + description: "URL to icon", + }), + __icon_query__: z.string().min(2).max(20).default("info icon").meta({ + description: "Query used to search the icon. Max 3 words", + }), +}) + +const layoutId = "header-bullets-title-description-image-slide" +const layoutName = "Icon Bullet Description" +const layoutDescription = "A slide with a small header label and number, a left card of ...cards with round symbols and titles with descriptions, a large heading with supporting text, and a decorative image on a mid-page band" + +const Schema = z.object({ + metaMaxWords: z.number().default(240).meta({ + description: "Maximum number of words any single text field can handle in this layout", + }), + + + headerNumber: z.string().min(1).max(3).default("6").meta({ + description: "Small header number text. Max 3 characters", + }), + rightTitle: z.string().min(24).max(72).default("Disrupting the\nIndustry").meta({ + description: "Large heading on the right. Max 8 words", + }), + rightDescription: z.string().min(120).max(240).default("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna").meta({ + description: "Supporting paragraph under the large heading. Max 40 words", + }), + // decorative image removed + cards: z.array(z.object({ + symbolText: z.string().min(1).max(1).default("i").meta({ + description: "Single-character symbol inside the round badge", }), - __image_prompt__: z.string().min(10).max(180).default("Decorative abstract office scene photo placed at lower right on the band").meta({ - description: "Prompt used to generate the image. Max 30 words", + symbolIcon: IconSchema.default({ + __icon_url__: "https://presenton-public.s3.ap-southeast-1.amazonaws.com/static/icons/bold/fediverse-logo-bold.png", + __icon_query__: "info icon", + }).meta({ + description: "Optional icon representation for the round symbol", }), - }) - - const IconSchema = z.object({ - __icon_url__: z.string().default("https://presenton-public.s3.ap-southeast-1.amazonaws.com/static/icons/bold/fediverse-logo-bold.svg").meta({ - description: "URL to icon", + title: z.string().min(16).max(38).default("Visionary Leadership").meta({ + description: "Title for the card item. Max 4 words", }), - __icon_query__: z.string().min(2).max(20).default("info icon").meta({ - description: "Query used to search the icon. Max 3 words", + description: z.string().min(50).max(100).default("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor").meta({ + description: "Description for the card item. Max 15 words.", }), - }) - - const layoutId = "header-bullets-title-description-image-slide" - const layoutName = "Icon Bullet Description" - const layoutDescription = "A slide with a small header label and number, a left card of ...cards with round symbols and titles with descriptions, a large heading with supporting text, and a decorative image on a mid-page band" - - const Schema = z.object({ - metaMaxWords: z.number().default(240).meta({ - description: "Maximum number of words any single text field can handle in this layout", - }), - - - headerNumber: z.string().min(1).max(3).default("6").meta({ - description: "Small header number text. Max 3 characters", - }), - rightTitle: z.string().min(24).max(72).default("Disrupting the\nIndustry").meta({ - description: "Large heading on the right. Max 8 words", - }), - rightDescription: z.string().min(120).max(240).default("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna").meta({ - description: "Supporting paragraph under the large heading. Max 40 words", - }), - // decorative image removed - cards: z.array(z.object({ - symbolText: z.string().min(1).max(1).default("i").meta({ - description: "Single-character symbol inside the round badge", - }), - symbolIcon: IconSchema.default({ - __icon_url__: "https://presenton-public.s3.ap-southeast-1.amazonaws.com/static/icons/bold/fediverse-logo-bold.png", - __icon_query__: "info icon", - }).meta({ - description: "Optional icon representation for the round symbol", - }), - title: z.string().min(16).max(38).default("Visionary Leadership").meta({ - description: "Title for the card item. Max 4 words", - }), - description: z.string().min(50).max(100).default("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor").meta({ - description: "Description for the card item. Max 15 words.", - }), - })).min(1).max(4).default([ - { - symbolText: "i", - symbolIcon: { __icon_url__: "https://presenton-public.s3.ap-southeast-1.amazonaws.com/static/icons/bold/fediverse-logo-bold.svg", __icon_query__: "info icon" }, - title: "Visionary Leadership", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor", - }, - { - symbolText: "i", - symbolIcon: { __icon_url__: "https://presenton-public.s3.ap-southeast-1.amazonaws.com/static/icons/bold/video-bold.png", __icon_query__: "info icon" }, - title: "Innovation at the Core", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor", - }, - { - symbolText: "i", - symbolIcon: { __icon_url__: "https://presenton-public.s3.ap-southeast-1.amazonaws.com/static/icons/bold/receipt-x-bold.png", __icon_query__: "info icon" }, - title: "Customer-Centric Disruption", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor", - }, - { - symbolText: "i", - symbolIcon: { __icon_url__: "https://presenton-public.s3.ap-southeast-1.amazonaws.com/static/icons/bold/users-four-bold.png", __icon_query__: "info icon" }, - title: "Customer-Centric Disruption", - description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor", - } - ]).meta({ - description: "Array of ...cards with a round symbol, title and description. Max 6 items", - }), - // chart and diagram removed - }) - - type SlideData = z.infer - - interface SlideLayoutProps { - data?: Partial - } - - const dynamicSlideLayout: React.FC = ({ data: slideData }) => { - const cards = slideData?.cards || [] - // charts removed - - return ( - <> - -
- -
-
- { (slideData as any)?.__companyName__ && {(slideData as any)?.__companyName__ || "Pitchdeck"}} - -
- {/* page number removed */} -
- + })).min(1).max(4).default([ + { + symbolText: "i", + symbolIcon: { __icon_url__: "https://presenton-public.s3.ap-southeast-1.amazonaws.com/static/icons/bold/fediverse-logo-bold.svg", __icon_query__: "info icon" }, + title: "Visionary Leadership", + description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor", + }, + { + symbolText: "i", + symbolIcon: { __icon_url__: "https://presenton-public.s3.ap-southeast-1.amazonaws.com/static/icons/bold/video-bold.png", __icon_query__: "info icon" }, + title: "Innovation at the Core", + description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor", + }, + { + symbolText: "i", + symbolIcon: { __icon_url__: "https://presenton-public.s3.ap-southeast-1.amazonaws.com/static/icons/bold/receipt-x-bold.png", __icon_query__: "info icon" }, + title: "Customer-Centric Disruption", + description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor", + }, + { + symbolText: "i", + symbolIcon: { __icon_url__: "https://presenton-public.s3.ap-southeast-1.amazonaws.com/static/icons/bold/users-four-bold.png", __icon_query__: "info icon" }, + title: "Customer-Centric Disruption", + description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor", + } + ]).meta({ + description: "Array of ...cards with a round symbol, title and description. Max 6 items", + }), + // chart and diagram removed +}) + +type SlideData = z.infer + +interface SlideLayoutProps { + data?: Partial +} + +const dynamicSlideLayout: React.FC = ({ data: slideData }) => { + const cards = slideData?.cards || [] + // charts removed + + return ( + <> + +
+ + +
@@ -126,12 +118,12 @@ const ImageSchema = z.object({
{item.symbolIcon?.__icon_url__ ? ( + url={item.symbolIcon.__icon_url__} + strokeColor={"currentColor"} + className="w-14 h-14" + color="var(--text-heading-color, #111827)" + title={item.symbolIcon.__icon_query__} + /> ) : ( {item.symbolText} )} @@ -145,7 +137,7 @@ const ImageSchema = z.object({
- +

") }}>

@@ -153,18 +145,18 @@ const ImageSchema = z.object({ {slideData?.rightDescription || "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna"}

- + {/* charts removed */} - + {/* flowchart removed */}
- + {/* decorative image removed */}
- - ) - } + + ) +} - export { Schema, layoutId, layoutName, layoutDescription } - export default dynamicSlideLayout \ No newline at end of file +export { Schema, layoutId, layoutName, layoutDescription } +export default dynamicSlideLayout \ No newline at end of file diff --git a/servers/nextjs/presentation-templates/standard/IconImageDescriptionLayout.tsx b/servers/nextjs/presentation-templates/standard/IconImageDescriptionLayout.tsx index 6d267f2e..0876332c 100644 --- a/servers/nextjs/presentation-templates/standard/IconImageDescriptionLayout.tsx +++ b/servers/nextjs/presentation-templates/standard/IconImageDescriptionLayout.tsx @@ -6,124 +6,118 @@ import * as z from "zod"; const ImageSchema = z.object({ - __image_url__: z.string().url().default("https://via.placeholder.com/900x500").meta({ - description: "URL to image", + __image_url__: z.string().url().default("https://via.placeholder.com/900x500").meta({ + description: "URL to image", + }), + __image_prompt__: z.string().min(10).max(200).default("Wide landscape placeholder representing a slide image area").meta({ + description: "Prompt used to generate the image. Max 30 words", + }), +}) + +const IconSchema = z.object({ + __icon_url__: z.string().default("https://via.placeholder.com/60").meta({ + description: "URL to icon", + }), + __icon_query__: z.string().min(3).max(30).default("camera landscape placeholder").meta({ + description: "Query used to search the icon. Max 3 words", + }), +}) + +const layoutId = "header-title-card-slide" +const layoutName = "Icon Image Description" +const layoutDescription = "A slide with a top bar, centered title, placeholder icon area, and a colored card with circular icon, heading, and paragraph" + +const Schema = z.object({ + meta: z.object({ + maxWords: z.number().default(56), + }).default({ maxWords: 56 }), + topBar: z.object({ + + pageNumber: z.string().min(1).max(3).default("3").meta({ + description: "Page number text. Max 1 word", }), - __image_prompt__: z.string().min(10).max(200).default("Wide landscape placeholder representing a slide image area").meta({ - description: "Prompt used to generate the image. Max 30 words", - }), - }) - - const IconSchema = z.object({ - __icon_url__: z.string().default("https://via.placeholder.com/60").meta({ - description: "URL to icon", - }), - __icon_query__: z.string().min(3).max(30).default("camera landscape placeholder").meta({ - description: "Query used to search the icon. Max 3 words", - }), - }) - - const layoutId = "header-title-card-slide" - const layoutName = "Icon Image Description" - const layoutDescription = "A slide with a top bar, centered title, placeholder icon area, and a colored card with circular icon, heading, and paragraph" - - const Schema = z.object({ - meta: z.object({ - maxWords: z.number().default(56), - }).default({ maxWords: 56 }), - topBar: z.object({ - - pageNumber: z.string().min(1).max(3).default("3").meta({ - description: "Page number text. Max 1 word", - }), - }).default({ - - pageNumber: "3", - }), - title: z.string().min(24).max(56).default("Transforming Ideas into\nReality").meta({ - description: "Main title split across up to two lines. Max 10 words", - }), - backgroundImage: ImageSchema.default({ - __image_url__: "https://images.unsplash.com/photo-1650831432942-aa352df4e9b4?q=80&w=1170&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", - __image_prompt__: "Background image covering the entire section behind the card", - }).meta({ - description: "Full-bleed background image behind card area", - }), - card: z.object({ - circleIcon: IconSchema.default({ - __icon_url__: "data:image/svg+xml;utf8,", - __icon_query__: "badge document icon", - }), - heading: z.string().min(22).max(70).default("Idea Generation and Validation").meta({ - description: "Card heading text. Max 10 words", - }), - body: z.string().min(140).max(450).default("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.").meta({ - description: "Card body paragraph. Max 80 words", - }), - image: ImageSchema.default({ - __image_url__: "https://via.placeholder.com/1200x600", - __image_prompt__: "Optional supporting image inside card area", - }).meta({ - description: "Optional supporting image for the card. Max 30 words", - }), - }).default({ - circleIcon: { - __icon_url__: "data:image/svg+xml;utf8,", - __icon_query__: "badge document icon", - }, - heading: "Idea Generation and Validation", - body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", - image: { - __image_url__: "https://via.placeholder.com/1200x600", - __image_prompt__: "Optional supporting image inside card area", - }, - }), - // charts removed - // diagram removed }).default({ - meta: { maxWords: 56 }, - topBar: { pageNumber: "3" }, - title: "Transforming Ideas into\nReality", - backgroundImage: { - __image_url__: "https://images.unsplash.com/photo-1650831432942-aa352df4e9b4?q=80&w=1170&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", - __image_prompt__: "Background image covering the entire section behind the card", + + pageNumber: "3", + }), + title: z.string().min(24).max(56).default("Transforming Ideas into\nReality").meta({ + description: "Main title split across up to two lines. Max 10 words", + }), + backgroundImage: ImageSchema.default({ + __image_url__: "https://images.unsplash.com/photo-1650831432942-aa352df4e9b4?q=80&w=1170&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", + __image_prompt__: "Background image covering the entire section behind the card", + }).meta({ + description: "Full-bleed background image behind card area", + }), + card: z.object({ + circleIcon: IconSchema.default({ + __icon_url__: "data:image/svg+xml;utf8,", + __icon_query__: "badge document icon", + }), + heading: z.string().min(22).max(70).default("Idea Generation and Validation").meta({ + description: "Card heading text. Max 10 words", + }), + body: z.string().min(140).max(450).default("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.").meta({ + description: "Card body paragraph. Max 80 words", + }), + image: ImageSchema.default({ + __image_url__: "https://via.placeholder.com/1200x600", + __image_prompt__: "Optional supporting image inside card area", + }).meta({ + description: "Optional supporting image for the card. Max 30 words", + }), + }).default({ + circleIcon: { + __icon_url__: "data:image/svg+xml;utf8,", + __icon_query__: "badge document icon", }, - card: { - circleIcon: { - __icon_url__: "data:image/svg+xml;utf8,", - __icon_query__: "badge document icon", - }, - heading: "Idea Generation and Validation", - body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", - image: { __image_url__: "https://via.placeholder.com/1200x600", __image_prompt__: "Optional supporting image inside card area" }, + heading: "Idea Generation and Validation", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", + image: { + __image_url__: "https://via.placeholder.com/1200x600", + __image_prompt__: "Optional supporting image inside card area", }, - // charts removed - // diagram removed - }) - - type SlideData = z.infer - - interface SlideLayoutProps { - data?: Partial - } - - const dynamicSlideLayout: React.FC = ({ data: slideData }) => { - - return ( - <> - -
-
-
- { (slideData as any)?.__companyName__ &&
{(slideData as any)?.__companyName__ || "Pitchdeck"}
} -
-
- {/* page number removed */} -
- + }), + // charts removed + // diagram removed +}).default({ + meta: { maxWords: 56 }, + topBar: { pageNumber: "3" }, + title: "Transforming Ideas into\nReality", + backgroundImage: { + __image_url__: "https://images.unsplash.com/photo-1650831432942-aa352df4e9b4?q=80&w=1170&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", + __image_prompt__: "Background image covering the entire section behind the card", + }, + card: { + circleIcon: { + __icon_url__: "data:image/svg+xml;utf8,", + __icon_query__: "badge document icon", + }, + heading: "Idea Generation and Validation", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", + image: { __image_url__: "https://via.placeholder.com/1200x600", __image_prompt__: "Optional supporting image inside card area" }, + }, + // charts removed + // diagram removed +}) + +type SlideData = z.infer + +interface SlideLayoutProps { + data?: Partial +} + +const dynamicSlideLayout: React.FC = ({ data: slideData }) => { + + return ( + <> + +
+ +

{(slideData?.title || "").split("\n").map((line, idx) => ( @@ -134,7 +128,7 @@ const ImageSchema = z.object({ ))}

- +
- +
{slideData?.card?.heading} @@ -165,19 +159,19 @@ const ImageSchema = z.object({

{slideData?.card?.body}

- + {/* Chart section removed */} - + {/* Diagram removed */} - +
- - ) - } + + ) +} - export { Schema, layoutId, layoutName, layoutDescription } - export default dynamicSlideLayout \ No newline at end of file +export { Schema, layoutId, layoutName, layoutDescription } +export default dynamicSlideLayout \ No newline at end of file diff --git a/servers/nextjs/presentation-templates/standard/ImageListWithDescriptionLayout.tsx b/servers/nextjs/presentation-templates/standard/ImageListWithDescriptionLayout.tsx index a1a62518..b32ac537 100644 --- a/servers/nextjs/presentation-templates/standard/ImageListWithDescriptionLayout.tsx +++ b/servers/nextjs/presentation-templates/standard/ImageListWithDescriptionLayout.tsx @@ -3,146 +3,136 @@ import * as z from "zod"; const ImageSchema = z.object({ - __image_url__: z.string().url().default("https://images.pexels.com/photos/31527637/pexels-photo-31527637.jpeg").meta({ - description: "URL to image", - }), - __image_prompt__: z.string().min(10).max(160).default("Portrait of a professional team member with subtle background, soft light, business attire").meta({ - description: "Prompt used to generate the image. Max 30 words", - }), - }) - - const IconSchema = z.object({ - __icon_url__: z.string().url().default("https://static.thenounproject.com/png/1137401-200.png").meta({ - description: "URL to icon", - }), - __icon_query__: z.string().min(3).max(30).default("photo image placeholder").meta({ - description: "Query used to search the icon. Max 5 words", - }), - }) - - const layoutId = "header-smallbar-title-team-cards-slide" - const layoutName = "Image List With Description" - const layoutDescription = "A slide with a top utility bar, centered title, and a grid of cards with names, roles, and background images." - - const Schema = z.object({ - utilityBar: z.object({ - - pageNumber: z.string().min(1).max(2).default("8").meta({ - description: "Page number text. 1-2 digits", - }), - decorativeLine: IconSchema.default({ - __icon_url__: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='2'%3E%3Crect width='220' height='2' fill='%231FA34A'/%3E%3C/svg%3E", - __icon_query__: "green line separator", - }).meta({ - description: "Decorative line representation.", - }), - }).default({ - - pageNumber: "8", - decorativeLine: { - __icon_url__: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='2'%3E%3Crect width='220' height='2' fill='%231FA34A'/%3E%3C/svg%3E", - __icon_query__: "green line separator", - }, - }), - title: z.string().min(10).max(50).default("Our Professional Team").meta({ - description: "Centered main title. Max 5 words", - }), - cards: z.array(z.object({ - name: z.string().min(3).max(30).default("Sam Rawlings").meta({ - description: "Member name. Up to 3 words.", - }), - role: z.string().min(20).max(50).default("Marketing specialist with brand and growth experience").meta({ - description: "Short description under name. Up to 10 words", - }), - photo: ImageSchema, - })).min(1).max(4).default([ - { - name: "Sam Rawlings", - role: "Marketing specialist with brand and growth experience", - photo: { - __image_url__: "https://images.pexels.com/photos/1181695/pexels-photo-1181695.jpeg", - __image_prompt__: "Portrait of a professional team member with subtle background, soft light, business attire", - }, - }, - { - name: "Sam Rawlings", - role: "Marketing specialist with brand and growth experience", - photo: { - __image_url__: "https://images.pexels.com/photos/450214/pexels-photo-450214.jpeg", - __image_prompt__: "Portrait of a professional team member with subtle background, soft light, business attire", - }, - }, - { - name: "Sam Rawlings", - role: "Marketing specialist with brand and growth experience", - photo: { - __image_url__: "https://images.pexels.com/photos/756484/pexels-photo-756484.jpeg", - __image_prompt__: "Portrait of a professional team member with subtle background, soft light, business attire", - }, - }, + __image_url__: z.string().url().default("https://images.pexels.com/photos/31527637/pexels-photo-31527637.jpeg").meta({ + description: "URL to image", + }), + __image_prompt__: z.string().min(10).max(160).default("Portrait of a professional team member with subtle background, soft light, business attire").meta({ + description: "Prompt used to generate the image. Max 30 words", + }), +}) - ]).meta({ - description: "Grid of member cards with name, role, and image. Up to 4 items", +const IconSchema = z.object({ + __icon_url__: z.string().url().default("https://static.thenounproject.com/png/1137401-200.png").meta({ + description: "URL to icon", + }), + __icon_query__: z.string().min(3).max(30).default("photo image placeholder").meta({ + description: "Query used to search the icon. Max 5 words", + }), +}) + +const layoutId = "header-smallbar-title-team-cards-slide" +const layoutName = "Image List With Description" +const layoutDescription = "A slide with a top utility bar, centered title, and a grid of cards with names, roles, and background images." + +const Schema = z.object({ + utilityBar: z.object({ + + pageNumber: z.string().min(1).max(2).default("8").meta({ + description: "Page number text. 1-2 digits", }), - }) - - type SlideData = z.infer - - interface SlideLayoutProps { - data?: Partial - } - - const dynamicSlideLayout: React.FC = ({ data: slideData }) => { - const cards = slideData?.cards || [] - - return ( - <> - -
-
-
- { (slideData as any)?.__companyName__ && - {(slideData as any)?.__companyName__ || "Pitchdeck"} - } - - - -
- {/* page number removed */} -
- + decorativeLine: IconSchema.default({ + __icon_url__: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='2'%3E%3Crect width='220' height='2' fill='%231FA34A'/%3E%3C/svg%3E", + __icon_query__: "green line separator", + }).meta({ + description: "Decorative line representation.", + }), + }).default({ + + pageNumber: "8", + decorativeLine: { + __icon_url__: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='2'%3E%3Crect width='220' height='2' fill='%231FA34A'/%3E%3C/svg%3E", + __icon_query__: "green line separator", + }, + }), + title: z.string().min(10).max(50).default("Our Professional Team").meta({ + description: "Centered main title. Max 5 words", + }), + cards: z.array(z.object({ + name: z.string().min(3).max(30).default("Sam Rawlings").meta({ + description: "Member name. Up to 3 words.", + }), + role: z.string().min(20).max(50).default("Marketing specialist with brand and growth experience").meta({ + description: "Short description under name. Up to 10 words", + }), + photo: ImageSchema, + })).min(1).max(4).default([ + { + name: "Sam Rawlings", + role: "Marketing specialist with brand and growth experience", + photo: { + __image_url__: "https://images.pexels.com/photos/1181695/pexels-photo-1181695.jpeg", + __image_prompt__: "Portrait of a professional team member with subtle background, soft light, business attire", + }, + }, + { + name: "Sam Rawlings", + role: "Marketing specialist with brand and growth experience", + photo: { + __image_url__: "https://images.pexels.com/photos/450214/pexels-photo-450214.jpeg", + __image_prompt__: "Portrait of a professional team member with subtle background, soft light, business attire", + }, + }, + { + name: "Sam Rawlings", + role: "Marketing specialist with brand and growth experience", + photo: { + __image_url__: "https://images.pexels.com/photos/756484/pexels-photo-756484.jpeg", + __image_prompt__: "Portrait of a professional team member with subtle background, soft light, business attire", + }, + }, + + ]).meta({ + description: "Grid of member cards with name, role, and image. Up to 4 items", + }), +}) + +type SlideData = z.infer + +interface SlideLayoutProps { + data?: Partial +} + +const dynamicSlideLayout: React.FC = ({ data: slideData }) => { + const cards = slideData?.cards || [] + + return ( + <> + +
+ +

{slideData?.title || "Our Professional Team"}

- +
{cards.map((card, idx) => (
-
-
- {card.name} -
-
- {card.role} -
-
-
- {card.photo.__image_prompt__} -
+
+
+ {card.name} +
+
+ {card.role} +
+
+
+ {card.photo.__image_prompt__} +
))}
- - ) - } + + ) +} - export { Schema, layoutId, layoutName, layoutDescription } - export default dynamicSlideLayout \ No newline at end of file +export { Schema, layoutId, layoutName, layoutDescription } +export default dynamicSlideLayout \ No newline at end of file diff --git a/servers/nextjs/presentation-templates/standard/IntroSlideLayout.tsx b/servers/nextjs/presentation-templates/standard/IntroSlideLayout.tsx index 3073ef93..aba6408d 100644 --- a/servers/nextjs/presentation-templates/standard/IntroSlideLayout.tsx +++ b/servers/nextjs/presentation-templates/standard/IntroSlideLayout.tsx @@ -2,21 +2,21 @@ import React from 'react' import * as z from "zod"; const ImageSchema = z.object({ -__image_url__: z.string().url().default("https://images.pexels.com/photos/31527637/pexels-photo-31527637.jpeg").meta({ - description: "URL to image", -}), -__image_prompt__: z.string().min(10).max(150).default("High-quality illustrative image for the left panel of a pitch deck cover").meta({ - description: "Prompt used to generate the image. Max 30 words", -}), + __image_url__: z.string().url().default("https://images.pexels.com/photos/31527637/pexels-photo-31527637.jpeg").meta({ + description: "URL to image", + }), + __image_prompt__: z.string().min(10).max(150).default("High-quality illustrative image for the left panel of a pitch deck cover").meta({ + description: "Prompt used to generate the image. Max 30 words", + }), }) const IconSchema = z.object({ -__icon_url__: z.string().default("https://static.thenounproject.com/png/5563447-200.png").meta({ - description: "URL to icon", -}), -__icon_query__: z.string().min(3).max(40).default("image placeholder icon").meta({ - description: "Query used to search the icon. Max 3 words", -}), + __icon_url__: z.string().default("https://static.thenounproject.com/png/5563447-200.png").meta({ + description: "URL to icon", + }), + __icon_query__: z.string().min(3).max(40).default("image placeholder icon").meta({ + description: "Query used to search the icon. Max 3 words", + }), }) const layoutId = "header-counter-two-column-image-text-slide" @@ -24,136 +24,128 @@ const layoutName = "Intro Slide" const layoutDescription = "A slide with a header row containing label, separator, and counter, followed by a two-column layout with a media area and stacked text blocks. If used as the endig slide then it shoudn't have the intro card." const Schema = z.object({ -header: z.object({ - - separatorIcon: IconSchema.default({ - __icon_url__: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='230' height='2' viewBox='0 0 230 2'%3E%3Crect width='230' height='2' fill='%2322863A'/%3E%3C/svg%3E", - __icon_query__: "green line", - }).meta({ - description: "Graphic separator element", - }), - counter: z.string().min(1).max(3).default("1").meta({ - description: "Small counter text. Max 1 word", - }), -}).default({ - - separatorIcon: { - __icon_url__: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='230' height='2' viewBox='0 0 230 2'%3E%3Crect width='230' height='2' fill='%2322863A'/%3E%3C/svg%3E", - __icon_query__: "green line", - }, - counter: "1", -}), + header: z.object({ -media: z.object({ - type: z.enum(["image"]).default("image").meta({ - description: "Choose media type for left panel", + separatorIcon: IconSchema.default({ + __icon_url__: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='230' height='2' viewBox='0 0 230 2'%3E%3Crect width='230' height='2' fill='%2322863A'/%3E%3C/svg%3E", + __icon_query__: "green line", + }).meta({ + description: "Graphic separator element", + }), + counter: z.string().min(1).max(3).default("1").meta({ + description: "Small counter text. Max 1 word", + }), + }).default({ + + separatorIcon: { + __icon_url__: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='230' height='2' viewBox='0 0 230 2'%3E%3Crect width='230' height='2' fill='%2322863A'/%3E%3C/svg%3E", + __icon_query__: "green line", + }, + counter: "1", }), - image: ImageSchema.default({ - __image_url__: "https://images.unsplash.com/photo-1557426272-fc759fdf7a8d?q=80&w=1170&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", - __image_prompt__: "Abstract gradient image suitable for a presentation left panel", + + media: z.object({ + type: z.enum(["image"]).default("image").meta({ + description: "Choose media type for left panel", + }), + image: ImageSchema.default({ + __image_url__: "https://images.unsplash.com/photo-1557426272-fc759fdf7a8d?q=80&w=1170&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", + __image_prompt__: "Abstract gradient image suitable for a presentation left panel", + }), + }).default({ + type: "image", + image: { + __image_url__: "https://images.unsplash.com/photo-1557426272-fc759fdf7a8d?q=80&w=1170&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", + __image_prompt__: "Abstract gradient image suitable for a presentation left panel", + }, }), -}).default({ - type: "image", - image: { - __image_url__: "https://images.unsplash.com/photo-1557426272-fc759fdf7a8d?q=80&w=1170&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", - __image_prompt__: "Abstract gradient image suitable for a presentation left panel", - }, -}), -title: z.string().min(12).max(30).default("Introduction Our Pitchdeck").meta({ - description: "Main title, supports a line break. Max 6 words", -}), -titleBreakAfter: z.number().min(1).max(25).default(12).meta({ - description: "Character index to insert a line break in title", -}), + title: z.string().min(12).max(30).default("Introduction Our Pitchdeck").meta({ + description: "Main title, supports a line break. Max 6 words", + }), + titleBreakAfter: z.number().min(1).max(25).default(12).meta({ + description: "Character index to insert a line break in title", + }), -paragraph: z.string().min(50).max(200).default("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris").meta({ - description: "Paragraph text block. Max 20 words", -}), + paragraph: z.string().min(50).max(200).default("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris").meta({ + description: "Paragraph text block. Max 20 words", + }), -introCard: z.object({ - enabled: z.boolean().default(false).meta({ description: "Show intro card with name and date" }), - initials: z.string().min(2).max(3).default("PDT").meta({ description: "Initials inside the circle" }), - name: z.string().min(3).max(40).default("Pitch Deck Team").meta({ description: "Display name" }), - date: z.string().min(6).max(40).default("December 22, 2025").meta({ description: "Display date string" }), -}).default({ - enabled: true, - initials: "PDT", - name: "Pitch Deck Team", - date: "December 22, 2025", -}), + introCard: z.object({ + enabled: z.boolean().default(false).meta({ description: "Show intro card with name and date" }), + initials: z.string().min(2).max(3).default("PDT").meta({ description: "Initials inside the circle" }), + name: z.string().min(3).max(40).default("Pitch Deck Team").meta({ description: "Display name" }), + date: z.string().min(6).max(40).default("December 22, 2025").meta({ description: "Display date string" }), + }).default({ + enabled: true, + initials: "PDT", + name: "Pitch Deck Team", + date: "December 22, 2025", + }), }).meta({ -maxWords: 460, + maxWords: 460, }) type SlideData = z.infer interface LayoutProps { -data?: Partial + data?: Partial } const dynamicSlideLayout: React.FC = ({ data: slideData }) => { -const title = slideData?.title || "Introduction Our Pitchdeck" -const brIndex = typeof slideData?.titleBreakAfter === "number" ? slideData?.titleBreakAfter as number : 12 -const titleFirst = title.slice(0, brIndex) -const titleSecond = title.slice(brIndex) -return ( - <> - -
-
-
- { (slideData as any)?.__companyName__ && {(slideData as any)?.__companyName__ || "Pitchdeck"}} - - - -
- {/* page number removed */} -
+ const title = slideData?.title || "Introduction Our Pitchdeck" + const brIndex = typeof slideData?.titleBreakAfter === "number" ? slideData?.titleBreakAfter as number : 12 + const titleFirst = title.slice(0, brIndex) + const titleSecond = title.slice(brIndex) + return ( + <> + +
-
-
- {slideData?.media?.type === "image" ? ( - {slideData?.media?.image?.__image_prompt__ - ) : null } -
-
-
-

- {titleFirst} -
- {titleSecond} -

+
+
+ {slideData?.media?.type === "image" ? ( + {slideData?.media?.image?.__image_prompt__ + ) : null} +
-

- {slideData?.paragraph || "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris"} -

+
+
+

+ {titleFirst} +
+ {titleSecond} +

- {slideData?.introCard?.enabled ? ( -
-
- {slideData?.introCard?.initials} +

+ {slideData?.paragraph || "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris"} +

+ + {slideData?.introCard?.enabled ? ( +
+
+ {slideData?.introCard?.initials} +
+
+
{slideData?.introCard?.name}
+
{slideData?.introCard?.date}
+
+
+ ) : null} +
+
-
-
{slideData?.introCard?.name}
-
{slideData?.introCard?.date}
-
-
- ) : null} -
-
-
-
- -) +
+ + ) } export { Schema, layoutId, layoutName, layoutDescription } diff --git a/servers/nextjs/presentation-templates/standard/MetricsDescriptionLayout.tsx b/servers/nextjs/presentation-templates/standard/MetricsDescriptionLayout.tsx index 37761f89..ec02418d 100644 --- a/servers/nextjs/presentation-templates/standard/MetricsDescriptionLayout.tsx +++ b/servers/nextjs/presentation-templates/standard/MetricsDescriptionLayout.tsx @@ -3,149 +3,141 @@ import React from 'react' import * as z from "zod"; const ImageSchema = z.object({ - __image_url__: z.string().url().default("https://images.unsplash.com/photo-1503264116251-35a269479413?q=80&w=1200&auto=format&fit=crop").meta({ - description: "URL to image", - }), - __image_prompt__: z.string().min(10).max(200).default("Elegant abstract green themed background for a presentation slide, minimal shapes, soft lighting").meta({ - description: "Prompt used to generate the image. Max 40 words", - }), - }) - - const IconSchema = z.object({ - __icon_url__: z.string().default("https://static.thenounproject.com/png/1783767-200.png").meta({ - description: "URL to icon", - }), - __icon_query__: z.string().min(3).max(40).default("leaf growth").meta({ - description: "Query used to search the icon. Max 6 words", - }), - }) - - const layoutId = "header-tagline-cards-grid-slide" - const layoutName = "Metrics Description" - const layoutDescription = "A slide with a top utility row, a header, a tagline, and a grid of cards each with a number block and text" - - const CardSchema = z.object({ - number: z.string().min(1).max(5).default("45").meta({ - description: "Main number text inside number block. 1 to 3 digits", - }), - numberSymbol: z.string().min(0).max(3).default("%").meta({ - description: "Optional symbol next to the number. Single character", - }), - subtitle: z.string().min(8).max(28).default("Subtitle Here").meta({ - description: "Card subtitle. Max 5 words", - }), - body: z.string().min(20).max(100).default("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do.").meta({ - description: "Card body text. Max 100 characters", - }), - icon: IconSchema.default({ - __icon_url__: "https://static.thenounproject.com/png/1783767-200.png", - __icon_query__: "progress indicator", - }).meta({ - description: "Optional icon for the card header area", - }), - }) - - const Schema = z.object({ - - title: z.string().min(12).max(70).default("Scaling New Heights Together").meta({ - description: "Main title. Single line up to ~34 chars or two lines up to ~70 chars. Max 9 words", - }), - tagline: z.string().min(40).max(120).default("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna").meta({ - description: "Subtitle/tagline under title. Max 20 words", - }), - decorativeLine: ImageSchema.default({ - __image_url__: "data:image/svg+xml;utf8,", - __image_prompt__: "Thin green horizontal line divider, 220x2, rounded ends", - }).meta({ - description: "SVG decorative line asset", - }), - cards: z.array(CardSchema).min(1).max(6).default([ - { - number: "87", - numberSymbol: "%", - subtitle: "Customer Satisfaction", - body: "Our customers consistently rate their experience with our products and services as excellent.", - icon: { __icon_url__: "https://static.thenounproject.com/png/1783767-200.png", __icon_query__: "happy customer icon" }, - }, - { - number: "2.5", - numberSymbol: "M", - subtitle: "Active Users Monthly", - body: "Growing user base actively engaging with our platform across multiple regions worldwide.", - icon: { __icon_url__: "https://static.thenounproject.com/png/1783767-200.png", __icon_query__: "users group icon" }, - }, - { - number: "99", - numberSymbol: "%", - subtitle: "System Uptime", - body: "Maintaining exceptional reliability with industry-leading system availability and performance.", - icon: { __icon_url__: "https://static.thenounproject.com/png/1783767-200.png", __icon_query__: "server uptime icon" }, - }, - { - number: "142", - numberSymbol: "+", - subtitle: "Global Partners", - body: "Strategic partnerships driving innovation and market expansion across key industry sectors.", - icon: { __icon_url__: "https://static.thenounproject.com/png/1783767-200.png", __icon_query__: "handshake deal icon" }, - }, - { - number: "32", - numberSymbol: "x", - subtitle: "Revenue Growth", - body: "Year-over-year growth demonstrating strong market position and business model scalability.", - icon: { __icon_url__: "https://static.thenounproject.com/png/1783767-200.png", __icon_query__: "growth chart icon" }, - }, - { - number: "500", - numberSymbol: "K", - subtitle: "Carbon Offset", - body: "Committed to sustainability through significant carbon reduction and environmental initiatives.", - icon: { __icon_url__: "https://static.thenounproject.com/png/1783767-200.png", __icon_query__: "leaf sustainability icon" }, - }, - ]).meta({ - description: "Grid of cards with number block, subtitle, and body (<=100 chars)", - }), - // chart and diagram removed - }) - - type SlideData = z.infer - - interface SlideLayoutProps { - data?: Partial - } - - const dynamicSlideLayout: React.FC = ({ data: slideData }) => { - const cards = slideData?.cards || [] - - return ( - <> - -
+ __image_url__: z.string().url().default("https://images.unsplash.com/photo-1503264116251-35a269479413?q=80&w=1200&auto=format&fit=crop").meta({ + description: "URL to image", + }), + __image_prompt__: z.string().min(10).max(200).default("Elegant abstract green themed background for a presentation slide, minimal shapes, soft lighting").meta({ + description: "Prompt used to generate the image. Max 40 words", + }), +}) + +const IconSchema = z.object({ + __icon_url__: z.string().default("https://static.thenounproject.com/png/1783767-200.png").meta({ + description: "URL to icon", + }), + __icon_query__: z.string().min(3).max(40).default("leaf growth").meta({ + description: "Query used to search the icon. Max 6 words", + }), +}) + +const layoutId = "header-tagline-cards-grid-slide" +const layoutName = "Metrics Description" +const layoutDescription = "A slide with a top utility row, a header, a tagline, and a grid of cards each with a number block and text" + +const CardSchema = z.object({ + number: z.string().min(1).max(5).default("45").meta({ + description: "Main number text inside number block. 1 to 3 digits", + }), + numberSymbol: z.string().min(0).max(3).default("%").meta({ + description: "Optional symbol next to the number. Single character", + }), + subtitle: z.string().min(8).max(28).default("Subtitle Here").meta({ + description: "Card subtitle. Max 5 words", + }), + body: z.string().min(20).max(100).default("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do.").meta({ + description: "Card body text. Max 100 characters", + }), + icon: IconSchema.default({ + __icon_url__: "https://static.thenounproject.com/png/1783767-200.png", + __icon_query__: "progress indicator", + }).meta({ + description: "Optional icon for the card header area", + }), +}) + +const Schema = z.object({ + + title: z.string().min(12).max(70).default("Scaling New Heights Together").meta({ + description: "Main title. Single line up to ~34 chars or two lines up to ~70 chars. Max 9 words", + }), + tagline: z.string().min(40).max(120).default("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna").meta({ + description: "Subtitle/tagline under title. Max 20 words", + }), + decorativeLine: ImageSchema.default({ + __image_url__: "data:image/svg+xml;utf8,", + __image_prompt__: "Thin green horizontal line divider, 220x2, rounded ends", + }).meta({ + description: "SVG decorative line asset", + }), + cards: z.array(CardSchema).min(1).max(6).default([ + { + number: "87", + numberSymbol: "%", + subtitle: "Customer Satisfaction", + body: "Our customers consistently rate their experience with our products and services as excellent.", + icon: { __icon_url__: "https://static.thenounproject.com/png/1783767-200.png", __icon_query__: "happy customer icon" }, + }, + { + number: "2.5", + numberSymbol: "M", + subtitle: "Active Users Monthly", + body: "Growing user base actively engaging with our platform across multiple regions worldwide.", + icon: { __icon_url__: "https://static.thenounproject.com/png/1783767-200.png", __icon_query__: "users group icon" }, + }, + { + number: "99", + numberSymbol: "%", + subtitle: "System Uptime", + body: "Maintaining exceptional reliability with industry-leading system availability and performance.", + icon: { __icon_url__: "https://static.thenounproject.com/png/1783767-200.png", __icon_query__: "server uptime icon" }, + }, + { + number: "142", + numberSymbol: "+", + subtitle: "Global Partners", + body: "Strategic partnerships driving innovation and market expansion across key industry sectors.", + icon: { __icon_url__: "https://static.thenounproject.com/png/1783767-200.png", __icon_query__: "handshake deal icon" }, + }, + { + number: "32", + numberSymbol: "x", + subtitle: "Revenue Growth", + body: "Year-over-year growth demonstrating strong market position and business model scalability.", + icon: { __icon_url__: "https://static.thenounproject.com/png/1783767-200.png", __icon_query__: "growth chart icon" }, + }, + { + number: "500", + numberSymbol: "K", + subtitle: "Carbon Offset", + body: "Committed to sustainability through significant carbon reduction and environmental initiatives.", + icon: { __icon_url__: "https://static.thenounproject.com/png/1783767-200.png", __icon_query__: "leaf sustainability icon" }, + }, + ]).meta({ + description: "Grid of cards with number block, subtitle, and body (<=100 chars)", + }), + // chart and diagram removed +}) + +type SlideData = z.infer + +interface SlideLayoutProps { + data?: Partial +} + +const dynamicSlideLayout: React.FC = ({ data: slideData }) => { + const cards = slideData?.cards || [] + + return ( + <> + +
-
-
- { (slideData as any)?.__companyName__ && - {(slideData as any)?.__companyName__ || "Pitchdeck"} - } -
-
- {/* page number removed */} -
- + +

{slideData?.title || "Scaling New Heights Together"}

- +

{slideData?.tagline || "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna"}

- +
{cards.map((card, idx) => ( -
+
@@ -167,13 +159,13 @@ const ImageSchema = z.object({
))}
- + {/* chart and flowchart removed */}
- - ) - } + + ) +} - export { Schema, layoutId, layoutName, layoutDescription } - export default dynamicSlideLayout \ No newline at end of file +export { Schema, layoutId, layoutName, layoutDescription } +export default dynamicSlideLayout \ No newline at end of file diff --git a/servers/nextjs/presentation-templates/standard/NumberedBulletSingleImageLayout.tsx b/servers/nextjs/presentation-templates/standard/NumberedBulletSingleImageLayout.tsx index d1c2166f..96073307 100644 --- a/servers/nextjs/presentation-templates/standard/NumberedBulletSingleImageLayout.tsx +++ b/servers/nextjs/presentation-templates/standard/NumberedBulletSingleImageLayout.tsx @@ -3,129 +3,119 @@ import React from 'react' import * as z from "zod"; const ImageSchema = z.object({ - __image_url__: z.string().url().default("https://images.pexels.com/photos/31527637/pexels-photo-31527637.jpeg").meta({ - description: "URL to image", - }), - __image_prompt__: z.string().min(10).max(90).default("Professional business meeting scene for roadmap presentation image").meta({ - description: "Prompt used to generate the image. Max 18 words", - }), - }) - - const IconSchema = z.object({ - __icon_url__: z.string().default("").meta({ - description: "URL to icon", - }), - __icon_query__: z.string().min(3).max(30).default("").meta({ - description: "Query used to search the icon. Max 6 words", - }), - }) - - const layoutId = "header-bullets-image-split-slide" - const layoutName = "Numbered Bullet Single Image" - const layoutDescription = "A slide with a top bar, left column with numbered bullets, middle image panel, and right stacked heading with paragraph" - - const Schema = z.object({ - metaMaxWords: z.number().default(18).meta({ - description: "Maximum number of words allowed in any prompt/description metadata fields.", - }), - topBar: z.object({ - - lineIcon: IconSchema.default({ - __icon_url__: "", - __icon_query__: "thin green line", - }).meta({ - description: "Decorative line representation with query only", - }), - }).default({ - - lineIcon: { - __icon_url__: "", - __icon_query__: "thin green line", - }, - }), - leftBullets: z.array( - z.object({ - numberText: z.string().min(2).max(2).default("01").meta({ - description: "Two-digit bullet number. Max 2 chars", - }), - title: z.string().min(10).max(36).default("Strategic Execution").meta({ - description: "Bullet title text. Designed for 24px. Max ~36 chars", - }), - body: z.string().min(60).max(100).default("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.").meta({ - description: "Bullet body text. Max ~100 chars", - }), - }) - ).min(1).max(4).default([ - { - numberText: "01", - title: "Strategic Execution", - body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.", - }, - { - numberText: "02", - title: "Building a Strong Team", - body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.", - }, - { - numberText: "03", - title: "Market Expansion Strategy", - body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.", - }, - { - numberText: "04", - title: "Innovation Pipeline", - body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.", - } - ]).meta({ - description: "List of numbered bullets. Max 5 items", - }), - middleImage: ImageSchema.default({ - __image_url__: "https://images.unsplash.com/photo-1515623959088-7617915baa1e?q=80&w=687&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", - __image_prompt__: "Professional business meeting scene for roadmap presentation image", + __image_url__: z.string().url().default("https://images.pexels.com/photos/31527637/pexels-photo-31527637.jpeg").meta({ + description: "URL to image", + }), + __image_prompt__: z.string().min(10).max(90).default("Professional business meeting scene for roadmap presentation image").meta({ + description: "Prompt used to generate the image. Max 18 words", + }), +}) + +const IconSchema = z.object({ + __icon_url__: z.string().default("").meta({ + description: "URL to icon", + }), + __icon_query__: z.string().min(3).max(30).default("").meta({ + description: "Query used to search the icon. Max 6 words", + }), +}) + +const layoutId = "header-bullets-image-split-slide" +const layoutName = "Numbered Bullet Single Image" +const layoutDescription = "A slide with a top bar, left column with numbered bullets, middle image panel, and right stacked heading with paragraph" + +const Schema = z.object({ + metaMaxWords: z.number().default(18).meta({ + description: "Maximum number of words allowed in any prompt/description metadata fields.", + }), + topBar: z.object({ + + lineIcon: IconSchema.default({ + __icon_url__: "", + __icon_query__: "thin green line", }).meta({ - description: "Image displayed in the middle column", + description: "Decorative line representation with query only", }), - rightHeader: z.object({ - heading: z.string().min(6).max(30).default("Our Journey").meta({ - description: "Right column heading. Max ~30 chars", + }).default({ + + lineIcon: { + __icon_url__: "", + __icon_query__: "thin green line", + }, + }), + leftBullets: z.array( + z.object({ + numberText: z.string().min(2).max(2).default("01").meta({ + description: "Two-digit bullet number. Max 2 chars", }), - paragraph: z.string().min(80).max(200).default("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore.").meta({ - description: "Right paragraph text. Max 200 chars", + title: z.string().min(10).max(36).default("Strategic Execution").meta({ + description: "Bullet title text. Designed for 24px. Max ~36 chars", }), - }).default({ - heading: "Our Journey", - paragraph: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore.", + body: z.string().min(60).max(100).default("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.").meta({ + description: "Bullet body text. Max ~100 chars", + }), + }) + ).min(1).max(4).default([ + { + numberText: "01", + title: "Strategic Execution", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.", + }, + { + numberText: "02", + title: "Building a Strong Team", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.", + }, + { + numberText: "03", + title: "Market Expansion Strategy", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.", + }, + { + numberText: "04", + title: "Innovation Pipeline", + body: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.", + } + ]).meta({ + description: "List of numbered bullets. Max 5 items", + }), + middleImage: ImageSchema.default({ + __image_url__: "https://images.unsplash.com/photo-1515623959088-7617915baa1e?q=80&w=687&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D", + __image_prompt__: "Professional business meeting scene for roadmap presentation image", + }).meta({ + description: "Image displayed in the middle column", + }), + rightHeader: z.object({ + heading: z.string().min(6).max(30).default("Our Journey").meta({ + description: "Right column heading. Max ~30 chars", }), - }) - - type SlideData = z.infer - - interface SlideLayoutProps { - data?: Partial - } - - const dynamicSlideLayout: React.FC = ({ data: slideData }) => { - const bullets = slideData?.leftBullets || [] - - return ( - <> - -
-
-
- { (slideData as any)?.__companyName__ && - {(slideData as any)?.__companyName__ || "Pitchdeck"} - } - - - -
- {/* page number removed */} -
- + paragraph: z.string().min(80).max(200).default("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore.").meta({ + description: "Right paragraph text. Max 200 chars", + }), + }).default({ + heading: "Our Journey", + paragraph: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore.", + }), +}) + +type SlideData = z.infer + +interface SlideLayoutProps { + data?: Partial +} + +const dynamicSlideLayout: React.FC = ({ data: slideData }) => { + const bullets = slideData?.leftBullets || [] + + return ( + <> + +
+ +
    @@ -139,14 +129,14 @@ const ImageSchema = z.object({ {b.body}

-
+
{b.numberText}
))}
- +
{/* overlay removed */}
- +

@@ -168,9 +158,9 @@ const ImageSchema = z.object({

- - ) - } + + ) +} - export { Schema, layoutId, layoutName, layoutDescription } - export default dynamicSlideLayout \ No newline at end of file +export { Schema, layoutId, layoutName, layoutDescription } +export default dynamicSlideLayout \ No newline at end of file diff --git a/servers/nextjs/presentation-templates/standard/TableOfContentsLayout.tsx b/servers/nextjs/presentation-templates/standard/TableOfContentsLayout.tsx index 6b6e286d..8f2b013e 100644 --- a/servers/nextjs/presentation-templates/standard/TableOfContentsLayout.tsx +++ b/servers/nextjs/presentation-templates/standard/TableOfContentsLayout.tsx @@ -2,7 +2,7 @@ import React from "react" import * as z from "zod" const layoutId = "table-of-contents-layout" -const layoutName = "Table Of Contents" +const layoutName = "Table Of Contents" const layoutDescription = "Header with brand marker, title, optional description, and a two-column table of contents list" const ToCItemSchema = z @@ -19,12 +19,12 @@ const Schema = z .object({ topBar: z .object({ - + marker: z.string().min(1).max(3).default("2").meta({ description: "Numeric marker on the top bar. Up to 3 digits", }), }) - .default({ marker: "2" }), + .default({ marker: "2" }), title: z .string() @@ -61,7 +61,7 @@ const Schema = z .meta({ description: "List of contents (3-10)" }), }) .default({ - topBar: { marker: "2" }, + topBar: { marker: "2" }, title: "Table Of Contents", description: "Use this as a quick guide to navigate the presentation sections.", @@ -102,23 +102,7 @@ const dynamicSlideLayout: React.FC = ({ data: slideData }) => backgroundColor: "var(--card-background-color, #FFFFFF)", }} > -
-
-
- { (slideData as any)?.__companyName__ && - {(slideData as any)?.__companyName__ || "Pitchdeck"} - } -
-
- {/* page number intentionally omitted */} -
-
+

interface SlideLayoutProps { -data?: Partial + data?: Partial } // removed external chart components; using inline SVG ring only const dynamicSlideLayout: React.FC = ({ data: slideData }) => { -const cards = slideData?.cards || [] -return ( - <> - -
-
-
-
- { (slideData as any)?.__companyName__ && {(slideData as any)?.__companyName__ || "Pitchdeck"}} -
-
- {/* page number removed */} -
-
+ const cards = slideData?.cards || [] + return ( + <> + +
-
-

- {slideData?.title} -

-

- {slideData?.description} -

-
-
-
- {cards.map((card, idx) => { - const radius = 80 - const circumference = 2 * Math.PI * radius - const dasharray = circumference - return ( -
-
-

{card.title}

-
- {/* donut ring retained */} - - - - - -
- {card.value}{card.unit} +
+

+ {slideData?.title} +

+

+ {slideData?.description} +

+
+ +
+
+ {cards.map((card, idx) => { + const radius = 80 + const circumference = 2 * Math.PI * radius + const dasharray = circumference + return ( +
+
+

{card.title}

+
+ {/* donut ring retained */} + + + + + +
+ {card.value}{card.unit} +
+
+

+ {card.description} +

+
+
+ ) + })}
-

- {card.description} -

-
-
- ) - })} -
-
- {/* mermaid removed */} -
- -) + {/* mermaid removed */} +
+ + ) } export { Schema, layoutId, layoutName, layoutDescription } diff --git a/servers/nextjs/presentation-templates/swift/BulletsWithIconsTitleDescription.tsx b/servers/nextjs/presentation-templates/swift/BulletsWithIconsTitleDescription.tsx index 39c7548f..5b970898 100644 --- a/servers/nextjs/presentation-templates/swift/BulletsWithIconsTitleDescription.tsx +++ b/servers/nextjs/presentation-templates/swift/BulletsWithIconsTitleDescription.tsx @@ -94,7 +94,7 @@ const Schema = z website: z.string().min(6).max(60).default("www.yourwebsite.com"), }) .default({ - title: "Our Infographic", + title: "Our Infographic", sideHeading: "Lorem ipsum dolor sit amet,", sideParagraph: "Concise paragraph describing context. Keep it short and readable across one or two lines.", @@ -163,15 +163,7 @@ const InfographicFourIcons: React.FC = ({ data }) => { backgroundColor: "var(--card-background-color, #FFFFFF)", }} > - {/* Header */} -
-
-
-
- {(slideData as any )?.__companyName__ && {(slideData as any)?.__companyName__}} -
-
-
+ {/* Title + right paragraph */}
diff --git a/servers/nextjs/presentation-templates/swift/IconBulletListDescription.tsx b/servers/nextjs/presentation-templates/swift/IconBulletListDescription.tsx index 7a2e393d..86f182c3 100644 --- a/servers/nextjs/presentation-templates/swift/IconBulletListDescription.tsx +++ b/servers/nextjs/presentation-templates/swift/IconBulletListDescription.tsx @@ -3,7 +3,7 @@ import * as z from "zod" import { RemoteSvgIcon } from "@/app/hooks/useRemoteSvgIcon"; const layoutId = "icon-bullet-list-description-slide" -const layoutName = "Icon Bullet List Description" +const layoutName = "Icon Bullet List Description" const layoutDescription = "Bullet list with title, description, and icon" const IconSchema = z @@ -39,7 +39,7 @@ const FeatureSchema = z const Schema = z .object({ - + title: z .string() .min(8) @@ -86,7 +86,7 @@ const Schema = z website: z.string().min(6).max(60).default("www.yourwebsite.com"), }) .default({ - + title: "Key Product Features", description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean commodo ligula eget dolor.", @@ -142,13 +142,8 @@ const FeatureCards: React.FC = ({ data: slideData }) => { backgroundColor: "var(--card-background-color, #FFFFFF)", }} > - {/* Header */} -
-
-
- {(slideData as any)?.__companyName__ && {(slideData as any)?.__companyName__}} -
-
+ + {/* Decorative right image area removed to keep imagery-driven design */} @@ -163,7 +158,7 @@ const FeatureCards: React.FC = ({ data: slideData }) => { {/* Feature cards */}
- {features.slice(0,4).map((f, i) => ( + {features.slice(0, 4).map((f, i) => (
diff --git a/servers/nextjs/presentation-templates/swift/ImageListDescription.tsx b/servers/nextjs/presentation-templates/swift/ImageListDescription.tsx index 1ef23463..503e384b 100644 --- a/servers/nextjs/presentation-templates/swift/ImageListDescription.tsx +++ b/servers/nextjs/presentation-templates/swift/ImageListDescription.tsx @@ -99,21 +99,7 @@ const TeamMembers: React.FC = ({ data: slideData }) => { backgroundColor: "var(--card-background-color, #FFFFFF)", }} > - {/* Header: diamond + business name */} -
-
-
- { (slideData as any)?.__companyName__ && - {(slideData as any)?.__companyName__} - } -
-
+
{/* Left text stack */} diff --git a/servers/nextjs/presentation-templates/swift/IntroSlideLayout.tsx b/servers/nextjs/presentation-templates/swift/IntroSlideLayout.tsx index cd7b587b..5398dd9f 100644 --- a/servers/nextjs/presentation-templates/swift/IntroSlideLayout.tsx +++ b/servers/nextjs/presentation-templates/swift/IntroSlideLayout.tsx @@ -90,21 +90,7 @@ const IntroSlideLayout: React.FC = ({ data: slideData }) => { backgroundColor: "var(--card-background-color, #FFFFFF)", }} > - {/* Header: diamond + business name */} -
-
-
- { (slideData as any)?.__companyName__ && - {(slideData as any)?.__companyName__} - } -
-
+ {/* Right panel image (replaces dark gradient box) */}
diff --git a/servers/nextjs/presentation-templates/swift/MetricsNumbers.tsx b/servers/nextjs/presentation-templates/swift/MetricsNumbers.tsx index 433bb6fc..9fe185ef 100644 --- a/servers/nextjs/presentation-templates/swift/MetricsNumbers.tsx +++ b/servers/nextjs/presentation-templates/swift/MetricsNumbers.tsx @@ -117,13 +117,7 @@ const MetricsNumbers: React.FC = ({ data: slideData }) => { backgroundColor: "var(--card-background-color, #FFFFFF)", }} > - {/* Header */} -
-
-
- { (slideData as any)?.__companyName__ && {(slideData as any)?.__companyName__}} -
-
+ {/* Separator line like the reference */}
@@ -147,7 +141,7 @@ const MetricsNumbers: React.FC = ({ data: slideData }) => {
- {metrics.slice(0,3).map((m, i) => ( + {metrics.slice(0, 3).map((m, i) => (
{m.value}
diff --git a/servers/nextjs/presentation-templates/swift/SimpleBulletPointsLayout.tsx b/servers/nextjs/presentation-templates/swift/SimpleBulletPointsLayout.tsx index bee2833c..5ee2b0a3 100644 --- a/servers/nextjs/presentation-templates/swift/SimpleBulletPointsLayout.tsx +++ b/servers/nextjs/presentation-templates/swift/SimpleBulletPointsLayout.tsx @@ -70,13 +70,7 @@ const CommitmentTwoPoints: React.FC = ({ data: slideData }) => backgroundColor: "var(--card-background-color, #FFFFFF)", }} > - {/* Header */} -
-
-
- { (slideData as any)?.__companyName__ && {(slideData as any)?.__companyName__}} -
-
+ {/* Subtle background motif */}
= ({ data: slideData }) => { backgroundColor: "var(--card-background-color, #FFFFFF)", }} > - {/* Header */} -
-
-
- { (slideData as any)?.__companyName__ && {(slideData as any)?.__companyName__}} -
-
+

{slideData?.title}

diff --git a/servers/nextjs/presentation-templates/swift/TableorChart.tsx b/servers/nextjs/presentation-templates/swift/TableorChart.tsx index da36a7a7..4bdd5df9 100644 --- a/servers/nextjs/presentation-templates/swift/TableorChart.tsx +++ b/servers/nextjs/presentation-templates/swift/TableorChart.tsx @@ -157,13 +157,7 @@ const TableOrChart: React.FC = ({ data: slideData }) => { backgroundColor: "var(--card-background-color, #FFFFFF)", }} > - {/* Header */} -
-
-
- {(slideData as any)?.__companyName__ && {(slideData as any)?.__companyName__}} -
-
+ {/* Title and description */}
diff --git a/servers/nextjs/presentation-templates/swift/Timeline.tsx b/servers/nextjs/presentation-templates/swift/Timeline.tsx index 2fdf9516..41c532e1 100644 --- a/servers/nextjs/presentation-templates/swift/Timeline.tsx +++ b/servers/nextjs/presentation-templates/swift/Timeline.tsx @@ -96,13 +96,7 @@ const Timeline: React.FC = ({ data: slideData }) => { > {/* Keep white background to match Swift layouts */} - {/* Header: diamond + business name */} -
-
-
- {(slideData as any)?.__companyName__ && {(slideData as any)?.__companyName__}} -
-
+ {/* Right vertical diamonds */}