feat: Theme implementation in new templates

This commit is contained in:
shiva raj badu 2026-04-09 01:44:18 +05:45
parent a485342f3c
commit 950ca497b1
No known key found for this signature in database
53 changed files with 1710 additions and 499 deletions

View file

@ -0,0 +1,133 @@
import * as z from "zod";
export const slideLayoutId = "product-overview-market-opportunity-slide";
export const slideLayoutName = "Product Overview Market Opportunity Slide";
export const slideLayoutDescription =
"A market opportunity slide with title and intro text on the left, four bullet lines extending toward the right, and concentric value circles as the visual focal point.";
const BulletSchema = z.object({
text: z.string().min(12).max(46).meta({
description: "Bullet text shown on the left side of a line.",
}),
});
export const Schema = z.object({
title: z.string().min(8).max(22).default("Market Opportunity").meta({
description: "Main heading shown at the top-left.",
}),
subtitle: z.string().min(40).max(110).default(
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt."
).meta({
description: "Supporting text under the main heading.",
}),
bullets: z
.array(BulletSchema)
.min(4)
.max(4)
.default([
{ text: "Ut enim ad minim veniam, quis" },
{ text: "Ut enim ad minim veniam, quis" },
{ text: "Ut enim ad minim veniam, quis" },
{ text: "Ut enim ad minim veniam, quis" },
])
.meta({
description: "Four bullet-line entries shown on the left.",
}),
values: z
.array(z.string().min(2).max(6))
.min(4)
.max(4)
.default(["$33", "$20", "$120", "$200"])
.meta({
description: "Four values shown from outer to inner circles.",
}),
});
export type SchemaType = z.infer<typeof Schema>;
const COLORS = [
"var(--graph-0,#5f7f79)",
"var(--graph-1,#1f5a4f)",
"var(--graph-2,#0d4f43)",
"var(--graph-3,#06463d)",
];
const MarketOpportunitySlide = ({ data }: { data: Partial<SchemaType> }) => {
const { title, subtitle, bullets, values } = data;
return (
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px]"
style={{
backgroundColor: "var(--background-color,#DAE1DE)",
fontFamily: "var(--body-font-family,'Bricolage Grotesque')",
}}
>
<div className="px-[56px] pt-[72px]">
<h2
className="text-[80px] font-semibold leading-[108.4%] tracking-[-2.419px] text-[#15342D]"
style={{ color: "var(--primary-color,#15342D)" }}
>
{title}
</h2>
<p
className="mt-[20px] w-[730px] text-[24px] font-normal text-[#15342DCC]"
style={{ color: "var(--background-text,#15342DCC)" }}
>
{subtitle}
</p>
</div>
<div className="absolute left-[56px] top-[368px] space-y-[42px]">
{bullets?.map((bullet, index) => (
<div key={index} className="relative flex items-center">
<span
className="mr-[14px] h-[14px] w-[14px] rounded-full bg-[#0a4a3f]"
style={{ backgroundColor: "var(--graph-0,#0a4a3f)" }}
/>
<p
className="w-[640px] text-[24px] font-normal text-[#15342DCC]"
style={{ color: "var(--background-text,#15342DCC)" }}
>
{bullet.text}
</p>
<span
className="ml-[8px] h-[2px] w-[80px] bg-[#8ea8a5]"
style={{ backgroundColor: "var(--stroke,#8ea8a5)" }}
/>
<span
className="h-[6px] w-[6px] rounded-full bg-[#edf2f1]"
style={{ backgroundColor: "var(--primary-text,#edf2f1)" }}
/>
</div>
))}
</div>
<div className="absolute bottom-[58px] right-[48px] h-[474px] w-[474px]">
{values?.map((value, index) => (
<div
key={index}
className="absolute rounded-full"
style={{
width: 237 + (index * 50),
height: 237 + (index * 50),
bottom: 0,
right: 0,
backgroundColor: COLORS[index],
}}
>
<p
className="pt-[24px] text-center text-[24px] font-normal text-white"
style={{ color: "var(--primary-text,#ffffff)" }}
>
{value}
</p>
</div>
))}
</div>
</div>
);
};
export default MarketOpportunitySlide;

View file

