shipd 0.1.0

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 (145) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +205 -0
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.js +1366 -0
  5. package/docs-template/README.md +255 -0
  6. package/docs-template/[slug]/[subslug]/page.tsx +1242 -0
  7. package/docs-template/[slug]/page.tsx +422 -0
  8. package/docs-template/api/page.tsx +47 -0
  9. package/docs-template/components/docs/docs-category-page.tsx +162 -0
  10. package/docs-template/components/docs/docs-code-card.tsx +135 -0
  11. package/docs-template/components/docs/docs-header.tsx +69 -0
  12. package/docs-template/components/docs/docs-nav.ts +95 -0
  13. package/docs-template/components/docs/docs-sidebar.tsx +112 -0
  14. package/docs-template/components/docs/docs-toc.tsx +38 -0
  15. package/docs-template/components/ui/badge.tsx +47 -0
  16. package/docs-template/components/ui/button.tsx +60 -0
  17. package/docs-template/components/ui/card.tsx +93 -0
  18. package/docs-template/components/ui/sheet.tsx +140 -0
  19. package/docs-template/documentation/page.tsx +80 -0
  20. package/docs-template/layout.tsx +27 -0
  21. package/docs-template/lib/utils.ts +7 -0
  22. package/docs-template/page.tsx +360 -0
  23. package/package.json +66 -0
  24. package/template/.env.example +45 -0
  25. package/template/README.md +239 -0
  26. package/template/app/api/auth/[...all]/route.ts +4 -0
  27. package/template/app/api/chat/route.ts +16 -0
  28. package/template/app/api/subscription/route.ts +25 -0
  29. package/template/app/api/upload-image/route.ts +64 -0
  30. package/template/app/blog/[slug]/page.tsx +314 -0
  31. package/template/app/blog/page.tsx +107 -0
  32. package/template/app/dashboard/_components/chart-interactive.tsx +289 -0
  33. package/template/app/dashboard/_components/chatbot.tsx +39 -0
  34. package/template/app/dashboard/_components/mode-toggle.tsx +46 -0
  35. package/template/app/dashboard/_components/navbar.tsx +84 -0
  36. package/template/app/dashboard/_components/section-cards.tsx +102 -0
  37. package/template/app/dashboard/_components/sidebar.tsx +90 -0
  38. package/template/app/dashboard/_components/subscribe-button.tsx +49 -0
  39. package/template/app/dashboard/billing/page.tsx +277 -0
  40. package/template/app/dashboard/chat/page.tsx +73 -0
  41. package/template/app/dashboard/cli/page.tsx +260 -0
  42. package/template/app/dashboard/layout.tsx +24 -0
  43. package/template/app/dashboard/page.tsx +216 -0
  44. package/template/app/dashboard/payment/_components/manage-subscription.tsx +22 -0
  45. package/template/app/dashboard/payment/page.tsx +126 -0
  46. package/template/app/dashboard/settings/page.tsx +613 -0
  47. package/template/app/dashboard/upload/page.tsx +324 -0
  48. package/template/app/error.tsx +78 -0
  49. package/template/app/favicon.ico +0 -0
  50. package/template/app/globals.css +126 -0
  51. package/template/app/layout.tsx +135 -0
  52. package/template/app/not-found.tsx +45 -0
  53. package/template/app/page.tsx +28 -0
  54. package/template/app/pricing/_component/pricing-table.tsx +276 -0
  55. package/template/app/pricing/page.tsx +23 -0
  56. package/template/app/privacy-policy/page.tsx +280 -0
  57. package/template/app/robots.txt +12 -0
  58. package/template/app/sign-in/page.tsx +228 -0
  59. package/template/app/sign-up/page.tsx +243 -0
  60. package/template/app/sitemap.ts +62 -0
  61. package/template/app/success/page.tsx +123 -0
  62. package/template/app/terms-of-service/page.tsx +212 -0
  63. package/template/auth-schema.ts +47 -0
  64. package/template/components/homepage/cli-workflow-section.tsx +138 -0
  65. package/template/components/homepage/features-section.tsx +150 -0
  66. package/template/components/homepage/footer.tsx +53 -0
  67. package/template/components/homepage/hero-section.tsx +112 -0
  68. package/template/components/homepage/integrations.tsx +124 -0
  69. package/template/components/homepage/navigation.tsx +116 -0
  70. package/template/components/homepage/news-section.tsx +82 -0
  71. package/template/components/homepage/testimonials-section.tsx +34 -0
  72. package/template/components/logos/BetterAuth.tsx +21 -0
  73. package/template/components/logos/NeonPostgres.tsx +41 -0
  74. package/template/components/logos/Nextjs.tsx +72 -0
  75. package/template/components/logos/Polar.tsx +7 -0
  76. package/template/components/logos/TailwindCSS.tsx +27 -0
  77. package/template/components/logos/index.ts +6 -0
  78. package/template/components/logos/shadcnui.tsx +8 -0
  79. package/template/components/provider.tsx +8 -0
  80. package/template/components/ui/avatar.tsx +53 -0
  81. package/template/components/ui/badge.tsx +46 -0
  82. package/template/components/ui/button.tsx +59 -0
  83. package/template/components/ui/card.tsx +92 -0
  84. package/template/components/ui/chart.tsx +353 -0
  85. package/template/components/ui/checkbox.tsx +32 -0
  86. package/template/components/ui/dialog.tsx +135 -0
  87. package/template/components/ui/dropdown-menu.tsx +257 -0
  88. package/template/components/ui/form.tsx +167 -0
  89. package/template/components/ui/input.tsx +21 -0
  90. package/template/components/ui/label.tsx +24 -0
  91. package/template/components/ui/progress.tsx +31 -0
  92. package/template/components/ui/resizable.tsx +56 -0
  93. package/template/components/ui/select.tsx +185 -0
  94. package/template/components/ui/separator.tsx +28 -0
  95. package/template/components/ui/sheet.tsx +139 -0
  96. package/template/components/ui/skeleton.tsx +13 -0
  97. package/template/components/ui/sonner.tsx +25 -0
  98. package/template/components/ui/switch.tsx +31 -0
  99. package/template/components/ui/tabs.tsx +66 -0
  100. package/template/components/ui/textarea.tsx +18 -0
  101. package/template/components/ui/toggle-group.tsx +73 -0
  102. package/template/components/ui/toggle.tsx +47 -0
  103. package/template/components/ui/tooltip.tsx +61 -0
  104. package/template/components/user-profile.tsx +139 -0
  105. package/template/components.json +21 -0
  106. package/template/db/drizzle.ts +14 -0
  107. package/template/db/migrations/0000_worried_rawhide_kid.sql +77 -0
  108. package/template/db/migrations/meta/0000_snapshot.json +494 -0
  109. package/template/db/migrations/meta/_journal.json +13 -0
  110. package/template/db/schema.ts +85 -0
  111. package/template/drizzle.config.ts +13 -0
  112. package/template/emails/components/layout.tsx +181 -0
  113. package/template/emails/password-reset.tsx +67 -0
  114. package/template/emails/payment-failed.tsx +167 -0
  115. package/template/emails/subscription-confirmation.tsx +129 -0
  116. package/template/emails/welcome.tsx +100 -0
  117. package/template/eslint.config.mjs +16 -0
  118. package/template/hooks/use-mobile.ts +21 -0
  119. package/template/lib/auth-client.ts +8 -0
  120. package/template/lib/auth.ts +276 -0
  121. package/template/lib/email.ts +118 -0
  122. package/template/lib/polar-products.ts +49 -0
  123. package/template/lib/subscription.ts +148 -0
  124. package/template/lib/upload-image.ts +28 -0
  125. package/template/lib/utils.ts +6 -0
  126. package/template/middleware.ts +30 -0
  127. package/template/next-env.d.ts +5 -0
  128. package/template/next.config.ts +27 -0
  129. package/template/package.json +99 -0
  130. package/template/postcss.config.mjs +5 -0
  131. package/template/public/add.png +0 -0
  132. package/template/public/favicon.svg +4 -0
  133. package/template/public/file.svg +1 -0
  134. package/template/public/globe.svg +1 -0
  135. package/template/public/iphone.png +0 -0
  136. package/template/public/logo.png +0 -0
  137. package/template/public/next.svg +1 -0
  138. package/template/public/polar-sh.svg +1 -0
  139. package/template/public/shadcn-ui.svg +1 -0
  140. package/template/public/site.webmanifest +21 -0
  141. package/template/public/vercel.svg +1 -0
  142. package/template/public/window.svg +1 -0
  143. package/template/tailwind.config.ts +89 -0
  144. package/template/template.config.json +138 -0
  145. package/template/tsconfig.json +27 -0
