Spaces:
Sleeping
Sleeping
Commit ·
8b1c77d
1
Parent(s): fddd263
Make both pages fully responsive (mobile-first)
Browse files- frontend/src/index.css +3 -2
- frontend/src/pages/AppPage.jsx +10 -9
- frontend/src/pages/LandingPage.jsx +58 -67
- frontend/tailwind.config.js +8 -0
frontend/src/index.css
CHANGED
|
@@ -6,12 +6,13 @@
|
|
| 6 |
|
| 7 |
body {
|
| 8 |
margin: 0;
|
| 9 |
-
background: #ffffff;
|
| 10 |
-
color: #0f172a;
|
| 11 |
font-family: 'Inter', 'Segoe UI', system-ui, sans-serif;
|
| 12 |
-webkit-font-smoothing: antialiased;
|
| 13 |
-moz-osx-font-smoothing: grayscale;
|
| 14 |
min-height: 100vh;
|
|
|
|
| 15 |
}
|
| 16 |
|
| 17 |
#root { min-height: 100vh; }
|
|
|
|
| 6 |
|
| 7 |
body {
|
| 8 |
margin: 0;
|
| 9 |
+
background: #ffffff;
|
| 10 |
+
color: #0f172a;
|
| 11 |
font-family: 'Inter', 'Segoe UI', system-ui, sans-serif;
|
| 12 |
-webkit-font-smoothing: antialiased;
|
| 13 |
-moz-osx-font-smoothing: grayscale;
|
| 14 |
min-height: 100vh;
|
| 15 |
+
overflow-x: hidden;
|
| 16 |
}
|
| 17 |
|
| 18 |
#root { min-height: 100vh; }
|
frontend/src/pages/AppPage.jsx
CHANGED
|
@@ -273,9 +273,9 @@ export default function AppPage() {
|
|
| 273 |
};
|
| 274 |
|
| 275 |
return (
|
| 276 |
-
<div className="bg-bg font-sans text-navy">
|
| 277 |
-
|
| 278 |
-
{/* Main Content Area
|
| 279 |
<div className="min-h-[100dvh] relative flex flex-col">
|
| 280 |
{/* Floating Home Button (No Navbar) */}
|
| 281 |
<button onClick={() => navigate('/')}
|
|
@@ -287,11 +287,11 @@ export default function AppPage() {
|
|
| 287 |
Home
|
| 288 |
</button>
|
| 289 |
|
| 290 |
-
<main className="flex-1 w-full max-w-5xl mx-auto px-
|
| 291 |
|
| 292 |
|
| 293 |
{/* INPUT PANELS */}
|
| 294 |
-
<div className="grid grid-cols-1
|
| 295 |
|
| 296 |
{/* SOURCE */}
|
| 297 |
<SpotlightCard className="bg-white border border-border shadow-sm rounded-2xl p-4 sm:p-6 flex flex-col gap-4">
|
|
@@ -354,12 +354,13 @@ export default function AppPage() {
|
|
| 354 |
)}
|
| 355 |
</SpotlightCard>
|
| 356 |
|
| 357 |
-
{/* arrow */}
|
| 358 |
-
<div className="hidden
|
| 359 |
<svg className="w-5 h-5" fill="none" stroke="currentColor" strokeWidth={2} viewBox="0 0 24 24"><line x1="5" y1="12" x2="19" y2="12"/><polyline points="12 5 19 12 12 19"/></svg>
|
| 360 |
</div>
|
| 361 |
|
| 362 |
-
|
|
|
|
| 363 |
<div className="flex-1 h-px bg-border" />
|
| 364 |
<span className="text-slate text-xs font-bold tracking-widest">THEN</span>
|
| 365 |
<div className="flex-1 h-px bg-border" />
|
|
@@ -452,7 +453,7 @@ export default function AppPage() {
|
|
| 452 |
<h2 className="text-lg sm:text-xl font-extrabold text-navy text-center">Results</h2>
|
| 453 |
|
| 454 |
{/* 3-panel comparison */}
|
| 455 |
-
<div className="grid grid-cols-1
|
| 456 |
{[
|
| 457 |
{ label: 'Source', src: srcFile ? URL.createObjectURL(srcFile) : srcB64 },
|
| 458 |
{ label: 'Target', src: tgtFile ? URL.createObjectURL(tgtFile) : tgtB64 },
|
|
|
|
| 273 |
};
|
| 274 |
|
| 275 |
return (
|
| 276 |
+
<div className="bg-bg font-sans text-navy overflow-x-hidden">
|
| 277 |
+
|
| 278 |
+
{/* Main Content Area */}
|
| 279 |
<div className="min-h-[100dvh] relative flex flex-col">
|
| 280 |
{/* Floating Home Button (No Navbar) */}
|
| 281 |
<button onClick={() => navigate('/')}
|
|
|
|
| 287 |
Home
|
| 288 |
</button>
|
| 289 |
|
| 290 |
+
<main className="flex-1 w-full max-w-5xl mx-auto px-3 sm:px-6 pt-16 sm:pt-20 pb-10 sm:pb-14 flex flex-col gap-4 sm:gap-6">
|
| 291 |
|
| 292 |
|
| 293 |
{/* INPUT PANELS */}
|
| 294 |
+
<div className="grid grid-cols-1 sm:grid-cols-[1fr_28px_1fr] items-start gap-3 sm:gap-0">
|
| 295 |
|
| 296 |
{/* SOURCE */}
|
| 297 |
<SpotlightCard className="bg-white border border-border shadow-sm rounded-2xl p-4 sm:p-6 flex flex-col gap-4">
|
|
|
|
| 354 |
)}
|
| 355 |
</SpotlightCard>
|
| 356 |
|
| 357 |
+
{/* arrow — shown on sm+ */}
|
| 358 |
+
<div className="hidden sm:flex items-center justify-center pt-20 text-border2">
|
| 359 |
<svg className="w-5 h-5" fill="none" stroke="currentColor" strokeWidth={2} viewBox="0 0 24 24"><line x1="5" y1="12" x2="19" y2="12"/><polyline points="12 5 19 12 12 19"/></svg>
|
| 360 |
</div>
|
| 361 |
|
| 362 |
+
{/* divider — mobile only */}
|
| 363 |
+
<div className="sm:hidden flex items-center gap-3">
|
| 364 |
<div className="flex-1 h-px bg-border" />
|
| 365 |
<span className="text-slate text-xs font-bold tracking-widest">THEN</span>
|
| 366 |
<div className="flex-1 h-px bg-border" />
|
|
|
|
| 453 |
<h2 className="text-lg sm:text-xl font-extrabold text-navy text-center">Results</h2>
|
| 454 |
|
| 455 |
{/* 3-panel comparison */}
|
| 456 |
+
<div className="grid grid-cols-1 xs:grid-cols-3 sm:grid-cols-3 gap-2 sm:gap-3">
|
| 457 |
{[
|
| 458 |
{ label: 'Source', src: srcFile ? URL.createObjectURL(srcFile) : srcB64 },
|
| 459 |
{ label: 'Target', src: tgtFile ? URL.createObjectURL(tgtFile) : tgtB64 },
|
frontend/src/pages/LandingPage.jsx
CHANGED
|
@@ -1,6 +1,4 @@
|
|
| 1 |
-
import { useNavigate
|
| 2 |
-
import { motion } from 'framer-motion';
|
| 3 |
-
import SplitText from '../components/ui/SplitText';
|
| 4 |
import BlurText from '../components/ui/BlurText';
|
| 5 |
import AnimatedContent from '../components/ui/AnimatedContent';
|
| 6 |
import Magnet from '../components/ui/Magnet';
|
|
@@ -11,114 +9,107 @@ export default function LandingPage() {
|
|
| 11 |
const navigate = useNavigate();
|
| 12 |
|
| 13 |
return (
|
| 14 |
-
// min-h-screen and overflow-x-hidden allow normal scrolling, but we make the Hero 100vh
|
| 15 |
<div className="min-h-screen w-full bg-bg font-sans overflow-x-hidden flex flex-col text-navy">
|
| 16 |
|
| 17 |
-
{/* ═══
|
| 18 |
-
<div className="absolute top-0 left-0 right-0 z-50 flex items-start justify-between px-3 sm:px-
|
| 19 |
-
|
| 20 |
-
<div className="shrink-0 pointer-events-auto max-w-[48%]">
|
| 21 |
<img src="/logos/marwadi_university.jpeg" alt="Marwadi University"
|
| 22 |
-
className="h-
|
| 23 |
</div>
|
| 24 |
-
|
| 25 |
-
{/* Right — Faculty of Engineering */}
|
| 26 |
-
<div className="shrink-0 pointer-events-auto mt-1 sm:mt-2 max-w-[48%] flex justify-end">
|
| 27 |
<img src="/logos/engineering_faculty.jpeg" alt="Faculty of Engineering"
|
| 28 |
-
className="h-
|
| 29 |
</div>
|
| 30 |
</div>
|
| 31 |
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
{/* Subtle grid background */}
|
| 36 |
<div className="absolute inset-0 pointer-events-none" style={{
|
| 37 |
backgroundImage: 'linear-gradient(rgba(14,116,144,0.02) 1px,transparent 1px),linear-gradient(90deg,rgba(14,116,144,0.02) 1px,transparent 1px)',
|
| 38 |
backgroundSize: '60px 60px',
|
| 39 |
}} />
|
| 40 |
|
| 41 |
-
<div className="relative z-10 w-full max-w-
|
| 42 |
|
| 43 |
-
{/* ICT Logo
|
| 44 |
<AnimatedContent delay={0} direction="down" distance={20}>
|
| 45 |
-
<
|
| 46 |
-
|
| 47 |
-
className="w-[180px] sm:w-[280px] md:w-[380px] max-w-full h-auto object-contain mix-blend-multiply" />
|
| 48 |
-
</div>
|
| 49 |
</AnimatedContent>
|
| 50 |
|
| 51 |
{/* Headline */}
|
| 52 |
-
<div className="w-full">
|
| 53 |
-
<h1 className="
|
| 54 |
-
|
|
|
|
|
|
|
| 55 |
<Typewriter words={[
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
]} />
|
| 62 |
</span>
|
| 63 |
-
<ShinyText text="Starts Here"
|
|
|
|
| 64 |
</h1>
|
| 65 |
</div>
|
| 66 |
|
| 67 |
{/* Subtitle */}
|
| 68 |
<BlurText
|
| 69 |
text="Visualize your potential. Experience campus life virtually and see yourself wearing our colors in just one click."
|
| 70 |
-
className="text-
|
| 71 |
delay={0.3}
|
| 72 |
/>
|
| 73 |
|
| 74 |
-
{/* CTA
|
| 75 |
-
<AnimatedContent delay={0.45} direction="up" distance={20} className="w-full
|
| 76 |
-
<div className="flex justify-center">
|
| 77 |
-
<Magnet className="w-full sm:w-auto">
|
| 78 |
<button onClick={() => navigate('/app')}
|
| 79 |
-
className="w-full sm:w-auto flex items-center justify-center gap-2.5 bg-teal text-white px-10 py-3.5
|
| 80 |
-
<svg className="w-5 h-5 shrink-0" viewBox="0 0 24 24">
|
|
|
|
|
|
|
| 81 |
Enter Studio
|
| 82 |
</button>
|
| 83 |
</Magnet>
|
| 84 |
</div>
|
| 85 |
</AnimatedContent>
|
| 86 |
|
| 87 |
-
{/*
|
| 88 |
-
<AnimatedContent delay={0.6} direction="up" distance={10} className="mt-
|
| 89 |
-
<div className="flex items-center justify-center
|
| 90 |
-
<img src="/logos/qs_ranking.png" alt="QS Ranking"
|
|
|
|
| 91 |
</div>
|
| 92 |
</AnimatedContent>
|
| 93 |
</div>
|
| 94 |
</main>
|
| 95 |
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
<
|
| 105 |
-
<div className="w-12 h-px sm:w-px sm:h-8 bg-border" />
|
| 106 |
-
<div className="flex flex-col leading-tight">
|
| 107 |
-
<strong className="text-navy">DeepFace Studio</strong>
|
| 108 |
-
<span>Dept. of ICT, Marwadi University</span>
|
| 109 |
-
</div>
|
| 110 |
-
</div>
|
| 111 |
-
<div className="flex items-center gap-2 sm:gap-3 flex-wrap justify-center font-medium">
|
| 112 |
-
<span>Educational use only</span>
|
| 113 |
-
<span className="text-border2">·</span>
|
| 114 |
-
<span>Local processing</span>
|
| 115 |
-
<span className="text-border2">·</span>
|
| 116 |
-
<span>© Aditya Raj 2026</span>
|
| 117 |
</div>
|
| 118 |
</div>
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 122 |
|
| 123 |
</div>
|
| 124 |
);
|
|
|
|
| 1 |
+
import { useNavigate } from 'react-router-dom';
|
|
|
|
|
|
|
| 2 |
import BlurText from '../components/ui/BlurText';
|
| 3 |
import AnimatedContent from '../components/ui/AnimatedContent';
|
| 4 |
import Magnet from '../components/ui/Magnet';
|
|
|
|
| 9 |
const navigate = useNavigate();
|
| 10 |
|
| 11 |
return (
|
|
|
|
| 12 |
<div className="min-h-screen w-full bg-bg font-sans overflow-x-hidden flex flex-col text-navy">
|
| 13 |
|
| 14 |
+
{/* ═══ TOP LOGOS ═══ */}
|
| 15 |
+
<div className="absolute top-0 left-0 right-0 z-50 flex items-start justify-between px-3 sm:px-6 pt-3 sm:pt-4 pointer-events-none gap-2">
|
| 16 |
+
<div className="shrink-0 pointer-events-auto max-w-[45%]">
|
|
|
|
| 17 |
<img src="/logos/marwadi_university.jpeg" alt="Marwadi University"
|
| 18 |
+
className="h-8 sm:h-12 md:h-16 w-auto max-w-full object-contain mix-blend-multiply" />
|
| 19 |
</div>
|
| 20 |
+
<div className="shrink-0 pointer-events-auto mt-1 sm:mt-2 max-w-[45%] flex justify-end">
|
|
|
|
|
|
|
| 21 |
<img src="/logos/engineering_faculty.jpeg" alt="Faculty of Engineering"
|
| 22 |
+
className="h-6 sm:h-10 md:h-14 w-auto max-w-full object-contain mix-blend-multiply" />
|
| 23 |
</div>
|
| 24 |
</div>
|
| 25 |
|
| 26 |
+
{/* ═══ HERO ═══ */}
|
| 27 |
+
<main className="flex-1 relative flex flex-col items-center justify-center px-4 sm:px-6 py-24 sm:py-28 min-h-screen">
|
| 28 |
+
{/* Grid background */}
|
|
|
|
| 29 |
<div className="absolute inset-0 pointer-events-none" style={{
|
| 30 |
backgroundImage: 'linear-gradient(rgba(14,116,144,0.02) 1px,transparent 1px),linear-gradient(90deg,rgba(14,116,144,0.02) 1px,transparent 1px)',
|
| 31 |
backgroundSize: '60px 60px',
|
| 32 |
}} />
|
| 33 |
|
| 34 |
+
<div className="relative z-10 w-full max-w-3xl mx-auto text-center flex flex-col items-center gap-5 sm:gap-7">
|
| 35 |
|
| 36 |
+
{/* ICT Logo */}
|
| 37 |
<AnimatedContent delay={0} direction="down" distance={20}>
|
| 38 |
+
<img src="/logos/ict_logo.png" alt="ICT Department"
|
| 39 |
+
className="w-[140px] sm:w-[220px] md:w-[300px] max-w-[70vw] h-auto object-contain mix-blend-multiply mx-auto" />
|
|
|
|
|
|
|
| 40 |
</AnimatedContent>
|
| 41 |
|
| 42 |
{/* Headline */}
|
| 43 |
+
<div className="w-full px-2">
|
| 44 |
+
<h1 className="font-black leading-tight tracking-tight text-navy flex flex-col items-center gap-1 sm:gap-2"
|
| 45 |
+
style={{ fontSize: 'clamp(1.8rem, 6vw, 4rem)' }}>
|
| 46 |
+
{/* Typewriter — allow wrap on tiny screens */}
|
| 47 |
+
<span className="block w-full text-center overflow-hidden">
|
| 48 |
<Typewriter words={[
|
| 49 |
+
'Your Future',
|
| 50 |
+
'તમારું ભવિ��્ય',
|
| 51 |
+
'మీ భవిష్యత్తు',
|
| 52 |
+
'आपका भविष्य',
|
| 53 |
+
'Seu Futuro',
|
| 54 |
]} />
|
| 55 |
</span>
|
| 56 |
+
<ShinyText text="Starts Here"
|
| 57 |
+
className="block text-[0.65em] sm:text-[0.7em] opacity-90" />
|
| 58 |
</h1>
|
| 59 |
</div>
|
| 60 |
|
| 61 |
{/* Subtitle */}
|
| 62 |
<BlurText
|
| 63 |
text="Visualize your potential. Experience campus life virtually and see yourself wearing our colors in just one click."
|
| 64 |
+
className="text-xs sm:text-sm md:text-base text-slate max-w-xl leading-relaxed px-2 font-medium"
|
| 65 |
delay={0.3}
|
| 66 |
/>
|
| 67 |
|
| 68 |
+
{/* CTA */}
|
| 69 |
+
<AnimatedContent delay={0.45} direction="up" distance={20} className="w-full mt-1">
|
| 70 |
+
<div className="flex justify-center px-4 sm:px-0">
|
| 71 |
+
<Magnet className="w-full sm:w-auto max-w-xs sm:max-w-none">
|
| 72 |
<button onClick={() => navigate('/app')}
|
| 73 |
+
className="w-full sm:w-auto flex items-center justify-center gap-2.5 bg-teal text-white px-8 sm:px-10 py-3.5 rounded-xl font-bold text-sm sm:text-base shadow-lg shadow-teal/20 hover:shadow-xl hover:shadow-teal/30 hover:-translate-y-0.5 active:scale-95 transition-all duration-200">
|
| 74 |
+
<svg className="w-4 h-4 sm:w-5 sm:h-5 shrink-0" viewBox="0 0 24 24">
|
| 75 |
+
<polygon points="5 3 19 12 5 21 5 3" fill="currentColor" />
|
| 76 |
+
</svg>
|
| 77 |
Enter Studio
|
| 78 |
</button>
|
| 79 |
</Magnet>
|
| 80 |
</div>
|
| 81 |
</AnimatedContent>
|
| 82 |
|
| 83 |
+
{/* QS Ranking badge */}
|
| 84 |
+
<AnimatedContent delay={0.6} direction="up" distance={10} className="mt-2 sm:mt-6 w-full">
|
| 85 |
+
<div className="flex items-center justify-center px-4">
|
| 86 |
+
<img src="/logos/qs_ranking.png" alt="QS Ranking"
|
| 87 |
+
className="h-10 sm:h-14 md:h-18 w-auto max-w-[80vw] object-contain mix-blend-multiply opacity-90" />
|
| 88 |
</div>
|
| 89 |
</AnimatedContent>
|
| 90 |
</div>
|
| 91 |
</main>
|
| 92 |
|
| 93 |
+
{/* ═══ FOOTER ═══ */}
|
| 94 |
+
<footer className="bg-bg3 border-t border-border py-3 px-4">
|
| 95 |
+
<div className="max-w-6xl mx-auto flex flex-col sm:flex-row items-center justify-between gap-2 sm:gap-4 text-xs sm:text-sm text-slate">
|
| 96 |
+
<div className="flex flex-col sm:flex-row items-center gap-2 sm:gap-4 text-center sm:text-left w-full sm:w-auto">
|
| 97 |
+
<img src="/logos/ict_logo_black.png" alt="ICT Department" className="h-6 sm:h-8 w-auto opacity-70" />
|
| 98 |
+
<div className="w-10 h-px sm:w-px sm:h-7 bg-border" />
|
| 99 |
+
<div className="flex flex-col leading-tight">
|
| 100 |
+
<strong className="text-navy">DeepFace Studio</strong>
|
| 101 |
+
<span>Dept. of ICT, Marwadi University</span>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 102 |
</div>
|
| 103 |
</div>
|
| 104 |
+
<div className="flex items-center gap-2 flex-wrap justify-center font-medium text-[11px] sm:text-xs">
|
| 105 |
+
<span>Educational use only</span>
|
| 106 |
+
<span className="text-border2">·</span>
|
| 107 |
+
<span>Local processing</span>
|
| 108 |
+
<span className="text-border2">·</span>
|
| 109 |
+
<span>© Aditya Raj 2026</span>
|
| 110 |
+
</div>
|
| 111 |
+
</div>
|
| 112 |
+
</footer>
|
| 113 |
|
| 114 |
</div>
|
| 115 |
);
|
frontend/tailwind.config.js
CHANGED
|
@@ -2,6 +2,14 @@
|
|
| 2 |
export default {
|
| 3 |
content: ['./index.html', './src/**/*.{js,jsx,ts,tsx}'],
|
| 4 |
theme: {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
extend: {
|
| 6 |
colors: {
|
| 7 |
// Premium Light Academic Theme - White Background
|
|
|
|
| 2 |
export default {
|
| 3 |
content: ['./index.html', './src/**/*.{js,jsx,ts,tsx}'],
|
| 4 |
theme: {
|
| 5 |
+
screens: {
|
| 6 |
+
xs: '480px',
|
| 7 |
+
sm: '640px',
|
| 8 |
+
md: '768px',
|
| 9 |
+
lg: '1024px',
|
| 10 |
+
xl: '1280px',
|
| 11 |
+
'2xl': '1536px',
|
| 12 |
+
},
|
| 13 |
extend: {
|
| 14 |
colors: {
|
| 15 |
// Premium Light Academic Theme - White Background
|