import React from 'react' import * as z from "zod"; import { ChartContainer, ChartTooltip, ChartTooltipContent, ChartLegend, ChartLegendContent } from "@/components/ui/chart"; import { BarChart, Bar, LineChart, Line, PieChart, Pie, AreaChart, Area, ScatterChart, Scatter, XAxis, YAxis, CartesianGrid, Cell, ResponsiveContainer } from "recharts"; export const layoutId = 'multi-chart-grid-slide' export const layoutName = 'Multi-Chart Grid Slide' export const layoutDescription = 'A layout for displaying 2-4 charts in a grid format for small multiples and trend comparisons.' const chartDataSchema = z.object({ name: z.string().meta({ description: "Data point name" }), value: z.number().meta({ description: "Data point value" }), category: z.string().optional().meta({ description: "Category for grouping" }), x: z.number().optional().meta({ description: "X coordinate for scatter plots" }), y: z.number().optional().meta({ description: "Y coordinate for scatter plots" }), }); const chartItemSchema = z.object({ type: z.enum(['bar', 'line', 'pie', 'area', 'scatter']).meta({ description: "Chart type" }), data: z.array(chartDataSchema).min(2).max(8).meta({ description: "Chart data points" }), title: z.string().min(2).max(50).meta({ description: "Chart title/caption" }), color: z.string().meta({ description: "Chart color" }), }); const multiChartGridSlideSchema = z.object({ title: z.string().min(3).max(100).default('Market Performance Dashboard').meta({ description: "Main title of the slide", }), description: z.string().min(10).max(300).default('This dashboard provides a comprehensive view of key performance indicators across multiple business segments, enabling quick identification of trends and comparative analysis.').meta({ description: "Bottom description text", }), charts: z.array(chartItemSchema).min(2).max(4).default([ { type: 'bar', data: [ { name: 'Q1', value: 4000 }, { name: 'Q2', value: 3000 }, { name: 'Q3', value: 5000 }, { name: 'Q4', value: 4500 }, ], title: 'Revenue Trends', color: '#3b82f6' }, { type: 'line', data: [ { name: 'Q1', value: 2400 }, { name: 'Q2', value: 2210 }, { name: 'Q3', value: 2290 }, { name: 'Q4', value: 2000 }, ], title: 'Customer Growth', color: '#10b981' }, { type: 'area', data: [ { name: 'Q1', value: 1800 }, { name: 'Q2', value: 1950 }, { name: 'Q3', value: 2100 }, { name: 'Q4', value: 2300 }, ], title: 'Market Share', color: '#f59e0b' }, { type: 'bar', data: [ { name: 'Q1', value: 800 }, { name: 'Q2', value: 967 }, { name: 'Q3', value: 1200 }, { name: 'Q4', value: 1400 }, ], title: 'Cost Efficiency', color: '#ef4444' }, ]).meta({ description: "Array of charts (2-4 charts)", }), dataKey: z.string().default('value').meta({ description: "Key field for chart values", }), categoryKey: z.string().default('name').meta({ description: "Key field for chart categories", }), showLegend: z.boolean().default(false).meta({ description: "Whether to show chart legends", }), showTooltip: z.boolean().default(true).meta({ description: "Whether to show chart tooltips", }), }) export const Schema = multiChartGridSlideSchema export type MultiChartGridSlideData = z.infer interface MultiChartGridSlideLayoutProps { data?: Partial } const chartConfig = { value: { label: "Value", }, name: { label: "Name", }, }; const CHART_COLORS = [ '#3b82f6', '#10b981', '#f59e0b', '#ef4444', '#8b5cf6', '#06b6d4', '#84cc16', '#f97316', '#ec4899', '#6366f1' ]; const MultiChartGridSlideLayout: React.FC = ({ data: slideData }) => { const charts = slideData?.charts || []; const dataKey = slideData?.dataKey || 'value'; const categoryKey = slideData?.categoryKey || 'name'; const showLegend = slideData?.showLegend || false; const showTooltip = slideData?.showTooltip || true; // Determine grid layout based on chart count const getGridLayout = (count: number) => { switch (count) { case 2: return 'grid-cols-2 grid-rows-1'; case 3: return 'grid-cols-2 grid-rows-2'; case 4: return 'grid-cols-2 grid-rows-2'; default: return 'grid-cols-2 grid-rows-2'; } }; const renderChart = (chartType: string, data: any[], color: string) => { const commonProps = { data: data, margin: { top: 5, right: 5, left: 5, bottom: 20 }, }; switch (chartType) { case 'bar': return ( {showTooltip && } />} {showLegend && } />} ); case 'line': return ( {showTooltip && } />} {showLegend && } />} ); case 'area': return ( {showTooltip && } />} {showLegend && } />} ); case 'pie': return ( {showTooltip && } />} {showLegend && } />} `${(percent * 100).toFixed(0)}%`} > {data.map((entry, index) => ( ))} ); case 'scatter': return ( {showTooltip && } />} {showLegend && } />} ); default: return
Unsupported chart type
; } }; return ( <> {/* Import Google Fonts */}
{/* Glass overlay background */}
{/* Header section */}

{slideData?.title || 'Market Performance Dashboard'}

{/* Charts Grid section */}
{charts.map((chart, index) => (
{renderChart(chart.type, chart.data, chart.color)}

{chart.title}

))}
{/* Bottom Description section */}

{slideData?.description || 'This dashboard provides a comprehensive view of key performance indicators across multiple business segments, enabling quick identification of trends and comparative analysis.'}

) } export default MultiChartGridSlideLayout