presenton/electron/servers/nextjs/app/presentation-templates/Code/CodeSlide05ComparisonTable.tsx

146 lines
5.4 KiB
TypeScript

import * as z from "zod";
const ComparisonRowSchema = z.object({
feature: z.string().min(4).max(17).meta({
description: "Feature label shown in the first column.",
}),
column1: z.string().max(10).meta({
description: "Column 1 cell value.",
}),
column2: z.string().max(10).meta({
description: "Column 2 cell value.",
}),
column3: z.string().max(10).meta({
description: "Column 3 cell value.",
}),
});
export const slideLayoutId = "table-slide";
export const slideLayoutName = "Table Slide";
export const slideLayoutDescription =
"A slide with title and a table.";
export const Schema = z.object({
title: z.string().min(6).max(18).default("Comparison").meta({
description: "Slide title shown above the table.",
}),
tableColumns: z.array(z.string().max(4)).meta({
description: "Table columns shown in the first row.",
}).default(["Feature", "Column 1", "Column 2", "Column 3"]),
rows: z
.array(ComparisonRowSchema)
.min(1)
.max(6)
.default([
{ feature: "Component-based", column1: "check", column2: "check", column3: "check" },
{ feature: "TypeScript Support", column1: "check", column2: "check", column3: "check" },
{ feature: "Learning Curve", column1: "Medium", column2: "Easy", column3: "Steep" },
{ feature: "Bundle Size", column1: "40KB", column2: "34KB", column3: "167KB" },
{ feature: "Performance", column1: "Excellent", column2: "Excellent", column3: "Good" },
{ feature: "Community Size", column1: "Huge", column2: "Large", column3: "Large" },
])
.meta({
description: "Six comparison rows shown in the table.",
}),
pageLabel: z.string().min(3).max(8).optional().default("5 / 11").meta({
description: "Bottom pagination label.",
}),
});
export type SchemaType = z.infer<typeof Schema>;
function renderCell(value: string) {
if (value && value.toLowerCase() === "check") {
return <span className="text-[26px] px-[32px]" style={{ color: "var(--graph-2,#37f08e)" }}></span>;
}
return <span className="text-[18px] px-[32px]" style={{ color: "var(--background-text,#CAD5E2)" }}>{value}</span>;
}
const CodeSlide05ComparisonTable = ({ data }: { data: Partial<SchemaType> }) => {
return (
<>
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,opsz,wght@0,6..12,200..1000;1,6..12,200..1000&display=swap" rel="stylesheet" />
<div
className="relative h-[720px] w-[1280px] overflow-hidden p-[53px]"
style={{
backgroundColor: "var(--background-color,#101B37)",
fontFamily: "var(--body-font-family,Nunito Sans)",
}}
>
<h2 className="text-[64px] font-medium" style={{ color: "var(--background-text,#ffffff)" }}>{data.title}</h2>
<div
className="mt-[22px] min-h-0 flex-1 rounded-[16px] border"
style={{
backgroundColor: "var(--card-color,#0F172BCC)",
borderColor: "var(--stroke,#1D293D80)",
}}
>
<div
className="grid grid-cols-[0.4fr_0.20fr_0.20fr_0.20fr] items-center"
style={{
color: "var(--background-text,#8ea1da)",
gridTemplateColumns: `repeat(${data?.tableColumns?.length || 1}, 1fr)`,
}}
>
{data?.tableColumns?.map((column) => (
<p
key={column}
className="px-[32px] py-[16px] text-[18px] text-center border-b border-r"
style={{
color: "var(--background-text,#ffffff)",
borderColor: "var(--stroke,#1D293D80)",
}}
>
{column}
</p>
))}
</div>
<div className="">
{data?.rows?.map((row) => (
<div
key={row.feature}
className="grid grid-cols-[0.4fr_0.20fr_0.20fr_0.20fr]"
style={{
gridTemplateColumns: `repeat(${data?.tableColumns?.length || 1}, 1fr)`,
}}
>
<p
className="px-[32px] py-[20px] text-center text-[18px] border-b border-r"
style={{
color: "var(--background-text,#d5dcff)",
borderColor: "var(--stroke,#1D293D80)",
}}
>
{row.feature}
</p>
<div className="flex justify-center items-center text-[18px] border-b border-r" style={{ borderColor: "var(--stroke,#1D293D80)" }}>{renderCell(row.column1)}</div>
<div className="flex justify-center items-center text-[18px] border-b border-r" style={{ borderColor: "var(--stroke,#1D293D80)" }}>{renderCell(row.column2)}</div>
<div className="flex justify-center items-center text-[18px] border-b border-r" style={{ borderColor: "var(--stroke,#1D293D80)" }}>{renderCell(row.column3)}</div>
</div>
))}
</div>
</div>
<div
className="absolute bottom-[26px] z-50 left-1/2 -translate-x-1/2 rounded-full border px-[22px] py-[8px] text-[14px]"
style={{
borderColor: "var(--stroke,#31415880)",
backgroundColor: "var(--card-color,#1D293DCC)",
color: "var(--background-text,#CAD5E2)",
}}
>
{data.pageLabel}
</div>
</div>
</>
);
};
export default CodeSlide05ComparisonTable;