- {slideData.content.split('\n').map((paragraph, index) => (
+ {slideData?.content?.split('\n').map((paragraph, index) => (
paragraph.trim() && (
{paragraph}
diff --git a/servers/nextjs/components/layouts/FirstSlideLayout.tsx b/servers/nextjs/components/layouts/FirstSlideLayout.tsx
index fcb87d57..a65f8d8e 100644
--- a/servers/nextjs/components/layouts/FirstSlideLayout.tsx
+++ b/servers/nextjs/components/layouts/FirstSlideLayout.tsx
@@ -1,5 +1,6 @@
import React from 'react'
import * as z from "zod";
+import { imageSchema } from './defaultSchemes';
export const layoutId = 'first-slide'
@@ -13,17 +14,17 @@ const firstSlideSchema = z.object({
subtitle: z.string().min(10).max(200).default('Subtitle for the slide').optional().meta({
description: "Optional subtitle or tagline",
}),
- author: z.string().min(2).max(100).default('John Doe').optional().meta({
+ author: z.string().max(100).default('John Doe').optional().meta({
description: "Author or presenter name",
}),
date: z.string().optional().meta({
description: "Presentation date",
}),
- company: z.string().min(2).max(100).default('Company Name').optional().meta({
+ company: z.string().max(100).default('Company Name').optional().meta({
description: "Company or organization name",
}),
- backgroundImage: z.string().optional().meta({
- description: "URL to background image for the slide",
+ backgroundImage: imageSchema.optional().meta({
+ description: "Background image for the slide",
})
})
@@ -36,8 +37,8 @@ interface FirstSlideLayoutProps {
accentColor?: 'blue' | 'green' | 'purple' | 'orange' | 'red'
}
-const FirstSlideLayout: React.FC = ({ data, accentColor = 'blue' }) => {
- const slideData = firstSlideSchema.parse(data || {})
+const FirstSlideLayout: React.FC = ({ data: slideData, accentColor = 'blue' }) => {
+
const accentColors = {
blue: 'from-blue-600 to-blue-800',
@@ -58,7 +59,7 @@ const FirstSlideLayout: React.FC = ({ data, accentColor =
return (
= ({ data, accentColor =
{/* Main Content */}
{/* Title */}
-
- {slideData.title}
+ {slideData?.title}
{/* Subtitle */}
- {slideData.subtitle && (
-
- {slideData.subtitle}
+ {slideData?.subtitle}
)}
@@ -110,21 +111,21 @@ const FirstSlideLayout: React.FC = ({ data, accentColor =
{/* Professional Metadata Container */}
- {slideData.author && (
+ {slideData?.author && (
- {slideData.author}
+ {slideData?.author}
)}
- {slideData.company && (
+ {slideData?.company && (
- {slideData.company}
+ {slideData?.company}
)}
- {slideData.date && (
+ {slideData?.date && (
- {slideData.date}
+ {slideData?.date}
)}
diff --git a/servers/nextjs/components/layouts/ImageSlideLayout.tsx b/servers/nextjs/components/layouts/ImageSlideLayout.tsx
deleted file mode 100644
index ffa65293..00000000
--- a/servers/nextjs/components/layouts/ImageSlideLayout.tsx
+++ /dev/null
@@ -1,156 +0,0 @@
-import React from 'react'
-import * as z from "zod";
-
-
-export const layoutId = 'image-slide'
-export const layoutName = 'Image Slide'
-export const layoutDescription = 'A slide with a title, subtitle, image, and content'
-
-const imageSlideSchema = z.object({
- title: z.string().min(3).max(100).default('Image Showcase').meta({
- description: "Title of the slide",
- }),
- subtitle: z.string().min(3).max(150).default('Subtitle for the slide').optional().meta({
- description: "Optional subtitle or description",
- }),
- image: z.string().default('https://images.unsplash.com/photo-1460925895917-afdab827c52f?w=800&h=600&fit=crop').meta({
- description: "Main image URL",
- }),
- imageCaption: z.string().min(5).max(200).default('Image caption').optional().meta({
- description: "Optional image caption or description",
- }),
- content: z.string().min(10).max(600).optional().meta({
- description: "Optional supporting content text",
- }),
- backgroundImage: z.string().optional().meta({
- description: "URL to background image for the slide",
- })
-})
-
-export const Schema = imageSlideSchema
-
-export type ImageSlideData = z.infer
-
-interface ImageSlideLayoutProps {
- data?: Partial
- accentColor?: 'blue' | 'green' | 'purple' | 'orange' | 'red'
-}
-
-const ImageSlideLayout: React.FC = ({ data, accentColor = 'blue' }) => {
- const slideData = imageSlideSchema.parse(data || {})
-
- const accentColors = {
- blue: 'from-blue-600 to-blue-800',
- green: 'from-emerald-600 to-emerald-800',
- purple: 'from-violet-600 to-violet-800',
- orange: 'from-orange-600 to-orange-800',
- red: 'from-red-600 to-red-800'
- }
-
- const accentSolids = {
- blue: 'bg-blue-600',
- green: 'bg-emerald-600',
- purple: 'bg-violet-600',
- orange: 'bg-orange-600',
- red: 'bg-red-600'
- }
-
-
-
- return (
-
- {/* Enhanced geometric background decoration */}
-
-
-
- {/* Professional Header */}
-
-
-
- {slideData.title}
-
-
-
- {slideData.subtitle && (
-
- {slideData.subtitle}
-
- )}
-
-
-
-
- {/* Enhanced Content Layout */}
-
-
-
-
-
- {slideData.content?.split('\n').map((paragraph, index) => (
- paragraph.trim() && (
-
- {paragraph}
-
- )
- ))}
-
-
- {/* Background decoration */}
-
-
-
-
-

-
-
- {slideData.imageCaption && (
-
- {slideData.imageCaption}
-
- )}
-
-
-
-
- {/* Enhanced decorative accent */}
-
-
- {/* Professional corner accents */}
-
-
- )
-}
-
-export default ImageSlideLayout
\ No newline at end of file
diff --git a/servers/nextjs/components/layouts/ProcessSlideLayout.tsx b/servers/nextjs/components/layouts/ProcessSlideLayout.tsx
index ec342e76..2bb03eae 100644
--- a/servers/nextjs/components/layouts/ProcessSlideLayout.tsx
+++ b/servers/nextjs/components/layouts/ProcessSlideLayout.tsx
@@ -1,5 +1,6 @@
import React from 'react'
import * as z from "zod";
+import { imageSchema } from './defaultSchemes';
export const layoutId = 'process-slide'
@@ -45,8 +46,8 @@ const processSlideSchema = z.object({
description: 'Final delivery and ongoing support'
}
]).describe('Process steps (2-6 items)'),
- backgroundImage: z.string().optional().meta({
- description: "URL to background image for the slide",
+ backgroundImage: imageSchema.optional().meta({
+ description: "Background image for the slide",
})
})
@@ -59,8 +60,7 @@ interface ProcessSlideLayoutProps {
accentColor?: 'blue' | 'green' | 'purple' | 'orange' | 'red'
}
-const ProcessSlideLayout: React.FC = ({ data, accentColor = 'blue' }) => {
- const slideData = processSlideSchema.parse(data || {})
+const ProcessSlideLayout: React.FC = ({ data: slideData, accentColor = 'blue' }) => {
const accentColors = {
blue: 'from-blue-600 to-blue-800',
@@ -89,8 +89,8 @@ const ProcessSlideLayout: React.FC = ({ data, accentCol
return (
= ({ data, accentCol
{/* Professional Header */}