Goodbye View Transitions
This commit is contained in:
parent
6c834dd58a
commit
651054e65f
11 changed files with 654 additions and 704 deletions
1205
package-lock.json
generated
1205
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "badmanners.xyz",
|
"name": "badmanners.xyz",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "2.1.17",
|
"version": "2.2.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"postinstall": "astro sync",
|
"postinstall": "astro sync",
|
||||||
"dev": "astro dev",
|
"dev": "astro dev",
|
||||||
|
|
@ -23,7 +23,6 @@
|
||||||
"alpinejs": "^3.14.1",
|
"alpinejs": "^3.14.1",
|
||||||
"astro": "^4.15.5",
|
"astro": "^4.15.5",
|
||||||
"astro-htaccess": "^0.2.0",
|
"astro-htaccess": "^0.2.0",
|
||||||
"astro-loading-indicator": "^0.6.0",
|
|
||||||
"date-fns": "^3.6.0",
|
"date-fns": "^3.6.0",
|
||||||
"tailwindcss": "^3.4.11",
|
"tailwindcss": "^3.4.11",
|
||||||
"tippy.js": "^6.3.7",
|
"tippy.js": "^6.3.7",
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
---
|
---
|
||||||
---
|
---
|
||||||
|
|
||||||
<script is:inline>let g=document,f=a=>{var b="dark",c=localStorage,d=c.colorScheme;(d!="light"&&(d==b||matchMedia("(prefers-color-scheme:dark)").matches))&&a.body.classList.add(b)};g.addEventListener('astro:before-swap',e=>f(e.newDocument));f(g)</script>
|
<script is:inline>(a=>{var b="dark",c=localStorage,d=c.colorScheme;(d!="light"&&(d==b||matchMedia("(prefers-color-scheme:dark)").matches))&&a.body.classList.add(b)})(document)</script>
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,5 @@
|
||||||
tooltipItems.forEach((el) => el.removeAttribute("title"));
|
tooltipItems.forEach((el) => el.removeAttribute("title"));
|
||||||
};
|
};
|
||||||
|
|
||||||
document.addEventListener("astro:page-load", initTooltips);
|
|
||||||
initTooltips();
|
initTooltips();
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
---
|
---
|
||||||
import { ViewTransitions } from "astro:transitions";
|
|
||||||
import LoadingIndicator from "astro-loading-indicator/component";
|
|
||||||
import DarkModeScriptInline from "@components/DarkModeScriptInline.astro";
|
import DarkModeScriptInline from "@components/DarkModeScriptInline.astro";
|
||||||
import NavHeader from "@components/NavHeader.astro";
|
import NavHeader from "@components/NavHeader.astro";
|
||||||
import { IconSun, IconMoon } from "@components/icons";
|
import { IconSun, IconMoon } from "@components/icons";
|
||||||
|
|
@ -34,19 +32,6 @@ const title = pageTitle ? `${pageTitle} | Bad Manners` : "Bad Manners";
|
||||||
<meta property="og:url" content={Astro.url} />
|
<meta property="og:url" content={Astro.url} />
|
||||||
<meta content="/logo.webp" property="og:image" />
|
<meta content="/logo.webp" property="og:image" />
|
||||||
<slot name="head" />
|
<slot name="head" />
|
||||||
<ViewTransitions />
|
|
||||||
<LoadingIndicator color="#3b82f6" height="0.25rem" threshold={false} />
|
|
||||||
<script>
|
|
||||||
import Alpine from "alpinejs";
|
|
||||||
document.addEventListener("astro:after-preparation", () => {
|
|
||||||
Alpine.stopObservingMutations();
|
|
||||||
});
|
|
||||||
document.addEventListener("astro:page-load", () => {
|
|
||||||
document.dispatchEvent(new Event("alpine:init"));
|
|
||||||
Alpine.initTree(document.documentElement);
|
|
||||||
Alpine.startObservingMutations();
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</head>
|
</head>
|
||||||
<body
|
<body
|
||||||
:class="ageVerified ? 'overflow-auto' : 'overflow-hidden'"
|
:class="ageVerified ? 'overflow-auto' : 'overflow-hidden'"
|
||||||
|
|
@ -66,12 +51,11 @@ const title = pageTitle ? `${pageTitle} | Bad Manners` : "Bad Manners";
|
||||||
<main
|
<main
|
||||||
class="w-full max-w-5xl flex-shrink-0 flex-grow-0 justify-center rounded-xl bg-stone-50 px-4 pb-6 pt-4 text-center text-base font-normal tracking-tight text-stone-700 sm:px-8 sm:pb-8 sm:pt-6 sm:text-lg dark:bg-zinc-800 dark:text-zinc-50 print:bg-transparent print:p-0"
|
class="w-full max-w-5xl flex-shrink-0 flex-grow-0 justify-center rounded-xl bg-stone-50 px-4 pb-6 pt-4 text-center text-base font-normal tracking-tight text-stone-700 sm:px-8 sm:pb-8 sm:pt-6 sm:text-lg dark:bg-zinc-800 dark:text-zinc-50 print:bg-transparent print:p-0"
|
||||||
>
|
>
|
||||||
<NavHeader transition:animate="none" />
|
<NavHeader />
|
||||||
<slot />
|
<slot />
|
||||||
</main>
|
</main>
|
||||||
<footer
|
<footer
|
||||||
class="sm:text-md flex flex-col items-center pt-9 text-sm font-medium tracking-wide text-black dark:text-white"
|
class="sm:text-md flex flex-col items-center pt-9 text-sm font-medium tracking-wide text-black dark:text-white"
|
||||||
transition:persist
|
|
||||||
>
|
>
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<span id="copyright" class="mr-2"
|
<span id="copyright" class="mr-2"
|
||||||
|
|
@ -102,7 +86,7 @@ const title = pageTitle ? `${pageTitle} | Bad Manners` : "Bad Manners";
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<DarkModeScriptInline transition:persist />
|
<DarkModeScriptInline />
|
||||||
<AgeRestrictedModal transition:persist />
|
<AgeRestrictedModal />
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import BaseLayout from "@layouts/BaseLayout.astro";
|
||||||
|
|
||||||
<BaseLayout pageTitle="Not found">
|
<BaseLayout pageTitle="Not found">
|
||||||
<meta slot="head" property="og:description" content="Not found." />
|
<meta slot="head" property="og:description" content="Not found." />
|
||||||
<article aria-labelledby="title-not-found" transition:name="content">
|
<article aria-labelledby="title-not-found">
|
||||||
<h1 id="title-not-found" class="text-2xl sm:text-3xl">404 – Not found</h1>
|
<h1 id="title-not-found" class="text-2xl sm:text-3xl">404 – Not found</h1>
|
||||||
<section>
|
<section>
|
||||||
<p class="mb-2 mt-5 sm:mb-3 sm:mt-6 sm:px-5 md:px-6">
|
<p class="mb-2 mt-5 sm:mb-3 sm:mt-6 sm:px-5 md:px-6">
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ import EnhancedTooltips from "@components/EnhancedTooltips.astro";
|
||||||
|
|
||||||
<BaseLayout pageTitle="About me">
|
<BaseLayout pageTitle="About me">
|
||||||
<meta slot="head" property="og:description" content="About Bad Manners." />
|
<meta slot="head" property="og:description" content="About Bad Manners." />
|
||||||
<article class="h-card" aria-labelledby="title-about-me" transition:name="content">
|
<article class="h-card" aria-labelledby="title-about-me">
|
||||||
<h1 id="title-about-me" class="text-2xl sm:text-3xl">About me</h1>
|
<h1 id="title-about-me" class="text-2xl sm:text-3xl">About me</h1>
|
||||||
<section>
|
<section>
|
||||||
<p class="mb-4 mt-5 text-justify indent-6 sm:mb-3 sm:mt-6 sm:px-5 sm:indent-12">
|
<p class="mb-4 mt-5 text-justify indent-6 sm:mb-3 sm:mt-6 sm:px-5 sm:indent-12">
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,7 @@
|
||||||
---
|
---
|
||||||
import { readFile } from "node:fs/promises";
|
import { readFile } from "node:fs/promises";
|
||||||
import BaseLayout from "@layouts/BaseLayout.astro";
|
import BaseLayout from "@layouts/BaseLayout.astro";
|
||||||
import {
|
import { IconEnvelope, IconBriefcase, IconKey, IconLink, IconCommentDots, IconSSH } from "@components/icons";
|
||||||
IconEnvelope,
|
|
||||||
IconBriefcase,
|
|
||||||
IconKey,
|
|
||||||
IconLink,
|
|
||||||
IconCommentDots,
|
|
||||||
IconSSH,
|
|
||||||
IconSquareRSS,
|
|
||||||
} from "@components/icons";
|
|
||||||
import {
|
import {
|
||||||
IconBluesky,
|
IconBluesky,
|
||||||
IconCodeberg,
|
IconCodeberg,
|
||||||
|
|
@ -62,7 +54,7 @@ const [gpgKey, sshKey] = await Promise.all([
|
||||||
title="Gallery feed"
|
title="Gallery feed"
|
||||||
/>
|
/>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
<article id="homepage" class="h-card" aria-label="Homepage of Bad Manners" transition:name="content">
|
<article id="homepage" class="h-card" aria-label="Homepage of Bad Manners">
|
||||||
<h1 id="title-home" class="pb-4 text-3xl tracking-tight sm:text-5xl">
|
<h1 id="title-home" class="pb-4 text-3xl tracking-tight sm:text-5xl">
|
||||||
Hi, I'm <b class="p-name font-medium">Bad Manners</b>!
|
Hi, I'm <b class="p-name font-medium">Bad Manners</b>!
|
||||||
</h1>
|
</h1>
|
||||||
|
|
@ -81,25 +73,21 @@ const [gpgKey, sshKey] = await Promise.all([
|
||||||
class="grid grid-cols-3 gap-x-4 px-4 pt-8 sm:grid-cols-4 sm:px-20 lg:grid-cols-5"
|
class="grid grid-cols-3 gap-x-4 px-4 pt-8 sm:grid-cols-4 sm:px-20 lg:grid-cols-5"
|
||||||
aria-label="Links"
|
aria-label="Links"
|
||||||
>
|
>
|
||||||
{
|
<li>
|
||||||
Astro.site ? (
|
<a
|
||||||
<li>
|
id="permalink"
|
||||||
<a
|
class="u-url contact-link group"
|
||||||
id="permalink"
|
href={Astro.site!!}
|
||||||
class="u-url contact-link group"
|
aria-label="Permalink"
|
||||||
href={Astro.site}
|
title="Permalink"
|
||||||
aria-label="Permalink"
|
data-tooltip
|
||||||
title="Permalink"
|
x-data={JSON.stringify({ clipboard: Astro.site!!.toString(), tooltip: "URL copied to clipboard!" })}
|
||||||
data-tooltip
|
@click.prevent="navigator.clipboard.writeText(clipboard).catch(()=>{}); $dispatch('tippyTooltip', { target: $el, content: tooltip })"
|
||||||
x-data={`{ clipboard: ${JSON.stringify(Astro.site.toString())}, tooltip: 'URL copied to clipboard!' }`}
|
>
|
||||||
@click.prevent="navigator.clipboard.writeText(clipboard).catch(()=>{}); $dispatch('tippyTooltip', { target: $el, content: tooltip })"
|
<IconLink height="1.75rem" width="1.75rem" class="contact-icon" />
|
||||||
>
|
<p class="sr-only select-none">https://badmanners.xyz</p>
|
||||||
<IconLink height="1.75rem" width="1.75rem" class="contact-icon" />
|
</a>
|
||||||
<p class="sr-only select-none">https://badmanners.xyz</p>
|
</li>
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
) : null
|
|
||||||
}
|
|
||||||
<li>
|
<li>
|
||||||
<a
|
<a
|
||||||
id="gallery"
|
id="gallery"
|
||||||
|
|
@ -109,27 +97,13 @@ const [gpgKey, sshKey] = await Promise.all([
|
||||||
aria-label="Main gallery"
|
aria-label="Main gallery"
|
||||||
title="Main gallery"
|
title="Main gallery"
|
||||||
data-tooltip
|
data-tooltip
|
||||||
data-age-restricted
|
x-data={JSON.stringify({ href: "https://gallery.badmanners.xyz", suffix: "?ageVerified=true" })}
|
||||||
|
x-bind:href="ageVerified ? href + suffix : href"
|
||||||
>
|
>
|
||||||
<IconBriefcase height="1.75rem" width="1.75rem" class="contact-icon" />
|
<IconBriefcase height="1.75rem" width="1.75rem" class="contact-icon" />
|
||||||
<p class="sr-only select-none">Gallery on https://gallery.badmanners.xyz</p>
|
<p class="sr-only select-none">Gallery on https://gallery.badmanners.xyz</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a
|
|
||||||
id="gallery-feed"
|
|
||||||
class="u-url contact-link group"
|
|
||||||
type="application/rss+xml"
|
|
||||||
href="https://gallery.badmanners.xyz/feed.xml"
|
|
||||||
rel="alternate"
|
|
||||||
aria-label="Gallery feed"
|
|
||||||
title="Gallery feed"
|
|
||||||
data-tooltip
|
|
||||||
>
|
|
||||||
<IconSquareRSS height="1.75rem" width="1.75rem" class="contact-icon" />
|
|
||||||
<p class="sr-only select-none">Gallery feed</p>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<a
|
<a
|
||||||
id="pronouns"
|
id="pronouns"
|
||||||
|
|
@ -155,7 +129,7 @@ const [gpgKey, sshKey] = await Promise.all([
|
||||||
aria-label="E-mail"
|
aria-label="E-mail"
|
||||||
title="E-mail"
|
title="E-mail"
|
||||||
data-tooltip
|
data-tooltip
|
||||||
x-data="{ clipboard: 'me@badmanners.xyz', tooltip: 'E-mail address copied to clipboard!' }"
|
x-data={JSON.stringify({ clipboard: "me@badmanners.xyz", tooltip: "E-mail address copied to clipboard!" })}
|
||||||
@click.prevent="navigator.clipboard.writeText(clipboard).catch(()=>{}); $dispatch('tippyTooltip', { target: $el, content: tooltip })"
|
@click.prevent="navigator.clipboard.writeText(clipboard).catch(()=>{}); $dispatch('tippyTooltip', { target: $el, content: tooltip })"
|
||||||
>
|
>
|
||||||
<IconEnvelope height="1.75rem" width="1.75rem" class="contact-icon" />
|
<IconEnvelope height="1.75rem" width="1.75rem" class="contact-icon" />
|
||||||
|
|
@ -197,7 +171,7 @@ const [gpgKey, sshKey] = await Promise.all([
|
||||||
aria-label="Discord"
|
aria-label="Discord"
|
||||||
title="Discord"
|
title="Discord"
|
||||||
data-tooltip
|
data-tooltip
|
||||||
x-data="{ clipboard: 'badmanners', tooltip: 'Discord username copied to clipboard!' }"
|
x-data={JSON.stringify({ clipboard: "badmanners", tooltip: "Discord username copied to clipboard!" })}
|
||||||
@click.prevent="navigator.clipboard.writeText(clipboard).catch(()=>{}); $dispatch('tippyTooltip', { target: $el, content: tooltip })"
|
@click.prevent="navigator.clipboard.writeText(clipboard).catch(()=>{}); $dispatch('tippyTooltip', { target: $el, content: tooltip })"
|
||||||
>
|
>
|
||||||
<IconDiscord height="1.75rem" width="1.75rem" class="contact-icon" />
|
<IconDiscord height="1.75rem" width="1.75rem" class="contact-icon" />
|
||||||
|
|
@ -283,7 +257,10 @@ const [gpgKey, sshKey] = await Promise.all([
|
||||||
aria-label="Google"
|
aria-label="Google"
|
||||||
title="Google"
|
title="Google"
|
||||||
data-tooltip
|
data-tooltip
|
||||||
x-data="{ clipboard: 'google@badmanners.xyz', tooltip: 'Google address copied to clipboard!' }"
|
x-data={JSON.stringify({
|
||||||
|
clipboard: "google@badmanners.xyz",
|
||||||
|
tooltip: "Google address copied to clipboard!",
|
||||||
|
})}
|
||||||
@click.prevent="navigator.clipboard.writeText(clipboard).catch(()=>{}); $dispatch('tippyTooltip', { target: $el, content: tooltip })"
|
@click.prevent="navigator.clipboard.writeText(clipboard).catch(()=>{}); $dispatch('tippyTooltip', { target: $el, content: tooltip })"
|
||||||
>
|
>
|
||||||
<IconGoogle height="1.75rem" width="1.75rem" class="contact-icon" />
|
<IconGoogle height="1.75rem" width="1.75rem" class="contact-icon" />
|
||||||
|
|
@ -299,7 +276,7 @@ const [gpgKey, sshKey] = await Promise.all([
|
||||||
aria-label="GPG public key"
|
aria-label="GPG public key"
|
||||||
title="GPG public key"
|
title="GPG public key"
|
||||||
data-tooltip
|
data-tooltip
|
||||||
x-data={`{ clipboard: ${JSON.stringify(gpgKey)}, tooltip: 'GPG key copied to clipboard!' }`}
|
x-data={JSON.stringify({ clipboard: gpgKey, tooltip: "GPG key copied to clipboard!" })}
|
||||||
@click.prevent="navigator.clipboard.writeText(clipboard).catch(()=>{}); $dispatch('tippyTooltip', { target: $el, content: tooltip })"
|
@click.prevent="navigator.clipboard.writeText(clipboard).catch(()=>{}); $dispatch('tippyTooltip', { target: $el, content: tooltip })"
|
||||||
>
|
>
|
||||||
<IconKey height="1.75rem" width="1.75rem" class="contact-icon" />
|
<IconKey height="1.75rem" width="1.75rem" class="contact-icon" />
|
||||||
|
|
@ -469,7 +446,7 @@ const [gpgKey, sshKey] = await Promise.all([
|
||||||
aria-label="SSH public key"
|
aria-label="SSH public key"
|
||||||
title="SSH public key"
|
title="SSH public key"
|
||||||
data-tooltip
|
data-tooltip
|
||||||
x-data={`{ clipboard: ${JSON.stringify(sshKey)}, tooltip: 'SSH key address copied to clipboard!' }`}
|
x-data={JSON.stringify({ clipboard: sshKey, tooltip: "SSH key address copied to clipboard!" })}
|
||||||
@click.prevent="navigator.clipboard.writeText(clipboard).catch(()=>{}); $dispatch('tippyTooltip', { target: $el, content: tooltip })"
|
@click.prevent="navigator.clipboard.writeText(clipboard).catch(()=>{}); $dispatch('tippyTooltip', { target: $el, content: tooltip })"
|
||||||
>
|
>
|
||||||
<IconSSH height="1.75rem" width="1.75rem" class="contact-icon" />
|
<IconSSH height="1.75rem" width="1.75rem" class="contact-icon" />
|
||||||
|
|
@ -565,13 +542,6 @@ const [gpgKey, sshKey] = await Promise.all([
|
||||||
</article>
|
</article>
|
||||||
</BaseLayout>
|
</BaseLayout>
|
||||||
|
|
||||||
<style>
|
|
||||||
ul#links > li {
|
|
||||||
min-width: 6rem;
|
|
||||||
flex: 1 1 0%;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<EnhancedTooltips />
|
<EnhancedTooltips />
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
@ -605,6 +575,5 @@ const [gpgKey, sshKey] = await Promise.all([
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
document.addEventListener("astro:page-load", handleTooltipEvent);
|
|
||||||
handleTooltipEvent();
|
handleTooltipEvent();
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ import EnhancedTooltips from "@components/EnhancedTooltips.astro";
|
||||||
|
|
||||||
<BaseLayout pageTitle="Sam Brendan">
|
<BaseLayout pageTitle="Sam Brendan">
|
||||||
<meta slot="head" property="og:description" content="Mimic x maned wolf hybrid." />
|
<meta slot="head" property="og:description" content="Mimic x maned wolf hybrid." />
|
||||||
<article class="h-card" aria-labelledby="title-sam-brendan" transition:name="content">
|
<article class="h-card" aria-labelledby="title-sam-brendan">
|
||||||
<h1 id="title-sam-brendan" class="p-name text-2xl sm:text-3xl">Sam Brendan</h1>
|
<h1 id="title-sam-brendan" class="p-name text-2xl sm:text-3xl">Sam Brendan</h1>
|
||||||
<section>
|
<section>
|
||||||
<p class="my-4 text-justify sm:my-6 sm:px-5">
|
<p class="my-4 text-justify sm:my-6 sm:px-5">
|
||||||
|
|
@ -25,7 +25,6 @@ import EnhancedTooltips from "@components/EnhancedTooltips.astro";
|
||||||
<a
|
<a
|
||||||
class="group mx-auto mb-1 block w-max max-w-full pb-0 sm:mb-3"
|
class="group mx-auto mb-1 block w-max max-w-full pb-0 sm:mb-3"
|
||||||
href="https://booru.badmanners.xyz/index.php?q=post/view/1"
|
href="https://booru.badmanners.xyz/index.php?q=post/view/1"
|
||||||
data-age-restricted
|
|
||||||
target="_blank"
|
target="_blank"
|
||||||
>
|
>
|
||||||
<Image
|
<Image
|
||||||
|
|
@ -79,7 +78,6 @@ import EnhancedTooltips from "@components/EnhancedTooltips.astro";
|
||||||
<a
|
<a
|
||||||
class="group mx-auto mb-1 block w-max max-w-full pb-0 sm:mb-3"
|
class="group mx-auto mb-1 block w-max max-w-full pb-0 sm:mb-3"
|
||||||
href="https://booru.badmanners.xyz/index.php?q=post/view/2"
|
href="https://booru.badmanners.xyz/index.php?q=post/view/2"
|
||||||
data-age-restricted
|
|
||||||
target="_blank"
|
target="_blank"
|
||||||
>
|
>
|
||||||
<Image
|
<Image
|
||||||
|
|
@ -140,10 +138,10 @@ import EnhancedTooltips from "@components/EnhancedTooltips.astro";
|
||||||
Mimicking voices or simple sounds, and speak without moving his mouth.
|
Mimicking voices or simple sounds, and speak without moving his mouth.
|
||||||
</li>
|
</li>
|
||||||
<li class="mx-7 mb-1 list-disc indent-0 sm:mx-10">
|
<li class="mx-7 mb-1 list-disc indent-0 sm:mx-10">
|
||||||
Materializing adhesive facial accessories out of thin air into his paws.
|
Materializing facial accessories (such as stickers or googly eyes) out of thin air.
|
||||||
</li>
|
</li>
|
||||||
<li class="mx-7 mb-1 list-disc indent-0 sm:mx-10">
|
<li class="mx-7 mb-1 list-disc indent-0 sm:mx-10">
|
||||||
Controlling the movable parts of his mimic half (hinges, latches, handle), like any other limb. Even when
|
Controlling the movable parts of his mimic half (hinges, latches, handle) like any other limb. Even when
|
||||||
unconscious, he's able to keep his case tightly shut.
|
unconscious, he's able to keep his case tightly shut.
|
||||||
</li>
|
</li>
|
||||||
<li class="mx-7 mb-1 list-disc indent-0 sm:mx-10">
|
<li class="mx-7 mb-1 list-disc indent-0 sm:mx-10">
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ import { TOS_COMMISSION_STATUS, TOS_UPDATED_AT } from "@data/tos";
|
||||||
<meta property="og:description" content="My Terms of Service for story commissions." />
|
<meta property="og:description" content="My Terms of Service for story commissions." />
|
||||||
<link rel="alternate" type="application/rss+xml" href={new URL("/feed.xml", Astro.site)} title="RSS feed" />
|
<link rel="alternate" type="application/rss+xml" href={new URL("/feed.xml", Astro.site)} title="RSS feed" />
|
||||||
</Fragment>
|
</Fragment>
|
||||||
<article aria-labelledby="title-tos" transition:name="content">
|
<article aria-labelledby="title-tos">
|
||||||
<h1 id="title-tos" class="mb-4 text-2xl sm:mb-5 sm:text-3xl">Terms of Service for story commissions</h1>
|
<h1 id="title-tos" class="mb-4 text-2xl sm:mb-5 sm:text-3xl">Terms of Service for story commissions</h1>
|
||||||
<section aria-label="Commission status">
|
<section aria-label="Commission status">
|
||||||
<div class="my-2 flex items-center justify-end">
|
<div class="my-2 flex items-center justify-end">
|
||||||
|
|
@ -80,7 +80,7 @@ import { TOS_COMMISSION_STATUS, TOS_UPDATED_AT } from "@data/tos";
|
||||||
words <em>may</em> be requested. In such a case, the final payment will have that amount discounted.
|
words <em>may</em> be requested. In such a case, the final payment will have that amount discounted.
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
<section id="subjects" aria-labelledby="title-commission-subjects">
|
<section id="commission-subjects" aria-labelledby="title-commission-subjects">
|
||||||
<h2 id="title-commission-subjects" class="my-4 text-lg sm:my-6 sm:text-2xl">Commission subjects</h2>
|
<h2 id="title-commission-subjects" class="my-4 text-lg sm:my-6 sm:text-2xl">Commission subjects</h2>
|
||||||
<ul class="mb-8 text-justify text-base sm:px-3 sm:text-lg md:px-6">
|
<ul class="mb-8 text-justify text-base sm:px-3 sm:text-lg md:px-6">
|
||||||
<li class="mx-6 mb-1 list-disc sm:mx-8">
|
<li class="mx-6 mb-1 list-disc sm:mx-8">
|
||||||
|
|
@ -99,7 +99,7 @@ import { TOS_COMMISSION_STATUS, TOS_UPDATED_AT } from "@data/tos";
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</section>
|
</section>
|
||||||
<section aria-labelledby="title-additional-information">
|
<section id="additional-information" aria-labelledby="title-additional-information">
|
||||||
<h2 id="title-additional-information" class="my-4 text-lg sm:my-6 sm:text-2xl">Additional information</h2>
|
<h2 id="title-additional-information" class="my-4 text-lg sm:my-6 sm:text-2xl">Additional information</h2>
|
||||||
<ul class="mb-6 text-justify text-base sm:px-3 sm:text-lg md:px-6">
|
<ul class="mb-6 text-justify text-base sm:px-3 sm:text-lg md:px-6">
|
||||||
<li class="mx-6 mb-1 list-disc sm:mx-8">
|
<li class="mx-6 mb-1 list-disc sm:mx-8">
|
||||||
|
|
@ -133,7 +133,7 @@ import { TOS_COMMISSION_STATUS, TOS_UPDATED_AT } from "@data/tos";
|
||||||
If you have any doubts, or are considering getting a commission from me,
|
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"
|
<a href="/" class="text-link underline transition-colors motion-reduce:transition-none"
|
||||||
>please reach out through my socials</a
|
>please reach out through my socials</a
|
||||||
>! Preferably through Discord or Telegram, where I'm more active.
|
>! Preferably through Discord, where I'm more active.
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -30,20 +30,23 @@ import { SUBSCRIBESTAR_ENABLED } from "@data/subscribestar";
|
||||||
title="Gallery feed"
|
title="Gallery feed"
|
||||||
/>
|
/>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
<article aria-labelledby="title-my-work" class="sm:px-5 md:px-6" transition:name="content">
|
<article aria-labelledby="title-my-work" class="sm:px-5 md:px-6">
|
||||||
<h1 id="title-my-work" class="text-2xl sm:text-3xl">My work</h1>
|
<h1 id="title-my-work" class="text-2xl sm:text-3xl">My work</h1>
|
||||||
<section>
|
<section>
|
||||||
<p class="mb-4 mt-5 text-justify indent-6 sm:mb-3 sm:mt-6 sm:px-5 sm:indent-12">
|
<p class="mb-4 mt-5 text-justify indent-6 sm:mb-3 sm:mt-6 sm:px-5 sm:indent-12">
|
||||||
I've been a lurker in the furry vore community for a long time before I decided to start writing
|
I've been a lurker in the furry vore community for a long time before I decided to start writing
|
||||||
<a
|
<a
|
||||||
class="text-link transition-colors motion-reduce:transition-none"
|
class="text-link transition-colors motion-reduce:transition-none"
|
||||||
href="https://gallery.badmanners.xyz/stories/1"
|
href="https://gallery.badmanners.xyz/stories"
|
||||||
data-age-restricted><span class="underline">safe vore stories</span></a
|
x-data={JSON.stringify({ href: "https://gallery.badmanners.xyz/stories", suffix: "?ageVerified=true" })}
|
||||||
|
x-bind:href="ageVerified ? href + suffix : href"><span class="underline">safe vore stories</span></a
|
||||||
>. Since there's a lot in furry endosoma that I enjoy, my stories tend to
|
>. Since there's a lot in furry endosoma that I enjoy, my stories tend to
|
||||||
<a
|
<a
|
||||||
class="text-link transition-colors motion-reduce:transition-none"
|
class="text-link transition-colors motion-reduce:transition-none"
|
||||||
href="https://gallery.badmanners.xyz/tags"
|
href="https://gallery.badmanners.xyz/tags"
|
||||||
data-age-restricted><span class="underline">have all sorts of themes and scenarios</span></a
|
x-data={JSON.stringify({ href: "https://gallery.badmanners.xyz/tags", suffix: "?ageVerified=true" })}
|
||||||
|
x-bind:href="ageVerified ? href + suffix : href"
|
||||||
|
><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
|
>, 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.
|
vore, chances are that you'll find something in my gallery that is right up your alley.
|
||||||
</p>
|
</p>
|
||||||
|
|
@ -52,7 +55,11 @@ import { SUBSCRIBESTAR_ENABLED } from "@data/subscribestar";
|
||||||
<a
|
<a
|
||||||
class="text-link transition-colors motion-reduce:transition-none"
|
class="text-link transition-colors motion-reduce:transition-none"
|
||||||
href="https://gallery.badmanners.xyz/games/crossing-over"
|
href="https://gallery.badmanners.xyz/games/crossing-over"
|
||||||
data-age-restricted><span class="underline">"Crossing Over"</span></a
|
x-data={JSON.stringify({
|
||||||
|
href: "https://gallery.badmanners.xyz/games/crossing-over/",
|
||||||
|
suffix: "?ageVerified=true",
|
||||||
|
})}
|
||||||
|
x-bind:href="ageVerified ? href + suffix : href"><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,
|
>, 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! Check it out if you have an hour to spare and the subject matters interest you.
|
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>
|
||||||
|
|
@ -73,7 +80,8 @@ import { SUBSCRIBESTAR_ENABLED } from "@data/subscribestar";
|
||||||
<a
|
<a
|
||||||
class="u-url text-link mx-1 transition-colors motion-reduce:transition-none"
|
class="u-url text-link mx-1 transition-colors motion-reduce:transition-none"
|
||||||
href="https://gallery.badmanners.xyz"
|
href="https://gallery.badmanners.xyz"
|
||||||
data-age-restricted
|
x-data={JSON.stringify({ href: "https://gallery.badmanners.xyz", suffix: "?ageVerified=true" })}
|
||||||
|
x-bind:href="ageVerified ? href + suffix : href"
|
||||||
>
|
>
|
||||||
<IconBriefcase height="1.75rem" width="1.75rem" class="mr-1 inline" />
|
<IconBriefcase height="1.75rem" width="1.75rem" class="mr-1 inline" />
|
||||||
<span class="underline">gallery.badmanners.xyz</span>
|
<span class="underline">gallery.badmanners.xyz</span>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue