feat: 88x31 buttons page
BIN
public/88x31.gif
Normal file
|
After Width: | Height: | Size: 188 KiB |
BIN
public/88x31/7zip.gif
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
public/88x31/any88x31.gif
Normal file
|
After Width: | Height: | Size: 656 B |
BIN
public/88x31/aperture.jpg
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
public/88x31/archive.gif
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
public/88x31/archlinux.gif
Normal file
|
After Width: | Height: | Size: 3 KiB |
BIN
public/88x31/astro.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
public/88x31/blends.gif
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
public/88x31/button-flexbox.gif
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
public/88x31/computer.jpg
Normal file
|
After Width: | Height: | Size: 2 KiB |
BIN
public/88x31/dream.gif
Normal file
|
After Width: | Height: | Size: 714 B |
BIN
public/88x31/firefox.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
public/88x31/got_html.gif
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/88x31/homer.gif
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
public/88x31/jellyfin.gif
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
public/88x31/linux.gif
Normal file
|
After Width: | Height: | Size: 550 B |
BIN
public/88x31/love_blahaj.gif
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
BIN
public/88x31/miku.gif
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
public/88x31/miku2.gif
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
BIN
public/88x31/nyan.gif
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
public/88x31/plasticlove.gif
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
public/88x31/qbittorrent.png
Normal file
|
After Width: | Height: | Size: 326 B |
BIN
public/88x31/responsive.png
Normal file
|
After Width: | Height: | Size: 625 B |
BIN
public/88x31/righttorepair.gif
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
public/88x31/sites/daudix.gif
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
public/88x31/sites/reduc_anim.gif
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
public/88x31/sourcemissing.gif
Normal file
|
After Width: | Height: | Size: 397 B |
BIN
public/88x31/stardew-valley.gif
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
public/88x31/tom-scott.webp
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/88x31/ublock.png
Normal file
|
After Width: | Height: | Size: 5 KiB |
BIN
public/88x31/vscodium.gif
Normal file
|
After Width: | Height: | Size: 479 B |
BIN
public/88x31/wii.gif
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
public/88x31/xp.gif
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
public/88x31_alt.gif
Normal file
|
After Width: | Height: | Size: 192 KiB |
100
src/components/88x31.svelte
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
<script lang="ts">
|
||||
const coolSites = [
|
||||
{ href: "https://melankorin.net/", src: "https://melankorin.net/assets/img/buttons/button-1.gif" },
|
||||
{ href: "https://ellenthekat.nekoweb.org", src: "https://ellenthekat.nekoweb.org/Images/oc%20headshot%20style.png" },
|
||||
{ href: "https://dimden.dev/", src: "https://dimden.dev/services/images/88x31.gif" },
|
||||
{ href: "https://daudix.one", src: "/88x31/sites/daudix.gif" },
|
||||
{ href: "https://reduxflakes.nekoweb.org/", src: "/88x31/sites/reduc_anim.gif" },
|
||||
];
|
||||
|
||||
const miscButtons = [
|
||||
{ href: "https://www.7-zip.org/", src: "/88x31/7zip.gif" },
|
||||
{ href: "https://ec.crypton.co.jp/pages/prod/virtualsinger/cv01_us", src: "/88x31/miku.gif" },
|
||||
{ href: "https://ublockorigin.com/", src: "/88x31/ublock.png" },
|
||||
{ src: "/88x31/xp.gif" },
|
||||
{ src: "/88x31/dream.gif" },
|
||||
{ href: "https://astro.build/", src: "/88x31/astro.png" },
|
||||
{ href: "https://jellyfin.org/", src: "/88x31/jellyfin.gif" },
|
||||
{ href: "https://www.qbittorrent.org/", src: "/88x31/qbittorrent.png" },
|
||||
{ src: "/88x31/responsive.png" },
|
||||
{ src: "/88x31/any88x31.gif" },
|
||||
{ src: "/88x31/aperture.jpg" },
|
||||
{ href: "https://archive.org/", src: "/88x31/archive.gif" },
|
||||
{ src: "/88x31/blends.gif" },
|
||||
{ src: "/88x31/button-flexbox.gif" },
|
||||
{ src: "/88x31/computer.jpg" },
|
||||
{ href: "https://www.firefox.com/en-US/", src: "/88x31/firefox.png" },
|
||||
{ src: "/88x31/got_html.gif" },
|
||||
{ src: "/88x31/homer.gif" },
|
||||
{ src: "/88x31/linux.gif" },
|
||||
{ src: "/88x31/love_blahaj.gif" },
|
||||
{ src: "/88x31/nyan.gif" },
|
||||
{ src: "/88x31/righttorepair.gif" },
|
||||
{ src: "/88x31/sourcemissing.gif" },
|
||||
{ src: "/88x31/stardew-valley.gif" },
|
||||
{ src: "/88x31/tom-scott.webp" },
|
||||
{ href: "https://vscodium.com/", src: "/88x31/vscodium.gif" },
|
||||
{ src: "/88x31/wii.gif" },
|
||||
{ src: "/88x31/plasticlove.gif" },
|
||||
];
|
||||
|
||||
const imgStyle = "image-rendering: crisp-edges;";
|
||||
</script>
|
||||
|
||||
<div class="flex items-center gap-4 text-overlay2 text-sm font-medium my-4">
|
||||
<hr class="grow border-surface0" />
|
||||
<span>cool sites</span>
|
||||
<hr class="grow border-surface0" />
|
||||
</div>
|
||||
|
||||
<div class="button-container">
|
||||
{#each coolSites as { href, src }}
|
||||
<div>
|
||||
{#if href}
|
||||
<a target="_blank" {href}><img {src} width="88" height="31" alt="button" class="button-88x31" style={imgStyle} /></a>
|
||||
{:else}
|
||||
<img {src} width="88" height="31" alt="button" class="button-88x31" style={imgStyle} />
|
||||
{/if}
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
<div class="flex items-center gap-4 text-overlay2 text-sm font-medium my-4">
|
||||
<hr class="grow border-surface0" />
|
||||
<span>misc</span>
|
||||
<hr class="grow border-surface0" />
|
||||
</div>
|
||||
|
||||
<div class="button-container">
|
||||
{#each miscButtons as { href, src }}
|
||||
<div>
|
||||
{#if href}
|
||||
<a target="_blank" {href}><img {src} width="88" height="31" alt="button" class="button-88x31" style={imgStyle} /></a>
|
||||
{:else}
|
||||
<img {src} width="88" height="31" alt="button" class="button-88x31" style={imgStyle} />
|
||||
{/if}
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
<style lang="postcss">
|
||||
.button-container {
|
||||
@apply flex justify-center flex-wrap;
|
||||
}
|
||||
|
||||
.button-container div {
|
||||
@apply hover:z-10;
|
||||
}
|
||||
|
||||
.button-container div:nth-child(odd) .button-88x31 {
|
||||
@apply hover:-rotate-2!;
|
||||
}
|
||||
|
||||
.button-88x31 {
|
||||
@apply hover:scale-125 hover:rotate-2 transition duration-200;
|
||||
}
|
||||
|
||||
.button-container:hover .button-88x31:not(:hover) {
|
||||
@apply opacity-50 brightness-50;
|
||||
}
|
||||
</style>
|
||||
46
src/components/CopyButton.svelte
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
<script lang="ts">
|
||||
import { scale } from "svelte/transition";
|
||||
|
||||
let button: HTMLButtonElement;
|
||||
let hasCopied = false;
|
||||
|
||||
function handleCopy() {
|
||||
navigator.clipboard.writeText(
|
||||
'<a href="https://trafficlunar.net/" target="_blank"><img src="https://trafficlunar.net/88x31.gif" alt="trafficlunar" /></a>'
|
||||
);
|
||||
hasCopied = true;
|
||||
button.setAttribute("data-tooltip", "Copied!");
|
||||
|
||||
setTimeout(() => {
|
||||
hasCopied = false;
|
||||
button.setAttribute("data-tooltip", "Copy");
|
||||
}, 1000);
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="absolute right-2">
|
||||
<button aria-label="Copy Button Code" data-tooltip="Copy" onclick={handleCopy} bind:this={button} class="cursor-pointer size-5.5">
|
||||
{#if hasCopied}
|
||||
<svg in:scale out:scale xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" class="absolute top-0 left-0"
|
||||
><path fill="currentColor" d="m9.55 18l-5.7-5.7l1.425-1.425L9.55 15.15l9.175-9.175L20.15 7.4z" /></svg
|
||||
>
|
||||
{:else}
|
||||
<svg in:scale out:scale xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 24 24" class="absolute inset-0"
|
||||
><g fill="none"
|
||||
><path
|
||||
fill="currentColor"
|
||||
fill-opacity="0.16"
|
||||
d="M18.6 9h-7.2A2.4 2.4 0 0 0 9 11.4v7.2a2.4 2.4 0 0 0 2.4 2.4h7.2a2.4 2.4 0 0 0 2.4-2.4v-7.2A2.4 2.4 0 0 0 18.6 9"
|
||||
/><path
|
||||
stroke="currentColor"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-miterlimit="10"
|
||||
stroke-width="1.5"
|
||||
d="M6 15h-.6C4.07 15 3 13.93 3 12.6V5.4C3 4.07 4.07 3 5.4 3h7.2C13.93 3 15 4.07 15 5.4V6m-3.6 3h7.2a2.4 2.4 0 0 1 2.4 2.4v7.2a2.4 2.4 0 0 1-2.4 2.4h-7.2A2.4 2.4 0 0 1 9 18.6v-7.2A2.4 2.4 0 0 1 11.4 9"
|
||||
/></g
|
||||
></svg
|
||||
>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
|
@ -2,6 +2,7 @@
|
|||
const links = [
|
||||
{ name: "home", url: "/" },
|
||||
{ name: "status", url: "/status/" },
|
||||
{ name: "buttons", url: "/buttons/" },
|
||||
];
|
||||
|
||||
let pathname = $state("/");
|
||||
|
|
@ -25,11 +26,11 @@
|
|||
</script>
|
||||
|
||||
<section class="p-1.5! mb-8 w-fit">
|
||||
<div class="relative grid grid-cols-2 gap-1.5">
|
||||
<div class="relative grid grid-cols-3 gap-1.5">
|
||||
<!-- Animated background for active link -->
|
||||
{#if activeIndex !== -1}
|
||||
<div
|
||||
class="absolute inset-0 bg-peach rounded w-[calc((100%/2)-0.25rem)] pointer-events-none z-10 transition-all duration-300 ease-out"
|
||||
class="absolute inset-0 bg-peach rounded w-[calc((100%/3)-0.25rem)] pointer-events-none z-10 transition-all duration-300 ease-out"
|
||||
style="transform: translateX(calc({activeIndex * 100}% + {activeIndex * 0.375}rem)) {isTransitioning ? 'scale(1.1)' : 'scale(1)'};"
|
||||
></div>
|
||||
{/if}
|
||||
|
|
|
|||
40
src/pages/buttons.astro
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
---
|
||||
import Layout from "../layouts/Layout.astro";
|
||||
import CopyButton from "../components/CopyButton.svelte";
|
||||
import EightyEightyThirtyOne from "../components/88x31.svelte";
|
||||
---
|
||||
|
||||
<Layout>
|
||||
<section
|
||||
class="mb-0! transition-all duration-300 delay-100 starting:opacity-0 starting:translate-y-4 text-[0.938rem] [&_img]:w-[88px] [&_img]:h-[31px]"
|
||||
>
|
||||
<legend>buttons</legend>
|
||||
|
||||
<p class="mb-1">
|
||||
Welcome to my collection of 88x31 buttons, containing cool websites or just random buttons. Get my button below, hotlinking is perfectly fine:
|
||||
</p>
|
||||
|
||||
<div class="flex">
|
||||
<a href="https://trafficlunar.net/" target="_blank" class="shrink-0 mt-2 mr-2 h-min"
|
||||
><img src="/88x31.gif" width="88" height="31" alt="trafficlunar" /></a
|
||||
>
|
||||
|
||||
<div class="bg-mantle p-2.5 rounded-lg relative border border-surface0/75 shadow-sm mt-2">
|
||||
<CopyButton client:load />
|
||||
|
||||
<code class="text-sm font-mono" style="font-variant-ligatures: none;">
|
||||
<span class="text-teal">{"<"}</span><span class="text-blue">a</span>
|
||||
<span class="text-yellow">href</span><span class="text-teal">=</span><span class="text-green">{'"https://trafficlunar.net/"'}</span>
|
||||
<span class="text-yellow">target</span><span class="text-teal">=</span><span class="text-green">{'"_blank"'}</span><span class="text-teal"
|
||||
>{"><"}</span
|
||||
><span class="text-blue">img</span>
|
||||
<span class="text-yellow">src</span><span class="text-teal">=</span><span class="text-green">{'"https://trafficlunar.net/88x31.gif"'}</span>
|
||||
<span class="text-yellow">alt</span><span class="text-teal">=</span><span class="text-green">{'"trafficlunar"'}</span>
|
||||
<span class="text-teal">{"/></"}</span><span class="text-blue">a</span><span class="text-teal">{">"}</span>
|
||||
</code>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<EightyEightyThirtyOne />
|
||||
</section>
|
||||
</Layout>
|
||||