Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 50 additions & 30 deletions app/[locale]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@ const DISCORD_INVITE_URL = 'https://discord.com/invite/eegRCDmwbM';
const CHAPTER_1_NOTES_URL = '/notes/chapter-1';
const CHAPTER_1_SLIDES_URL =
'https://drive.google.com/file/d/1kZLWj9N8C96wh-Ow2iV1D-Q9G_IU_4CU/view?usp=drive_link';
const INTRO_YOUTUBE_URL = 'https://www.youtube.com/watch?v=67zwkh_cC6Q';
const CHAPTER_1_YOUTUBE_URL =
'https://www.youtube.com/playlist?list=PLvTXryB-aeclKsDmbPj3WKPdtBmZ5_xZX';
const PLAYLIST_EMBED_URL =
'https://www.youtube.com/embed/videoseries?list=PLvTXryB-aeclKsDmbPj3WKPdtBmZ5_xZX';
const INTRO_VIDEO_EMBED_URL =
'https://www.youtube.com/embed/67zwkh_cC6Q?list=PLvTXryB-aeclKsDmbPj3WKPdtBmZ5_xZX';

const PAST_CHAPTERS = [
{
Expand Down Expand Up @@ -70,25 +71,40 @@ export default function LandingPage() {
<div className="absolute inset-0 bg-[radial-gradient(circle_at_top,rgba(164,114,255,0.18),transparent_28%),linear-gradient(180deg,rgba(12,11,20,0.96),rgba(9,9,16,1))]" />
<div className="absolute inset-0 bg-[linear-gradient(to_right,rgba(164,114,255,0.05)_1px,transparent_1px),linear-gradient(to_bottom,rgba(34,211,238,0.04)_1px,transparent_1px)] bg-[size:48px_48px] opacity-20" />

<div className="relative mx-auto w-full max-w-6xl px-6 py-8 sm:px-10">
<div className="grid w-full grid-cols-1 items-start gap-10 lg:grid-cols-[1fr_3fr_1fr]">
<div className="relative w-full px-6 py-8 sm:px-8 lg:px-12">
<div className="grid w-full grid-cols-1 items-start gap-8 lg:grid-cols-[1fr_2.5fr_1fr]">

{/* Capítulos pasados */}
{PAST_CHAPTERS.length > 0 && (
<div>
<p className="mb-3 font-mono text-xs uppercase tracking-[0.3em] text-primary/70">
<p className="mb-4 font-mono text-sm uppercase tracking-[0.3em] text-primary/70">
{t('landing.frontPage.sections.past.kicker')}
</p>
<div className="border-l-2 border-white/10 py-3 pl-4">
<div className="flex flex-col gap-1.5">
<span className="text-base font-medium text-foreground">
{t('landing.frontPage.chapters.introduction.title')}
</span>
<span className="text-sm text-muted-foreground/60">
{t('landing.frontPage.chapters.introduction.name')}
</span>
<div className="flex flex-wrap gap-2 pt-1.5">
<a href={INTRO_YOUTUBE_URL} target="_blank" rel="noopener noreferrer" title="Watch introduction" className="rounded-md border border-white/10 px-2 py-0.5 text-sm text-muted-foreground transition hover:border-primary/40 hover:text-primary">
{t('landing.frontPage.sections.past.playlistCta')}
</a>
</div>
</div>
</div>
{PAST_CHAPTERS.map((chapter) => (
<div key={chapter.slug} className="border-l-2 border-white/10 py-2 pl-4">
<div className="flex flex-col gap-1">
<span className="text-sm font-medium text-foreground">
<div key={chapter.slug} className="border-l-2 border-white/10 py-3 pl-4">
<div className="flex flex-col gap-1.5">
<span className="text-base font-medium text-foreground">
{t('landing.frontPage.sections.past.chapterLabel', { number: chapter.number })}
</span>
<span className="text-xs text-muted-foreground/60">
<span className="text-sm text-muted-foreground/60">
{t(`landing.frontPage.chapters.${chapter.slug}.name`)}
</span>
<div className="flex gap-3 pt-1">
<div className="flex flex-wrap gap-2 pt-1.5">
<a href={chapter.chapterUrl} target="_blank" rel="noopener noreferrer" title="Open chapter" className="rounded-md border border-white/10 px-2 py-0.5 text-sm text-muted-foreground transition hover:border-primary/40 hover:text-primary">
{t('landing.frontPage.sections.past.webCta')}
</a>
Expand Down Expand Up @@ -139,8 +155,21 @@ export default function LandingPage() {
</p>
</div>

{/* Intro video */}
<div className="overflow-hidden rounded-xl border border-white/8">
<div className="relative aspect-video">
<iframe
src={INTRO_VIDEO_EMBED_URL}
title={t('landing.frontPage.introVideo')}
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen
className="absolute inset-0 h-full w-full"
/>
</div>
</div>

{/* CTA card */}
<div className="grid overflow-hidden rounded-xl border border-white/8 bg-white/[0.03] grid-cols-1 sm:grid-cols-[1fr_240px]">
<div className="overflow-hidden rounded-xl border border-white/8 bg-white/[0.03]">
<div className="flex flex-col justify-between gap-4 p-5">
<div className="flex flex-col gap-2">
<div className="flex items-center gap-2">
Expand All @@ -153,7 +182,7 @@ export default function LandingPage() {
{t('landing.frontPage.cta.description')}
</p>
</div>
<div className="flex flex-col gap-2">
<div className="flex flex-wrap gap-2">
<a
href={DISCORD_INVITE_URL}
target="_blank"
Expand All @@ -167,22 +196,13 @@ export default function LandingPage() {
href={LUMA_URL}
target="_blank"
rel="noopener noreferrer"
className="inline-flex w-fit items-center gap-1.5 text-sm text-muted-foreground transition hover:text-foreground"
className="inline-flex w-fit items-center gap-2 rounded-lg border border-white/20 bg-white/5 px-4 py-2 text-sm font-medium text-muted-foreground transition hover:border-white/40 hover:bg-white/10 hover:text-foreground"
>
{t('landing.frontPage.cta.lumaCta')}
<ExternalLink className="size-3" />
<ExternalLink className="size-3.5" />
</a>
</div>
</div>
<div className="hidden overflow-hidden sm:block">
<iframe
src={PLAYLIST_EMBED_URL}
title={t('landing.frontPage.sections.past.embedTitle')}
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowFullScreen
className="h-full w-full"
/>
</div>
</div>

<footer className="text-xs text-muted-foreground">
Expand All @@ -191,11 +211,11 @@ export default function LandingPage() {
</div>

{/* Contribuidores */}
<div>
<p className="mb-3 font-mono text-xs uppercase tracking-[0.3em] text-primary/70">
<div className="lg:text-right">
<p className="mb-4 font-mono text-sm uppercase tracking-[0.3em] text-primary/70">
{t('landing.frontPage.contributors.kicker')}
</p>
<div className="flex flex-col gap-3">
<div className="flex flex-col gap-4 lg:items-end">
{[
{ handle: 'd4rm_', name: 'dantesito', url: 'https://x.com/d4rm_' },
{ handle: 'mattaereal', name: 'matta', url: 'https://x.com/mattaereal' },
Expand All @@ -205,18 +225,18 @@ export default function LandingPage() {
href={contributor.url}
target="_blank"
rel="noopener noreferrer"
className="group flex items-center gap-2.5 transition"
className="group flex items-center gap-3 transition lg:flex-row-reverse"
>
<Avatar className="size-7 ring-1 ring-white/10 transition group-hover:ring-primary/40">
<Avatar className="size-9 ring-1 ring-white/10 transition group-hover:ring-primary/40">
<AvatarImage
src={`https://unavatar.io/twitter/${contributor.handle}`}
alt={contributor.name}
/>
<AvatarFallback className="text-[10px] text-muted-foreground">
<AvatarFallback className="text-xs text-muted-foreground">
{contributor.name[0].toUpperCase()}
</AvatarFallback>
</Avatar>
<span className="text-sm text-muted-foreground transition group-hover:text-foreground">
<span className="text-base text-muted-foreground transition group-hover:text-foreground">
{contributor.name}
</span>
</a>
Expand Down
4 changes: 4 additions & 0 deletions messages/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -528,6 +528,10 @@
}
},
"chapters": {
"introduction": {
"title": "Introduction",
"name": "Study group presentation"
},
"chapter-1": {
"title": "Chapter 1",
"name": "What is Ethereum?"
Expand Down
4 changes: 4 additions & 0 deletions messages/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -528,6 +528,10 @@
}
},
"chapters": {
"introduction": {
"title": "Introducción",
"name": "Presentación del grupo de estudio"
},
"chapter-1": {
"title": "Capítulo 1",
"name": "¿Qué es Ethereum?"
Expand Down
Loading