Skip to content

Commit 85daaaa

Browse files
Enhance navbar, add GitHub integration, and enable email notifications
- Add GitHub button with live star counter and "Fork This Repository" label - Implement full-width navbar with responsive breakpoints and proper spacing - Add Vault and Academy buttons with gradient styling and equal widths - Move theme toggle to left side after logo for better UX - Create toast notification system replacing email integration warnings - Add comprehensive admin email notifications to [email protected] - Fix hydration mismatches in BuiltByTesseract component (removed Math.random) - Enhance Features section with promotional VAULT11 discount styling - Improve hero section spacing for better viewport utilization - Re-enable actual email capture with proper error handling and success states 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
1 parent 2b39758 commit 85daaaa

File tree

13 files changed

+578
-141
lines changed

13 files changed

+578
-141
lines changed

README.md

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,17 @@
2121
<div align="center">
2222

2323
### 🏠 Landing Page
24+
2425
![Landing Page](docs/images/landing-page.png)
2526
*Beautiful, responsive landing page with dark/light mode support*
2627

2728
### 📱 Mobile Experience
29+
2830
![Mobile View](docs/images/mobile-view.png)
2931
*Fully responsive design optimized for all devices*
3032

3133
### 🎨 Component Showcase
34+
3235
![Components](docs/images/components-showcase.png)
3336
*Rich component library with smooth animations*
3437

@@ -43,6 +46,7 @@
4346
<td width="50%">
4447

4548
### 🎨 **Design & UI**
49+
4650
- ✅ Beautiful, modern design system
4751
- ✅ Dark/light mode with system preference
4852
- ✅ Fully responsive (mobile-first)
@@ -54,6 +58,7 @@
5458
<td width="50%">
5559

5660
### **Technical Stack**
61+
5762
-**Next.js 15.3.3** with App Router
5863
-**TypeScript** with strict mode
5964
-**Tailwind CSS** utility-first styling
@@ -159,6 +164,7 @@ NODE_ENV=production
159164
<summary><b>🎨 Brand Customization</b></summary>
160165

161166
### Colors
167+
162168
Update your brand colors in `src/app/globals.css`:
163169

164170
```css
@@ -170,14 +176,18 @@ Update your brand colors in `src/app/globals.css`:
170176
```
171177

172178
### Logos
179+
173180
Replace these files in `/public/assets/logos/`:
181+
174182
- `logo-light.svg` - Full logo for light theme
175183
- `logo-dark.svg` - Full logo for dark theme
176184
- `icon-light.svg` - Icon for mobile (light)
177185
- `icon-dark.svg` - Icon for mobile (dark)
178186

179187
### Content
188+
180189
Key files to customize:
190+
181191
- `src/components/HeroOptimized.tsx` - Hero section
182192
- `src/components/Features.tsx` - Product features
183193
- `src/components/Pricing.tsx` - Pricing plans
@@ -206,7 +216,7 @@ Key files to customize:
206216

207217
<div align="center">
208218

209-
### Deploy with one click to your favorite platform:
219+
### Deploy with one click to your favorite platform
210220

211221
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/tesseract-creator/nextjs-supabase-2025-starter)
212222
[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/tesseract-creator/nextjs-supabase-2025-starter)
@@ -217,20 +227,24 @@ Key files to customize:
217227
<summary><b>🔧 Manual Deployment Instructions</b></summary>
218228

