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,212 @@
1
+ import Link from "next/link";
2
+ import { ArrowLeft } from "lucide-react";
3
+
4
+ export const metadata = {
5
+ title: "Terms of Service",
6
+ description: "Terms of Service for {{PROJECT_NAME}}",
7
+ };
8
+
9
+ export default function TermsOfService() {
10
+ return (
11
+ <div className="min-h-screen bg-black">
12
+ {/* Back Link */}
13
+ <div className="border-b border-[#2a2a2a]">
14
+ <div className="container mx-auto px-4 py-6 sm:px-6 lg:px-8">
15
+ <Link
16
+ href="/"
17
+ className="inline-flex items-center text-sm text-gray-400 hover:text-[#ff5722] transition-colors"
18
+ >
19
+ <ArrowLeft className="mr-2 h-4 w-4" />
20
+ Back to Home
21
+ </Link>
22
+ </div>
23
+ </div>
24
+
25
+ {/* Content */}
26
+ <div className="container mx-auto px-4 py-12 sm:px-6 lg:px-8">
27
+ <div className="mx-auto max-w-4xl">
28
+ <h1 className="text-4xl font-bold tracking-tight text-white sm:text-5xl mb-4">
29
+ Terms of Service
30
+ </h1>
31
+ <p className="text-gray-400 mb-8">
32
+ Last updated: {new Date().toLocaleDateString("en-US", { year: "numeric", month: "long", day: "numeric" })}
33
+ </p>
34
+
35
+ <div className="space-y-8 text-gray-300">
36
+ {/* ChatGPT Customization Prompt */}
37
+ {/*
38
+ To customize this template, use ChatGPT with this prompt:
39
+
40
+ "I need to create Terms of Service for my SaaS product called [YOUR_PRODUCT_NAME].
41
+ Key details:
42
+ - Service description: [DESCRIBE YOUR SERVICE]
43
+ - Company name: [YOUR_COMPANY_NAME]
44
+ - Location: [YOUR_COUNTRY/STATE]
45
+ - Key features: [LIST KEY FEATURES]
46
+ - Pricing model: [SUBSCRIPTION/ONE-TIME/FREE]
47
+ - User data handling: [DESCRIBE]
48
+
49
+ Please generate comprehensive Terms of Service covering: acceptance of terms,
50
+ user accounts, service usage rules, payment terms, intellectual property,
51
+ limitation of liability, termination, and dispute resolution."
52
+ */}
53
+ <section>
54
+ <h2 className="text-2xl font-bold text-white mb-4">1. Acceptance of Terms</h2>
55
+ <p className="leading-relaxed">
56
+ By accessing and using {{PROJECT_NAME}} (&quot;Service&quot;), you accept and agree to be bound by the
57
+ terms and provision of this agreement. If you do not agree to these Terms of Service,
58
+ please do not use the Service.
59
+ </p>
60
+ </section>
61
+
62
+ <section>
63
+ <h2 className="text-2xl font-bold text-white mb-4">2. Description of Service</h2>
64
+ <p className="leading-relaxed mb-4">
65
+ {{PROJECT_NAME}} provides {{PROJECT_DESCRIPTION}}. The Service is provided &quot;as is&quot; and
66
+ we reserve the right to modify, suspend, or discontinue the Service at any time without notice.
67
+ </p>
68
+ </section>
69
+
70
+ <section>
71
+ <h2 className="text-2xl font-bold text-white mb-4">3. User Accounts</h2>
72
+ <p className="leading-relaxed mb-4">
73
+ To access certain features of the Service, you must create an account. You are responsible for:
74
+ </p>
75
+ <ul className="list-disc list-inside space-y-2 ml-4">
76
+ <li>Maintaining the confidentiality of your account credentials</li>
77
+ <li>All activities that occur under your account</li>
78
+ <li>Notifying us immediately of any unauthorized use</li>
79
+ <li>Ensuring your account information is accurate and up-to-date</li>
80
+ </ul>
81
+ </section>
82
+
83
+ <section>
84
+ <h2 className="text-2xl font-bold text-white mb-4">4. Acceptable Use</h2>
85
+ <p className="leading-relaxed mb-4">
86
+ You agree not to use the Service to:
87
+ </p>
88
+ <ul className="list-disc list-inside space-y-2 ml-4">
89
+ <li>Violate any applicable laws or regulations</li>
90
+ <li>Infringe on intellectual property rights of others</li>
91
+ <li>Transmit malicious code, viruses, or harmful content</li>
92
+ <li>Attempt to gain unauthorized access to our systems</li>
93
+ <li>Use the Service for any illegal or unauthorized purpose</li>
94
+ <li>Interfere with or disrupt the Service or servers</li>
95
+ </ul>
96
+ </section>
97
+
98
+ <section>
99
+ <h2 className="text-2xl font-bold text-white mb-4">5. Payment and Billing</h2>
100
+ <p className="leading-relaxed mb-4">
101
+ Certain features of the Service require payment of fees. You agree to:
102
+ </p>
103
+ <ul className="list-disc list-inside space-y-2 ml-4">
104
+ <li>Provide accurate and complete billing information</li>
105
+ <li>Pay all fees as described on our pricing page</li>
106
+ <li>Authorize us to charge your payment method on a recurring basis</li>
107
+ <li>Update your payment information to avoid service interruption</li>
108
+ </ul>
109
+ <p className="leading-relaxed mt-4">
110
+ Subscription fees are non-refundable except as required by law. You may cancel your
111
+ subscription at any time, and cancellation will take effect at the end of your current billing period.
112
+ </p>
113
+ </section>
114
+
115
+ <section>
116
+ <h2 className="text-2xl font-bold text-white mb-4">6. Intellectual Property</h2>
117
+ <p className="leading-relaxed mb-4">
118
+ The Service and its original content, features, and functionality are owned by
119
+ [YOUR_COMPANY_NAME] and are protected by international copyright, trademark, patent,
120
+ trade secret, and other intellectual property laws.
121
+ </p>
122
+ <p className="leading-relaxed">
123
+ You retain ownership of any content you submit to the Service. By submitting content,
124
+ you grant us a worldwide, non-exclusive, royalty-free license to use, reproduce, and
125
+ display your content solely for the purpose of providing the Service.
126
+ </p>
127
+ </section>
128
+
129
+ <section>
130
+ <h2 className="text-2xl font-bold text-white mb-4">7. Limitation of Liability</h2>
131
+ <p className="leading-relaxed mb-4">
132
+ To the maximum extent permitted by law, {{PROJECT_NAME}} shall not be liable for any
133
+ indirect, incidental, special, consequential, or punitive damages, or any loss of profits
134
+ or revenues, whether incurred directly or indirectly, or any loss of data, use, goodwill,
135
+ or other intangible losses resulting from:
136
+ </p>
137
+ <ul className="list-disc list-inside space-y-2 ml-4">
138
+ <li>Your use or inability to use the Service</li>
139
+ <li>Any unauthorized access to or use of our servers</li>
140
+ <li>Any interruption or cessation of transmission to or from the Service</li>
141
+ <li>Any bugs, viruses, or similar harmful content transmitted through the Service</li>
142
+ </ul>
143
+ </section>
144
+
145
+ <section>
146
+ <h2 className="text-2xl font-bold text-white mb-4">8. Disclaimer of Warranties</h2>
147
+ <p className="leading-relaxed">
148
+ The Service is provided on an &quot;as is&quot; and &quot;as available&quot; basis without any warranties
149
+ of any kind, either express or implied. We do not warrant that the Service will be
150
+ uninterrupted, timely, secure, or error-free.
151
+ </p>
152
+ </section>
153
+
154
+ <section>
155
+ <h2 className="text-2xl font-bold text-white mb-4">9. Termination</h2>
156
+ <p className="leading-relaxed">
157
+ We reserve the right to terminate or suspend your account and access to the Service
158
+ immediately, without prior notice or liability, for any reason, including if you breach
159
+ these Terms of Service. Upon termination, your right to use the Service will cease immediately.
160
+ </p>
161
+ </section>
162
+
163
+ <section>
164
+ <h2 className="text-2xl font-bold text-white mb-4">10. Changes to Terms</h2>
165
+ <p className="leading-relaxed">
166
+ We reserve the right to modify these Terms at any time. We will notify you of any changes
167
+ by posting the new Terms on this page and updating the &quot;Last updated&quot; date. Your continued
168
+ use of the Service after any changes constitutes acceptance of the new Terms.
169
+ </p>
170
+ </section>
171
+
172
+ <section>
173
+ <h2 className="text-2xl font-bold text-white mb-4">11. Governing Law</h2>
174
+ <p className="leading-relaxed">
175
+ These Terms shall be governed by and construed in accordance with the laws of
176
+ [YOUR_JURISDICTION], without regard to its conflict of law provisions. Any disputes
177
+ arising from these Terms or the Service shall be resolved in the courts of [YOUR_JURISDICTION].
178
+ </p>
179
+ </section>
180
+
181
+ <section>
182
+ <h2 className="text-2xl font-bold text-white mb-4">12. Contact Information</h2>
183
+ <p className="leading-relaxed">
184
+ If you have any questions about these Terms of Service, please contact us at:
185
+ </p>
186
+ <div className="mt-4 bg-[#0a0a0a] border border-[#2a2a2a] rounded-lg p-6">
187
+ <p className="text-gray-300">
188
+ Email: <span className="text-[#ff5722]">[your-email@example.com]</span>
189
+ </p>
190
+ <p className="text-gray-300 mt-2">
191
+ Company: <span className="text-[#ff5722]">[YOUR_COMPANY_NAME]</span>
192
+ </p>
193
+ <p className="text-gray-300 mt-2">
194
+ Address: <span className="text-[#ff5722]">[YOUR_ADDRESS]</span>
195
+ </p>
196
+ </div>
197
+ </section>
198
+
199
+ <div className="mt-12 p-6 bg-[#ff5722]/10 border border-[#ff5722]/30 rounded-lg">
200
+ <p className="text-sm text-gray-300">
201
+ <strong className="text-[#ff5722]">Note:</strong> This is a template for Terms of Service.
202
+ Please consult with a legal professional to ensure these terms are appropriate for your
203
+ specific service and jurisdiction. Replace all placeholder text (marked with [BRACKETS])
204
+ with your actual information.
205
+ </p>
206
+ </div>
207
+ </div>
208
+ </div>
209
+ </div>
210
+ </div>
211
+ );
212
+ }
@@ -0,0 +1,47 @@
1
+ import { pgTable, text, timestamp, boolean, integer } from "drizzle-orm/pg-core";
2
+
3
+ export const user = pgTable("user", {
4
+ id: text('id').primaryKey(),
5
+ name: text('name').notNull(),
6
+ email: text('email').notNull().unique(),
7
+ emailVerified: boolean('email_verified').$defaultFn(() => false).notNull(),
8
+ image: text('image'),
9
+ createdAt: timestamp('created_at').$defaultFn(() => /* @__PURE__ */ new Date()).notNull(),
10
+ updatedAt: timestamp('updated_at').$defaultFn(() => /* @__PURE__ */ new Date()).notNull()
11
+ });
12
+
13
+ export const session = pgTable("session", {
14
+ id: text('id').primaryKey(),
15
+ expiresAt: timestamp('expires_at').notNull(),
16
+ token: text('token').notNull().unique(),
17
+ createdAt: timestamp('created_at').notNull(),
18
+ updatedAt: timestamp('updated_at').notNull(),
19
+ ipAddress: text('ip_address'),
20
+ userAgent: text('user_agent'),
21
+ userId: text('user_id').notNull().references(()=> user.id, { onDelete: 'cascade' })
22
+ });
23
+
24
+ export const account = pgTable("account", {
25
+ id: text('id').primaryKey(),
26
+ accountId: text('account_id').notNull(),
27
+ providerId: text('provider_id').notNull(),
28
+ userId: text('user_id').notNull().references(()=> user.id, { onDelete: 'cascade' }),
29
+ accessToken: text('access_token'),
30
+ refreshToken: text('refresh_token'),
31
+ idToken: text('id_token'),
32
+ accessTokenExpiresAt: timestamp('access_token_expires_at'),
33
+ refreshTokenExpiresAt: timestamp('refresh_token_expires_at'),
34
+ scope: text('scope'),
35
+ password: text('password'),
36
+ createdAt: timestamp('created_at').notNull(),
37
+ updatedAt: timestamp('updated_at').notNull()
38
+ });
39
+
40
+ export const verification = pgTable("verification", {
41
+ id: text('id').primaryKey(),
42
+ identifier: text('identifier').notNull(),
43
+ value: text('value').notNull(),
44
+ expiresAt: timestamp('expires_at').notNull(),
45
+ createdAt: timestamp('created_at').$defaultFn(() => /* @__PURE__ */ new Date()),
46
+ updatedAt: timestamp('updated_at').$defaultFn(() => /* @__PURE__ */ new Date())
47
+ });
@@ -0,0 +1,138 @@
1
+ "use client";
2
+
3
+ import { useEffect, useState } from "react";
4
+
5
+ export default function CliWorkflowSection() {
6
+ const [mounted, setMounted] = useState(false);
7
+
8
+ useEffect(() => {
9
+ setMounted(true);
10
+ }, []);
11
+
12
+ return (
13
+ <section className="relative min-h-[60vh] bg-black overflow-visible py-16">
14
+ {/* Background gradient continuation */}
15
+ <div className="absolute inset-0 bg-gradient-to-b from-black via-[#ff5722]/5 to-black" />
16
+
17
+ <div className="relative z-10 mx-auto max-w-4xl px-6 lg:px-8">
18
+ <div className="flex items-center justify-center">
19
+ {/* Terminal */}
20
+ <div
21
+ className={`w-full transition-all duration-700 ${
22
+ mounted ? "opacity-100 scale-100" : "opacity-0 scale-95"
23
+ }`}
24
+ >
25
+ <div className="relative group">
26
+ <div className="absolute -inset-1 bg-gradient-to-r from-[#ff5722] to-[#d84315] rounded-lg blur opacity-30 group-hover:opacity-60 transition duration-1000" />
27
+ <div className="relative w-full bg-black/90 backdrop-blur-xl rounded-lg border border-[#ff5722]/20 overflow-hidden">
28
+ <div className="flex items-center gap-2 px-6 py-4 border-b border-[#ff5722]/10">
29
+ <div className="flex gap-1.5">
30
+ <div className="w-3 h-3 rounded-full bg-red-500/80" />
31
+ <div className="w-3 h-3 rounded-full bg-yellow-500/80" />
32
+ <div className="w-3 h-3 rounded-full bg-green-500/80" />
33
+ </div>
34
+ <span className="text-xs text-gray-400 ml-2">Terminal</span>
35
+ </div>
36
+ <div className="p-6 font-mono text-sm space-y-3">
37
+ {/* Step 1: Run CLI */}
38
+ <div>
39
+ <div className="flex items-center">
40
+ <span className="text-green-400">$</span>
41
+ <span className="text-[#ff7043] ml-2">npx</span>
42
+ <span className="text-[#ff5722] ml-2">shipd</span>
43
+ <span className="text-white ml-2">init</span>
44
+ </div>
45
+ </div>
46
+
47
+ {/* Step 2: Cargo Ship + Choose name */}
48
+ <div className="pt-4 space-y-2">
49
+ <pre className="text-[#ff7043] text-[9px] leading-tight overflow-x-auto">
50
+ {` # # ( )
51
+ ___#_#___|__
52
+ _ |____________| _
53
+ _=====| | | | | |==== _
54
+ =====| |.---------------------------. | |====
55
+ <---------------------------' '----------------/
56
+ \\ .d8888. db db d888888b d8888b. d8888b. /
57
+ \\ 88' YP 88 88 \\\`88' 88 \\\`8D 88 \\\`8D /
58
+ \\ \\\`8bo. 88ooo88 88 88oodD' 88 88 /
59
+ \\ \\\`Y8b. 88~~~88 88 88~~~ 88 88 /
60
+ \\ db 8D 88 88 .88. 88 88 .8D /
61
+ \\\`8888Y' YP YP Y888888P 88 Y8888D' /
62
+ \\_____________________________________________________________________ /
63
+ wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
64
+ wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
65
+ wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww`}
66
+ </pre>
67
+ <div className="text-gray-400 pt-2">
68
+ ? What is your project name?{" "}
69
+ <span className="text-white">my-saas-app</span>
70
+ </div>
71
+ </div>
72
+
73
+ {/* Step 3: Choose functionality */}
74
+ <div className="pt-4 space-y-2">
75
+ <div className="text-gray-400">
76
+ ? Select features for your app:
77
+ </div>
78
+ <div className="pl-4 space-y-1">
79
+ <div className="text-gray-400">
80
+ <span className="text-green-400">◉</span> Authentication
81
+ </div>
82
+ <div className="text-gray-400">
83
+ <span className="text-green-400">◉</span> Billing &
84
+ Subscriptions
85
+ </div>
86
+ <div className="text-gray-400">
87
+ <span className="text-green-400">◉</span> Dashboard
88
+ </div>
89
+ <div className="text-gray-400">
90
+ <span className="text-green-400">◉</span> Email
91
+ Integration
92
+ </div>
93
+ </div>
94
+ </div>
95
+
96
+ {/* Step 4: Build */}
97
+ <div className="pt-4 space-y-2">
98
+ <div className="text-gray-400">
99
+ <span className="text-green-400">✓</span> Creating project
100
+ structure...
101
+ </div>
102
+ <div className="text-gray-400">
103
+ <span className="text-green-400">✓</span> Installing
104
+ dependencies...
105
+ </div>
106
+ <div className="text-gray-400">
107
+ <span className="text-green-400">✓</span> Configuring
108
+ features...
109
+ </div>
110
+ <div className="text-gray-400">
111
+ <span className="text-green-400">✓</span> Building
112
+ application...
113
+ </div>
114
+ <div className="text-green-400 pt-2">
115
+ 🎉 Done! Your SaaS app is ready.
116
+ </div>
117
+ </div>
118
+
119
+ {/* Final command */}
120
+ <div className="pt-4 border-t border-[#ff5722]/10">
121
+ <div className="flex items-center">
122
+ <span className="text-green-400">$</span>
123
+ <span className="text-white ml-2">cd my-saas-app</span>
124
+ </div>
125
+ <div className="flex items-center mt-2">
126
+ <span className="text-green-400">$</span>
127
+ <span className="text-white ml-2">npm run dev</span>
128
+ </div>
129
+ </div>
130
+ </div>
131
+ </div>
132
+ </div>
133
+ </div>
134
+ </div>
135
+ </div>
136
+ </section>
137
+ );
138
+ }
@@ -0,0 +1,150 @@
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
+ </p>
94
+ </div>
95
+ <div className="text-right">
96
+ <div className="inline-flex items-center gap-2 px-4 py-2 rounded-lg bg-[#1a1a1a] border border-[#2a2a2a]">
97
+ <div className="w-3 h-3 rounded-full bg-green-500 border-2 border-green-400"></div>
98
+ <span className="text-sm text-gray-300">
99
+ <span className="text-white font-medium">Green border</span> = Implemented
100
+ </span>
101
+ </div>
102
+ <p className="text-xs text-gray-500 mt-2">No border = Coming soon</p>
103
+ </div>
104
+ </div>
105
+ </div>
106
+
107
+ <div className="border border-[#2a2a2a] bg-[#0a0a0a] rounded-lg overflow-hidden">
108
+ <div className="overflow-x-auto">
109
+ <table className="w-full">
110
+ <thead>
111
+ <tr className="border-b border-[#2a2a2a]">
112
+ <th className="px-6 py-4 text-left text-sm font-semibold text-white">Category</th>
113
+ <th className="px-6 py-4 text-left text-sm font-semibold text-white">Options</th>
114
+ </tr>
115
+ </thead>
116
+ <tbody>
117
+ {features.map((feature, idx) => (
118
+ <tr
119
+ key={feature.category}
120
+ className={`border-b border-[#2a2a2a] hover:bg-[#0a0a0a]/80 transition-colors ${
121
+ idx === features.length - 1 ? "border-b-0" : ""
122
+ }`}
123
+ >
124
+ <td className="px-6 py-4 text-white font-medium">{feature.category}</td>
125
+ <td className="px-6 py-4">
126
+ <div className="flex flex-wrap gap-2">
127
+ {feature.options.map((option) => (
128
+ <span
129
+ key={option.name}
130
+ className={`inline-flex items-center px-3 py-1 rounded-full text-sm bg-[#1a1a1a] text-gray-300 ${
131
+ option.implemented
132
+ ? "border-2 border-green-500"
133
+ : "border border-[#2a2a2a]"
134
+ }`}
135
+ >
136
+ {option.name}
137
+ </span>
138
+ ))}
139
+ </div>
140
+ </td>
141
+ </tr>
142
+ ))}
143
+ </tbody>
144
+ </table>
145
+ </div>
146
+ </div>
147
+ </div>
148
+ </section>
149
+ );
150
+ }
@@ -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
+ }