Compare commits

..

No commits in common. 'main' and 'rewrite' have entirely different histories.

@ -0,0 +1,2 @@
node_modules/
.next/

1
.gitignore vendored

@ -3,4 +3,3 @@ node_modules/
.vscode/
out/
.DS_Store
result

@ -0,0 +1,8 @@
pipeline:
neocities:
image: ruby:latest
when:
branch: main
commands:
- gem install neocities
- neocities push .

@ -0,0 +1,12 @@
from node:18
workdir /app
copy package.json .
copy package-lock.json .
run npm ci
copy . .
run npx next build
expose 3000
entrypoint npx next start

@ -1,4 +1,3 @@
import { Fragment } from "react";
import Markdown from "markdown-to-jsx";
import { notFound } from "next/navigation";
@ -21,15 +20,16 @@ export default function MemberPage({ params: { name } }) {
<>
<main className="mainColumn">
<InfoBar memberName={member.name} />
<Markdown outer="short">{member.bioShort}</Markdown>
<Markdown outer="long">{member.bioContinued}</Markdown>
<p>{member.bioShort}</p>
<Markdown>{member.bioContinued}</Markdown>
{member.bioFields?.length && (
<div className={styles.glance}>
{member.bioFields.map(({ name, value }) => (
<Fragment key={name}>
<>
<span className={styles.label}>{name}</span>
<span>{value}</span>
</Fragment>
</>
))}
</div>
)}

@ -1,83 +1,47 @@
import Link from 'next/link'
import Image from 'components/Image'
import Image from 'next/image'
import system from '~/config/system.json'
import styles from '~/styles/about.module.css'
import profilePics from '~/utils/profiles'
export interface Member {
name: string,
featured: boolean,
mainPronouns: string,
color: string,
bioShort: string,
readMore: string,
profileImg: string,
}
export default function About() {
const members = system.members as Member[]
const featuredMembers : Member[] = members.filter(({featured}) => featured)
const nonfeaturedMembers : Member[] = members.filter(({featured}) => !featured)
return (
<>
<h1 className="pageTitle">
About Us
</h1>
<main className={styles.container}>
{featuredMembers.map((member: Member) => {
{system.members.map((member: Member) => {
const style = { "--member-color": member.color } as React.CSSProperties
return (
<section className={styles.member} style={style}>
<Image
alt=""
width={150}
height={150}
src={member.profileImg}
/>
<Image alt="" width={150} height={150} src={profilePics[member.name.toLowerCase()]} />
<h2>{member.name}</h2>
<p className={styles.pronouns}>{member.mainPronouns}</p>
<p className={styles.bio}>
{member.bioShort}
</p>
<p>
<Link href={`/about/${member.name.toLowerCase()}`}>{member.readMore}</Link>
</p>
<p><a href={`/about/${member.name.toLowerCase()}`}>{member.readMore}</a></p>
</section>
)
})}
</main>
</main >
<div className={styles.summary}>
<p>
Generally the above four members are who interact with others
throughout our day to day. They handle our work, our social relationships,
and our broader plans for life. In addition, our system has another
internally-focused member who you will likely not meet unless you seek it out:
Our system is composed of the above three members. Generally you
don't have to care who is most present at any given time, as we share
memory and flow in and out of front pretty often, but we do appreciate
when people notice us individually
</p>
{nonfeaturedMembers.map((member: Member) => {
const style = { "--member-color": member.color } as React.CSSProperties
return (
<section className={`${styles.member} ${styles.lower}`} style={style}>
<Image
alt=""
width={80}
height={80}
src={member.profileImg}
/>
<h2>{member.name}</h2>
<p className={styles.pronouns}>{member.mainPronouns}</p>
<p className={styles.bio}>
{member.bioShort}
</p>
<p>
<Link href={`/about/${member.name.toLowerCase()}`}>{member.readMore}</Link>
</p>
</section>
)
})}
<p>For avatar sources, see <a href="https://static.tempest.dev/credit.txt">here</a></p>
</div>
</>
)
}

@ -1,7 +1,56 @@
'use client'
import { useState, useRef, FormEvent } from 'react'
import InfoBar from "~/components/InfoBar/"
import ContactForm from "~/components/ContactForm"
import styles from '~/styles/form.module.css'
const submitUrl = 'https://kae.tempest.dev/api/contact/me'
export default function Contact() {
const [submitting, setSubmitting] = useState(false)
const [status, setStatus] = useState('')
const nameRef = useRef<HTMLInputElement>()
const emailRef = useRef<HTMLInputElement>()
const messageRef = useRef<HTMLTextAreaElement>()
const submit = async (ev: FormEvent<HTMLFormElement>) => {
ev.preventDefault()
setStatus('')
const name = nameRef.current.value
const email = emailRef.current.value
const message = messageRef.current.value
if (!name) setStatus(s => s + ' Name required.')
if (!email) setStatus(s => s + ' Email required.')
if (!message) setStatus(s => s + ' Message required.')
if (!name || !email || !message)
return
setSubmitting(true)
try {
await fetch(submitUrl, {
method: 'post',
headers: {
'content-type': 'application/json'
},
body: JSON.stringify({
name, email, message
})
})
setStatus('Message sent successfully')
} catch {
setStatus('Error submitting message, please try again')
} finally {
setSubmitting(false)
}
}
return (
<>
@ -12,7 +61,30 @@ export default function Contact() {
<InfoBar>
Be nice. Please don't make us regret putting this here
</InfoBar>
<ContactForm/>
<form className={styles.form} onSubmit={submit}>
<label htmlFor="name">Name:</label>
<input disabled={submitting} name="name" ref={nameRef} />
<label htmlFor="email">Email:</label>
<input disabled={submitting} name="email" ref={emailRef} />
<label htmlFor="message">Message:</label>
<textarea disabled={submitting} name="message" ref={messageRef} />
<button disabled={submitting} type="submit">Submit</button>
{status && <span className={styles.status}>{status}</span>}
{/*<FormController
url="https://kae.tempest.dev/api/contact/tempest"
afterSubmit={() => setStatus('Message sent successfully!')}
onError={() => setStatus('Error submitting message, please try again.')}
>
<Input name="name" validate={v => !!v} />
<Input name="email" validate={v => !!v && v.includes('@')} />
<TextArea name="message" validate={v => !!v && v.length < 1000} />
<Button onClick={() => setStatus(null)} type="submit">submit</Button>
{status && <p>{status}</p>}
</FormController>*/}
</form>
</main>
</>
)

@ -1,5 +1,4 @@
import React from 'react'
import Link from 'next/link'
import React from 'react';
import styles from '~/styles/index.module.css'
@ -8,7 +7,7 @@ export default function Index() {
<main className="mainColumn">
<p>
Hi, we're tempest! And we also go by ashe. We're a median plural
system of four members, but most of the time you'll probably see us
system of three members, but most of the time you'll probably see us
operating as one
</p>
@ -29,7 +28,7 @@ export default function Index() {
<span>ace</span>
<span className={styles.label}>Partners:</span>
<span>several</span>
<span>three</span>
<span className={styles.label}>Children:</span>
<span>two</span>
@ -40,7 +39,7 @@ export default function Index() {
<p>
<em>Note:</em> This is the information for our system in aggregate,
for individual info see our <Link href="/about">about</Link> page
for individual info see our <a href="/about">about</a> page
</p>
</main>
)

@ -9,7 +9,7 @@ export default function PayTransparency() {
Pay Transparency
</h1>
<main className="mainColumn">
<InfoBar text="Last updated: November 2023" />
<InfoBar text="Last updated: May 2023" />
<p>
This page lists the title and pay rate of every job we have held
since university graduation, and is inspired by{' '}
@ -65,13 +65,6 @@ export default function PayTransparency() {
<span>$158,000 USD / year
<em>**</em>
</span>
<span className={styles.position}>Web Systems Manager</span>
<span>October 2023</span>
<span>Current</span>
<span>$110,000 USD / year
<em>*</em>
</span>
</div>
</div>

@ -1,69 +0,0 @@
'use client'
import styles from '~/styles/form.module.css'
const submitUrl = 'https://contact.tempest.dev/api/contact/me'
import { useState, useRef, FormEvent } from 'react'
export default function ContactForm() {
const [submitting, setSubmitting] = useState(false)
const [status, setStatus] = useState('')
const nameRef = useRef<HTMLInputElement>()
const emailRef = useRef<HTMLInputElement>()
const messageRef = useRef<HTMLTextAreaElement>()
const submit = async (ev: FormEvent<HTMLFormElement>) => {
ev.preventDefault()
setStatus('')
const name = nameRef.current.value
const email = emailRef.current.value
const message = messageRef.current.value
if (!name) setStatus(s => s + ' Name required.')
if (!email) setStatus(s => s + ' Email required.')
if (!message) setStatus(s => s + ' Message required.')
if (!name || !email || !message)
return
setSubmitting(true)
try {
await fetch(submitUrl, {
method: 'post',
headers: {
'content-type': 'application/json'
},
body: JSON.stringify({
name, email, message
})
})
setStatus('Message sent successfully')
} catch {
setStatus('Error submitting message, please try again')
} finally {
setSubmitting(false)
}
}
return (
<form className={styles.form} onSubmit={submit}>
<label htmlFor="name">Name:</label>
<input disabled={submitting} name="name" ref={nameRef} />
<label htmlFor="email">Email:</label>
<input disabled={submitting} name="email" ref={emailRef} />
<label htmlFor="message">Message:</label>
<textarea disabled={submitting} name="message" ref={messageRef} />
<button disabled={submitting} type="submit">Submit</button>
{status && <span className={styles.status}>{status}</span>}
</form>
)
}

@ -1,121 +0,0 @@
import { promises as fs } from 'fs'
import { createHash } from 'node:crypto'
import path from 'path'
import { ImgHTMLAttributes } from 'react'
import sharp from 'sharp'
const outputDir = path.join(process.cwd(), '.next/static/images')
const serverPath = '/_next/static/images/'
interface ReqProps {
src: string,
alt: string,
}
type FixedSingleDimension = {width: number} | {height: number}
type FixedBothDimension = {width: number, height: number}
type MultiSize = {width: number[]} | {height: number[]}
type SizeProps = FixedSingleDimension | FixedBothDimension | MultiSize
type ImageAttrs = Omit<ImgHTMLAttributes<HTMLImageElement>, "width" | "height" | "src">
type ImageProps = ImageAttrs
& SizeProps
& ReqProps
interface ProcessedImage {
hostPath: string,
randPrefix: string,
origSrc: string,
aspectRatio: number,
}
async function ImageServer({src,...imgAttrs}: ImageProps) {
const width = 'width' in imgAttrs ? imgAttrs.width : null
const height = 'height' in imgAttrs ? imgAttrs.height : null
// Handle where we have an array of widths
if (Array.isArray(width)) {
let _src : string = src
const srcSet = (await Promise.all(width.map(async width => {
const {outputPath, origSrc} = await processImage(src, {width})
_src = origSrc
return `${outputPath} ${width}w`
}))).join(',')
return (
<img
src={_src}
srcSet={srcSet}
{...imgAttrs}
width={undefined}
height={undefined}
/>
)
}else if (Array.isArray(height)) {
let _src : string = src
const srcSet = (await Promise.all(height.map(async height => {
const {outputPath, origSrc} = await processImage(src, {height})
_src = origSrc
return `${outputPath} ${width}w`
}))).join(',')
return (
<img
src={_src}
srcSet={srcSet}
{...imgAttrs}
width={undefined}
height={undefined}
/>
)
} else {
const {outputPath, resolvedWidth} = await processImage(src, {width, height})
return <img src={outputPath} {...imgAttrs} height={undefined} width={resolvedWidth} />
}
}
async function processImage(sourcePath: string, {width, height} : {width?: number, height?: number}) : Promise<{outputPath: string, resolvedWidth: number, origSrc: string}> {
await fs.mkdir(outputDir, {recursive: true})
const hostPath = path.join(process.cwd(), sourcePath)
const srcImg = sharp(hostPath)
const metadata = await srcImg.metadata()
const extension = path.extname(hostPath)
const filename = path.basename(hostPath, extension)
const hashPrefix = createHash('sha256').update(hostPath).digest('hex').substr(0, 7)
const origSrc = `${hashPrefix}-${filename}${extension}`
const aspectRatio = metadata.width / metadata.height
const resolvedWidth = width ? width : aspectRatio * height
const outputName = `${hashPrefix}-${filename}-${resolvedWidth}w${extension}`
const origCopyStat = await fs.stat(path.join(outputDir, origSrc)).catch(() => undefined)
if (!origCopyStat?.isFile()) {
console.log(`copying file ${hostPath}`)
await fs.copyFile(hostPath, path.join(outputDir, origSrc))
}
const outputStat = await fs.stat(path.join(outputDir, outputName)).catch(() => undefined)
if (!outputStat?.isFile()) {
console.log(`resizing file ${hostPath} for width ${resolvedWidth}`)
await srcImg
.resize({width: resolvedWidth})
.toFile(path.join(outputDir, outputName))
}
return {
outputPath: serverPath + outputName,
resolvedWidth,
origSrc,
}
}
export default function ImageServerWrap(props: ImageProps) {
return (
<>
{/* @ts-expect-error Async Server Component */}
<ImageServer {...props} />
</>
)
}

@ -1,7 +1,8 @@
import { ReactNode } from 'react'
import Image from 'components/Image'
import Image from 'next/image'
import system from '~/config/system.json'
import profilePics from '~/utils/profiles'
import styles from './InfoBar.module.css'
interface ArbitraryChildrenProps {
@ -38,9 +39,10 @@ export default function InfoBar(props: InfobarProps) {
}
if ('authorName' in props) {
const authorKey = props.authorName.toLowerCase()
const author = system.members.find((member) => member.name === props.authorName)
const style = { '--author-color': author?.color } as React.CSSProperties
const picture = author.profileImg
const picture = profilePics[authorKey]
return (
<aside className={`${styles.infobar} ${styles.postMeta}`} style={style}>
@ -57,7 +59,7 @@ export default function InfoBar(props: InfobarProps) {
const memberKey = props.memberName.toLowerCase()
const member = system.members.find((member) => member.name === props.memberName)
const style = { '--member-color': member?.color } as React.CSSProperties
const picture = member.profileImg
const picture = profilePics[memberKey]
return (
<aside className={`${styles.infobar} ${styles.memberProfile}`} style={style}>

@ -1,15 +1,9 @@
import Link from 'next/link'
export default function Footer() {
return (
<footer>
<span>Website by ashelyn rose</span>
<span>
<a style={{ textDecoration: 'none' }} href="https://webring.umbreon.online/prev?from=https://tempest.dev">&lt;</a>
<a target="_blank" href="https://webring.umbreon.online/">webring</a>
<a style={{ textDecoration: 'none' }} href="https://webring.umbreon.online/next?from=https://tempest.dev">&gt;</a>
</span>
<Link href="/pay-transparency">Pay Transparency</Link>
<a href="https://git.tempest.dev/ashe/tempest.dev">Site Source</a>
<a href="/pay-transparency">Pay Transparency</a>
</footer>
)
}

@ -1,10 +1,11 @@
'use client'
import React from 'react'
import Link from 'next/link'
import Image from 'components/Image'
import Image from 'next/image'
import { usePathname } from 'next/navigation'
const header = 'images/aurora-1197753.jpg'
import header from '~/images/aurora-1197753.jpg'
export default function Title() {
const pathname = usePathname()
@ -15,19 +16,19 @@ export default function Title() {
<header className={isHomepage ? 'homepage' : undefined}>
{isHomepage
? <h1 className="siteTitle">tempest.dev</h1>
: <Link href="/" className="siteTitle">tempest.dev</Link>
: <a href="/" className="siteTitle">tempest.dev</a>
}
<nav>
<Link href="/about">about</Link>
<Link href="/contact">contact</Link>
<Link target="blank" href="https://git.tempest.dev/ashe/tempest.dev">code</Link>
<a href="/about">about</a>
<a href="/posts">posts</a>
<a href="/contact">contact</a>
</nav>
<div className="headerBackground">
<Image
src={header}
alt=""
role="presentation"
width={[2560,1920,1280,800,600]}
fill={true}
sizes={`
(max-width: 2560) 100vw,
(max-width: 1920) 100vw,

@ -2,72 +2,39 @@
"pluralkit": "aypoe",
"members": [{
"name": "rose",
"featured": true,
"mainPronouns": "they/them",
"bioShort": "web developer and system administrator, i'm the part of us that spends most of my time online and maintains our technical infrastructure",
"readMore": "browse my pages",
"bioContinued": "it's become my responsibility to get and hold down a job for us, although when i have spare energy from that i like to work on websites or i'll sometimes play games\n\npersonality-wise i've been told i can be a bit brash — i think i'm more of a tease but it is what it is\n\nsee also violet, we just split a few months ago",
"readMore": "read my docs",
"bioContinued": "it's become my responsibility to get and hold down a job for us, although when i have spare energy from that i like to work on coding, websites, and other technical persuits\n\npersonality-wise i've been told i can be a bit brash — i think i'm more of a tease but it is what it is",
"color": "#df5c87",
"bioFields": [
{"name": "names:", "value": "rose, rosalyn, occasionally callista"},
{"name": "names:", "value": "rose, or if you know why: callista. neither capitalized"},
{"name": "pronouns:", "value": "they/them. very occasionally she/her but i'm not usually in the mood"},
{"name": "orientation:", "value": "the hell if i know"}
],
"profileImg": "images/profile/rose.png"
{"name": "orientation:", "value": "unknown. probably not actually ace, but traumatized. mostly lesbian in any case"}
]
},{
"name": "Dawn",
"featured": true,
"mainPronouns": "she/it",
"mainPronouns": "she/her",
"bioShort": "As our artist, our performer, and our orator I'm the one of us who maintains in-person relationships and makes sure we care for each other",
"bioContinued": "Historically I was also the system member responsible for masking the others, but that isn't a role I take as often these days\n\nIf we speak in person, I'm probably involved at some point in that conversation",
"readMore": "Ask me more",
"color": "#9495b5",
"bioFields": [
{"name": "Names:", "value": "Dawn. Perhaps \"Ashelyn Dawn\" if you're feeling fancy"},
{"name": "Pronouns:", "value": "She/her in general, it/its for friends"},
{"name": "Pronouns:", "value": "She/her, no exceptions"},
{"name": "Orientation:", "value": "Asexual, polyromantic lesbian"}
],
"profileImg": "images/profile/dawn.png"
]
},{
"name": "echo",
"mainPronouns": "it/its",
"bioShort": "hi! echo is the one who catalogues and digs through our understanding of the outside world\n\nfavors speaking in third person",
"bioShort": "hi! i'm the one who catalogues and digs through our understanding of the outside world. also i don't talk much",
"bioContinued": "",
"readMore": "see the archive",
"color": "#67d4b3",
"bioFields": [
{"name": "name:", "value": "echo"},
{"name": "pronouns:", "value": "it/its, “that one”, most neopronouns okay"},
{"name": "orientation:", "value": "aroace"}
],
"profileImg": "images/profile/echo.png"
},{
"name": "Corona",
"featured": true,
"mainPronouns": "they/she",
"bioShort": "I'm sort of the system protector, but in lieu of something to protect against I'm usually the one planning for the future",
"bioContinued": "I'm developing a reputation for being the grumpy one, but I promise I *usually* don't bite\n\nfor fun i like racing games or trashy romance novels",
"readMore": "Get to know me",
"color": "#7a81be",
"bioFields": [
{"name": "Names:", "value": "Corona (previously known as Harrow)"},
{"name": "Pronouns:", "value": "she/her or they/them with equal preference"},
{"name": "Orientation", "value": "Fem-leaning bisexual"}
],
"profileImg": "images/profile/corona.png"
},{
"name": "violet",
"featured": true,
"mainPronouns": "they/it",
"bioShort": "recently split from rose, i'm also involved in our technical pursuits, with a heavier focus on server administration and backend coding",
"readMore": "query my api",
"bioContinued": "current pursuits include learning more about rust and slowly moving our infrastructure to nixos - i've also started learning AWS (under duress from work) so i complain about that a lot\n\nfor fun i like puzzle games mostly i guess",
"color": "#ac0a60",
"bioFields": [
{"name": "names:", "value": "vi, violet, “vylt”"},
{"name": "pronouns:", "value": "they/them or it/its, no preference"},
{"name": "orientation:", "value": "ace, demiromantic"}
],
"profileImg": "images/profile/violet.png"
{"name": "names:", "value": "echo, ash if you're teasing"},
{"name": "pronouns:", "value": "it/its, most neopronouns okay"},
{"name": "orientation:", "value": "ace, probably demiromantic"}
]
}]
}

@ -1,77 +0,0 @@
{
"nodes": {
"nix-filter": {
"locked": {
"lastModified": 1681154353,
"narHash": "sha256-MCJ5FHOlbfQRFwN0brqPbCunLEVw05D/3sRVoNVt2tI=",
"owner": "numtide",
"repo": "nix-filter",
"rev": "f529f42792ade8e32c4be274af6b6d60857fbee7",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "nix-filter",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1685005470,
"narHash": "sha256-Nw+4uivzCwyZcEB71YH58zYk4N5UgcNeqb+D52bjlhI=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "60a2bc32e7369caf2f009f701ca98a8622abfdb3",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "master",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"nix-filter": "nix-filter",
"nixpkgs": "nixpkgs",
"utils": "utils"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1681202837,
"narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "cfacdce06f30d2b68473a46042957675eebb3401",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

@ -1,134 +0,0 @@
{
inputs = {
utils.url = "github:numtide/flake-utils";
nixpkgs.url = "github:NixOS/nixpkgs/master";
nix-filter.url = "github:numtide/nix-filter";
};
outputs = {
self,
nixpkgs,
utils,
nix-filter,
}:
utils.lib.eachDefaultSystem
(system: let
pkgs = import nixpkgs {
inherit system;
};
filter = nix-filter.lib;
nodejs = pkgs.nodejs-18_x;
src = filter {
root = ./.;
include = [
./package.json
./package-lock.json
];
};
packageLock = builtins.fromJSON(builtins.readFile (src + "/package-lock.json"));
deps = builtins.attrValues (removeAttrs packageLock.packages [ "" ])
++ builtins.attrValues (removeAttrs (packageLock.dependencies or {} ) [ "" ])
;
tarballs = map (p: pkgs.fetchurl { url = p.resolved; hash = p.integrity; }) deps;
tarballsFile = pkgs.writeTextFile {
name = "tarballs";
text = builtins.concatStringsSep "\n" tarballs;
};
tempestdev_modules = pkgs.stdenv.mkDerivation {
inherit src;
name = "node_modules";
buildInputs = [ nodejs ];
buildPhase = ''
export HOME=$PWD/.home
export npm_config_cache=$PWD/.npm
while read package
do
echo "caching $(echo $package | sed 's/\/nix\/store\/[^-]*-//')"
npm cache add "$package"
done <${tarballsFile}
${nodejs}/bin/npm ci
'';
installPhase = ''
mkdir $out
mv node_modules $out/node_modules
'';
};
in {
packages = {
default = pkgs.stdenv.mkDerivation {
name = "tempest.dev";
src = filter {
root = ./.;
exclude = [
./.next
./node_modules
];
};
nativeBuildInputs = [ nodejs ];
configurePhase = ''
ln -sf ${tempestdev_modules}/node_modules node_modules
export HOME=$TMP
'';
buildPhase = ''
npm run build
'';
installPhase = ''
mv out $out
'';
};
};
}) // {
nixosModule = {config, lib, pkgs, ...}:
with lib;
let cfg = config.ashe.services."tempest.dev";
pkg = self.packages.${pkgs.system}.default;
in {
options.ashe.services."tempest.dev" = {
enable = mkEnableOption "Enables the tempest.dev HTTP service";
domain = mkOption rec {
type = types.str;
default = "tempest.dev";
example = default;
description = "The domain name for tempest.dev";
};
};
config = mkIf cfg.enable {
services.nginx.virtualHosts.${cfg.domain} = {
locations."/" = {
root = "${pkg}";
};
locations."/.well-known/" = {
extraConfig = ''
alias ${pkg}/.well-known/;
add_header Content-Type text/plain;
'';
};
forceSSL = true;
enableACME = true;
};
};
};
};
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 874 KiB

After

Width:  |  Height:  |  Size: 585 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 251 KiB

1
next-env.d.ts vendored

@ -1,4 +1,5 @@
/// <reference types="next" />
/// <reference types="next/image-types/global" />
// NOTE: This file should not be edited
// see https://nextjs.org/docs/basic-features/typescript for more information.

@ -1,7 +0,0 @@
module.exports = {
output: 'export',
trailingSlash: true,
images: {
disableStaticImages: true
},
}

166
package-lock.json generated

@ -11,7 +11,7 @@
"dependencies": {
"front-matter": "^4.0.2",
"markdown-to-jsx": "^7.2.0",
"next": "^14.0.3",
"next": "^13.4.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"sharp": "^0.32.1",
@ -19,7 +19,7 @@
},
"devDependencies": {
"@types/node": "20.1.0",
"@types/react": "^18.2.41",
"@types/react": "^18.2.6",
"typescript": "5.0.4"
}
},
@ -35,14 +35,14 @@
}
},
"node_modules/@next/env": {
"version": "14.0.3",
"resolved": "https://registry.npmjs.org/@next/env/-/env-14.0.3.tgz",
"integrity": "sha512-7xRqh9nMvP5xrW4/+L0jgRRX+HoNRGnfJpD+5Wq6/13j3dsdzxO3BCXn7D3hMqsDb+vjZnJq+vI7+EtgrYZTeA=="
"version": "13.4.1",
"resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.1.tgz",
"integrity": "sha512-eD6WCBMFjLFooLM19SIhSkWBHtaFrZFfg2Cxnyl3vS3DAdFRfnx5TY2RxlkuKXdIRCC0ySbtK9JXXt8qLCqzZg=="
},
"node_modules/@next/swc-darwin-arm64": {
"version": "14.0.3",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.3.tgz",
"integrity": "sha512-64JbSvi3nbbcEtyitNn2LEDS/hcleAFpHdykpcnrstITFlzFgB/bW0ER5/SJJwUPj+ZPY+z3e+1jAfcczRLVGw==",
"version": "13.4.1",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.1.tgz",
"integrity": "sha512-eF8ARHtYfnoYtDa6xFHriUKA/Mfj/cCbmKb3NofeKhMccs65G6/loZ15a6wYCCx4rPAd6x4t1WmVYtri7EdeBg==",
"cpu": [
"arm64"
],
@ -55,9 +55,9 @@
}
},
"node_modules/@next/swc-darwin-x64": {
"version": "14.0.3",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.3.tgz",
"integrity": "sha512-RkTf+KbAD0SgYdVn1XzqE/+sIxYGB7NLMZRn9I4Z24afrhUpVJx6L8hsRnIwxz3ERE2NFURNliPjJ2QNfnWicQ==",
"version": "13.4.1",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.1.tgz",
"integrity": "sha512-7cmDgF9tGWTgn5Gw+vP17miJbH4wcraMHDCOHTYWkO/VeKT73dUWG23TNRLfgtCNSPgH4V5B4uLHoZTanx9bAw==",
"cpu": [
"x64"
],
@ -70,9 +70,9 @@
}
},
"node_modules/@next/swc-linux-arm64-gnu": {
"version": "14.0.3",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.3.tgz",
"integrity": "sha512-3tBWGgz7M9RKLO6sPWC6c4pAw4geujSwQ7q7Si4d6bo0l6cLs4tmO+lnSwFp1Tm3lxwfMk0SgkJT7EdwYSJvcg==",
"version": "13.4.1",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.1.tgz",
"integrity": "sha512-qwJqmCri2ie8aTtE5gjTSr8S6O8B67KCYgVZhv9gKH44yvc/zXbAY8u23QGULsYOyh1islWE5sWfQNLOj9iryg==",
"cpu": [
"arm64"
],
@ -85,9 +85,9 @@
}
},
"node_modules/@next/swc-linux-arm64-musl": {
"version": "14.0.3",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.3.tgz",
"integrity": "sha512-v0v8Kb8j8T23jvVUWZeA2D8+izWspeyeDGNaT2/mTHWp7+37fiNfL8bmBWiOmeumXkacM/AB0XOUQvEbncSnHA==",
"version": "13.4.1",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.1.tgz",
"integrity": "sha512-qcC54tWNGDv/VVIFkazxhqH1Bnagjfs4enzELVRlUOoJPD2BGJTPI7z08pQPbbgxLtRiu8gl2mXvpB8WlOkMeA==",
"cpu": [
"arm64"
],
@ -100,9 +100,9 @@
}
},
"node_modules/@next/swc-linux-x64-gnu": {
"version": "14.0.3",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.3.tgz",
"integrity": "sha512-VM1aE1tJKLBwMGtyBR21yy+STfl0MapMQnNrXkxeyLs0GFv/kZqXS5Jw/TQ3TSUnbv0QPDf/X8sDXuMtSgG6eg==",
"version": "13.4.1",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.1.tgz",
"integrity": "sha512-9TeWFlpLsBosZ+tsm/rWBaMwt5It9tPH8m3nawZqFUUrZyGRfGcI67js774vtx0k3rL9qbyY6+3pw9BCVpaYUA==",
"cpu": [
"x64"
],
@ -115,9 +115,9 @@
}
},
"node_modules/@next/swc-linux-x64-musl": {
"version": "14.0.3",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.3.tgz",
"integrity": "sha512-64EnmKy18MYFL5CzLaSuUn561hbO1Gk16jM/KHznYP3iCIfF9e3yULtHaMy0D8zbHfxset9LTOv6cuYKJgcOxg==",
"version": "13.4.1",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.1.tgz",
"integrity": "sha512-sNDGaWmSqTS4QRUzw61wl4mVPeSqNIr1OOjLlQTRuyInxMxtqImRqdvzDvFTlDfdeUMU/DZhWGYoHrXLlZXe6A==",
"cpu": [
"x64"
],
@ -130,9 +130,9 @@
}
},
"node_modules/@next/swc-win32-arm64-msvc": {
"version": "14.0.3",
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.3.tgz",
"integrity": "sha512-WRDp8QrmsL1bbGtsh5GqQ/KWulmrnMBgbnb+59qNTW1kVi1nG/2ndZLkcbs2GX7NpFLlToLRMWSQXmPzQm4tog==",
"version": "13.4.1",
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.1.tgz",
"integrity": "sha512-+CXZC7u1iXdLRudecoUYbhbsXpglYv8KFYsFxKBPn7kg+bk7eJo738wAA4jXIl8grTF2mPdmO93JOQym+BlYGA==",
"cpu": [
"arm64"
],
@ -145,9 +145,9 @@
}
},
"node_modules/@next/swc-win32-ia32-msvc": {
"version": "14.0.3",
"resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.3.tgz",
"integrity": "sha512-EKffQeqCrj+t6qFFhIFTRoqb2QwX1mU7iTOvMyLbYw3QtqTw9sMwjykyiMlZlrfm2a4fA84+/aeW+PMg1MjuTg==",
"version": "13.4.1",
"resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.1.tgz",
"integrity": "sha512-vIoXVVc7UYO68VwVMDKwJC2+HqAZQtCYiVlApyKEeIPIQpz2gpufzGxk1z3/gwrJt/kJ5CDZjlhYDCzd3hdz+g==",
"cpu": [
"ia32"
],
@ -160,9 +160,9 @@
}
},
"node_modules/@next/swc-win32-x64-msvc": {
"version": "14.0.3",
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.3.tgz",
"integrity": "sha512-ERhKPSJ1vQrPiwrs15Pjz/rvDHZmkmvbf/BjPN/UCOI++ODftT0GtasDPi0j+y6PPJi5HsXw+dpRaXUaw4vjuQ==",
"version": "13.4.1",
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.1.tgz",
"integrity": "sha512-n8V5ImLQZibKTu10UUdI3nIeTLkliEXe628qxqW9v8My3BAH2a7H0SaCqkV2OgqFnn8sG1wxKYw9/SNJ632kSA==",
"cpu": [
"x64"
],
@ -175,9 +175,9 @@
}
},
"node_modules/@swc/helpers": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz",
"integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==",
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz",
"integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==",
"dependencies": {
"tslib": "^2.4.0"
}
@ -195,9 +195,9 @@
"dev": true
},
"node_modules/@types/react": {
"version": "18.2.41",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.41.tgz",
"integrity": "sha512-CwOGr/PiLiNBxEBqpJ7fO3kocP/2SSuC9fpH5K7tusrg4xPSRT/193rzolYwQnTN02We/ATXKnb6GqA5w4fRxw==",
"version": "18.2.6",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.6.tgz",
"integrity": "sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA==",
"dev": true,
"dependencies": {
"@types/prop-types": "*",
@ -517,16 +517,6 @@
"resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
"integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="
},
"node_modules/glob-to-regexp": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
},
"node_modules/graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
},
"node_modules/granim": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/granim/-/granim-2.0.0.tgz",
@ -663,37 +653,39 @@
"integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="
},
"node_modules/next": {
"version": "14.0.3",
"resolved": "https://registry.npmjs.org/next/-/next-14.0.3.tgz",
"integrity": "sha512-AbYdRNfImBr3XGtvnwOxq8ekVCwbFTv/UJoLwmaX89nk9i051AEY4/HAWzU0YpaTDw8IofUpmuIlvzWF13jxIw==",
"version": "13.4.1",
"resolved": "https://registry.npmjs.org/next/-/next-13.4.1.tgz",
"integrity": "sha512-JBw2kAIyhKDpjhEWvNVoFeIzNp9xNxg8wrthDOtMctfn3EpqGCmW0FSviNyGgOSOSn6zDaX48pmvbdf6X2W9xA==",
"dependencies": {
"@next/env": "14.0.3",
"@swc/helpers": "0.5.2",
"@next/env": "13.4.1",
"@swc/helpers": "0.5.1",
"busboy": "1.6.0",
"caniuse-lite": "^1.0.30001406",
"postcss": "8.4.31",
"postcss": "8.4.14",
"styled-jsx": "5.1.1",
"watchpack": "2.4.0"
"zod": "3.21.4"
},
"bin": {
"next": "dist/bin/next"
},
"engines": {
"node": ">=18.17.0"
"node": ">=16.8.0"
},
"optionalDependencies": {
"@next/swc-darwin-arm64": "14.0.3",
"@next/swc-darwin-x64": "14.0.3",
"@next/swc-linux-arm64-gnu": "14.0.3",
"@next/swc-linux-arm64-musl": "14.0.3",
"@next/swc-linux-x64-gnu": "14.0.3",
"@next/swc-linux-x64-musl": "14.0.3",
"@next/swc-win32-arm64-msvc": "14.0.3",
"@next/swc-win32-ia32-msvc": "14.0.3",
"@next/swc-win32-x64-msvc": "14.0.3"
"@next/swc-darwin-arm64": "13.4.1",
"@next/swc-darwin-x64": "13.4.1",
"@next/swc-linux-arm64-gnu": "13.4.1",
"@next/swc-linux-arm64-musl": "13.4.1",
"@next/swc-linux-x64-gnu": "13.4.1",
"@next/swc-linux-x64-musl": "13.4.1",
"@next/swc-win32-arm64-msvc": "13.4.1",
"@next/swc-win32-ia32-msvc": "13.4.1",
"@next/swc-win32-x64-msvc": "13.4.1"
},
"peerDependencies": {
"@opentelemetry/api": "^1.1.0",
"fibers": ">= 3.1.0",
"node-sass": "^6.0.0 || ^7.0.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"sass": "^1.3.0"
@ -702,6 +694,12 @@
"@opentelemetry/api": {
"optional": true
},
"fibers": {
"optional": true
},
"node-sass": {
"optional": true
},
"sass": {
"optional": true
}
@ -742,9 +740,9 @@
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
},
"node_modules/postcss": {
"version": "8.4.31",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
"integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
"version": "8.4.14",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
"integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
"funding": [
{
"type": "opencollective",
@ -753,14 +751,10 @@
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/postcss"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"dependencies": {
"nanoid": "^3.3.6",
"nanoid": "^3.3.4",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
},
@ -1078,9 +1072,9 @@
}
},
"node_modules/tslib": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
"integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg=="
},
"node_modules/tunnel-agent": {
"version": "0.6.0",
@ -1204,18 +1198,6 @@
"resolved": "https://registry.npmjs.org/vue2-transitions/-/vue2-transitions-0.3.0.tgz",
"integrity": "sha512-m1ad8K8kufqiEhj5gXHkkqOioI5sW0FaMbRiO0Tv2WFfGbO2eIKrfkFiO3HPQtMJboimaLCN4p/zL81clLbG4w=="
},
"node_modules/watchpack": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
"integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
"dependencies": {
"glob-to-regexp": "^0.4.1",
"graceful-fs": "^4.1.2"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@ -1225,6 +1207,14 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
},
"node_modules/zod": {
"version": "3.21.4",
"resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz",
"integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==",
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}
}
}
}

@ -4,15 +4,14 @@
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "next build"
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"front-matter": "^4.0.2",
"markdown-to-jsx": "^7.2.0",
"next": "^14.0.3",
"next": "^13.4.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"sharp": "^0.32.1",
@ -20,7 +19,7 @@
},
"devDependencies": {
"@types/node": "20.1.0",
"@types/react": "^18.2.41",
"@types/react": "^18.2.6",
"typescript": "5.0.4"
}
}

@ -1,6 +0,0 @@
ashe: they/them (collectively)
rose: they/them
violet: they/it
dawn: she/it
corona: she/they
echo: it/its

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="538.976" height="auto" viewBox="0 0 142.604 83.456" fill="white"><path d="M54.604 1.176C43.158 20.393 24.232 53.76 12.243 69.112 5.036 78.339 5.123 77.945.6 80.81c-.752 1.16-1.058 2.192.661 2.646 16.11-11.59 36.723-19.474 53.9-30.104.12 6.764-.812 11.014-4.33 14.45.168.096 16.612-.37 20.272-3.929 10.575-10.284 18.11-28.074 20.414-33.529 3.998-9.462 5.664-14.712 6.106-16.833.422-2.021-.732-2.253-1.758-.155-2.96 6.05-5.538 12.318-8.063 18.616-4.019 10.258-8.67 19.065-11.657 29.15-.485 1.638 2.703 1.205 3.298.45 2.311-2.935 4.725-5.795 6.782-8.925 1.266-1.926 2.997-3.652 4.71-5.477 1.4-1.488 1.777-.189 1.607.756-.715 3.973-2.666 8.173-1.378 11.753.521 1.447 4.838 3.496 8.465.437.444-.374.915-.72 1.323-1.134 3.15-3.917 10.236-9.918 10.255-14.78-1.449-3.749-6.414.183-8.27 1.646-2.209 2.276-4.762 6.066-2.93 8.449 1.353 1.842 4.704 2.623 6.989 2.666 5.104.097 9.185-1.396 13.639-3.84 6.248-3.43 18.962-7.81 19.912-7.952 3.514-1.311 1.984-1.887-.569-1.497-4.72.883-9.098 3.074-13.607 4.725-4.691 1.717-8.827 4.17-13.618 5.587-1.759.52-3.93 1.146-5.753.933-1.764-.206-3.64-.872-4.953-2.067-1.687-1.536.467-4.005 1.834-5.398 2.07-2.108 7.14-4.306 5.387-.756-2.255 4.089-6.4 7.694-9.434 10.489-1.853 1.321-5.206 3.732-6.747.79-1.77-3.378 1.834-10.093 1.367-11.94-.667-2.64-1.857-2.678-3.613-1.04-1.05.98-3.56 3.43-5.593 6.461-1.43 2.133-3.326 4.374-4.708 6.02-1.878 2.515-2.848 2.988-1.91.713 3.266-7.926 7.452-18.333 7.492-18.366 0 0-3.006 3.502-6.12 8.802-2.705 4.836-5.216 9.996-9.377 13.014-5.03 3.648-8.907 3.07-15.124 3.672-3.476-.025-6.79.438-10.12-.45-1.285-.038-2.457.797.292 3.19 8.026 6.99 10.964-4.858 11.34-12.945l.283-3.402c-.03-1.44-.798-2.558-1.89-1.795-12.598 8.8-24.516 14.212-37.892 21.261l-6.993 3.685-1.04.473C28.293 49.87 37.65 30.92 50.494 9.845c.731-1.024.999-.837.945.19-7.554 20.092-14.22 40.717-22.962 60.098-.558 1.618.178 3.866 1.796 1.228 8.504-22.364 15.682-45.203 25.253-67.185 1.492-3.427.666-5.665-.921-3z"></path></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

@ -40,7 +40,6 @@
.member p {
margin-top: 0;
white-space: pre-wrap;
}
.member .pronouns {
@ -68,25 +67,21 @@
flex-direction: column;
align-items: center;
margin-top: 0;
--text-padding: 8px;
}
.member {
max-width: calc(600px - 2 * var(--text-padding));
width: calc(100% - 2 * var(--text-padding));
max-width: 600px;
width: calc(100% - var(--text-padding));
display: grid;
grid-template-columns: calc(80px + 2 * var(--text-padding)) 1fr 8px;
grid-template-rows: 48px 70px 1fr 8px 36px;
padding: 0;
margin: 0;
grid-template-columns: max(100px, 30%) 1fr;
grid-template-rows: 30px 70px 1fr 30px;
}
.member h2 {
margin-top: 8px;
grid-row: 1;
grid-column: 2/3;
text-align: left;
border-bottom: solid 1px currentcolor;
margin-bottom: 8px;
grid-column: 1/3;
text-align: center;
}
.member:not(:last-child){
@ -103,21 +98,15 @@
.member .pronouns {
grid-column: 1;
grid-row: 3/7;
}
.member .bio {
grid-column: 2;
grid-row: 2/5;
}
.member p {
margin-bottom: 8px;
grid-row: 2/4;
}
.member p:last-child {
grid-column: 1/3;
grid-row: 5/7;
}
.summary {
@ -125,45 +114,3 @@
width: 100%;
}
}
.member.lower {
max-width: 600px;
width: 100%;
display: grid;
grid-template-columns: calc(80px + 2 * var(--text-padding)) 1fr 8px;
grid-template-rows: 48px 70px 1fr 8px 36px;
padding: 0;
margin: 0;
}
.member.lower h2 {
margin-top: 8px;
grid-row: 1;
grid-column: 2/3;
text-align: left;
border-bottom: solid 1px currentcolor;
margin-bottom: 8px;
}
.member.lower img {
width: 80px;
height: auto;
margin-top: 16px;
grid-row: 1/3;
grid-column: 1;
}
.member.lower .pronouns {
grid-column: 1;
grid-row: 3/7;
}
.member.lower .bio {
grid-column: 2;
grid-row: 2/5;
}
.member.lower p:last-child {
grid-column: 1/3;
grid-row: 5/7;
}

@ -141,10 +141,9 @@ header .headerBackground {
}
header .headerBackground img {
z-index: -1;
object-fit: cover;
object-position: center 75%;
width: 100%;
height: 100%;
}
header .headerBackground::after {
@ -153,8 +152,6 @@ header .headerBackground::after {
width: 100%;
height: 100%;
background: rgba(0,0,0,.35);
position: absolute;
top: 0;
}
header:not(.homepage) ~ h1.pageTitle {
@ -205,38 +202,30 @@ footer {
max-width: 100vw;
}
footer span:first-child {
footer span {
flex: 1;
}
footer > *:not(:first-child) {
footer a:not(:first-of-type) {
margin-left: calc(2 * var(--text-padding));
}
footer span a {
margin: 8px;
}
@media (max-width: 600px) {
footer {
box-sizing: initial;
flex-direction: column;
flex: initial;
flex-wrap: wrap;
height: 60px;
align-items:center;
justify-content:center;
margin: 8px 0;
padding: 0;
height: auto;
flex: initial;
}
footer > * {
footer span {
display: block;
min-width: 100%;
text-align: center;
}
footer span:first-child{
flex: 0;
}
}

@ -1,11 +1,3 @@
@font-face {
font-family: 'Victor Mono Oblique';
src: url('./VictorMono-Oblique.woff');
font-weight: 400;
font-style: normal;
font-display: swap;
}
body {
color: var(--text-medium);
font-family: 'Victor Mono', sans-serif;

@ -0,0 +1,7 @@
import rose from '~/images/profile/rose.png'
import dawn from '~/images/profile/dawn.png'
import echo from '~/images/profile/echo.png'
export default {
rose, dawn, echo
}
Loading…
Cancel
Save