Skip to content

Commit 16ffa32

Browse files
committed
fix(ui): dynamic footer year & remove noise blur overlay for crisp rendering
- Updated Footer with dynamic client-side year calculation - Removed background noise SVG filter overlay that caused blurry rendering - Elevated text contrast (using Slate-300 / Slate-400 and crisp white headers) - Sharpened glassmorphic background cards and CodeWindow border contrast
1 parent e11020a commit 16ffa32

6 files changed

Lines changed: 91 additions & 94 deletions

File tree

frontend/src/app/globals.css

Lines changed: 41 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -5,36 +5,36 @@
55
@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap');
66

77
:root {
8-
/* Brand Palette */
9-
--ink: #13102B; /* Darkest background */
10-
--indigo: #1E1B4B; /* Main dark background, cards */
11-
--indigo-light: #2D2A6B; /* Card hover states */
12-
--violet: #6C4AB6; /* Icons, accents, logo ring */
13-
--violet-soft: rgba(108, 74, 182, 0.15);
14-
--violet-glow: rgba(108, 74, 182, 0.4);
15-
--mint: #00E6A8; /* Highlights, CTAs, logo arrow */
16-
--mint-soft: rgba(0, 230, 168, 0.12);
17-
--mint-glow: rgba(0, 230, 168, 0.35);
18-
19-
/* Text */
20-
--text: #F0F0F5;
21-
--text-secondary: #A5A3B8;
22-
--text-muted: #6B6885;
23-
24-
/* Surfaces */
25-
--border: rgba(108, 74, 182, 0.18);
26-
--border-light: rgba(108, 74, 182, 0.08);
8+
/* Crisp & Vibrant Brand Palette */
9+
--ink: #0D0A22; /* Deep dark background */
10+
--indigo: #17143A; /* Rich dark card background */
11+
--indigo-light: #252156; /* Card hover states */
12+
--violet: #7C53D9; /* Sharp icons, borders, logo ring */
13+
--violet-soft: rgba(124, 83, 217, 0.2);
14+
--violet-glow: rgba(124, 83, 217, 0.5);
15+
--mint: #00E6A8; /* Vibrant mint CTAs & highlights */
16+
--mint-soft: rgba(0, 230, 168, 0.15);
17+
--mint-glow: rgba(0, 230, 168, 0.4);
18+
19+
/* High Contrast Text */
20+
--text: #FFFFFF;
21+
--text-secondary: #CBD5E1; /* Slate 300 - crisp, sharp readable secondary text */
22+
--text-muted: #94A3B8; /* Slate 400 - clean muted text */
23+
24+
/* Crisp Borders */
25+
--border: rgba(124, 83, 217, 0.3);
26+
--border-light: rgba(124, 83, 217, 0.15);
2727

2828
/* Effects */
2929
--radius: 20px;
3030
--radius-sm: 14px;
31-
--shadow: 0 8px 32px rgba(0,0,0,0.4);
32-
--shadow-lg: 0 20px 60px rgba(0,0,0,0.5);
31+
--shadow: 0 8px 32px rgba(0,0,0,0.5);
32+
--shadow-lg: 0 20px 60px rgba(0,0,0,0.7);
3333

34-
--color-border: 247 45% 20%;
35-
--color-background: 247 45% 12%; /* #13102B Ink */
36-
--color-foreground: 0 0% 96%;
37-
--color-primary: 260 52% 53%; /* #6C4AB6 Violet */
34+
--color-border: 247 45% 25%;
35+
--color-background: 247 45% 8%; /* #0D0A22 */
36+
--color-foreground: 0 0% 100%;
37+
--color-primary: 260 60% 60%;
3838
}
3939

