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 ( + <> +