|
188 | 188 | opacity: 1; |
189 | 189 | } |
190 | 190 |
|
| 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 | + |
191 | 275 | /* --- dark theme ----------------------------------------------------------------- */ |
192 | 276 | .dark .prose pre { |
193 | 277 | background: #161b22; |
|
244 | 328 |
|
245 | 329 | <header class="sticky top-0 z-20 bg-white dark:bg-[#0d1117] border-b border-slate-200 dark:border-slate-800"> |
246 | 330 | <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> |
248 | 334 | <div class="flex-1"> |
249 | 335 | <h1 class="text-lg font-semibold text-slate-900 dark:text-slate-100">Morphos</h1> |
250 | 336 | <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 |
360 | 446 | if (!localStorage.getItem('theme')) applyTheme(e.matches); |
361 | 447 | }); |
362 | 448 |
|
| 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 | + |
363 | 465 | const REPO = 'snatalenko/morphos'; |
364 | 466 | const REPO_BRANCH = 'master'; |
365 | 467 | const DEFAULT_DOC = 'README.md'; |
|
0 commit comments