kofi-stack-template-generator 2.1.59 → 2.1.61

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 (25) hide show
  1. package/.turbo/turbo-build.log +6 -6
  2. package/dist/index.js +1126 -23
  3. package/package.json +2 -2
  4. package/src/templates.generated.ts +23 -7
  5. package/templates/marketing/nextjs/components.json.hbs +44 -0
  6. package/templates/marketing/nextjs/package.json.hbs +2 -1
  7. package/templates/marketing/nextjs/src/app/about/page.tsx +155 -0
  8. package/templates/marketing/nextjs/src/app/blog/[slug]/page.tsx +181 -0
  9. package/templates/marketing/nextjs/src/app/features/analytics/page.tsx +140 -0
  10. package/templates/marketing/nextjs/src/app/features/automation/page.tsx +171 -0
  11. package/templates/marketing/nextjs/src/app/features/dashboard/page.tsx +140 -0
  12. package/templates/marketing/nextjs/src/app/features/integrations/page.tsx +174 -0
  13. package/templates/marketing/nextjs/src/app/features/security/page.tsx +150 -0
  14. package/templates/marketing/nextjs/src/app/features/workflows/page.tsx +140 -0
  15. package/templates/marketing/nextjs/src/app/use-cases/marketing/page.tsx +154 -0
  16. package/templates/marketing/nextjs/src/app/use-cases/operations/page.tsx +154 -0
  17. package/templates/marketing/nextjs/src/app/use-cases/product/page.tsx +154 -0
  18. package/templates/marketing/nextjs/src/app/use-cases/sales/page.tsx +154 -0
  19. package/templates/marketing/nextjs/src/components/Header/index.tsx +52 -2
  20. package/templates/marketing/nextjs/src/components/blocks/FAQAccordion.tsx +119 -0
  21. package/templates/marketing/nextjs/src/components/blocks/HowItWorks.tsx +95 -0
  22. package/templates/marketing/nextjs/src/components/blocks/index.ts +2 -0
  23. package/templates/marketing/payload/components.json.hbs +44 -0
  24. package/templates/web/components.json.hbs +6 -0
  25. package/templates/web/src/app/globals.css.hbs +460 -14
