Skip to content

Commit 7d6addd

Browse files
committed
Add easter egg animation
1 parent 147ebbe commit 7d6addd

1 file changed

Lines changed: 103 additions & 1 deletion

File tree

index.html

Lines changed: 103 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,90 @@
188188
opacity: 1;
189189
}
190190

191+
.butterfly-button {
192+
position: relative;
193+
display: inline-flex;
194+
width: 4rem;
195+
height: 2rem;
196+
flex: 0 0 auto;
197+
align-items: center;
198+
justify-content: center;
199+
overflow: visible;
200+
border: 0;
201+
padding: 0;
202+
background: transparent;
203+
}
204+
205+
.butterfly-logo {
206+
transform-origin: 50% 52%;
207+
will-change: transform, opacity, filter;
208+
}
209+
210+
.butterfly-logo.is-flying {
211+
animation: butterfly-fly-away 3.1s cubic-bezier(0.42, 0, 0.2, 1) forwards;
212+
pointer-events: none;
213+
}
214+
215+
@keyframes butterfly-fly-away {
216+
0% {
217+
opacity: 1;
218+
filter: drop-shadow(0 1px 0 rgba(15, 23, 42, 0));
219+
transform: translate3d(0, 0, 0) rotate(0deg) scaleX(1) scaleY(1);
220+
}
221+
10% {
222+
transform: translate3d(0.05rem, 0, 0) rotate(-1deg) scaleX(0.32) scaleY(1.08);
223+
}
224+
20% {
225+
transform: translate3d(0.12rem, -0.04rem, 0) rotate(1deg) scaleX(1.18) scaleY(0.94);
226+
}
227+
30% {
228+
transform: translate3d(0.18rem, -0.06rem, 0) rotate(-1deg) scaleX(0.36) scaleY(1.07);
229+
}
230+
34% {
231+
transform: translate3d(0.45rem, -0.18rem, 0) rotate(2deg) scaleX(0.72) scaleY(1);
232+
}
233+
38% {
234+
transform: translate3d(0.95rem, -0.42rem, 0) rotate(5deg) scaleX(1.12) scaleY(0.95);
235+
}
236+
41% {
237+
transform: translate3d(2.3rem, -0.9rem, 0) rotate(10deg) scaleX(0.76) scaleY(1.02);
238+
}
239+
44% {
240+
filter: drop-shadow(0 8px 8px rgba(15, 23, 42, 0.18));
241+
transform: translate3d(4.8rem, -1.55rem, 0) rotate(14deg) scaleX(0.42) scaleY(1.06);
242+
}
243+
50% {
244+
transform: translate3d(9vw, -3.1rem, 0) rotate(22deg) scaleX(0.8) scaleY(1);
245+
}
246+
56% {
247+
transform: translate3d(15vw, -4.8rem, 0) rotate(26deg) scaleX(1.12) scaleY(0.95);
248+
}
249+
62% {
250+
transform: translate3d(22vw, -6.7rem, 0) rotate(20deg) scaleX(0.62) scaleY(1.04);
251+
}
252+
68% {
253+
transform: translate3d(30vw, -8.8rem, 0) rotate(17deg) scaleX(0.36) scaleY(1.07);
254+
}
255+
74% {
256+
transform: translate3d(40vw, -11.2rem, 0) rotate(24deg) scaleX(0.78) scaleY(1);
257+
}
258+
80% {
259+
transform: translate3d(52vw, -14rem, 0) rotate(29deg) scaleX(1.08) scaleY(0.96);
260+
}
261+
87% {
262+
transform: translate3d(66vw, -17.4rem, 0) rotate(22deg) scaleX(0.44) scaleY(1.05);
263+
}
264+
94% {
265+
opacity: 1;
266+
transform: translate3d(84vw, -21.6rem, 0) rotate(31deg) scaleX(1.05) scaleY(0.98);
267+
}
268+
100% {
269+
opacity: 0;
270+
filter: drop-shadow(0 16px 12px rgba(15, 23, 42, 0));
271+
transform: translate3d(105vw, -27rem, 0) rotate(36deg) scaleX(0.22) scaleY(1.12);
272+
}
273+
}
274+
191275
/* --- dark theme ----------------------------------------------------------------- */
192276
.dark .prose pre {
193277
background: #161b22;
@@ -244,7 +328,9 @@
244328

245329
<header class="sticky top-0 z-20 bg-white dark:bg-[#0d1117] border-b border-slate-200 dark:border-slate-800">
246330
<div class="max-w-screen-2xl mx-auto px-4 py-3 flex items-center gap-3">
247-
<img src="docs/images/morphos_logo.svg" alt="Morphos" class="h-8 w-16" />
331+
<button id="butterfly-logo" type="button" class="butterfly-button" aria-label="Let the butterfly fly away">
332+
<img id="butterfly-logo-image" src="docs/images/morphos_logo.svg" alt="Morphos" class="butterfly-logo h-8 w-16" />
333+
</button>
248334
<div class="flex-1">
249335
<h1 class="text-lg font-semibold text-slate-900 dark:text-slate-100">Morphos</h1>
250336
<p class="text-xs text-slate-500 dark:text-slate-400 -mt-0.5 hidden sm:block">JSON-to-JSON mapper with user-defined JSON mapping specs, plain JS transformation expressions, and secure VM execution</p>
@@ -360,6 +446,22 @@ <h2 class="text-xs font-semibold uppercase tracking-wider text-slate-500 dark:te
360446
if (!localStorage.getItem('theme')) applyTheme(e.matches);
361447
});
362448

449+
const butterflyButton = document.getElementById('butterfly-logo');
450+
const butterflyImage = document.getElementById('butterfly-logo-image');
451+
452+
butterflyButton.addEventListener('click', () => {
453+
if (butterflyImage.classList.contains('is-flying')) return;
454+
455+
butterflyButton.disabled = true;
456+
butterflyImage.classList.add('is-flying');
457+
butterflyImage.addEventListener('animationend', () => {
458+
window.setTimeout(() => {
459+
butterflyImage.classList.remove('is-flying');
460+
butterflyButton.disabled = false;
461+
}, 800);
462+
}, { once: true });
463+
});
464+
363465
const REPO = 'snatalenko/morphos';
364466
const REPO_BRANCH = 'master';
365467
const DEFAULT_DOC = 'README.md';

0 commit comments

Comments
 (0)