@@ -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
+ Build SaaS Apps
52
+ </span>
53
+ <br />
54
+ <span className="bg-gradient-to-r from-[#ff5722] via-[#ff7043] to-[#d84315] bg-clip-text text-transparent">
55
+ in Minutes
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
+ Skip the boilerplate. Get a production-ready SaaS foundation in minutes.
65
+ Choose your stack. Build your vision.
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
+ }
@@ -0,0 +1,34 @@
1
+ export default function TestimonialsSection() {
2
+ return (
3
+ <section className="py-20 px-6 lg:px-0 bg-gradient-to-b from-black via-[#0a0a0a] to-black">
4
+ <div className="mx-auto max-w-6xl">
5
+ <div className="text-center mb-16">
6
+ <h2 className="text-4xl font-bold mb-4 bg-gradient-to-r from-white to-gray-400 bg-clip-text text-transparent">
7
+ Built for Speed
8
+ </h2>
9
+ <p className="text-gray-400 text-xl max-w-2xl mx-auto">
10
+ Everything you need to launch your SaaS in minutes, not weeks
11
+ </p>
12
+ </div>
13
+
14
+ {/* Stats */}
15
+ <div className="flex flex-wrap items-center justify-center gap-8 text-center">
16
+ <div>
17
+ <p className="text-4xl font-bold bg-gradient-to-r from-[#ff5722] to-[#ff7043] bg-clip-text text-transparent">10+</p>
18
+ <p className="text-gray-400 mt-1">Pre-built Integrations</p>
19
+ </div>
20
+ <div className="h-12 w-px bg-[#2a2a2a] hidden sm:block" />
21
+ <div>
22
+ <p className="text-4xl font-bold bg-gradient-to-r from-[#ff5722] to-[#ff7043] bg-clip-text text-transparent">24+</p>
23
+ <p className="text-gray-400 mt-1">UI Components</p>
24
+ </div>
25
+ <div className="h-12 w-px bg-[#2a2a2a] hidden sm:block" />
26
+ <div>
27
+ <p className="text-4xl font-bold bg-gradient-to-r from-[#ff5722] to-[#ff7043] bg-clip-text text-transparent">5 Min</p>
28
+ <p className="text-gray-400 mt-1">Setup Time</p>
29
+ </div>
30
+ </div>
31
+ </div>
32
+ </section>
33
+ );
34
+ }
@@ -0,0 +1,21 @@
1
+ import * as React from "react";
2
+ import type { SVGProps } from "react";
3
+ const BetterAuth = (props: SVGProps<SVGSVGElement>) => (
4
+ <svg
5
+ xmlns="http://www.w3.org/2000/svg"
6
+ fill="none"
7
+ viewBox="0 0 500 500"
8
+ width="1em"
9
+ height="1em"
10
+ {...props}
11
+ >
12
+ <path fill="#fff" d="M0 0h500v500H0z" />
13
+ <path fill="#000" d="M69 121h86.988v259H69zM337.575 121H430v259h-92.425z" />
14
+ <path
15
+ fill="#000"
16
+ d="M427.282 121v83.456h-174.52V121zM430 296.544V380H252.762v-83.456z"
17
+ />
18
+ <path fill="#000" d="M252.762 204.455v92.089h-96.774v-92.089z" />
19
+ </svg>
20
+ );
21
+ export default BetterAuth;
@@ -0,0 +1,41 @@
1
+ import * as React from "react";
2
+ import type { SVGProps } from "react";
3
+ const Neon = (props: SVGProps<SVGSVGElement>) => (
4
+ <svg
5
+ viewBox="0 0 256 256"
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ width="1em"
8
+ height="1em"
9
+ preserveAspectRatio="xMidYMid"
10
+ {...props}
11
+ >
12
+ <defs>
13
+ <linearGradient id="a" x1="100%" x2="12.069%" y1="100%" y2="0%">
14
+ <stop offset="0%" stopColor="#62F755" />
15
+ <stop offset="100%" stopColor="#8FF986" stopOpacity={0} />
16
+ </linearGradient>
17
+ <linearGradient id="b" x1="100%" x2="40.603%" y1="100%" y2="76.897%">
18
+ <stop offset="0%" stopOpacity={0.9} />
19
+ <stop offset="100%" stopColor="#1A1A1A" stopOpacity={0} />
20
+ </linearGradient>
21
+ </defs>
22
+ <path
23
+ fill="#00E0D9"
24
+ d="M0 44.139C0 19.762 19.762 0 44.139 0H211.86C236.238 0 256 19.762 256 44.139v142.649c0 25.216-31.915 36.16-47.388 16.256l-48.392-62.251v75.484c0 21.939-17.784 39.723-39.722 39.723h-76.36C19.763 256 0 236.238 0 211.861V44.14Zm44.139-8.825c-4.879 0-8.825 3.946-8.825 8.818v167.73c0 4.878 3.946 8.831 8.818 8.831h77.688c2.44 0 3.087-1.977 3.087-4.416v-101.22c0-25.222 31.914-36.166 47.395-16.255l48.391 62.243V44.14c0-4.879.455-8.825-4.416-8.825H44.14Z"
25
+ />
26
+ <path
27
+ fill="url(#a)"
28
+ d="M0 44.139C0 19.762 19.762 0 44.139 0H211.86C236.238 0 256 19.762 256 44.139v142.649c0 25.216-31.915 36.16-47.388 16.256l-48.392-62.251v75.484c0 21.939-17.784 39.723-39.722 39.723h-76.36C19.763 256 0 236.238 0 211.861V44.14Zm44.139-8.825c-4.879 0-8.825 3.946-8.825 8.818v167.73c0 4.878 3.946 8.831 8.818 8.831h77.688c2.44 0 3.087-1.977 3.087-4.416v-101.22c0-25.222 31.914-36.166 47.395-16.255l48.391 62.243V44.14c0-4.879.455-8.825-4.416-8.825H44.14Z"
29
+ />
30
+ <path
31
+ fill="url(#b)"
32
+ fillOpacity={0.4}
33
+ d="M0 44.139C0 19.762 19.762 0 44.139 0H211.86C236.238 0 256 19.762 256 44.139v142.649c0 25.216-31.915 36.16-47.388 16.256l-48.392-62.251v75.484c0 21.939-17.784 39.723-39.722 39.723h-76.36C19.763 256 0 236.238 0 211.861V44.14Zm44.139-8.825c-4.879 0-8.825 3.946-8.825 8.818v167.73c0 4.878 3.946 8.831 8.818 8.831h77.688c2.44 0 3.087-1.977 3.087-4.416v-101.22c0-25.222 31.914-36.166 47.395-16.255l48.391 62.243V44.14c0-4.879.455-8.825-4.416-8.825H44.14Z"
34
+ />
35
+ <path
36
+ fill="#63F655"
37
+ d="M211.861 0C236.238 0 256 19.762 256 44.139v142.649c0 25.216-31.915 36.16-47.388 16.256l-48.392-62.251v75.484c0 21.939-17.784 39.723-39.722 39.723a4.409 4.409 0 0 0 4.409-4.409V115.058c0-25.223 31.914-36.167 47.395-16.256l48.391 62.243V8.825c0-4.871-3.953-8.825-8.832-8.825Z"
38
+ />
39
+ </svg>
40
+ );
41
+ export default Neon;
@@ -0,0 +1,72 @@
1
+ import * as React from "react";
2
+ import type { SVGProps } from "react";
3
+ const Nextjs = (props: SVGProps<SVGSVGElement>) => (
4
+ <svg
5
+ width="1em"
6
+ height="1em"
7
+ viewBox="0 0 180 180"
8
+ fill="none"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ {...props}
11
+ >
12
+ <mask
13
+ id="mask0_408_139"
14
+ style={{
15
+ maskType: "alpha",
16
+ }}
17
+ maskUnits="userSpaceOnUse"
18
+ x={0}
19
+ y={0}
20
+ width={180}
21
+ height={180}
22
+ >
23
+ <circle cx={90} cy={90} r={90} fill="black" />
24
+ </mask>
25
+ <g mask="url(#mask0_408_139)">
26
+ <circle
27
+ cx={90}
28
+ cy={90}
29
+ r={87}
30
+ fill="black"
31
+ stroke="white"
32
+ strokeWidth={6}
33
+ />
34
+ <path
35
+ d="M149.508 157.52L69.142 54H54V125.97H66.1136V69.3836L139.999 164.845C143.333 162.614 146.509 160.165 149.508 157.52Z"
36
+ fill="url(#paint0_linear_408_139)"
37
+ />
38
+ <rect
39
+ x={115}
40
+ y={54}
41
+ width={12}
42
+ height={72}
43
+ fill="url(#paint1_linear_408_139)"
44
+ />
45
+ </g>
46
+ <defs>
47
+ <linearGradient
48
+ id="paint0_linear_408_139"
49
+ x1={109}
50
+ y1={116.5}
51
+ x2={144.5}
52
+ y2={160.5}
53
+ gradientUnits="userSpaceOnUse"
54
+ >
55
+ <stop stopColor="white" />
56
+ <stop offset={1} stopColor="white" stopOpacity={0} />
57
+ </linearGradient>
58
+ <linearGradient
59
+ id="paint1_linear_408_139"
60
+ x1={121}
61
+ y1={54}
62
+ x2={120.799}
63
+ y2={106.875}
64
+ gradientUnits="userSpaceOnUse"
65
+ >
66
+ <stop stopColor="white" />
67
+ <stop offset={1} stopColor="white" stopOpacity={0} />
68
+ </linearGradient>
69
+ </defs>
70
+ </svg>
71
+ );
72
+ export default Nextjs;
@@ -0,0 +1,7 @@
1
+ import Image from "next/image";
2
+
3
+ export default function Polar() {
4
+ return (
5
+ <Image src="/polar-sh.svg" alt="Polar Logo" width={100} height={100} />
6
+ );
7
+ }
@@ -0,0 +1,27 @@
1
+ import * as React from "react";
2
+ import type { SVGProps } from "react";
3
+ const TailwindCSS = (props: SVGProps<SVGSVGElement>) => (
4
+ <svg
5
+ xmlns="http://www.w3.org/2000/svg"
6
+ fill="none"
7
+ viewBox="0 0 54 33"
8
+ width="1em"
9
+ height="1em"
10
+ {...props}
11
+ >
12
+ <g clipPath="url(#a)">
13
+ <path
14
+ fill="#38bdf8"
15
+ fillRule="evenodd"
16
+ d="M27 0c-7.2 0-11.7 3.6-13.5 10.8 2.7-3.6 5.85-4.95 9.45-4.05 2.054.513 3.522 2.004 5.147 3.653C30.744 13.09 33.808 16.2 40.5 16.2c7.2 0 11.7-3.6 13.5-10.8-2.7 3.6-5.85 4.95-9.45 4.05-2.054-.513-3.522-2.004-5.147-3.653C36.756 3.11 33.692 0 27 0zM13.5 16.2C6.3 16.2 1.8 19.8 0 27c2.7-3.6 5.85-4.95 9.45-4.05 2.054.514 3.522 2.004 5.147 3.653C17.244 29.29 20.308 32.4 27 32.4c7.2 0 11.7-3.6 13.5-10.8-2.7 3.6-5.85 4.95-9.45 4.05-2.054-.513-3.522-2.004-5.147-3.653C23.256 19.31 20.192 16.2 13.5 16.2z"
17
+ clipRule="evenodd"
18
+ />
19
+ </g>
20
+ <defs>
21
+ <clipPath id="a">
22
+ <path fill="#fff" d="M0 0h54v32.4H0z" />
23
+ </clipPath>
24
+ </defs>
25
+ </svg>
26
+ );
27
+ export default TailwindCSS;
@@ -0,0 +1,6 @@
1
+ export { default as Nextjs } from "./Nextjs";
2
+ export { default as Polar } from "./Polar";
3
+ export { default as BetterAuth } from "./BetterAuth";
4
+ export { default as NeonPostgres } from "./NeonPostgres";
5
+ export { default as TailwindCSS } from "./TailwindCSS";
6
+ export { default as Shadcnui } from "./shadcnui";
@@ -0,0 +1,8 @@
1
+ import Image from "next/image";
2
+
3
+ const Shadcnui = () => {
4
+ return (
5
+ <Image src="/shadcn-ui.svg" alt="Shadcnui Logo" width={100} height={100} />
6
+ );
7
+ };
8
+ export default Shadcnui;
@@ -0,0 +1,8 @@
1
+ "use client";
2
+
3
+ import { ThemeProvider as NextThemesProvider } from "next-themes";
4
+
5
+ type ThemeProviderProps = React.ComponentProps<typeof NextThemesProvider>;
6
+ export function ThemeProvider({ children, ...props }: ThemeProviderProps) {
7
+ return <NextThemesProvider {...props}>{children}</NextThemesProvider>;
8
+ }