More websites, better licenses with TOML, more minute improvements

This commit is contained in:
Bad Manners 2024-08-26 00:16:48 -03:00
parent 5559cea720
commit 92123a305d
26 changed files with 414 additions and 138 deletions

View file

@ -21,12 +21,13 @@ RedirectMatch 301 ^/@/(ink[_-]?bunny|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 ^/@/keyoxide\b https://keyoxide.org/aspe%3Akeyoxide.org%3AUWYBVFCBFXTVUF2U6FS6AYJHLU
RedirectMatch 301 ^/@/keyoxide\b https://keyoxide.org/aspe:keyoxide.org:UWYBVFCBFXTVUF2U6FS6AYJHLU
RedirectMatch 301 ^/@/ko[._-]?fi\b https://ko-fi.com/badmanners
RedirectMatch 301 ^/@/(mastodon|meow[._-]?social|gulp[._-]?cafe)\b https://meow.social/@BadManners
RedirectMatch 301 ^/@/neo[_-]?cities\b https://badmanners.neocities.org
RedirectMatch 301 ^/@/picarto\b https://www.picarto.tv/BadManners
RedirectMatch 301 ^/@/pillow[_-]?fort\b https://www.pillowfort.social/BadManners
RedirectMatch 301 ^/@/pronouns?\b https://pronouns.cc/@BadManners
RedirectMatch 301 ^/@/redd\.?it\b https://www.reddit.com/user/BadManners_
RedirectMatch 301 ^/@/signal\b https://signal.me/#eu/ytt_rk0fFmAB2JAW-x2PbUiJyc_H3kYmfL_Pq4QNh5QIDsiFtjdFHaqFRs1D36tB
RedirectMatch 301 ^/@/(so[_-]?furry|sf)\b https://bad-manners.sofurry.com

View file

@ -1,26 +1,31 @@
---
import { Image } from "astro:assets";
import BaseLayout from "../layouts/BaseLayout.astro";
import IconArrowUpRightFromSquare from "../components/icons/IconArrowUpRightFromSquare.astro";
import ImageSamStickerJuicebox from "../assets/images/sam_sticker_juicebox.webp";
import { IconArrowUpRightFromSquare } from "../components/icons";
import { ImageSamStickerJuicebox } from "../assets/images";
---
<BaseLayout pageTitle="About me">
<meta slot="head-description" property="og:description" content="About Bad Manners." />
<article class="h-card" aria-labelledby="title-about-me">
<h1 id="title-about-me" class="text-2xl sm:text-3xl">About me</h1>
<section id="section-bad-manners">
<section>
<p class="mb-4 mt-5 text-justify indent-6 sm:mb-3 sm:mt-6 sm:px-5 sm:indent-12">
You can call me <b class="p-name font-semibold">Bad Manners</b>, <b class="p-nickname font-semibold">Manners</b
>, <b class="p-nickname font-semibold"><abbr>BM</abbr></b>, <b class="p-nickname font-semibold">Bad</b>, <b
class="p-nickname font-semibold">Briefcase</b
>... many choices to pick from! My pronouns are <span class="p-pronoun font-medium">he/him</span>. The term "bad
manners" comes from gaming, where it's used to refer to acting in a purposefully disrespectful and taunting
manner towards other players, but I also chose this moniker as it has plenty of personal meanings attached to
it.
>... many choices to pick from! My pronouns are <span
class="p-pronoun font-medium underline decoration-current decoration-dotted"
data-tippy-content="he/him/his/his/himself">he/him</span
> or <span
class="p-pronoun font-medium underline decoration-current decoration-dotted"
data-tippy-content="they/them/their/theirs/themself">they/them</span
>. The term "bad manners" comes from gaming, referencing when someone acts in a purposefully disrespectful and
taunting manner towards other players &ndash; and I chose this moniker as it has plenty of personal meanings
attached to it.
</p>
</section>
<section id="section-sam-brendan" class="h-card">
<section class="h-card">
<p class="my-4 text-justify indent-6 sm:mb-3 sm:px-5 sm:indent-12">
You can also call me <b class="p-first-name font-semibold">Sam</b>, which is my <span class="p-category"
>fursona</span
@ -45,7 +50,7 @@ import ImageSamStickerJuicebox from "../assets/images/sam_sticker_juicebox.webp"
A sticker of Sam by
<a
class="h-card u-url text-link transition-colors motion-reduce:transition-none"
href="https://olivecow.carrd.co/"
href="https://olivecow.carrd.co"
rel="nofollow"
target="_blank"
>
@ -57,3 +62,20 @@ import ImageSamStickerJuicebox from "../assets/images/sam_sticker_juicebox.webp"
</section>
</article>
</BaseLayout>
<script>
import { ENABLE_VIEW_TRANSITIONS } from "astro:env/client";
import tippy from "tippy.js";
import "tippy.js/dist/tippy.css";
const initTooltips = () => {
tippy("[data-tippy-content]", {
theme: "bm",
});
};
if (ENABLE_VIEW_TRANSITIONS) {
document.addEventListener("astro:page-load", initTooltips);
} else {
initTooltips();
}
</script>

View file

@ -8,14 +8,14 @@ export const GET: APIRoute = ({ site }) => {
title: "Bad Manners",
description: "Bad Manners status updates",
site: site!,
items: TOS_FEED.map(({ status, updatedAt }) => ({
items: TOS_FEED.map(({ status, updatedAt }, i) => ({
title: {
CLOSED: "Story commissions are closed.",
OPEN: "Story commissions are open!",
SEMI_OPEN: "Story commissions are semi-open, and I may accept them less frequently.",
PRIVATE: "Story commissions are private; they are only open to select commissioners.",
}[status],
link: "https://badmanners.xyz/terms_of_service",
link: i === 0 ? "https://badmanners.xyz/terms_of_service" : undefined,
pubDate: subMinutes(dateSet(updatedAt, { hours: 12, minutes: 0, seconds: 0 }), updatedAt.getTimezoneOffset()),
})),
});

View file

@ -1,43 +1,44 @@
---
import BaseLayout from "../layouts/BaseLayout.astro";
import IconEnvelope from "../components/icons/IconEnvelope.astro";
import IconBriefcase from "../components/icons/IconBriefcase.astro";
import IconBluesky from "../components/icons/brands/IconBluesky.astro";
import IconCodeberg from "../components/icons/brands/IconCodeberg.astro";
import IconCohost from "../components/icons/brands/IconCohost.astro";
import IconDiscord from "../components/icons/brands/IconDiscord.astro";
import IconEkasPortal from "../components/icons/brands/IconEkasPortal.astro";
import IconFurAffinity from "../components/icons/brands/IconFurAffinity.astro";
import IconGitHub from "../components/icons/brands/IconGitHub.astro";
import IconGitLab from "../components/icons/brands/IconGitLab.astro";
import IconGoogle from "../components/icons/brands/IconGoogle.astro";
import IconInkbunny from "../components/icons/brands/IconInkbunny.astro";
import IconItaku from "../components/icons/brands/IconItaku.astro";
import IconItchIO from "../components/icons/brands/IconItchIO.astro";
import IconKeybase from "../components/icons/brands/IconKeybase.astro";
import IconKeyoxide from "../components/icons/brands/IconKeyoxide.astro";
import IconKofi from "../components/icons/brands/IconKofi.astro";
import IconMastodon from "../components/icons/brands/IconMastodon.astro";
import IconNeocities from "../components/icons/brands/IconNeocities.astro";
import IconPicarto from "../components/icons/brands/IconPicarto.astro";
import IconReddit from "../components/icons/brands/IconReddit.astro";
import IconSignal from "../components/icons/brands/IconSignal.astro";
import IconSoFurry from "../components/icons/brands/IconSoFurry.astro";
import IconSSH from "../components/icons/IconSSH.astro";
import IconSteam from "../components/icons/brands/IconSteam.astro";
import IconSubscribeStar from "../components/icons/brands/IconSubscribeStar.astro";
import IconTelegram from "../components/icons/brands/IconTelegram.astro";
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 { IconEnvelope, IconBriefcase, IconLink, IconCommentDots, IconSSH } from "../components/icons";
import {
IconBluesky,
IconCodeberg,
IconCohost,
IconDiscord,
IconEkasPortal,
IconFurAffinity,
IconGithub,
IconGitlab,
IconGoogle,
IconInkbunny,
IconItaku,
IconItchIO,
IconKeybase,
IconKeyoxide,
IconKofi,
IconMastodon,
IconNeocities,
IconPicarto,
IconReddit,
IconSignal,
IconSoFurry,
IconSteam,
IconSubscribeStar,
IconTelegram,
IconTumblr,
IconTwitch,
IconWeasyl,
IconX,
IconYouTube,
} from "../components/icons/brands";
---
<BaseLayout>
<meta
slot="head-description"
property="og:description"
content="Safe vore enthusiast, mimic hybrid, and occasional writer."
content="Safe vore enthusiast, mimic hybrid furry, and occasional writer."
/>
<article class="h-card" aria-label="Homepage of Bad Manners">
<h1 id="title-home" class="pb-4 text-3xl tracking-tight sm:text-5xl">
@ -47,42 +48,35 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
<img
loading="eager"
src="/logo.webp"
alt="Logo for Bad Manners"
alt="A pixelated metal briefcase over a background with a green gradient."
class="u-logo mx-auto my-4 h-screen max-h-48 rounded-full transition-transform hover:scale-110 motion-reduce:transition-none motion-reduce:hover:scale-100 sm:max-h-72"
/>
<p class="p-note mt-6 sm:px-5 md:px-6">
I'm a safe vore enthusiast, a furry programmer, and occasionally a writer.
</p>
{
Astro.site ? (
<a id="website" href={Astro.site} class="u-url sr-only" aria-label="Permalink">
{Astro.site}
</a>
) : null
}
<p class="p-note mt-6 sm:px-5 md:px-6">I'm a safe vore enthusiast, a furry, and occasional writer.</p>
<ul
id="links"
class="grid grid-cols-3 gap-x-4 gap-y-5 px-4 pt-8 sm:grid-cols-4 sm:px-20 md:px-32"
aria-label="Links"
>
<li>
<a
id="e-mail"
class="u-email text-link group block w-full transition-colors motion-reduce:transition-none"
href="mailto:me@badmanners.xyz"
rel="me"
aria-label="me@badmanners.xyz"
data-clipboard="me@badmanners.xyz"
data-noun="E-mail address"
>
<IconEnvelope
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">E-mail address</p>
</a>
</li>
{
Astro.site ? (
<li>
<a
id="permalink"
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
href={Astro.site}
aria-label="Permalink"
data-clipboard={Astro.site}
data-noun="URL"
>
<IconLink
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"
/>
</a>
</li>
) : null
}
<li>
<a
id="gallery"
@ -99,6 +93,42 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
/>
</a>
</li>
<li>
<a
id="pronouns"
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
href="https://pronouns.cc/@BadManners"
rel="me"
aria-label="Pronouns"
>
<IconCommentDots
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="p-nickname sr-only">@BadManners on pronouns.cc</p>
<p class="p-pronoun sr-only">he/him/his/his/himself</p>
<p class="p-pronoun sr-only">they/them/their/theirs/themself</p>
</a>
</li>
<li>
<a
id="e-mail"
class="u-email text-link group block w-full transition-colors motion-reduce:transition-none"
href="mailto:me@badmanners.xyz"
rel="me"
aria-label="E-mail"
data-clipboard="me@badmanners.xyz"
data-noun="E-mail address"
>
<IconEnvelope
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">E-mail address</p>
</a>
</li>
<li>
<a
id="bluesky"
@ -204,7 +234,7 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
rel="me"
aria-label="GitHub"
>
<IconGitHub
<IconGithub
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"
@ -220,7 +250,7 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
rel="me"
aria-label="GitLab"
>
<IconGitLab
<IconGitlab
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"
@ -234,7 +264,7 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
class="u-email text-link group block w-full transition-colors motion-reduce:transition-none"
href="mailto:badmanners.vore@gmail.com"
rel="me"
aria-label="badmanners.vore@gmail.com"
aria-label="Gmail"
data-clipboard="badmanners.vore@gmail.com"
data-noun="Gmail address"
>
@ -502,6 +532,22 @@ import IconYouTube from "../components/icons/brands/IconYouTube.astro";
<p class="p-nickname sr-only">@bad_manners on Telegram</p>
</a>
</li>
<li>
<a
id="tumblr"
class="u-url text-link group block w-full transition-colors motion-reduce:transition-none"
href="https://www.tumblr.com/badmannersxyz"
rel="me"
aria-label="Tumblr"
>
<IconTumblr
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="p-nickname sr-only">badmannersxyz on Tumblr</p>
</a>
</li>
<li>
<a
id="twitch"

View file

@ -1,9 +1,8 @@
---
import { Image } from "astro:assets";
import BaseLayout from "../layouts/BaseLayout.astro";
import IconArrowUpRightFromSquare from "../components/icons/IconArrowUpRightFromSquare.astro";
import ImageSamAllStickers from "../assets/images/sam_all_stickers.webp";
import ImageSamRefsheet from "../assets/images/sam_refsheet.webp";
import { IconArrowUpRightFromSquare } from "../components/icons";
import { ImageSamAllStickers, ImageSamRefsheet } from "../assets/images";
---
<BaseLayout pageTitle="Sam Brendan">
@ -94,7 +93,7 @@ import ImageSamRefsheet from "../assets/images/sam_refsheet.webp";
A set of stickers featuring Sam Brendan, by
<a
class="h-card u-url text-link transition-colors motion-reduce:transition-none"
href="https://olivecow.carrd.co/"
href="https://olivecow.carrd.co"
rel="nofollow"
target="_blank"
>

View file

@ -1,6 +1,6 @@
---
import BaseLayout from "../layouts/BaseLayout.astro";
import IconSquareRSS from "../components/icons/IconSquareRSS.astro";
import { IconSquareRSS } from "../components/icons";
import { TOS_COMMISSION_STATUS, TOS_UPDATED_AT } from "../data/tos";
---
@ -29,23 +29,23 @@ import { TOS_COMMISSION_STATUS, TOS_UPDATED_AT } from "../data/tos";
</div>
{
TOS_COMMISSION_STATUS == "CLOSED" ? (
<p class="mb-4 text-2xl font-medium uppercase sm:mb-8 sm:px-5 md:px-6">
<p id="status" class="mb-4 text-2xl font-medium uppercase sm:mb-8 sm:px-5 md:px-6">
Commissions are
<span class="text-red-600 dark:text-red-500">closed</span>.
</p>
) : TOS_COMMISSION_STATUS == "OPEN" ? (
<p class="mb-4 text-2xl font-medium uppercase sm:mb-8 sm:px-5 md:px-6">
<p id="status" class="mb-4 text-2xl font-medium uppercase sm:mb-8 sm:px-5 md:px-6">
Commissions are <span class="text-bm-500 dark:text-bm-400">open</span>.
</p>
) : TOS_COMMISSION_STATUS == "SEMI_OPEN" ? (
<p class="mb-4 text-2xl font-medium sm:mb-8 sm:px-5 md:px-6">
<p id="status" class="mb-4 text-2xl font-medium sm:mb-8 sm:px-5 md:px-6">
<span class="uppercase">
Commissions are <span class="text-orange-600 dark:text-orange-500">semi-open</span>
</span>
. I'll be more picky about which commissions to take.
</p>
) : TOS_COMMISSION_STATUS == "PRIVATE" ? (
<p class="mb-4 text-2xl font-medium sm:mb-8 sm:px-5 md:px-6">
<p id="status" class="mb-4 text-2xl font-medium sm:mb-8 sm:px-5 md:px-6">
<span class="uppercase">
Commissions are <span class="text-red-600 dark:text-red-500">private</span>
</span>
@ -54,7 +54,7 @@ import { TOS_COMMISSION_STATUS, TOS_UPDATED_AT } from "../data/tos";
) : null
}
</section>
<section>
<section id="terms">
<p class="mb-2 text-justify indent-6 sm:px-5 sm:indent-12 md:px-6">
To stay flexible with both the word count and the deadline, I'm taking payments <em>after</em> the commission is
done. My rate is <b class="font-semibold">US$&nbsp;1.50 per 100 words</b>, and the final price is only set when
@ -77,7 +77,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.
</p>
</section>
<section aria-labelledby="title-commission-subjects">
<section id="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>
<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">

View file

@ -1,13 +1,14 @@
---
import BaseLayout from "../layouts/BaseLayout.astro";
import IconArrowUpRightFromSquare from "../components/icons/IconArrowUpRightFromSquare.astro";
import IconBriefcase from "../components/icons/IconBriefcase.astro";
import IconEkasPortal from "../components/icons/brands/IconEkasPortal.astro";
import IconFurAffinity from "../components/icons/brands/IconFurAffinity.astro";
import IconInkbunny from "../components/icons/brands/IconInkbunny.astro";
import IconSoFurry from "../components/icons/brands/IconSoFurry.astro";
import IconSubscribeStar from "../components/icons/brands/IconSubscribeStar.astro";
import IconWeasyl from "../components/icons/brands/IconWeasyl.astro";
import { IconArrowUpRightFromSquare, IconBriefcase } from "../components/icons";
import {
IconEkasPortal,
IconFurAffinity,
IconInkbunny,
IconSoFurry,
IconSubscribeStar,
IconWeasyl,
} from "../components/icons/brands";
import { TOS_COMMISSION_STATUS } from "../data/tos";
import { SUBSCRIBESTAR_ENABLED } from "../data/subscribestar";
@ -118,7 +119,7 @@ import { SUBSCRIBESTAR_ENABLED } from "../data/subscribestar";
</li>
</ul>
</section>
<section aria-labelledby="title-story-commissions">
<section id="commissions" aria-labelledby="title-story-commissions">
<h2 id="title-story-commissions" class="my-4 text-lg sm:my-6 sm:text-2xl">Story commissions</h2>
{
TOS_COMMISSION_STATUS == "CLOSED" ? (
@ -166,7 +167,7 @@ import { SUBSCRIBESTAR_ENABLED } from "../data/subscribestar";
)
}
</section>
<section aria-labelledby="title-paid-subscriptions">
<section id="subscribestar" aria-labelledby="title-paid-subscriptions">
<h2 id="title-paid-subscriptions" class="my-4 text-lg sm:my-6 sm:text-2xl">Paid subscriptions and tips</h2>
{
SUBSCRIBESTAR_ENABLED ? (
@ -200,7 +201,7 @@ import { SUBSCRIBESTAR_ENABLED } from "../data/subscribestar";
) : null
}
</section>
<section aria-labelledby="title-other-work">
<section id="other" aria-labelledby="title-other-work">
<h2 id="title-other-work" class="my-4 text-lg sm:my-6 sm:text-2xl">Other work</h2>
<p class="mb-6 mt-3 sm:mb-8 sm:mt-4">
Other than the above, I've done some miscellaneous work. This includes