kofi-stack-template-generator 2.1.51 → 2.1.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +6 -6
- package/dist/index.js +1906 -146
- package/package.json +2 -2
- package/src/generator.ts +9 -0
- package/src/templates.generated.ts +51 -5
- package/templates/marketing/astro/astro.config.ts.hbs +12 -0
- package/templates/marketing/astro/package.json.hbs +31 -0
- package/templates/marketing/astro/postcss.config.mjs.hbs +5 -0
- package/templates/marketing/astro/public/favicon.svg +4 -0
- package/templates/marketing/astro/public/media/hero-bg.png +1 -0
- package/templates/marketing/astro/src/components/Footer.astro +167 -0
- package/templates/marketing/astro/src/components/Header.astro +378 -0
- package/templates/marketing/astro/src/components/Logo.astro +30 -0
- package/templates/marketing/astro/src/components/ThemeSelector.astro +64 -0
- package/templates/marketing/astro/src/components/blocks/BentoFeatures.astro +209 -0
- package/templates/marketing/astro/src/components/blocks/FeatureShowcase.astro +102 -0
- package/templates/marketing/astro/src/components/blocks/FinalCTA.astro +82 -0
- package/templates/marketing/astro/src/components/blocks/IndustryTabs.astro +177 -0
- package/templates/marketing/astro/src/components/blocks/LogoBanner.astro +95 -0
- package/templates/marketing/astro/src/components/blocks/PricingTable.astro +176 -0
- package/templates/marketing/astro/src/components/blocks/ProofBanner.astro +56 -0
- package/templates/marketing/astro/src/components/blocks/TestimonialsGrid.astro +106 -0
- package/templates/marketing/astro/src/components/blocks/TrustColumns.astro +88 -0
- package/templates/marketing/astro/src/components/heros/AnimatedMockup.astro +711 -0
- package/templates/marketing/astro/src/components/heros/ProductShowcaseHero.astro +111 -0
- package/templates/marketing/astro/src/layouts/Layout.astro +37 -0
- package/templates/marketing/astro/src/lib/utils.ts +6 -0
- package/templates/marketing/astro/src/pages/index.astro +163 -0
- package/templates/marketing/astro/src/styles/globals.css.hbs +353 -0
- package/templates/marketing/astro/tsconfig.json.hbs +11 -0
- package/templates/marketing/nextjs/package.json.hbs +6 -1
- package/templates/marketing/nextjs/src/app/layout.tsx.hbs +19 -5
- package/templates/marketing/nextjs/src/app/page.tsx.hbs +160 -164
- package/templates/marketing/nextjs/src/components/Footer/index.tsx +188 -0
- package/templates/marketing/nextjs/src/components/Header/MegaMenu.tsx +117 -0
- package/templates/marketing/nextjs/src/components/Header/MobileMenu.tsx +178 -0
- package/templates/marketing/nextjs/src/components/Header/index.tsx +172 -0
- package/templates/marketing/nextjs/src/components/Logo.tsx +46 -0
- package/templates/marketing/nextjs/src/components/ThemeProvider.tsx +8 -0
- package/templates/marketing/nextjs/src/components/ThemeSelector.tsx +69 -0
- package/templates/marketing/nextjs/src/components/blocks/BentoFeatures.tsx +249 -0
- package/templates/marketing/nextjs/src/components/blocks/FeatureShowcase.tsx +110 -0
- package/templates/marketing/nextjs/src/components/blocks/FinalCTA.tsx +91 -0
- package/templates/marketing/nextjs/src/components/blocks/IndustryTabs.tsx +137 -0
- package/templates/marketing/nextjs/src/components/blocks/LogoBanner.tsx +80 -0
- package/templates/marketing/nextjs/src/components/blocks/PricingTable.tsx +210 -0
- package/templates/marketing/nextjs/src/components/blocks/ProofBanner.tsx +72 -0
- package/templates/marketing/nextjs/src/components/blocks/TestimonialsGrid.tsx +119 -0
- package/templates/marketing/nextjs/src/components/blocks/TrustColumns.tsx +110 -0
- package/templates/marketing/nextjs/src/components/blocks/index.ts +9 -0
- package/templates/marketing/nextjs/src/components/heros/AnimatedMockup.tsx +242 -0
- package/templates/marketing/nextjs/src/components/heros/ProductShowcaseHero.tsx +84 -0
- package/templates/marketing/nextjs/src/components/heros/index.ts +2 -0
- package/templates/marketing/nextjs/src/lib/utils.ts +6 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import Link from "next/link"
|
|
4
|
+
import { Check, X } from "lucide-react"
|
|
5
|
+
import { cn } from "@/lib/utils"
|
|
6
|
+
|
|
7
|
+
interface PricingFeature {
|
|
8
|
+
feature: string
|
|
9
|
+
included: boolean
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
interface PricingPlan {
|
|
13
|
+
name: string
|
|
14
|
+
price: string
|
|
15
|
+
description: string
|
|
16
|
+
featured?: boolean
|
|
17
|
+
features: PricingFeature[]
|
|
18
|
+
link: {
|
|
19
|
+
label: string
|
|
20
|
+
href: string
|
|
21
|
+
variant: "default" | "outline"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
interface PricingTableProps {
|
|
26
|
+
heading?: string
|
|
27
|
+
subheading?: string
|
|
28
|
+
plans?: PricingPlan[]
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const defaultPlans: PricingPlan[] = [
|
|
32
|
+
{
|
|
33
|
+
name: "Free",
|
|
34
|
+
price: "$0/mo",
|
|
35
|
+
description: "Perfect for trying SaaSify.",
|
|
36
|
+
features: [
|
|
37
|
+
{ feature: "Up to 3 users", included: true },
|
|
38
|
+
{ feature: "Basic features", included: true },
|
|
39
|
+
{ feature: "Community support", included: true },
|
|
40
|
+
],
|
|
41
|
+
link: { label: "Get started free", href: "/sign-up", variant: "outline" },
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: "Pro",
|
|
45
|
+
price: "$29/mo",
|
|
46
|
+
description: "For small teams getting started.",
|
|
47
|
+
featured: true,
|
|
48
|
+
features: [
|
|
49
|
+
{ feature: "Up to 10 users", included: true },
|
|
50
|
+
{ feature: "Advanced features", included: true },
|
|
51
|
+
{ feature: "Integrations", included: true },
|
|
52
|
+
{ feature: "Priority support", included: true },
|
|
53
|
+
],
|
|
54
|
+
link: { label: "Get Pro", href: "/sign-up", variant: "default" },
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: "Business",
|
|
58
|
+
price: "$99/mo",
|
|
59
|
+
description: "For teams ready to scale.",
|
|
60
|
+
features: [
|
|
61
|
+
{ feature: "Unlimited users", included: true },
|
|
62
|
+
{ feature: "All features", included: true },
|
|
63
|
+
{ feature: "API access", included: true },
|
|
64
|
+
{ feature: "Dedicated support", included: true },
|
|
65
|
+
],
|
|
66
|
+
link: { label: "Get Business", href: "/sign-up", variant: "outline" },
|
|
67
|
+
},
|
|
68
|
+
]
|
|
69
|
+
|
|
70
|
+
export function PricingTable({
|
|
71
|
+
heading = "Simple, transparent pricing",
|
|
72
|
+
subheading = "Start free, upgrade as your team grows. No hidden fees.",
|
|
73
|
+
plans = defaultPlans,
|
|
74
|
+
}: PricingTableProps) {
|
|
75
|
+
const displayPlans = plans.length > 0 ? plans : defaultPlans
|
|
76
|
+
|
|
77
|
+
return (
|
|
78
|
+
<section className="py-16 md:py-24">
|
|
79
|
+
<div className="container mx-auto px-4">
|
|
80
|
+
{/* Header */}
|
|
81
|
+
{(heading || subheading) && (
|
|
82
|
+
<div className="text-center mb-12 md:mb-16 max-w-3xl mx-auto">
|
|
83
|
+
{heading && (
|
|
84
|
+
<h2 className="text-3xl md:text-4xl lg:text-5xl font-bold tracking-tight mb-4">
|
|
85
|
+
{heading}
|
|
86
|
+
</h2>
|
|
87
|
+
)}
|
|
88
|
+
{subheading && (
|
|
89
|
+
<p className="text-lg md:text-xl text-muted-foreground">
|
|
90
|
+
{subheading}
|
|
91
|
+
</p>
|
|
92
|
+
)}
|
|
93
|
+
</div>
|
|
94
|
+
)}
|
|
95
|
+
|
|
96
|
+
{/* Pricing Cards */}
|
|
97
|
+
<div className="grid md:grid-cols-3 gap-6 lg:gap-8 max-w-5xl mx-auto">
|
|
98
|
+
{displayPlans.map((plan) => (
|
|
99
|
+
<div
|
|
100
|
+
key={plan.name}
|
|
101
|
+
className={cn(
|
|
102
|
+
"relative rounded-2xl p-6 md:p-8 flex flex-col",
|
|
103
|
+
plan.featured
|
|
104
|
+
? "bg-primary text-primary-foreground border-2 border-primary"
|
|
105
|
+
: "bg-card border border-border"
|
|
106
|
+
)}
|
|
107
|
+
>
|
|
108
|
+
{plan.featured && (
|
|
109
|
+
<span className="absolute -top-3 left-1/2 -translate-x-1/2 px-3 py-1 text-xs font-medium rounded-full bg-background text-foreground">
|
|
110
|
+
Most Popular
|
|
111
|
+
</span>
|
|
112
|
+
)}
|
|
113
|
+
|
|
114
|
+
{/* Plan header */}
|
|
115
|
+
<div className="mb-6">
|
|
116
|
+
<h3
|
|
117
|
+
className={cn(
|
|
118
|
+
"text-lg font-semibold mb-2",
|
|
119
|
+
plan.featured ? "text-primary-foreground" : "text-foreground"
|
|
120
|
+
)}
|
|
121
|
+
>
|
|
122
|
+
{plan.name}
|
|
123
|
+
</h3>
|
|
124
|
+
<div
|
|
125
|
+
className={cn(
|
|
126
|
+
"text-4xl font-bold mb-2",
|
|
127
|
+
plan.featured ? "text-primary-foreground" : "text-foreground"
|
|
128
|
+
)}
|
|
129
|
+
>
|
|
130
|
+
{plan.price}
|
|
131
|
+
</div>
|
|
132
|
+
<p
|
|
133
|
+
className={cn(
|
|
134
|
+
"text-sm",
|
|
135
|
+
plan.featured ? "text-primary-foreground/80" : "text-muted-foreground"
|
|
136
|
+
)}
|
|
137
|
+
>
|
|
138
|
+
{plan.description}
|
|
139
|
+
</p>
|
|
140
|
+
</div>
|
|
141
|
+
|
|
142
|
+
{/* Features */}
|
|
143
|
+
<ul className="space-y-3 mb-8 flex-1">
|
|
144
|
+
{plan.features.map((feature) => (
|
|
145
|
+
<li key={feature.feature} className="flex items-center gap-3">
|
|
146
|
+
{feature.included ? (
|
|
147
|
+
<Check
|
|
148
|
+
className={cn(
|
|
149
|
+
"h-4 w-4",
|
|
150
|
+
plan.featured ? "text-primary-foreground" : "text-primary"
|
|
151
|
+
)}
|
|
152
|
+
/>
|
|
153
|
+
) : (
|
|
154
|
+
<X
|
|
155
|
+
className={cn(
|
|
156
|
+
"h-4 w-4",
|
|
157
|
+
plan.featured ? "text-primary-foreground/50" : "text-muted-foreground"
|
|
158
|
+
)}
|
|
159
|
+
/>
|
|
160
|
+
)}
|
|
161
|
+
<span
|
|
162
|
+
className={cn(
|
|
163
|
+
"text-sm",
|
|
164
|
+
plan.featured
|
|
165
|
+
? feature.included
|
|
166
|
+
? "text-primary-foreground"
|
|
167
|
+
: "text-primary-foreground/50"
|
|
168
|
+
: feature.included
|
|
169
|
+
? "text-foreground"
|
|
170
|
+
: "text-muted-foreground"
|
|
171
|
+
)}
|
|
172
|
+
>
|
|
173
|
+
{feature.feature}
|
|
174
|
+
</span>
|
|
175
|
+
</li>
|
|
176
|
+
))}
|
|
177
|
+
</ul>
|
|
178
|
+
|
|
179
|
+
{/* CTA */}
|
|
180
|
+
<Link
|
|
181
|
+
href={plan.link.href}
|
|
182
|
+
className={cn(
|
|
183
|
+
"w-full inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md transition-colors",
|
|
184
|
+
plan.featured
|
|
185
|
+
? "bg-background text-foreground hover:bg-background/90"
|
|
186
|
+
: plan.link.variant === "default"
|
|
187
|
+
? "bg-primary text-primary-foreground hover:bg-primary/90"
|
|
188
|
+
: "border border-border bg-background hover:bg-muted"
|
|
189
|
+
)}
|
|
190
|
+
>
|
|
191
|
+
{plan.link.label}
|
|
192
|
+
</Link>
|
|
193
|
+
</div>
|
|
194
|
+
))}
|
|
195
|
+
</div>
|
|
196
|
+
|
|
197
|
+
{/* View all link */}
|
|
198
|
+
<div className="text-center mt-8">
|
|
199
|
+
<Link
|
|
200
|
+
href="/pricing"
|
|
201
|
+
className="inline-flex items-center gap-2 text-sm font-medium text-primary hover:underline"
|
|
202
|
+
>
|
|
203
|
+
View full comparison
|
|
204
|
+
<span aria-hidden="true">→</span>
|
|
205
|
+
</Link>
|
|
206
|
+
</div>
|
|
207
|
+
</div>
|
|
208
|
+
</section>
|
|
209
|
+
)
|
|
210
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import Link from "next/link"
|
|
4
|
+
import { cn } from "@/lib/utils"
|
|
5
|
+
|
|
6
|
+
interface ProofBannerLink {
|
|
7
|
+
label: string
|
|
8
|
+
href: string
|
|
9
|
+
variant: "default" | "outline"
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
interface ProofBannerProps {
|
|
13
|
+
headline?: string
|
|
14
|
+
subtext?: string
|
|
15
|
+
links?: ProofBannerLink[]
|
|
16
|
+
style?: "centered" | "left"
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function ProofBanner({
|
|
20
|
+
headline = "Transform how your team works, collaborates, and grows",
|
|
21
|
+
subtext = "Every interaction feeds into a powerful platform that powers personalized experiences, seamless collaboration, and intelligent automation across every touchpoint.",
|
|
22
|
+
links = [
|
|
23
|
+
{ label: "Start free trial", href: "/sign-up", variant: "default" },
|
|
24
|
+
{ label: "Book a demo", href: "/contact", variant: "outline" },
|
|
25
|
+
],
|
|
26
|
+
style = "centered",
|
|
27
|
+
}: ProofBannerProps) {
|
|
28
|
+
return (
|
|
29
|
+
<section className="py-16 md:py-24">
|
|
30
|
+
<div className="container mx-auto px-4">
|
|
31
|
+
<div
|
|
32
|
+
className={cn(
|
|
33
|
+
"max-w-4xl",
|
|
34
|
+
style === "centered" ? "mx-auto text-center" : ""
|
|
35
|
+
)}
|
|
36
|
+
>
|
|
37
|
+
<h2 className="text-3xl md:text-4xl lg:text-5xl font-bold tracking-tight mb-6">
|
|
38
|
+
{headline}
|
|
39
|
+
</h2>
|
|
40
|
+
{subtext && (
|
|
41
|
+
<p className="text-lg md:text-xl text-muted-foreground mb-8 max-w-3xl mx-auto">
|
|
42
|
+
{subtext}
|
|
43
|
+
</p>
|
|
44
|
+
)}
|
|
45
|
+
{links && links.length > 0 && (
|
|
46
|
+
<div
|
|
47
|
+
className={cn(
|
|
48
|
+
"flex flex-wrap gap-4",
|
|
49
|
+
style === "centered" ? "justify-center" : ""
|
|
50
|
+
)}
|
|
51
|
+
>
|
|
52
|
+
{links.map((link) => (
|
|
53
|
+
<Link
|
|
54
|
+
key={link.href}
|
|
55
|
+
href={link.href}
|
|
56
|
+
className={cn(
|
|
57
|
+
"inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md transition-colors",
|
|
58
|
+
link.variant === "default"
|
|
59
|
+
? "bg-primary text-primary-foreground hover:bg-primary/90"
|
|
60
|
+
: "border border-border bg-background hover:bg-muted"
|
|
61
|
+
)}
|
|
62
|
+
>
|
|
63
|
+
{link.label}
|
|
64
|
+
</Link>
|
|
65
|
+
))}
|
|
66
|
+
</div>
|
|
67
|
+
)}
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
</section>
|
|
71
|
+
)
|
|
72
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import { cn } from "@/lib/utils"
|
|
4
|
+
|
|
5
|
+
interface Testimonial {
|
|
6
|
+
stat: string
|
|
7
|
+
statLabel: string
|
|
8
|
+
quote: string
|
|
9
|
+
author: string
|
|
10
|
+
company: string
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
interface TestimonialsGridProps {
|
|
14
|
+
heading?: string
|
|
15
|
+
subheading?: string
|
|
16
|
+
testimonials?: Testimonial[]
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const defaultTestimonials: Testimonial[] = [
|
|
20
|
+
{
|
|
21
|
+
stat: "94%",
|
|
22
|
+
statLabel: "Faster onboarding",
|
|
23
|
+
quote:
|
|
24
|
+
"We got our entire team onboarded in under a day. The intuitive interface and powerful integrations saved us weeks of setup time.",
|
|
25
|
+
author: "Sarah Chen",
|
|
26
|
+
company: "TechFlow Inc",
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
stat: "3x",
|
|
30
|
+
statLabel: "Productivity",
|
|
31
|
+
quote:
|
|
32
|
+
"Our team is shipping features faster than ever. The automation tools eliminated hours of manual work every week.",
|
|
33
|
+
author: "Marcus Rivera",
|
|
34
|
+
company: "Beacon Digital",
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
stat: "40%",
|
|
38
|
+
statLabel: "Cost reduction",
|
|
39
|
+
quote:
|
|
40
|
+
"We consolidated five different tools into SaaSify. The ROI was immediate and our team loves having everything in one place.",
|
|
41
|
+
author: "David Kim",
|
|
42
|
+
company: "Cascade Systems",
|
|
43
|
+
},
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
export function TestimonialsGrid({
|
|
47
|
+
heading = "Loved by teams at companies of all sizes",
|
|
48
|
+
subheading = "See how leading teams use SaaSify to drive growth and productivity.",
|
|
49
|
+
testimonials = defaultTestimonials,
|
|
50
|
+
}: TestimonialsGridProps) {
|
|
51
|
+
const displayTestimonials = testimonials.length > 0 ? testimonials : defaultTestimonials
|
|
52
|
+
|
|
53
|
+
return (
|
|
54
|
+
<section className="py-16 md:py-24">
|
|
55
|
+
<div className="container mx-auto px-4">
|
|
56
|
+
{/* Header */}
|
|
57
|
+
{(heading || subheading) && (
|
|
58
|
+
<div className="text-center mb-12 md:mb-16 max-w-3xl mx-auto">
|
|
59
|
+
{heading && (
|
|
60
|
+
<h2 className="text-3xl md:text-4xl lg:text-5xl font-bold tracking-tight mb-4">
|
|
61
|
+
{heading}
|
|
62
|
+
</h2>
|
|
63
|
+
)}
|
|
64
|
+
{subheading && (
|
|
65
|
+
<p className="text-lg md:text-xl text-muted-foreground">
|
|
66
|
+
{subheading}
|
|
67
|
+
</p>
|
|
68
|
+
)}
|
|
69
|
+
</div>
|
|
70
|
+
)}
|
|
71
|
+
|
|
72
|
+
{/* Testimonials Grid */}
|
|
73
|
+
<div className="grid md:grid-cols-3 gap-6 lg:gap-8">
|
|
74
|
+
{displayTestimonials.map((testimonial) => (
|
|
75
|
+
<div
|
|
76
|
+
key={testimonial.author}
|
|
77
|
+
className="relative bg-card border border-border rounded-2xl p-6 md:p-8"
|
|
78
|
+
>
|
|
79
|
+
{/* Stat */}
|
|
80
|
+
<div className="mb-6">
|
|
81
|
+
<div className="text-4xl md:text-5xl font-bold text-primary mb-1">
|
|
82
|
+
{testimonial.stat}
|
|
83
|
+
</div>
|
|
84
|
+
<p className="text-sm font-medium text-muted-foreground">
|
|
85
|
+
{testimonial.statLabel}
|
|
86
|
+
</p>
|
|
87
|
+
</div>
|
|
88
|
+
|
|
89
|
+
{/* Quote */}
|
|
90
|
+
<blockquote className="text-foreground mb-6">
|
|
91
|
+
"{testimonial.quote}"
|
|
92
|
+
</blockquote>
|
|
93
|
+
|
|
94
|
+
{/* Author */}
|
|
95
|
+
<div className="flex items-center gap-3">
|
|
96
|
+
<div className="w-10 h-10 rounded-full bg-muted flex items-center justify-center">
|
|
97
|
+
<span className="text-sm font-medium">
|
|
98
|
+
{testimonial.author
|
|
99
|
+
.split(" ")
|
|
100
|
+
.map((n) => n[0])
|
|
101
|
+
.join("")}
|
|
102
|
+
</span>
|
|
103
|
+
</div>
|
|
104
|
+
<div>
|
|
105
|
+
<p className="text-sm font-medium text-foreground">
|
|
106
|
+
{testimonial.author}
|
|
107
|
+
</p>
|
|
108
|
+
<p className="text-sm text-muted-foreground">
|
|
109
|
+
{testimonial.company}
|
|
110
|
+
</p>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
))}
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
</section>
|
|
118
|
+
)
|
|
119
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
Award,
|
|
5
|
+
Cloud,
|
|
6
|
+
Database,
|
|
7
|
+
Globe,
|
|
8
|
+
Lock,
|
|
9
|
+
Plug,
|
|
10
|
+
Shield,
|
|
11
|
+
Zap,
|
|
12
|
+
type LucideIcon,
|
|
13
|
+
} from "lucide-react"
|
|
14
|
+
import { cn } from "@/lib/utils"
|
|
15
|
+
|
|
16
|
+
interface TrustItem {
|
|
17
|
+
icon: string
|
|
18
|
+
text: string
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface TrustColumn {
|
|
22
|
+
label: string
|
|
23
|
+
heading: string
|
|
24
|
+
description: string
|
|
25
|
+
items: TrustItem[]
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
interface TrustColumnsProps {
|
|
29
|
+
columns?: TrustColumn[]
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const iconMap: Record<string, LucideIcon> = {
|
|
33
|
+
zap: Zap,
|
|
34
|
+
plug: Plug,
|
|
35
|
+
database: Database,
|
|
36
|
+
cloud: Cloud,
|
|
37
|
+
shield: Shield,
|
|
38
|
+
lock: Lock,
|
|
39
|
+
award: Award,
|
|
40
|
+
globe: Globe,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const defaultColumns: TrustColumn[] = [
|
|
44
|
+
{
|
|
45
|
+
label: "Integrations",
|
|
46
|
+
heading: "Connect anywhere",
|
|
47
|
+
description:
|
|
48
|
+
"Plug in and get started immediately with pre-built connectors for every major platform.",
|
|
49
|
+
items: [
|
|
50
|
+
{ icon: "zap", text: "Go live in minutes" },
|
|
51
|
+
{ icon: "plug", text: "Pre-built connectors" },
|
|
52
|
+
{ icon: "database", text: "Complete data sync" },
|
|
53
|
+
{ icon: "cloud", text: "Cloud-native infrastructure" },
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
label: "Security & Compliance",
|
|
58
|
+
heading: "Enterprise-level security",
|
|
59
|
+
description:
|
|
60
|
+
"Keep your data safe with encryption, granular access control, and compliance-ready infrastructure.",
|
|
61
|
+
items: [
|
|
62
|
+
{ icon: "shield", text: "SOC 2 Type II certified" },
|
|
63
|
+
{ icon: "lock", text: "End-to-end encryption" },
|
|
64
|
+
{ icon: "award", text: "Complete audit trails" },
|
|
65
|
+
{ icon: "globe", text: "GDPR compliant" },
|
|
66
|
+
],
|
|
67
|
+
},
|
|
68
|
+
]
|
|
69
|
+
|
|
70
|
+
export function TrustColumns({ columns = defaultColumns }: TrustColumnsProps) {
|
|
71
|
+
const displayColumns = columns.length > 0 ? columns : defaultColumns
|
|
72
|
+
|
|
73
|
+
return (
|
|
74
|
+
<section className="py-16 md:py-24">
|
|
75
|
+
<div className="container mx-auto px-4">
|
|
76
|
+
<div className="grid md:grid-cols-2 gap-12 lg:gap-16">
|
|
77
|
+
{displayColumns.map((column) => (
|
|
78
|
+
<div key={column.label}>
|
|
79
|
+
<span className="inline-block text-sm font-medium text-primary mb-4">
|
|
80
|
+
{column.label}
|
|
81
|
+
</span>
|
|
82
|
+
<h2 className="text-2xl md:text-3xl font-bold tracking-tight mb-4">
|
|
83
|
+
{column.heading}
|
|
84
|
+
</h2>
|
|
85
|
+
<p className="text-muted-foreground mb-8">
|
|
86
|
+
{column.description}
|
|
87
|
+
</p>
|
|
88
|
+
|
|
89
|
+
<ul className="space-y-4">
|
|
90
|
+
{column.items.map((item) => {
|
|
91
|
+
const Icon = iconMap[item.icon] || Shield
|
|
92
|
+
return (
|
|
93
|
+
<li key={item.text} className="flex items-center gap-3">
|
|
94
|
+
<div className="flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-primary/10">
|
|
95
|
+
<Icon className="h-4 w-4 text-primary" />
|
|
96
|
+
</div>
|
|
97
|
+
<span className="text-sm font-medium">
|
|
98
|
+
{item.text}
|
|
99
|
+
</span>
|
|
100
|
+
</li>
|
|
101
|
+
)
|
|
102
|
+
})}
|
|
103
|
+
</ul>
|
|
104
|
+
</div>
|
|
105
|
+
))}
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
</section>
|
|
109
|
+
)
|
|
110
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { LogoBanner } from "./LogoBanner"
|
|
2
|
+
export { ProofBanner } from "./ProofBanner"
|
|
3
|
+
export { BentoFeatures } from "./BentoFeatures"
|
|
4
|
+
export { FeatureShowcase } from "./FeatureShowcase"
|
|
5
|
+
export { IndustryTabs } from "./IndustryTabs"
|
|
6
|
+
export { TestimonialsGrid } from "./TestimonialsGrid"
|
|
7
|
+
export { TrustColumns } from "./TrustColumns"
|
|
8
|
+
export { PricingTable } from "./PricingTable"
|
|
9
|
+
export { FinalCTA } from "./FinalCTA"
|