From 996852a506769cdb31f2eac28ce0bf3b4238e90c Mon Sep 17 00:00:00 2001 From: Dries Augustyns Date: Fri, 19 Dec 2025 19:20:30 +0100 Subject: [PATCH] chore: Additional pages --- apps/landing/src/components/CodeBlock.tsx | 32 ++ .../src/components/ComparisonTable.tsx | 80 ++++ apps/landing/src/components/FAQSection.tsx | 71 +++ .../src/components/PricingCalculator.tsx | 111 +++++ apps/landing/src/components/index.ts | 4 + apps/landing/src/pages/index.tsx | 132 +++++- apps/landing/src/pages/vs/customerio.tsx | 417 +++++++++++++++++ apps/landing/src/pages/vs/mailchimp.tsx | 414 +++++++++++++++++ apps/landing/src/pages/vs/mailgun.tsx | 415 +++++++++++++++++ apps/landing/src/pages/vs/resend.tsx | 415 +++++++++++++++++ apps/landing/src/pages/vs/sendgrid.tsx | 421 ++++++++++++++++++ 11 files changed, 2510 insertions(+), 2 deletions(-) create mode 100644 apps/landing/src/components/CodeBlock.tsx create mode 100644 apps/landing/src/components/ComparisonTable.tsx create mode 100644 apps/landing/src/components/FAQSection.tsx create mode 100644 apps/landing/src/components/PricingCalculator.tsx create mode 100644 apps/landing/src/pages/vs/customerio.tsx create mode 100644 apps/landing/src/pages/vs/mailchimp.tsx create mode 100644 apps/landing/src/pages/vs/mailgun.tsx create mode 100644 apps/landing/src/pages/vs/resend.tsx create mode 100644 apps/landing/src/pages/vs/sendgrid.tsx diff --git a/apps/landing/src/components/CodeBlock.tsx b/apps/landing/src/components/CodeBlock.tsx new file mode 100644 index 0000000..a2644ef --- /dev/null +++ b/apps/landing/src/components/CodeBlock.tsx @@ -0,0 +1,32 @@ +import {motion} from 'framer-motion'; +import React from 'react'; + +interface CodeBlockProps { + code: string; + language?: string; + title?: string; +} + +/** + * Reusable code block component with syntax highlighting styling + */ +export function CodeBlock({code, language = 'javascript', title}: CodeBlockProps) { + return ( + + {title && ( +
+ {title} +
+ )} +
+        {code}
+      
+
+ ); +} diff --git a/apps/landing/src/components/ComparisonTable.tsx b/apps/landing/src/components/ComparisonTable.tsx new file mode 100644 index 0000000..558d935 --- /dev/null +++ b/apps/landing/src/components/ComparisonTable.tsx @@ -0,0 +1,80 @@ +import {Check, X} from 'lucide-react'; +import {motion} from 'framer-motion'; +import React from 'react'; + +export interface ComparisonRow { + feature: string; + plunk: boolean | string; + competitor: boolean | string; +} + +interface ComparisonTableProps { + competitorName: string; + rows: ComparisonRow[]; +} + +/** + * Reusable comparison table component for competitor pages + */ +export function ComparisonTable({competitorName, rows}: ComparisonTableProps) { + return ( +
+ {/* Header */} +
+
+ Feature +
+
+ Plunk +
+
+ {competitorName} +
+
+ + {/* Rows */} +
+ {rows.map((row, index) => ( + +
+ {row.feature} +
+
+
+ {typeof row.plunk === 'boolean' ? ( + row.plunk ? ( + + ) : ( + + ) + ) : ( + {row.plunk} + )} +
+
+
+
+ {typeof row.competitor === 'boolean' ? ( + row.competitor ? ( + + ) : ( + + ) + ) : ( + {row.competitor} + )} +
+
+
+ ))} +
+
+ ); +} diff --git a/apps/landing/src/components/FAQSection.tsx b/apps/landing/src/components/FAQSection.tsx new file mode 100644 index 0000000..cca2bcd --- /dev/null +++ b/apps/landing/src/components/FAQSection.tsx @@ -0,0 +1,71 @@ +import {motion} from 'framer-motion'; +import Script from 'next/script'; +import React from 'react'; + +export interface FAQ { + question: string; + answer: string; +} + +interface FAQSectionProps { + faqs: FAQ[]; + schemaId?: string; +} + +/** + * Reusable FAQ section component with structured data support + */ +export function FAQSection({faqs, schemaId = 'faq-schema'}: FAQSectionProps) { + return ( + <> +