Merge branch 'redesign'

This commit is contained in:
Eryn Wells 2022-10-09 12:55:01 -07:00
commit 9ae600d8ce
36 changed files with 1236 additions and 851 deletions

View file

@ -16,6 +16,7 @@ name = 'Eryn Wells'
[markup.highlight]
anchorLineNos = true
lineNos = true
lineNumbersInTable = false
noClasses = false
[mediaTypes]
@ -32,6 +33,10 @@ name = 'Eryn Wells'
identifier = 'resume'
name = 'Résumé'
url = '/resume/'
[[menu.main]]
identifier = 'about'
name = 'About'
url = '/about/'
[outputFormats]
[outputFormats.RSS]
@ -41,7 +46,7 @@ name = 'Eryn Wells'
[outputs]
home = ['HTML', 'RSS']
page = ['HTML']
page = ['HTML', 'JSON']
[params]
twitter = 'erynofwales'

View file

@ -1,48 +1,5 @@
# Hola! 👋🏻
---
title: Eryn Rachel Wells
---
Me llamo Eryn. Mis pronombres son [ella/ella][p]. Esta es me página personal. Bienvenide.
Soy una mujer trans y queer. Vivo en San Francisco con mis [dos gatos][cats]. Nací en Seattle, WA, y crecía en Phoenix, AZ. Asistí [Oberlin College][ob] donde obtuve un títolo en informática. {{< tess >}} es mi novia.
Mi lengua nativa es inglés, y también hablo español pero siempre necesito practicar más.
## Pasatiempos
Tengo un gran apetito por probar y aprender pasatiempos nuevos, especialmente
las que combinan varias de mis intereses.
He sido música para el gran parte de mi vida. Empezé tocar el piano cuando tuve
siete años, toqué la trompeta en colegio, y he tocado algunos otros instrumentos
por el camino. Todavía toco el piano, pero mi obsesión musical hoy en día es mi
sintetizador modular. De vez en cuando, grabo música y espero compartirla aquí,
en este sitio. Por el momento, puedes escuchar mi música en [Bandcamp][bc] o
[SoundCloud][sc].
Otros pasatiempos de los años recients incluyen: cerámica, caligrafía, tejido,
horneado pan, ciclismo, fotografía, y astronomía. ¿Uno no puede tener demasiados
pasatiemos, de verdad?
## Trabajo
He trabajado como ingeniera de software desde 2011 por varias companías basadas
en San Francisco y Silicon Valley. Hace seis años que he trabajado en Apple,
primero en el equipo iOS Accessibility, y ahora en el equipo Authentication
Experience.
Echa un vistazo a mi [resumen][r] para más detalles.
## Decirme Hola
Puedes encontrarme en muchos rincones del Internet. Estoy más activa en
[Twitter][t] y [Instagram][i]. Publico música en [SoundCloud][sc] y
[Bandcamp][bc]. Y para los proyectos de software, estoy en [GitHub][gh].
[p]: http://pronoun.is/she
[cats]: {{< ref "/cats" >}}
[ob]: https://www.oberlin.edu
[r]: {{< ref "/resume" >}}
[t]: https://twitter.com/erynofwales
[i]: https://www.instagram.com/erynofwales/
[sc]: https://soundcloud.com/purlsnbeeps
[bc]: https://erynwells.bandcamp.com/releases
[gh]: https://github.com/erynofwales
Este es un poco de texto sobre Eryn: quién es, qué le gusta, y por qué existe este sitio.

View file

@ -1,56 +1,5 @@
# Hi! 👋🏻
---
title: Eryn Rachel Wells
---
I'm Eryn. My pronouns are [she/her][p]. This is my personal page. Welcome!
I'm a queer trans woman. I live in San Francisco, CA, on the unceded ancestral
lands of the Ramaytush Ohlone people, with my [two cats][cats]. I was born in
Seattle, WA and grew up in Phoenix, AZ. I attended [Oberlin College][ob] where I
got a degree in Computer Science. {{< tess >}} is my girlfriend.
I speak English natively, and Spanish too, though I always need more practice.
## Hobbies
I have a big appetite for learning new skills, especially things that combine
multiple of my interests.
I've been a musician for most of my life. I started on the piano at age seven,
played trumpet in high school, and have picked up a smattering of other
instruments along the way. I still play piano occasionally, but my current
musical obsession is my modular synthesizer. I occasionally record things, and
I'm hoping to share them here on this site, but for now, they're on
[SoundCloud][sc] and [Bandcamp][bc].
I do try to spend my non-work time away from the computer, but every so often I
get inspired to hack on something. Those projects usually end up on
[GitHub][gh].
Other things I've picked up over the years include: ceramics, calligraphy,
knitting, bread baking, bicycling, photography, and astronomy. You can never
have too many hobbies, right?
## Professional
I've worked as a software engineer since 2011 for a variety of companies around
the San Francisco Bay Area. I've been at Apple since early 2016, first on the
iOS Accessibility team, and now on the Authentication Experience team.
Check out my [résumé][r] for more details.
## Say Hello
You can find me in lots of other corners of the Internet. I'm most active on
[Twitter][t] and [Instagram][i]. I post music on [SoundCloud][sc] and
[Bandcamp][bc]. I'm on [GitHub][gh] for coding projects. You can also send me an
[email][eml].
[p]: http://pronoun.is/she
[cats]: {{< ref "/cats" >}}
[ob]: https://www.oberlin.edu
[r]: {{< ref "/resume" >}}
[t]: https://twitter.com/erynofwales
[i]: https://www.instagram.com/erynofwales/
[sc]: https://soundcloud.com/purlsnbeeps
[bc]: https://erynwells.bandcamp.com/releases
[gh]: https://github.com/erynofwales
[eml]: mailto:Eryn%20Wells<eryn@erynwells.me>
Software engineer, potter, musician, and overall nerd. This is my website.

50
content/about/index.es.md Normal file
View file

@ -0,0 +1,50 @@
---
title: "Hola! 👋🏻"
---
Me llamo Eryn. Mis pronombres son [ella/ella][p]. Esta es me página personal. Bienvenide.
Soy una mujer trans y queer. Vivo en San Francisco con mis [dos gatos][cats]. Nací en Seattle, WA, y crecía en Phoenix, AZ. Asistí [Oberlin College][ob] donde obtuve un títolo en informática. {{< tess >}} es mi novia.
Mi lengua nativa es inglés, y también hablo español pero siempre necesito practicar más.
## Pasatiempos
Tengo un gran apetito por probar y aprender pasatiempos nuevos, especialmente
las que combinan varias de mis intereses.
He sido música para el gran parte de mi vida. Empezé tocar el piano cuando tuve
siete años, toqué la trompeta en colegio, y he tocado algunos otros instrumentos
por el camino. Todavía toco el piano, pero mi obsesión musical hoy en día es mi
sintetizador modular. De vez en cuando, grabo música y espero compartirla aquí,
en este sitio. Por el momento, puedes escuchar mi música en [Bandcamp][bc] o
[SoundCloud][sc].
Otros pasatiempos de los años recients incluyen: cerámica, caligrafía, tejido,
horneado pan, ciclismo, fotografía, y astronomía. ¿Uno no puede tener demasiados
pasatiemos, de verdad?
## Trabajo
He trabajado como ingeniera de software desde 2011 por varias companías basadas
en San Francisco y Silicon Valley. Hace seis años que he trabajado en Apple,
primero en el equipo iOS Accessibility, y ahora en el equipo Authentication
Experience.
Echa un vistazo a mi [resumen][r] para más detalles.
## Decirme Hola
Puedes encontrarme en muchos rincones del Internet. Estoy más activa en
[Twitter][t] y [Instagram][i]. Publico música en [SoundCloud][sc] y
[Bandcamp][bc]. Y para los proyectos de software, estoy en [GitHub][gh].
[p]: http://pronoun.is/she
[cats]: {{< ref "/cats" >}}
[ob]: https://www.oberlin.edu
[r]: {{< ref "/resume" >}}
[t]: https://twitter.com/erynofwales
[i]: https://www.instagram.com/erynofwales/
[sc]: https://soundcloud.com/purlsnbeeps
[bc]: https://erynwells.bandcamp.com/releases
[gh]: https://github.com/erynofwales

