Skip to content

Commit c8a8905

Browse files
authored
Merge pull request #7 from dspacheco132/feat/video-supabase
feat: add YouTube video support to projects
2 parents e2b5983 + 480e9fe commit c8a8905

File tree

2 files changed

+73
-1
lines changed

2 files changed

+73
-1
lines changed

src/data/projects.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export type Project = {
1313
liveUrl?: string; // Add liveUrl field
1414
githubUrl?: string; // Add githubUrl field
1515
extraImages?: { url: string; alt?: string }[];
16+
youtubeUrl?: string; // Add YouTube video URL field
1617
};
1718

1819
export const projects: Project[] = [
@@ -214,6 +215,7 @@ export const projects: Project[] = [
214215
date: "2025-08-10",
215216
longDescription: "A minimal Docker Compose setup for self-hosting Supabase locally. This project provides a complete Supabase stack including PostgreSQL database, authentication, storage, and all necessary services. It includes backup and restore scripts, making it easy to manage your self-hosted Supabase instance for development and production use.",
216217
githubUrl: "https://github.com/dspacheco132/supabase-deploy.git",
218+
youtubeUrl: "https://www.youtube.com/watch?v=pJkO1j5TwxA&t=354s",
217219
},
218220
{
219221
id: "12",

src/pages/Project.tsx

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useParams, Link, useNavigate } from "react-router-dom";
2-
import { ArrowLeft, Globe, Github, Calendar } from "lucide-react";
2+
import { ArrowLeft, Globe, Github, Calendar, Play, CheckCircle2 } from "lucide-react";
33
import Header from "../components/Header";
44
import Footer from "../components/Footer";
55
import { getProjectById, Project } from "../data/projects";
@@ -126,6 +126,76 @@ const Project = () => {
126126
{project.longDescription}
127127
</p>
128128

129+
{/* YouTube Video */}
130+
{project.youtubeUrl && (
131+
<div className="mb-16">
132+
{/* Header with icon and title */}
133+
<div className="flex items-center gap-3 mb-6">
134+
<div className="p-2 bg-blue-100 dark:bg-blue-900/30 rounded-lg">
135+
<Play className="h-6 w-6 text-blue-600 dark:text-blue-400" />
136+
</div>
137+
<h2 className="text-3xl font-bold text-gray-900 dark:text-white">
138+
How to Customize Emails in Supabase Self-Hosted
139+
</h2>
140+
</div>
141+
142+
{/* Video Player */}
143+
<div className="mb-8">
144+
<div className="bg-gray-900 rounded-xl overflow-hidden shadow-2xl border border-gray-800">
145+
<div className="relative w-full" style={{ paddingBottom: "56.25%" }}>
146+
<iframe
147+
className="absolute top-0 left-0 w-full h-full"
148+
src={project.youtubeUrl.replace("watch?v=", "embed/").split("&")[0]}
149+
title="How to Customize Emails in Supabase Self-Hosted"
150+
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
151+
allowFullScreen
152+
loading="lazy"
153+
/>
154+
</div>
155+
</div>
156+
</div>
157+
158+
{/* Description and Learning Points */}
159+
<div className="bg-gradient-to-br from-blue-50 to-indigo-50 dark:from-gray-800 dark:to-gray-900 rounded-xl p-6 border border-blue-100 dark:border-gray-700 shadow-sm">
160+
<p className="text-gray-700 dark:text-gray-300 mb-6 leading-relaxed">
161+
In this video, you'll learn how to fully customize the transactional emails sent by a self-hosted Supabase instance. We'll walk through how to configure your email provider, update email templates, and make sure every message your users receive matches your brand and application flow.
162+
</p>
163+
164+
<div className="space-y-3">
165+
<p className="text-sm font-semibold text-gray-800 dark:text-gray-200 uppercase tracking-wide">
166+
What you'll learn:
167+
</p>
168+
<div className="grid grid-cols-2 gap-3">
169+
<div className="flex items-start gap-2">
170+
<CheckCircle2 className="h-4 w-4 text-green-600 dark:text-green-400 flex-shrink-0 mt-0.5" />
171+
<span className="text-sm text-gray-700 dark:text-gray-300">
172+
Configure SMTP in Supabase
173+
</span>
174+
</div>
175+
<div className="flex items-start gap-2">
176+
<CheckCircle2 className="h-4 w-4 text-green-600 dark:text-green-400 flex-shrink-0 mt-0.5" />
177+
<span className="text-sm text-gray-700 dark:text-gray-300">
178+
Customize email templates
179+
</span>
180+
</div>
181+
<div className="flex items-start gap-2">
182+
<CheckCircle2 className="h-4 w-4 text-green-600 dark:text-green-400 flex-shrink-0 mt-0.5" />
183+
<span className="text-sm text-gray-700 dark:text-gray-300">
184+
Authentication emails handling
185+
</span>
186+
</div>
187+
<div className="flex items-start gap-2">
188+
<CheckCircle2 className="h-4 w-4 text-green-600 dark:text-green-400 flex-shrink-0 mt-0.5" />
189+
<span className="text-sm text-gray-700 dark:text-gray-300">
190+
Test and validate setup
191+
</span>
192+
</div>
193+
</div>
194+
</div>
195+
</div>
196+
</div>
197+
)}
198+
129199
<div className="flex flex-col sm:flex-row gap-4 mt-8">
130200
{project.liveUrl && (
131201
<a

0 commit comments

Comments
 (0)