@@ -0,0 +1,44 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema.json",
3
+ {{#if (eq shadcn.style "nova")}}
4
+ "style": "new-york",
5
+ {{else if (eq shadcn.style "vega")}}
6
+ "style": "default",
7
+ {{else if (eq shadcn.style "maia")}}
8
+ "style": "new-york",
9
+ {{else if (eq shadcn.style "lyra")}}
10
+ "style": "new-york",
11
+ {{else if (eq shadcn.style "mira")}}
12
+ "style": "default",
13
+ {{else}}
14
+ "style": "new-york",
15
+ {{/if}}
16
+ "rsc": true,
17
+ "tsx": true,
18
+ "tailwind": {
19
+ "config": "",
20
+ "css": "src/app/globals.css",
21
+ "baseColor": "{{shadcn.baseColor}}",
22
+ "cssVariables": true,
23
+ "prefix": ""
24
+ },
25
+ {{#if (eq shadcn.iconLibrary "lucide")}}
26
+ "iconLibrary": "lucide",
27
+ {{else if (eq shadcn.iconLibrary "hugeicons")}}
28
+ "iconLibrary": "lucide",
29
+ {{else if (eq shadcn.iconLibrary "tabler")}}
30
+ "iconLibrary": "lucide",
31
+ {{else if (eq shadcn.iconLibrary "phosphor")}}
32
+ "iconLibrary": "lucide",
33
+ {{else}}
34
+ "iconLibrary": "lucide",
35
+ {{/if}}
36
+ "aliases": {
37
+ "components": "@/components",
38
+ "utils": "@/lib/utils",
39
+ "ui": "@/components/ui",
40
+ "lib": "@/lib",
41
+ "hooks": "@/hooks"
42
+ },
43
+ "registries": {}
44
+ }
@@ -19,7 +19,8 @@
19
19
  "next-themes": "^0.4.4",
20
20
  "clsx": "^2.1.1",
21
21
  "tailwind-merge": "^2.6.0",
22
- "class-variance-authority": "^0.7.1"
22
+ "class-variance-authority": "^0.7.1",
23
+ "tw-animate-css": "^1.3.0"
23
24
  },
24
25
  "devDependencies": {
25
26
  "@repo/config-typescript": "workspace:*",
@@ -0,0 +1,155 @@
1
+ import { Header } from "@/components/Header"
2
+ import { Footer } from "@/components/Footer"
3
+ import { LogoBanner, FinalCTA } from "@/components/blocks"
4
+ import { Users, Target, Heart, Zap } from "lucide-react"
5
+
6
+ const values = [
7
+ {
8
+ icon: <Users className="h-6 w-6" />,
9
+ title: "Customer First",
10
+ description:
11
+ "Every decision we make starts with our customers. Their success is our success.",
12
+ },
13
+ {
14
+ icon: <Target className="h-6 w-6" />,
15
+ title: "Simplicity Wins",
16
+ description:
17
+ "We believe powerful software doesn't have to be complicated. We obsess over making things simple.",
18
+ },
19
+ {
20
+ icon: <Heart className="h-6 w-6" />,
21
+ title: "Built with Care",
22
+ description:
23
+ "We sweat the details because we know they matter. Quality is never an accident.",
24
+ },
25
+ {
26
+ icon: <Zap className="h-6 w-6" />,
27
+ title: "Move Fast",
28
+ description:
29
+ "We ship early and often. Progress beats perfection when you're learning from real users.",
30
+ },
31
+ ]
32
+
33
+ const stats = [
34
+ { value: "50K+", label: "Teams worldwide" },
35
+ { value: "180+", label: "Countries" },
36
+ { value: "99.9%", label: "Uptime" },
37
+ { value: "4.8/5", label: "Customer rating" },
38
+ ]
39
+
40
+ export default function AboutPage() {
41
+ return (
42
+ <div className="min-h-screen flex flex-col">
43
+ <Header />
44
+
45
+ <main className="flex-1">
46
+ {/* Hero */}
47
+ <section className="py-16 md:py-24">
48
+ <div className="container mx-auto px-4">
49
+ <div className="max-w-3xl mx-auto text-center">
50
+ <h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-6">
51
+ We're on a mission to help teams work better together
52
+ </h1>
53
+ <p className="text-xl text-muted-foreground">
54
+ SaaSify was founded in 2020 with a simple belief: work doesn't have to be
55
+ complicated. We're building the tools that help teams focus on what matters.
56
+ </p>
57
+ </div>
58
+ </div>
59
+ </section>
60
+
61
+ {/* Stats */}
62
+ <section className="py-12 bg-muted/30">
63
+ <div className="container mx-auto px-4">
64
+ <div className="grid grid-cols-2 md:grid-cols-4 gap-8">
65
+ {stats.map((stat) => (
66
+ <div key={stat.label} className="text-center">
67
+ <div className="text-4xl md:text-5xl font-bold text-primary mb-2">
68
+ {stat.value}
69
+ </div>
70
+ <div className="text-muted-foreground">{stat.label}</div>
71
+ </div>
72
+ ))}
73
+ </div>
74
+ </div>
75
+ </section>
76
+
77
+ {/* Story */}
78
+ <section className="py-16 md:py-24">
79
+ <div className="container mx-auto px-4">
80
+ <div className="max-w-3xl mx-auto">
81
+ <h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-8 text-center">
82
+ Our story
83
+ </h2>
84
+ <div className="prose prose-lg max-w-none text-muted-foreground">
85
+ <p className="mb-6">
86
+ It all started with a frustration we've all felt: too many tools, too many
87
+ tabs, too much time wasted switching between them. We knew there had to be
88
+ a better way.
89
+ </p>
90
+ <p className="mb-6">
91
+ So we set out to build a platform that brings everything together—tasks,
92
+ documents, communication, and automation—in one seamless experience. No more
93
+ context switching. No more lost information. Just focused, productive work.
94
+ </p>
95
+ <p>
96
+ Today, SaaSify is used by over 50,000 teams worldwide, from two-person
97
+ startups to Fortune 500 companies. And we're just getting started.
98
+ </p>
99
+ </div>
100
+ </div>
101
+ </div>
102
+ </section>
103
+
104
+ {/* Values */}
105
+ <section className="py-16 md:py-24 bg-muted/30">
106
+ <div className="container mx-auto px-4">
107
+ <div className="text-center mb-12 md:mb-16">
108
+ <h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-4">
109
+ Our values
110
+ </h2>
111
+ <p className="text-lg text-muted-foreground max-w-2xl mx-auto">
112
+ These principles guide everything we do, from product decisions to how we
113
+ treat each other.
114
+ </p>
115
+ </div>
116
+
117
+ <div className="grid md:grid-cols-2 lg:grid-cols-4 gap-8 max-w-5xl mx-auto">
118
+ {values.map((value) => (
119
+ <div
120
+ key={value.title}
121
+ className="bg-card rounded-lg border border-border p-6"
122
+ >
123
+ <div className="w-12 h-12 rounded-lg bg-primary/10 text-primary flex items-center justify-center mb-4">
124
+ {value.icon}
125
+ </div>
126
+ <h3 className="text-lg font-semibold mb-2">{value.title}</h3>
127
+ <p className="text-muted-foreground text-sm">{value.description}</p>
128
+ </div>
129
+ ))}
130
+ </div>
131
+ </div>
132
+ </section>
133
+
134
+ {/* Trusted By */}
135
+ <LogoBanner
136
+ heading="Trusted by teams at companies of all sizes"
137
+ style="scroll"
138
+ />
139
+
140
+ {/* Final CTA */}
141
+ <FinalCTA
142
+ headline="Join us on our mission"
143
+ subheading="Start your free trial today and see why thousands of teams trust SaaSify."
144
+ style="dark"
145
+ links={[
146
+ { label: "Start free trial", href: "/sign-up", variant: "outline" },
147
+ { label: "Contact us", href: "/contact", variant: "default" },
148
+ ]}
149
+ />
150
+ </main>
151
+
152
+ <Footer />
153
+ </div>
154
+ )
155
+ }
@@ -0,0 +1,181 @@
1
+ import { Header } from "@/components/Header"
2
+ import { Footer } from "@/components/Footer"
3
+ import { FinalCTA } from "@/components/blocks"
4
+ import Link from "next/link"
5
+ import { ArrowLeft, Calendar, Clock, User } from "lucide-react"
6
+
7
+ // This is sample data - in a real app, you would fetch this from a CMS or MDX files
8
+ const blogPosts: Record<string, {
9
+ title: string
10
+ description: string
11
+ content: string
12
+ date: string
13
+ author: string
14
+ readTime: string
15
+ category: string
16
+ }> = {
17
+ "boost-team-productivity": {
18
+ title: "10 Ways to Boost Your Team's Productivity",
19
+ description: "Discover proven strategies to help your team work smarter, not harder.",
20
+ date: "January 15, 2025",
21
+ author: "Sarah Johnson",
22
+ readTime: "8 min read",
23
+ category: "Productivity",
24
+ content: `
25
+ <p>In today's fast-paced business environment, productivity isn't just about working harder—it's about working smarter. Here are 10 proven strategies to help your team achieve more while maintaining a healthy work-life balance.</p>
26
+
27
+ <h2>1. Set Clear Goals and Priorities</h2>
28
+ <p>Without clear direction, teams can easily get lost in busywork. Start each week by defining the top 3-5 priorities that will move the needle for your organization.</p>
29
+
30
+ <h2>2. Embrace Asynchronous Communication</h2>
31
+ <p>Not every message needs an immediate response. By embracing async communication, you give your team members uninterrupted blocks of time to focus on deep work.</p>
32
+
33
+ <h2>3. Automate Repetitive Tasks</h2>
34
+ <p>If your team is doing the same task more than twice, it's time to automate it. Modern tools make it easy to create workflows that handle routine work automatically.</p>
35
+
36
+ <h2>4. Hold Fewer, Better Meetings</h2>
37
+ <p>Before scheduling a meeting, ask yourself: "Could this be an email?" When meetings are necessary, have a clear agenda and stick to the allotted time.</p>
38
+
39
+ <h2>5. Invest in the Right Tools</h2>
40
+ <p>The right tools can multiply your team's effectiveness. Look for platforms that integrate well with each other to reduce context switching.</p>
41
+
42
+ <h2>6. Create a Culture of Documentation</h2>
43
+ <p>When knowledge lives only in people's heads, it creates bottlenecks. Document processes, decisions, and learnings so everyone can move faster independently.</p>
44
+
45
+ <h2>7. Encourage Regular Breaks</h2>
46
+ <p>Counterintuitive as it may seem, taking breaks actually improves productivity. The human brain needs rest to perform at its best.</p>
47
+
48
+ <h2>8. Provide Feedback Continuously</h2>
49
+ <p>Don't wait for annual reviews to give feedback. Regular, constructive feedback helps team members course-correct and grow continuously.</p>
50
+
51
+ <h2>9. Eliminate Unnecessary Approvals</h2>
52
+ <p>Too many approval steps slow teams down. Trust your people to make good decisions and only require sign-off when truly necessary.</p>
53
+
54
+ <h2>10. Celebrate Wins (Big and Small)</h2>
55
+ <p>Recognition fuels motivation. Take time to acknowledge achievements, whether it's closing a big deal or simply shipping a feature on time.</p>
56
+
57
+ <h2>Conclusion</h2>
58
+ <p>Improving productivity is an ongoing journey, not a destination. Start with one or two of these strategies, measure the impact, and keep iterating. Your team will thank you for it.</p>
59
+ `,
60
+ },
61
+ }
62
+
63
+ // Generate static params for static generation
64
+ export function generateStaticParams() {
65
+ return Object.keys(blogPosts).map((slug) => ({
66
+ slug,
67
+ }))
68
+ }
69
+
70
+ export default async function BlogPostPage({
71
+ params,
72
+ }: {
73
+ params: Promise<{ slug: string }>
74
+ }) {
75
+ const { slug } = await params
76
+ const post = blogPosts[slug]
77
+
78
+ // If post doesn't exist, show a placeholder
79
+ if (!post) {
80
+ return (
81
+ <div className="min-h-screen flex flex-col">
82
+ <Header />
83
+ <main className="flex-1">
84
+ <section className="py-16 md:py-24">
85
+ <div className="container mx-auto px-4 text-center">
86
+ <h1 className="text-4xl font-bold mb-4">Post Not Found</h1>
87
+ <p className="text-muted-foreground mb-8">
88
+ This blog post doesn&apos;t exist or has been removed.
89
+ </p>
90
+ <Link
91
+ href="/blog"
92
+ className="inline-flex items-center text-primary hover:underline"
93
+ >
94
+ <ArrowLeft className="h-4 w-4 mr-2" />
95
+ Back to blog
96
+ </Link>
97
+ </div>
98
+ </section>
99
+ </main>
100
+ <Footer />
101
+ </div>
102
+ )
103
+ }
104
+
105
+ return (
106
+ <div className="min-h-screen flex flex-col">
107
+ <Header />
108
+
109
+ <main className="flex-1">
110
+ {/* Back Link */}
111
+ <section className="pt-8">
112
+ <div className="container mx-auto px-4">
113
+ <Link
114
+ href="/blog"
115
+ className="inline-flex items-center text-muted-foreground hover:text-foreground transition-colors"
116
+ >
117
+ <ArrowLeft className="h-4 w-4 mr-2" />
118
+ Back to blog
119
+ </Link>
120
+ </div>
121
+ </section>
122
+
123
+ {/* Header */}
124
+ <section className="py-12 md:py-16">
125
+ <div className="container mx-auto px-4">
126
+ <div className="max-w-3xl mx-auto">
127
+ <div className="mb-6">
128
+ <span className="inline-block px-3 py-1 text-xs font-medium rounded-full bg-primary/10 text-primary">
129
+ {post.category}
130
+ </span>
131
+ </div>
132
+ <h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-6">
133
+ {post.title}
134
+ </h1>
135
+ <p className="text-xl text-muted-foreground mb-8">
136
+ {post.description}
137
+ </p>
138
+ <div className="flex flex-wrap items-center gap-6 text-sm text-muted-foreground">
139
+ <div className="flex items-center gap-2">
140
+ <User className="h-4 w-4" />
141
+ {post.author}
142
+ </div>
143
+ <div className="flex items-center gap-2">
144
+ <Calendar className="h-4 w-4" />
145
+ {post.date}
146
+ </div>
147
+ <div className="flex items-center gap-2">
148
+ <Clock className="h-4 w-4" />
149
+ {post.readTime}
150
+ </div>
151
+ </div>
152
+ </div>
153
+ </div>
154
+ </section>
155
+
156
+ {/* Content */}
157
+ <section className="pb-16 md:pb-24">
158
+ <div className="container mx-auto px-4">
159
+ <div
160
+ className="max-w-3xl mx-auto prose prose-lg prose-gray dark:prose-invert"
161
+ dangerouslySetInnerHTML={{ __html: post.content }}
162
+ />
163
+ </div>
164
+ </section>
165
+
166
+ {/* Final CTA */}
167
+ <FinalCTA
168
+ headline="Ready to transform how your team works?"
169
+ subheading="Start your free trial and see the difference SaaSify can make."
170
+ style="dark"
171
+ links={[
172
+ { label: "Start free trial", href: "/sign-up", variant: "outline" },
173
+ { label: "View pricing", href: "/pricing", variant: "default" },
174
+ ]}
175
+ />
176
+ </main>
177
+
178
+ <Footer />
179
+ </div>
180
+ )
181
+ }
@@ -0,0 +1,140 @@
1
+ import { Header } from "@/components/Header"
2
+ import { Footer } from "@/components/Footer"
3
+ import { FinalCTA } from "@/components/blocks"
4
+ import { BarChart3, TrendingUp, LineChart, PieChart, Target, Bell } from "lucide-react"
5
+
6
+ const features = [
7
+ {
8
+ icon: <BarChart3 className="h-6 w-6" />,
9
+ title: "Real-Time Dashboards",
10
+ description:
11
+ "See your metrics update live. No more waiting for reports to refresh.",
12
+ },
13
+ {
14
+ icon: <TrendingUp className="h-6 w-6" />,
15
+ title: "Trend Analysis",
16
+ description:
17
+ "Spot patterns and trends before they become obvious. Make proactive decisions.",
18
+ },
19
+ {
20
+ icon: <LineChart className="h-6 w-6" />,
21
+ title: "Custom Reports",
22
+ description:
23
+ "Build reports that matter to your business. Export to PDF, Excel, or share live links.",
24
+ },
25
+ {
26
+ icon: <PieChart className="h-6 w-6" />,
27
+ title: "Team Performance",
28
+ description:
29
+ "Track productivity metrics across your team. Identify bottlenecks and opportunities.",
30
+ },
31
+ {
32
+ icon: <Target className="h-6 w-6" />,
33
+ title: "Goal Tracking",
34
+ description:
35
+ "Set targets and track progress in real-time. Keep your team focused on what matters.",
36
+ },
37
+ {
38
+ icon: <Bell className="h-6 w-6" />,
39
+ title: "Smart Alerts",
40
+ description:
41
+ "Get notified when metrics cross thresholds. Never miss an important change.",
42
+ },
43
+ ]
44
+
45
+ export default function AnalyticsPage() {
46
+ return (
47
+ <div className="min-h-screen flex flex-col">
48
+ <Header />
49
+
50
+ <main className="flex-1">
51
+ {/* Hero */}
52
+ <section className="py-16 md:py-24">
53
+ <div className="container mx-auto px-4">
54
+ <div className="max-w-3xl mx-auto text-center">
55
+ <div className="inline-block px-4 py-1 rounded-full bg-primary/10 text-primary text-sm font-medium mb-6">
56
+ Analytics
57
+ </div>
58
+ <h1 className="text-4xl md:text-5xl font-bold tracking-tight mb-6">
59
+ Make decisions backed by real-time data
60
+ </h1>
61
+ <p className="text-xl text-muted-foreground mb-8">
62
+ Track every metric that matters. From team performance to customer insights, get the visibility you need to drive growth.
63
+ </p>
64
+ <div className="flex flex-wrap gap-4 justify-center">
65
+ <a
66
+ href="/sign-up"
67
+ className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md bg-primary text-primary-foreground hover:bg-primary/90 transition-colors"
68
+ >
69
+ Start free trial
70
+ </a>
71
+ <a
72
+ href="/demo"
73
+ className="inline-flex items-center justify-center px-6 py-3 text-sm font-medium rounded-md border border-border bg-background hover:bg-muted transition-colors"
74
+ >
75
+ Watch demo
76
+ </a>
77
+ </div>
78
+ </div>
79
+ </div>
80
+ </section>
81
+
82
+ {/* Dashboard Preview */}
83
+ <section className="pb-16 md:pb-24">
84
+ <div className="container mx-auto px-4">
85
+ <div className="max-w-5xl mx-auto">
86
+ <div className="aspect-video bg-gradient-to-br from-primary/20 to-primary/5 rounded-lg border border-border flex items-center justify-center">
87
+ <div className="text-center text-muted-foreground">
88
+ <BarChart3 className="h-16 w-16 mx-auto mb-4 opacity-50" />
89
+ <p>Dashboard Preview</p>
90
+ </div>
91
+ </div>
92
+ </div>
93
+ </div>
94
+ </section>
95
+
96
+ {/* Features Grid */}
97
+ <section className="py-16 md:py-24 bg-muted/30">
98
+ <div className="container mx-auto px-4">
99
+ <div className="text-center mb-12 md:mb-16">
100
+ <h2 className="text-3xl md:text-4xl font-bold tracking-tight mb-4">
101
+ Analytics that drive action
102
+ </h2>
103
+ <p className="text-lg text-muted-foreground max-w-2xl mx-auto">
104
+ Everything you need to understand your data and make better decisions.
105
+ </p>
106
+ </div>
107
+
108
+ <div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8 max-w-5xl mx-auto">
109
+ {features.map((feature) => (
110
+ <div
111
+ key={feature.title}
112
+ className="bg-card rounded-lg border border-border p-6"
113
+ >
114
+ <div className="w-12 h-12 rounded-lg bg-primary/10 text-primary flex items-center justify-center mb-4">
115
+ {feature.icon}
116
+ </div>
117
+ <h3 className="text-lg font-semibold mb-2">{feature.title}</h3>
118
+ <p className="text-muted-foreground text-sm">{feature.description}</p>
119
+ </div>
120
+ ))}
121
+ </div>
122
+ </div>
123
+ </section>
124
+
125
+ {/* Final CTA */}
126
+ <FinalCTA
127
+ headline="Ready to unlock insights?"
128
+ subheading="Start your free trial and see your data come to life."
129
+ style="dark"
130
+ links={[
131
+ { label: "Start free trial", href: "/sign-up", variant: "outline" },
132
+ { label: "Book a demo", href: "/demo", variant: "default" },
133
+ ]}
134
+ />
135
+ </main>
136
+
137
+ <Footer />
138
+ </div>
139
+ )
140
+ }