shipd 0.1.2 → 0.1.4

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 (115) hide show
  1. package/base-package/app/globals.css +126 -0
  2. package/base-package/app/layout.tsx +53 -0
  3. package/base-package/app/page.tsx +15 -0
  4. package/base-package/base.config.json +57 -0
  5. package/base-package/components/ui/avatar.tsx +53 -0
  6. package/base-package/components/ui/badge.tsx +46 -0
  7. package/base-package/components/ui/button.tsx +59 -0
  8. package/base-package/components/ui/card.tsx +92 -0
  9. package/base-package/components/ui/chart.tsx +353 -0
  10. package/base-package/components/ui/checkbox.tsx +32 -0
  11. package/base-package/components/ui/dialog.tsx +135 -0
  12. package/base-package/components/ui/dropdown-menu.tsx +257 -0
  13. package/base-package/components/ui/form.tsx +167 -0
  14. package/base-package/components/ui/input.tsx +21 -0
  15. package/base-package/components/ui/label.tsx +24 -0
  16. package/base-package/components/ui/progress.tsx +31 -0
  17. package/base-package/components/ui/resizable.tsx +56 -0
  18. package/base-package/components/ui/select.tsx +185 -0
  19. package/base-package/components/ui/separator.tsx +28 -0
  20. package/base-package/components/ui/sheet.tsx +139 -0
  21. package/base-package/components/ui/skeleton.tsx +13 -0
  22. package/base-package/components/ui/sonner.tsx +25 -0
  23. package/base-package/components/ui/switch.tsx +31 -0
  24. package/base-package/components/ui/tabs.tsx +66 -0
  25. package/base-package/components/ui/textarea.tsx +18 -0
  26. package/base-package/components/ui/toggle-group.tsx +73 -0
  27. package/base-package/components/ui/toggle.tsx +47 -0
  28. package/base-package/components/ui/tooltip.tsx +61 -0
  29. package/base-package/components.json +21 -0
  30. package/base-package/eslint.config.mjs +16 -0
  31. package/base-package/lib/utils.ts +6 -0
  32. package/base-package/middleware.ts +12 -0
  33. package/base-package/next.config.ts +27 -0
  34. package/base-package/package.json +49 -0
  35. package/base-package/postcss.config.mjs +5 -0
  36. package/base-package/public/favicon.svg +4 -0
  37. package/base-package/tailwind.config.ts +89 -0
  38. package/base-package/tsconfig.json +27 -0
  39. package/dist/index.js +1862 -948
  40. package/features/ai-chat/README.md +258 -0
  41. package/features/ai-chat/app/api/chat/route.ts +16 -0
  42. package/features/ai-chat/app/dashboard/_components/chatbot.tsx +39 -0
  43. package/features/ai-chat/app/dashboard/chat/page.tsx +73 -0
  44. package/features/ai-chat/feature.config.json +22 -0
  45. package/features/analytics/README.md +308 -0
  46. package/features/analytics/feature.config.json +20 -0
  47. package/features/analytics/lib/posthog.ts +36 -0
  48. package/features/auth/README.md +336 -0
  49. package/features/auth/app/api/auth/[...all]/route.ts +4 -0
  50. package/features/auth/app/dashboard/layout.tsx +15 -0
  51. package/features/auth/app/dashboard/page.tsx +140 -0
  52. package/features/auth/app/sign-in/page.tsx +228 -0
  53. package/features/auth/app/sign-up/page.tsx +243 -0
  54. package/features/auth/auth-schema.ts +47 -0
  55. package/features/auth/components/auth/setup-instructions.tsx +123 -0
  56. package/features/auth/feature.config.json +33 -0
  57. package/features/auth/lib/auth-client.ts +8 -0
  58. package/features/auth/lib/auth.ts +295 -0
  59. package/features/auth/lib/email-stub.ts +55 -0
  60. package/features/auth/lib/email.ts +47 -0
  61. package/features/auth/middleware.patch.ts +43 -0
  62. package/features/database/README.md +256 -0
  63. package/features/database/db/drizzle.ts +48 -0
  64. package/features/database/db/schema.ts +21 -0
  65. package/features/database/drizzle.config.ts +13 -0
  66. package/features/database/feature.config.json +30 -0
  67. package/features/email/README.md +282 -0
  68. package/features/email/emails/components/layout.tsx +181 -0
  69. package/features/email/emails/password-reset.tsx +67 -0
  70. package/features/email/emails/payment-failed.tsx +167 -0
  71. package/features/email/emails/subscription-confirmation.tsx +129 -0
  72. package/features/email/emails/welcome.tsx +100 -0
  73. package/features/email/feature.config.json +22 -0
  74. package/features/email/lib/email.ts +118 -0
  75. package/features/file-upload/README.md +271 -0
  76. package/features/file-upload/app/api/upload-image/route.ts +64 -0
  77. package/features/file-upload/app/dashboard/upload/page.tsx +324 -0
  78. package/features/file-upload/feature.config.json +23 -0
  79. package/features/file-upload/lib/upload-image.ts +28 -0
  80. package/features/marketing-landing/README.md +266 -0
  81. package/features/marketing-landing/app/page.tsx +25 -0
  82. package/features/marketing-landing/components/homepage/cli-workflow-section.tsx +231 -0
  83. package/features/marketing-landing/components/homepage/features-section.tsx +152 -0
  84. package/features/marketing-landing/components/homepage/footer.tsx +53 -0
  85. package/features/marketing-landing/components/homepage/hero-section.tsx +112 -0
  86. package/features/marketing-landing/components/homepage/integrations.tsx +124 -0
  87. package/features/marketing-landing/components/homepage/navigation.tsx +116 -0
  88. package/features/marketing-landing/components/homepage/news-section.tsx +82 -0
  89. package/features/marketing-landing/components/homepage/pricing-section.tsx +98 -0
  90. package/features/marketing-landing/components/homepage/testimonials-section.tsx +34 -0
  91. package/features/marketing-landing/components/logos/BetterAuth.tsx +21 -0
  92. package/features/marketing-landing/components/logos/NeonPostgres.tsx +41 -0
  93. package/features/marketing-landing/components/logos/Nextjs.tsx +72 -0
  94. package/features/marketing-landing/components/logos/Polar.tsx +7 -0
  95. package/features/marketing-landing/components/logos/TailwindCSS.tsx +27 -0
  96. package/features/marketing-landing/components/logos/index.ts +6 -0
  97. package/features/marketing-landing/components/logos/shadcnui.tsx +8 -0
  98. package/features/marketing-landing/feature.config.json +23 -0
  99. package/features/payments/README.md +306 -0
  100. package/features/payments/app/api/subscription/route.ts +25 -0
  101. package/features/payments/app/dashboard/payment/_components/manage-subscription.tsx +22 -0
  102. package/features/payments/app/dashboard/payment/page.tsx +126 -0
  103. package/features/payments/app/success/page.tsx +123 -0
  104. package/features/payments/feature.config.json +31 -0
  105. package/features/payments/lib/polar-products.ts +49 -0
  106. package/features/payments/lib/subscription.ts +148 -0
  107. package/features/payments/payments-schema.ts +30 -0
  108. package/features/seo/README.md +244 -0
  109. package/features/seo/app/blog/[slug]/page.tsx +314 -0
  110. package/features/seo/app/blog/page.tsx +107 -0
  111. package/features/seo/app/robots.txt +13 -0
  112. package/features/seo/app/sitemap.ts +70 -0
  113. package/features/seo/feature.config.json +19 -0
  114. package/features/seo/lib/seo-utils.ts +163 -0
  115. package/package.json +3 -1
