Skip to content

Commit 505a07b

Browse files
committed
Full-screen gradient mesh hero bg - Apple Music style color fields
1 parent 79e565c commit 505a07b

File tree

1 file changed

+27
-72
lines changed

1 file changed

+27
-72
lines changed

src/pages/index.module.css

Lines changed: 27 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -79,105 +79,60 @@
7979
justify-content: center;
8080
padding: 4rem 2rem;
8181
position: relative;
82-
background: #000;
82+
background: #040410;
8383
overflow: hidden;
8484
}
8585

86-
/* Animated gradient blobs - complex organic shapes */
86+
/* Full-screen gradient mesh - 5 layers */
8787
.blob1, .blob2, .blob3 {
8888
position: absolute;
89-
filter: blur(80px);
89+
inset: 0;
9090
pointer-events: none;
91-
will-change: transform;
9291
z-index: 0;
93-
opacity: 0.9;
9492
}
9593

94+
/* Layer 1: deep base wash */
9695
.blob1 {
97-
width: 55vw;
98-
height: 55vw;
99-
max-width: 800px;
100-
max-height: 800px;
101-
top: -20%;
102-
left: -15%;
103-
border-radius: 40% 60% 70% 30% / 50% 30% 70% 50%;
10496
background:
105-
radial-gradient(circle at 30% 40%, rgba(15, 40, 180, 0.6) 0%, transparent 50%),
106-
radial-gradient(circle at 70% 60%, rgba(60, 100, 220, 0.3) 0%, transparent 45%),
107-
radial-gradient(circle at 50% 80%, rgba(30, 60, 140, 0.2) 0%, transparent 55%);
108-
animation: morph1 16s ease-in-out infinite, drift1 14s ease-in-out infinite;
97+
radial-gradient(ellipse 120% 80% at 20% 80%, #0a1628 0%, transparent 60%),
98+
radial-gradient(ellipse 100% 100% at 80% 20%, #0c1a3d 0%, transparent 55%);
99+
animation: field1 20s ease-in-out infinite;
109100
}
110101

102+
/* Layer 2: primary color fields */
111103
.blob2 {
112-
width: 45vw;
113-
height: 45vw;
114-
max-width: 650px;
115-
max-height: 650px;
116-
bottom: -15%;
117-
right: -12%;
118-
border-radius: 60% 40% 30% 70% / 40% 60% 40% 60%;
119104
background:
120-
radial-gradient(circle at 60% 30%, rgba(77, 139, 255, 0.5) 0%, transparent 45%),
121-
radial-gradient(circle at 30% 70%, rgba(40, 80, 200, 0.25) 0%, transparent 50%),
122-
radial-gradient(circle at 80% 80%, rgba(100, 150, 255, 0.15) 0%, transparent 40%);
123-
animation: morph2 20s ease-in-out infinite, drift2 18s ease-in-out infinite;
105+
radial-gradient(ellipse 70% 60% at 15% 50%, rgba(20, 60, 180, 0.6) 0%, transparent 65%),
106+
radial-gradient(ellipse 50% 70% at 85% 60%, rgba(60, 120, 255, 0.35) 0%, transparent 60%),
107+
radial-gradient(ellipse 40% 50% at 50% 10%, rgba(30, 50, 120, 0.4) 0%, transparent 55%);
108+
animation: field2 16s ease-in-out infinite;
124109
}
125110

111+
/* Layer 3: highlights + accent */
126112
.blob3 {
127-
width: 35vw;
128-
height: 35vw;
129-
max-width: 500px;
130-
max-height: 500px;
131-
top: 35%;
132-
left: 45%;
133-
border-radius: 50% 60% 40% 70% / 60% 40% 60% 40%;
134113
background:
135-
radial-gradient(circle at 40% 50%, rgba(90, 50, 180, 0.3) 0%, transparent 50%),
136-
radial-gradient(circle at 70% 30%, rgba(60, 80, 220, 0.2) 0%, transparent 45%);
137-
animation: morph3 22s ease-in-out infinite, drift3 20s ease-in-out infinite;
138-
}
139-
140-
@keyframes morph1 {
141-
0%, 100% { border-radius: 40% 60% 70% 30% / 50% 30% 70% 50%; }
142-
25% { border-radius: 60% 40% 30% 70% / 70% 50% 30% 60%; }
143-
50% { border-radius: 30% 70% 50% 50% / 40% 60% 50% 40%; }
144-
75% { border-radius: 70% 30% 60% 40% / 50% 40% 60% 50%; }
114+
radial-gradient(ellipse 35% 40% at 30% 35%, rgba(80, 140, 255, 0.3) 0%, transparent 60%),
115+
radial-gradient(ellipse 25% 35% at 75% 70%, rgba(100, 160, 255, 0.2) 0%, transparent 55%),
116+
radial-gradient(ellipse 30% 25% at 55% 55%, rgba(60, 40, 150, 0.15) 0%, transparent 50%);
117+
animation: field3 12s ease-in-out infinite;
145118
}
146119

147-
@keyframes morph2 {
148-
0%, 100% { border-radius: 60% 40% 30% 70% / 40% 60% 40% 60%; }
149-
25% { border-radius: 40% 60% 50% 50% / 60% 30% 70% 40%; }
150-
50% { border-radius: 50% 50% 40% 60% / 30% 70% 50% 50%; }
151-
75% { border-radius: 30% 70% 60% 40% / 50% 40% 30% 70%; }
152-
}
153-
154-
@keyframes morph3 {
155-
0%, 100% { border-radius: 50% 60% 40% 70% / 60% 40% 60% 40%; }
156-
33% { border-radius: 70% 30% 50% 50% / 40% 60% 30% 70%; }
157-
66% { border-radius: 40% 50% 70% 30% / 50% 50% 40% 60%; }
158-
}
159-
160-
@keyframes drift1 {
161-
0%, 100% { transform: translate(0, 0) scale(1); }
162-
20% { transform: translate(8vw, 10vh) scale(1.15); }
163-
40% { transform: translate(15vw, 4vh) scale(0.9); }
164-
60% { transform: translate(5vw, 18vh) scale(1.1); }
165-
80% { transform: translate(-4vw, 8vh) scale(0.95); }
120+
@keyframes field1 {
121+
0%, 100% { opacity: 1; transform: scale(1) translate(0, 0); }
122+
50% { opacity: 0.85; transform: scale(1.05) translate(2%, -3%); }
166123
}
167124

168-
@keyframes drift2 {
125+
@keyframes field2 {
169126
0%, 100% { transform: translate(0, 0) scale(1); }
170-
20% { transform: translate(-10vw, -6vh) scale(1.1); }
171-
40% { transform: translate(-5vw, -15vh) scale(0.95); }
172-
60% { transform: translate(-14vw, -3vh) scale(1.15); }
173-
80% { transform: translate(-3vw, -10vh) scale(0.9); }
127+
25% { transform: translate(3%, 4%) scale(1.02); }
128+
50% { transform: translate(-2%, 2%) scale(0.98); }
129+
75% { transform: translate(1%, -3%) scale(1.03); }
174130
}
175131

176-
@keyframes drift3 {
132+
@keyframes field3 {
177133
0%, 100% { transform: translate(0, 0) scale(1) rotate(0deg); }
178-
25% { transform: translate(-10vw, 6vh) scale(1.25) rotate(15deg); }
179-
50% { transform: translate(6vw, -10vh) scale(0.8) rotate(-8deg); }
180-
75% { transform: translate(-4vw, -4vh) scale(1.15) rotate(10deg); }
134+
33% { transform: translate(-4%, 3%) scale(1.08) rotate(1deg); }
135+
66% { transform: translate(3%, -4%) scale(0.95) rotate(-1deg); }
181136
}
182137

183138
/* Film grain overlay */

0 commit comments

Comments
 (0)