@ -32,16 +32,29 @@ export type SchemaType = z.infer<typeof Schema>;
const CodeSlide01RoadmapCover = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden bg-[#101B37] p-[53px] ">
<div
className="relative h-[720px] w-[1280px] overflow-hidden p-[53px]"
style={{
backgroundColor: "var(--background-color,#101B37)",
fontFamily: "var(--body-font-family,Nunito Sans)",
}}
>
<div className="relative z-10 flex h-full flex-col items-center justify-center px-[200px] text-center">
<p className="text-[22px] text-[#d7dcff]">{data.companyName}</p>
<h2 className="mt-[10px] text-[64px] font-medium text-white">
<p className="text-[22px]" style={{ color: "var(--background-text,#d7dcff)" }}>{data.companyName}</p>
<h2 className="mt-[10px] text-[64px] font-medium" style={{ color: "var(--background-text,#ffffff)" }}>
{data.title}
</h2>
<p className="mt-[35px] text-[26px] leading-[132%] text-[#d8ddff]">{data.subtitle}</p>
<p className="mt-[35px] text-[26px] leading-[132%]" style={{ color: "var(--background-text,#d8ddff)" }}>{data.subtitle}</p>
</div>
<div className="absolute bottom-[26px] left-1/2 -translate-x-1/2 rounded-full border border-[#31415880] bg-[#1D293DCC] px-[22px] py-[8px] text-[14px] text-[#CAD5E2]">
<div
className="absolute bottom-[26px] 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>

View file

@ -64,15 +64,36 @@ const CodeSlide02CodeExplanationSplit = ({
}) => {
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden bg-[#101B37] p-[53px] ">
<div
className="relative h-[720px] w-[1280px] overflow-hidden p-[53px]"
style={{
backgroundColor: "var(--background-color,#101B37)",
fontFamily: "var(--body-font-family,Nunito Sans)",
}}
>
<div className="relative z-10 flex h-full flex-col">
<h2 className="text-[64px] font-medium text-[#ffffff]">{data.title}</h2>
<h2 className="text-[64px] font-medium" style={{ color: "var(--background-text,#ffffff)" }}>{data.title}</h2>
<div className="mt-[22px] grid min-h-0 flex-1 grid-cols-2 gap-[34px]">
<div className=" flex-1 bg-[#0F172B80] border border-[#1D293D80] rounded-[18px] ">
<p className="text-[18px] text-[#CAD5E2] capitalize bg-[#0F172BCC] rounded-t-[18px] border border-[#1D293D80] px-[26px] py-3">{data.codeSnippet?.fileName}</p>
<pre className=" w-full px-[32px] py-[20px] text-[#ffffff] whitespace-pre-wrap break-words overflow-hidden">
<div
className=" flex-1 border rounded-[18px]"
style={{
backgroundColor: "var(--card-color,#0F172B80)",
borderColor: "var(--stroke,#1D293D80)",
}}
>
<p
className="text-[18px] capitalize rounded-t-[18px] border px-[26px] py-3"
style={{
color: "var(--background-text,#CAD5E2)",
backgroundColor: "var(--card-color,#0F172BCC)",
borderColor: "var(--stroke,#1D293D80)",
}}
>
{data.codeSnippet?.fileName}
</p>
<pre className=" w-full px-[32px] py-[20px] whitespace-pre-wrap break-words overflow-hidden" style={{ color: "var(--background-text,#ffffff)" }}>
<code className="w-full ">
{data.codeSnippet?.content}
@ -81,15 +102,22 @@ const CodeSlide02CodeExplanationSplit = ({
</div>
<div className=" ">
<h3 className="text-[24px] font-medium text-[#f1f4ff]">{data.explanationTitle}</h3>
<p className="mt-[18px] text-[22px] leading-[145%] text-[#d2d9ff]">
<h3 className="text-[24px] font-medium" style={{ color: "var(--background-text,#f1f4ff)" }}>{data.explanationTitle}</h3>
<p className="mt-[18px] text-[22px] leading-[145%]" style={{ color: "var(--background-text,#d2d9ff)" }}>
{data.explanation}
</p>
</div>
</div>
</div>
<div className="absolute bottom-[26px] z-50 left-1/2 -translate-x-1/2 rounded-full border border-[#31415880] bg-[#1D293DCC] px-[22px] py-[8px] text-[14px] text-[#CAD5E2]">
<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>

View file

@ -73,31 +73,64 @@ const CodeSlide03ApiRequestResponse = ({
}) => {
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden bg-[#101B37] p-[53px] ">
<div
className="relative h-[720px] w-[1280px] overflow-hidden p-[53px]"
style={{
backgroundColor: "var(--background-color,#101B37)",
fontFamily: "var(--body-font-family,Nunito Sans)",
}}
>
<div className="relative z-10 flex h-full flex-col">
<h2 className="text-[64px] font-medium text-[#ffffff]">{data.title}</h2>
<h2 className="text-[64px] font-medium" style={{ color: "var(--background-text,#ffffff)" }}>{data.title}</h2>
<div className="mt-[22px] grid flex-1 grid-cols-2 gap-[22px]">
<div className="flex flex-col gap-[12px] ">
<div className="rounded-[14px] border border-[#1D293D80] bg-[#0F172B80] p-[14px]">
<div className="flex items-center gap-5 pb-[14px] border-b border-[#1D293D80]">
<p className="rounded-[12px] bg-[#2B7FFF33] px-[23px] py-[10px] text-[14px] uppercase tracking-[0.06em] text-[#51A2FF]">
<div
className="rounded-[14px] border p-[14px]"
style={{
borderColor: "var(--stroke,#1D293D80)",
backgroundColor: "var(--card-color,#0F172B80)",
}}
>
<div className="flex items-center gap-5 pb-[14px] border-b" style={{ borderColor: "var(--stroke,#1D293D80)" }}>
<p
className="rounded-[12px] px-[23px] py-[10px] text-[14px] uppercase tracking-[0.06em]"
style={{
backgroundColor: "var(--primary-color,#2B7FFF33)",
color: "var(--primary-text,#51A2FF)",
}}
>
{data.method}
</p>
<p className="text-[23px] text-[#dde5ff]">{data.endpoint}</p>
<p className="text-[23px]" style={{ color: "var(--background-text,#dde5ff)" }}>{data.endpoint}</p>
</div>
<p className="mt-[21px] text-[18px] uppercase tracking-[0.08em] text-[#90a1d8]">Headers</p>
<div className="mt-[15px] space-y-[4px] text-[24px] text-[#cbd4f8]">
<p className="mt-[21px] text-[18px] uppercase tracking-[0.08em]" style={{ color: "var(--background-text,#90a1d8)" }}>Headers</p>
<div className="mt-[15px] space-y-[4px] text-[24px]" style={{ color: "var(--background-text,#cbd4f8)" }}>
{data.headers?.map((item) => (
<p key={item} className="text-[18px] text-[#CAD5E2]">{item}</p>
<p key={item} className="text-[18px]" style={{ color: "var(--background-text,#CAD5E2)" }}>{item}</p>
))}
</div>
</div>
<div className=" flex-1 bg-[#0F172B80] border border-[#1D293D80] rounded-[18px] ">
<p className="text-[18px] text-[#CAD5E2] capitalize bg-[#1D293D80] rounded-t-[18px] border border-[#1D293D80] p-[14px]">{data.requestSnippet?.fileName}</p>
<pre className=" w-full px-[14px] py-[20px] text-[#ffffff] whitespace-pre-wrap break-words overflow-hidden">
<div
className=" flex-1 border rounded-[18px]"
style={{
backgroundColor: "var(--card-color,#0F172B80)",
borderColor: "var(--stroke,#1D293D80)",
}}
>
<p
className="text-[18px] capitalize rounded-t-[18px] border p-[14px]"
style={{
color: "var(--background-text,#CAD5E2)",
backgroundColor: "var(--card-color,#1D293D80)",
borderColor: "var(--stroke,#1D293D80)",
}}
>
{data.requestSnippet?.fileName}
</p>
<pre className=" w-full px-[14px] py-[20px] whitespace-pre-wrap break-words overflow-hidden" style={{ color: "var(--background-text,#ffffff)" }}>
<code className="w-full ">
{data.requestSnippet?.content}
@ -106,9 +139,24 @@ const CodeSlide03ApiRequestResponse = ({
</div>
</div>
<div className=" flex-1 bg-[#0F172B80] border border-[#1D293D80] rounded-[18px] ">
<p className="text-[18px] text-[#CAD5E2] capitalize bg-[#1D293D80] rounded-t-[18px] border border-[#1D293D80] p-[14px]">{data.responseSnippet?.fileName}</p>
<pre className=" w-full px-[14px] py-[20px] text-[#ffffff] whitespace-pre-wrap break-words overflow-hidden">
<div
className=" flex-1 border rounded-[18px]"
style={{
backgroundColor: "var(--card-color,#0F172B80)",
borderColor: "var(--stroke,#1D293D80)",
}}
>
<p
className="text-[18px] capitalize rounded-t-[18px] border p-[14px]"
style={{
color: "var(--background-text,#CAD5E2)",
backgroundColor: "var(--card-color,#1D293D80)",
borderColor: "var(--stroke,#1D293D80)",
}}
>
{data.responseSnippet?.fileName}
</p>
<pre className=" w-full px-[14px] py-[20px] whitespace-pre-wrap break-words overflow-hidden" style={{ color: "var(--background-text,#ffffff)" }}>
<code className="w-full ">
{data.responseSnippet?.content}
@ -118,7 +166,14 @@ const CodeSlide03ApiRequestResponse = ({
</div>
</div>
<div className="absolute bottom-[26px] z-50 left-1/2 -translate-x-1/2 rounded-full border border-[#31415880] bg-[#1D293DCC] px-[22px] py-[8px] text-[14px] text-[#CAD5E2]">
<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>

View file

@ -99,24 +99,37 @@ const CodeSlide04FeatureGrid = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden bg-[#101B37] p-[53px] ">
<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 tracking-[-0.03em] text-[#f2f4ff]">{data.title}</h2>
<h2 className="text-[64px] font-medium tracking-[-0.03em]" style={{ color: "var(--background-text,#f2f4ff)" }}>{data.title}</h2>
<div className="mt-[26px] grid flex-1 grid-cols-3 items-center h-fit gap-[26px]">
{data?.features?.map((feature) => (
<div
key={feature.title}
className="rounded-[18px] border p-[26px]"
style={{
boxShadow: "0 33.333px 66.667px -16px rgba(0, 0, 0, 0.25)",
borderColor: "var(--stroke,#1D293D80)",
backgroundColor: "var(--card-color,#0F172B80)",
}}
className="rounded-[18px] border border-[#1D293D80] bg-[#0F172B80] p-[26px]"
>
<div className="flex items-start justify-between gap-[8px]">
<h3 className="text-[26px] font-medium text-[#ffffff]">{feature.title}</h3>
<span className="flex h-[52px] w-[52px] items-center justify-center rounded-full border border-[#2B7FFF4D] bg-[#2B7FFF33] text-[18px] ">
<h3 className="text-[26px] font-medium" style={{ color: "var(--background-text,#ffffff)" }}>{feature.title}</h3>
<span
className="flex h-[52px] w-[52px] items-center justify-center rounded-full border text-[18px]"
style={{
borderColor: "var(--primary-color,#2B7FFF4D)",
backgroundColor: "var(--primary-color,#2B7FFF33)",
}}
>
<img src={feature.icon.__icon_url__} alt={feature.icon.__icon_query__} className="h-[24px] w-[24px] object-contain"
style={{
filter: "invert(1)",
@ -124,13 +137,20 @@ const CodeSlide04FeatureGrid = ({ data }: { data: Partial<SchemaType> }) => {
/>
</span>
</div>
<p className="mt-[12px] text-[18px] leading-[136%] text-[#90A1B9]">{feature.description}</p>
<p className="mt-[12px] text-[18px] leading-[136%]" style={{ color: "var(--background-text,#90A1B9)" }}>{feature.description}</p>
</div>
))}
</div>
<div className="absolute bottom-[26px] z-50 left-1/2 -translate-x-1/2 rounded-full border border-[#31415880] bg-[#1D293DCC] px-[22px] py-[8px] text-[14px] text-[#CAD5E2]">
<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>

View file

@ -51,28 +51,51 @@ export type SchemaType = z.infer<typeof Schema>;
function renderCell(value: string) {
if (value.toLowerCase() === "check") {
return <span className="text-[26px] px-[32px] text-[#37f08e]"></span>;
return <span className="text-[26px] px-[32px]" style={{ color: "var(--graph-2,#37f08e)" }}></span>;
}
return <span className="text-[18px] px-[32px] text-[#CAD5E2]">{value}</span>;
return <span className="text-[18px] px-[32px]" style={{ color: "var(--background-text,#CAD5E2)" }}>{value}</span>;
}
const CodeSlide05ComparisonTable = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden bg-[#101B37] p-[53px] ">
<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 text-[#ffffff]">{data.title}</h2>
<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] bg-[#0F172BCC] border border-[#1D293D80]">
<div className="grid grid-cols-[0.4fr_0.20fr_0.20fr_0.20fr] items-center text-[#8ea1da]"
<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 className="px-[32px] py-[16px] text-[18px] text-center text-[#ffffff] border-b border-r border-[#1D293D80]">{column}</p>
<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>
@ -85,17 +108,32 @@ const CodeSlide05ComparisonTable = ({ data }: { data: Partial<SchemaType> }) =>
gridTemplateColumns: `repeat(${data?.tableColumns?.length || 1}, 1fr)`,
}}
>
<p className="px-[32px] py-[20px] text-center text-[18px] text-[#d5dcff] border-b border-r border-[#1D293D80]">{row.feature}</p>
<div className="flex justify-center items-center text-[18px] border-b border-r border-[#1D293D80] ">{renderCell(row.column1)}</div>
<div className="flex justify-center items-center text-[18px] border-b border-r border-[#1D293D80] ">{renderCell(row.column2)}</div>
<div className="flex justify-center items-center text-[18px] border-b border-r border-[#1D293D80] ">{renderCell(row.column3)}</div>
<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 border-[#31415880] bg-[#1D293DCC] px-[22px] py-[8px] text-[14px] text-[#CAD5E2]">
<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>

View file

@ -81,33 +81,47 @@ export type SchemaType = z.infer<typeof Schema>;
const CodeSlide06Workflow = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden bg-[#101B37] p-[53px] ">
<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 text-[#ffffff]">{data.title}</h2>
<h2 className="text-[64px] font-medium" style={{ color: "var(--background-text,#ffffff)" }}>{data.title}</h2>
<div className="mt-[52px] grid flex-1 grid-cols-[1fr_auto_1fr_auto_1fr_auto_1fr] items-center gap-[12px]">
{data?.steps?.map((step, index) => (
<Fragment key={`${step.title}-${index}`}>
<div
className="rounded-[18px] border border-[#1D293D80] bg-[#0F172B80] p-[21px] text-center"
className="rounded-[18px] border p-[21px] text-center"
style={{
boxShadow: "0 33.333px 66.667px -16px rgba(0, 0, 0, 0.25)",
borderColor: "var(--stroke,#1D293D80)",
backgroundColor: "var(--card-color,#0F172B80)",
}}
>
<div className="mx-auto flex h-[75px] w-[75px] items-center justify-center rounded-full border border-[#2B7FFF80] bg-[#2B7FFF33]">
<div
className="mx-auto flex h-[75px] w-[75px] items-center justify-center rounded-full border"
style={{
borderColor: "var(--primary-color,#2B7FFF80)",
backgroundColor: "var(--primary-color,#2B7FFF33)",
}}
>
<img src={step.icon.__icon_url__} alt={step.icon.__icon_query__} className="h-[37px] w-[37px] object-contain"
style={{
filter: "invert(1)",
}}
/>
</div>
<h3 className="mt-[12px] text-[24px] font-medium text-[#ffffff]">{step.title}</h3>
<p className="mt-[12px] text-[18px] text-[#90A1B9]">{step.description}</p>
<h3 className="mt-[12px] text-[24px] font-medium" style={{ color: "var(--background-text,#ffffff)" }}>{step.title}</h3>
<p className="mt-[12px] text-[18px]" style={{ color: "var(--background-text,#90A1B9)" }}>{step.description}</p>
</div>
{index < (data?.steps?.length || 0) - 1 && (
<svg xmlns="http://www.w3.org/2000/svg" width="43" height="43" viewBox="0 0 43 43" fill="none">
<path d="M8.88892 21.3333H33.7778" stroke="#51A2FF" strokeWidth="3.55556" strokeLinecap="round" strokeLinejoin="round" />
<path d="M21.3334 8.88892L33.7778 21.3334L21.3334 33.7778" stroke="#51A2FF" strokeWidth="3.55556" strokeLinecap="round" strokeLinejoin="round" />
<path d="M8.88892 21.3333H33.7778" stroke="var(--primary-color,#51A2FF)" strokeWidth="3.55556" strokeLinecap="round" strokeLinejoin="round" />
<path d="M21.3334 8.88892L33.7778 21.3334L21.3334 33.7778" stroke="var(--primary-color,#51A2FF)" strokeWidth="3.55556" strokeLinecap="round" strokeLinejoin="round" />
</svg>
)}
</Fragment>
@ -115,7 +129,14 @@ const CodeSlide06Workflow = ({ data }: { data: Partial<SchemaType> }) => {
</div>
<div className="absolute bottom-[26px] left-1/2 -translate-x-1/2 rounded-full border border-[#31415880] bg-[#1D293DCC] px-[22px] py-[8px] text-[14px] text-[#CAD5E2]">
<div
className="absolute bottom-[26px] 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>

View file

@ -36,31 +36,52 @@ export type SchemaType = z.infer<typeof Schema>;
const CodeSlide07UseCaseList = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden bg-[#101B37] p-[53px] ">
<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 text-[#f2f4ff]">{data.title}</h2>
<h2 className="text-[64px] font-medium" style={{ color: "var(--background-text,#f2f4ff)" }}>{data.title}</h2>
<div className="mt-[53px] grid flex-1 grid-cols-2 gap-[21px]">
{data?.items?.map((item, index) => (
<div
key={`use-case-${index}`}
className="flex items-center gap-[21px] rounded-[18px] border border-[#1D293D80] bg-[#0F172B80] p-[28px] "
className="flex items-center gap-[21px] rounded-[18px] border p-[28px]"
style={{
boxShadow: "0 33.333px 66.667px -16px rgba(0, 0, 0, 0.25)",
borderColor: "var(--stroke,#1D293D80)",
backgroundColor: "var(--card-color,#0F172B80)",
}}
>
<span className="flex h-[42px] w-[42px] shrink-0 items-center justify-center rounded-full border border-[#2B7FFF4D] bg-[#2B7FFF33] text-[18px] text-[#51A2FF]">
<span
className="flex h-[42px] w-[42px] shrink-0 items-center justify-center rounded-full border text-[18px]"
style={{
borderColor: "var(--primary-color,#2B7FFF4D)",
backgroundColor: "var(--primary-color,#2B7FFF33)",
color: "var(--primary-color,#51A2FF)",
}}
>
{index + 1}
</span>
<p className="text-[18px] text-[#d5dcff]">{item}</p>
<p className="text-[18px]" style={{ color: "var(--background-text,#d5dcff)" }}>{item}</p>
</div>
))}
</div>
<div className="absolute bottom-[26px] left-1/2 -translate-x-1/2 rounded-full border border-[#31415880] bg-[#1D293DCC] px-[22px] py-[8px] text-[14px] text-[#CAD5E2]">
<div
className="absolute bottom-[26px] 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>

View file

@ -32,16 +32,29 @@ export type SchemaType = z.infer<typeof Schema>;
const CodeSlide08CodeExplanationText = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden bg-[#101B37] p-[53px] ">
<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 text-[#f2f4ff]">{data.title}</h2>
<h2 className="text-[64px] font-medium" style={{ color: "var(--background-text,#f2f4ff)" }}>{data.title}</h2>
<div className="relative z-10 h-full max-w-[560px]">
<h3 className="mt-[34px] text-[24px] font-medium text-[#f1f4ff]">{data.explanationTitle}</h3>
<p className="mt-[16px] text-[22px] leading-[145%] text-[#d2d9ff]">{data.explanation}</p>
<h3 className="mt-[34px] text-[24px] font-medium" style={{ color: "var(--background-text,#f1f4ff)" }}>{data.explanationTitle}</h3>
<p className="mt-[16px] text-[22px] leading-[145%]" style={{ color: "var(--background-text,#d2d9ff)" }}>{data.explanation}</p>
</div>
<div className="absolute bottom-[26px] left-1/2 -translate-x-1/2 rounded-full border border-[#31415880] bg-[#1D293DCC] px-[22px] py-[8px] text-[14px] text-[#CAD5E2]">
<div
className="absolute bottom-[26px] 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>

View file

@ -49,15 +49,15 @@ function TocColumn({ items }: { items: { number: string; label: string, descript
return (
<div key={`${item.number}-${item.label}`} className="flex items-center gap-[10px] text-[#d5dcff]">
<div key={`${item.number}-${item.label}`} className="flex items-center gap-[10px]" style={{ color: "var(--background-text,#d5dcff)" }}>
<div className=""><svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 22 22" fill="none">
<path d="M17.7778 17.7776C18.2493 17.7776 18.7015 17.5903 19.0349 17.2569C19.3683 16.9235 19.5556 16.4713 19.5556 15.9998V7.11095C19.5556 6.63945 19.3683 6.18727 19.0349 5.85387C18.7015 5.52047 18.2493 5.33317 17.7778 5.33317H10.7556C10.4583 5.33609 10.165 5.26438 9.90254 5.12462C9.6401 4.98486 9.41691 4.7815 9.25339 4.53317L8.53339 3.4665C8.37151 3.2207 8.15114 3.01893 7.89205 2.8793C7.63296 2.73967 7.34326 2.66655 7.04894 2.6665H3.55561C3.08411 2.6665 2.63193 2.8538 2.29853 3.1872C1.96513 3.5206 1.77783 3.97279 1.77783 4.44428V15.9998C1.77783 16.4713 1.96513 16.9235 2.29853 17.2569C2.63193 17.5903 3.08411 17.7776 3.55561 17.7776H17.7778Z" stroke="#51A2FF" strokeWidth="1.77778" strokeLinecap="round" strokeLinejoin="round" />
<path d="M17.7778 17.7776C18.2493 17.7776 18.7015 17.5903 19.0349 17.2569C19.3683 16.9235 19.5556 16.4713 19.5556 15.9998V7.11095C19.5556 6.63945 19.3683 6.18727 19.0349 5.85387C18.7015 5.52047 18.2493 5.33317 17.7778 5.33317H10.7556C10.4583 5.33609 10.165 5.26438 9.90254 5.12462C9.6401 4.98486 9.41691 4.7815 9.25339 4.53317L8.53339 3.4665C8.37151 3.2207 8.15114 3.01893 7.89205 2.8793C7.63296 2.73967 7.34326 2.66655 7.04894 2.6665H3.55561C3.08411 2.6665 2.63193 2.8538 2.29853 3.1872C1.96513 3.5206 1.77783 3.97279 1.77783 4.44428V15.9998C1.77783 16.4713 1.96513 16.9235 2.29853 17.2569C2.63193 17.5903 3.08411 17.7776 3.55561 17.7776H17.7778Z" stroke="var(--primary-color,#51A2FF)" strokeWidth="1.77778" strokeLinecap="round" strokeLinejoin="round" />
</svg></div>
<div className="flex gap-[26px]">
<p className="w-[36px] text-[18px] text-[#8EC5FF]">{item.number}</p>
<p className="text-[18px] text-[#ffffff]">{item.label}</p>
{item.description && <p className="text-[18px] text-[#ffffff]">{item.description}</p>}
<p className="w-[36px] text-[18px]" style={{ color: "var(--primary-color,#8EC5FF)" }}>{item.number}</p>
<p className="text-[18px]" style={{ color: "var(--background-text,#ffffff)" }}>{item.label}</p>
{item.description && <p className="text-[18px]" style={{ color: "var(--background-text,#ffffff)" }}>{item.description}</p>}
</div>
</div>
);
@ -72,11 +72,17 @@ const CodeSlide09TableOfContent = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden bg-[#101B37] p-[53px] ">
<div
className="relative h-[720px] w-[1280px] overflow-hidden p-[53px]"
style={{
backgroundColor: "var(--background-color,#101B37)",
fontFamily: "var(--body-font-family,Nunito Sans)",
}}
>
<div className="relative z-10 flex h-full flex-col">
<h2 className="text-[64px] font-medium text-[#f2f4ff]">{data.title}</h2>
<h2 className="text-[64px] font-medium" style={{ color: "var(--background-text,#f2f4ff)" }}>{data.title}</h2>
<div className="mt-[53px] grid flex-1 grid-cols-2 gap-[24px]">
<TocColumn items={leftItems || []} />
@ -84,7 +90,14 @@ const CodeSlide09TableOfContent = ({ data }: { data: Partial<SchemaType> }) => {
</div>
</div>
<div className="absolute bottom-[26px] z-50 left-1/2 -translate-x-1/2 rounded-full border border-[#31415880] bg-[#1D293DCC] px-[22px] py-[8px] text-[14px] text-[#CAD5E2]">
<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>

View file

@ -52,35 +52,53 @@ export const Schema = z.object({
export type SchemaType = z.infer<typeof Schema>;
const CodeSlide10MetricsSplit = ({ data }: { data: Partial<SchemaType> }) => {
const slideData = Schema.parse(data);
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden bg-[#101B37] p-[53px] text-[#ffffff]">
<div
className="relative h-[720px] w-[1280px] overflow-hidden p-[53px]"
style={{
backgroundColor: "var(--background-color,#101B37)",
color: "var(--background-text,#ffffff)",
fontFamily: "var(--body-font-family,Nunito Sans)",
}}
>
<h2 className="text-[64px] font-medium tracking-[-0.03em] text-[#f2f4ff]">{slideData.title}</h2>
<h2 className="text-[64px] font-medium tracking-[-0.03em]" style={{ color: "var(--background-text,#f2f4ff)" }}>{data.title}</h2>
<div className="relative z-10 flex gap-10 ">
<div className="w-1/2">
<h3 className="mt-[28px] text-[24px] font-medium text-[#f1f4ff]">{slideData.explanationTitle}</h3>
<p className="mt-[16px] text-[22px] leading-[145%] text-[#d2d9ff]">{slideData.explanation}</p>
<h3 className="mt-[28px] text-[24px] font-medium" style={{ color: "var(--background-text,#f1f4ff)" }}>{data.explanationTitle}</h3>
<p className="mt-[16px] text-[22px] leading-[145%]" style={{ color: "var(--background-text,#d2d9ff)" }}>{data.explanation}</p>
</div>
<div className="flex flex-col justify-center items-end gap-[25px] w-1/2">
{slideData.metrics.map((metric, index) => (
{data?.metrics?.map((metric, index) => (
<div
key={`metric-grid-${index}`}
className="rounded-[16px] w-[310px] border border-[#1D293D80] bg-[#0F172B80] pt-[26px] px-[26px] pb-[16px] text-center"
className="rounded-[16px] w-[310px] border pt-[26px] px-[26px] pb-[16px] text-center"
style={{
borderColor: "var(--stroke,#1D293D80)",
backgroundColor: "var(--card-color,#0F172B80)",
}}
>
<p className="text-[64px] font-semibold leading-none text-[#8bb4ff]">{metric.value}</p>
<p className="mt-[13px] text-[26px] text-[#edf1ff]">{metric.label}</p>
<p className="mt-[13px] text-[18px] text-[#8fa2d8]">{metric.period}</p>
<p className="text-[64px] font-semibold leading-none" style={{ color: "var(--graph-0,#8bb4ff)" }}>{metric.value}</p>
<p className="mt-[13px] text-[26px]" style={{ color: "var(--background-text,#edf1ff)" }}>{metric.label}</p>
<p className="mt-[13px] text-[18px]" style={{ color: "var(--background-text,#8fa2d8)" }}>{metric.period}</p>
</div>
))}
</div>
</div>
<div className="absolute bottom-[26px] left-1/2 -translate-x-1/2 rounded-full border border-[#31415880] bg-[#1D293DCC] px-[22px] py-[8px] text-[14px] text-[#CAD5E2]">
{slideData.pageLabel}
<div
className="absolute bottom-[26px] 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>
);

View file

@ -46,27 +46,46 @@ export type SchemaType = z.infer<typeof Schema>;
const CodeSlide11MetricsGrid = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] border border-[#243272] bg-[#101B37] p-[40px] text-[#edf1ff]">
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] border p-[40px]"
style={{
borderColor: "var(--stroke,#243272)",
backgroundColor: "var(--background-color,#101B37)",
color: "var(--background-text,#edf1ff)",
fontFamily: "var(--body-font-family,Nunito Sans)",
}}
>
<h2 className="text-[64px] font-medium text-[#ffffff]">{data.title}</h2>
<h2 className="text-[64px] font-medium" style={{ color: "var(--background-text,#ffffff)" }}>{data.title}</h2>
<div className="mt-[53px] grid flex-1 grid-cols-3 gap-[14px]">
{data?.metrics?.map((metric, index) => (
<div
key={`metric-grid-${index}`}
className="rounded-[16px] border border-[#1D293D80] bg-[#0F172B80] pt-[26px] px-[26px] pb-[16px] text-center"
className="rounded-[16px] border pt-[26px] px-[26px] pb-[16px] text-center"
style={{
borderColor: "var(--stroke,#1D293D80)",
backgroundColor: "var(--card-color,#0F172B80)",
}}
>
<p className="text-[64px] font-semibold leading-none text-[#8bb4ff]">{metric.value}</p>
<p className="mt-[13px] text-[26px] text-[#edf1ff]">{metric.label}</p>
<p className="mt-[13px] text-[18px] text-[#8fa2d8]">{metric.period}</p>
<p className="text-[64px] font-semibold leading-none" style={{ color: "var(--graph-0,#8bb4ff)" }}>{metric.value}</p>
<p className="mt-[13px] text-[26px]" style={{ color: "var(--background-text,#edf1ff)" }}>{metric.label}</p>
<p className="mt-[13px] text-[18px]" style={{ color: "var(--background-text,#8fa2d8)" }}>{metric.period}</p>
</div>
))}
</div>
<div className="absolute bottom-[26px] left-1/2 -translate-x-1/2 rounded-full border border-[#31415880] bg-[#1D293DCC] px-[22px] py-[8px] text-[14px] text-[#CAD5E2]">
<div
className="absolute bottom-[26px] 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>

View file

@ -56,16 +56,22 @@ const EducationAboutSlide = ({ data }: { data: Partial<SchemaType> }) => {
return (<>
<link href="https://fonts.googleapis.com/css2?family=Corben:wght@400;700&family=Playfair+Display:ital,wght@0,400..900;1,400..900&display=swap" rel="stylesheet" />
<div className="relative h-[720px] w-[1280px] overflow-hidden bg-[#efeff1]">
<div
className="relative h-[720px] w-[1280px] overflow-hidden"
style={{
backgroundColor: "var(--background-color,#efeff1)",
fontFamily: "var(--body-font-family,'Times New Roman')",
}}
>
<div className="grid items-end grid-cols-[1fr_1fr]">
<div className="px-[53px] pb-[56px] ">
<h2 className="font-serif text-[64px] leading-[98%] tracking-[-0.02em] text-[#101C3D]">
<h2 className="font-serif text-[64px] leading-[98%] tracking-[-0.02em]" style={{ color: "var(--primary-color,#101C3D)" }}>
{data.companyName}
</h2>
<p className="mt-[30px] max-w-[610px] text-[22px] font-semibold leading-[1.24] text-[#34394C]">
<p className="mt-[30px] max-w-[610px] text-[22px] font-semibold leading-[1.24]" style={{ color: "var(--background-text,#34394C)" }}>
{data.intro}
</p>
<p className="mt-[18px] max-w-[620px] text-[22px] leading-[1.28] text-[#46474C]">
<p className="mt-[18px] max-w-[620px] text-[22px] leading-[1.28]" style={{ color: "var(--background-text,#46474C)" }}>
{data.body}
</p>
</div>
@ -77,8 +83,15 @@ const EducationAboutSlide = ({ data }: { data: Partial<SchemaType> }) => {
alt={data.topFeatureImage?.__image_prompt__}
className="absolute inset-0 h-full w-full object-cover z-1 "
/>
<div className=" w-1/2 bg-[#28256f]/60 z-10 flex justify-center items-center">
<p className=" text-[24px] leading-[1.22] text-[#f5f7ff] px-[42px]">
<div className="w-1/2 z-10 flex justify-center items-center relative">
<div
className="absolute inset-0"
style={{
backgroundColor: "var(--primary-color,#28256f)",
opacity: 0.6,
}}
/>
<p className="relative z-10 text-[24px] leading-[1.22] px-[42px]" style={{ color: "var(--primary-text,#f5f7ff)" }}>
{data.topPanelText}
</p>
</div>
@ -96,8 +109,15 @@ const EducationAboutSlide = ({ data }: { data: Partial<SchemaType> }) => {
<div className=" w-1/2 ">
</div>
<div className=" w-1/2 bg-[#28256f]/60 z-10 flex justify-center items-center">
<p className=" text-[24px] leading-[1.22] text-[#f5f7ff] px-[42px]">
<div className="w-1/2 z-10 flex justify-center items-center relative">
<div
className="absolute inset-0"
style={{
backgroundColor: "var(--primary-color,#28256f)",
opacity: 0.6,
}}
/>
<p className="relative z-10 text-[24px] leading-[1.22] px-[42px]" style={{ color: "var(--primary-text,#f5f7ff)" }}>
{data.bottomPanelText}
</p>
</div>

View file

@ -84,17 +84,17 @@ type PieLabelProps = {
};
const DEFAULT_COLORS = [
"#4A15A8",
"#5B45AD",
"#7E6CC0",
"#9F94CD",
"#6A31B8",
"#4D2A97",
"var(--graph-0,#4A15A8)",
"var(--graph-1,#5B45AD)",
"var(--graph-2,#7E6CC0)",
"var(--graph-3,#9F94CD)",
"var(--graph-4,#6A31B8)",
"var(--graph-5,#4D2A97)",
];
const AXIS = "#7C7A83";
const GRID = "#CFCBD8";
const PRIMARY_TEXT = "#3E3C45";
const AXIS = "var(--background-text,#7C7A83)";
const GRID = "var(--stroke,#CFCBD8)";
const PRIMARY_TEXT = "var(--background-text,#3E3C45)";
function formatComma(value: number | string) {
if (typeof value === "number") {
@ -201,7 +201,7 @@ const renderPieInsideLabel = (props: any) => {
y={y}
textAnchor="middle"
dominantBaseline="central"
fill="#ffffff"
fill="var(--primary-text,#ffffff)"
fontSize={fontSize}
fontWeight={600}
style={{
@ -247,10 +247,16 @@ function CustomTooltip({ active, payload, label }: TooltipProps) {
}
return (
<div className="rounded-[8px] border border-[#ddd9e8] bg-[#f7f6fa] px-[10px] py-[8px]">
<p className="text-[11px] font-semibold text-[#3f3d47]">{label}</p>
<div
className="rounded-[8px] border px-[10px] py-[8px]"
style={{
borderColor: "var(--stroke,#ddd9e8)",
backgroundColor: "var(--card-color,#f7f6fa)",
}}
>
<p className="text-[11px] font-semibold" style={{ color: "var(--background-text,#3f3d47)" }}>{label}</p>
{payload.map((entry, index) => (
<p key={`${entry.name ?? "value"}-${index}`} className="text-[10px] text-[#5d5b67]">
<p key={`${entry.name ?? "value"}-${index}`} className="text-[10px]" style={{ color: "var(--background-text,#5d5b67)" }}>
{entry.name ?? entry.dataKey}: {String(entry.value)}
</p>
))}
@ -268,7 +274,7 @@ function renderPieLabel({ name, percent = 0, x = 0, y = 0, textAnchor = "middle"
}
return (
<text x={x} y={y} textAnchor={textAnchor} fill={AXIS} fontSize={10} fontFamily="serif">
<text x={x} y={y} textAnchor={textAnchor} fill={AXIS} fontSize={10} fontFamily="var(--body-font-family,'Times New Roman')">
{`${name ?? ""} ${(percent * 100).toFixed(0)}%`}
</text>
);
@ -298,7 +304,7 @@ export default function EducationChartPrimitives({
divergingLabels: [string, string];
}) {
const axisProps = {
tick: { fill: AXIS, fontSize: 12, fontFamily: "serif" },
tick: { fill: AXIS, fontSize: 12, fontFamily: "var(--body-font-family,'Times New Roman')" },
axisLine: { stroke: GRID },
tickLine: { stroke: GRID },
} as const;

View file

@ -36,7 +36,13 @@ const EducationContentSplitSlide = ({ data }: { data: Partial<SchemaType> }) =>
const { heading, tagline, body, collageImage } = data;
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden bg-[#E6E7E8]">
<div
className="relative h-[720px] w-[1280px] overflow-hidden"
style={{
backgroundColor: "var(--background-color,#E6E7E8)",
fontFamily: "var(--body-font-family,'Times New Roman')",
}}
>
<div className="w-full flex items-center h-full">
<div className="w-[660px] h-full">
<div className="h-[394px] w-full mb-[6px]">
@ -61,11 +67,11 @@ const EducationContentSplitSlide = ({ data }: { data: Partial<SchemaType> }) =>
</div>
<div className="w-1/2 px-[56px]">
<h2 className="text-[24px] font-medium leading-none text-[#34394C]">{data.heading}</h2>
<p className=" text-[14px] font-medium mt-1 leading-none tracking-[0.04em] text-[#454962]">
{data.tagline}
<h2 className="text-[24px] font-medium leading-none" style={{ color: "var(--background-text,#34394C)" }}>{heading}</h2>
<p className=" text-[14px] font-medium mt-1 leading-none tracking-[0.04em]" style={{ color: "var(--background-text,#454962)" }}>
{tagline}
</p>
<p className="mt-[18px] text-[22px] leading-[1.28] text-[#34394C]">{body}</p>
<p className="mt-[18px] text-[22px] leading-[1.28]" style={{ color: "var(--background-text,#34394C)" }}>{body}</p>
</div>
</div>
</div>

View file

@ -31,18 +31,33 @@ const EducationCoverSlide = ({ data }: { data: Partial<SchemaType> }) => {
const { companyName, title, backgroundImage } = data;
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden bg-[#2e0a8a]">
<div
className="relative h-[720px] w-[1280px] overflow-hidden"
style={{
backgroundColor: "var(--background-color,#2e0a8a)",
fontFamily: "var(--body-font-family,'Times New Roman')",
}}
>
<img
src={backgroundImage?.__image_url__}
alt={backgroundImage?.__image_prompt__}
className="absolute inset-0 h-full w-full object-cover"
/>
<div className="absolute inset-0 bg-[#3b0bb6]/85" />
<div
className="absolute inset-0"
style={{
backgroundColor: "var(--primary-color,#3b0bb6)",
opacity: 0.85,
}}
/>
<div className="relative z-10 flex h-full flex-col items-center justify-center text-center text-white">
<p className="text-[22px] font-normal uppercase tracking-[0.64px]">{data.companyName}</p>
<div
className="relative z-10 flex h-full flex-col items-center justify-center text-center"
style={{ color: "var(--primary-text,#ffffff)" }}
>
<p className="text-[22px] font-normal uppercase tracking-[0.64px]">{companyName}</p>
<h1 className="mt-[12px] px-[53px] text-[64px] font-medium leading-[98%]">
{title}
</h1>

View file

@ -33,7 +33,13 @@ const EducationImageGallerySlide = ({ data }: { data: Partial<SchemaType> }) =>
const { title, body, galleryImages } = data;
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden bg-[#E6E7E8]">
<div
className="relative h-[720px] w-[1280px] overflow-hidden"
style={{
backgroundColor: "var(--background-color,#E6E7E8)",
fontFamily: "var(--body-font-family,'Times New Roman')",
}}
>
<div className="grid h-full items-end grid-cols-[590px_1fr]">
<div className="grid h-full grid-cols-2 grid-rows-[245px_245px_230px] gap-[2px]">
<img
@ -64,10 +70,10 @@ const EducationImageGallerySlide = ({ data }: { data: Partial<SchemaType> }) =>
</div>
<div className="px-[64px] pb-[56px] ">
<h2 className="font-serif text-[64px] font-medium leading-[98%] text-[#101C3D]">
<h2 className="font-serif text-[64px] font-medium leading-[98%]" style={{ color: "var(--primary-color,#101C3D)" }}>
{title}
</h2>
<p className="mt-[37px] text-[22px] text-[#34394C]">
<p className="mt-[37px] text-[22px]" style={{ color: "var(--background-text,#34394C)" }}>
{body}
</p>
</div>

View file

@ -90,7 +90,7 @@ export const Schema = z.object({
dateRange: z.string().min(8).max(22).default("Apr 10 - Apr 17").meta({
description: "Right-panel date range label.",
}),
chartType: ChartTypeSchema.default("area").meta({
chartType: ChartTypeSchema.default("bar").meta({
description:
"Chart type selector. Supports bar, grouped, stacked, clustered, diverging, line, area, pie/donut, and scatter.",
}),
@ -131,33 +131,39 @@ export type SchemaType = z.infer<typeof Schema>;
const EducationReportChartSlide = ({ data }: { data: Partial<SchemaType> }) => {
const slideData = Schema.parse(data);
const slideData = data;
const chartHeightClass = slideData.showStatusMessage ? "h-[372px]" : "h-[486px]";
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden bg-[#efeff1]">
<div
className="relative h-[720px] w-[1280px] overflow-hidden"
style={{
backgroundColor: "var(--background-color,#efeff1)",
fontFamily: "var(--body-font-family,'Times New Roman')",
}}
>
<div className="grid h-full grid-cols-[1fr_560px] items-center ">
<div className="px-[52px] pb-[46px] mt-[111px] ">
<div className="text-start">
<h2 className=" text-[64px] font-medium leading-[98%] text-[#101C3D] ">
<h2 className=" text-[64px] font-medium leading-[98%]" style={{ color: "var(--primary-color,#101C3D)" }}>
{slideData.title}
</h2>
<p className=" mt-[38px] max-w-[610px] text-[22px] leading-[1.22] text-[#3E3F4A] ">
<p className=" mt-[38px] max-w-[610px] text-[22px] leading-[1.22]" style={{ color: "var(--background-text,#3E3F4A)" }}>
{slideData.body}
</p>
</div>
<p className="max-w-[610px] mt-[96px] text-[18px] leading-[1.22] text-[#4E4F57] ">
<p className="max-w-[610px] mt-[96px] text-[18px] leading-[1.22]" style={{ color: "var(--background-text,#4E4F57)" }}>
{slideData.footnote}
</p>
</div>
<div className="bg-[#eceaf0] px-[42px] h-full flex flex-col justify-center ">
<h3 className="text-center text-[24px] font-semibold leading-none text-[#33313A] ">
<div className="px-[42px] h-full flex flex-col justify-center" style={{ backgroundColor: "var(--card-color,#eceaf0)" }}>
<h3 className="text-center text-[24px] font-semibold leading-none" style={{ color: "var(--background-text,#33313A)" }}>
{slideData.chartTitle}
</h3>
<p className="mt-1 text-center pb-6 text-[18px] leading-none text-[#4D4B55] ">
<p className="mt-1 text-center pb-6 text-[18px] leading-none" style={{ color: "var(--background-text,#4D4B55)" }}>
{slideData.dateRange}
</p>
@ -165,9 +171,9 @@ const EducationReportChartSlide = ({ data }: { data: Partial<SchemaType> }) => {
<EducationChartPrimitives
chartType={slideData.chartType as EducationChartType}
chartData={slideData.chartData as EducationChartDatum[]}
series={slideData.series}
showLegend={slideData.showLegend}
divergingLabels={slideData.divergingLabels}
series={slideData.series || []}
showLegend={slideData.showLegend || false}
divergingLabels={slideData.divergingLabels || ['', '']}
showTooltip={true}
/>
</div>

View file

@ -23,7 +23,7 @@ const ServiceSchema = z.object({
tagline: z.string().min(3).max(12).meta({
description: "Short label under each service heading.",
}),
body: z.string().min(40).max(90).meta({
body: z.string().max(40).meta({
description: "Service description paragraph.",
}),
});
@ -91,10 +91,16 @@ const EducationServicesSplitSlide = ({ data }: { data: Partial<SchemaType> }) =>
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden bg-[#E6E7E8]">
<div
className="relative h-[720px] w-[1280px] overflow-hidden"
style={{
backgroundColor: "var(--background-color,#E6E7E8)",
fontFamily: "var(--body-font-family,'Times New Roman')",
}}
>
<div className="grid h-full grid-cols-[365px_1fr]">
<div className="px-[53px] pt-[53px]">
<h2 className="font-serif text-[64px] leading-[98%] tracking-[-0.02em] text-[#1a1752]">
<h2 className="font-serif text-[64px] leading-[98%] tracking-[-0.02em]" style={{ color: "var(--primary-color,#1a1752)" }}>
{title}
</h2>
</div>
@ -109,7 +115,10 @@ const EducationServicesSplitSlide = ({ data }: { data: Partial<SchemaType> }) =>
{sections?.map((section, index) => (
<div key={`${section.heading}-${index}`} className=" flex items-center"
style={{
borderBottom: index !== (sections?.length ?? 1) - 1 ? "5px solid rgba(255, 255, 255, 0.10)" : "none",
borderBottom:
index !== (sections?.length ?? 1) - 1
? "5px solid var(--stroke,rgba(255, 255, 255, 0.10))"
: "none",
}}
>
<div className=" min-w-[316px] max-w-[316px] "
@ -127,11 +136,11 @@ const EducationServicesSplitSlide = ({ data }: { data: Partial<SchemaType> }) =>
<div
className={`px-[56px] `}
>
<h3 className="text-[24px] font-medium leading-none text-[#34394C]">{section.heading}</h3>
<p className="mt-[10px] text-[14px] font-medium uppercase leading-none text-[#454962]">
<h3 className="text-[24px] font-medium leading-none" style={{ color: "var(--background-text,#34394C)" }}>{section.heading}</h3>
<p className="mt-[10px] text-[14px] font-medium uppercase leading-none" style={{ color: "var(--background-text,#454962)" }}>
{section.tagline}
</p>
<p className="mt-[18px] text-[22px] leading-[1.26] text-[#34394C] tracking-[0.04em]">
<p className="mt-[18px] text-[22px] leading-[1.26] tracking-[0.04em]" style={{ color: "var(--background-text,#34394C)" }}>
{section.body}
</p>
</div>

View file

@ -51,16 +51,22 @@ const EducationStatisticsGridSlide = ({ data }: { data: Partial<SchemaType> }) =
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden bg-[#efeff1]">
<div
className="relative h-[720px] w-[1280px] overflow-hidden"
style={{
backgroundColor: "var(--background-color,#efeff1)",
fontFamily: "var(--body-font-family,'Times New Roman')",
}}
>
<div className="relative z-10 grid h-full grid-cols-[490px_1fr]">
<div className="bg-[#f1efef] px-[44px] pb-[78px] pt-[96px]">
<div className="px-[44px] pb-[78px] pt-[96px]" style={{ backgroundColor: "var(--card-color,#f1efef)" }}>
<div className="flex h-full flex-col justify-end">
<h2 className="font-serif text-[64px] leading-[98%] tracking-[-0.02em] text-[#1a1752]">
<h2 className="font-serif text-[64px] leading-[98%] tracking-[-0.02em]" style={{ color: "var(--primary-color,#1a1752)" }}>
{data.title}
</h2>
<p className="mt-[40px] max-w-[330px] text-[22px] leading-[1.24] text-[#34394C]">
<p className="mt-[40px] max-w-[330px] text-[22px] leading-[1.24]" style={{ color: "var(--background-text,#34394C)" }}>
{data.description}
</p>
</div>
@ -71,12 +77,12 @@ const EducationStatisticsGridSlide = ({ data }: { data: Partial<SchemaType> }) =
<div
key={`${stat.value}-${index}`}
className="px-[52px] pt-[22px]"
style={{ backgroundColor: index % 2 === 1 ? '#5C0FD908' : 'white' }}
style={{ backgroundColor: index % 2 === 1 ? 'var(--card-color,#5C0FD908)' : 'var(--card-color,white)' }}
>
<p className="font-serif text-[58px] leading-[56px] text-[#434A63]">
<p className="font-serif text-[58px] leading-[56px]" style={{ color: "var(--background-text,#434A63)" }}>
{stat?.value}
</p>
<p className="mt-[12px] text-[24px] text-[#434A63]">
<p className="mt-[12px] text-[24px]" style={{ color: "var(--background-text,#434A63)" }}>
{stat?.label}
</p>
</div>
@ -88,12 +94,12 @@ const EducationStatisticsGridSlide = ({ data }: { data: Partial<SchemaType> }) =
<div
key={`${stat.value}-${index}`}
className="px-[52px] pt-[22px]"
style={{ backgroundColor: index % 2 === 1 ? '#5C0FD908' : 'white' }}
style={{ backgroundColor: index % 2 === 1 ? 'var(--card-color,#5C0FD908)' : 'var(--card-color,white)' }}
>
<p className="font-serif text-[58px] leading-[56px] text-[#283E51]">
<p className="font-serif text-[58px] leading-[56px]" style={{ color: "var(--background-text,#283E51)" }}>
{stat.value}
</p>
<p className="mt-[12px] text-[24px] text-[#434A63]">
<p className="mt-[12px] text-[24px]" style={{ color: "var(--background-text,#434A63)" }}>
{stat.label}
</p>
</div>
@ -112,12 +118,12 @@ const EducationStatisticsGridSlide = ({ data }: { data: Partial<SchemaType> }) =
<div
key={`${stat?.value}-${index}`}
className="px-[52px] pt-[22px] h-full"
style={{ backgroundColor: index % 2 === 0 ? '#5C0FD908' : 'white' }}
style={{ backgroundColor: index % 2 === 0 ? 'var(--card-color,#5C0FD908)' : 'var(--card-color,white)' }}
>
<p className="font-serif text-[58px] leading-[56px] text-[#283E51]">
<p className="font-serif text-[58px] leading-[56px]" style={{ color: "var(--background-text,#283E51)" }}>
{stat?.value}
</p>
<p className="mt-[12px] text-[24px] text-[#434A63]">
<p className="mt-[12px] text-[24px]" style={{ color: "var(--background-text,#434A63)" }}>
{stat?.label}
</p>
</div>
@ -131,12 +137,12 @@ const EducationStatisticsGridSlide = ({ data }: { data: Partial<SchemaType> }) =
<div
key={`${stat.value}-${index}`}
className="px-[52px] pt-[22px] h-full"
style={{ backgroundColor: index % 2 === 1 ? '#5C0FD908' : 'white' }}
style={{ backgroundColor: index % 2 === 1 ? 'var(--card-color,#5C0FD908)' : 'var(--card-color,white)' }}
>
<p className="font-serif text-[58px] leading-[56px] text-[#283E51]">
<p className="font-serif text-[58px] leading-[56px]" style={{ color: "var(--background-text,#283E51)" }}>
{stat.value}
</p>
<p className="mt-[12px] text-[24px] text-[#434A63]">
<p className="mt-[12px] text-[24px]" style={{ color: "var(--background-text,#434A63)" }}>
{stat.label}
</p>
</div>

View file

@ -47,26 +47,32 @@ export type SchemaType = z.infer<typeof Schema>;
const EducationTableOfContentsSlide = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden bg-[#efeff1]">
<div
className="relative h-[720px] w-[1280px] overflow-hidden"
style={{
backgroundColor: "var(--background-color,#efeff1)",
fontFamily: "var(--body-font-family,'Times New Roman')",
}}
>
<div className="relative z-10 grid h-full grid-cols-[430px_1fr]">
<div className="bg-[#f1efef] px-[56px] pt-[74px]">
<h2 className="font-serif text-[64px] leading-[98%] tracking-[-0.02em] text-[#1a1752]">
<div className="px-[56px] pt-[74px]" style={{ backgroundColor: "var(--card-color,#f1efef)" }}>
<h2 className="font-serif text-[64px] leading-[98%] tracking-[-0.02em]" style={{ color: "var(--primary-color,#1a1752)" }}>
{data.titleLine1}
<br />
{data.titleLine2}
</h2>
</div>
<div className="px-[88px] pt-[84px] bg-[#FFFFFF80]">
<div className="px-[88px] pt-[84px]" style={{ backgroundColor: "var(--card-color,#FFFFFF80)" }}>
<div className="space-y-[32px]">
{data.items?.map((item, index) => (
<div key={`${item.number}-${item.label}-${index}`} className="flex items-center gap-[16px]">
<span className="w-[42px] text-[20px] font-semibold leading-none text-[#3f414a]">
<span className="w-[42px] text-[20px] font-semibold leading-none" style={{ color: "var(--background-text,#3f414a)" }}>
{item.number}
</span>
<span className="text-[24px] font-medium leading-none text-[#3f414a]">
<span className="text-[24px] font-medium leading-none" style={{ color: "var(--background-text,#3f414a)" }}>
{item.label}
</span>
</div>

View file

@ -49,9 +49,15 @@ const EducationTimelineSlide = ({ data }: { data: Partial<SchemaType> }) => {
const isSixOrLess = milestones?.length && milestones?.length <= 6;
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden bg-[#efeff1]">
<div
className="relative h-[720px] w-[1280px] overflow-hidden"
style={{
backgroundColor: "var(--background-color,#efeff1)",
fontFamily: "var(--body-font-family,'Times New Roman')",
}}
>
<div className="relative z-10 px-[56px] pt-[86px]">
<h2 className="font-serif text-[84px] leading-none tracking-[-0.02em] text-[#1a1752]">
<h2 className="font-serif text-[84px] leading-none tracking-[-0.02em]" style={{ color: "var(--primary-color,#1a1752)" }}>
{title}
</h2>
</div>
@ -82,13 +88,13 @@ function TimelineUpToSix({
<div key={`${milestone.year}-${index}`} className="">
<div className="flex items-center ">
<div className="h-[22px] z-10 relative w-[22px] rounded-full bg-[#272272]" />
{index !== milestones.length - 1 && <div className="h-[3px] bg-[#d8d8dd] flex-1" />}
<div className="h-[22px] z-10 relative w-[22px] rounded-full" style={{ backgroundColor: "var(--primary-color,#272272)" }} />
{index !== milestones.length - 1 && <div className="h-[3px] flex-1" style={{ backgroundColor: "var(--stroke,#d8d8dd)" }} />}
</div>
<p className="mt-[18px] text-[20px] font-medium leading-none text-[#3c3f4b]">
<p className="mt-[18px] text-[20px] font-medium leading-none" style={{ color: "var(--background-text,#3c3f4b)" }}>
{milestone.year}
</p>
<p className=" text-[18px] leading-[1.2] text-[#3a3d4c]">
<p className=" text-[18px] leading-[1.2]" style={{ color: "var(--background-text,#3a3d4c)" }}>
{milestone.description}
</p>
</div>
@ -114,10 +120,10 @@ function TimelineMoreThanSix({
<mask id="path-1-inside-1_220_636" fill="white">
<path d="M0 0H128C133.891 0 138.667 4.77563 138.667 10.6667V220C138.667 225.891 133.891 230.667 128 230.667H0V0Z" />
</mask>
<path d="M0 -2.66667H128C135.364 -2.66667 141.333 3.30287 141.333 10.6667H136C136 6.24839 132.418 2.66667 128 2.66667H0V-2.66667ZM141.333 220C141.333 227.364 135.364 233.333 128 233.333H0V228H128C132.418 228 136 224.418 136 220H141.333ZM136 220M0 230.667V0V230.667M128 -2.66667C135.364 -2.66667 141.333 3.30287 141.333 10.6667V220C141.333 227.364 135.364 233.333 128 233.333V228C132.418 228 136 224.418 136 220V10.6667C136 6.24839 132.418 2.66667 128 2.66667V-2.66667Z" fill="#101C3D" fillOpacity="0.1" mask="url(#path-1-inside-1_220_636)" />
<path d="M0 -2.66667H128C135.364 -2.66667 141.333 3.30287 141.333 10.6667H136C136 6.24839 132.418 2.66667 128 2.66667H0V-2.66667ZM141.333 220C141.333 227.364 135.364 233.333 128 233.333H0V228H128C132.418 228 136 224.418 136 220H141.333ZM136 220M0 230.667V0V230.667M128 -2.66667C135.364 -2.66667 141.333 3.30287 141.333 10.6667V220C141.333 227.364 135.364 233.333 128 233.333V228C132.418 228 136 224.418 136 220V10.6667C136 6.24839 132.418 2.66667 128 2.66667V-2.66667Z" fill="var(--primary-color,#101C3D)" fillOpacity="0.1" mask="url(#path-1-inside-1_220_636)" />
</svg>
{/* bottom horizontal line */}
{/* <div className="absolute z-[-1] right-[110px] top-[220px] w-[150px] h-[3px] bg-[#d8d8dd]" /> */}
{/* <div className="absolute z-[-1] right-[110px] top-[220px] w-[150px] h-[3px]" style={{ backgroundColor: "var(--stroke,#d8d8dd)" }} /> */}
<div className="relative z-10 px-[56px]">
<div
className="grid "
@ -127,15 +133,15 @@ function TimelineMoreThanSix({
<div key={`${milestone.year}-${index}`} className="">
<div className="flex items-center ">
<div className="h-[22px] z-10 relative w-[22px] rounded-full bg-[#272272]" />
{index !== milestones.length - 1 && <div className="h-[3px] bg-[#d8d8dd] flex-1" />}
<div className="h-[22px] z-10 relative w-[22px] rounded-full" style={{ backgroundColor: "var(--primary-color,#272272)" }} />
{index !== milestones.length - 1 && <div className="h-[3px] flex-1" style={{ backgroundColor: "var(--stroke,#d8d8dd)" }} />}
</div>
<div className="pr-2 mt-[18px]">
<p className=" text-[20px] font-medium leading-none text-[#3c3f4b]">
<p className=" text-[20px] font-medium leading-none" style={{ color: "var(--background-text,#3c3f4b)" }}>
{milestone.year}
</p>
<p className="mt-2 text-[18px] leading-[1.2] text-[#3a3d4c]">
<p className="mt-2 text-[18px] leading-[1.2]" style={{ color: "var(--background-text,#3a3d4c)" }}>
{milestone.description}
</p>
</div>
@ -147,7 +153,7 @@ function TimelineMoreThanSix({
{/* bottom row */}
<div
className="mt-[75px] grid items-end px-[56px] pr-[180px] "
className="mt-[95px] grid items-end px-[56px] pr-[180px] "
style={{ gridTemplateColumns: `repeat(${bottomItems.length}, minmax(0, 1fr))` }}
>
@ -158,16 +164,16 @@ function TimelineMoreThanSix({
return (
<div key={`${item.year}-${colIndex + 8}`} className="flex flex-col items-end">
<div className="flex w-full items-center ">
{/* {colIndex === 0 && <div className="absolute h-[3px] flex-1 bg-[#d8d8dd]" />} */}
{true && <div className={` h-[3px] flex-1 ${colIndex === 0 ? '' : 'bg-[#d8d8dd]'}`} />}
<div className="h-[22px] z-10 relative w-[22px] rounded-full bg-[#272272]" />
{/* {colIndex === 0 && <div className="absolute h-[3px] flex-1" style={{ backgroundColor: "var(--stroke,#d8d8dd)" }} />} */}
<div className="h-[3px] flex-1" style={{ backgroundColor: colIndex === 0 ? "transparent" : "var(--stroke,#d8d8dd)" }} />
<div className="h-[22px] z-10 relative w-[22px] rounded-full" style={{ backgroundColor: "var(--primary-color,#272272)" }} />
</div>
<div className="pl-2 mt-[18px]">
<p className=" text-right text-[20px] font-medium leading-none text-[#3c3f4b]">
<p className=" text-right text-[20px] font-medium leading-none" style={{ color: "var(--background-text,#3c3f4b)" }}>
{item.year}
</p>
<p className="mt-2 text-[18px] text-right leading-[1.2] text-[#3a3d4c]">
<p className="mt-2 text-[18px] text-right leading-[1.2]" style={{ color: "var(--background-text,#3a3d4c)" }}>
{item.description}
</p>
</div>

View file

@ -11,7 +11,7 @@ const CardSchema = z.object({
heading: z.string().min(4).max(12).meta({
description: "Card heading for one challenge column.",
}),
body: z.string().min(30).max(60).meta({
body: z.string().max(40).meta({
description: "Card body copy for one challenge column.",
}),
dark: z.boolean().default(false).meta({
@ -26,7 +26,7 @@ export const Schema = z.object({
taglineLabel: z.string().min(3).max(10).default("TAGLINE").meta({
description: "Short label above the left-side paragraph.",
}),
taglineBody: z.string().min(40).max(100).default(
taglineBody: z.string().max(80).default(
"Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea."
).meta({
description: "Supporting paragraph on the left side.",
@ -43,7 +43,7 @@ export const Schema = z.object({
}),
cards: z
.array(CardSchema)
.min(3)
.max(3)
.default([
{
@ -75,12 +75,15 @@ const BusinessChallengesCardsSlide = ({ data }: { data: Partial<SchemaType> }) =
return (
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px]"
style={{ backgroundColor: "#DAE1DE" }}
style={{
backgroundColor: "var(--background-color,#DAE1DE)",
fontFamily: "var(--body-font-family,'Bricolage Grotesque')",
}}
>
<div className=" pl-[66px] pt-[60px] pb-[28px]">
<h2
className="text-[80px] max-w-[406px] font-semibold leading-[108.4%] tracking-[-2.419px] text-[#15342D]"
style={{ color: "#15342D" }}
style={{ color: "var(--primary-color,#15342D)" }}
>
{title}
</h2>
@ -88,11 +91,16 @@ const BusinessChallengesCardsSlide = ({ data }: { data: Partial<SchemaType> }) =
<div className="mt-[72px] w-[360px]">
<p
className="text-[20px] font-semibold tracking-[2.074px] text-white"
style={{ color: "#15342D" }}
style={{ color: "var(--primary-color,#15342D)" }}
>
{taglineLabel}
</p>
<p className="mt-[16px] text-[24px] font-normal text-[#15342DCC]">{taglineBody}</p>
<p
className="mt-[16px] text-[24px] font-normal text-[#15342DCC]"
style={{ color: "var(--background-text,#15342DCC)" }}
>
{taglineBody}
</p>
</div>
</div>
@ -109,17 +117,29 @@ const BusinessChallengesCardsSlide = ({ data }: { data: Partial<SchemaType> }) =
<div
key={index}
className=" w-[248px] px-[34px] py-[34px]"
style={{ backgroundColor: card.dark ? "#15342D" : "#ebebee" }}
style={{
backgroundColor: card.dark
? "var(--primary-color,#15342D)"
: "var(--card-color,#ebebee)",
}}
>
<p
className="text-[20px] font-semibold tracking-[2.074px] text-white"
style={{ color: card.dark ? "#edf2f1" : "#15342D" }}
style={{
color: card.dark
? "var(--primary-text,#edf2f1)"
: "var(--primary-color,#15342D)",
}}
>
{card.heading}
</p>
<p
className="mt-[18px] text-[28px] font-normal text-white"
style={{ color: card.dark ? "#edf2f1" : "#15342D" }}
style={{
color: card.dark
? "var(--primary-text,#edf2f1)"
: "var(--primary-color,#15342D)",
}}
>
{card.body}
</p>

View file

@ -9,7 +9,7 @@ const ChallengeSchema = z.object({
heading: z.string().min(4).max(12).meta({
description: "Short heading for a single challenge block.",
}),
body: z.string().min(40).max(96).meta({
body: z.string().max(40).meta({
description: "Description text for a single challenge block.",
}),
});
@ -53,27 +53,38 @@ const BusinessChallengesGridSlide = ({ data }: { data: Partial<SchemaType> }) =>
return (
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px]"
style={{ backgroundColor: "#DAE1DE" }}
style={{
backgroundColor: "var(--background-color,#DAE1DE)",
fontFamily: "var(--body-font-family,'Bricolage Grotesque')",
}}
>
<div className=" px-[60px] pt-[60px] pb-[28px]">
<h2
className="text-[80px] font-semibold leading-[108.4%] tracking-[-2.419px] text-[#15342D]"
style={{ color: "#15342D" }}
style={{ color: "var(--primary-color,#15342D)" }}
>
{title}
</h2>
</div>
<div
className="grid h-[540px] grid-cols-2 justify-between items-center gap-y-[63px] px-[84px] py-[70px] gap-x-[63px]"
style={{ backgroundColor: "#15342D" }}
className="grid grid-cols-2 justify-between items-center gap-y-[63px] px-[84px] py-[70px] gap-x-[63px]"
style={{ backgroundColor: "var(--primary-color,#15342D)" }}
>
{challenges?.map((challenge, index) => (
<div key={index} className="">
<p className="text-[20px] font-semibold tracking-[2.074px] text-white">
<p
className="text-[20px] font-semibold tracking-[2.074px] text-white"
style={{ color: "var(--primary-text,#edf2f1)" }}
>
{challenge.heading}
</p>
<p className="mt-[24px] text-[28px] font-normal text-white">{challenge.body}</p>
<p
className="mt-[24px] text-[28px] font-normal text-white"
style={{ color: "var(--primary-text,#edf2f1)" }}
>
{challenge.body}
</p>
</div>
))}
</div>

View file

@ -19,10 +19,10 @@ const RowSchema = z.object({
});
export const Schema = z.object({
title: z.string().min(8).max(32).default("Comparison Chart").meta({
title: z.string().min(8).max(20).default("Comparison Chart").meta({
description: "Main heading shown above the table.",
}),
subtitle: z.string().min(30).max(140).default(
subtitle: z.string().max(80).default(
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt."
).meta({
description: "Short subtitle shown under the main heading.",
@ -37,7 +37,7 @@ export const Schema = z.object({
}),
rows: z
.array(RowSchema)
.min(3)
.max(3)
.default([
{
@ -119,26 +119,47 @@ const ComparisonChartSlide = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px]"
style={{ backgroundColor: "#DAE1DE" }}
style={{
backgroundColor: "var(--background-color,#DAE1DE)",
fontFamily: "var(--body-font-family,'Bricolage Grotesque')",
}}
>
<div className="px-[56px] pt-[74px]">
<h2
className="text-[80px] font-semibold leading-[108.4%] tracking-[-2.419px] text-[#15342D]"
style={{ color: "#15342D" }}
style={{ color: "var(--primary-color,#15342D)" }}
>
{title}
</h2>
<p className="mt-[20px] w-[740px] text-[24px] font-normal text-[#15342DCC]">{subtitle}</p>
<p
className="mt-[20px] w-[740px] text-[24px] font-normal text-[#15342DCC]"
style={{ color: "var(--background-text,#15342DCC)" }}
>
{subtitle}
</p>
</div>
<div className="absolute left-[54px] top-[268px] w-[1058px] ">
<div className="grid grid-cols-[220px_repeat(4,1fr)] border-b border-[#c5cccb]">
<div
className="grid grid-cols-[220px_repeat(4,1fr)] border-b"
style={{ borderColor: "var(--stroke,#c5cccb)" }}
>
<div className="h-[94px] " />
{columns?.map((column, index) => (
<div
key={index}
className="flex h-[94px] items-center justify-center border-r border-[#c5cccb] text-[20px] font-semibold uppercase tracking-[0.2em]"
style={{ backgroundColor: index === 3 ? "#15342D" : "#ffffff", color: index === 3 ? "#edf2f1" : "#15342D" }}
className="flex h-[94px] items-center justify-center border-r text-[20px] font-semibold uppercase tracking-[0.2em]"
style={{
backgroundColor:
index === 3
? "var(--primary-color,#15342D)"
: "var(--card-color,#ffffff)",
color:
index === 3
? "var(--primary-text,#edf2f1)"
: "var(--primary-color,#15342D)",
borderColor: "var(--stroke,#c5cccb)",
}}
>
{column}
</div>
@ -156,16 +177,28 @@ const ComparisonChartSlide = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div
key={index}
className={`grid grid-cols-[220px_repeat(4,1fr)] ${index < rows.length - 1 ? "border-b border-[#c5cccb]" : ""}`}
className={`grid grid-cols-[220px_repeat(4,1fr)] ${index < rows.length - 1 ? "border-b" : ""}`}
style={{ borderColor: "var(--stroke,#c5cccb)" }}
>
<div className="flex h-[94px] bg-[#ffffff] items-center border-r border-[#c5cccb] pl-[34px] text-[20px] font-semibold uppercase tracking-[0.2em]" style={{ color: "#15342D" }}>
<div
className="flex h-[94px] items-center border-r pl-[34px] text-[20px] font-semibold uppercase tracking-[0.2em]"
style={{
backgroundColor: "var(--card-color,#ffffff)",
borderColor: "var(--stroke,#c5cccb)",
color: "var(--primary-color,#15342D)",
}}
>
{row.label}
</div>
{cells?.map((status, cellIndex) => (
<div
key={cellIndex}
className={`flex h-[94px] items-center justify-center border-r bg-[#ffffff] border-[#c5cccb]`}
className="flex h-[94px] items-center justify-center border-r"
style={{
backgroundColor: "var(--card-color,#ffffff)",
borderColor: "var(--stroke,#c5cccb)",
}}
>
<StatusIcon
status={status}

View file

@ -6,28 +6,27 @@ export const slideLayoutDescription =
"A comparison table slide with a title, a subtitle, four headers, and three text rows.";
const RowSchema = z.object({
cell1: z.string().min(8).max(24).meta({
cell1: z.string().max(12).meta({
description: "First column cell text.",
}),
cell2: z.string().min(8).max(24).meta({
cell2: z.string().max(12).meta({
description: "Second column cell text.",
}),
cell3: z.string().min(8).max(24).meta({
cell3: z.string().max(12).meta({
description: "Third column cell text.",
}),
cell4: z.string().min(8).max(24).meta({
cell4: z.string().max(12).meta({
description: "Fourth column cell text.",
}),
});
export const Schema = z.object({
title: z.string().min(8).max(32).default("Comparison Chart").meta({
title: z.string().min(8).max(20).default("Comparison Chart").meta({
description: "Main heading shown above the table.",
}),
subtitle: z
.string()
.min(30)
.max(100)
.max(80)
.default(
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt."
)
@ -35,8 +34,7 @@ export const Schema = z.object({
description: "Short subtitle shown under the main heading.",
}),
columns: z
.array(z.string().min(4).max(18))
.min(4)
.array(z.string().max(10))
.max(4)
.default(["HEADING 1", "HEADING 1", "HEADING 2", "HEADING 3"])
.meta({
@ -80,29 +78,52 @@ const ComparisonTableWithTextSlide = ({ data }: { data: Partial<SchemaType> }) =
const { title, subtitle, columns, highlightedHeaderIndex, rows } = data;
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#c3cccc]">
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px]"
style={{
backgroundColor: "var(--background-color,#c3cccc)",
fontFamily: "var(--body-font-family,'Bricolage Grotesque')",
}}
>
<div className="px-[44px] pt-[46px]">
<h2 className="text-[80px] font-semibold leading-[1.02] tracking-[-0.03em] text-[#0a443b]">
<h2
className="text-[80px] font-semibold leading-[1.02] tracking-[-0.03em] text-[#0a443b]"
style={{ color: "var(--primary-color,#0a443b)" }}
>
{title}
</h2>
<p className="mt-[22px] max-w-[700px] text-[24px] leading-[1.22] text-[#2d5d56]">
<p
className="mt-[22px] max-w-[700px] text-[24px] leading-[1.22] text-[#2d5d56]"
style={{ color: "var(--background-text,#2d5d56)" }}
>
{subtitle}
</p>
</div>
<div className="mx-[44px] mt-[30px] overflow-hidden border border-[#bcc3c3]">
<table className="w-full table-fixed border-collapse bg-[#ffffff]">
<thead>
<tr>
<div
className="mx-[44px] mt-[30px] overflow-hidden border"
style={{ borderColor: "var(--stroke,#bcc3c3)" }}
>
<table
className="w-full table-fixed border-collapse"
style={{ backgroundColor: "var(--card-color,#ffffff)" }}
>
<thead className="w-full">
<tr className="w-full">
{columns?.map((column, index) => {
const isHighlighted = index + 1 === highlightedHeaderIndex;
return (
<th
key={`${column}-${index}`}
className=" border-r border-[#bcc3c3] p-[33px] text-left text-[20px] font-semibold uppercase tracking-[0.16em] last:border-r-0"
className=" border-r p-[33px] text-left text-[20px] font-semibold uppercase tracking-[0.16em] last:border-r-0"
style={{
backgroundColor: isHighlighted ? "#05443a" : "#ffffff",
color: isHighlighted ? "#eef2f0" : "#123f38",
borderColor: "var(--stroke,#bcc3c3)",
backgroundColor: isHighlighted
? "var(--primary-color,#05443a)"
: "var(--card-color,#ffffff)",
color: isHighlighted
? "var(--primary-text,#eef2f0)"
: "var(--primary-color,#123f38)",
}}
>
{column}
@ -115,12 +136,23 @@ const ComparisonTableWithTextSlide = ({ data }: { data: Partial<SchemaType> }) =
<tbody>
{rows?.map((row, rowIndex) => {
const cells = [row.cell1, row.cell2, row.cell3, row.cell4];
const isHighlighted = rowIndex + 1 === highlightedHeaderIndex;
return (
<tr key={`row-${rowIndex}`}>
{cells?.map((cell, cellIndex) => (
<td
key={`cell-${rowIndex}-${cellIndex}`}
className=" border-r border-t bg-white border-[#bcc3c3] p-[33px] text-left text-[18px] leading-[1.2] text-[#183f38] last:border-r-0"
className=" border-r border-t bg-white p-[33px] text-left text-[18px] leading-[1.2] last:border-r-0"
style={{
borderColor: "var(--stroke,#bcc3c3)",
backgroundColor: isHighlighted
? "var(--primary-color,#05443a)"
: "var(--card-color,#ffffff)",
color: isHighlighted
? "var(--primary-text,#eef2f0)"
: "var(--primary-color,#123f38)",
}}
>
{cell}
</td>

View file

@ -44,9 +44,15 @@ const CoverSlide = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px]"
style={{ backgroundColor: "#DAE1DE" }}
style={{
backgroundColor: "var(--background-color,#DAE1DE)",
fontFamily: "var(--body-font-family,'Bricolage Grotesque')",
}}
>
<div className="relative z-20 flex h-full flex-col px-[36px] pt-[62px] text-[#15342D]">
<div
className="relative z-20 flex h-full flex-col px-[36px] pt-[62px] text-[#15342D]"
style={{ color: "var(--primary-color,#15342D)" }}
>
<div className="flex items-center justify-between">
<img
@ -55,7 +61,10 @@ const CoverSlide = ({ data }: { data: Partial<SchemaType> }) => {
className="h-[42px] w-[171px] object-cover"
/>
<p className="text-[18px] font-normal leading-[18.991px] text-[#15342D]">
<p
className="text-[18px] font-normal leading-[18.991px] text-[#15342D]"
style={{ color: "var(--primary-color,#15342D)" }}
>
{label}
</p>
</div>
@ -84,7 +93,7 @@ const CoverSlide = ({ data }: { data: Partial<SchemaType> }) => {
style={{
height: "365px",
background:
"linear-gradient(0deg, rgba(218, 225, 222, 0.00) 0%, #DAE1DE 80.33%)",
"linear-gradient(0deg, rgba(218, 225, 222, 0.00) 0%, var(--background-color,#DAE1DE) 80.33%)",
}}
/>
</div>

View file

@ -7,10 +7,10 @@ export const slideLayoutDescription =
"A gallery slide with a title and paragraph on the left and a five-image collage on the right and bottom.";
export const Schema = z.object({
title: z.string().min(5).max(16).default("Image Gallery").meta({
title: z.string().max(12).default("Image Gallery").meta({
description: "Main gallery heading.",
}),
description: z.string().min(50).max(130).default(
description: z.string().max(80).default(
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore."
).meta({
description: "Supporting paragraph shown under the title.",
@ -18,7 +18,7 @@ export const Schema = z.object({
topCenterImage: z.object({
__image_url__:
z.string().default("https://images.unsplash.com/photo-1521737711867-e3b97375f902?auto=format&fit=crop&w=800&q=80"),
__image_prompt__: z.string().min(10).max(100).default("Design team discussing project board"),
__image_prompt__: z.string().max(80).default("Design team discussing project board"),
}).default({
__image_url__: "https://images.unsplash.com/photo-1521737711867-e3b97375f902?auto=format&fit=crop&w=800&q=80",
__image_prompt__: "Design team discussing project board",
@ -28,7 +28,7 @@ export const Schema = z.object({
topRightImage: z.object({
__image_url__:
z.string().default("https://images.unsplash.com/photo-1455390582262-044cdead277a?auto=format&fit=crop&w=800&q=80"),
__image_prompt__: z.string().min(10).max(100).default("Creative desk with notebook and photos"),
__image_prompt__: z.string().max(80).default("Creative desk with notebook and photos"),
}).default({
__image_url__:
"https://images.unsplash.com/photo-1455390582262-044cdead277a?auto=format&fit=crop&w=800&q=80",
@ -39,7 +39,7 @@ export const Schema = z.object({
bottomWideImage: z.object({
__image_url__:
z.string().default("https://images.unsplash.com/photo-1477959858617-67f85cf4f1df?auto=format&fit=crop&w=1300&q=80"),
__image_prompt__: z.string().min(10).max(100).default("City skyline seen from office window"),
__image_prompt__: z.string().max(80).default("City skyline seen from office window"),
}).default({
__image_url__:
"https://images.unsplash.com/photo-1477959858617-67f85cf4f1df?auto=format&fit=crop&w=1300&q=80",
@ -50,7 +50,7 @@ export const Schema = z.object({
bottomCenterImage: z.object({
__image_url__:
z.string().default("https://images.unsplash.com/photo-1517048676732-d65bc937f952?auto=format&fit=crop&w=900&q=80"),
__image_prompt__: z.string().min(10).max(100).default("Art gallery wall with framed photos"),
__image_prompt__: z.string().max(80).default("Art gallery wall with framed photos"),
}).default({
__image_url__:
"https://images.unsplash.com/photo-1517048676732-d65bc937f952?auto=format&fit=crop&w=900&q=80",
@ -61,7 +61,7 @@ export const Schema = z.object({
bottomRightImage: z.object({
__image_url__:
z.string().default("https://images.unsplash.com/photo-1521791136064-7986c2920216?auto=format&fit=crop&w=900&q=80"),
__image_prompt__: z.string().min(10).max(100).default("Office workshop with presentation board"),
__image_prompt__: z.string().max(80).default("Office workshop with presentation board"),
}).default({
__image_url__:
"https://images.unsplash.com/photo-1521791136064-7986c2920216?auto=format&fit=crop&w=900&q=80",
@ -87,18 +87,26 @@ const ImageGallerySlide = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] p-[56px]"
style={{ backgroundColor: "#DAE1DE" }}
style={{
backgroundColor: "var(--background-color,#DAE1DE)",
fontFamily: "var(--body-font-family,'Bricolage Grotesque')",
}}
>
<div className="flex items-center justify-between gap-1 ">
<div className=" ">
<h2
className="text-[80px] font-semibold leading-[108.4%] tracking-[-2.419px] text-[#15342D]"
style={{ color: "#15342D" }}
style={{ color: "var(--primary-color,#15342D)" }}
>
{title}
</h2>
<p className="mt-[24px] w-[620px] text-[24px] font-normal text-[#15342DCC]">{description}</p>
<p
className="mt-[24px] w-[620px] text-[24px] font-normal text-[#15342DCC]"
style={{ color: "var(--background-text,#15342DCC)" }}
>
{description}
</p>
</div>
<div className="flex items-center gap-[22px]">
<img

View file

@ -57,10 +57,16 @@ const IntroductionSlide = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px]"
style={{ backgroundColor: "#DAE1DE" }}
style={{
backgroundColor: "var(--background-color,#DAE1DE)",
fontFamily: "var(--body-font-family,'Bricolage Grotesque')",
}}
>
<div className="grid h-full gap-[54px] items-center grid-cols-2">
<div className="h-full w-full overflow-hidden bg-[#15342D]">
<div
className="h-full w-full overflow-hidden bg-[#15342D]"
style={{ backgroundColor: "var(--primary-color,#15342D)" }}
>
{portraitImage?.__image_url__ && (
<img
@ -74,6 +80,7 @@ const IntroductionSlide = ({ data }: { data: Partial<SchemaType> }) => {
<div className="">
<h2
className="text-[80px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#15342D]"
style={{ color: "var(--primary-color,#15342D)" }}
>
{title}
</h2>
@ -83,10 +90,14 @@ const IntroductionSlide = ({ data }: { data: Partial<SchemaType> }) => {
<div key={`${block.label}-${index}`}>
<p
className="text-[20px] font-semibold tracking-[2.074px] text-[#15342D]"
style={{ color: "var(--primary-color,#15342D)" }}
>
{block.label}
</p>
<p className="mt-[14px] text-[24px] leading-[26.667px] text-[#15342DCC]">
<p
className="mt-[14px] text-[24px] leading-[26.667px] text-[#15342DCC]"
style={{ color: "var(--background-text,#15342DCC)" }}
>
{block.body}
</p>
</div>

View file

@ -7,10 +7,10 @@ export const slideLayoutDescription =
"A KPI overview slide with a dark-tinted background image, large title, and a two-row grid of six white KPI cards.";
const KpiSchema = z.object({
value: z.string().min(1).max(8).meta({
value: z.string().max(5).meta({
description: "Primary KPI value shown in a card.",
}),
body: z.string().min(10).max(28).meta({
body: z.string().max(20).meta({
description: "Short KPI supporting text.",
}),
});
@ -64,7 +64,10 @@ const KpiCardsSlide = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px]"
style={{ backgroundColor: "#DAE1DE" }}
style={{
backgroundColor: "var(--background-color,#DAE1DE)",
fontFamily: "var(--body-font-family,'Bricolage Grotesque')",
}}
>
{backgroundImage?.__image_url__ && (
<img
@ -74,11 +77,18 @@ const KpiCardsSlide = ({ data }: { data: Partial<SchemaType> }) => {
/>
)}
<div className="absolute inset-0 bg-[#15342D]/80" />
<div
className="absolute inset-0"
style={{
backgroundColor: "var(--primary-color,#15342D)",
opacity: 0.8,
}}
/>
<div className="relative z-10 px-[66px] pt-[72px] mb-[33px]">
<h2 className="text-[80px] font-semibold leading-[108.4%] tracking-[-2.419px] text-[#FEFEFF]"
<h2
className="text-[80px] font-semibold leading-[108.4%] tracking-[-2.419px] text-[#FEFEFF]"
style={{ color: "var(--primary-text,#FEFEFF)" }}
>
{title}
</h2>
@ -86,8 +96,15 @@ const KpiCardsSlide = ({ data }: { data: Partial<SchemaType> }) => {
<div className="relative z-10 grid grid-cols-3 gap-x-[30px] gap-y-[19px] px-[66px]">
{items?.map((item, index) => (
<div key={index} className=" bg-[#FEFEFF] p-[33px]">
<div className="flex h-[55px] w-[55px] items-center justify-center rounded-full bg-[#15342D]">
<div
key={index}
className=" bg-[#FEFEFF] p-[33px]"
style={{ backgroundColor: "var(--card-color,#FEFEFF)" }}
>
<div
className="flex h-[55px] w-[55px] items-center justify-center rounded-full bg-[#15342D]"
style={{ backgroundColor: "var(--primary-color,#15342D)" }}
>
<img
src={kpiIcon?.__icon_url__}
alt={kpiIcon?.__icon_query__}
@ -97,11 +114,14 @@ const KpiCardsSlide = ({ data }: { data: Partial<SchemaType> }) => {
</div>
<p
className="mt-[18px] text-[42px] font-semibold leading-none"
style={{ color: "#15342D" }}
style={{ color: "var(--primary-color,#15342D)" }}
>
{item.value}
</p>
<p className="mt-[18px] text-[28px] font-normal text-[#15342DCC]" style={{ color: "#15342D" }}>
<p
className="mt-[18px] text-[28px] font-normal text-[#15342DCC]"
style={{ color: "var(--background-text,#15342D)" }}
>
{item.body}
</p>
</div>

View file

@ -45,12 +45,11 @@ export const Schema = z.object({
export type SchemaType = z.infer<typeof Schema>;
const COLORS = [
"#5f7f79",
"#1f5a4f",
"#0d4f43",
"#06463d",
"var(--graph-0,#5f7f79)",
"var(--graph-1,#1f5a4f)",
"var(--graph-2,#0d4f43)",
"var(--graph-3,#06463d)",
];
const MarketOpportunitySlide = ({ data }: { data: Partial<SchemaType> }) => {
@ -59,25 +58,47 @@ const MarketOpportunitySlide = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px]"
style={{ backgroundColor: "#DAE1DE" }}
style={{
backgroundColor: "var(--background-color,#DAE1DE)",
fontFamily: "var(--body-font-family,'Bricolage Grotesque')",
}}
>
<div className="px-[56px] pt-[72px]">
<h2
className="text-[80px] font-semibold leading-[108.4%] tracking-[-2.419px] text-[#15342D]"
style={{ color: "#15342D" }}
style={{ color: "var(--primary-color,#15342D)" }}
>
{title}
</h2>
<p className="mt-[20px] w-[730px] text-[24px] font-normal text-[#15342DCC]">{subtitle}</p>
<p
className="mt-[20px] w-[730px] text-[24px] font-normal text-[#15342DCC]"
style={{ color: "var(--background-text,#15342DCC)" }}
>
{subtitle}
</p>
</div>
<div className="absolute left-[56px] top-[368px] space-y-[42px]">
{bullets?.map((bullet, index) => (
<div key={index} className="relative flex items-center">
<span className="mr-[14px] h-[14px] w-[14px] rounded-full bg-[#0a4a3f]" />
<p className="w-[640px] text-[24px] font-normal text-[#15342DCC]">{bullet.text}</p>
<span className="ml-[8px] h-[2px] w-[80px] bg-[#8ea8a5]" />
<span className="h-[6px] w-[6px] rounded-full bg-[#edf2f1]" />
<span
className="mr-[14px] h-[14px] w-[14px] rounded-full bg-[#0a4a3f]"
style={{ backgroundColor: "var(--graph-0,#0a4a3f)" }}
/>
<p
className="w-[640px] text-[24px] font-normal text-[#15342DCC]"
style={{ color: "var(--background-text,#15342DCC)" }}
>
{bullet.text}
</p>
<span
className="ml-[8px] h-[2px] w-[80px] bg-[#8ea8a5]"
style={{ backgroundColor: "var(--stroke,#8ea8a5)" }}
/>
<span
className="h-[6px] w-[6px] rounded-full bg-[#edf2f1]"
style={{ backgroundColor: "var(--primary-text,#edf2f1)" }}
/>
</div>
))}
</div>
@ -88,14 +109,17 @@ const MarketOpportunitySlide = ({ data }: { data: Partial<SchemaType> }) => {
key={index}
className="absolute rounded-full"
style={{
width: 237 + (index * 50),
height: 237 + (index * 50),
width: 237 + index * 50,
height: 237 + index * 50,
bottom: 0,
right: 0,
backgroundColor: COLORS[index],
}}
>
<p className="pt-[24px] text-center text-[24px] font-normal text-white" >
<p
className="pt-[24px] text-center text-[24px] font-normal text-white"
style={{ color: "var(--primary-text,#ffffff)" }}
>
{value}
</p>
</div>

View file

@ -34,14 +34,14 @@ export const Schema = z.object({
taglineLabel: z.string().min(3).max(10).default("TAGLINE").meta({
description: "Small heading above team description.",
}),
taglineBody: z.string().min(50).max(100).default(
taglineBody: z.string().max(70).default(
"Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea."
).meta({
description: "Short descriptive paragraph at top-right.",
}),
members: z
.array(MemberSchema)
.min(4)
.max(4)
.default([
{
@ -94,12 +94,15 @@ const MeetTeamSlide = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px]"
style={{ backgroundColor: "#DAE1DE" }}
style={{
backgroundColor: "var(--background-color,#DAE1DE)",
fontFamily: "var(--body-font-family,'Bricolage Grotesque')",
}}
>
<div className="flex items-start justify-between px-[64px] pt-[76px]">
<h2
className="text-[80px] font-semibold leading-[108.4%] tracking-[-2.419px] text-[#15342D]"
style={{ color: "#15342D" }}
style={{ color: "var(--primary-color,#15342D)" }}
>
{title}
</h2>
@ -107,11 +110,16 @@ const MeetTeamSlide = ({ data }: { data: Partial<SchemaType> }) => {
<div className="w-[520px]">
<p
className="text-[20px] font-semibold tracking-[2.074px] text-white"
style={{ color: "#15342D" }}
style={{ color: "var(--primary-color,#15342D)" }}
>
{taglineLabel}
</p>
<p className="mt-[14px] text-[24px] font-normal text-[#15342DCC]">{taglineBody}</p>
<p
className="mt-[14px] text-[24px] font-normal text-[#15342DCC]"
style={{ color: "var(--background-text,#15342DCC)" }}
>
{taglineBody}
</p>
</div>
</div>
@ -125,17 +133,29 @@ const MeetTeamSlide = ({ data }: { data: Partial<SchemaType> }) => {
/>
<div
className="h-[154px] p-[33px]"
style={{ backgroundColor: member.highlighted ? "#15342D" : "#FEFEFF" }}
style={{
backgroundColor: member.highlighted
? "var(--primary-color,#15342D)"
: "var(--card-color,#FEFEFF)",
}}
>
<p
className="text-[20px] font-semibold tracking-[2.074px] text-white"
style={{ color: member.highlighted ? "#edf2f1" : "#15342D" }}
style={{
color: member.highlighted
? "var(--primary-text,#edf2f1)"
: "var(--primary-color,#15342D)",
}}
>
{member.title}
</p>
<p
className="mt-[20px] text-[28px] font-normal text-white"
style={{ color: member.highlighted ? "#edf2f1" : "#15342D" }}
style={{
color: member.highlighted
? "var(--primary-text,#edf2f1)"
: "var(--primary-color,#15342D)",
}}
>
{member.name}
</p>

View file

@ -46,31 +46,60 @@ const MissionVisionSlide = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px]"
style={{ backgroundColor: "#DAE1DE" }}
style={{
backgroundColor: "var(--background-color,#DAE1DE)",
fontFamily: "var(--body-font-family,'Bricolage Grotesque')",
}}
>
<div className="grid h-full grid-cols-2 grid-rows-2">
<div className="px-[74px] pt-[76px]">
<h2
className="text-[80px] font-semibold leading-[108.4%] tracking-[-2.419px] text-[#15342D]"
style={{ color: "var(--primary-color,#15342D)" }}
>
{title}
</h2>
</div>
<div className="pl-[60px] pt-[76px]" style={{ backgroundColor: "#15342D" }}>
<p className="text-[20px] font-semibold tracking-[2.074px] text-white">
<div
className="pl-[60px] pt-[76px]"
style={{ backgroundColor: "var(--primary-color,#15342D)" }}
>
<p
className="text-[20px] font-semibold tracking-[2.074px] text-white"
style={{ color: "var(--primary-text,#edf2f1)" }}
>
{missionLabel}
</p>
<p className="mt-[26px] text-[28px] font-normal text-white">{missionBody}</p>
<p
className="mt-[26px] text-[28px] font-normal text-white"
style={{ color: "var(--primary-text,#edf2f1)" }}
>
{missionBody}
</p>
</div>
<div className="pl-[53px] py-[53px]" style={{ backgroundColor: "#15342D" }}>
<p className="text-[20px] font-semibold tracking-[2.074px] text-white">
<div
className="pl-[53px] py-[53px]"
style={{ backgroundColor: "var(--primary-color,#15342D)" }}
>
<p
className="text-[20px] font-semibold tracking-[2.074px] text-white"
style={{ color: "var(--primary-text,#edf2f1)" }}
>
{visionLabel}
</p>
<p className="mt-[24px] text-[28px] font-normal text-white">{visionBody}</p>
<p
className="mt-[24px] text-[28px] font-normal text-white"
style={{ color: "var(--primary-text,#edf2f1)" }}
>
{visionBody}
</p>
</div>
<div className="h-full w-full overflow-hidden bg-white">
<div
className="h-full w-full overflow-hidden bg-white"
style={{ backgroundColor: "var(--card-color,#ffffff)" }}
>
{image?.__image_url__ && (
<img

View file

@ -10,7 +10,7 @@ const ServiceSchema = z.object({
heading: z.string().min(4).max(12).meta({
description: "Service card heading.",
}),
body: z.string().min(20).max(44).meta({
body: z.string().max(30).meta({
description: "Service card short description.",
}),
dark: z.boolean().default(false).meta({
@ -19,13 +19,13 @@ const ServiceSchema = z.object({
});
export const Schema = z.object({
title: z.string().min(6).max(18).default("Our Services").meta({
title: z.string().min(6).max(12).default("Our Services").meta({
description: "Main heading shown at the top-left.",
}),
taglineLabel: z.string().min(3).max(10).default("TAGLINE").meta({
description: "Small label above left paragraph.",
}),
taglineBody: z.string().min(40).max(100).default(
taglineBody: z.string().max(30).default(
"Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea."
).meta({
description: "Supporting text shown beneath the tagline label.",
@ -42,7 +42,7 @@ export const Schema = z.object({
}),
services: z
.array(ServiceSchema)
.min(4)
.max(4)
.default([
{ heading: "HEADING 1", body: "Lorem ipsum dolor sit amet, consectetur", dark: false },
@ -63,14 +63,17 @@ const OurServicesSlide = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div
className="relative h-[720px] w-[1280px] flex items-end pb-[56px] justify-between overflow-hidden rounded-[24px]"
style={{ backgroundColor: "#DAE1DE" }}
style={{
backgroundColor: "var(--background-color,#DAE1DE)",
fontFamily: "var(--body-font-family,'Bricolage Grotesque')",
}}
>
<div className=" pt-[74px]">
<div className="px-[68px]">
<h2
className="text-[80px] font-semibold leading-[108.4%] tracking-[-2.419px] text-[#15342D]"
style={{ color: "#15342D" }}
style={{ color: "var(--primary-color,#15342D)" }}
>
{title}
</h2>
@ -78,14 +81,22 @@ const OurServicesSlide = ({ data }: { data: Partial<SchemaType> }) => {
<div className="mt-[26px] w-[560px]">
<p
className="text-[20px] font-semibold tracking-[2.074px] text-white"
style={{ color: "#15342D" }}
style={{ color: "var(--primary-color,#15342D)" }}
>
{taglineLabel}
</p>
<p className="mt-[14px] text-[24px] font-normal text-[#15342DCC]">{taglineBody}</p>
<p
className="mt-[14px] text-[24px] font-normal text-[#15342DCC]"
style={{ color: "var(--background-text,#15342DCC)" }}
>
{taglineBody}
</p>
</div>
</div>
<div className="mt-[35px] h-[326px] w-[650px] bg-[#15342D]">
<div
className="mt-[35px] h-[326px] w-[650px] bg-[#15342D]"
style={{ backgroundColor: "var(--primary-color,#15342D)" }}
>
{featureImage?.__image_url__ && (
<img
@ -104,16 +115,29 @@ const OurServicesSlide = ({ data }: { data: Partial<SchemaType> }) => {
<div
key={index}
className=" p-[33px]"
style={{ backgroundColor: service.dark ? "#15342D" : "#ececee" }}
style={{
backgroundColor: service.dark
? "var(--primary-color,#15342D)"
: "var(--card-color,#ececee)",
}}
>
<p
className="text-[20px] font-semibold tracking-[2.074px] text-white"
style={{ color: service.dark ? "#edf2f1" : "#15342D" }}
style={{
color: service.dark
? "var(--primary-text,#edf2f1)"
: "var(--primary-color,#15342D)",
}}
>
{service.heading}
</p>
<p
className={`${service.dark ? "text-white" : "text-[#15342DCC]"} mt-[20px] text-[28px] font-normal`}
style={{
color: service.dark
? "var(--primary-text,#edf2f1)"
: "var(--background-text,#15342DCC)",
}}
>
{service.body}
</p>

View file

@ -10,12 +10,12 @@ const PlanSchema = z.object({
price: z.string().min(4).max(12).meta({
description: "Plan price label shown at the top of each card.",
}),
description: z.string().min(18).max(26).meta({
description: z.string().max(20).meta({
description: "Short statement describing the plan.",
}),
features: z
.array(z.string().min(10).max(24))
.min(4)
.array(z.string().max(18))
.max(4)
.meta({
description: "Four bullet features shown in the pricing card.",
@ -41,7 +41,6 @@ export const Schema = z.object({
}),
plans: z
.array(PlanSchema)
.min(3)
.max(3)
.default([
{
@ -91,12 +90,15 @@ const PricingPlanSlide = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px]"
style={{ backgroundColor: "#DAE1DE" }}
style={{
backgroundColor: "var(--background-color,#DAE1DE)",
fontFamily: "var(--body-font-family,'Bricolage Grotesque')",
}}
>
<div className="px-[68px] pt-[76px]">
<h2
className="text-[80px] font-semibold leading-[108.4%] tracking-[-2.419px] text-[#15342D]"
style={{ color: "#15342D" }}
style={{ color: "var(--primary-color,#15342D)" }}
>
{title}
</h2>
@ -109,17 +111,29 @@ const PricingPlanSlide = ({ data }: { data: Partial<SchemaType> }) => {
<div
key={index}
className={` px-[20px] ${active ? "-mt-[30px] py-[60px]" : "py-[33px]"}`}
style={{ backgroundColor: active ? "#15342D" : "#ececee" }}
style={{
backgroundColor: active
? "var(--primary-color,#15342D)"
: "var(--card-color,#ececee)",
}}
>
<p
className="text-[20px] font-semibold tracking-[2.074px] text-white"
style={{ color: active ? "#edf2f1" : "#15342D" }}
style={{
color: active
? "var(--primary-text,#edf2f1)"
: "var(--primary-color,#15342D)",
}}
>
{plan.price}
</p>
<p
className="mt-[18px] text-[28px] font-normal text-[#15342DCC]"
style={{ color: active ? "#edf2f1" : "#15342D" }}
style={{
color: active
? "var(--primary-text,#edf2f1)"
: "var(--background-text,#15342DCC)",
}}
>
{plan.description}
</p>
@ -135,7 +149,11 @@ const PricingPlanSlide = ({ data }: { data: Partial<SchemaType> }) => {
/>
<p
className="text-[28px] font-normal text-[#15342DCC]"
style={{ color: active ? "#edf2f1" : "#15342D" }}
style={{
color: active
? "var(--primary-text,#edf2f1)"
: "var(--background-text,#15342DCC)",
}}
>
{feature}
</p>

View file

@ -80,12 +80,15 @@ const ProcessSlide = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px]"
style={{ backgroundColor: "#DAE1DE" }}
style={{
backgroundColor: "var(--background-color,#DAE1DE)",
fontFamily: "var(--body-font-family,'Bricolage Grotesque')",
}}
>
<div className="px-[66px] pt-[73px]">
<h2
className="text-[80px] font-semibold leading-[108.4%] tracking-[-2.419px] text-[#15342D]"
style={{ color: "#15342D" }}
style={{ color: "var(--primary-color,#15342D)" }}
>
{title}
</h2>
@ -110,23 +113,28 @@ const ProcessSlide = ({ data }: { data: Partial<SchemaType> }) => {
}}
/>
<svg xmlns="http://www.w3.org/2000/svg" width="162" height="187" viewBox="0 0 162 187" fill="none">
<path d="M80.8291 0L161.658 46.6667V140L80.8291 186.667L2.28882e-05 140V46.6667L80.8291 0Z" fill={step.highlighted ? "#15342D" : "#FEFEFF"} />
<path d="M80.8291 0L161.658 46.6667V140L80.8291 186.667L2.28882e-05 140V46.6667L80.8291 0Z" fill={step.highlighted ? "var(--primary-color,#15342D)" : "var(--card-color,#FEFEFF)"} />
</svg>
</div>
<div className="absolute bottom-1 right-0">
<svg xmlns="http://www.w3.org/2000/svg" width="231" height="134" viewBox="0 0 231 134" fill="none">
<path d="M230.94 66.667L115.47 133.334L0 66.667V0H11.5469V60L115.47 120L219.393 60V0H230.94V66.667Z" fill="#FEFEFF" />
<path d="M230.94 66.667L115.47 133.334L0 66.667V0H11.5469V60L115.47 120L219.393 60V0H230.94V66.667Z" fill="var(--card-color,#FEFEFF)" />
</svg>
</div>
</div>
<div className=" absolute bottom-[-110px] left-0 text-center mt-[60px]">
<p
className="text-[20px] font-semibold tracking-[2.074px] text-[#15342D]"
style={{ color: "#15342D" }}
style={{ color: "var(--primary-color,#15342D)" }}
>
{step.label}
</p>
<p className="mt-[6px] text-[24px] leading-[1.2] text-[#315f58]">{step.body}</p>
<p
className="mt-[6px] text-[24px] leading-[1.2] text-[#315f58]"
style={{ color: "var(--background-text,#315f58)" }}
>
{step.body}
</p>
</div>
</div>
)
@ -141,23 +149,28 @@ const ProcessSlide = ({ data }: { data: Partial<SchemaType> }) => {
<div className=" absolute top-[-100px] left-0 w-[224px] text-center">
<p
className="text-[20px] font-semibold tracking-[2.074px] text-[#15342D]"
style={{ color: "#15342D" }}
style={{ color: "var(--primary-color,#15342D)" }}
>
{step.label}
</p>
<p className="mt-[6px] text-[24px] leading-[1.2] text-[#315f58]">{step.body}</p>
<p
className="mt-[6px] text-[24px] leading-[1.2] text-[#315f58]"
style={{ color: "var(--background-text,#315f58)" }}
>
{step.body}
</p>
</div>
<div className="relative w-[230px] flex justify-center items-center h-[276px]">
<div className="relative">
<svg xmlns="http://www.w3.org/2000/svg" width="162" height="187" viewBox="0 0 162 187" fill="none">
<path d="M80.8291 0L161.658 46.6667V140L80.8291 186.667L2.28882e-05 140V46.6667L80.8291 0Z" fill={step.highlighted ? "#15342D" : "#FEFEFF"} />
<path d="M80.8291 0L161.658 46.6667V140L80.8291 186.667L2.28882e-05 140V46.6667L80.8291 0Z" fill={step.highlighted ? "var(--primary-color,#15342D)" : "var(--card-color,#FEFEFF)"} />
</svg>
<img src={step.icon.__icon_url__} alt={step.icon.__icon_query__} className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 h-[42px] w-[42px] object-contain" />
</div>
<div className="absolute top-1 right-0">
<svg xmlns="http://www.w3.org/2000/svg" width="231" height="134" viewBox="0 0 231 134" fill="none">
<path d="M230.94 66.667L115.47 0L0 66.667V133.333H11.5469V73.333L115.47 13.333L219.394 73.333V133.333H230.94V66.667Z" fill="#FEFEFF" />
<path d="M230.94 66.667L115.47 0L0 66.667V133.333H11.5469V73.333L115.47 13.333L219.394 73.333V133.333H230.94V66.667Z" fill="var(--card-color,#FEFEFF)" />
</svg>
</div>
</div>

View file

@ -229,17 +229,21 @@ export const Schema = z.object({
export type SchemaType = z.infer<typeof Schema>;
const MINI_BAR_DARK = "#0B4B40";
const MINI_BAR_LIGHT = "#CED3D1";
const DONUT_COLORS = ["#0B4B40", "#4B6B61", "#7B938C"];
const KPI_ICON_BG = "#063C73";
const MINI_BAR_DARK = "var(--graph-0,#0B4B40)";
const MINI_BAR_LIGHT = "var(--graph-1,#CED3D1)";
const DONUT_COLORS = [
"var(--graph-0,#0B4B40)",
"var(--graph-1,#4B6B61)",
"var(--graph-2,#7B938C)",
];
const KPI_ICON_BG = "var(--graph-3,#063C73)";
const PulseIcon = () => (
<svg viewBox="0 0 24 24" className="h-[22px] w-[22px]" aria-hidden="true">
<path
d="M2.5 12h4.6l1.7-4.4 3.1 9 2.7-6.2h6.9"
fill="none"
stroke="#ffffff"
stroke="var(--primary-text,#ffffff)"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="2"
@ -254,8 +258,16 @@ const renderDonutPercentLabel = ({ cx, cy, midAngle, outerRadius, percent }: any
return (
<g>
<circle cx={x} cy={y} r={16} fill="#ECEAF8" />
<text x={x} y={y} style={{ padding: '4px' }} textAnchor="middle" fill="#2C2B39" fontSize={10} fontWeight={600}>
<circle cx={x} cy={y} r={16} fill="var(--card-color,#ECEAF8)" />
<text
x={x}
y={y}
style={{ padding: "4px" }}
textAnchor="middle"
fill="var(--background-text,#2C2B39)"
fontSize={10}
fontWeight={600}
>
{`${Math.round((percent ?? 0) * 100)}%`}
</text>
</g>
@ -322,7 +334,10 @@ const ReportSnapshotSlide = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px]"
style={{ backgroundColor: "#D7DEDB" }}
style={{
backgroundColor: "var(--background-color,#D7DEDB)",
fontFamily: "var(--body-font-family,'Bricolage Grotesque')",
}}
>
{sideImage?.__image_url__ && (
<img
@ -332,16 +347,25 @@ const ReportSnapshotSlide = ({ data }: { data: Partial<SchemaType> }) => {
/>
)}
<div className="absolute left-[268px] top-[74px] text-[#083F37]">
<div
className="absolute left-[268px] top-[74px] text-[#083F37]"
style={{ color: "var(--primary-color,#083F37)" }}
>
<h2 className="text-[80px] font-semibold leading-[108.4%] tracking-[-2.419px]">
{title}
</h2>
<div className="mt-[14px] w-[560px]">
<p className="text-[20px] font-semibold tracking-[2.074px] text-[#083F37]">
<p
className="text-[20px] font-semibold tracking-[2.074px] text-[#083F37]"
style={{ color: "var(--primary-color,#083F37)" }}
>
{taglineLabel}
</p>
<p className="mt-[12px] text-[24px] leading-[1.11] text-[#083F37]/75">
<p
className="mt-[12px] text-[24px] leading-[1.11] text-[#083F37]/75"
style={{ color: "var(--background-text,#083F37BF)" }}
>
{taglineBody}
</p>
</div>
@ -350,8 +374,14 @@ const ReportSnapshotSlide = ({ data }: { data: Partial<SchemaType> }) => {
<div
className={`absolute bottom-[50px] left-[266px] w-[580px] bg-[#F3F3F3] px-[28px] pb-[18px] pt-[20px] ${activeChartStyle === "mini-bars" ? "h-[308px]" : "h-[350px]"
}`}
style={{ backgroundColor: "var(--card-color,#F3F3F3)" }}
>
<p className="mt-[14px] text-[32px] font-normal leading-[1.1] text-[#15342D]">{chartTitle}</p>
<p
className="mt-[14px] text-[32px] font-normal leading-[1.1] text-[#15342D]"
style={{ color: "var(--primary-color,#15342D)" }}
>
{chartTitle}
</p>
{activeChartStyle === "mini-bars" && (
<>
@ -362,7 +392,7 @@ const ReportSnapshotSlide = ({ data }: { data: Partial<SchemaType> }) => {
margin={{ top: 0, right: 8, left: -6, bottom: 0 }}
barCategoryGap={16}
>
<CartesianGrid vertical={false} stroke="#D7DCDA" strokeDasharray="3 3" />
<CartesianGrid vertical={false} stroke="var(--stroke,#D7DCDA)" strokeDasharray="3 3" />
<XAxis dataKey="label" tick={false} axisLine={false} tickLine={false} />
<YAxis
width={42}
@ -371,7 +401,7 @@ const ReportSnapshotSlide = ({ data }: { data: Partial<SchemaType> }) => {
tickFormatter={(value) => `$${value}`}
axisLine={false}
tickLine={false}
tick={{ fill: "#6C7271", fontSize: 10 }}
tick={{ fill: "var(--background-text,#6C7271)", fontSize: 10 }}
/>
<Bar
dataKey="secondary"
@ -392,8 +422,18 @@ const ReportSnapshotSlide = ({ data }: { data: Partial<SchemaType> }) => {
</div>
<div className="mt-[14px] flex items-center justify-between ">
<p className="text-[#6D7371] text-[18px]">{footerLabel}</p>
<p className="font-medium text-[#15342D] text-[18px]">{footerValue}</p>
<p
className="text-[#6D7371] text-[18px]"
style={{ color: "var(--background-text,#6D7371)" }}
>
{footerLabel}
</p>
<p
className="font-medium text-[#15342D] text-[18px]"
style={{ color: "var(--primary-color,#15342D)" }}
>
{footerValue}
</p>
</div>
</>
)}
@ -431,11 +471,19 @@ const ReportSnapshotSlide = ({ data }: { data: Partial<SchemaType> }) => {
className="h-[14px] w-[14px] rounded-full"
style={{ backgroundColor: DONUT_COLORS[index % DONUT_COLORS.length] }}
/>
<p className="text-[18px] font-bold text-[#767676]">
<p
className="text-[18px] font-bold text-[#767676]"
style={{ color: "var(--background-text,#767676)" }}
>
{legendLabels?.[index] ?? entry.name}
</p>
</div>
<p className="text-[18px] font-bold text-[#404040]">{percent}%</p>
<p
className="text-[18px] font-bold text-[#404040]"
style={{ color: "var(--background-text,#404040)" }}
>
{percent}%
</p>
</div>
);
})}
@ -452,18 +500,18 @@ const ReportSnapshotSlide = ({ data }: { data: Partial<SchemaType> }) => {
margin={{ top: 12, right: 6, left: -12, bottom: 0 }}
barCategoryGap={20}
>
<CartesianGrid vertical={false} stroke="#D7DCDA" />
<CartesianGrid vertical={false} stroke="var(--stroke,#D7DCDA)" />
<XAxis
dataKey="label"
axisLine={false}
tickLine={false}
tick={{ fill: "#42484A", fontSize: 10 }}
tick={{ fill: "var(--background-text,#42484A)", fontSize: 10 }}
/>
<YAxis
axisLine={false}
tickLine={false}
tick={{ fill: "#566061", fontSize: 10 }}
tick={{ fill: "var(--background-text,#566061)", fontSize: 10 }}
/>
<Bar
dataKey="optionA"
@ -472,16 +520,26 @@ const ReportSnapshotSlide = ({ data }: { data: Partial<SchemaType> }) => {
maxBarSize={20}
isAnimationActive={false}
>
<LabelList dataKey="optionA" position="top" fill="#5B6463" fontSize={9} />
<LabelList
dataKey="optionA"
position="top"
fill="var(--background-text,#5B6463)"
fontSize={9}
/>
</Bar>
<Bar
dataKey="optionB"
fill="#8A9A96"
fill="var(--graph-2,#8A9A96)"
radius={[4, 4, 0, 0]}
maxBarSize={20}
isAnimationActive={false}
>
<LabelList dataKey="optionB" position="top" fill="#5B6463" fontSize={9} />
<LabelList
dataKey="optionB"
position="top"
fill="var(--background-text,#5B6463)"
fontSize={9}
/>
</Bar>
</BarChart>
</ResponsiveContainer>
@ -489,12 +547,28 @@ const ReportSnapshotSlide = ({ data }: { data: Partial<SchemaType> }) => {
<div className="ml-[24px] space-y-[24px]">
<div className="flex items-center gap-[10px]">
<span className="h-[14px] w-[14px] rounded-full bg-[#0B4B40]" />
<p className="text-[18px] font-medium leading-[1] text-[#6A6B6E]">{legendLabels?.[0] ?? "Option A"}</p>
<span
className="h-[14px] w-[14px] rounded-full bg-[#0B4B40]"
style={{ backgroundColor: "var(--graph-0,#0B4B40)" }}
/>
<p
className="text-[18px] font-medium leading-[1] text-[#6A6B6E]"
style={{ color: "var(--background-text,#6A6B6E)" }}
>
{legendLabels?.[0] ?? "Option A"}
</p>
</div>
<div className="flex items-center gap-[10px]">
<span className="h-[14px] w-[14px] rounded-full bg-[#8A9A96]" />
<p className="text-[18px] font-medium leading-[1] text-[#6A6B6E]">{legendLabels?.[1] ?? "Option B"}</p>
<span
className="h-[14px] w-[14px] rounded-full bg-[#8A9A96]"
style={{ backgroundColor: "var(--graph-2,#8A9A96)" }}
/>
<p
className="text-[18px] font-medium leading-[1] text-[#6A6B6E]"
style={{ color: "var(--background-text,#6A6B6E)" }}
>
{legendLabels?.[1] ?? "Option B"}
</p>
</div>
</div>
</div>
@ -505,20 +579,33 @@ const ReportSnapshotSlide = ({ data }: { data: Partial<SchemaType> }) => {
<div className="h-[210px] w-[362px]">
<ResponsiveContainer width="100%" height="100%">
<LineChart data={trendLines ?? []} margin={{ top: 12, right: 6, left: -6, bottom: 16 }}>
<CartesianGrid vertical={false} stroke="#D7DCDA" />
<CartesianGrid vertical={false} stroke="var(--stroke,#D7DCDA)" />
<XAxis
dataKey="label"
axisLine={false}
tickLine={false}
tick={{ fill: "#42484A", fontSize: 10 }}
label={{ value: xAxisName, position: "insideBottom", offset: -6, fill: "#535B5C", fontSize: 10 }}
tick={{ fill: "var(--background-text,#42484A)", fontSize: 10 }}
label={{
value: xAxisName,
position: "insideBottom",
offset: -6,
fill: "var(--background-text,#535B5C)",
fontSize: 10,
}}
/>
<YAxis
axisLine={false}
tickLine={false}
tick={{ fill: "#566061", fontSize: 10 }}
label={{ value: yAxisName, angle: -90, position: "insideLeft", fill: "#535B5C", fontSize: 10, dx: -8 }}
tick={{ fill: "var(--background-text,#566061)", fontSize: 10 }}
label={{
value: yAxisName,
angle: -90,
position: "insideLeft",
fill: "var(--background-text,#535B5C)",
fontSize: 10,
dx: -8,
}}
/>
<Line
type="monotone"
@ -531,7 +618,7 @@ const ReportSnapshotSlide = ({ data }: { data: Partial<SchemaType> }) => {
<Line
type="monotone"
dataKey="optionB"
stroke="#8A9A96"
stroke="var(--graph-2,#8A9A96)"
strokeWidth={2}
dot={false}
isAnimationActive={false}
@ -542,12 +629,28 @@ const ReportSnapshotSlide = ({ data }: { data: Partial<SchemaType> }) => {
<div className="ml-[18px] space-y-[24px]">
<div className="flex items-center gap-[10px]">
<span className="h-[14px] w-[14px] rounded-full bg-[#0B4B40]" />
<p className="text-[18px] font-medium leading-[1] text-[#6A6B6E]">{legendLabels?.[0] ?? "Option A"}</p>
<span
className="h-[14px] w-[14px] rounded-full bg-[#0B4B40]"
style={{ backgroundColor: "var(--graph-0,#0B4B40)" }}
/>
<p
className="text-[18px] font-medium leading-[1] text-[#6A6B6E]"
style={{ color: "var(--background-text,#6A6B6E)" }}
>
{legendLabels?.[0] ?? "Option A"}
</p>
</div>
<div className="flex items-center gap-[10px]">
<span className="h-[14px] w-[14px] rounded-full bg-[#8A9A96]" />
<p className="text-[18px] font-medium leading-[1] text-[#6A6B6E]">{legendLabels?.[1] ?? "Option B"}</p>
<span
className="h-[14px] w-[14px] rounded-full bg-[#8A9A96]"
style={{ backgroundColor: "var(--graph-2,#8A9A96)" }}
/>
<p
className="text-[18px] font-medium leading-[1] text-[#6A6B6E]"
style={{ color: "var(--background-text,#6A6B6E)" }}
>
{legendLabels?.[1] ?? "Option B"}
</p>
</div>
</div>
</div>
@ -560,9 +663,16 @@ const ReportSnapshotSlide = ({ data }: { data: Partial<SchemaType> }) => {
>
<div className="flex flex-col gap-[24px]">
{visibleMetricCards.map((metric, index) => (
<div key={`${metric.value}-${index}`} className="bg-[#F3F3F3] px-[33px] py-[24px]">
<div
key={`${metric.value}-${index}`}
className="bg-[#F3F3F3] px-[33px] py-[24px]"
style={{ backgroundColor: "var(--card-color,#F3F3F3)" }}
>
<div className="flex items-center gap-[14px]">
<div className="flex h-[56px] w-[56px] items-center justify-center rounded-full" style={{ backgroundColor: "#15342D" }}>
<div
className="flex h-[56px] w-[56px] items-center justify-center rounded-full"
style={{ backgroundColor: KPI_ICON_BG }}
>
{usePulseFallback ? (
<PulseIcon />
) : (
@ -574,9 +684,19 @@ const ReportSnapshotSlide = ({ data }: { data: Partial<SchemaType> }) => {
/>
)}
</div>
<p className="text-[48px] font-semibold leading-[1] text-[#113F37]">{metric.value}</p>
<p
className="text-[48px] font-semibold leading-[1] text-[#113F37]"
style={{ color: "var(--primary-color,#113F37)" }}
>
{metric.value}
</p>
</div>
<p className="mt-[18px] text-[28px] leading-[1.08] text-[#113F37]">{metric.body}</p>
<p
className="mt-[18px] text-[28px] leading-[1.08] text-[#113F37]"
style={{ color: "var(--primary-color,#113F37)" }}
>
{metric.body}
</p>
</div>
))}
</div>

View file

@ -1,7 +1,7 @@
import * as z from "zod";
const PRODUCT_BG = "#d7dddd";
const PRODUCT_DARK = "#05463d";
const PRODUCT_BG = "var(--background-color,#d7dddd)";
const PRODUCT_DARK = "var(--primary-color,#05463d)";
export const slideLayoutId = "product-overview-table-of-content-slide";
@ -55,7 +55,10 @@ const TableOfContentSlide = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px]"
style={{ backgroundColor: PRODUCT_BG }}
style={{
backgroundColor: PRODUCT_BG,
fontFamily: "var(--body-font-family,'Bricolage Grotesque')",
}}
>
<div className="grid h-full grid-cols-[1fr_1fr]">
<div className="px-[128px] pt-[69px]" style={{ backgroundColor: PRODUCT_DARK }}>
@ -64,12 +67,25 @@ const TableOfContentSlide = ({ data }: { data: Partial<SchemaType> }) => {
<div key={index} className="flex items-center justify-between">
<div>
<p className="text-[20px] font-semibold tracking-[0.2em] text-[#ecf2f1]">
<p
className="text-[20px] font-semibold tracking-[0.2em] text-[#ecf2f1]"
style={{ color: "var(--primary-text,#ecf2f1)" }}
>
{section.title}
</p>
<p className="mt-[6px] text-[18px] leading-[1.2] text-[#ecf2f1]">{section.description}</p>
<p
className="mt-[6px] text-[18px] leading-[1.2] text-[#ecf2f1]"
style={{ color: "var(--primary-text,#ecf2f1)" }}
>
{section.description}
</p>
</div>
<p className="text-[22px] font-medium text-[#ecf2f1]">{section.number}</p>
<p
className="text-[22px] font-medium text-[#ecf2f1]"
style={{ color: "var(--primary-text,#ecf2f1)" }}
>
{section.number}
</p>
</div>
))}
</div>
@ -78,11 +94,14 @@ const TableOfContentSlide = ({ data }: { data: Partial<SchemaType> }) => {
<div className="px-[42px] pt-[118px]">
<h2
className="text-[80px] font-semibold leading-[108.4%] tracking-[-2.419px] text-[#15342D]"
style={{ color: "#15342D" }}
style={{ color: "var(--primary-color,#15342D)" }}
>
{title}
</h2>
<p className="mt-[28px] w-[560px] text-[24px] font-normal text-[#15342DCC]">
<p
className="mt-[28px] w-[560px] text-[24px] font-normal text-[#15342DCC]"
style={{ color: "var(--background-text,#15342DCC)" }}
>
{description}
</p>
</div>

View file

@ -77,11 +77,25 @@ const DataAnalysisBarSlide = ({ data }: { data: Partial<SchemaType> }) => {
const series = chartData?.series ?? [];
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]">
<div className="absolute left-0 top-0 w-[42px] rounded-b-[22px] bg-[#4d4ef3]" style={{ height: 185 }} />
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]"
style={{
backgroundColor: "var(--background-color,#f9f8f8)",
fontFamily: "var(--body-font-family,Nunito Sans)",
}}
>
<div
className="absolute left-0 top-0 w-[42px] rounded-b-[22px] bg-[#4d4ef3]"
style={{ height: 185, backgroundColor: "var(--graph-0,#4d4ef3)" }}
/>
<div className="px-[64px] pt-[48px]">
<h2 className="text-[80px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]">{title}</h2>
<h2
className="text-[80px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]"
style={{ color: "var(--background-text,#232223)" }}
>
{title}
</h2>
</div>
<div className="flex justify-between px-[85px] pt-[44px]">
@ -89,7 +103,13 @@ const DataAnalysisBarSlide = ({ data }: { data: Partial<SchemaType> }) => {
{items?.map((item, index) => (
<div key={`${item.title}-${index}`}>
<div className="flex items-center gap-[14px]">
<div className="flex h-[55px] w-[55px] items-center justify-center rounded-full bg-[#4d4ef3] text-white">
<div
className="flex h-[55px] w-[55px] items-center justify-center rounded-full bg-[#4d4ef3] text-white"
style={{
backgroundColor: "var(--graph-0,#4d4ef3)",
color: "var(--primary-text,#ffffff)",
}}
>
<img
src={itemIcon?.__icon_url__}
alt={itemIcon?.__icon_query__}
@ -97,9 +117,19 @@ const DataAnalysisBarSlide = ({ data }: { data: Partial<SchemaType> }) => {
style={{ filter: "brightness(0) invert(1)" }}
/>
</div>
<h3 className="text-[20px] font-medium tracking-[2.074px] text-[#232223]">{item.title}</h3>
<h3
className="text-[20px] font-medium tracking-[2.074px] text-[#232223]"
style={{ color: "var(--background-text,#232223)" }}
>
{item.title}
</h3>
</div>
<p className="mt-[20px] text-[24px] leading-[26.667px] text-[#232223]">{item.description}</p>
<p
className="mt-[20px] text-[24px] leading-[26.667px] text-[#232223]"
style={{ color: "var(--background-text,#232223)" }}
>
{item.description}
</p>
</div>
))}
</div>
@ -110,8 +140,14 @@ const DataAnalysisBarSlide = ({ data }: { data: Partial<SchemaType> }) => {
<FlexibleReportChart chartType={chartType} data={rows} series={series} colorFallback="#4d4ef3" />
</ResponsiveContainer>
</div>
<div className="mt-[12px] flex items-center gap-[10px] text-[24px] tracking-[-0.03em] text-[#4d4ef3]">
<span className="h-[12px] w-[12px] rounded-full bg-[#4d4ef3]" />
<div
className="mt-[12px] flex items-center gap-[10px] text-[24px] tracking-[-0.03em] text-[#4d4ef3]"
style={{ color: "var(--graph-0,#4d4ef3)" }}
>
<span
className="h-[12px] w-[12px] rounded-full bg-[#4d4ef3]"
style={{ backgroundColor: "var(--graph-0,#4d4ef3)" }}
/>
<p>{legendLabel}</p>
</div>
</div>

View file

@ -141,7 +141,13 @@ function SummaryCard({
}) {
return (
<div className="flex gap-[10px] items-center rounded-[14px] py-[9px]">
<div className="flex h-[36px] w-[36px] border border-[#ECF5FE] shrink-0 items-center justify-center rounded-full bg-[#ECF5FE] ">
<div
className="flex h-[36px] w-[36px] border border-[#ECF5FE] shrink-0 items-center justify-center rounded-full bg-[#ECF5FE] "
style={{
backgroundColor: "var(--card-color,#ECF5FE)",
borderColor: "var(--stroke,#ECF5FE)",
}}
>
<img
src={iconUrl ?? ""}
alt={iconAlt ?? ""}
@ -150,8 +156,18 @@ function SummaryCard({
/>
</div>
<div className="">
<p className="text-[18px] leading-none tracking-[-0.04em] text-[#4A4D53]">{value}</p>
<p className="mt-[4px] text-[14px] leading-none text-[#6C6C6C]">{label}</p>
<p
className="text-[18px] leading-none tracking-[-0.04em] text-[#4A4D53]"
style={{ color: "var(--background-text,#4A4D53)" }}
>
{value}
</p>
<p
className="mt-[4px] text-[14px] leading-none text-[#6C6C6C]"
style={{ color: "var(--background-text,#6C6C6C)" }}
>
{label}
</p>
</div>
</div>
);
@ -167,16 +183,32 @@ const DataAnalysisDashboardSlide = ({ data }: { data: Partial<SchemaType> }) =>
const otherHalfChart = charts?.slice(Math.ceil(charts.length / 2));
return (
<div className="relative flex flex-col h-[720px] w-[1280px] overflow-hidden bg-[#F9F8F8]">
<div className="absolute left-0 top-0 w-[42px] rounded-b-[22px] bg-[#157CFF]" style={{ height: 185 }} />
<div
className="relative flex flex-col h-[720px] w-[1280px] overflow-hidden bg-[#F9F8F8]"
style={{
backgroundColor: "var(--background-color,#F9F8F8)",
fontFamily: "var(--body-font-family,Nunito Sans)",
}}
>
<div
className="absolute left-0 top-0 w-[42px] rounded-b-[22px] bg-[#157CFF]"
style={{ height: 185, backgroundColor: "var(--primary-color,#157CFF)" }}
/>
<div className="px-[64px] pt-[48px]">
<h2 className="text-[80px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]">{title}</h2>
<h2
className="text-[80px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]"
style={{ color: "var(--background-text,#232223)" }}
>
{title}
</h2>
</div>
{summaryCards && summaryCards.length > 0 && <div className=" mx-[64px] grid bg-white gap-[16px] p-[13px] mt-[22px] rounded-[14px] "
style={{ gridTemplateColumns: `repeat(${summaryCards.length}, minmax(220px, 1fr))` }}>
style={{
gridTemplateColumns: `repeat(${summaryCards.length}, minmax(220px, 1fr))`,
backgroundColor: "var(--card-color,#ffffff)",
}}>
{summaryCards?.map((card, index) => (
<SummaryCard
key={`${card.label}-${index}`}
@ -192,7 +224,10 @@ const DataAnalysisDashboardSlide = ({ data }: { data: Partial<SchemaType> }) =>
{halfChart && halfChart.length > 0 && <div className="mt-[14px] px-[64px] flex-1">
<div
className={`grid h-full bg-white p-[13px] rounded-[14px] min-h-0 gap-[10px] grid-cols-3`}
style={{ gridAutoRows: `minmax(150px, 1fr)` }}
style={{
gridAutoRows: `minmax(150px, 1fr)`,
backgroundColor: "var(--card-color,#ffffff)",
}}
>
{halfChart?.map((chart, index) => (
<div
@ -211,7 +246,10 @@ const DataAnalysisDashboardSlide = ({ data }: { data: Partial<SchemaType> }) =>
{otherHalfChart && otherHalfChart.length > 0 && <div className="mt-[14px] px-[64px] flex-1">
<div
className={`grid h-full bg-white p-[13px] rounded-[14px] min-h-0 gap-[10px] grid-cols-3`}
style={{ gridAutoRows: `minmax(150px, 1fr)` }}
style={{
gridAutoRows: `minmax(150px, 1fr)`,
backgroundColor: "var(--card-color,#ffffff)",
}}
>
{otherHalfChart?.map((chart, index) => (
<div

View file

@ -66,17 +66,37 @@ const DataAnalysisInsightBarSlide = ({
const series = data?.chartData?.series ?? [];
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]">
<div className="absolute left-0 top-0 w-[42px] rounded-b-[22px] bg-[#157CFF]" style={{ height: 185 }} />
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]"
style={{
backgroundColor: "var(--background-color,#f9f8f8)",
fontFamily: "var(--body-font-family,Nunito Sans)",
}}
>
<div
className="absolute left-0 top-0 w-[42px] rounded-b-[22px] bg-[#157CFF]"
style={{ height: 185, backgroundColor: "var(--primary-color,#157CFF)" }}
/>
<div className="px-[64px] pt-[48px]">
<h2 className="text-[80px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]">{data.title}</h2>
<h2
className="text-[80px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]"
style={{ color: "var(--background-text,#232223)" }}
>
{data.title}
</h2>
</div>
<div className="flex justify-between px-[74px] gap-10 pt-[96px]">
<div className=" pt-[24px] w-1/2">
<div className="flex items-center gap-[14px]">
<div className="flex h-[55px] w-[55px] items-center justify-center rounded-full bg-[#157CFF] text-white">
<div
className="flex h-[55px] w-[55px] items-center justify-center rounded-full bg-[#157CFF] text-white"
style={{
backgroundColor: "var(--primary-color,#157CFF)",
color: "var(--primary-text,#ffffff)",
}}
>
<img
src={data.insightIcon?.__icon_url__}
alt={data.insightIcon?.__icon_query__}
@ -85,15 +105,26 @@ const DataAnalysisInsightBarSlide = ({
/>
</div>
</div>
<p className="mt-[20px] text-[24px] leading-[26.667px] text-[#232223]">{data.insightBody}</p>
<p
className="mt-[20px] text-[24px] leading-[26.667px] text-[#232223]"
style={{ color: "var(--background-text,#232223)" }}
>
{data.insightBody}
</p>
</div>
<div className="ml-[28px] flex w-1/2 flex-col items-center">
<ResponsiveContainer height={400} width="100%">
<FlexibleReportChart chartType={chartType} data={chartData} series={series} colorFallback="#157CFF" />
</ResponsiveContainer>
<div className="mt-[12px] flex items-center gap-[10px] text-[24px] tracking-[-0.03em] text-[#157CFF]">
<span className="h-[12px] w-[12px] rounded-full bg-[#157CFF]" />
<div
className="mt-[12px] flex items-center gap-[10px] text-[24px] tracking-[-0.03em] text-[#157CFF]"
style={{ color: "var(--primary-color,#157CFF)" }}
>
<span
className="h-[12px] w-[12px] rounded-full bg-[#157CFF]"
style={{ backgroundColor: "var(--primary-color,#157CFF)" }}
/>
<p>{data.legendLabel}</p>
</div>
</div>

View file

@ -88,18 +88,32 @@ type StatMetric = {
function StatPill({ metrics }: { metrics: StatMetric[] }) {
return (
<div className="h-[438px] w-[248px] overflow-hidden rounded-[127px] bg-[#157CFF] px-[28px] py-[74px] text-center text-white">
<div
className="h-[438px] w-[248px] overflow-hidden rounded-[127px] bg-[#157CFF] px-[28px] py-[74px] text-center text-white"
style={{
backgroundColor: "var(--primary-color,#157CFF)",
color: "var(--primary-text,#ffffff)",
}}
>
{metrics.map((metric, index) => (
<Fragment key={`${metric.value}-${metric.label}-${index}`}>
<div key={`${metric.value}-${metric.label}-${index}`} className={``}>
<p className="text-[55px] font-medium leading-[ 44.353px] tracking-[-1.09px]">{metric.value}</p>
<p className="mt-[6px] text-[20px] font-medium leading-none">{metric.label}</p>
<p className="text-[20px] leading-[1.15] text-white/90">{metric.description}</p>
<p className="text-[20px] leading-[1.15] text-white/90" style={{ color: "var(--primary-text,#ffffff)", opacity: 0.9 }}>
{metric.description}
</p>
</div>
{index === 0 && (
<div className="py-[22px]">
<svg xmlns="http://www.w3.org/2000/svg" width="181" height="1" viewBox="0 0 181 1" fill="none">
<path opacity="0.2" d="M0 0.487305H180.122" stroke="white" strokeWidth="0.974913" strokeDasharray="3.9 1.95" />
<path
opacity="0.2"
d="M0 0.487305H180.122"
stroke="var(--primary-text,#ffffff)"
strokeWidth="0.974913"
strokeDasharray="3.9 1.95"
/>
</svg>
</div>
)}
@ -116,22 +130,39 @@ const DataAnalysisLineStatsSlide = ({ data }: { data: Partial<SchemaType> }) =>
const series = chartData?.series ?? [];
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]">
<div className="absolute left-0 top-0 w-[42px] rounded-b-[22px] bg-[#157CFF]" style={{ height: 185 }} />
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]"
style={{
backgroundColor: "var(--background-color,#f9f8f8)",
fontFamily: "var(--body-font-family,Nunito Sans)",
}}
>
<div
className="absolute left-0 top-0 w-[42px] rounded-b-[22px] bg-[#157CFF]"
style={{ height: 185, backgroundColor: "var(--primary-color,#157CFF)" }}
/>
<div className="px-[64px] pt-[48px]">
<h2 className="text-[80px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]">{title}</h2>
<h2
className="text-[80px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]"
style={{ color: "var(--background-text,#232223)" }}
>
{title}
</h2>
</div>
<div className="flex justify-between px-[74px] pt-[40px]">
<div className="w-[474px]">
<div className="flex justify-center gap-[26px] text-[14px] text-[#353538]">
<div
className="flex justify-center gap-[26px] text-[14px] text-[#353538]"
style={{ color: "var(--background-text,#353538)" }}
>
<span className="flex items-center gap-[8px]">
<span className="h-[2px] w-[20px] bg-[#9fb6ff]" />
<span className="h-[2px] w-[20px] bg-[#9fb6ff]" style={{ backgroundColor: "var(--graph-0,#9fb6ff)" }} />
{seriesALabel}
</span>
<span className="flex items-center gap-[8px]">
<span className="h-[2px] w-[20px] bg-[#4d4ef3]" />
<span className="h-[2px] w-[20px] bg-[#4d4ef3]" style={{ backgroundColor: "var(--graph-1,#4d4ef3)" }} />
{seriesBLabel}
</span>
</div>
@ -143,13 +174,20 @@ const DataAnalysisLineStatsSlide = ({ data }: { data: Partial<SchemaType> }) =>
data={rows}
series={series}
colorFallback="#157CFF"
dualLineColors={["#9fb6ff", "#4d4ef3"]}
density="default"
dualLineColors={["var(--graph-0,#9fb6ff)", "var(--graph-1,#4d4ef3)"]}
/>
</ResponsiveContainer>
</div>
<div className="mt-[12px] flex items-center gap-[10px] text-center justify-center text-[24px] tracking-[-0.03em] text-[#157CFF]">
<span className="h-[12px] w-[12px] rounded-full bg-[#157CFF]" />
<div
className="mt-[12px] flex items-center gap-[10px] text-center justify-center text-[24px] tracking-[-0.03em] text-[#157CFF]"
style={{ color: "var(--primary-color,#157CFF)" }}
>
<span
className="h-[12px] w-[12px] rounded-full bg-[#157CFF]"
style={{ backgroundColor: "var(--primary-color,#157CFF)" }}
/>
<p>{data.legendLabel}</p>
</div>
</div>

View file

@ -52,14 +52,23 @@ const DataAnalysisListSlide = ({ data }: { data: Partial<SchemaType> }) => {
const { title, itemIcon, items } = data;
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]">
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]"
style={{
backgroundColor: "var(--background-color,#f9f8f8)",
fontFamily: "var(--body-font-family,Nunito Sans)",
}}
>
<div
className="absolute left-0 top-0 w-[42px] rounded-b-[22px] bg-[#157CFF]"
style={{ height: 185 }}
style={{ height: 185, backgroundColor: "var(--primary-color,#157CFF)" }}
/>
<div className="px-[58px] pt-[52px]">
<h2 className="text-[80px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]">
<h2
className="text-[80px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]"
style={{ color: "var(--background-text,#232223)" }}
>
{title}
</h2>
</div>
@ -68,7 +77,13 @@ const DataAnalysisListSlide = ({ data }: { data: Partial<SchemaType> }) => {
{items?.map((item, index) => (
<div key={`${item.title}-${index}`}>
<div className="flex items-center gap-[14px]">
<div className="flex h-[55px] w-[55px] items-center justify-center rounded-full bg-[#157CFF] text-white">
<div
className="flex h-[55px] w-[55px] items-center justify-center rounded-full bg-[#157CFF] text-white"
style={{
backgroundColor: "var(--primary-color,#157CFF)",
color: "var(--primary-text,#ffffff)",
}}
>
<img
src={itemIcon?.__icon_url__}
alt={itemIcon?.__icon_query__}
@ -76,11 +91,17 @@ const DataAnalysisListSlide = ({ data }: { data: Partial<SchemaType> }) => {
style={{ filter: "brightness(0) invert(1)" }}
/>
</div>
<h3 className="text-[20px] font-medium tracking-[2.074px] text-[#232223]">
<h3
className="text-[20px] font-medium tracking-[2.074px] text-[#232223]"
style={{ color: "var(--background-text,#232223)" }}
>
{item.title}
</h3>
</div>
<p className="mt-5 max-w-[420px] text-[24px] leading-[26.667px] text-[#232223]">
<p
className="mt-5 max-w-[420px] text-[24px] leading-[26.667px] text-[#232223]"
style={{ color: "var(--background-text,#232223)" }}
>
{item.description}
</p>
</div>

View file

@ -15,24 +15,43 @@ const IntroSlide = ({ data }: { data: Partial<SchemaType> }) => {
const { title, subtitle, name, position } = data;
return (
<div className='relative w-[1280px] h-[720px] aspect-video flex flex-col justify-center items-center'>
<div
className='relative w-[1280px] h-[720px] aspect-video flex flex-col justify-center items-center bg-white'
style={{
backgroundColor: "var(--background-color,#ffffff)",
fontFamily: "var(--body-font-family,Nunito Sans)",
}}
>
<svg className="absolute top-0 left-10" xmlns="http://www.w3.org/2000/svg" width="116" height="251" viewBox="0 0 116 251" fill="none">
<path d="M0 0H44.6667V228.333C44.6667 240.668 34.6677 250.667 22.3333 250.667C9.99898 250.667 0 240.668 0 228.333V0Z" fill="#147CFE" />
<path d="M71.3334 0H116V163C116 175.334 106.001 185.333 93.6667 185.333C81.3324 185.333 71.3334 175.334 71.3334 163V0Z" fill="#147CFE" />
<path d="M0 0H44.6667V228.333C44.6667 240.668 34.6677 250.667 22.3333 250.667C9.99898 250.667 0 240.668 0 228.333V0Z" fill="var(--primary-color,#147CFE)" />
<path d="M71.3334 0H116V163C116 175.334 106.001 185.333 93.6667 185.333C81.3324 185.333 71.3334 175.334 71.3334 163V0Z" fill="var(--primary-color,#147CFE)" />
</svg>
<svg className="absolute bottom-0 right-10 rotate-180" xmlns="http://www.w3.org/2000/svg" width="116" height="251" viewBox="0 0 116 251" fill="none">
<path d="M0 0H44.6667V228.333C44.6667 240.668 34.6677 250.667 22.3333 250.667C9.99898 250.667 0 240.668 0 228.333V0Z" fill="#147CFE" />
<path d="M71.3334 0H116V163C116 175.334 106.001 185.333 93.6667 185.333C81.3324 185.333 71.3334 175.334 71.3334 163V0Z" fill="#147CFE" />
<path d="M0 0H44.6667V228.333C44.6667 240.668 34.6677 250.667 22.3333 250.667C9.99898 250.667 0 240.668 0 228.333V0Z" fill="var(--primary-color,#147CFE)" />
<path d="M71.3334 0H116V163C116 175.334 106.001 185.333 93.6667 185.333C81.3324 185.333 71.3334 175.334 71.3334 163V0Z" fill="var(--primary-color,#147CFE)" />
</svg>
<div>
<h1 className="text-[#232223] text-[133px] italic text-center font-bold capitalize tracking-[-2.8px]">{title}</h1>
<p className="text-[#232223] text-[93px] text-center font-medium capitalize tracking-[-2.8px]">{subtitle}</p>
<h1
className="text-[#232223] text-[133px] italic text-center font-bold capitalize tracking-[-2.8px]"
style={{ color: "var(--background-text,#232223)" }}
>
{title}
</h1>
<p
className="text-[#232223] text-[93px] text-center font-medium capitalize tracking-[-2.8px]"
style={{ color: "var(--background-text,#232223)" }}
>
{subtitle}
</p>
</div>
<div className="bg-[#CD7721] w-[67px] h-0.5 my-[78px]" />
<div
className="bg-[#CD7721] w-[67px] h-0.5 my-[78px]"
style={{ backgroundColor: "var(--graph-2,#CD7721)" }}
/>
<div className="text-center">
<h4 className="text-[#232223] text-[40px] pb-4">{name}</h4>
<p className="text-[19px] text-[#232223]">{position}</p>
<h4 className="text-[#232223] text-[40px] pb-4" style={{ color: "var(--background-text,#232223)" }}>{name}</h4>
<p className="text-[19px] text-[#232223]" style={{ color: "var(--background-text,#232223)" }}>{position}</p>
</div>
</div>

View file

@ -45,25 +45,37 @@ const IntroductionImageSlide = ({ data }: { data: Partial<SchemaType> }) => {
const { title, body, bullets, featureImage } = data;
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]">
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]"
style={{
backgroundColor: "var(--background-color,#f9f8f8)",
fontFamily: "var(--body-font-family,Nunito Sans)",
}}
>
<div
className="absolute left-0 top-0 w-[42px] rounded-b-[22px] bg-[#157CFF]"
style={{ height: 185 }}
style={{ height: 185, backgroundColor: "var(--primary-color,#157CFF)" }}
/>
<div className="px-[74px] pt-[76px]">
<h2 className="text-[80px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]">
<h2
className="text-[80px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]"
style={{ color: "var(--background-text,#232223)" }}
>
{title}
</h2>
</div>
<div className="flex gap-28 pl-[96px] pt-[30px]">
<div className="flex flex-col">
<p className=" text-[24px] leading-[26.667px] text-[#232223]">
<p className=" text-[24px] leading-[26.667px] text-[#232223]" style={{ color: "var(--background-text,#232223)" }}>
{body}
</p>
<ul className="mt-8 list-disc pl-[28px] text-[24px] leading-[26.667px] text-[#232223]">
<ul
className="mt-8 list-disc pl-[28px] text-[24px] leading-[26.667px] text-[#232223]"
style={{ color: "var(--background-text,#232223)" }}
>
{bullets?.map((bullet, index) => (
<li key={`${bullet}-${index}`} className="mt-[8px]">
{bullet}
@ -73,7 +85,10 @@ const IntroductionImageSlide = ({ data }: { data: Partial<SchemaType> }) => {
</div>
<div className="flex flex-1 items-end justify-end">
<div className="h-[397px] w-[582px] overflow-hidden rounded-l-[106px] bg-[#157CFF]">
<div
className="h-[397px] w-[582px] overflow-hidden rounded-l-[106px] bg-[#157CFF]"
style={{ backgroundColor: "var(--primary-color,#157CFF)" }}
>
<img
src={featureImage?.__image_url__}
alt={featureImage?.__image_prompt__}

View file

@ -87,7 +87,13 @@ function StatPill({
return (
<div className=" h-[438px] w-[248px] overflow-hidden rounded-[127px] bg-[#157CFF] px-[28px] py-[74px] text-center text-white">
<div
className=" h-[438px] w-[248px] overflow-hidden rounded-[127px] bg-[#157CFF] px-[28px] py-[74px] text-center text-white"
style={{
backgroundColor: "var(--primary-color,#157CFF)",
color: "var(--primary-text,#ffffff)",
}}
>
{metrics.map((metric, index) => (
<Fragment key={`${metric.value}-${metric.label}-${index}`}>
@ -99,14 +105,20 @@ function StatPill({
{metric.value}
</p>
<p className="mt-[6px] text-[20px] font-medium leading-none">{metric.label}</p>
<p className=" text-[20px] leading-[1.15] text-white/90">
<p className=" text-[20px] leading-[1.15] text-white/90" style={{ color: "var(--primary-text,#ffffff)", opacity: 0.9 }}>
{metric.description}
</p>
</div>
{index === 0 && <div className="py-[22px]">
<svg xmlns="http://www.w3.org/2000/svg" width="181" height="1" viewBox="0 0 181 1" fill="none">
<path opacity="0.2" d="M0 0.487305H180.122" stroke="white" strokeWidth="0.974913" strokeDasharray="3.9 1.95" />
<path
opacity="0.2"
d="M0 0.487305H180.122"
stroke="var(--primary-text,#ffffff)"
strokeWidth="0.974913"
strokeDasharray="3.9 1.95"
/>
</svg>
</div>
}
@ -123,25 +135,37 @@ const IntroductionStatsSlide = ({ data }: { data: Partial<SchemaType> }) => {
const { title, body, bullets, statColumns } = data;
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]">
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]"
style={{
backgroundColor: "var(--background-color,#f9f8f8)",
fontFamily: "var(--body-font-family,Nunito Sans)",
}}
>
<div
className="absolute left-0 top-0 w-[42px] rounded-b-[22px] bg-[#157CFF]"
style={{ height: 185 }}
style={{ height: 185, backgroundColor: "var(--primary-color,#157CFF)" }}
/>
<div className="px-[64px] pt-[48px]">
<h2 className="text-[80px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]">
<h2
className="text-[80px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]"
style={{ color: "var(--background-text,#232223)" }}
>
{title}
</h2>
</div>
<div className="flex justify-between px-[96px] pt-[38px]">
<div className="">
<p className="max-w-[400px] text-[24px] leading-[26.667px] text-[#232223]">
<p className="max-w-[400px] text-[24px] leading-[26.667px] text-[#232223]" style={{ color: "var(--background-text,#232223)" }}>
{body}
</p>
<ul className="mt-[34px] list-disc pl-[28px] text-[24px] leading-[26.667px] text-[#232223]">
<ul
className="mt-[34px] list-disc pl-[28px] text-[24px] leading-[26.667px] text-[#232223]"
style={{ color: "var(--background-text,#232223)" }}
>
{bullets?.map((bullet, index) => (
<li key={`${bullet}-${index}`} className="mt-[8px]">
{bullet}

View file

@ -66,14 +66,23 @@ const MilestoneSlide = ({ data }: { data: Partial<SchemaType> }) => {
const { title, activeIndex, items } = data;
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#F9F8F8]">
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#F9F8F8]"
style={{
backgroundColor: "var(--background-color,#F9F8F8)",
fontFamily: "var(--body-font-family,Nunito Sans)",
}}
>
<div
className="absolute left-0 top-0 w-[42px] rounded-b-[22px] bg-[#157CFF]"
style={{ height: 185 }}
style={{ height: 185, backgroundColor: "var(--primary-color,#157CFF)" }}
/>
<div className="px-[70px] pt-[56px]">
<h2 className="text-[80px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]">
<h2
className="text-[80px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]"
style={{ color: "var(--background-text,#232223)" }}
>
{title}
</h2>
</div>
@ -91,17 +100,29 @@ const MilestoneSlide = ({ data }: { data: Partial<SchemaType> }) => {
? "z-10 bg-[#157CFF] text-white"
: "border border-[#157CFF] bg-white text-[#157CFE]"
} ${index > 0 ? "ml-[-45px]" : ""} `}
style={{
backgroundColor: isActive ? "var(--primary-color,#157CFF)" : "var(--card-color,#ffffff)",
borderColor: "var(--primary-color,#157CFF)",
color: isActive ? "var(--primary-text,#ffffff)" : "var(--primary-color,#157CFE)",
}}
>
<span className={`${isActive ? "text-white" : "text-[#157CFF]"} text-[42px] font-medium tracking-[0.18em]`}>
<span
className={`${isActive ? "text-white" : "text-[#157CFF]"} text-[42px] font-medium tracking-[0.18em]`}
style={{ color: isActive ? "var(--primary-text,#ffffff)" : "var(--primary-color,#157CFF)" }}
>
{item.stepNumber}
</span>
</div>
<div key={`${item.heading}-${index}`} className={`text-center mt-[20px] text-[#232223] ${index > 0 ? 'pr-[33px]' : ''} ${index === 0 ? 'px-[33px]' : ''}`}>
<h3 className="text-[20px] text-[#232223] font-medium tracking-[2.074px]">
<div
key={`${item.heading}-${index}`}
className={`text-center mt-[20px] text-[#232223] ${index > 0 ? 'pr-[33px]' : ''} ${index === 0 ? 'px-[33px]' : ''}`}
style={{ color: "var(--background-text,#232223)" }}
>
<h3 className="text-[20px] text-[#232223] font-medium tracking-[2.074px]" style={{ color: "var(--background-text,#232223)" }}>
{item.heading}
</h3>
<p className="mt-[6px] text-[24px] leading-[26.667px] text-[#232223]">
<p className="mt-[6px] text-[24px] leading-[26.667px] text-[#232223]" style={{ color: "var(--background-text,#232223)" }}>
{item.description}
</p>
</div>

View file

@ -80,7 +80,13 @@ function StatPill({
return (
<div className=" h-[438px] w-[248px] overflow-hidden rounded-[127px] bg-[#157CFF] px-[28px] py-[74px] text-center text-white">
<div
className=" h-[438px] w-[248px] overflow-hidden rounded-[127px] bg-[#157CFF] px-[28px] py-[74px] text-center text-white"
style={{
backgroundColor: "var(--primary-color,#157CFF)",
color: "var(--primary-text,#ffffff)",
}}
>
{metrics.map((metric, index) => (
<Fragment key={`${metric.value}-${metric.label}-${index}`}>
@ -92,14 +98,20 @@ function StatPill({
{metric.value}
</p>
<p className="mt-[6px] text-[20px] font-medium leading-none">{metric.label}</p>
<p className=" text-[20px] leading-[1.15] text-white/90">
<p className=" text-[20px] leading-[1.15] text-white/90" style={{ color: "var(--primary-text,#ffffff)", opacity: 0.9 }}>
{metric.description}
</p>
</div>
{index === 0 && <div className="py-[22px]">
<svg xmlns="http://www.w3.org/2000/svg" width="181" height="1" viewBox="0 0 181 1" fill="none">
<path opacity="0.2" d="M0 0.487305H180.122" stroke="white" strokeWidth="0.974913" strokeDasharray="3.9 1.95" />
<path
opacity="0.2"
d="M0 0.487305H180.122"
stroke="var(--primary-text,#ffffff)"
strokeWidth="0.974913"
strokeDasharray="3.9 1.95"
/>
</svg>
</div>
}
@ -115,14 +127,23 @@ const PerformanceSnapshotSlide = ({ data }: { data: Partial<SchemaType> }) => {
const { title, columns } = data;
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]">
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]"
style={{
backgroundColor: "var(--background-color,#f9f8f8)",
fontFamily: "var(--body-font-family,Nunito Sans)",
}}
>
<div
className="absolute left-0 top-0 w-[42px] rounded-b-[22px] bg-[#157CFF]"
style={{ height: 185 }}
style={{ height: 185, backgroundColor: "var(--primary-color,#157CFF)" }}
/>
<div className="px-[64px] pt-[48px]">
<h2 className="text-[80px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]">
<h2
className="text-[80px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]"
style={{ color: "var(--background-text,#232223)" }}
>
{title}
</h2>
</div>

View file

@ -108,14 +108,23 @@ const ServicesSlide = ({ data }: { data: Partial<SchemaType> }) => {
const { title, activeIndex, items } = data;
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]">
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#f9f8f8]"
style={{
backgroundColor: "var(--background-color,#f9f8f8)",
fontFamily: "var(--body-font-family,Nunito Sans)",
}}
>
<div
className="absolute left-0 top-0 w-[42px] rounded-b-[22px] bg-[#157CFF]"
style={{ height: 185 }}
style={{ height: 185, backgroundColor: "var(--primary-color,#157CFF)" }}
/>
<div className="px-[70px] pt-[56px]">
<h2 className="text-[80px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]">
<h2
className="text-[80px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]"
style={{ color: "var(--background-text,#232223)" }}
>
{title}
</h2>
</div>
@ -135,6 +144,9 @@ const ServicesSlide = ({ data }: { data: Partial<SchemaType> }) => {
style={{
width: items?.length === 3 ? '266px' : items?.length === 4 ? '192px' : items?.length === 5 ? '157px' : '266px',
height: items?.length === 3 ? '266px' : items?.length === 4 ? '192px' : items?.length === 5 ? '157px' : '270px',
backgroundColor: isActive ? "var(--primary-color,#157CFF)" : "transparent",
borderColor: "var(--primary-color,#157CFF)",
color: isActive ? "var(--primary-text,#ffffff)" : "var(--primary-color,#157CFE)",
}}
>
<ServiceGlyph
@ -148,16 +160,20 @@ const ServicesSlide = ({ data }: { data: Partial<SchemaType> }) => {
/>
</div>
<h3 className="mt-[18px] text-[26px] font-medium tracking-[0.08em] text-[#232223]"
<h3
className="mt-[18px] text-[26px] font-medium tracking-[0.08em] text-[#232223]"
style={{
fontSize: items?.length === 3 ? '20px' : items?.length === 4 ? '16px' : items?.length === 5 ? '12px' : '20px',
color: "var(--background-text,#232223)",
}}
>
{item.heading}
</h3>
<p className="mt-[12px] max-w-[290px] text-[18px] leading-[1.08] tracking-[-0.04em] text-[#353538]"
<p
className="mt-[12px] max-w-[290px] text-[18px] leading-[1.08] tracking-[-0.04em] text-[#353538]"
style={{
fontSize: items?.length === 3 ? '24px' : items?.length === 4 ? '17px' : items?.length === 5 ? '14px' : '24px',
color: "var(--background-text,#353538)",
}}
>
{item.description}
@ -194,7 +210,10 @@ const ServicesSlide = ({ data }: { data: Partial<SchemaType> }) => {
width: items?.length === 3 ? '117px' : items?.length === 4 ? '84px' : items?.length === 5 ? '60px' : '112px',
}}
height="15" viewBox="0 0 119 15" fill="none">
<path d="M1 6.36401H0V8.36401H1V7.36401V6.36401ZM118.707 8.07112C119.098 7.6806 119.098 7.04743 118.707 6.65691L112.343 0.292946C111.953 -0.0975785 111.319 -0.0975785 110.929 0.292946C110.538 0.68347 110.538 1.31664 110.929 1.70716L116.586 7.36401L110.929 13.0209C110.538 13.4114 110.538 14.0446 110.929 14.4351C111.319 14.8256 111.953 14.8256 112.343 14.4351L118.707 8.07112ZM1 7.36401V8.36401H118V7.36401V6.36401H1V7.36401Z" fill="#157CFE" />
<path
d="M1 6.36401H0V8.36401H1V7.36401V6.36401ZM118.707 8.07112C119.098 7.6806 119.098 7.04743 118.707 6.65691L112.343 0.292946C111.953 -0.0975785 111.319 -0.0975785 110.929 0.292946C110.538 0.68347 110.538 1.31664 110.929 1.70716L116.586 7.36401L110.929 13.0209C110.538 13.4114 110.538 14.0446 110.929 14.4351C111.319 14.8256 111.953 14.8256 112.343 14.4351L118.707 8.07112ZM1 7.36401V8.36401H118V7.36401V6.36401H1V7.36401Z"
fill="var(--primary-color,#157CFE)"
/>
</svg>
</div>
)}

View file

@ -70,7 +70,13 @@ function SolutionCard({
description: string;
}) {
return (
<div className="flex py-[60px] px-10 w-[312px] flex-col items-center justify-center rounded-[160px] bg-[#4d4ef3] text-center text-white">
<div
className="flex py-[60px] px-10 w-[312px] flex-col items-center justify-center rounded-[160px] bg-[#4d4ef3] text-center text-white"
style={{
backgroundColor: "var(--graph-1,#4d4ef3)",
color: "var(--primary-text,#ffffff)",
}}
>
<p className="text-[42px] font-medium tracking-[8.709px]">{stepNumber}</p>
<p className="mt-[27px] text-[27px] min-h-[200px] ">
{description}
@ -84,14 +90,23 @@ const SolutionSlide = ({ data }: SolutionSlideProps) => {
const visibleCards = showImage ? cards?.slice(0, 2) : cards;
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#F9F8F8]">
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-[#F9F8F8]"
style={{
backgroundColor: "var(--background-color,#F9F8F8)",
fontFamily: "var(--body-font-family,Nunito Sans)",
}}
>
<div className="absolute left-0 top-0 w-[42px] rounded-b-[22px] bg-[#157CFF]"
style={{ height: 185 }}
style={{ height: 185, backgroundColor: "var(--primary-color,#157CFF)" }}
/>
<div className="relative z-10 h-full py-[58px]">
{title && (
<h2 className="text-[80px] px-[64px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]">
<h2
className="text-[80px] px-[64px] font-bold leading-[108.4%] tracking-[-2.419px] text-[#232223]"
style={{ color: "var(--background-text,#232223)" }}
>
{title}
</h2>
)}
@ -100,7 +115,10 @@ const SolutionSlide = ({ data }: SolutionSlideProps) => {
{showImage ? (
<div className="flex items-start gap-[40px]">
{featureImage?.__image_url__ && (
<div className="h-[396px] w-[534px] shrink-0 overflow-hidden rounded-r-[90px] bg-[#ece8dd]">
<div
className="h-[396px] w-[534px] shrink-0 overflow-hidden rounded-r-[90px] bg-[#ece8dd]"
style={{ backgroundColor: "var(--card-color,#ece8dd)" }}
>
<img
src={featureImage?.__image_url__}
alt={featureImage?.__image_prompt__}

View file

@ -79,7 +79,13 @@ export type SchemaType = z.infer<typeof Schema>;
const TeamSlide = ({ data }: { data: Partial<SchemaType> }) => {
return (
<div className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-white">
<div
className="relative h-[720px] w-[1280px] overflow-hidden rounded-[24px] bg-white"
style={{
backgroundColor: "var(--background-color,#ffffff)",
fontFamily: "var(--body-font-family,Nunito Sans)",
}}
>
<div className="grid h-full "
style={{ gridTemplateColumns: `repeat(${data?.members?.length}, minmax(0, 1fr))` }}
>
@ -93,9 +99,19 @@ const TeamSlide = ({ data }: { data: Partial<SchemaType> }) => {
alt={member.image.__image_prompt__}
className="h-full w-full object-cover"
/>
<div className="absolute inset-x-0 bottom-0 h-[240px] bg-gradient-to-t from-[#4d4ef3] via-[#4d4ef3]/55 to-transparent" />
<div className="absolute left-0 bottom-0 p-[33px] text-white">
<p className="text-[21px] tracking-[2.074px] font-medium text-white/90">{member.title}</p>
<div
className="absolute inset-x-0 bottom-0 h-[240px] bg-gradient-to-t from-[#4d4ef3] via-[#4d4ef3]/55 to-transparent"
style={{
backgroundImage: "linear-gradient(to top, var(--graph-1,#4d4ef3), rgba(77, 78, 243, 0.55), transparent)",
}}
/>
<div className="absolute left-0 bottom-0 p-[33px] text-white" style={{ color: "var(--primary-text,#ffffff)" }}>
<p
className="text-[21px] tracking-[2.074px] font-medium text-white/90"
style={{ color: "var(--primary-text,#ffffff)", opacity: 0.9 }}
>
{member.title}
</p>
<p className="mt-[14px] text-[28px] ">
{member.name}
</p>

View file

@ -249,7 +249,7 @@ export function normalizeFlexibleChartData(
return { data: mapped, series };
}
const graphVar = (index: number, fallback: string) => `var(--graph-${index % 8}, ${fallback})`;
const graphVar = (index: number, fallback: string) => `var(--graph-${index % 10}, ${fallback})`;
export type ChartDensity = "default" | "compact";
@ -269,7 +269,7 @@ export function FlexibleReportChart({
data: chartData,
series = [],
colorFallback = "#157CFF",
dualLineColors = ["#9fb6ff", "#4d4ef3"],
dualLineColors = ["var(--graph-0,#9fb6ff)", "var(--graph-1,#4d4ef3)"],
density = "default",
}: FlexibleReportChartProps) {
const areaGradientId = `flex-area-${useId().replace(/:/g, "")}`;
@ -352,25 +352,24 @@ export function FlexibleReportChart({
const nm = String(name ?? "");
const short = nm.length <= ui.pieMaxNameLen;
const pct = `${(percent * 100).toFixed(0)}%`;
const fontSize = compact ? (short ? 6 : 5) : short ? 10 : 9;
const fontSize = compact ? (short ? 6 : 5) : short ? 12 : 12;
const labelText = compact ? pct : short ? `${name} ${pct}` : pct;
return (
<text
x={x}
y={y}
textAnchor="middle"
dominantBaseline="central"
fill="#ffffff"
fontSize={fontSize}
fontWeight={600}
style={{
paintOrder: "stroke fill",
stroke: "rgba(0,0,0,0.28)",
strokeWidth: compact ? 1 : 2,
}}
>
{labelText}
</text>
<g>
{/* <circle cx={x} cy={y} fill="var(--card-color,#ECEAF8)" /> */}
<text
x={x}
y={y}
style={{ padding: "4px" }}
textAnchor="middle"
fill="var(--background-text,#2C2B39)"
fontSize={fontSize}
fontWeight={600}
>
{labelText}
</text>
</g>
);
};
@ -399,7 +398,7 @@ export function FlexibleReportChart({
<LabelList
dataKey="value"
position="top"
fill={colorFallback}
fill={graphVar(0, colorFallback)}
fontSize={ui.labelFs}
offset={ui.labelOffTop}
/>
@ -425,7 +424,13 @@ export function FlexibleReportChart({
axisLine={false}
/>
<Bar dataKey="value" barSize={ui.barSize} fill={graphVar(0, colorFallback)} radius={[...ui.barRadiusH]}>
<LabelList dataKey="value" position="right" fill={colorFallback} fontSize={ui.labelFs} offset={ui.labelOffSide} />
<LabelList
dataKey="value"
position="right"
fill={graphVar(0, colorFallback)}
fontSize={ui.labelFs}
offset={ui.labelOffSide}
/>
</Bar>
</BarChart>
</ResponsiveContainer>
@ -629,7 +634,7 @@ export function FlexibleReportChart({
tickLine={false}
axisLine={false}
/>
<ReferenceLine x={0} stroke="#9CA3AF" strokeWidth={1} />
<ReferenceLine x={0} stroke="var(--stroke,#9CA3AF)" strokeWidth={1} />
<Bar dataKey="positive" barSize={ui.barSize} fill={graphVar(0, colorFallback)} stackId="stack" radius={[...ui.barRadiusH]}>
<LabelList dataKey="positive" position="right" fill={graphVar(0, colorFallback)} fontSize={ui.labelFs} offset={ui.labelOffSide} />
</Bar>

View file

@ -36,7 +36,7 @@ import CoverSlide, { Schema as PoCoverSchema, slideLayoutId as PoCoverId, slideL
import ImageGallerySlide, { Schema as PoImageGallerySchema, slideLayoutId as PoImageGalleryId, slideLayoutName as PoImageGalleryName, slideLayoutDescription as PoImageGalleryDesc } from "./ProductOverview/ImageGallerySlide";
import IntroductionSlide, { Schema as PoIntroductionSchema, slideLayoutId as PoIntroductionId, slideLayoutName as PoIntroductionName, slideLayoutDescription as PoIntroductionDesc } from "./ProductOverview/IntroductionSlide";
import KpiCardsSlide, { Schema as PoKpiCardsSchema, slideLayoutId as PoKpiCardsId, slideLayoutName as PoKpiCardsName, slideLayoutDescription as PoKpiCardsDesc } from "./ProductOverview/KpiCardsSlide";
import MarketOpportunitySlide, { Schema as PoMarketOpportunitySchema, slideLayoutId as PoMarketOpportunityId, slideLayoutName as PoMarketOpportunityName, slideLayoutDescription as PoMarketOpportunityDesc } from "./ProductOverview/MarketOpportunitySlide";
// import MarketOpportunitySlide, { Schema as PoMarketOpportunitySchema, slideLayoutId as PoMarketOpportunityId, slideLayoutName as PoMarketOpportunityName, slideLayoutDescription as PoMarketOpportunityDesc } from "./ProductOverview/MarketOpportunitySlide";
import MeetTeamSlide, { Schema as PoMeetTeamSchema, slideLayoutId as PoMeetTeamId, slideLayoutName as PoMeetTeamName, slideLayoutDescription as PoMeetTeamDesc } from "./ProductOverview/MeetTeamSlide";
import MissionVisionSlide, { Schema as PoMissionVisionSchema, slideLayoutId as PoMissionVisionId, slideLayoutName as PoMissionVisionName, slideLayoutDescription as PoMissionVisionDesc } from "./ProductOverview/MissionVisionSlide";
import OurServicesSlide, { Schema as PoOurServicesSchema, slideLayoutId as PoOurServicesId, slideLayoutName as PoOurServicesName, slideLayoutDescription as PoOurServicesDesc } from "./ProductOverview/OurServicesSlide";
@ -274,7 +274,7 @@ export const productOverviewTemplates: TemplateWithData[] = [
createTemplateEntry(TableOfContentSlide, PoTableOfContentSchema, PoTableOfContentId, PoTableOfContentName, PoTableOfContentDesc, "product-overview", "TableOfContentSlide"),
createTemplateEntry(IntroductionSlide, PoIntroductionSchema, PoIntroductionId, PoIntroductionName, PoIntroductionDesc, "product-overview", "IntroductionSlide"),
createTemplateEntry(MissionVisionSlide, PoMissionVisionSchema, PoMissionVisionId, PoMissionVisionName, PoMissionVisionDesc, "product-overview", "MissionVisionSlide"),
createTemplateEntry(MarketOpportunitySlide, PoMarketOpportunitySchema, PoMarketOpportunityId, PoMarketOpportunityName, PoMarketOpportunityDesc, "product-overview", "MarketOpportunitySlide"),
// createTemplateEntry(MarketOpportunitySlide, PoMarketOpportunitySchema, PoMarketOpportunityId, PoMarketOpportunityName, PoMarketOpportunityDesc, "product-overview", "MarketOpportunitySlide"),
createTemplateEntry(BusinessChallengesGridSlide, PoBizChallengesGridSchema, PoBizChallengesGridId, PoBizChallengesGridName, PoBizChallengesGridDesc, "product-overview", "BusinessChallengesGridSlide"),
createTemplateEntry(BusinessChallengesCardsSlide, PoBizChallengesCardsSchema, PoBizChallengesCardsId, PoBizChallengesCardsName, PoBizChallengesCardsDesc, "product-overview", "BusinessChallengesCardsSlide"),
createTemplateEntry(OurServicesSlide, PoOurServicesSchema, PoOurServicesId, PoOurServicesName, PoOurServicesDesc, "product-overview", "OurServicesSlide"),