56
content/about/index.md Normal file
View file

@ -0,0 +1,56 @@
---
title: "Hi! 👋🏻"
date: 2022-09-03T12:14:32-07:00
draft: true
---
I'm Eryn. My pronouns are [she/her][p]. I'm a queer trans woman. I live in San
Francisco, CA, on the unceded ancestral lands of the Ramaytush Ohlone people,
with my [two cats][cats]. I was born in Seattle, WA and grew up in Phoenix, AZ.
I attended [Oberlin College][ob] where I got a degree in Computer Science.
{{< tess >}} is my girlfriend.
I speak English natively, and Spanish too, though I always need more practice.
## Hobbies
I've been a musician for most of my life. I started on the piano at age seven,
played trumpet in high school, and have picked up a smattering of other
instruments along the way. I still play piano occasionally, but my current
musical obsession is my modular synthesizer. I occasionally record things, and
I'm hoping to share them here on this site, but for now, they're on
[SoundCloud][sc] and [Bandcamp][bc].
I do try to spend my non-work time away from the computer, but every so often I
get inspired to hack on something. Those projects usually end up on
[GitHub][gh].
Other things I've picked up over the years include: ceramics, calligraphy,
knitting, bread baking, bicycling, photography, and astronomy. You can never
have too many hobbies, right?
## Professional
I've worked as a software engineer since 2011 for a variety of companies around
the San Francisco Bay Area. I've been at Apple since early 2016, first on the
iOS Accessibility team, and now on the Authentication Experience team.
Check out my [résumé][r] for more details.
## Say Hello
You can find me in lots of other corners of the Internet. I'm most active on
[Twitter][t] and [Instagram][i]. I post music on [SoundCloud][sc] and
[Bandcamp][bc]. I'm on [GitHub][gh] for coding projects. You can also send me an
[email][eml].
[p]: http://pronoun.is/she
[cats]: {{< ref "/cats" >}}
[ob]: https://www.oberlin.edu
[r]: {{< ref "/resume" >}}
[t]: https://twitter.com/erynofwales
[i]: https://www.instagram.com/erynofwales/
[sc]: https://soundcloud.com/purlsnbeeps
[bc]: https://erynwells.bandcamp.com/releases
[gh]: https://github.com/erynofwales
[eml]: mailto:Eryn%20Wells<eryn@erynwells.me>

View file

@ -11,18 +11,18 @@ according to the instructions in the Raspberry Pi documentation. That page is
also on [GitHub][eeprom-gh] which might be a more stable location. On Raspbian
on the RPi:
```bash
{{< figures/code lang=sh >}}
fw=/lib/firmware/raspberrypi/bootloader/stable/pieeprom-2020-09-03.bin
rpi-eeprom-config $fw > ~/bootconf.txt
vi ~/bootconf.txt
rpi-eeprom-config --out ~/pieeprom-new.bin --config ~/bootconf.txt $fw
sudo rpi-eeprom-update -d -f ~/pieeprom-new.bin
sudo reboot
```
{{< /figures/code >}}
My updated bootconf.txt is:
```conf
{{< figures/code lang=cfg >}}
[all]
BOOT_UART=1
WAKE_ON_GPIO=0
@ -33,7 +33,7 @@ TFTP_FILE_TIMEOUT=30000
ENABLE_SELF_UPDATE=1
DISABLE_HDMI=0
BOOT_ORDER=0xf412
```
{{< /figures/code >}}
I enabled UART debugging, and set the boot order to be: network `0x2`, SD card
`0x1`, USB mass storage `0x4`, and finally reboot `0xf`. These steps need to be
@ -41,11 +41,11 @@ repeated if the bootloader is updated via apt.
I [enabled the TFTP server][mac-tftp] on my Mac:
```bash
{{< figures/code lang=sh >}}
sudo launchctl load -F /System/Library/LaunchDaemons/tftp.plist
sudo launchctl enable System/com.apple.tftpd
sudo launchctl start com.apple.tftpd
```
{{< /figures/code >}}
Im not sure if the `enable` command is actually necessary. This doesn't
actually start the `tftpd` daemon. Instead, macOS starts the daemon on demand
@ -55,11 +55,11 @@ The tftp server looks for files to serve out of **/private/tftpboot**, and those
things need to be world `rwx`, i.e. `777`. By default (this is configurable) the
RPi queries for a directory named by its serial number.
```bash
{{< figures/code lang=sh >}}
mkdir /private/tftpboot/$raspberry_pi_serial
chmod 777 /private/tftpboot
chmod -R 777 /private/tftpboot/*
```
{{< /figures/code >}}
RPi looks for files of various names in that directory, one in particular by the
name of **start.elf**.
@ -69,13 +69,13 @@ command line) to pass a `tftp-server` parameter in the DHCP payload. This step
may be optional because you can also set `TFTP_IP` in the **bootconf.txt** above
to specify the IP directly. On my router:
```bash
{{< figures/code lang=sh >}}
configure
set service dhcp-server shared-network-name LAN subnet $lan_cidr_subnet tftp-server-name $ip_of_mac
commit
save
exit
```
{{< /figures/code >}}
I also gave my Mac a static IP, and renewed the DHCP lease so it took the new IP
to make the whole process a little more smooth. Now, it appears the RPi will
@ -88,4 +88,4 @@ attempt a TFTP boot, and I see queries in the logs on my Mac.
[eeprom]: https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2711_bootloader_config.md
[eeprom-gh]: https://github.com/raspberrypi/documentation/blob/master/hardware/raspberrypi/bcm2711_bootloader_config.md
[mac-tftp]: https://www.unixfu.ch/start-a-tftp-server-on-your-mac/
[mac-tftp]: https://www.unixfu.ch/start-a-tftp-server-on-your-mac/

View file

