Add SSH key and make clipboard items consistent
This commit is contained in:
parent
e2527064db
commit
67e17ae27f
10 changed files with 127 additions and 162 deletions
|
|
@ -1,40 +1,41 @@
|
|||
import type { APIRoute, GetStaticPaths } from "astro";
|
||||
import { APACHE_CONFIG } from "astro:env/server";
|
||||
|
||||
const htaccess = `
|
||||
const htaccess = String.raw`
|
||||
ErrorDocument 404 /404.html
|
||||
RedirectMatch 301 ^/tos(/(index.html)?)?$ /terms_of_service/
|
||||
RedirectMatch 301 ^/contact(/(index.html)?)?$ /
|
||||
RedirectMatch 301 ^/@/(aryion|ekas?)\\b https://aryion.com/g4/user/BadManners
|
||||
RedirectMatch 301 ^/@/(bluesky|bsky)\\b https://bsky.app/profile/badmanners.xyz
|
||||
RedirectMatch 301 ^/@/(buymeacoffee|bmac)\\b https://www.buymeacoffee.com/BadMannersXYZ
|
||||
RedirectMatch 301 ^/@/carrd\\b https://badmanners.carrd.co
|
||||
RedirectMatch 301 ^/@/codeberg\\b https://codeberg.org/BadManners
|
||||
RedirectMatch 301 ^/@/cohost\\b https://cohost.org/BadManners
|
||||
RedirectMatch 301 ^/@/(fur[_-]?affinity|fa)\\b https://www.furaffinity.net/user/badmanners
|
||||
RedirectMatch 301 ^/@/gallery\\b https://gallery.badmanners.xyz
|
||||
RedirectMatch 301 ^/@/(github|gh)\\b https://github.com/BadMannersXYZ
|
||||
RedirectMatch 301 ^/@/gitlab\\b https://gitlab.com/Bad_Manners
|
||||
RedirectMatch 301 ^/@/gumroad\\b https://badmanners.gumroad.com/
|
||||
RedirectMatch 301 ^/@/(inkbunny|ib)\\b https://inkbunny.net/BadManners
|
||||
RedirectMatch 301 ^/@/itaku\\b https://itaku.ee/profile/badmanners
|
||||
RedirectMatch 301 ^/@/itch\\b https://bad-manners.itch.io
|
||||
RedirectMatch 301 ^/@/keybase\\b https://keybase.io/badmanners
|
||||
RedirectMatch 301 ^/@/ko[_-]?fi\\b https://ko-fi.com/badmanners
|
||||
RedirectMatch 301 ^/@/(mastodon|meow\\.social|gulp\\.cafe)\\b https://meow.social/@BadManners
|
||||
RedirectMatch 301 ^/@/neocities\\b https://badmanners.neocities.org/
|
||||
RedirectMatch 301 ^/@/picarto\\b https://www.picarto.tv/BadManners
|
||||
RedirectMatch 301 ^/@/pillowfort\\b https://www.pillowfort.social/BadManners
|
||||
RedirectMatch 301 ^/@/reddit\\b https://www.reddit.com/user/BadManners_/
|
||||
RedirectMatch 301 ^/@/signal\\b https://signal.me/#eu/ytt_rk0fFmAB2JAW-x2PbUiJyc_H3kYmfL_Pq4QNh5QIDsiFtjdFHaqFRs1D36tB
|
||||
RedirectMatch 301 ^/@/(sofurry|sf)\\b https://bad-manners.sofurry.com/
|
||||
RedirectMatch 301 ^/@/steam\\b https://steamcommunity.com/id/badmanners_/
|
||||
RedirectMatch 301 ^/@/subscribestar\\b https://subscribestar.adult/bad-manners
|
||||
RedirectMatch 301 ^/@/(telegram|t\\.me)\\b https://t.me/bad_manners
|
||||
RedirectMatch 301 ^/@/twitch\\b https://www.twitch.tv/bad__manners
|
||||
RedirectMatch 301 ^/@/weasyl\\b https://www.weasyl.com/~badmanners
|
||||
RedirectMatch 301 ^/@/(x|twitter)\\b https://x.com/BadManners__
|
||||
RedirectMatch 301 ^/@/(youtu\\.?be|yt)\\b https://www.youtube.com/@BadMannersXYZ
|
||||
RedirectMatch 301 ^/@/(aryion|ekas?)\b https://aryion.com/g4/user/BadManners
|
||||
RedirectMatch 301 ^/@/(bluesky|bsky)\b https://bsky.app/profile/badmanners.xyz
|
||||
RedirectMatch 301 ^/@/(buymeacoffee|bmac)\b https://www.buymeacoffee.com/BadMannersXYZ
|
||||
RedirectMatch 301 ^/@/carrd\b https://badmanners.carrd.co
|
||||
RedirectMatch 301 ^/@/codeberg\b https://codeberg.org/BadManners
|
||||
RedirectMatch 301 ^/@/cohost\b https://cohost.org/BadManners
|
||||
RedirectMatch 301 ^/@/(fur[_-]?affinity|fa)\b https://www.furaffinity.net/user/badmanners
|
||||
RedirectMatch 301 ^/@/gallery\b https://gallery.badmanners.xyz
|
||||
RedirectMatch 301 ^/@/(github|gh)\b https://github.com/BadMannersXYZ
|
||||
RedirectMatch 301 ^/@/gitlab\b https://gitlab.com/Bad_Manners
|
||||
RedirectMatch 301 ^/@/gumroad\b https://badmanners.gumroad.com
|
||||
RedirectMatch 301 ^/@/(inkbunny|ib)\b https://inkbunny.net/BadManners
|
||||
RedirectMatch 301 ^/@/itaku\b https://itaku.ee/profile/badmanners
|
||||
RedirectMatch 301 ^/@/itch\b https://bad-manners.itch.io
|
||||
RedirectMatch 301 ^/@/keybase\b https://keybase.io/badmanners
|
||||
RedirectMatch 301 ^/@/ko[_-]?fi\b https://ko-fi.com/badmanners
|
||||
RedirectMatch 301 ^/@/(mastodon|meow\.social|gulp\.cafe)\b https://meow.social/@BadManners
|
||||
RedirectMatch 301 ^/@/neocities\b https://badmanners.neocities.org
|
||||
RedirectMatch 301 ^/@/picarto\b https://www.picarto.tv/BadManners
|
||||
RedirectMatch 301 ^/@/pillowfort\b https://www.pillowfort.social/BadManners
|
||||
RedirectMatch 301 ^/@/reddit\b https://www.reddit.com/user/BadManners_
|
||||
RedirectMatch 301 ^/@/signal\b https://signal.me/#eu/ytt_rk0fFmAB2JAW-x2PbUiJyc_H3kYmfL_Pq4QNh5QIDsiFtjdFHaqFRs1D36tB
|
||||
RedirectMatch 301 ^/@/(sofurry|sf)\b https://bad-manners.sofurry.com
|
||||
RedirectMatch 301 ^/@/ssh\b https://badmanners.xyz/ssh.pub
|
||||
RedirectMatch 301 ^/@/steam\b https://steamcommunity.com/id/badmanners_
|
||||
RedirectMatch 301 ^/@/subscribestar\b https://subscribestar.adult/bad-manners
|
||||
RedirectMatch 301 ^/@/(telegram|t\.me)\b https://t.me/bad_manners
|
||||
RedirectMatch 301 ^/@/twitch\b https://www.twitch.tv/bad__manners
|
||||
RedirectMatch 301 ^/@/weasyl\b https://www.weasyl.com/~badmanners
|
||||
RedirectMatch 301 ^/@/(x|twitter)\b https://x.com/BadManners__
|
||||
RedirectMatch 301 ^/@/(youtu\.?be|yt)\b https://www.youtube.com/@BadMannersXYZ
|
||||
`.trim();
|
||||
|
||||
export const getStaticPaths: GetStaticPaths = async () => {
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ import IconTwitch from "../components/icons/brands/IconTwitch.astro";
|
|||
import IconWeasyl from "../components/icons/brands/IconWeasyl.astro";
|
||||
import IconX from "../components/icons/brands/IconX.astro";
|
||||
import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
||||
import IconSSH from "../components/icons/brands/IconSSH.astro";
|
||||
---
|
||||
|
||||
<BaseLayout>
|
||||
|
|
@ -64,9 +65,10 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-email text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="mailto:me@badmanners.xyz"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="me@badmanners.xyz"
|
||||
data-clipboard="me@badmanners.xyz"
|
||||
data-noun="E-mail address"
|
||||
>
|
||||
<IconEnvelope
|
||||
height="1.75rem"
|
||||
|
|
@ -80,7 +82,6 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://bsky.app/profile/badmanners.xyz"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="Bluesky"
|
||||
>
|
||||
|
|
@ -96,7 +97,6 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://codeberg.org/BadManners"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="Codeberg"
|
||||
>
|
||||
|
|
@ -112,7 +112,6 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://cohost.org/BadManners"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="Cohost"
|
||||
>
|
||||
|
|
@ -128,7 +127,8 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<button
|
||||
class="text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
aria-label="Discord"
|
||||
data-username="badmanners"
|
||||
data-clipboard="badmanners"
|
||||
data-noun="Discord username"
|
||||
aria-disabled="true"
|
||||
>
|
||||
<IconDiscord
|
||||
|
|
@ -143,7 +143,6 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://aryion.com/g4/user/BadManners"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="Eka's Portal"
|
||||
>
|
||||
|
|
@ -159,7 +158,6 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://www.furaffinity.net/user/BadManners"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="Fur Affinity"
|
||||
>
|
||||
|
|
@ -175,7 +173,6 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://github.com/BadMannersXYZ"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="GitHub"
|
||||
>
|
||||
|
|
@ -191,7 +188,6 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://gitlab.com/Bad_Manners"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="GitLab"
|
||||
>
|
||||
|
|
@ -207,9 +203,10 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-email text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="mailto:badmanners.vore@gmail.com"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="badmanners.vore@gmail.com"
|
||||
data-clipboard="badmanners.vore@gmail.com"
|
||||
data-noun="Gmail address"
|
||||
>
|
||||
<IconGoogle
|
||||
height="1.75rem"
|
||||
|
|
@ -223,7 +220,6 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://inkbunny.net/BadManners"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="Inkbunny"
|
||||
>
|
||||
|
|
@ -239,7 +235,6 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://itaku.ee/profile/badmanners"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="Itaku"
|
||||
>
|
||||
|
|
@ -255,7 +250,6 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://bad-manners.itch.io"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="Itch.io"
|
||||
>
|
||||
|
|
@ -271,7 +265,6 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://keybase.io/badmanners"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="Keybase"
|
||||
>
|
||||
|
|
@ -287,7 +280,6 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://ko-fi.com/badmanners"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="Ko-fi"
|
||||
>
|
||||
|
|
@ -303,7 +295,6 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://meow.social/@BadManners"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="Mastodon"
|
||||
>
|
||||
|
|
@ -312,14 +303,13 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
width="1.75rem"
|
||||
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
|
||||
/>
|
||||
<p class="sr-only">@BadManners p-nickname@meow.social on Mastodon</p>
|
||||
<p class="p-nickname sr-only">@BadManners@meow.social on Mastodon</p>
|
||||
</a>
|
||||
</li>
|
||||
<li id="neocities">
|
||||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://badmanners.neocities.org/"
|
||||
target="_blank"
|
||||
href="https://badmanners.neocities.org"
|
||||
rel="me"
|
||||
aria-label="Neocities"
|
||||
>
|
||||
|
|
@ -328,14 +318,13 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
width="1.75rem"
|
||||
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
|
||||
/>
|
||||
<p class="sr-only">badmanners p-nickname.neocities.org on Neocities</p>
|
||||
<p class="p-nickname sr-only">badmanners.neocities.org on Neocities</p>
|
||||
</a>
|
||||
</li>
|
||||
<li id="picarto">
|
||||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://www.picarto.tv/BadManners"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="Picarto"
|
||||
>
|
||||
|
|
@ -350,8 +339,7 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<li id="reddit">
|
||||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://www.reddit.com/user/BadManners_/"
|
||||
target="_blank"
|
||||
href="https://www.reddit.com/user/BadManners_"
|
||||
rel="me"
|
||||
aria-label="Reddit"
|
||||
>
|
||||
|
|
@ -367,7 +355,6 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://signal.me/#eu/ytt_rk0fFmAB2JAW-x2PbUiJyc_H3kYmfL_Pq4QNh5QIDsiFtjdFHaqFRs1D36tB"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="Signal"
|
||||
>
|
||||
|
|
@ -382,8 +369,7 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<li id="sofurry">
|
||||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://bad-manners.sofurry.com/"
|
||||
target="_blank"
|
||||
href="https://bad-manners.sofurry.com"
|
||||
rel="me"
|
||||
aria-label="SoFurry"
|
||||
>
|
||||
|
|
@ -395,11 +381,26 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<p class="p-nickname sr-only">Bad Manners on SoFurry</p>
|
||||
</a>
|
||||
</li>
|
||||
<li id="ssh">
|
||||
<a
|
||||
class="u-key text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="/ssh.pub"
|
||||
aria-label="SSH public key"
|
||||
data-clipboard="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ3QAZd3E95gxef2kiXppWa/xhcwBtnKMZJaW6s4d7Tm Bad Manners <me@badmanners.xyz>"
|
||||
data-noun="SSH key"
|
||||
>
|
||||
<IconSSH
|
||||
height="1.75rem"
|
||||
width="1.75rem"
|
||||
class="inline transition-transform group-hover:scale-150 group-focus:scale-150 motion-reduce:transition-none motion-reduce:group-hover:scale-100 motion-reduce:group-focus:scale-100"
|
||||
/>
|
||||
<p class="sr-only">SSH public key</p>
|
||||
</a>
|
||||
</li>
|
||||
<li id="steam">
|
||||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://steamcommunity.com/id/badmanners_/"
|
||||
target="_blank"
|
||||
href="https://steamcommunity.com/id/badmanners_"
|
||||
rel="me"
|
||||
aria-label="Steam"
|
||||
>
|
||||
|
|
@ -415,7 +416,6 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://subscribestar.adult/bad-manners"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="SubscribeStar"
|
||||
>
|
||||
|
|
@ -431,7 +431,6 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://t.me/bad_manners"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="Telegram"
|
||||
>
|
||||
|
|
@ -447,7 +446,6 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://www.twitch.tv/bad__manners"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="Twitch"
|
||||
>
|
||||
|
|
@ -463,7 +461,6 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://www.weasyl.com/~badmanners"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="Weasyl"
|
||||
>
|
||||
|
|
@ -479,7 +476,6 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://x.com/BadManners__"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="X"
|
||||
>
|
||||
|
|
@ -495,7 +491,6 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
<a
|
||||
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
|
||||
href="https://www.youtube.com/@BadMannersXYZ"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
aria-label="YouTube"
|
||||
>
|
||||
|
|
@ -526,13 +521,11 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
}
|
||||
|
||||
// Validate links
|
||||
const emailAnchors = indexLinks.querySelectorAll<HTMLElementTagNameMap["a"]>(`li > a[href^="mailto:"]`);
|
||||
const usernameButtons = indexLinks.querySelectorAll<HTMLElementTagNameMap["button"]>("li > button[data-username]");
|
||||
if (!emailAnchors.length) {
|
||||
console.warn("Missing e-mail anchors in #links list.");
|
||||
}
|
||||
if (!usernameButtons.length) {
|
||||
console.warn("Missing username buttons in #links list.");
|
||||
const customClipboardItems = indexLinks.querySelectorAll<HTMLElementTagNameMap["a" | "button"]>(
|
||||
"li > :is(a, button)[data-clipboard]",
|
||||
);
|
||||
if (!customClipboardItems.length) {
|
||||
console.warn("Missing custom clipboard elements in #links list.");
|
||||
}
|
||||
indexLinks.querySelectorAll("li > :not(a, button)").forEach((el) => {
|
||||
console.warn("Element with unknown type found in #links list:", el);
|
||||
|
|
@ -547,68 +540,32 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
|
|||
theme: "bm",
|
||||
});
|
||||
|
||||
// Add clipboard functionality to e-mail anchors and username buttons
|
||||
// Add functionality to custom clipboard items
|
||||
let tooltipTimeoutTag: TimeoutTag = null;
|
||||
emailAnchors.forEach((anchor) => {
|
||||
if (!anchor.href.startsWith("mailto:")) {
|
||||
console.warn("Missing mailto: href for e-mail anchor, ignoring...", anchor);
|
||||
customClipboardItems.forEach((element) => {
|
||||
const label = element.dataset.noun ?? element.getAttribute("aria-label");
|
||||
const clipboard = element.dataset.clipboard;
|
||||
if (!clipboard) {
|
||||
console.warn(`Missing "data-clipboard" field for custom clipboard element, ignoring...`, element);
|
||||
return;
|
||||
}
|
||||
const emailAddress = anchor.href.slice("mailto:".length);
|
||||
const anchorTooltip = tippy(anchor, {
|
||||
content: "E-mail address copied to clipboard!",
|
||||
element.removeAttribute("aria-disabled");
|
||||
const elementTooltip = tippy(element, {
|
||||
content: label ? `${label} copied to clipboard!` : "Copied to clipboard!",
|
||||
trigger: "manual",
|
||||
theme: "bm",
|
||||
});
|
||||
anchor.addEventListener("click", (ev) => {
|
||||
element.addEventListener("click", (ev) => {
|
||||
ev.preventDefault();
|
||||
tooltipTimeoutTag && clearTimeout(tooltipTimeoutTag);
|
||||
hideAll();
|
||||
navigator.clipboard
|
||||
.writeText(emailAddress)
|
||||
.writeText(clipboard)
|
||||
.then(() => {
|
||||
anchorTooltip.setContent("E-mail address copied to clipboard!");
|
||||
anchorTooltip.show();
|
||||
elementTooltip.show();
|
||||
})
|
||||
.catch((e) => {
|
||||
console.error("Unable to copy e-mail address to clipboard.", e);
|
||||
anchorTooltip.setContent("Unable to copy e-mail address!");
|
||||
anchorTooltip.show();
|
||||
});
|
||||
});
|
||||
});
|
||||
usernameButtons.forEach((button) => {
|
||||
const label = button.getAttribute("aria-label");
|
||||
const username = button.dataset.username;
|
||||
if (!username) {
|
||||
console.warn("Missing data-username for button, ignoring...", button);
|
||||
return;
|
||||
}
|
||||
button.removeAttribute("aria-disabled");
|
||||
button.removeAttribute("disabled");
|
||||
const successContent = label ? `${label} username copied to clipboard!` : "Username copied to clipboard!";
|
||||
const buttonTooltip = tippy(button, {
|
||||
content: successContent,
|
||||
trigger: "manual",
|
||||
theme: "bm",
|
||||
});
|
||||
button.addEventListener("click", (ev) => {
|
||||
ev.preventDefault();
|
||||
tooltipTimeoutTag && clearTimeout(tooltipTimeoutTag);
|
||||
hideAll();
|
||||
navigator.clipboard
|
||||
.writeText(username)
|
||||
.then(() => {
|
||||
buttonTooltip.setContent(successContent);
|
||||
buttonTooltip.show();
|
||||
})
|
||||
.catch((e) => {
|
||||
console.error(
|
||||
label ? `Unable to copy ${label} username to clipboard.` : "Unable to copy username to clipboard.",
|
||||
e,
|
||||
);
|
||||
buttonTooltip.setContent(label ? `Unable to copy ${label} username!` : "Unable to copy username!");
|
||||
buttonTooltip.show();
|
||||
console.error("Unable to copy custom content to clipboard.", clipboard, e);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@ import { TOS_COMMISSION_STATUS, TOS_UPDATED_AT } from "../data/tos";
|
|||
href="/feed.xml"
|
||||
rel="alternate"
|
||||
type="application/rss+xml"
|
||||
target="_blank"
|
||||
title="RSS feed"
|
||||
aria-label="RSS feed"
|
||||
>
|
||||
|
|
@ -131,7 +130,7 @@ import { TOS_COMMISSION_STATUS, TOS_UPDATED_AT } from "../data/tos";
|
|||
If you have any doubts, or are considering getting a commission from me,
|
||||
<a href="/" class="text-link underline transition-colors motion-reduce:transition-none"
|
||||
>please reach out through my socials</a
|
||||
>! Preferably Discord or Telegram, where I'm more active.
|
||||
>! Preferably through Discord or Telegram, where I'm more active.
|
||||
</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
|
|
|||
|
|
@ -22,17 +22,10 @@ import { SUBSCRIBESTAR_ENABLED } from "../data/subscribestar";
|
|||
I've been a lurker in the furry vore community for a long time before I decided to start writing
|
||||
<a
|
||||
class="text-link transition-colors motion-reduce:transition-none"
|
||||
href="https://gallery.badmanners.xyz/stories/1"
|
||||
target="_blank"
|
||||
><span class="underline">safe vore stories</span>
|
||||
<IconArrowUpRightFromSquare width="0.75rem" height="0.75rem" class="inline" /></a
|
||||
href="https://gallery.badmanners.xyz/stories/1"><span class="underline">safe vore stories</span></a
|
||||
>. Since there's a lot in furry endosoma that I enjoy, my stories tend to
|
||||
<a
|
||||
class="text-link transition-colors motion-reduce:transition-none"
|
||||
href="https://gallery.badmanners.xyz/tags"
|
||||
target="_blank"
|
||||
><span class="underline">have all sorts of themes and scenarios</span>
|
||||
<IconArrowUpRightFromSquare width="0.75rem" height="0.75rem" class="inline" /></a
|
||||
<a class="text-link transition-colors motion-reduce:transition-none" href="https://gallery.badmanners.xyz/tags"
|
||||
><span class="underline">have all sorts of themes and scenarios</span></a
|
||||
>, including exotic ones. My content is all tagged with the appropriate content warnings, so if you enjoy safe
|
||||
vore, chances are that you'll find something in my gallery that is right up your alley.
|
||||
</p>
|
||||
|
|
@ -40,27 +33,22 @@ import { SUBSCRIBESTAR_ENABLED } from "../data/subscribestar";
|
|||
I've also made a game called
|
||||
<a
|
||||
class="text-link transition-colors motion-reduce:transition-none"
|
||||
href="https://gallery.badmanners.xyz/games/crossing-over"
|
||||
target="_blank"
|
||||
><span class="underline">"Crossing Over"</span>
|
||||
<IconArrowUpRightFromSquare width="0.75rem" height="0.75rem" class="inline" /></a
|
||||
href="https://gallery.badmanners.xyz/games/crossing-over"><span class="underline">"Crossing Over"</span></a
|
||||
>, as part of Strawberry Jam 8 (a game jam hosted by eevee on Feb. 2024). It's been my biggest project so far,
|
||||
and I'm very proud of it!
|
||||
and I'm very proud of it! Check it out if you have an hour to spare and the subject matters interest you.
|
||||
</p>
|
||||
<p class="my-4 text-justify indent-6 sm:mb-3 sm:mt-6 sm:px-5 sm:indent-12">
|
||||
You can find my gallery on the following websites, which include all of my content. Aside from the first link,
|
||||
these also include some of the art that I've gotten from others (commissions, gifts, etc.).
|
||||
<p class="mb-4 mt-4 text-justify indent-6 sm:mt-6 sm:px-5 sm:indent-12">
|
||||
You can find my gallery and its mirrors below, which include all of my content. Aside from the first link, these
|
||||
also include some of the art that I got from others (commissions, gifts, etc.).
|
||||
</p>
|
||||
<ul class="h-card flex flex-col items-center">
|
||||
<li class="mb-2 w-max sm:mb-1">
|
||||
<a
|
||||
class="u-url text-link mx-1 transition-colors motion-reduce:transition-none"
|
||||
href="https://gallery.badmanners.xyz/"
|
||||
target="_blank"
|
||||
href="https://gallery.badmanners.xyz"
|
||||
>
|
||||
<IconBriefcase height="1.75rem" width="1.75rem" class="mr-1 inline" />
|
||||
<span class="underline">gallery.badmanners.xyz</span>
|
||||
<IconArrowUpRightFromSquare width="0.75rem" height="0.75rem" class="inline" />
|
||||
</a>
|
||||
</li>
|
||||
<li class="mb-2 w-max sm:mb-1">
|
||||
|
|
@ -102,7 +90,7 @@ import { SUBSCRIBESTAR_ENABLED } from "../data/subscribestar";
|
|||
<li class="mb-2 w-max sm:mb-1">
|
||||
<a
|
||||
class="u-url text-link mx-1 transition-colors motion-reduce:transition-none"
|
||||
href="https://bad-manners.sofurry.com/"
|
||||
href="https://bad-manners.sofurry.com"
|
||||
target="_blank"
|
||||
rel="me"
|
||||
>
|
||||
|
|
@ -130,17 +118,17 @@ import { SUBSCRIBESTAR_ENABLED } from "../data/subscribestar";
|
|||
{
|
||||
TOS_COMMISSION_STATUS == "CLOSED" ? (
|
||||
<p class="mb-6 mt-2 sm:mt-3 sm:px-5">
|
||||
My story commissions are currently closed, but regardless, feel free to
|
||||
<a href="/terms_of_service" class="text-link underline transition-colors motion-reduce:transition-none">
|
||||
check out my Terms of Service
|
||||
</a>
|
||||
My story commissions are currently closed, but regardless, feel free to{" "}
|
||||
<a href="/terms_of_service" class="text-link transition-colors motion-reduce:transition-none">
|
||||
<span class="underline">check out my Terms of Service</span>
|
||||
</a>{" "}
|
||||
if interested.
|
||||
</p>
|
||||
) : TOS_COMMISSION_STATUS == "OPEN" ? (
|
||||
<p class="mb-6 mt-2 sm:mt-3 sm:px-5">
|
||||
My story commissions are currently open! Feel free to{" "}
|
||||
<a href="/terms_of_service" class="text-link underline transition-colors motion-reduce:transition-none">
|
||||
check out my Terms of Service
|
||||
<a class="text-link transition-colors motion-reduce:transition-none" href="/terms_of_service">
|
||||
<span class="underline">check out my Terms of Service</span>
|
||||
</a>{" "}
|
||||
if interested.
|
||||
</p>
|
||||
|
|
@ -148,8 +136,8 @@ import { SUBSCRIBESTAR_ENABLED } from "../data/subscribestar";
|
|||
<p class="mb-6 mt-2 sm:mt-3 sm:px-5">
|
||||
My story commissions are currently semi-open, meaning that I may take some commissions, but might reject or
|
||||
postpone them more easily. Feel free to{" "}
|
||||
<a href="/terms_of_service" class="text-link underline transition-colors motion-reduce:transition-none">
|
||||
check out my Terms of Service
|
||||
<a href="/terms_of_service" class="text-link transition-colors motion-reduce:transition-none">
|
||||
<span class="underline">check out my Terms of Service</span>
|
||||
</a>{" "}
|
||||
if interested.
|
||||
</p>
|
||||
|
|
@ -157,16 +145,16 @@ import { SUBSCRIBESTAR_ENABLED } from "../data/subscribestar";
|
|||
<p class="mb-6 mt-2 sm:mt-3 sm:px-5">
|
||||
My story commissions are currently private, meaning that I'm not offering slots publicly, but I may still
|
||||
work on commissions for specific clients. Regardless of whether this applies to you or not, feel free to{" "}
|
||||
<a href="/terms_of_service" class="text-link underline transition-colors motion-reduce:transition-none">
|
||||
check out my Terms of Service
|
||||
<a href="/terms_of_service" class="text-link transition-colors motion-reduce:transition-none">
|
||||
<span class="underline">check out my Terms of Service</span>
|
||||
</a>{" "}
|
||||
if interested.
|
||||
</p>
|
||||
) : (
|
||||
<p class="mb-6 mt-2 sm:mt-3 sm:px-5">
|
||||
Feel free to{" "}
|
||||
<a href="/terms_of_service" class="text-link underline transition-colors motion-reduce:transition-none">
|
||||
check out my Terms of Service
|
||||
<a href="/terms_of_service" class="text-link transition-colors motion-reduce:transition-none">
|
||||
<span class="underline">check out my Terms of Service</span>
|
||||
</a>{" "}
|
||||
if interested.
|
||||
</p>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue