Skip to content

Commit 1165c15

Browse files
(SP: 2) [Frontend] Redesign Home Hero & Add Features Section (#319)
* refactor(home): rename hero sections and add complete i18n support - Rename LegacyHeroSection → WelcomeHeroSection - Rename HeroSection → FeaturesHeroSection - Add welcomeDescription translation key to eliminate duplication - Translate all hardcoded text (headings, badges, CTAs) - Improve Ukrainian/Polish translations for better readability - Remove unused legacy components and images * feat(about): update LinkedIn follower count to reflect current stat (1.5k+) * refactor(home): implement i18n for FlipCardQA & fix memory leaks * fix(home): resolve rotateY conflict & scope keyboard events in FlipCardQA * fix(home): resolve all issues * chore(home): cleanup comments, remove dead code & fix trailing spaces
1 parent d221d5c commit 1165c15

24 files changed

Lines changed: 1389 additions & 293 deletions

frontend/app/[locale]/page.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { getTranslations } from 'next-intl/server';
22

3-
import HeroSection from '@/components/home/HeroSection';
3+
import FeaturesHeroSection from '@/components/home/FeaturesHeroSection';
44

55
export async function generateMetadata({
66
params,
@@ -57,10 +57,13 @@ export async function generateMetadata({
5757
};
5858
}
5959

60+
import WelcomeHeroSection from '@/components/home/WelcomeHeroSection';
61+
6062
export default function Home() {
6163
return (
6264
<>
63-
<HeroSection />
65+
<WelcomeHeroSection />
66+
<FeaturesHeroSection />
6467
</>
6568
);
6669
}

frontend/app/globals.css

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,19 @@
277277
.animate-dash-flow {
278278
animation: dash-flow 2s linear infinite;
279279
}
280+
281+
/* 3D Flip Card */
282+
.perspective-1000 {
283+
perspective: 1000px;
284+
}
285+
286+
.preserve-3d {
287+
transform-style: preserve-3d;
288+
}
289+
290+
.backface-hidden {
291+
backface-visibility: hidden;
292+
}
280293
}
281294

282295
@keyframes float {

frontend/components/about/HeroSection.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export function HeroSection({ stats }: { stats?: PlatformStats }) {
1616
questionsSolved: '850+',
1717
githubStars: '120+',
1818
activeUsers: '200+',
19-
linkedinFollowers: '1.3k+',
19+
linkedinFollowers: '1.5k+',
2020
};
2121

2222
return (

frontend/components/home/CodeCard.tsx

Lines changed: 0 additions & 39 deletions
This file was deleted.
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
'use client';
2+
3+
import { useTranslations } from 'next-intl';
4+
import Link from 'next/link';
5+
import * as React from 'react';
6+
import { BrainCircuit, MessageCircleQuestion, TrendingUp } from 'lucide-react';
7+
8+
import { DynamicGridBackground } from '@/components/shared/DynamicGridBackground';
9+
10+
import { FlipCardQA } from './FlipCardQA';
11+
import { FloatingCode } from './FloatingCode';
12+
13+
export default function FeaturesHeroSection() {
14+
const t = useTranslations('homepage');
15+
16+
return (
17+
<DynamicGridBackground
18+
showStaticGrid
19+
className="relative flex min-h-screen items-center justify-center overflow-hidden bg-gray-50 transition-colors duration-300 dark:bg-black"
20+
>
21+
<FloatingCode />
22+
23+
<div className="relative z-10 flex w-full max-w-6xl flex-col items-center px-6 py-8 text-center sm:py-12">
24+
25+
<h1 className="mb-4 text-2xl font-black tracking-tight text-gray-900 sm:text-4xl md:text-5xl dark:text-white">
26+
{t('featuresHeading.aceYourNext')}{' '}<br className="sm:hidden" />
27+
<span className="bg-gradient-to-r from-[var(--accent-primary)] via-[color-mix(in_srgb,var(--accent-primary)_70%,white)] to-[var(--accent-hover)] bg-clip-text text-transparent">
28+
{t('featuresHeading.technicalInterview')}
29+
</span>
30+
</h1>
31+
32+
<p className="mb-6 max-w-xl text-xs text-gray-600 sm:text-base dark:text-gray-400">
33+
{t('description')}
34+
</p>
35+
36+
<div className="mb-8 flex flex-row flex-wrap items-center justify-center gap-3 sm:gap-4">
37+
<div className="group relative overflow-hidden rounded-full border border-blue-200/60 bg-gradient-to-r from-blue-50 to-indigo-50 px-4 py-2 shadow-sm transition-all duration-300 hover:scale-105 hover:shadow-md dark:border-blue-800/30 dark:from-blue-950/30 dark:to-indigo-950/30">
38+
<div className="absolute inset-0 bg-gradient-to-r from-blue-100/0 via-blue-100/50 to-blue-100/0 opacity-0 transition-opacity duration-300 group-hover:opacity-100 dark:from-blue-800/0 dark:via-blue-800/30 dark:to-blue-800/0" />
39+
<span className="relative flex items-center gap-2 text-xs font-semibold text-blue-700 sm:text-sm dark:text-blue-300">
40+
<MessageCircleQuestion className="h-4 w-4" />
41+
<span className="whitespace-nowrap">{t('featureBadges.smartQA')}</span>
42+
</span>
43+
</div>
44+
45+
<div className="group relative overflow-hidden rounded-full border border-purple-200/60 bg-gradient-to-r from-purple-50 to-pink-50 px-4 py-2 shadow-sm transition-all duration-300 hover:scale-105 hover:shadow-md dark:border-purple-800/30 dark:from-purple-950/30 dark:to-pink-950/30">
46+
<div className="absolute inset-0 bg-gradient-to-r from-purple-100/0 via-purple-100/50 to-purple-100/0 opacity-0 transition-opacity duration-300 group-hover:opacity-100 dark:from-purple-800/0 dark:via-purple-800/30 dark:to-purple-800/0" />
47+
<span className="relative flex items-center gap-2 text-xs font-semibold text-purple-700 sm:text-sm dark:text-purple-300">
48+
<BrainCircuit className="h-4 w-4" />
49+
<span className="whitespace-nowrap">{t('featureBadges.adaptiveQuizzes')}</span>
50+
</span>
51+
</div>
52+
53+
<div className="group relative overflow-hidden rounded-full border border-emerald-200/60 bg-gradient-to-r from-emerald-50 to-teal-50 px-4 py-2 shadow-sm transition-all duration-300 hover:scale-105 hover:shadow-md dark:border-emerald-800/30 dark:from-emerald-950/30 dark:to-teal-950/30">
54+
<div className="absolute inset-0 bg-gradient-to-r from-emerald-100/0 via-emerald-100/50 to-emerald-100/0 opacity-0 transition-opacity duration-300 group-hover:opacity-100 dark:from-emerald-800/0 dark:via-emerald-800/30 dark:to-emerald-800/0" />
55+
<span className="relative flex items-center gap-2 text-xs font-semibold text-emerald-700 sm:text-sm dark:text-emerald-300">
56+
<TrendingUp className="h-4 w-4" />
57+
<span className="whitespace-nowrap">{t('featureBadges.performance')}</span>
58+
</span>
59+
</div>
60+
</div>
61+
62+
<FlipCardQA />
63+
64+
<div className="mt-8 flex flex-col gap-3 sm:flex-row sm:gap-4">
65+
<Link
66+
href="/q&a"
67+
className="group relative overflow-hidden rounded-full bg-gradient-to-r from-[var(--accent-primary)] to-[var(--accent-hover)] px-6 py-2.5 text-sm font-bold text-white shadow-lg shadow-[var(--accent-primary)]/20 transition-all duration-300 hover:scale-[1.02] hover:shadow-xl hover:shadow-[var(--accent-primary)]/30 focus:outline-none focus:ring-2 focus:ring-[var(--accent-primary)] focus:ring-offset-2 dark:shadow-[var(--accent-primary)]/10 dark:hover:shadow-[var(--accent-primary)]/20"
68+
>
69+
<span className="relative z-10 flex items-center justify-center gap-2">
70+
{t('featuresCta.browseQuestions')}
71+
<svg className="h-3.5 w-3.5 transition-transform group-hover:translate-x-1" fill="none" viewBox="0 0 24 24" stroke="currentColor">
72+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2.5} d="M13 7l5 5m0 0l-5 5m5-5H6" />
73+
</svg>
74+
</span>
75+
</Link>
76+
77+
<Link
78+
href="/quizzes"
79+
className="group relative overflow-hidden rounded-full border border-gray-300/60 bg-white/80 px-6 py-2.5 text-sm font-bold text-gray-900 shadow-sm transition-all duration-300 hover:bg-white hover:border-gray-400 hover:scale-[1.02] hover:shadow-md focus:outline-none focus:ring-2 focus:ring-gray-300 focus:ring-offset-2 dark:border-white/10 dark:bg-[#121212] dark:text-gray-200 dark:hover:bg-neutral-900 dark:hover:border-white/20 dark:shadow-none"
80+
>
81+
<span className="flex items-center justify-center gap-2">
82+
{t('featuresCta.takeQuiz')}
83+
<svg className="h-3.5 w-3.5 text-gray-400 transition-transform group-hover:rotate-12 dark:text-gray-500" fill="none" viewBox="0 0 24 24" stroke="currentColor">
84+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2.5} d="M13 10V3L4 14h7v7l9-11h-7z" />
85+
</svg>
86+
</span>
87+
</Link>
88+
</div>
89+
</div>
90+
</DynamicGridBackground>
91+
);
92+
}

0 commit comments

Comments
 (0)