@ -91,6 +91,14 @@ Our audio processing graph looks like this:
rr.Terminal("destination")));
{{< /figures/railroad >}}
{{< figures/railroad id="audioContextDiagram" class="narrow-only" >}}
return rr.Diagram(
rr.Stack(
rr.Terminal("<audio>"),
rr.Terminal("Analyzer"),
rr.Terminal("destination")));
{{< /figures/railroad >}}
By itself the AudioContext doesn't actually play any audio. I'll tackle that
next.
@ -178,7 +186,7 @@ for (let i = 0; i < samples.length; i++) {
The most interesting part of this function starts at line 66 where we get an array of samples from the analyzer node. The `samples` variable is a JavaScript `Float32Array`, with one element for each pixel of width.
```js {linenos=false}
```js {linenostart=30}
samples = new Float32Array(p.width);
```

138
content/blog/blog.css Normal file
View file

@ -0,0 +1,138 @@
:root {
--post-item-highlight-color: #efefef;
--tag-text-color: #666;
--tag-background-color: #eee;
--tag-hover-background-color: #bbb;
}
@media (prefers-color-scheme: dark) {
:root {
--post-item-highlight-color: #121212;
--tag-text-color: #888;
--tag-background-color: rgb(40, 40, 40);
--tag-hover-background-color: rgb(73, 73, 73);
--tag-hover-foreground-color: #666;
}
}
.post-content > .highlight { margin-block-end: var(--body-item-spacing); }
.post-list {
list-style: none;
margin: 0;
padding: 0;
}
@supports (display: subgrid) {
.post-list {
align-items: baseline;
display: grid;
gap: 1em;
grid-template-columns:
minmax(150px, max-content) minmax(20px, max-content) 3px auto;
grid-template-areas: "month day line title";
}
}
.post-list li {
align-items: baseline;
border-radius: 6px;
display: grid;
gap: 1em;
padding: 0.1em;
transition: background-color 0.25s;
}
@supports not (display: subgrid) {
.post-list li {
grid-template-columns: 100px 20px 3px auto;
grid-template-areas: "month day thing title";
}
}
@supports (display: subgrid) {
.post-list li {
display: subgrid;
}
}
.post-list li time:nth-of-type(1) {
grid-area: month;
text-align: end;
}
.post-list li time:nth-of-type(2) {
grid-area: day;
text-align: end;
}
.post-list li h1 {
font-family: var(--font-family-body);
grid-area: title;
text-align: start;
}
.post-list li:hover {
background-color: var(--post-item-highlight-color);
}
.post-list h1 {
font-size: inherit;
font-weight: normal;
margin: 0;
padding: 0;
}
.post-list a {
color: inherit;
}
.post-list a:hover {
text-decoration: none;
}
.post-nav {
align-items: baseline;
display: flex;
margin-top: 3.5rem;
}
.post-nav .next {
margin-left: auto;
}
.post-single footer {
margin-block-start: 3.5rem;
}
.blog footer .tags {
display: flex;
padding-inline-start: 0;
}
.blog footer .tags li {
background-color: var(--tag-background-color);
border-radius: 4px;
display: inline-block;
font-size: 75%;
letter-spacing: 2px;
}
.blog footer .tags li:hover {
background-color: var(--tag-hover-background-color);
}
.blog footer .tags li a {
color: var(--tag-text-color);
display: block;
height: 100%;
width: 100%;
padding: 0.75rem 1rem;
}
.blog footer .tags li a:hover {
color: var(--tag-hover-foreground-color);
text-decoration: none;
}
.blog footer .tags li + li {
margin-inline-start: 1rem;
}

154
content/home.css Normal file
View file

@ -0,0 +1,154 @@
:root {
--animation-offset: 6px;
}
body {
display: flex;
flex-direction: column;
font-size: 2rem;
justify-content: center;
margin: auto;
}
h1 {
font-size: 5rem;
line-height: 1.3;
margin: 0;
padding: 0;
}
@media (max-width: 450px) {
h1 { font-size: 4.25rem; }
}
main {
margin-block-start: 10vh;
width: inherit;
}
main .grid {
align-items: baseline;
display: grid;
gap: 0 2rem;
grid-template-columns: min-content fit-content(35%);
grid-template-rows: repeat(2, max-content);
grid-template-areas:
"title blurb"
"title nav";
padding-inline: 1em;
width: min-content;
}
@media (max-width: 450px) {
main .grid {
gap: 1rem 0;
grid-template-columns: 1fr;
grid-template-rows: repeat(3, max-content);
grid-template-areas:
"title"
"blurb"
"nav";
text-align: center;
}
}
main h1 {
letter-spacing: 0.025em;
text-align: end;
}
@media (max-width: 450px) {
main h1 { text-align: center; }
}
main nav {
align-items: baseline;
}
main p {
margin: 0;
}
#title { grid-area: title; }
#content { grid-area: blurb }
#nav { grid-area: nav }
#title > *, #content > *, #nav > * { position: relative; }
#title > * {
animation: left-fade-in var(--transition-duration) ease-in-out;
}
@media (max-width: 450px) {
#title > * {
animation: top-fade-in var(--transition-duration) ease-in-out;
}
}
#content > *, #nav > * {
animation: right-fade-in var(--transition-duration) ease-in-out;
}
@media (max-width: 450px) {
#content > *, #nav > * {
animation: bottom-fade-in var(--transition-duration) ease-in-out;
}
}
@keyframes left-fade-in {
from {
opacity: 0%;
left: var(--animation-offset);
}
33% {
opacity: 0%;
left: var(--animation-offset);
}
to {
opacity: 100%;
left: 0;
}
}
@keyframes right-fade-in {
from {
opacity: 0%;
left: calc(-1 * var(--animation-offset));
}
33% {
opacity: 0%;
left: calc(-1 * var(--animation-offset));
}
to {
opacity: 100%;
left: 0;
}
}
@keyframes top-fade-in {
from {
opacity: 0%;
bottom: calc(-1 * var(--animation-offset));
}
33% {
opacity: 0%;
bottom: calc(-1 * var(--animation-offset));
}
to {
opacity: 100%;
bottom: 0;
}
}
@keyframes bottom-fade-in {
from {
opacity: 0%;
bottom: var(--animation-offset);
}
33% {
opacity: 0%;
bottom: var(--animation-offset);
}
to {
opacity: 100%;
bottom: 0;
}
}
.platter {
padding: 1.5rem 3rem;
}

View file

@ -13,10 +13,7 @@
font-style: italic;
}
header h3 {
margin-bottom: 0;
}
header h3 { margin-block-end: 0.5rem; }
ul {
margin-top: 0;
}
ul { margin-top: 0; }
li { margin-block-end: 0.75rem; }

View file

@ -3,11 +3,41 @@
{{ partial "head.html" . }}
<body>
<main class="main">
{{ block "body" . }}
{{ block "header" . }}{{ end }}
<main class="{{ .Type }}">
{{ block "main" . }}{{ end }}
</main>
{{ partial "footer.html" . }}
{{ partial "development/page_info.html" . }}
{{ block "footer" . }}{{ end }}
{{ end }}
</body>
<style>
@font-face {
font-family: "Museo_Slab";
src: url("{{ `/fonts/Museo_Slab_500.woff2` | absURL }}") format("woff2"),
url("{{ `/fonts/Museo_Slab_500.woff` | absURL }}") format("woff");
font-weight: normal;
font-style: normal;
}
</style>
<link rel="stylesheet" as="style" href="{{ `/styles/reset.css` | absURL }}">
<link rel="stylesheet" as="style" href="{{ `/styles/root.css` | absURL }}">
{{ if not hugo.IsProduction }}
<link rel="stylesheet" as="style" href="/styles/development.css">
{{ end }}
{{ block "styles" . }}{{ end }}
{{ if gt (len .Section) 0 }}
{{ range .FirstSection.Resources.Match "*.css" }}
<link rel="stylesheet" as="style" href="{{ .Permalink }}">
{{ end }}
{{ end }}
{{ range .Resources.Match "*.css" }}
<link rel="stylesheet" as="style" href="{{ .Permalink }}">
{{ end }}
{{ block "scripts" . }}{{ end }}
<script src="{{ `scripts/site.js` | absURL }}"></script>
</html>

View file

@ -1,11 +1,22 @@
{{ define "main" }}
{{ if .Title }}
<h1 class="main-title">{{ .Title }}</h1>
{{ end }}
<section id="homepage-content">
{{ .Content }}
</section>
<div class="platter">
<div class="grid">
<div id="title">
<h1 class="site">{{ .Title }}</h1>
</div>
<div id="content">
{{ .Content }}
</div>
{{ with site.Menus.main }}
{{ $url := $.RelPermalink }}
<div id="nav">
<nav class="site bulleted">
{{ range . }}
<li><a class="{{ if eq .URL $url }}active{{ end }}" href="{{ .URL }}"><span>{{ .Name }}</span></a></li>
{{ end }}
</nav>
</div>
{{ end }}
</div>
</div>
{{ end }}

View file

@ -1,44 +0,0 @@
{{ define "main" }}
{{ if .Title }}
<header>
<h1 class="main-title">{{ .Title }}</h1>
</header>
{{ end }}
{{ $pages := union .RegularPages .Sections }}
{{ if .IsHome }}
{{ $pages = where site.RegularPages "Type" "in" site.Params.mainSections }}
{{ end }}
{{ .Content }}
<ul class="post-list">
{{ $paginator := .Paginate $pages }}
{{ range $index, $page := $paginator.Pages }}
<li class="post-entry">
<header>
<h2><a href="{{ .Permalink }}">{{ .Title }}</a></h2>
<div class="post-date">
<time class="nobreak" datetime="{{ .Date | time.Format " 2006-01-02" }}">{{ .Date | time.Format "January 2, 2006" }}</time>
</div>
{{ partial "development/draft_tag.html" . }}
</header>
{{ if .Description }}
<article>{{ .Description }}</article>
{{ end }}
</li>
{{ end }}
</ul>
{{ if gt $paginator.TotalPages 1 }}
<nav class="main-nav">
{{ if $paginator.HasPrev }}
<a class="prev" href="{{ $paginator.Prev.URL }}">← {{ i18n "prev_page" }}</a>
{{ end }}<!---->
{{ if $paginator.HasNext }}
<a class="next" href="{{ $paginator.Next.URL }}">{{ i18n "next_page" }} →</a>
{{ end }}
</nav>
{{ end }}
{{ end }}

View file

@ -1,39 +1,37 @@
{{ define "header" }}
{{ partial "header.html" . }}
{{ end }}
{{ define "main" }}
<article class="post-single">
<header>
{{ partial "development/draft_tag.html" . }}
<div class="post-title">
<h1>{{ .Title }}</h1>
<div class="post-date"><time>{{ .Date | time.Format "January 2, 2006" }}</time></div>
</div>
</header>
<section class="post-content">
{{ .Content }}
</section>
{{ partial "single_main.html" . }}
{{ end }}
<!-- Post Tags -->
{{ if .Params.tags }}
<footer>
<ul class="post-tags">
{{ range .Params.tags }} {{ $href := print (absURL "tags/") (urlize .) }}
<li><a href="{{ $href }}">{{ . }}</a></li>
{{ end }}
</ul>
</footer>
{{ define "styles" }}
{{ if .Page.Scratch.Get "includes_railroad_diagram" }}
<link rel="preload stylesheet" as="style" href="{{ `styles/railroad.css` | absURL }}">
{{ end }}
<link rel="preload stylesheet" as="style" href="{{ `styles/monokai.css` | absURL }}">
{{ end }}
{{ define "scripts" }}
{{ if and .IsPage (.Page.Scratch.Get "includes_railroad_diagram") }}
<script defer type="module" src="{{ `scripts/railroad.js` | absURL }}"></script>
<script defer type="module" src="{{ `scripts/railroad-utils.js` | absURL }}"></script>
{{ end }}
<!-- Post Nav -->
{{ $pages := where site.RegularPages "Type" "in" site.Params.mainSections }}<!---->
{{ if and (gt (len $pages) 1) (in $pages . ) }}
<nav class="post-nav">
{{ with $pages.Next . }}
<a class="prev" href="{{ .Permalink }}"><span></span><span>{{ .Name }}</span></a>
{{ end }} {{ with $pages.Prev . }}
<a class="next" href="{{ .Permalink }}"><span>{{ .Name }}</span><span></span></a>
{{ end }}
</nav>
{{ if .Page.Scratch.Get "includes_p5_sketch" }}
<script defer src="{{ `scripts/p5-1.4.1.min.js` | absURL }}"></script>
<script defer src="{{ `scripts/sketch-utils.js` | absURL }}"></script>
{{ end }}
</article>
{{ range $script := .Resources.Match "*.js" }}
{{ $isModule := default true $script.Params.is_module }}
<script defer {{ if $isModule }}type="module"{{ end }} src="{{ $script.Permalink | relURL }}"></script>
{{ end }}
{{ end }}
{{ define "footer" }}
{{ partial "footer.html" . }}
{{ end }}
{{ define "scripts" }}

View file

@ -0,0 +1,4 @@
{
"title": "{{ .Title }}",
"main": "{{ partial `single_main.html` . }}"
}

36
layouts/blog/list.html Normal file
View file

@ -0,0 +1,36 @@
{{ define "header" }}
{{ partial "header.html" . }}
{{ end }}
{{ define "main" }}
{{ $pages := union .RegularPages .Sections }}
{{ if .IsHome }}
{{ $pages = where site.RegularPages "Type" "in" site.Params.mainSections }}
{{ end }}
{{ range .Pages.ByDate.GroupByDate "2006" }}
<h2>{{ .Key }}</h2>
<ul class="post-list">
{{ range .Pages }}
{{ if or (not .Draft) (and .Draft (not hugo.IsProduction)) }}
<li>
<h1>
<a href="{{ .Permalink }}">{{ .Title }}</a>
{{ partial "development/draft_tag.html" . }}
</h1>
<time class="nobreak" datetime="{{ .Date | time.Format "2006-01-02" }}">{{ .Date | time.Format "January" }}</time>
<time class="nobreak" datetime="{{ .Date | time.Format "2006-01-02" }}">{{ .Date | time.Format "2" }}</time>
</li>
{{ end }}
{{ end }}
</ul>
{{ end }}
{{ end }}
{{ define "footer" }}
{{ partial "footer.html" . }}
{{ end }}
{{ define "styles" }}
<link rel="preload stylesheet" as="style" href="{{ `/styles/main.css` | absURL }}">
{{ end }}

View file

@ -0,0 +1,11 @@
{{ if not hugo.IsProduction }}
<div class="platter" id="debug-page-info">
<details>
<summary>Debug Page Info</summary>
<table>
<tr><td>.Section</td><td>{{ .Section }}</td></tr>
<tr><td>.Type</td><td>{{ .Type }}</td></tr>
</table>
</details>
</div>
{{ end }}

View file

@ -1,4 +1,10 @@
<footer class="footer">
<p class="slogans"><span>Trans rights are human rights.</span> <span>Black lives matter.</span> <span>Get vaccinated.</span></p>
<p>Copyright © <time datetime="{{ now.Year }}">{{ now.Year }}</time> <a href="{{ `` | absURL }}">Eryn Wells</a></p>
<footer class="site">
<div>
<ul class="slogans">
<li>Trans rights are human rights.</li>
<li>Black lives matter.</li>
<li>Get vaccinated.</li>
</ul>
<p>Copyright © <time datetime="{{ now.Year }}">{{ now.Year }}</time> <a href="{{ `` | absURL }}">Eryn Wells</a></p>
</div>
</footer>

View file

@ -13,22 +13,6 @@
<meta name="author" content="{{ site.Author.name }}">
{{ end }}
<link rel="preload stylesheet" as="style" href="{{ `/styles/main.css` | absURL }}">
{{ if or (eq .Kind "list") (eq .Kind "term") }}
<link rel="preload stylesheet" as="style" href="{{ `styles/list.css` | absURL }}">
{{ end }}
{{ if and .IsPage (.Page.Scratch.Get "includes_railroad_diagram") }}
<link rel="preload stylesheet" as="style" href="{{ `styles/railroad.css` | absURL }}">
{{ end }}
{{ range $stylesheet := .Resources.Match "*.css" }}
<link rel="preload stylesheet" as="style" href="{{ $stylesheet.Permalink }}">
{{ end }}
{{ if in (.Site.BaseURL | string) "localhost" }}
<link rel="preload stylesheet" as="style" href="/styles/development.css">
{{ end }}
{{ if .IsPage }}
<link rel="preload stylesheet" as="style" href="{{ `styles/monokai.css` | absURL }}">
{{ end }}
{{ range $.Scratch.Get "social-list" }}
<link rel="preload" as="image" href="{{ printf `%s.svg` . | absURL }}">
@ -43,6 +27,7 @@
<link rel="{{ .Rel }}" type="{{ .MediaType.Type }}" href="{{ .Permalink }}" title="{{ site.Title }}">
{{ end }}
<!-- Misc -->
{{ if or hugo.IsProduction (eq site.Params.env "production") }}
{{ template "_internal/schema.html" . }}
{{ template "_internal/twitter_cards.html" . }}

View file

@ -1,27 +1,31 @@
<header class="header">
<div class="title-and-menu">
<h1><a class="site-name" href="{{ `` | absURL }}">Eryn Wells</a></h1>
<header class="site">
<div class="platter">
<div class="grid">
<h1 class="site">
<a class="site-name" href="{{ `` | absURL }}">Eryn Wells</a>
</h1>
{{ $url := .RelPermalink }}
{{ with site.Menus.main }}
<nav class="menu">
<menu>
{{ range . }}
<li><a class="{{ if eq .URL $url }}active{{ end }}" href="{{ .URL }}"><span>{{ .Name }}</span></a></li>
{{ $url := .RelPermalink }}
{{ with site.Menus.main }}
<nav class="site bulleted">
{{ range . }}
{{ if eq .URL $url }}
<li class="active"><span>{{ .Name }}</span></li>
{{ else }}
<li><a href="{{ .URL }}"><span>{{ .Name }}</span></a></li>
{{ end }}
{{ end }}
</nav>
{{ end }}
</menu>
</nav>
{{ end }}
<nav class="site social">
<li><a style="--url: var(--twitter-icon)" href="https://twitter.com/erynofwales" target="_blank" aria-label="twitter"><span>tw</span></a></li>
<li><a style="--url: var(--github-icon)" href="https://github.com/erynofwales" target="_blank" aria-label="github"><span>gh</span></a></li>
<li><a style="--url: var(--instagram-icon)" href="https://instagram.com/erynofwales" target="_blank" aria-label="instagram"><span>ig</span></a></li>
{{ with .OutputFormats.Get "rss" }}
<li><a style="--url: var(--rss-icon)" href="{{ .RelPermalink }}" aria-label="rss"><span>rss</span></a></li>
{{ end }}
</nav>
</div>
</div>
<nav class="social">
<menu>
<li><a style="--url: var(--twitter-icon)" href="https://twitter.com/erynofwales" target="_blank" aria-label="twitter"><span>tw</span></a></li>
<li><a style="--url: var(--github-icon)" href="https://github.com/erynofwales" target="_blank" aria-label="github"><span>gh</span></a></li>
<li><a style="--url: var(--instagram-icon)" href="https://instagram.com/erynofwales" target="_blank" aria-label="instagram"><span>ig</span></a></li>
{{ with .OutputFormats.Get "rss" }}
<li><a style="--url: var(--rss-icon)" href="{{ .RelPermalink }}" aria-label="rss"><span>rss</span></a></li>
{{ end }}
</menu>
</nav>
</header>

View file

@ -0,0 +1,37 @@
<article class="post-single">
<header>
{{ partial "development/draft_tag.html" . }}
<div class="post-title">
<h1>{{ .Title }}</h1>
{{ if not (eq .Type "page") }}
<div class="post-date"><time>{{ .Date | time.Format "January 2, 2006" }}</time></div>
{{ end }}
</div>
</header>
<section class="post-content">
{{ .Content }}
</section>
<footer>
{{ if .Params.tags }}
<ul class="tags">
{{ range .Params.tags }} {{ $href := print (absURL "tags/") (urlize .) }}
<li><a href="{{ $href }}">{{ . }}</a></li>
{{ end }}
</ul>
{{ end }}
{{ $pages := where site.RegularPages "Type" "in" site.Params.mainSections }}
{{ if and (gt (len $pages) 1) (in $pages . ) }}
<nav class="post-nav">
{{ with $pages.Prev . }}
<a class="prev" href="{{ .Permalink }}"><span></span><span>{{ .Name }}</span></a>
{{ end }}
{{ with $pages.Next . }}
<a class="next" href="{{ .Permalink }}"><span>{{ .Name }}</span><span></span></a>
{{ end }}
</nav>
{{ end }}
</footer>
</article>

View file

@ -1,25 +1,17 @@
{{ define "main" }}
<article id="resume" class="post-single">
<header class="post-title">
<h1>{{ .Title }}</h1>
</header>
<section class="post-content">
{{ .Content }}
</section>
<!-- Post Nav -->
{{ $pages := where site.RegularPages "Type" "in" site.Params.mainSections }}<!---->
{{ if and (gt (len $pages) 1) (in $pages . ) }}
<nav class="post-nav">
{{ with $pages.Next . }}
<a class="prev" href="{{ .Permalink }}"><span></span><span>{{ .Name }}</span></a>
{{ end }} {{ with $pages.Prev . }}
<a class="next" href="{{ .Permalink }}"><span>{{ .Name }}</span><span></span></a>
{{ end }}
</nav>
{{ end }}
</article>
{{ define "header" }}
{{ partial "header.html" . }}
{{ end }}
{{ define "main" }}
<header class="post-title">
<h1>{{ .Title }}</h1>
</header>
<section class="post-content">
{{ .Content }}
</section>
{{ end }}
{{ define "footer" }}
{{ partial "footer.html" . }}
{{ end }}

View file

@ -0,0 +1,5 @@
{{ $lang := .Get "lang" }}
{{ $trimmedCode := trim .Inner "\n " }}
<figure class="code">
{{ transform.Highlight $trimmedCode $lang }}
</figure>

View file

@ -1,14 +1,10 @@
{{ $img := (.Page.Resources.GetMatch (.Get "name")) }}
{{ $resized_img := $img.Fit "1280x1280" }}
<div class="centered">
<figure>
<a href="{{ $img.RelPermalink }}">
<img src="{{ $resized_img.RelPermalink }}" />
</a>
{{ if $img.Title }}
<figcaption>
<p>{{ $img.Title }}</p>
</figcaption>
{{ end }}
</figure>
</div>
<figure>
<a href="{{ $img.RelPermalink }}">
<img src="{{ $resized_img.RelPermalink }}" />
</a>
{{ if $img.Title }}
<figcaption>{{ $img.Title }}</figcaption>
{{ end }}
</figure>

View file

@ -4,11 +4,9 @@
{{- $id := .Get "id" | default (.Get 0) -}}
{{- $class := .Get "class" | default (.Get 1) -}}
{{- $title := .Get "title" | default "YouTube Video" }}
<div class="centered">
<figure>
<div class="youtube">
<iframe src="https://{{ $ytHost }}/embed/{{ $id }}{{ with .Get "autoplay" }}{{ if eq . "true" }}?autoplay=1{{ end }}{{ end }}" allowfullscreen frameborder=0 title="{{ $title }}"></iframe>
</div>
</figure>
</div>
<figure>
<div class="youtube">
<iframe src="https://{{ $ytHost }}/embed/{{ $id }}{{ with .Get "autoplay" }}{{ if eq . "true" }}?autoplay=1{{ end }}{{ end }}" allowfullscreen frameborder=0 title="{{ $title }}"></iframe>
</div>
</figure>
{{ end -}}

View file

@ -1,12 +1,21 @@
{{ define "main" }}
{{ define "header" }}
{{ partial "header.html" . }}
{{ end }}
{{ define "main" }}
<article class="post-single">
<header class="post-title">
<h1>{{ .Title }}</h1>
<header>
{{ partial "development/draft_tag.html" . }}
<div class="post-title">
<h1>{{ .Title }}</h1>
</div>
</header>
<section class="post-content">
{{ .Content }}
</section>
</article>
{{ end }}
{{ define "footer" }}
{{ partial "footer.html" . }}
{{ end }}

Binary file not shown.

Binary file not shown.

View file

@ -20,12 +20,12 @@ export default funcs;
export const Options = {
DEBUG: false, // if true, writes some debug information into attributes
VS: 8, // minimum vertical separation between things. For a 3px stroke, must be at least 4
AR: 10, // radius of arcs
VS: 11, // minimum vertical separation between things. For a 3px stroke, must be at least 4
AR: 11, // radius of arcs
DIAGRAM_CLASS: 'railroad-diagram', // class to put on the root <svg>
STROKE_ODD_PIXEL_LENGTH: false, // is the stroke width an odd (1px, 3px, etc) pixel length?
INTERNAL_ALIGNMENT: 'center', // how to align items when they have extra space. left/right/center
CHAR_WIDTH: 8.5, // width of each monospace character. play until you find the right value for your font
CHAR_WIDTH: 11, // width of each monospace character. play until you find the right value for your font
COMMENT_CHAR_WIDTH: 7, // comments are in smaller text by default
};

16
static/scripts/site.js Normal file
View file

@ -0,0 +1,16 @@
/* site.js
* Eryn Wells <eryn@erynwells.me>
*/
window.addEventListener("DOMContentLoaded", () => {
const siteHeader = document.querySelector("header.site");
if (!siteHeader) {
return;
}
siteHeader.classList.add("visible");
const documentReferrer = new URL(document.referrer);
if (documentReferrer.pathname === "/") {
siteHeader.classList.add("animated");
}
});

View file

@ -20,3 +20,39 @@
.draft:after {
content: "]";
}
#debug-page-info {
background-color: var(--background-color);
border: 1px solid var(--separator-color);
border-radius: 6px;
box-shadow: 4px 5px 5px var(--box-shadow-color);
font-size: 1.75rem;
padding: 0.5rem;
position: fixed;
left: 2rem;
bottom: 2rem;
width: max-content;
}
#debug-page-info details {
margin: 0.5rem;
}
#debug-page-info summary {
font-family: var(--font-family-heading);
}
#debug-page-info table {
display: block;
margin-block-start: 0.5em;
margin-inline-start: 1em;
}
#debug-page-info td {
border: 1px solid rgb(var(--dk-gray));
padding: 0.3em;
}
#debug-page-info tr:nth-child(even) {
background-color: var(--separator-color);
}

View file

@ -1,501 +0,0 @@
/* main.css
* Global stylesheet for erynwells.me
* Eryn Wells <eryn@erynwells.me>
*/
:root {
--header: 8rem;
--footer: calc(8rem + var(--safe-bottom));
--light: #fff;
--light-dim: #888;
--dark: rgb(22, 22, 22);
--highlight-color: rgb(50, 186, 228);
--hljs-bg: #111;
--safe-bottom: 0;
--body-padding: 4rem;
--body-width: 80rem;
--body-background-color: var(--light);
--body-foreground-color: var(--dark);
--heading-color: var(--body-foreground-color);
--link-color: var(--highlight-color);
--menu-icon-size: 20px;
--social-menu-padding: 1rem;
--tag-text-color: var(--dark);
--tag-background-color: #eee;
--tag-hover-background-color: #bbb;
--separator-color: #888;
--twitter-icon: url(/icons/twitter.svg);
--github-icon: url(/icons/github.svg);
--instagram-icon: url(/icons/instagram.svg);
--rss-icon: url(/icons/rss.svg);
}
@media (prefers-color-scheme: dark) {
:root {
--body-background-color: var(--dark);
--body-foreground-color: var(--light);
--tag-text-color: var(--light-dim);
--tag-background-color: rgb(40, 40, 40);
--tag-hover-background-color: rgb(73, 73, 73);
--twitter-icon: url(/icons/twitter-dark.svg);
--github-icon: url(/icons/github-dark.svg);
--instagram-icon: url(/icons/instagram-dark.svg);
--rss-icon: url(/icons/rss-dark.svg);
}
}
a {
color: var(--link-color);
text-decoration: none;
}
a:hover {
text-decoration: underline;
text-underline-position: from-font;
}
body {
background-color: var(--body-background-color);
color: var(--body-foreground-color);
display: flex;
flex-direction: column;
font-size: 2rem;
line-height: 1.2;
margin: 0 auto;
max-width: var(--body-width);
padding: 0 var(--body-padding);
}
blockquote {
border-inline-start: 4px solid var(--separator-color);
padding-inline-start: 2rem;
margin-inline-start: 2rem;
}
figcaption h4 {
margin-bottom: 0;
}
figure {
border-radius: 0.5rem;
display: inline-block;
margin: 0;
margin-block-start: 0;
margin-block-end: 0;
margin-inline-start: 0;
margin-inline-end: 0;
}
figure a,
figure a:hover {
border: 0;
}
figure img {
border-radius: 0.5rem;
height: auto;
max-width: 100%;
margin-bottom: -3px;
}
figure + p {
margin-top: 1rem;
}
figure .youtube {
line-height: 1;
overflow: hidden;
width: var(--body-width);
}
figure.bordered {
padding: 0.5rem;
border: 2px solid #eee;
}
.centered {
text-align: center;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: 'SF Pro Rounded', ui-rounded, 'Arial Rounded MT', system-ui, -apple-system, sans-serif;
/*font-family: Palatino, Rockwell, Courier;*/
font-weight: 600;
letter-spacing: 2px;
}
html {
font-family: 'SF Pro', sans-serif;
font-size: 8px;
}
img {
height: auto;
max-width: 100%;
}
p {
line-height: 1.4;
}
pre {
margin-bottom: 0;
}
.header,
.footer {
padding: 2rem 0;
}
/*
* Header
*/
.header {
align-items: baseline;
border-bottom: 1px solid var(--separator-color);
display: flex;
flex-direction: row;
}
.header h1 {
margin: 0;
margin-right: 2rem;
font-size: 4.5rem;
}
.header h1 a {
color: var(--heading-color);
text-decoration: none;
}
.header h1 a:hover {
border: 0;
}
.menu > a + a:before {
color: var(--heading-color);
content: "•";
padding: 0 0.5rem;
}
.menu menu,
.social menu {
display: inline-block;
list-style-type: none;
margin: 0;
padding: 0;
text-transform: lowercase;
}
.menu menu li,
.social menu li {
display: inline-block;
letter-spacing: 2px;
}
.menu menu li + li:before,
.social menu li + li:before {
font-size: 1.5rem;
margin-right: 0.5rem;
}
.menu menu li + li:before {
content: "•";
}
.p5-sketch {
display: block;
position: relative;
width: 100%;
}
.social menu li + li {
margin-left: var(--social-menu-padding);
}
.social {
display: flex;
letter-spacing: 2px;
margin-left: auto;
}
.social a {
background-image: var(--url);
background-repeat: no-repeat;
background-size: var(--menu-icon-size);
display: block;
height: var(--menu-icon-size);
width: var(--menu-icon-size);
}
.social a span {
display: none;
}
.social > li + li:before {
color: var(--dark);
padding: 0 0.5rem;
}
.title-and-menu {
align-items: baseline;
display: flex;
flex-direction: row;
}
.youtube iframe {
aspect-ratio: 16 / 9;
margin-bottom: -3px;
width: 100%;
}
@media (max-width: 475px) {
:root {
--menu-icon-size: 18px;
--social-menu-padding: 0.5rem;
}
.menu {
margin-top: 1rem;
}
.social {
margin-top: 1rem;
}
.title-and-menu {
align-items: flex-start;
flex-direction: column;
}
}
@media (max-width: 320px) {
.header h1 {
font-size: 3.5rem;
}
}
/*
* Footer
*/
.footer {
align-items: center;
border-top: 1px solid var(--separator-color);
display: flex;
flex-direction: column;
font-size: 1.8rem;
text-align: center;
}
.footer p {
margin: 0;
}
.footer p + p {
margin-top: 0.25rem;
}
@media (max-width: 740px) {
.slogans span {
white-space: nowrap;
}
}
/*
* Main
*/
.main > header {
align-items: baseline;
display: flex;
}
.main {
margin: 3.5rem 0;
}
.main :first-child {
margin-top: 0;
}
.main h1 {
font-size: 3.5rem;
}
.main h1,
.main h2,
.main h3,
.main h4,
.main h5,
.main h6 {
margin-top: 3.5rem;
margin-bottom: 2rem;
}
.main figcaption h4 {
margin-bottom: 0;
}
.main p:last-child {
margin-bottom: 0;
}
.main .main-title {
margin-bottom: 0;
}
.post-list {
margin-top: 1rem;
line-height: 1.4;
}
.post-list h1,
.post-list h2,
.post-list h3,
.post-list h4,
.post-list h5,
.post-list h6 {
display: block;
margin: 0;
}
.post-list h2 {
font-size: 2.5rem;
}
.post-list li + li {
margin-top: 2rem;
}
.post-list article {
color: gray;
font-style: oblique;
font-size: 1.8rem;
margin-top: 0.5rem;
}
.post-nav {
align-items: baseline;
display: flex;
margin-top: 3.5rem;
}
.post-nav .next {
margin-left: auto;
}
.post-single footer {
margin-block-start: 3.5rem;
}
ul.post-tags {
display: flex;
padding-inline-start: 0;
}
ul.post-tags li {
background-color: var(--tag-background-color);
border-radius: 4px;
display: inline-block;
letter-spacing: 2px;
}
ul.post-tags li:hover {
background-color: var(--tag-hover-background-color);
}
ul.post-tags li a {
color: var(--tag-text-color);
display: block;
font-size: 1.75rem;
height: 100%;
width: 100%;
padding: 0.75rem 1rem;
}
ul.post-tags li a:hover {
text-decoration: none;
}
ul.post-tags li + li {
margin-inline-start: 1rem;
}
.post-title {
align-items: baseline;
display: flex;
flex-wrap: wrap;
margin-bottom: 2rem;
}
.post-title > h1 {
flex-grow: 1;
margin-block-end: 0;
padding-bottom: 0;
}
.post-title > .post-date {
color: var(--light-dim);
display: inline-block;
font-size: 1.75rem;
inline-size: min-content;
letter-spacing: 1px;
margin-block-start: 0.5rem;
text-transform: uppercase;
white-space: nowrap;
}
@media (max-width: 620px) {
.main h1 {
font-size: 3rem;
margin-bottom: 0.5rem;
}
.post-list {
padding-inline-start: 4rem;
}
.post-list h2 {
display: block;
font-size: 2rem;
}
.post-list time {
font-size: 1.8rem;
margin-left: 0;
}
}
@media (max-width: 704px) {
html {
font-size: 7px;
}
}
/*
* Helpers
*/
/* For <span>s that shouldn't break. */
.nobreak {
white-space: nowrap;
}

View file

@ -1,8 +1,26 @@
.chroma { line-height: 1.4; }
/* Line */ .chroma .line { display: flex; }
:root {
--highlight-background-color: rgb(var(--super-lt-gray));
--highlight-foreground-color: var(--foreground-body-color);
}
@media (prefers-color-scheme: dark) {
:root {
}
}
.chroma {
line-height: var(--body-line-height);
}
.bg {
color: var(--highlight-foreground-color);
background-color: var(--highlight-background-color);
}
.chroma {
color: var(--highlight-foreground-color);
background-color: var(--highlight-background-color);
}
/* Background */ .bg { color: #272822; background-color: #fafafa }
/* PreWrapper */ .chroma { color: #272822; background-color: #fafafa; }
/* Other */ .chroma .x { }
/* Error */ .chroma .err { color: #960050; background-color: #1e0010 }
/* CodeLine */ .chroma .cl { }

View file

@ -1,28 +1,27 @@
:root {
--rect-fill: #fafafa;
--rect-fill: rgba(var(--mid-blue), 0.1);
}
@media (prefers-color-scheme: dark) {
:root {
--rect-fill: #272822;
--rect-fill: rgb(var(--mid-blue), 0.9);
}
}
svg.railroad-diagram path {
stroke-width: 2;
stroke: var(--body-foreground-color);
stroke: var(--foreground-body-color);
fill: none;
}
svg.railroad-diagram text {
font-family: var(--monospace-font-family);
font-family: var(--font-family-monospace);
text-anchor: middle;
white-space: pre;
fill: var(--body-foreground-color);
fill: var(--foreground-body-color);
}
svg.railroad-diagram text.diagram-text {
font-size: 12px;
font-size: 11px;
}
svg.railroad-diagram text.diagram-arrow {
@ -34,7 +33,7 @@ svg.railroad-diagram text.label {
}
svg.railroad-diagram text.comment {
font: italic 12px monospace;
font: italic 12px var(--font-family-monospace);
}
svg.railroad-diagram g.non-terminal text {
@ -43,7 +42,7 @@ svg.railroad-diagram g.non-terminal text {
svg.railroad-diagram rect {
stroke-width: 2;
stroke: var(--body-foreground-color);
stroke: var(--foreground-body-color);
fill: var(--rect-fill);
}
@ -54,12 +53,12 @@ svg.railroad-diagram rect.group-box {
}
svg.railroad-diagram path.diagram-text {
stroke-width: 3;
stroke: var(--body-foreground-color);
fill: var(--body-background-color);
stroke-width: 2;
stroke: var(--foreground-body-color);
fill: var(--background-body-color);
cursor: help;
}
svg.railroad-diagram g.diagram-text:hover path.diagram-text {
fill: #eee;
fill: var(--rect-fill);
}

View file

@ -2,38 +2,13 @@
* Eryn Wells <eryn@erynwells.me>
*/
h1,
h2,
h3,
h4,
h5,
h6 {
margin: 0;
font-size: inherit;
font-weight: 700;
line-height: 1.2;
}
* { box-sizing: border-box; }
p {
margin: 0;
}
strong,
b {
font-weight: 500;
}
ul,
ol {
button, h1, h2, h3, h4, h5, h6, input, ol, ul, p, textarea {
padding: 0;
margin: 0;
}
a {
color: inherit;
text-decoration: none;
}
table {
width: 100%;
border-spacing: 0;
@ -43,7 +18,6 @@ table {
button,
input,
textarea {
padding: 0;
font: inherit;
background: transparent;
border: 0;
@ -57,13 +31,9 @@ input[type='submit'] {
cursor: pointer;
}
input,
textarea {
padding: 0;
border: 0;
}
input:-webkit-autofill,
textarea:-webkit-autofill {
box-shadow: 0 0 0 6rem var(--white) inset;
}
pre { margin: 0; }

455
static/styles/root.css Normal file
View file

@ -0,0 +1,455 @@
:root {
--black: 0, 0, 0;
--sub-dk-gray: 16, 16, 16;
--dk-gray: 32, 32, 32;
--mid-gray: 128, 128, 128;
--lt-gray: 223, 223, 223;
--super-lt-gray: 240, 240, 240;
--white: 255, 255, 255;
--lt-blue: 69, 212, 243;
--mid-blue: 26, 169, 239;
--dk-blue: 63, 46, 231;
--purple: 161, 49, 232;
--lilac: 187, 121, 245;
--background-color: rgb(var(--white));
--foreground-body-color: rgba(var(--black), 0.8);
--foreground-header-color: rgb(var(--black));
--site-nav-link-color: rgb(var(--lt-blue));
--separator-color: rgb(var(--lt-gray));
--header-border-color: var(--separator-color);
--footer-border-color: var(--separator-color);
--box-shadow-color: rgba(var(--lt-gray), 0.8);
--header-box-shadow-color: var(--box-shadow-color);
--font-family-body: Verdana, Helvetica, sans-serif;
--font-family-monospace: "Courier New", Courier, monospace;
--font-family-heading: Museo_Slab, Tahoma, sans-serif;
--font-family-site-heading: Museo_Slab, Tahoma, sans-serif;
--font-size-min: 7px;
--font-size-max: 8px;
--body-item-spacing: 1em;
--body-line-height: 1.4;
--body-header-line-height: 1.1;
--body-code-background-color: rgb(var(--super-lt-gray));
--content-width: 80rem;
--transition-duration: 0.7s;
--social-menu-padding: 1rem;
--menu-icon-size: 20px;
--twitter-icon: url(/icons/twitter.svg);
--github-icon: url(/icons/github.svg);
--instagram-icon: url(/icons/instagram.svg);
--rss-icon: url(/icons/rss.svg);
}
@media (prefers-color-scheme: dark) {
:root {
--background-color: rgb(var(--black));
--foreground-body-color: rgba(var(--white), 0.8);
--foreground-header-color: rgb(var(--white));
--separator-color: rgb(var(--dk-gray));
--box-shadow-color: rgba(var(--dk-gray), 0.8);
--body-code-background-color: rgb(var(--dk-gray));
--twitter-icon: url(/icons/twitter-dark.svg);
--github-icon: url(/icons/github-dark.svg);
--instagram-icon: url(/icons/instagram-dark.svg);
--rss-icon: url(/icons/rss-dark.svg);
}
}
a {
color: rgb(var(--mid-blue));
text-decoration: none;
}
a:hover {
text-decoration: underline;
text-underline-offset: 0.12em;
}
a:visited { color: none; }
blockquote {
border-inline-start: 4px solid var(--separator-color);
padding-inline-start: 2rem;
margin-inline-start: 2rem;
}
body {
color: var(--foreground-body-color);
font-size: 2rem;
line-height: var(--body-line-height);
}
code {
background-color: var(--body-code-background-color);
border-radius: 0.25rem;
font-family: var(--font-family-monospace);
display: inline-block;
padding-inline: 0.6rem;
}
figcaption {
font-size: 75%;
margin-block-start: 0.2em;
text-align: center;
}
figure {
border-radius: 6px;
display: inline-block;
margin: 0;
margin-block: 0 var(--body-item-spacing);
margin-inline: 0;
overflow: hidden;
max-width: var(--content-width);
width: 100%;
}
figure.bordered {
padding: 0.5rem;
border: 2px solid #eee;
}
figure a,
figure a:hover {
border: 0;
}
figure img {
border-radius: 6px;
height: auto;
max-width: var(--content-width);
width: 100%;
}
figure svg {
width: 100%;
height: auto;
}
figure .youtube {
border-radius: 6px;
line-height: 1;
overflow: hidden;
max-width: var(--content-width);
width: 100%;
}
footer.site {
align-items: center;
display: flex;
flex-direction: column;
font-size: 1.6rem;
margin-block-start: 2rem;
text-align: center;
}
footer.site > div {
border-top: 1px solid var(--footer-border-color);
padding-block-start: 2rem;
max-width: var(--content-width);
width: 100%;
}
footer.site ul {
align-items: center;
display: flex;
flex-wrap: wrap;
justify-content: center;
list-style: none;
}
footer.site .slogans li {
margin-inline-start: 0.5em;
}
footer.site p {
margin: 0;
}
footer.site p + p {
margin-top: 0.25rem;
}
@media (max-width: 740px) {
footer.site .slogans span {
white-space: nowrap;
}
}
h1, h2, h3, h4, h5, h6 {
color: var(--foreground-header-color);
font-family: var(--font-family-heading);
margin-block: 3.5rem 1rem;
line-height: var(--body-header-line-height);
}
h1:first-child, h2:first-child, h3:first-child,
h4:first-child, h5:first-child, h6:first-child {
margin-block-start: 0;
}
html {
background-color: var(--background-color);
color: var(--foreground-color);
font-family: var(--font-family-body);
font-size: clamp(var(--font-size-min), 1vw, var(--font-size-max));
}
main {
max-width: var(--content-width);
margin: 0 auto;
margin-block-start: 10.5rem;
width: 100%;
}
h1.site {
color: rgb(var(--mid-blue));
font-size: 2.5em;
}
@supports (background-clip: text) {
h1.site {
background:
radial-gradient(circle at 20% 70%, rgb(var(--purple)), transparent 40%),
radial-gradient(circle at 30% 30%, rgb(var(--lt-blue)), rgb(var(--mid-blue)) 20%, transparent 80%),
radial-gradient(ellipse at 95% 20%, rgb(var(--dk-blue)), rgb(var(--mid-blue)) 70%, transparent 80%),
radial-gradient(circle at 100% 100%, rgb(var(--purple)), rgb(var(--lilac)) 100%),
radial-gradient(circle at 45% 100%, rgb(var(--lilac)), rgb(var(--purple)) 60%),
radial-gradient(ellipse at 50% 50%, rgb(var(--dk-blue)), transparent 80%);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
}
h1.site * { color: inherit; }
h1, h2, h3, h4, h5, h6 {
font-weight: 600;
letter-spacing: 0.08em;
}
header.site {
display: flex;
left: 0;
position: fixed;
top: 0.5rem;
visibility: hidden;
width: 100%;
z-index: 10000;
}
header.site.visible {
visibility: visible;
}
header.site.animated {
animation: site-header-slide-in var(--transition-duration) ease-out;
}
@keyframes site-header-slide-in {
from {
top: -200px;
}
to {
top: 0.5rem;
}
}
header.site h1 {
font-family: var(--font-family-site-heading);
font-size: 2em;
margin: 0;
}
header.site .grid {
align-items: baseline;
display: grid;
gap: 0.5em;
grid-template-columns: max-content auto max-content;
grid-template-rows: minmax(2em, min-content);
grid-template-areas:
"title menu social";
max-width: var(--content-width);
width: var(--content-width);
}
@media (max-width: 450px) {
header.site .grid {
grid-template-columns: repeat(2, max-content);
grid-template-rows: repeat(2, max-content);
grid-template-areas:
"title social"
"menu menu";
max-width: var(--content-width);
width: inherit;
}
}
header.site .platter {
margin: 0 auto;
padding: 1.5rem 3rem;
}
header.site .grid nav:first-of-type {
grid-area: menu;
justify-content: start;
}
header.site .grid nav:last-of-type {
grid-area: social;
justify-content: end;
}
img {
height: auto;
max-width: 100%;
}
main h1 { font-size: 1.6em; }
main h2 { font-size: 1.5em; }
main h3 { font-size: 1.4em; }
main h4 { font-size: 1.3em; }
nav.site {
align-items: center;
display: flex;
font-size: max(1.5rem, 80%);
justify-content: start;
letter-spacing: 0.12em;
list-style: none;
text-transform: lowercase;
}
nav.site li {
color: var(--site-nav-link-color);
display: block;
margin-inline-end: 0.5em;
}
nav.site .active { font-weight: bold; }
nav.bulleted li:first-child::before {
color: var(--foreground-color);
content: "";
margin-inline-end: 0;
}
nav.bulleted li::before {
color: var(--foreground-header-color);
content: "•";
font-size: 60%;
font-weight: normal;
opacity: 80%;
margin-inline-end: 0.5em;
}
p {
letter-spacing: 0.025em;
line-height: var(--body-line-height);
}
p { margin-block-end: var(--body-item-spacing); }
p:last-child { margin-block-end: 0; }
.social menu li + li {
margin-left: var(--social-menu-padding);
}
.social {
display: flex;
letter-spacing: 2px;
margin-left: auto;
}
.social a {
background-image: var(--url);
background-repeat: no-repeat;
background-size: var(--menu-icon-size);
display: block;
height: var(--menu-icon-size);
width: var(--menu-icon-size);
}
.social a span {
display: none;
}
.social > li + li:before {
color: var(--dark);
padding: 0 0.5rem;
}
.post-title {
align-items: baseline;
display: flex;
flex-wrap: wrap;
gap: 0 4rem;
margin-bottom: var(--body-item-spacing);
}
.post-title h1 {
flex-grow: 1;
font-size: 1.8em;
margin-block: 0;
padding-bottom: 0;
}
.post-title > .post-date {
color: var(--light-dim);
display: inline-block;
font-size: 1.75rem;
inline-size: min-content;
letter-spacing: 1px;
margin-block-start: 0.5rem;
white-space: nowrap;
}
.p5-sketch {
display: block;
position: relative;
width: 100%;
}
.youtube iframe {
aspect-ratio: 16 / 9;
margin-bottom: -3px;
width: 100%;
}
/** SYNTAX HIGHLIGHTING **/
.highlight code {
background-color: inherit;
margin-block: 0.5em;
}
.highlight .line {
display: grid;
grid-template-columns: max-content auto;
}
.highlight .ln a {
-webkit-user-select: none;
-moz-use-select: none;
-ms-user-select: none;
user-select: none;
}
.highlight .cl {
white-space: pre-wrap;
}
/** HELPER CLASSES **/
.centered { text-align: center; }
.nobreak { white-space: nowrap; }
.platter {
background: var(--background-color);
border: 1px solid var(--header-border-color);
border-radius: 12px;
box-shadow: 4px 5px 5px var(--header-box-shadow-color);
}
.visible { visibility: visible; }