| 1 | --- |
| 2 | const year = new Date().getFullYear(); |
| 3 | import Image from "astro/components/Image.astro"; |
| 4 | --- |
| 5 | |
| 6 | <footer |
| 7 | class="mt-auto flex flex-col gap-y-3 pt-20 pb-12 text-zinc-500 text-xs" |
| 8 | > |
| 9 | <a class="underline" href="/"> |
| 10 | © {year} stevedylan.dev |
| 11 | </a> |
| 12 | <a target="_blank" rel="noreferrer" class="underline" href="https://github.com/stevedylandev/stevedylan.dev">Source Code</a> |
| 13 | <a class="underline" href="mailto:contact@stevedylan.dev">Contact</a> |
| 14 | <a class="underline" href="/kill-your-lawn">Kill Your Lawn</a> |
| 15 | <a href="/murmurations" class="flex items-center gap-1.5 murmuration-flock" aria-label="Murmurations"> |
| 16 | {Array.from({ length: 7 }).map(() => ( |
| 17 | <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 256 256" class="murmuration-bird"> |
| 18 | <path fill="currentColor" d="M237.33 106.21L61.41 41l-.16-.05a16 16 0 0 0-20.35 20.3a1 1 0 0 0 .05.16l65.26 175.92A15.77 15.77 0 0 0 121.28 248h.3a15.77 15.77 0 0 0 15-11.29l.06-.2l21.84-78l78-21.84l.2-.06a16 16 0 0 0 .62-30.38Zm-87.49 38.09a8 8 0 0 0-5.54 5.54l-23 82.16l-.06-.17L56 56l175.82 65.22l.16.06Z"/> |
| 19 | </svg> |
| 20 | ))} |
| 21 | </a> |
| 22 | <script> |
| 23 | document.querySelectorAll<SVGElement>('.murmuration-flock .murmuration-bird').forEach((el) => { |
| 24 | const deg = Math.random() * 360; |
| 25 | el.style.transform = `rotate(${deg}deg)`; |
| 26 | }); |
| 27 | </script> |
| 28 | <a href="https://blog.kagi.com/small-web-updates"> |
| 29 | <Image inferSize={true} src="https://kagifeedback.org/assets/files/2025-11-27/1764250950-635837-80x15-2.png" alt="Kagi Small Web badge"/> |
| 30 | </a> |
| 31 | </footer> |