|
24 | 24 | --of-card-bg: rgba(0, 0, 0, 0.05); |
25 | 25 | --of-card-border: var(--of-accent-purple); |
26 | 26 | --of-code-bg: #e8e8ec; |
27 | | - --of-wave-opacity: 0.8; |
| 27 | + --of-wave-opacity: 1; |
28 | 28 | --of-green-text: #007a00; |
29 | 29 | --of-logo-fill: #231f20; |
30 | 30 | --of-logo-circle: #f5f5f5; |
|
175 | 175 | } |
176 | 176 |
|
177 | 177 | /* ---------------------------------------------------------- |
178 | | - Wave Background Decoration (CSS-only approximation) |
179 | | - The ODP uses flowing green + blue/purple wave lines at |
180 | | - the bottom-left corner of slides. |
| 178 | + Wave Animation Keyframes |
| 179 | + Each pseudo-element is taller than the container and |
| 180 | + extends below it, so the bottom edge is never visible. |
| 181 | + Multi-stop 2D translate paths create organic side-to-side |
| 182 | + drift. Green and purple counter-phase at different speeds. |
| 183 | + ---------------------------------------------------------- */ |
| 184 | + |
| 185 | +@keyframes green-drift { |
| 186 | + 0% { transform: translate(0%, 0%) scale(1); } |
| 187 | + 20% { transform: translate(-6%, -1%) scale(1.02); } |
| 188 | + 40% { transform: translate(-12%, 0.5%) scale(1.01); } |
| 189 | + 60% { transform: translate(-4%, -0.5%) scale(1.03); } |
| 190 | + 80% { transform: translate(-10%, 0%) scale(1.01); } |
| 191 | + 100% { transform: translate(0%, 0%) scale(1); } |
| 192 | +} |
| 193 | + |
| 194 | +@keyframes purple-drift { |
| 195 | + 0% { transform: translate(-15%, 0%) scale(1); } |
| 196 | + 25% { transform: translate(-8%, -1%) scale(1.02); } |
| 197 | + 50% { transform: translate(0%, 0.5%) scale(1.01); } |
| 198 | + 75% { transform: translate(-10%, -0.5%) scale(1.03); } |
| 199 | + 100% { transform: translate(-15%, 0%) scale(1); } |
| 200 | +} |
| 201 | + |
| 202 | +@keyframes green-drift-prominent { |
| 203 | + 0% { transform: translate(0%, 0%) scale(1); } |
| 204 | + 15% { transform: translate(-8%, -1%) scale(1.03); } |
| 205 | + 35% { transform: translate(-16%, 0.5%) scale(1.01); } |
| 206 | + 55% { transform: translate(-5%, -1%) scale(1.04); } |
| 207 | + 75% { transform: translate(-14%, 0%) scale(1.02); } |
| 208 | + 100% { transform: translate(0%, 0%) scale(1); } |
| 209 | +} |
| 210 | + |
| 211 | +@keyframes purple-drift-prominent { |
| 212 | + 0% { transform: translate(-15%, 0%) scale(1); } |
| 213 | + 20% { transform: translate(-6%, -1%) scale(1.03); } |
| 214 | + 45% { transform: translate(0%, 0.5%) scale(1.01); } |
| 215 | + 70% { transform: translate(-12%, -1%) scale(1.04); } |
| 216 | + 100% { transform: translate(-15%, 0%) scale(1); } |
| 217 | +} |
| 218 | + |
| 219 | +/* ---------------------------------------------------------- |
| 220 | + Wave Background Decoration |
| 221 | + Pseudo-elements are 130% wide x 120% tall, positioned so |
| 222 | + they overhang on the right and below. overflow:hidden on |
| 223 | + the parent clips them. No hard edges are ever visible |
| 224 | + because gradients fade to transparent well inside the |
| 225 | + element boundaries. |
181 | 226 | ---------------------------------------------------------- */ |
182 | 227 |
|
183 | 228 | .wave-bg { |
|
190 | 235 | .wave-bg::after { |
191 | 236 | content: ""; |
192 | 237 | position: absolute; |
193 | | - bottom: 0; |
| 238 | + bottom: -20%; |
194 | 239 | left: 0; |
195 | | - width: 100%; |
196 | | - height: 100%; |
| 240 | + width: 130%; |
| 241 | + height: 120%; |
197 | 242 | pointer-events: none; |
198 | 243 | z-index: -1; |
| 244 | + will-change: transform; |
| 245 | + transform-origin: center bottom; |
199 | 246 | } |
200 | 247 |
|
201 | 248 | /* Green wave layer */ |
202 | 249 | .wave-bg::before { |
203 | 250 | background: |
204 | 251 | radial-gradient( |
205 | | - ellipse 80% 50% at 5% 100%, |
206 | | - rgba(0, 200, 0, calc(0.3 * var(--of-wave-opacity))) 0%, |
| 252 | + ellipse 80% 50% at 5% 85%, |
| 253 | + rgba(0, 200, 0, calc(0.55 * var(--of-wave-opacity))) 0%, |
207 | 254 | transparent 70% |
208 | 255 | ), |
209 | 256 | radial-gradient( |
210 | | - ellipse 60% 40% at 15% 95%, |
211 | | - rgba(0, 200, 0, calc(0.2 * var(--of-wave-opacity))) 0%, |
| 257 | + ellipse 60% 40% at 25% 80%, |
| 258 | + rgba(0, 200, 0, calc(0.4 * var(--of-wave-opacity))) 0%, |
212 | 259 | transparent 60% |
213 | 260 | ), |
214 | 261 | radial-gradient( |
215 | | - ellipse 90% 35% at 95% 100%, |
216 | | - rgba(0, 200, 0, calc(0.15 * var(--of-wave-opacity))) 0%, |
| 262 | + ellipse 70% 35% at 75% 85%, |
| 263 | + rgba(0, 200, 0, calc(0.3 * var(--of-wave-opacity))) 0%, |
217 | 264 | transparent 50% |
218 | 265 | ); |
| 266 | + animation: green-drift 8s ease-in-out infinite; |
219 | 267 | } |
220 | 268 |
|
221 | 269 | /* Blue/purple wave layer */ |
222 | 270 | .wave-bg::after { |
223 | 271 | background: |
224 | 272 | radial-gradient( |
225 | | - ellipse 70% 45% at 20% 100%, |
226 | | - rgba(123, 123, 255, calc(0.3 * var(--of-wave-opacity))) 0%, |
| 273 | + ellipse 70% 45% at 30% 85%, |
| 274 | + rgba(123, 123, 255, calc(0.55 * var(--of-wave-opacity))) 0%, |
227 | 275 | transparent 65% |
228 | 276 | ), |
229 | 277 | radial-gradient( |
230 | | - ellipse 80% 35% at 85% 100%, |
231 | | - rgba(123, 123, 255, calc(0.25 * var(--of-wave-opacity))) 0%, |
| 278 | + ellipse 80% 35% at 70% 85%, |
| 279 | + rgba(123, 123, 255, calc(0.45 * var(--of-wave-opacity))) 0%, |
232 | 280 | transparent 55% |
233 | 281 | ), |
234 | 282 | radial-gradient( |
235 | | - ellipse 50% 30% at 50% 95%, |
236 | | - rgba(123, 123, 255, calc(0.15 * var(--of-wave-opacity))) 0%, |
| 283 | + ellipse 50% 30% at 50% 80%, |
| 284 | + rgba(123, 123, 255, calc(0.3 * var(--of-wave-opacity))) 0%, |
237 | 285 | transparent 50% |
238 | 286 | ); |
| 287 | + animation: purple-drift 10s ease-in-out infinite; |
239 | 288 | } |
240 | 289 |
|
241 | | -/* Cover/section slides get more prominent waves */ |
| 290 | +/* Cover/section slides get more prominent waves with wider drift */ |
242 | 291 | .wave-bg-prominent::before { |
243 | 292 | background: |
244 | 293 | radial-gradient( |
245 | | - ellipse 90% 60% at 5% 100%, |
246 | | - rgba(0, 200, 0, calc(0.4 * var(--of-wave-opacity))) 0%, |
| 294 | + ellipse 90% 60% at 5% 85%, |
| 295 | + rgba(0, 200, 0, calc(0.7 * var(--of-wave-opacity))) 0%, |
247 | 296 | transparent 70% |
248 | 297 | ), |
249 | 298 | radial-gradient( |
250 | | - ellipse 70% 50% at 20% 95%, |
251 | | - rgba(0, 200, 0, calc(0.25 * var(--of-wave-opacity))) 0%, |
| 299 | + ellipse 70% 50% at 30% 80%, |
| 300 | + rgba(0, 200, 0, calc(0.5 * var(--of-wave-opacity))) 0%, |
252 | 301 | transparent 60% |
253 | 302 | ), |
254 | 303 | radial-gradient( |
255 | | - ellipse 100% 45% at 90% 100%, |
256 | | - rgba(0, 200, 0, calc(0.2 * var(--of-wave-opacity))) 0%, |
| 304 | + ellipse 80% 45% at 75% 85%, |
| 305 | + rgba(0, 200, 0, calc(0.4 * var(--of-wave-opacity))) 0%, |
257 | 306 | transparent 55% |
258 | 307 | ); |
| 308 | + animation: green-drift-prominent 7s ease-in-out infinite; |
259 | 309 | } |
260 | 310 |
|
261 | 311 | .wave-bg-prominent::after { |
262 | 312 | background: |
263 | 313 | radial-gradient( |
264 | | - ellipse 80% 55% at 15% 100%, |
265 | | - rgba(123, 123, 255, calc(0.4 * var(--of-wave-opacity))) 0%, |
| 314 | + ellipse 80% 55% at 25% 85%, |
| 315 | + rgba(123, 123, 255, calc(0.7 * var(--of-wave-opacity))) 0%, |
266 | 316 | transparent 65% |
267 | 317 | ), |
268 | 318 | radial-gradient( |
269 | | - ellipse 90% 45% at 80% 100%, |
270 | | - rgba(123, 123, 255, calc(0.3 * var(--of-wave-opacity))) 0%, |
| 319 | + ellipse 90% 45% at 65% 85%, |
| 320 | + rgba(123, 123, 255, calc(0.55 * var(--of-wave-opacity))) 0%, |
271 | 321 | transparent 60% |
272 | 322 | ), |
273 | 323 | radial-gradient( |
274 | | - ellipse 60% 35% at 50% 95%, |
275 | | - rgba(123, 123, 255, calc(0.2 * var(--of-wave-opacity))) 0%, |
| 324 | + ellipse 60% 35% at 50% 80%, |
| 325 | + rgba(123, 123, 255, calc(0.4 * var(--of-wave-opacity))) 0%, |
276 | 326 | transparent 50% |
277 | 327 | ); |
| 328 | + animation: purple-drift-prominent 9s ease-in-out infinite; |
278 | 329 | } |
279 | 330 |
|
280 | 331 | /* ---------------------------------------------------------- |
|
0 commit comments