@@ -0,0 +1,152 @@
1
+ const features = [
2
+ {
3
+ category: "Authentication",
4
+ options: [
5
+ { name: "Better Auth", implemented: true },
6
+ { name: "NextAuth", implemented: false },
7
+ { name: "Supabase Auth", implemented: false },
8
+ ],
9
+ },
10
+ {
11
+ category: "Database",
12
+ options: [
13
+ { name: "Neon PostgreSQL", implemented: true },
14
+ { name: "Supabase Postgres", implemented: true },
15
+ { name: "MongoDB", implemented: false },
16
+ ],
17
+ },
18
+ {
19
+ category: "Payments",
20
+ options: [
21
+ { name: "Polar.sh", implemented: true },
22
+ { name: "Stripe", implemented: false },
23
+ { name: "Lemon Squeezy", implemented: false },
24
+ ],
25
+ },
26
+ {
27
+ category: "Email",
28
+ options: [
29
+ { name: "Resend", implemented: true },
30
+ { name: "Mailgun", implemented: false },
31
+ ],
32
+ },
33
+ {
34
+ category: "AI Integration",
35
+ options: [
36
+ { name: "OpenAI Chat", implemented: true },
37
+ ],
38
+ },
39
+ {
40
+ category: "File Storage",
41
+ options: [
42
+ { name: "Cloudflare R2", implemented: true },
43
+ ],
44
+ },
45
+ {
46
+ category: "Analytics",
47
+ options: [
48
+ { name: "PostHog", implemented: true },
49
+ ],
50
+ },
51
+ {
52
+ category: "Landing Page",
53
+ options: [
54
+ { name: "Hero Section", implemented: true },
55
+ { name: "Features Section", implemented: true },
56
+ { name: "Testimonials", implemented: true },
57
+ { name: "News/Blog", implemented: true },
58
+ { name: "Footer", implemented: true },
59
+ ],
60
+ },
61
+ {
62
+ category: "Dashboard",
63
+ options: [
64
+ { name: "User Dashboard", implemented: true },
65
+ { name: "Settings Page", implemented: true },
66
+ { name: "Billing Portal", implemented: true },
67
+ ],
68
+ },
69
+ {
70
+ category: "SEO",
71
+ options: [
72
+ { name: "Blog Structure", implemented: true },
73
+ { name: "Meta Tags", implemented: true },
74
+ { name: "Sitemap Generation", implemented: false },
75
+ { name: "OpenGraph Tags", implemented: false },
76
+ { name: "Structured Data", implemented: false },
77
+ ],
78
+ },
79
+ ];
80
+
81
+ export default function FeaturesSection() {
82
+ return (
83
+ <section id="features" className="py-20 px-6 lg:px-0 bg-black">
84
+ <div className="mx-auto max-w-6xl">
85
+ <div className="mb-16">
86
+ <div className="flex flex-col md:flex-row md:items-center md:justify-between mb-6">
87
+ <div className="text-center md:text-left mb-4 md:mb-0">
88
+ <h2 className="text-4xl font-bold mb-4 bg-gradient-to-r from-white to-gray-400 bg-clip-text text-transparent">
89
+ Everything We Build
90
+ </h2>
91
+ <p className="text-gray-400 text-xl max-w-2xl">
92
+ Get the complete foundation with all the essential SaaS components pre-built and ready to customize.
93
+ <br />
94
+ <span className="text-white font-medium">Start fresh or add features to your existing Next.js project.</span>
95
+ </p>
96
+ </div>
97
+ <div className="text-right">
98
+ <div className="inline-flex items-center gap-2 px-4 py-2 rounded-lg bg-[#1a1a1a] border border-[#2a2a2a]">
99
+ <div className="w-3 h-3 rounded-full bg-green-500 border-2 border-green-400"></div>
100
+ <span className="text-sm text-gray-300">
101
+ <span className="text-white font-medium">Green border</span> = Implemented
102
+ </span>
103
+ </div>
104
+ <p className="text-xs text-gray-500 mt-2">No border = Coming soon</p>
105
+ </div>
106
+ </div>
107
+ </div>
108
+
109
+ <div className="border border-[#2a2a2a] bg-[#0a0a0a] rounded-lg overflow-hidden">
110
+ <div className="overflow-x-auto">
111
+ <table className="w-full">
112
+ <thead>
113
+ <tr className="border-b border-[#2a2a2a]">
114
+ <th className="px-6 py-4 text-left text-sm font-semibold text-white">Category</th>
115
+ <th className="px-6 py-4 text-left text-sm font-semibold text-white">Options</th>
116
+ </tr>
117
+ </thead>
118
+ <tbody>
119
+ {features.map((feature, idx) => (
120
+ <tr
121
+ key={feature.category}
122
+ className={`border-b border-[#2a2a2a] hover:bg-[#0a0a0a]/80 transition-colors ${
123
+ idx === features.length - 1 ? "border-b-0" : ""
124
+ }`}
125
+ >
126
+ <td className="px-6 py-4 text-white font-medium">{feature.category}</td>
127
+ <td className="px-6 py-4">
128
+ <div className="flex flex-wrap gap-2">
129
+ {feature.options.map((option) => (
130
+ <span
131
+ key={option.name}
132
+ className={`inline-flex items-center px-3 py-1 rounded-full text-sm bg-[#1a1a1a] text-gray-300 ${
133
+ option.implemented
134
+ ? "border-2 border-green-500"
135
+ : "border border-[#2a2a2a]"
136
+ }`}
137
+ >
138
+ {option.name}
139
+ </span>
140
+ ))}
141
+ </div>
142
+ </td>
143
+ </tr>
144
+ ))}
145
+ </tbody>
146
+ </table>
147
+ </div>
148
+ </div>
149
+ </div>
150
+ </section>
151
+ );
152
+ }
@@ -0,0 +1,53 @@
1
+ import Link from "next/link";
2
+
3
+ const links = [
4
+ {
5
+ title: "GitHub",
6
+ href: "https://github.com/kedbrant/Saas-scaffold",
7
+ },
8
+ {
9
+ title: "Documentation",
10
+ href: "https://github.com/kedbrant/Saas-scaffold#readme",
11
+ },
12
+ {
13
+ title: "Issues",
14
+ href: "https://github.com/kedbrant/Saas-scaffold/issues",
15
+ },
16
+ {
17
+ title: "Releases",
18
+ href: "https://github.com/kedbrant/Saas-scaffold/releases",
19
+ },
20
+ ];
21
+
22
+ export default function FooterSection() {
23
+ return (
24
+ <footer className="bg-black border-t border-[#2a2a2a] py-12">
25
+ <div className="mx-auto max-w-5xl px-6">
26
+ <div className="flex flex-wrap justify-between gap-12">
27
+ <div className="order-last flex items-center gap-3 md:order-first">
28
+ <span className="text-gray-400 block text-center text-sm">
29
+ © {new Date().getFullYear()} saas-scaffold. Built with{" "}
30
+ <Link href="https://github.com/kedbrant/Saas-scaffold" className="hover:text-[#ff5722] transition-colors">
31
+ saas-scaffold
32
+ </Link>
33
+ </span>
34
+ </div>
35
+
36
+ <div className="order-first flex flex-wrap gap-x-6 gap-y-4 md:order-last">
37
+ {links.map((link, index) => (
38
+ <Link
39
+ key={index}
40
+ href={link.href}
41
+ target="_blank"
42
+ rel="noopener noreferrer"
43
+ className="text-gray-400 hover:text-[#ff5722] block duration-150"
44
+ >
45
+ <span>{link.title}</span>
46
+ </Link>
47
+ ))}
48
+ </div>
49
+ </div>
50
+ </div>
51
+ </footer>
52
+ );
53
+ }
@@ -0,0 +1,112 @@
1
+ "use client";
2
+
3
+ import { Button } from "@/components/ui/button";
4
+ import { ArrowRight, Sparkles, Code2, Rocket, Clock } from "lucide-react";
5
+ import Link from "next/link";
6
+ import { useEffect, useState } from "react";
7
+
8
+ export default function HeroSection() {
9
+ const [mounted, setMounted] = useState(false);
10
+
11
+ useEffect(() => {
12
+ setMounted(true);
13
+ }, []);
14
+
15
+ return (
16
+ <section className="relative h-[90vh] flex items-center justify-center overflow-hidden bg-black">
17
+ {/* Animated Background Gradient - Sunset Orange to Black */}
18
+ <div className="absolute inset-0 bg-gradient-to-br from-[#ff5722]/10 via-black to-[#d84315]/5" />
19
+
20
+ {/* Animated Orbs - Sunset Orange Glow */}
21
+ <div className="absolute inset-0 overflow-hidden pointer-events-none">
22
+ <div className="absolute top-1/4 -left-48 w-96 h-96 bg-[#ff5722]/20 rounded-full blur-3xl animate-pulse" />
23
+ <div className="absolute bottom-1/4 -right-48 w-96 h-96 bg-[#d84315]/20 rounded-full blur-3xl animate-pulse delay-1000" />
24
+ <div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[600px] h-[600px] bg-[#ff5722]/5 rounded-full blur-3xl" />
25
+ </div>
26
+
27
+ {/* Grid Pattern - Subtle on dark background */}
28
+ <div className="absolute inset-0 bg-[linear-gradient(rgba(255,87,34,0.03)_1px,transparent_1px),linear-gradient(90deg,rgba(255,87,34,0.03)_1px,transparent_1px)] bg-[size:64px_64px] [mask-image:radial-gradient(ellipse_at_center,transparent_20%,black)]" />
29
+
30
+ {/* Content */}
31
+ <div className="relative z-10 mx-auto max-w-7xl px-6 lg:px-8 py-32">
32
+ <div className="text-center space-y-8">
33
+ {/* Badge */}
34
+ <div
35
+ className={`inline-flex items-center gap-2 px-4 py-2 rounded-full border border-[#ff5722]/30 bg-[#ff5722]/10 backdrop-blur-sm transition-all duration-700 ${
36
+ mounted ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-4'
37
+ }`}
38
+ >
39
+ <Sparkles className="w-4 h-4 text-[#ff5722]" />
40
+ <span className="text-sm font-medium text-white">Production-ready SaaS template</span>
41
+ </div>
42
+
43
+ {/* Main Heading */}
44
+ <div className="space-y-6">
45
+ <h1
46
+ className={`text-5xl md:text-7xl lg:text-8xl font-bold tracking-tight transition-all duration-700 delay-100 ${
47
+ mounted ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-4'
48
+ }`}
49
+ >
50
+ <span className="bg-gradient-to-r from-white via-gray-200 to-gray-400 bg-clip-text text-transparent">
51
+ Your SaaS Foundation,
52
+ </span>
53
+ <br />
54
+ <span className="bg-gradient-to-r from-[#ff5722] via-[#ff7043] to-[#d84315] bg-clip-text text-transparent">
55
+ Already Built
56
+ </span>
57
+ </h1>
58
+
59
+ <p
60
+ className={`text-xl md:text-2xl text-gray-400 max-w-3xl mx-auto transition-all duration-700 delay-200 ${
61
+ mounted ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-4'
62
+ }`}
63
+ >
64
+ Start fresh or add features to your existing project.
65
+ <span className="text-white font-medium"> Create new apps</span> or <span className="text-white font-medium">upgrade existing ones</span>—all in minutes.
66
+ </p>
67
+ </div>
68
+
69
+ {/* CTA Buttons */}
70
+ <div
71
+ className={`flex flex-col sm:flex-row items-center justify-center gap-4 transition-all duration-700 delay-300 ${
72
+ mounted ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-4'
73
+ }`}
74
+ >
75
+ <Button asChild size="lg" className="text-lg px-8 h-14 group">
76
+ <Link href="/sign-up">
77
+ Get Started Free
78
+ <ArrowRight className="ml-2 h-5 w-5 group-hover:translate-x-1 transition-transform" />
79
+ </Link>
80
+ </Button>
81
+ <Button asChild variant="outline" size="lg" className="text-lg px-8 h-14">
82
+ <Link href="#features">
83
+ See Features
84
+ </Link>
85
+ </Button>
86
+ </div>
87
+
88
+ {/* Feature Pills */}
89
+ <div
90
+ className={`flex flex-wrap items-center justify-center gap-3 transition-all duration-700 delay-500 ${
91
+ mounted ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-4'
92
+ }`}
93
+ >
94
+ {[
95
+ { icon: Rocket, text: "Production Ready" },
96
+ { icon: Code2, text: "Full Stack" },
97
+ { icon: Clock, text: "5 Min Setup" },
98
+ ].map((feature, idx) => (
99
+ <div
100
+ key={idx}
101
+ className="flex items-center gap-2 px-4 py-2 rounded-full bg-[#1a1a1a]/80 backdrop-blur-sm border border-[#ff5722]/20 text-sm"
102
+ >
103
+ <feature.icon className="w-4 h-4 text-[#ff5722]" />
104
+ <span className="font-medium text-white">{feature.text}</span>
105
+ </div>
106
+ ))}
107
+ </div>
108
+ </div>
109
+ </div>
110
+ </section>
111
+ );
112
+ }
@@ -0,0 +1,124 @@
1
+ import {
2
+ Shadcnui,
3
+ TailwindCSS,
4
+ BetterAuth,
5
+ Polar,
6
+ NeonPostgres,
7
+ Nextjs,
8
+ } from "@/components/logos";
9
+ import { Card } from "@/components/ui/card";
10
+ import * as React from "react";
11
+
12
+ export default function Integrations() {
13
+ return (
14
+ <section className="bg-black">
15
+ <div className="pt-12 pb-32">
16
+ <div className="mx-auto max-w-5xl px-6">
17
+ <div>
18
+ <h2 className="text-balance text-3xl font-semibold md:text-4xl bg-gradient-to-r from-white to-gray-400 bg-clip-text text-transparent">
19
+ Built with the best tools
20
+ </h2>
21
+ <p className="text-gray-400 mt-3 text-lg">
22
+ Launch your project with confidence, knowing that you&apos;re
23
+ using the best tools available.
24
+ </p>
25
+ </div>
26
+
27
+ <div className="mt-12 grid gap-4 sm:grid-cols-2 lg:grid-cols-3">
28
+ <IntegrationCard
29
+ title="Next.js"
30
+ description="The React framework for production with App Router, Server Components, and built-in optimizations."
31
+ link="https://nextjs.org"
32
+ >
33
+ <Nextjs />
34
+ </IntegrationCard>
35
+
36
+ <IntegrationCard
37
+ title="Better Auth"
38
+ description="Modern authentication library with session management, OAuth providers, and security features."
39
+ link="https://better-auth.com"
40
+ >
41
+ <BetterAuth />
42
+ </IntegrationCard>
43
+
44
+ <IntegrationCard
45
+ title="Neon Postgres"
46
+ description="Serverless PostgreSQL database with branching, autoscaling, and modern developer experience."
47
+ link="https://neon.tech"
48
+ >
49
+ <NeonPostgres />
50
+ </IntegrationCard>
51
+
52
+ <IntegrationCard
53
+ title="Polar.sh"
54
+ description="Developer-first subscription platform with webhooks, customer portal, and usage-based billing."
55
+ link="https://polar.sh"
56
+ >
57
+ <Polar />
58
+ </IntegrationCard>
59
+
60
+ <IntegrationCard
61
+ title="Tailwind CSS"
62
+ description="Utility-first CSS framework for rapid UI development with consistent design tokens."
63
+ link="https://tailwindcss.com"
64
+ >
65
+ <TailwindCSS />
66
+ </IntegrationCard>
67
+
68
+ <IntegrationCard
69
+ title="shadcn/ui"
70
+ description="Beautiful, accessible components built with Radix UI primitives and styled with Tailwind CSS."
71
+ link="https://ui.shadcn.com"
72
+ >
73
+ <Shadcnui />
74
+ </IntegrationCard>
75
+ </div>
76
+ </div>
77
+ </div>
78
+ </section>
79
+ );
80
+ }
81
+
82
+ const IntegrationCard = ({
83
+ title,
84
+ description,
85
+ children,
86
+ link,
87
+ }: {
88
+ title: string;
89
+ description: string;
90
+ children: React.ReactNode;
91
+ link?: string;
92
+ }) => {
93
+ const CardContent = () => (
94
+ <div className="relative">
95
+ <div className="*:size-10">{children}</div>
96
+
97
+ <div className="mt-6 space-y-1.5">
98
+ <h3 className="text-lg font-semibold text-white">{title}</h3>
99
+ <p className="text-gray-400 line-clamp-2">{description}</p>
100
+ </div>
101
+ </div>
102
+ );
103
+
104
+ if (link) {
105
+ return (
106
+ <a
107
+ href={link}
108
+ target="_blank"
109
+ rel="noopener noreferrer"
110
+ className="block transition-transform hover:scale-105"
111
+ >
112
+ <Card className="p-6 h-full cursor-pointer bg-[#0a0a0a] border-[#2a2a2a] hover:border-[#ff5722]/30 hover:shadow-lg hover:shadow-[#ff5722]/10 transition-all duration-300 rounded-md">
113
+ <CardContent />
114
+ </Card>
115
+ </a>
116
+ );
117
+ }
118
+
119
+ return (
120
+ <Card className="p-6 bg-[#0a0a0a] border-[#2a2a2a]">
121
+ <CardContent />
122
+ </Card>
123
+ );
124
+ };
@@ -0,0 +1,116 @@
1
+ "use client";
2
+
3
+ import Link from "next/link";
4
+ import { Button } from "@/components/ui/button";
5
+ import { Menu, X, Twitter } from "lucide-react";
6
+ import { useState } from "react";
7
+
8
+ export default function Navigation() {
9
+ const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
10
+
11
+ const navLinks = [
12
+ { name: "Features", href: "#features" },
13
+ { name: "Pricing", href: "#pricing" },
14
+ ];
15
+
16
+ return (
17
+ <header className="fixed top-0 left-0 right-0 z-50 bg-black/80 backdrop-blur-lg border-b border-[#ff5722]/20">
18
+ <nav className="mx-auto max-w-7xl px-6 lg:px-8">
19
+ <div className="flex h-16 items-center justify-between">
20
+ {/* Logo */}
21
+ <div className="flex items-center">
22
+ <Link href="/" className="flex items-center space-x-2">
23
+ <div className="h-8 w-8 rounded-lg bg-gradient-to-br from-[#ff5722] to-[#d84315] flex items-center justify-center shadow-lg shadow-[#ff5722]/20">
24
+ <span className="text-white font-bold text-lg">S</span>
25
+ </div>
26
+ <span className="font-semibold text-lg hidden sm:block text-white">saas-scaffold</span>
27
+ </Link>
28
+ </div>
29
+
30
+ {/* Desktop Navigation */}
31
+ <div className="hidden md:flex md:items-center md:space-x-8">
32
+ {navLinks.map((link) => (
33
+ <Link
34
+ key={link.name}
35
+ href={link.href}
36
+ target={link.external ? "_blank" : undefined}
37
+ rel={link.external ? "noopener noreferrer" : undefined}
38
+ className="text-sm font-medium text-gray-400 hover:text-[#ff5722] transition-colors"
39
+ >
40
+ {link.name}
41
+ </Link>
42
+ ))}
43
+ <Link
44
+ href="https://x.com/Kedbranten"
45
+ target="_blank"
46
+ rel="noopener noreferrer"
47
+ className="text-gray-400 hover:text-[#ff5722] transition-colors"
48
+ aria-label="Follow on X (Twitter)"
49
+ >
50
+ <Twitter className="h-5 w-5" />
51
+ </Link>
52
+ </div>
53
+
54
+ {/* Auth Buttons */}
55
+ <div className="hidden md:flex md:items-center md:space-x-3">
56
+ <Button asChild variant="ghost" size="sm">
57
+ <Link href="/sign-in">Sign In</Link>
58
+ </Button>
59
+ <Button asChild size="sm">
60
+ <Link href="/sign-up">Get Started</Link>
61
+ </Button>
62
+ </div>
63
+
64
+ {/* Mobile Menu Button */}
65
+ <button
66
+ type="button"
67
+ className="md:hidden rounded-md p-2 text-gray-400 hover:text-[#ff5722]"
68
+ onClick={() => setMobileMenuOpen(!mobileMenuOpen)}
69
+ >
70
+ {mobileMenuOpen ? (
71
+ <X className="h-6 w-6" />
72
+ ) : (
73
+ <Menu className="h-6 w-6" />
74
+ )}
75
+ </button>
76
+ </div>
77
+
78
+ {/* Mobile Menu */}
79
+ {mobileMenuOpen && (
80
+ <div className="md:hidden pb-4 space-y-2 bg-black/95 backdrop-blur-lg border-t border-[#ff5722]/20">
81
+ {navLinks.map((link) => (
82
+ <Link
83
+ key={link.name}
84
+ href={link.href}
85
+ target={link.external ? "_blank" : undefined}
86
+ rel={link.external ? "noopener noreferrer" : undefined}
87
+ className="block px-3 py-2 text-base font-medium text-gray-400 hover:text-[#ff5722] transition-colors"
88
+ onClick={() => setMobileMenuOpen(false)}
89
+ >
90
+ {link.name}
91
+ </Link>
92
+ ))}
93
+ <Link
94
+ href="https://x.com/Kedbranten"
95
+ target="_blank"
96
+ rel="noopener noreferrer"
97
+ className="flex items-center gap-2 px-3 py-2 text-base font-medium text-gray-400 hover:text-[#ff5722] transition-colors"
98
+ onClick={() => setMobileMenuOpen(false)}
99
+ >
100
+ <Twitter className="h-5 w-5" />
101
+ <span>Follow on X</span>
102
+ </Link>
103
+ <div className="pt-4 space-y-2">
104
+ <Button asChild variant="ghost" size="sm" className="w-full text-white hover:text-[#ff5722]">
105
+ <Link href="/sign-in">Sign In</Link>
106
+ </Button>
107
+ <Button asChild size="sm" className="w-full">
108
+ <Link href="/sign-up">Get Started</Link>
109
+ </Button>
110
+ </div>
111
+ </div>
112
+ )}
113
+ </nav>
114
+ </header>
115
+ );
116
+ }
@@ -0,0 +1,82 @@
1
+ import { Calendar, ArrowRight } from "lucide-react";
2
+ import Link from "next/link";
3
+ import { Button } from "@/components/ui/button";
4
+
5
+ const updates = [
6
+ {
7
+ date: "Dec 18, 2025",
8
+ title: "Resend Email Integration",
9
+ description:
10
+ "Added Resend email support for transactional emails. Send welcome emails, password resets, and notifications with React Email templates.",
11
+ tag: "Feature",
12
+ },
13
+ {
14
+ date: "Dec 18, 2025",
15
+ title: "Supabase Database Support",
16
+ description:
17
+ "Now supporting Supabase Postgres alongside Neon. Choose your preferred database provider during project setup.",
18
+ tag: "Feature",
19
+ },
20
+ {
21
+ date: "Dec 18, 2025",
22
+ title: "Enhanced Documentation",
23
+ description:
24
+ "Comprehensive docs section with setup guides for all integrations. Step-by-step instructions for every service.",
25
+ tag: "Enhancement",
26
+ },
27
+ ];
28
+
29
+ export default function NewsSection() {
30
+ return (
31
+ <section className="py-20 px-6 lg:px-0 bg-gradient-to-b from-black via-[#0a0a0a] to-black">
32
+ <div className="mx-auto max-w-6xl">
33
+ <div className="flex items-center justify-between mb-12">
34
+ <div>
35
+ <h2 className="text-4xl font-bold mb-2 bg-gradient-to-r from-white to-gray-400 bg-clip-text text-transparent">Latest Updates</h2>
36
+ <p className="text-gray-400 text-lg">
37
+ Stay up to date with new features and improvements
38
+ </p>
39
+ </div>
40
+ <Button asChild variant="ghost" size="sm" className="hidden sm:flex text-white hover:text-[#ff5722]">
41
+ <Link href="/blog">
42
+ View All Updates
43
+ <ArrowRight className="ml-2 h-4 w-4" />
44
+ </Link>
45
+ </Button>
46
+ </div>
47
+
48
+ <div className="grid grid-cols-1 md:grid-cols-3 gap-6">
49
+ {updates.map((update, index) => (
50
+ <div
51
+ key={index}
52
+ className="bg-[#0a0a0a] border border-[#2a2a2a] rounded-lg p-6 hover:border-[#ff5722]/30 hover:shadow-lg hover:shadow-[#ff5722]/10 transition-all duration-300"
53
+ >
54
+ <div className="flex items-center gap-2 mb-3">
55
+ <span className="bg-[#ff5722]/10 text-[#ff5722] text-xs font-medium px-2.5 py-1 rounded">
56
+ {update.tag}
57
+ </span>
58
+ <div className="flex items-center text-gray-400 text-sm">
59
+ <Calendar className="w-4 h-4 mr-1" />
60
+ {update.date}
61
+ </div>
62
+ </div>
63
+ <h3 className="text-lg font-semibold mb-2 text-white">{update.title}</h3>
64
+ <p className="text-gray-400 text-sm">
65
+ {update.description}
66
+ </p>
67
+ </div>
68
+ ))}
69
+ </div>
70
+
71
+ <div className="mt-8 sm:hidden">
72
+ <Button asChild variant="ghost" size="sm" className="w-full text-white hover:text-[#ff5722]">
73
+ <Link href="/blog">
74
+ View All Updates
75
+ <ArrowRight className="ml-2 h-4 w-4" />
76
+ </Link>
77
+ </Button>
78
+ </div>
79
+ </div>
80
+ </section>
81
+ );
82
+ }