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.
Files changed (54) hide show
  1. package/.turbo/turbo-build.log +6 -6
  2. package/dist/index.js +1906 -146
  3. package/package.json +2 -2
  4. package/src/generator.ts +9 -0
  5. package/src/templates.generated.ts +51 -5
  6. package/templates/marketing/astro/astro.config.ts.hbs +12 -0
  7. package/templates/marketing/astro/package.json.hbs +31 -0
  8. package/templates/marketing/astro/postcss.config.mjs.hbs +5 -0
  9. package/templates/marketing/astro/public/favicon.svg +4 -0
  10. package/templates/marketing/astro/public/media/hero-bg.png +1 -0
  11. package/templates/marketing/astro/src/components/Footer.astro +167 -0
  12. package/templates/marketing/astro/src/components/Header.astro +378 -0
  13. package/templates/marketing/astro/src/components/Logo.astro +30 -0
  14. package/templates/marketing/astro/src/components/ThemeSelector.astro +64 -0
  15. package/templates/marketing/astro/src/components/blocks/BentoFeatures.astro +209 -0
  16. package/templates/marketing/astro/src/components/blocks/FeatureShowcase.astro +102 -0
  17. package/templates/marketing/astro/src/components/blocks/FinalCTA.astro +82 -0
  18. package/templates/marketing/astro/src/components/blocks/IndustryTabs.astro +177 -0
  19. package/templates/marketing/astro/src/components/blocks/LogoBanner.astro +95 -0
  20. package/templates/marketing/astro/src/components/blocks/PricingTable.astro +176 -0
  21. package/templates/marketing/astro/src/components/blocks/ProofBanner.astro +56 -0
  22. package/templates/marketing/astro/src/components/blocks/TestimonialsGrid.astro +106 -0
  23. package/templates/marketing/astro/src/components/blocks/TrustColumns.astro +88 -0
  24. package/templates/marketing/astro/src/components/heros/AnimatedMockup.astro +711 -0
  25. package/templates/marketing/astro/src/components/heros/ProductShowcaseHero.astro +111 -0
  26. package/templates/marketing/astro/src/layouts/Layout.astro +37 -0
  27. package/templates/marketing/astro/src/lib/utils.ts +6 -0
  28. package/templates/marketing/astro/src/pages/index.astro +163 -0
  29. package/templates/marketing/astro/src/styles/globals.css.hbs +353 -0
  30. package/templates/marketing/astro/tsconfig.json.hbs +11 -0
  31. package/templates/marketing/nextjs/package.json.hbs +6 -1
  32. package/templates/marketing/nextjs/src/app/layout.tsx.hbs +19 -5
  33. package/templates/marketing/nextjs/src/app/page.tsx.hbs +160 -164
  34. package/templates/marketing/nextjs/src/components/Footer/index.tsx +188 -0
  35. package/templates/marketing/nextjs/src/components/Header/MegaMenu.tsx +117 -0
  36. package/templates/marketing/nextjs/src/components/Header/MobileMenu.tsx +178 -0
  37. package/templates/marketing/nextjs/src/components/Header/index.tsx +172 -0
  38. package/templates/marketing/nextjs/src/components/Logo.tsx +46 -0
  39. package/templates/marketing/nextjs/src/components/ThemeProvider.tsx +8 -0
  40. package/templates/marketing/nextjs/src/components/ThemeSelector.tsx +69 -0
  41. package/templates/marketing/nextjs/src/components/blocks/BentoFeatures.tsx +249 -0
  42. package/templates/marketing/nextjs/src/components/blocks/FeatureShowcase.tsx +110 -0
  43. package/templates/marketing/nextjs/src/components/blocks/FinalCTA.tsx +91 -0
  44. package/templates/marketing/nextjs/src/components/blocks/IndustryTabs.tsx +137 -0
  45. package/templates/marketing/nextjs/src/components/blocks/LogoBanner.tsx +80 -0
  46. package/templates/marketing/nextjs/src/components/blocks/PricingTable.tsx +210 -0
  47. package/templates/marketing/nextjs/src/components/blocks/ProofBanner.tsx +72 -0
  48. package/templates/marketing/nextjs/src/components/blocks/TestimonialsGrid.tsx +119 -0
  49. package/templates/marketing/nextjs/src/components/blocks/TrustColumns.tsx +110 -0
  50. package/templates/marketing/nextjs/src/components/blocks/index.ts +9 -0
  51. package/templates/marketing/nextjs/src/components/heros/AnimatedMockup.tsx +242 -0
  52. package/templates/marketing/nextjs/src/components/heros/ProductShowcaseHero.tsx +84 -0
  53. package/templates/marketing/nextjs/src/components/heros/index.ts +2 -0
  54. 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"