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