feat(intro): add ebike onboarding sequence
🔍 Lint / 🪄 Check lint (pull_request) Has been cancelled
🔍 Lint / 🎨 Check format (pull_request) Has been cancelled
🔍 Lint / 🔎 Typecheck (pull_request) Has been cancelled
📊 Quality / 🔒 Security Audit (pull_request) Has been cancelled
📊 Quality / 📋 Dependency Freshness (pull_request) Has been cancelled
📊 Quality / 📦 Bundle Size (pull_request) Has been cancelled
🔍 Lint / 🏗 Build (pull_request) Has been cancelled

This commit is contained in:
Tom Boullay
2026-05-31 10:42:46 +02:00
parent a3f611e227
commit bff8a16290
25 changed files with 620 additions and 256 deletions
+188
View File
@@ -982,6 +982,194 @@ canvas {
}
}
/* Mission notification */
.mission-notification {
position: fixed;
top: clamp(18px, 4vh, 42px);
left: clamp(18px, 4vw, 48px);
z-index: 20;
width: min(280px, calc(100vw - 36px));
pointer-events: none;
opacity: 1;
filter: drop-shadow(0 0 12px rgba(96, 165, 250, 0.36));
transform: translate3d(0, 0, 0) scale(1);
transition:
opacity 420ms ease,
filter 420ms ease,
transform 420ms ease;
animation: mission-notification-enter 900ms ease-out both;
}
.mission-notification--hidden {
opacity: 0;
filter: drop-shadow(0 0 4px rgba(96, 165, 250, 0.12));
transform: translate3d(-8px, -2px, 0) scale(0.985);
}
.mission-notification::after {
position: absolute;
inset: 0;
content: "";
pointer-events: none;
}
.mission-notification::after {
background: linear-gradient(
180deg,
transparent 0%,
rgba(96, 165, 250, 0.16) 48%,
transparent 52%,
transparent 100%
);
background-size: 100% 10px;
opacity: 0.22;
clip-path: polygon(0 0, 100% 0, 100% 69%, 88% 100%, 0 100%);
mix-blend-mode: screen;
}
.mission-notification__glow {
position: absolute;
inset: -14px;
background: radial-gradient(
circle at 22% 22%,
rgba(96, 165, 250, 0.36),
transparent 58%
);
opacity: 0.7;
filter: blur(12px);
animation: mission-notification-glow 10s ease-in-out 1s infinite;
}
.mission-notification__image-wrap {
position: relative;
display: block;
overflow: hidden;
clip-path: polygon(0 0, 100% 0, 100% 69%, 88% 100%, 0 100%);
}
.mission-notification__image-wrap::before {
position: absolute;
top: 0;
bottom: 0;
left: -35%;
z-index: 2;
width: 28%;
background: linear-gradient(
90deg,
transparent 0%,
rgba(191, 219, 254, 0.08) 18%,
rgba(125, 211, 252, 0.52) 50%,
rgba(191, 219, 254, 0.08) 82%,
transparent 100%
);
content: "";
mix-blend-mode: screen;
opacity: 0;
pointer-events: none;
transform: skewX(-16deg);
animation: mission-notification-scan 3.8s ease-in-out 1.2s infinite;
}
.mission-notification__image {
position: relative;
display: block;
width: 100%;
height: auto;
opacity: 0.92;
filter: sepia(0.08) saturate(1.18) hue-rotate(155deg) contrast(1.04)
brightness(1.03) blur(0.18px);
animation: mission-notification-flicker 10s ease-in-out 1s infinite;
}
@keyframes mission-notification-enter {
0% {
opacity: 0;
transform: translate3d(-12px, -4px, 0) scale(0.985);
}
12% {
opacity: 0.85;
}
18% {
opacity: 0.22;
}
26% {
opacity: 0.95;
}
34% {
opacity: 0.5;
}
48%,
100% {
opacity: 1;
transform: translate3d(0, 0, 0) scale(1);
}
}
@keyframes mission-notification-flicker {
0%,
7%,
100% {
opacity: 0.92;
filter: saturate(1) brightness(1);
}
1.5% {
opacity: 0.58;
filter: saturate(1.25) brightness(1.18);
}
3% {
opacity: 1;
}
4.5% {
opacity: 0.74;
}
}
@keyframes mission-notification-scan {
0%,
22% {
left: -35%;
opacity: 0;
}
32% {
opacity: 0.78;
}
52% {
left: 108%;
opacity: 0;
}
100% {
left: 108%;
opacity: 0;
}
}
@keyframes mission-notification-glow {
0%,
7%,
100% {
opacity: 0.55;
}
2.5% {
opacity: 0.95;
}
4.5% {
opacity: 0.35;
}
}
/* Subtitles */
.subtitles {
position: fixed;