4040
::selection {
@@ -44,34 +44,23 @@
4444

4545
html {
4646
scroll-behavior: smooth;
47+
-webkit-font-smoothing: antialiased;
48+
-moz-osx-font-smoothing: grayscale;
4749
}
4850

4951
body {
5052
background-color: var(--ink);
5153
color: var(--text);
52-
font-family: 'Space Grotesk', system-ui, sans-serif;
54+
font-family: 'Space Grotesk', system-ui, -apple-system, sans-serif;
5355
overflow-x: hidden;
5456
position: relative;
5557
}
5658

57-
/* Subtle noise texture overlay */
58-
.noise-overlay {
59-
position: fixed;
60-
top: 0;
61-
left: 0;
62-
width: 100vw;
63-
height: 100vh;
64-
pointer-events: none;
65-
z-index: 99;
66-
opacity: 0.025;
67-
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E");
68-
}
69-
7059
/* Scroll Reveal */
7160
.reveal {
7261
opacity: 0;
73-
transform: translateY(40px);
74-
transition: opacity 0.8s cubic-bezier(0.4, 0, 0.2, 1), transform 0.8s cubic-bezier(0.4, 0, 0.2, 1);
62+
transform: translateY(30px);
63+
transition: opacity 0.7s cubic-bezier(0.16, 1, 0.3, 1), transform 0.7s cubic-bezier(0.16, 1, 0.3, 1);
7564
}
7665

7766
.reveal.visible {
@@ -105,8 +94,8 @@ body {
10594
/* Floating Orbs Animation */
10695
@keyframes drift {
10796
0%, 100% { transform: translate(0, 0) scale(1); }
108-
33% { transform: translate(40px, -30px) scale(1.1); }
109-
66% { transform: translate(-30px, 20px) scale(0.95); }
97+
33% { transform: translate(30px, -20px) scale(1.05); }
98+
66% { transform: translate(-20px, 15px) scale(0.95); }
11099
}
111100

112101
.animate-drift {
@@ -119,20 +108,20 @@ body {
119108

120109
/* Badge Pulse Glow */
121110
@keyframes pulse-glow {
122-
0%, 100% { opacity: 1; box-shadow: 0 0 12px var(--mint-glow); }
123-
50% { opacity: 0.5; box-shadow: 0 0 4px var(--mint-glow); }
111+
0%, 100% { opacity: 1; box-shadow: 0 0 14px var(--mint-glow); }
112+
50% { opacity: 0.6; box-shadow: 0 0 4px var(--mint-glow); }
124113
}
125114

126115
.pulse-dot {
127116
animation: pulse-glow 2.5s ease-in-out infinite;
128117
}
129118

130119
@layer components {
131-
.badge-created { @apply bg-gray-800 text-gray-300 border border-gray-700; }
132-
.badge-pending { @apply bg-yellow-900/30 text-yellow-400 border border-yellow-800/40; }
133-
.badge-processing { @apply bg-blue-900/30 text-blue-400 border border-blue-800/40; }
134-
.badge-completed { @apply bg-emerald-900/30 text-emerald-400 border border-emerald-800/40; }
135-
.badge-failed { @apply bg-red-900/30 text-red-400 border border-red-800/40; }
136-
.badge-cancelled { @apply bg-gray-800 text-gray-400 border border-gray-700; }
137-
.badge-expired { @apply bg-orange-900/30 text-orange-400 border border-orange-800/40; }
120+
.badge-created { @apply bg-gray-800 text-gray-200 border border-gray-700; }
121+
.badge-pending { @apply bg-yellow-900/40 text-yellow-300 border border-yellow-700/50; }
122+
.badge-processing { @apply bg-blue-900/40 text-blue-300 border border-blue-700/50; }
123+
.badge-completed { @apply bg-emerald-900/40 text-emerald-300 border border-emerald-700/50; }
124+
.badge-failed { @apply bg-red-900/40 text-red-300 border border-red-700/50; }
125+
.badge-cancelled { @apply bg-gray-800 text-gray-300 border border-gray-700; }
126+
.badge-expired { @apply bg-orange-900/40 text-orange-300 border border-orange-700/50; }
138127
}

frontend/src/app/layout.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ export default function RootLayout({ children }: { children: React.ReactNode })
2626
rel="stylesheet"
2727
/>
2828
</head>
29-
<body className="bg-ink text-[#F0F0F5] antialiased selection:bg-mint-soft selection:text-mint">
30-
<div className="noise-overlay" aria-hidden="true" />
29+
<body className="bg-ink text-white antialiased selection:bg-mint-soft selection:text-mint">
3130
{children}
3231
</body>
3332
</html>

frontend/src/components/CodeWindow.tsx

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,18 @@ export default function CodeWindow() {
2222

2323
return (
2424
<div className="w-full max-w-3xl mx-auto group perspective-1000">
25-
<div className="relative rounded-2xl bg-indigo/90 border border-violet/30 p-4 sm:p-6 shadow-card-lg backdrop-blur-xl transform sm:rotate-x-3 group-hover:rotate-x-0 group-hover:border-violet/60 group-hover:shadow-glow-violet transition-all duration-500 ease-out">
25+
<div className="relative rounded-2xl bg-[#141033] border border-violet/40 p-4 sm:p-6 shadow-card-lg backdrop-blur-xl transform sm:rotate-x-3 group-hover:rotate-x-0 group-hover:border-violet/70 group-hover:shadow-glow-violet transition-all duration-500 ease-out">
2626
{/* macOS Dots Header */}
27-
<div className="flex items-center justify-between border-b border-violet/10 pb-3 mb-4">
27+
<div className="flex items-center justify-between border-b border-violet/20 pb-3 mb-4">
2828
<div className="flex items-center gap-2">
29-
<span className="w-3 h-3 rounded-full bg-rose-500/80 inline-block" />
30-
<span className="w-3 h-3 rounded-full bg-amber-500/80 inline-block" />
31-
<span className="w-3 h-3 rounded-full bg-emerald-500/80 inline-block" />
32-
<span className="ml-3 text-xs text-[#6B6885] font-mono">bash — POST /v1/payments</span>
29+
<span className="w-3 h-3 rounded-full bg-rose-500 inline-block" />
30+
<span className="w-3 h-3 rounded-full bg-amber-500 inline-block" />
31+
<span className="w-3 h-3 rounded-full bg-emerald-500 inline-block" />
32+
<span className="ml-3 text-xs text-slate-400 font-mono">bash — POST /v1/payments</span>
3333
</div>
3434
<button
3535
onClick={copyToClipboard}
36-
className="text-xs font-mono text-[#A5A3B8] hover:text-mint transition-colors px-2.5 py-1 rounded-md bg-violet-soft border border-violet/20 flex items-center gap-1.5"
36+
className="text-xs font-mono text-slate-300 hover:text-mint transition-colors px-2.5 py-1 rounded-md bg-violet-soft border border-violet/30 flex items-center gap-1.5"
3737
>
3838
{copied ? (
3939
<>
@@ -59,20 +59,20 @@ export default function CodeWindow() {
5959
<pre className="font-mono text-xs sm:text-sm text-left overflow-x-auto leading-relaxed p-2">
6060
<code>
6161
<span className="text-mint font-semibold">curl</span>{' '}
62-
<span className="text-blue-400">-X POST</span>{' '}
63-
<span className="text-[#C9BCF0]">https://api.qiflow.io/v1/payments</span>{' '}\{'\n'}
64-
{' '}<span className="text-blue-400">-H</span>{' '}
65-
<span className="text-[#C9BCF0]">&quot;Authorization: Bearer qiflow_sec_9a8f...&quot;</span>{' '}\{'\n'}
66-
{' '}<span className="text-blue-400">-H</span>{' '}
67-
<span className="text-[#C9BCF0]">&quot;Content-Type: application/json&quot;</span>{' '}\{'\n'}
68-
{' '}<span className="text-blue-400">-d</span>{' '}
62+
<span className="text-blue-400 font-medium">-X POST</span>{' '}
63+
<span className="text-[#D4C7FC]">https://api.qiflow.io/v1/payments</span>{' '}\{'\n'}
64+
{' '}<span className="text-blue-400 font-medium">-H</span>{' '}
65+
<span className="text-[#D4C7FC]">&quot;Authorization: Bearer qiflow_sec_9a8f...&quot;</span>{' '}\{'\n'}
66+
{' '}<span className="text-blue-400 font-medium">-H</span>{' '}
67+
<span className="text-[#D4C7FC]">&quot;Content-Type: application/json&quot;</span>{' '}\{'\n'}
68+
{' '}<span className="text-blue-400 font-medium">-d</span>{' '}
6969
<span className="text-white">&apos;{'{'}</span>{'\n'}
70-
{' '}<span className="text-blue-400">&quot;amount&quot;</span>:{' '}
71-
<span className="text-amber-400">25.50</span>,{'\n'}
72-
{' '}<span className="text-blue-400">&quot;currency&quot;</span>:{' '}
73-
<span className="text-[#C9BCF0]">&quot;QI&quot;</span>,{'\n'}
74-
{' '}<span className="text-blue-400">&quot;description&quot;</span>:{' '}
75-
<span className="text-[#C9BCF0]">&quot;Order #8492&quot;</span>{'\n'}
70+
{' '}<span className="text-blue-400 font-medium">&quot;amount&quot;</span>:{' '}
71+
<span className="text-amber-400 font-medium">25.50</span>,{'\n'}
72+
{' '}<span className="text-blue-400 font-medium">&quot;currency&quot;</span>:{' '}
73+
<span className="text-[#D4C7FC]">&quot;QI&quot;</span>,{'\n'}
74+
{' '}<span className="text-blue-400 font-medium">&quot;description&quot;</span>:{' '}
75+
<span className="text-[#D4C7FC]">&quot;Order #8492&quot;</span>{'\n'}
7676
{' '}<span className="text-white">{'}'}&apos;</span>
7777
</code>
7878
</pre>

frontend/src/components/FeatureCard.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ interface FeatureCardProps {
88

99
export default function FeatureCard({ icon, title, description }: FeatureCardProps) {
1010
return (
11-
<div className="group relative rounded-2xl bg-gradient-to-b from-indigo/60 to-ink/40 border border-violet/20 p-8 transition-all duration-300 hover:-translate-y-1.5 hover:border-violet/40 hover:shadow-card-lg overflow-hidden flex flex-col items-start text-left">
12-
{/* Top Accent Line (Appears on Hover) */}
11+
<div className="group relative rounded-2xl bg-gradient-to-b from-indigo/80 to-ink/90 border border-violet/30 p-8 transition-all duration-300 hover:-translate-y-1.5 hover:border-violet/60 hover:shadow-card-lg overflow-hidden flex flex-col items-start text-left">
12+
{/* Top Accent Line */}
1313
<div className="absolute top-0 left-0 right-0 h-[2px] bg-gradient-to-r from-mint via-violet to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300" />
1414

1515
{/* Radial Mint Glow Behind on Hover */}
16-
<div className="absolute -top-24 -left-24 w-48 h-48 bg-mint/10 rounded-full blur-3xl opacity-0 group-hover:opacity-100 transition-opacity duration-500 pointer-events-none" />
16+
<div className="absolute -top-24 -left-24 w-48 h-48 bg-mint/15 rounded-full blur-2xl opacity-0 group-hover:opacity-100 transition-opacity duration-500 pointer-events-none" />
1717

18-
{/* Icon Container (56px square, rounded-2xl, violet-soft bg, mint icon) */}
19-
<div className="w-14 h-14 rounded-2xl bg-violet-soft border border-violet/30 flex items-center justify-center text-mint mb-6 group-hover:scale-110 group-hover:border-mint/50 transition-all duration-300 shadow-sm">
18+
{/* Icon Container */}
19+
<div className="w-14 h-14 rounded-2xl bg-violet-soft border border-violet/40 flex items-center justify-center text-mint mb-6 group-hover:scale-110 group-hover:border-mint/60 transition-all duration-300 shadow-sm">
2020
{icon}
2121
</div>
2222

@@ -26,7 +26,7 @@ export default function FeatureCard({ icon, title, description }: FeatureCardPro
2626
</h3>
2727

2828
{/* Description */}
29-
<p className="text-[#A5A3B8] font-light text-sm leading-relaxed">
29+
<p className="text-slate-300 font-normal text-sm leading-relaxed">
3030
{description}
3131
</p>
3232
</div>

frontend/src/components/Footer.tsx

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,25 @@
1+
'use client';
2+
13
import Link from 'next/link';
4+
import { useState, useEffect } from 'react';
25

36
export default function Footer() {
7+
const [currentYear, setCurrentYear] = useState<number>(new Date().getFullYear());
8+
9+
useEffect(() => {
10+
setCurrentYear(new Date().getFullYear());
11+
}, []);
12+
413
return (
5-
<footer className="relative bg-ink pt-16 pb-12 border-t border-violet/10 overflow-hidden">
14+
<footer className="relative bg-ink pt-16 pb-12 border-t border-violet/20 overflow-hidden">
615
{/* Top Gradient Accent Line */}
716
<div className="absolute top-0 left-1/2 -translate-x-1/2 w-3/4 max-w-4xl h-[1px] bg-gradient-to-r from-transparent via-violet to-transparent opacity-80" />
817

918
<div className="max-w-7xl mx-auto px-6">
1019
<div className="flex flex-col md:flex-row items-center justify-between gap-8 py-6">
1120
{/* Logo Left */}
1221
<div className="flex items-center gap-3">
13-
<div className="w-8 h-8 rounded-full border-2 border-violet flex items-center justify-center shadow-glow-violet bg-indigo/40">
22+
<div className="w-8 h-8 rounded-full border-2 border-violet flex items-center justify-center shadow-glow-violet bg-indigo/60">
1423
<svg className="w-3.5 h-3.5 text-mint" viewBox="0 0 24 24" fill="currentColor">
1524
<polygon points="12,4 22,20 2,20" />
1625
</svg>
@@ -21,7 +30,7 @@ export default function Footer() {
2130
</div>
2231

2332
{/* Links Center */}
24-
<div className="flex flex-wrap items-center justify-center gap-8 text-sm text-[#A5A3B8]">
33+
<div className="flex flex-wrap items-center justify-center gap-8 text-sm font-medium text-slate-300">
2534
<Link href="#features" className="hover:text-mint transition-colors">
2635
Features
2736
</Link>
@@ -44,9 +53,9 @@ export default function Footer() {
4453
</a>
4554
</div>
4655

47-
{/* Copyright Right */}
48-
<div className="text-xs text-[#6B6885]">
49-
© {new Date().getFullYear()} QiFlow Protocol. Built for Quai Network.
56+
{/* Copyright Right with Dynamic Year */}
57+
<div className="text-xs text-slate-400 font-medium">
58+
© <span suppressHydrationWarning>{currentYear}</span> QiFlow Protocol. Built for Quai Network.
5059
</div>
5160
</div>
5261
</div>

frontend/src/sections/Hero.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,29 @@ import CodeWindow from '../components/CodeWindow';
44
export default function Hero() {
55
return (
66
<section className="relative min-h-[92vh] flex flex-col items-center justify-center text-center px-6 pt-36 pb-20 overflow-hidden">
7-
{/* Floating Gradient Orbs Behind */}
8-
<div className="absolute top-1/4 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[600px] h-[600px] bg-violet/20 rounded-full blur-[140px] pointer-events-none animate-drift" />
9-
<div className="absolute top-1/3 left-1/3 w-[500px] h-[500px] bg-mint/15 rounded-full blur-[140px] pointer-events-none animate-drift-reverse" />
7+
{/* Background Orbs */}
8+
<div className="absolute top-1/4 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[550px] h-[550px] bg-violet/25 rounded-full blur-[120px] pointer-events-none animate-drift" />
9+
<div className="absolute top-1/3 left-1/3 w-[450px] h-[450px] bg-mint/20 rounded-full blur-[120px] pointer-events-none animate-drift-reverse" />
1010

1111
<div className="relative z-10 max-w-4xl mx-auto space-y-8">
1212
{/* Badge Pill */}
13-
<div className="inline-flex items-center gap-2.5 px-4 py-2 rounded-full bg-indigo/80 border border-violet/30 shadow-card backdrop-blur-md">
13+
<div className="inline-flex items-center gap-2.5 px-4 py-2 rounded-full bg-indigo/90 border border-violet/40 shadow-card backdrop-blur-md">
1414
<span className="w-2.5 h-2.5 rounded-full bg-mint pulse-dot" />
15-
<span className="text-xs font-semibold text-[#F0F0F5] tracking-wide uppercase">
15+
<span className="text-xs font-semibold text-white tracking-wide uppercase">
1616
Built on Quai Network
1717
</span>
1818
</div>
1919

2020
{/* H1 Headline */}
2121
<h1 className="text-5xl sm:text-6xl md:text-7xl font-bold tracking-tight text-white leading-[1.1]">
2222
The payment gateway for{' '}
23-
<span className="bg-gradient-to-r from-mint via-[#60ffe0] to-[#80ffdb] bg-clip-text text-transparent drop-shadow-sm">
23+
<span className="bg-gradient-to-r from-mint via-[#60ffe0] to-[#80ffdb] bg-clip-text text-transparent drop-shadow">
2424
Qi
2525
</span>
2626
</h1>
2727

2828
{/* Subtitle */}
29-
<p className="text-lg sm:text-xl text-[#A5A3B8] font-light max-w-2xl mx-auto leading-relaxed">
29+
<p className="text-lg sm:text-xl text-slate-300 font-normal max-w-2xl mx-auto leading-relaxed">
3030
Accept instant Qi payments, generate hosted checkout links, and integrate programmable webhooks on Quai Network.
3131
</p>
3232

@@ -40,7 +40,7 @@ export default function Hero() {
4040
</Link>
4141
<a
4242
href="#how-it-works"
43-
className="w-full sm:w-auto bg-indigo/60 border border-violet/30 text-white font-medium text-base px-8 py-4 rounded-xl hover:bg-indigo-light hover:border-violet/60 transition-all backdrop-blur-md"
43+
className="w-full sm:w-auto bg-indigo/80 border border-violet/40 text-white font-medium text-base px-8 py-4 rounded-xl hover:bg-indigo-light hover:border-violet/60 transition-all backdrop-blur-md"
4444
>
4545
See How It Works
4646
</a>

0 commit comments

Comments
 (0)