diff --git a/index.html b/index.html index ca20e5e..77a0e2c 100644 --- a/index.html +++ b/index.html @@ -180,6 +180,66 @@ pointer-events: none; } + .milestone { + position: fixed; + inset: 0; + z-index: 8; + display: grid; + place-items: center; + padding: 24px; + pointer-events: none; + opacity: 0; + } + + .milestone.show { + animation: milestone-stage 1900ms ease both; + } + + .milestone-message { + position: relative; + display: grid; + place-items: center; + gap: 8px; + color: var(--ink); + text-align: center; + text-shadow: 0 1px 0 #fff; + transform-origin: center; + } + + .milestone.show .milestone-message { + animation: milestone-pop 1900ms cubic-bezier(0.16, 1, 0.3, 1) both; + } + + .milestone-number { + font-size: clamp(72px, 16vw, 150px); + font-weight: 850; + line-height: 0.9; + letter-spacing: 0; + } + + .milestone-label { + font-size: clamp(18px, 4vw, 32px); + font-weight: 750; + letter-spacing: 0; + } + + .milestone-train { + font-size: clamp(42px, 9vw, 88px); + line-height: 1; + } + + .spark { + position: absolute; + top: 50%; + left: 50%; + width: 10px; + height: 18px; + border-radius: 2px; + background: var(--spark-color); + animation: spark-burst 1500ms cubic-bezier(0.16, 1, 0.3, 1) both; + animation-delay: var(--spark-delay); + } + @keyframes wiggle { 0%, 100% { @@ -227,17 +287,79 @@ } } + @keyframes milestone-stage { + 0%, + 100% { + opacity: 0; + } + + 12%, + 82% { + opacity: 1; + } + } + + @keyframes milestone-pop { + 0% { + opacity: 0; + transform: translateY(22px) scale(0.72) rotate(-5deg); + } + + 18% { + opacity: 1; + transform: translateY(0) scale(1.08) rotate(2deg); + } + + 32%, + 74% { + opacity: 1; + transform: translateY(0) scale(1) rotate(0); + } + + 100% { + opacity: 0; + transform: translateY(-18px) scale(0.92) rotate(3deg); + } + } + + @keyframes spark-burst { + 0% { + opacity: 0; + transform: translate(-50%, -50%) scale(0.3) rotate(0deg); + } + + 15% { + opacity: 1; + } + + 100% { + opacity: 0; + transform: translate( + calc(-50% + var(--spark-x)), + calc(-50% + var(--spark-y)) + ) + scale(1) rotate(var(--spark-rotation)); + } + } + @media (prefers-reduced-motion: reduce) { .hero, - .train-emoji:hover { + .train-emoji:hover, + .milestone.show, + .milestone.show .milestone-message { animation: none; transition: none; } - .steam { + .steam, + .spark { display: none; } + .milestone.show { + opacity: 1; + } + .train.ltr, .train.rtl { left: 50%; @@ -284,11 +406,13 @@