219229
### Vercel (Recommended)
230+
220231
1. Push your code to GitHub
221232
2. Connect your repository to [Vercel](https://vercel.com)
222233
3. Add your environment variables in Vercel dashboard
223234
4. Deploy!
224235

225236
### Other Platforms
237+
226238
This template works with:
239+
227240
- **Netlify** - Static site hosting
228241
- **AWS Amplify** - Full-stack deployment
229242
- **Railway** - Container deployment
230243
- **Digital Ocean** - App platform
231244
- **Heroku** - Container deployment
232245

233246
**Build Settings:**
247+
234248
- Build command: `npm run build`
235249
- Start command: `npm start`
236250
- Node version: `18.x` or `20.x`
@@ -282,6 +296,7 @@ This template works with:
282296
<td width="50%">
283297

284298
### **Included Out of the Box**
299+
285300
- Complete UI component library
286301
- Responsive design system
287302
- Dark/light mode toggle
@@ -298,6 +313,7 @@ This template works with:
298313
<td width="50%">
299314

300315
### 📝 **You Need to Add**
316+
301317
- Your actual content & copy
302318
- Real logos & branding assets
303319
- Supabase database schema
@@ -377,7 +393,7 @@ Made possible by these amazing technologies:
377393
[![Framer Motion](https://img.shields.io/badge/-Framer%20Motion-0055FF?style=flat&logo=framer)](https://framer.com/motion)
378394
[![Supabase](https://img.shields.io/badge/-Supabase-3ECF8E?style=flat&logo=supabase&logoColor=white)](https://supabase.com/)
379395

380-
### ⭐ If this project helped you, please give it a star!
396+
### ⭐ If this project helped you, please give it a star
381397

382398
[![GitHub Stars](https://img.shields.io/github/stars/tesseract-creator/nextjs-supabase-2025-starter?style=social)](https://github.com/tesseract-creator/nextjs-supabase-2025-starter/stargazers)
383399

@@ -389,4 +405,4 @@ Made possible by these amazing technologies:
389405

390406
**Ready to build something amazing? [Get started now!](#-quick-start) 🚀**
391407

392-
</div>
408+
</div>

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,5 +85,6 @@
8585
"prettier-plugin-tailwindcss": "^0.6.13",
8686
"tailwindcss": "^3.4.17",
8787
"typescript": "^5"
88-
}
88+
},
89+
"packageManager": "[email protected]+sha512.5ea8b0deed94ed68691c9bad4c955492705c5eeb8a87ef86bc62c74a26b037b08ff9570f108b2e4dbd1dd1a9186fea925e527f141c648e85af45631074680184"
8990
}

src/app/api/subscribe/route.ts

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,21 @@ export async function POST(request: NextRequest) {
8282
}
8383
}
8484

85+
// Send admin notification to Vadim
86+
if (process.env.RESEND_API_KEY) {
87+
try {
88+
await resend.emails.send({
89+
90+
91+
subject: '🎯 New Email Subscriber',
92+
html: generateAdminNotificationHTML(email, request),
93+
});
94+
} catch (adminEmailError) {
95+
console.error('Admin notification error:', adminEmailError);
96+
// Don't fail the request if admin email fails
97+
}
98+
}
99+
85100
return NextResponse.json({
86101
success: true,
87102
message: 'Successfully subscribed! Check your email for confirmation and resources.',
@@ -97,6 +112,117 @@ export async function POST(request: NextRequest) {
97112
}
98113
}
99114

115+
function generateAdminNotificationHTML(email: string, request: NextRequest): string {
116+
const timestamp = new Date().toLocaleString('en-US', {
117+
timeZone: 'America/New_York',
118+
year: 'numeric',
119+
month: 'long',
120+
day: 'numeric',
121+
hour: '2-digit',
122+
minute: '2-digit',
123+
second: '2-digit'
124+
});
125+
126+
const userAgent = request.headers.get('user-agent') || 'Unknown';
127+
const referer = request.headers.get('referer') || 'Direct';
128+
129+
return `
130+
<!DOCTYPE html>
131+
<html lang="en">
132+
<head>
133+
<meta charset="UTF-8">
134+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
135+
<title>New Email Subscriber</title>
136+
<style>
137+
body {
138+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
139+
line-height: 1.6;
140+
color: #333;
141+
max-width: 600px;
142+
margin: 0 auto;
143+
padding: 20px;
144+
background-color: #f9fafb;
145+
}
146+
.container {
147+
background: white;
148+
border-radius: 12px;
149+
padding: 30px;
150+
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
151+
}
152+
.header {
153+
text-align: center;
154+
margin-bottom: 30px;
155+
padding: 20px;
156+
background: linear-gradient(135deg, #da3229 0%, #e0392f 100%);
157+
border-radius: 8px;
158+
color: white;
159+
}
160+
.email-highlight {
161+
background: #f3f4f6;
162+
padding: 15px;
163+
border-radius: 8px;
164+
margin: 20px 0;
165+
border-left: 4px solid #e0392f;
166+
}
167+
.info-row {
168+
margin: 10px 0;
169+
padding: 10px;
170+
background: #f9fafb;
171+
border-radius: 6px;
172+
}
173+
.label {
174+
font-weight: 600;
175+
color: #374151;
176+
}
177+
.value {
178+
color: #6b7280;
179+
margin-left: 10px;
180+
}
181+
</style>
182+
</head>
183+
<body>
184+
<div class="container">
185+
<div class="header">
186+
<h1>🎯 New Email Subscriber</h1>
187+
<p>Someone just joined your mailing list!</p>
188+
</div>
189+
190+
<div class="email-highlight">
191+
<h2 style="margin: 0; color: #1f2937;">New Subscriber Email:</h2>
192+
<p style="font-size: 18px; font-weight: 600; color: #e0392f; margin: 10px 0;">${email}</p>
193+
</div>
194+
195+
<div class="info-row">
196+
<span class="label">📅 Timestamp:</span>
197+
<span class="value">${timestamp}</span>
198+
</div>
199+
200+
<div class="info-row">
201+
<span class="label">🌐 Source:</span>
202+
<span class="value">Scroll Modal</span>
203+
</div>
204+
205+
<div class="info-row">
206+
<span class="label">🔗 Referrer:</span>
207+
<span class="value">${referer}</span>
208+
</div>
209+
210+
<div class="info-row">
211+
<span class="label">💻 User Agent:</span>
212+
<span class="value">${userAgent}</span>
213+
</div>
214+
215+
<hr style="margin: 30px 0; border: none; border-top: 1px solid #e5e7eb;">
216+
217+
<p style="text-align: center; color: #6b7280; font-size: 14px;">
218+
This notification was automatically generated from your Next.js application.
219+
</p>
220+
</div>
221+
</body>
222+
</html>
223+
`;
224+
}
225+
100226
function generateWelcomeEmailHTML(): string {
101227
return `
102228
<!DOCTYPE html>

src/app/layout.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { Analytics } from '@vercel/analytics/react';
77
import { SpeedInsights } from '@vercel/speed-insights/next';
88
import { SubtleNodeBackground } from '@/components/SubtleNodeBackground';
99
import { EmailSubmissionProvider } from '@/contexts/EmailSubmissionContext';
10+
import { ToastProvider } from '@/contexts/ToastContext';
1011
import { ClarityProvider } from '@/components/ClarityProvider';
1112
import { ThemeProvider } from '@/components/ThemeProvider';
1213
import { ThemeScript } from '@/components/ThemeScript';
@@ -78,12 +79,14 @@ export default function RootLayout({
7879
)}
7980
>
8081
<ThemeProvider defaultTheme="system" storageKey="theme">
81-
<EmailSubmissionProvider>
82-
<ClarityProvider />
83-
<SubtleNodeBackground />
84-
{/* <PageLoader /> */}
85-
{children}
86-
</EmailSubmissionProvider>
82+
<ToastProvider>
83+
<EmailSubmissionProvider>
84+
<ClarityProvider />
85+
<SubtleNodeBackground />
86+
{/* <PageLoader /> */}
87+
{children}
88+
</EmailSubmissionProvider>
89+
</ToastProvider>
8790
</ThemeProvider>
8891
<Analytics />
8992
<SpeedInsights />

src/app/page.tsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@ import { FinalCTA } from '@/components/FinalCTA';
1414
import { Footer } from '@/components/Footer';
1515
import { ScrollEmailModal } from '@/components/ScrollEmailModal';
1616
import { BuiltByTesseract } from '@/components/BuiltByTesseract';
17+
import { useToast } from '@/contexts/ToastContext';
1718

1819
export default function Home() {
20+
const { showToast } = useToast();
21+
1922
const handleEmailSubmit = async (email: string) => {
2023
try {
2124
const response = await fetch('/api/subscribe', {
@@ -32,9 +35,22 @@ export default function Home() {
3235
throw new Error(data.error || 'Failed to subscribe');
3336
}
3437

38+
showToast({
39+
type: 'success',
40+
title: 'Successfully Subscribed! 🎉',
41+
message: 'Check your email for confirmation and free resources.',
42+
duration: 6000,
43+
});
44+
3545
return data;
3646
} catch (error) {
3747
console.error('Email submission error:', error);
48+
showToast({
49+
type: 'error',
50+
title: 'Subscription Failed',
51+
message: 'Please try again later or contact support.',
52+
duration: 6000,
53+
});
3854
throw error;
3955
}
4056
};

src/components/BuiltByTesseract.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,17 @@ export function BuiltByTesseract() {
9191

9292
{/* Floating particles */}
9393
<div className="absolute inset-0 pointer-events-none">
94-
{[...Array(3)].map((_, i) => (
94+
{[
95+
{ left: '25%', top: '15%' },
96+
{ left: '70%', top: '80%' },
97+
{ left: '45%', top: '50%' }
98+
].map((position, i) => (
9599
<motion.div
96100
key={i}
97101
className="absolute h-1 w-1 bg-gradient-to-r from-purple-400 to-pink-400 rounded-full"
98102
style={{
99-
left: `${Math.random() * 100}%`,
100-
top: `${Math.random() * 100}%`,
103+
left: position.left,
104+
top: position.top,
101105
}}
102106
animate={{
103107
y: [-20, -40, -20],

0 commit comments

Comments
 (0)